fix: 领地系统4个bug修复
1. CLI用户权限管理: 添加shortKeyToDenyField映射修复键名不匹配 2. 移除用户: 修复大小写敏感导致的移除失败 3. 权限组反转: 修复togglePerm反馈消息语义(deny=true→已禁止) 4. GUI工具: BLAZE_ROD替代STICK
This commit is contained in:
@@ -532,7 +532,8 @@ public class AreaCLIManager {
|
||||
|
||||
String permName = getPermNameByKey(permKey);
|
||||
boolean newState = !oldState;
|
||||
p.sendMessage("§a已切换 §e" + permName + " §7→ " + (newState ? "§a已启用" : "§c已禁用"));
|
||||
// ★ newState是deny值:true=禁止,false=允许
|
||||
p.sendMessage("§a已切换 §e" + permName + " §7→ " + (!newState ? "§a已允许" : "§c已禁止"));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -544,6 +545,44 @@ public class AreaCLIManager {
|
||||
|
||||
// ==================== 数据结构 ====================
|
||||
|
||||
/**
|
||||
* ★ 将短key(如"block_break")映射为deny字段名(如"denyBlockBreak")
|
||||
*/
|
||||
private static String shortKeyToDenyField(String shortKey) {
|
||||
switch (shortKey) {
|
||||
case "move": return "denyMove";
|
||||
case "block_place": return "denyBlockPlace";
|
||||
case "block_break": return "denyBlockBreak";
|
||||
case "pvp": return "denyPVP";
|
||||
case "mount": return "denyMount";
|
||||
case "ender_pearl": return "denyEnderPearl";
|
||||
case "thrown_projectiles": return "denyThrownProjectiles";
|
||||
case "raid": return "denyRaid";
|
||||
case "bow": return "denyBow";
|
||||
case "potion": return "denyPotion";
|
||||
case "fire": return "denyFire";
|
||||
case "fire_spread": return "denyFireSpread";
|
||||
case "pickup": return "denyPickup";
|
||||
case "drop": return "denyDrop";
|
||||
case "explosion": return "denyExplosion";
|
||||
case "fall_damage": return "denyFallDamage";
|
||||
case "hunger": return "denyHunger";
|
||||
case "all_damage": return "denyAllDamage";
|
||||
case "all_effects": return "denyAllEffects";
|
||||
case "item_frame": return "denyItemFrame";
|
||||
case "redstone": return "denyRedstoneInteraction";
|
||||
case "door": return "denyDoorInteraction";
|
||||
case "audio": return "denyNoteblockJukebox";
|
||||
case "lead": return "denyLead";
|
||||
case "crop_harvest": return "denyCropHarvest";
|
||||
case "wool_shear": return "denyWoolShear";
|
||||
case "animal_feed": return "denyAnimalFeeding";
|
||||
case "glowing": return "denyGlowing";
|
||||
case "peace_mode": return "peaceMode";
|
||||
default: return shortKey;
|
||||
}
|
||||
}
|
||||
|
||||
private static class PermItem {
|
||||
String key;
|
||||
String name;
|
||||
@@ -842,15 +881,17 @@ public class AreaCLIManager {
|
||||
}
|
||||
|
||||
// 获取当前值,判断是否已有覆盖
|
||||
// ★ 使用deny字段名作为key,与getEffectiveDeny保持一致
|
||||
String denyField = shortKeyToDenyField(permKey);
|
||||
Map<String, Boolean> currentPerms = areaProtect.getPlayerPermMap(landId, targetPlayer);
|
||||
boolean currentVal = currentPerms.getOrDefault(permKey, getLandDefaultVal(land, permKey));
|
||||
boolean currentVal = currentPerms.getOrDefault(denyField, getLandDefaultVal(land, denyField));
|
||||
|
||||
// 切换
|
||||
boolean newVal = !currentVal;
|
||||
areaProtect.setPlayerPerm(landId, targetPlayer, permKey, newVal);
|
||||
areaProtect.setPlayerPerm(landId, targetPlayer, denyField, newVal);
|
||||
|
||||
String permName = getPermNameByKey(permKey);
|
||||
p.sendMessage("§a已设置 §e" + targetPlayer + " §a的 §e" + permName + " §7→ " + (newVal ? "§a允许" : "§c禁止"));
|
||||
p.sendMessage("§a已设置 §e" + targetPlayer + " §a的 §e" + permName + " §7→ " + (!newVal ? "§a允许" : "§c禁止"));
|
||||
|
||||
// 刷新页面
|
||||
showPlayerPerm(p, landName, targetPlayer, page);
|
||||
|
||||
@@ -1079,7 +1079,7 @@ public class AreaGUIManager implements Listener {
|
||||
p.sendMessage("§c请等待 " + remaining + " 秒后再获取");
|
||||
return;
|
||||
}
|
||||
ItemStack wand = new ItemStack(Material.STICK);
|
||||
ItemStack wand = new ItemStack(Material.BLAZE_ROD);
|
||||
ItemMeta meta = wand.getItemMeta();
|
||||
if (meta != null) {
|
||||
meta.setDisplayName("§a§l区域选择工具");
|
||||
@@ -1094,7 +1094,7 @@ public class AreaGUIManager implements Listener {
|
||||
}
|
||||
// 检查背包是否已有
|
||||
for (ItemStack item : p.getInventory().getContents()) {
|
||||
if (item != null && item.getType() == Material.STICK
|
||||
if (item != null && item.getType() == Material.BLAZE_ROD
|
||||
&& item.hasItemMeta() && item.getItemMeta() != null
|
||||
&& item.getItemMeta().hasDisplayName()
|
||||
&& item.getItemMeta().getDisplayName().contains("区域选择工具")) {
|
||||
|
||||
@@ -3948,7 +3948,10 @@ public class AreaProtection implements Listener {
|
||||
public void removeLandMember(String landName, String playerName) {
|
||||
Set<String> members = areaPlayerWhitelist.get(landName);
|
||||
if (members != null) {
|
||||
members.remove(playerName.toLowerCase());
|
||||
// ★ 尝试精确匹配 + 小写匹配
|
||||
if (!members.remove(playerName)) {
|
||||
members.remove(playerName.toLowerCase());
|
||||
}
|
||||
saveWhitelists();
|
||||
}
|
||||
}
|
||||
@@ -7280,7 +7283,10 @@ public class AreaProtection implements Listener {
|
||||
String areaName, String playerName) {
|
||||
Set<String> wl =
|
||||
areaPlayerWhitelist.get(areaName);
|
||||
boolean ok = wl != null && wl.remove(playerName);
|
||||
if (wl == null) return false;
|
||||
// ★ 精确匹配 + 小写匹配
|
||||
boolean ok = wl.remove(playerName);
|
||||
if (!ok) ok = wl.remove(playerName.toLowerCase());
|
||||
if (ok) saveWhitelists();
|
||||
return ok;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user