PVP四项改进:回声碎片CLI入口/击杀≥10奖励盔甲药水/世界击杀纳入总榜/选装前无敌

This commit is contained in:
2026-07-13 12:28:13 +08:00
parent c7cdb60b47
commit 697b1069a2
4 changed files with 103 additions and 1 deletions
@@ -110,6 +110,10 @@ public class AreaCLIManager {
p.sendMessage(clickableAction("🏛", "公共设施列表/传送",
"/protect listpublic"));
// ★ 回声碎片:领地记录查询工具
p.sendMessage(clickableAction("🔮", "回声碎片(领地记录工具)",
"/protect echoshard"));
// ★ 管理员配置入口
if (areaProtect.isAreaAdmin(p)) {
p.sendMessage(clickableAction("⚙", "全局配置",
@@ -6065,6 +6065,21 @@ public class AreaProtection implements Listener {
return true;
}
// ===== 回声碎片(领地记录查询工具)=====
if (sub.equals("echoshard") || sub.equals("回声碎片")) {
if (!(sender instanceof Player)) {
sender.sendMessage("§c仅玩家可用");
return true;
}
Player p = (Player) sender;
if (plugin.landRecordManager != null) {
plugin.landRecordManager.giveEchoShard(p);
} else {
p.sendMessage("§c领地记录管理器未初始化");
}
return true;
}
// ===== UI模式偏好 =====
if (sub.equals("uimode") || sub.equals("偏好")) {
if (!(sender instanceof Player)) {
@@ -960,6 +960,7 @@ public class PVPArenaManager implements Listener {
player.sendMessage("§a§l欢迎来到PVP竞技场!");
player.sendMessage("§7请先选择你的装备套装,确认后将发放PVP装备");
player.sendMessage("§e§l★ 选装期间免疫一切伤害,请放心选择");
player.playSound(player.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1.0f, 1.0f);
plugin.getLogger().info("[PVP] 玩家 " + playerName + " 进入PVP竞技场(已备份清空原背包,等待选装备)");
@@ -1127,6 +1128,20 @@ public class PVPArenaManager implements Listener {
// ==================== 事件处理器 ====================
/**
* ★ 选装前无敌:玩家在PVP世界中未完成装备选择时,免疫一切伤害
*/
@EventHandler
public void onEntityDamage(org.bukkit.event.entity.EntityDamageEvent event) {
if (!(event.getEntity() instanceof Player)) return;
Player player = (Player) event.getEntity();
String name = player.getName();
// 在PVP世界中但未确认装备 → 取消所有伤害
if (inPVPArena.contains(name) && !equipmentConfirmed.contains(name)) {
event.setCancelled(true);
}
}
/**
* 玩家死亡事件 — 死亡后强制离开PVP
*/
@@ -1155,6 +1170,30 @@ public class PVPArenaManager implements Listener {
}
}
// ★ 击杀≥10奖励:替换完整铁甲 + 喷溅瞬间治疗2 ×1(一次性)
if (newKills >= 10) {
Player killerP = (Player) killer;
if (!killerP.hasPermission("sdf1.kit.pvp.reward10")) {
// 替换完整铁甲
killerP.getInventory().setHelmet(new ItemStack(Material.IRON_HELMET));
killerP.getInventory().setChestplate(new ItemStack(Material.IRON_CHESTPLATE));
killerP.getInventory().setLeggings(new ItemStack(Material.IRON_LEGGINGS));
killerP.getInventory().setBoots(new ItemStack(Material.IRON_BOOTS));
// 喷溅瞬间治疗2 ×1(正确NBT)
ItemStack potion = new ItemStack(Material.SPLASH_POTION, 1);
PotionMeta potionMeta = (PotionMeta) potion.getItemMeta();
potionMeta.setBasePotionType(org.bukkit.potion.PotionType.HEALING);
potionMeta.addCustomEffect(new org.bukkit.potion.PotionEffect(
org.bukkit.potion.PotionEffectType.INSTANT_HEALTH, 1, 1, false, false), true);
potion.setItemMeta(potionMeta);
killerP.getInventory().addItem(potion);
// 授予临时权限标记(本次重启内有效,防止重复发放)
killerP.addAttachment(plugin, "sdf1.kit.pvp.reward10", true);
killerP.sendMessage("§a§l[PVP] §f击杀达 §610 §f次!获得 §b铁甲套装 §f+ §c喷溅瞬间治疗II ×1");
killerP.playSound(killerP.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1.0f, 1.0f);
}
}
// 击杀者连杀会话
PVPManager.KillSession ks = arenaKillSessions.get(kName);
if (ks == null
@@ -2091,6 +2130,16 @@ public class PVPArenaManager implements Listener {
return inPVPArena.contains(playerName);
}
/** 获取PVP世界击杀数据(供外部排行榜汇总) */
public Map<String, Integer> getPVPWorldKills() {
return Collections.unmodifiableMap(pvpKills);
}
/** 获取PVP世界死亡数据(供外部排行榜汇总) */
public Map<String, Integer> getPVPWorldDeaths() {
return Collections.unmodifiableMap(pvpDeaths);
}
public World getPVPWorld() {
return Bukkit.getWorld(pvpWorldName);
}
+35 -1
View File
@@ -1350,9 +1350,28 @@ public class PVPManager implements Listener {
if (region == null) {
p.sendMessage("§6§l" + target
+ " 的PVP战绩:");
// ★ PVP世界战绩(从PvPArenaManager获取)
int pvpWorldKills = 0;
int pvpWorldDeaths = 0;
if (plugin.getPVPArenaManager() != null) {
Map<String, Integer> wk = plugin.getPVPArenaManager().getPVPWorldKills();
Map<String, Integer> wd = plugin.getPVPArenaManager().getPVPWorldDeaths();
pvpWorldKills = wk.getOrDefault(target, 0);
pvpWorldDeaths = wd.getOrDefault(target, 0);
}
if (pvpWorldKills > 0 || pvpWorldDeaths > 0) {
double pvpKd = pvpWorldDeaths > 0
? (double) pvpWorldKills / pvpWorldDeaths : pvpWorldKills;
p.sendMessage("§e- §fPVP世界 §a击杀:" + pvpWorldKills
+ " §c死亡:" + pvpWorldDeaths
+ " §eKD:" + String.format("%.2f", pvpKd));
}
// PVP区域战绩
List<Map<String, Object>> all =
getAllRegions();
boolean has = false;
boolean has = pvpWorldKills > 0 || pvpWorldDeaths > 0;
for (Map<String, Object> row :
all) {
String rn = (String) row
@@ -1370,6 +1389,21 @@ public class PVPManager implements Listener {
has = true;
}
}
// ★ 总计
int totalKills = pvpWorldKills;
int totalDeaths = pvpWorldDeaths;
for (Map<String, Object> row : all) {
String rn = (String) row.get("name");
totalKills += getKills(target, rn);
totalDeaths += getDeaths(target, rn);
}
if (totalKills > 0 || totalDeaths > 0) {
double totalKd = totalDeaths > 0
? (double) totalKills / totalDeaths : totalKills;
p.sendMessage("§6§l- §f总计 §a击杀:" + totalKills
+ " §c死亡:" + totalDeaths
+ " §eKD:" + String.format("%.2f", totalKd));
}
if (!has)
p.sendMessage(
"§7暂无记录");