fix: 领地系统4个bug修复

1. CLI用户权限管理: 添加shortKeyToDenyField映射修复键名不匹配
2. 移除用户: 修复大小写敏感导致的移除失败
3. 权限组反转: 修复togglePerm反馈消息语义(deny=true→已禁止)
4. GUI工具: BLAZE_ROD替代STICK
This commit is contained in:
2026-06-24 11:08:55 +08:00
parent 6ec438abd9
commit 302268d0da
3 changed files with 55 additions and 8 deletions
+45 -4
View File
@@ -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);
+2 -2
View File
@@ -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("区域选择工具")) {
+8 -2
View File
@@ -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;
}