diff --git a/pom.xml b/pom.xml index 9137ee7..e45ae7b 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ pers.xanadu EnderDragon - 2.5.7 + 2.5.8 jar EnderDragon diff --git a/src/main/java/pers/xanadu/enderdragon/listener/DragonDeathListener.java b/src/main/java/pers/xanadu/enderdragon/listener/DragonDeathListener.java index 052e661..47c177a 100644 --- a/src/main/java/pers/xanadu/enderdragon/listener/DragonDeathListener.java +++ b/src/main/java/pers/xanadu/enderdragon/listener/DragonDeathListener.java @@ -1,186 +1,187 @@ -package pers.xanadu.enderdragon.listener; - -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.ComponentBuilder; -import net.md_5.bungee.api.chat.HoverEvent; -import net.md_5.bungee.api.chat.TextComponent; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.EnderDragon; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.scheduler.BukkitRunnable; -import pers.xanadu.enderdragon.config.Config; -import pers.xanadu.enderdragon.config.Lang; -import pers.xanadu.enderdragon.manager.DamageManager; -import pers.xanadu.enderdragon.manager.DragonManager; -import pers.xanadu.enderdragon.manager.TimerManager; -import pers.xanadu.enderdragon.manager.WorldManager; -import pers.xanadu.enderdragon.metadata.MyDragon; -import pers.xanadu.enderdragon.reward.SpecialLoot; -import pers.xanadu.enderdragon.util.Pair; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.ThreadLocalRandom; - -import static pers.xanadu.enderdragon.EnderDragon.*; - -public class DragonDeathListener implements Listener { - @EventHandler - public void OnDragonDeath(final EntityDeathEvent e){ - if(!(e.getEntity() instanceof EnderDragon)) return; - EnderDragon dragon = (EnderDragon) e.getEntity(); - if(!WorldManager.enable_worlds.contains(dragon.getWorld().getName())) return; - String unique_name = DragonManager.getSpecialKey(dragon); - if(unique_name == null) return; - MyDragon myDragon = DragonManager.get_dragon_config(unique_name); - if(myDragon == null) return; - int times = data.getInt("times"); - data.set("times",times+1); - try{ - data.save(dataF); - }catch (IOException ex){ - Lang.error(Lang.plugin_file_save_error.replaceAll("\\{file_name}",dataF.getName())); - } - e.setDroppedExp(myDragon.exp_drop); - if(myDragon.dragon_egg_spawn_chance > ThreadLocalRandom.current().nextDouble(100)){ - new BukkitRunnable() { - @Override - public void run() { - Block block = e.getEntity().getWorld().getBlockAt(myDragon.dragon_egg_spawn_x, myDragon.dragon_egg_spawn_y, myDragon.dragon_egg_spawn_z); - block.setType(Material.DRAGON_EGG); - } - }.runTaskLater(plugin, myDragon.dragon_egg_spawn_delay); - } - Player p = e.getEntity().getKiller(); - myDragon.reward_dist.handle_dist(myDragon,dragon,p); - { - List processed = new ArrayList<>(); - if(p != null){ - for(String str : myDragon.death_broadcast_msg){ - processed.add(str.replaceAll("%times%",String.valueOf(times)).replaceAll("%player%",p.getDisplayName())); - } - } - else{ - StringBuilder names = new StringBuilder(); - List entities = dragon.getNearbyEntities(5,5,5); - for (Entity entity : entities) { - if (entity instanceof Player) { - names.append(((Player) entity).getDisplayName()).append(","); - } - } - String name = names.toString(); - if(name.equals("")) name = Lang.dragon_no_killer; - if(name.endsWith(",")) name = name.substring(0,name.length()-1); - for(String str : myDragon.death_broadcast_msg){ - processed.add(str.replaceAll("%times%",String.valueOf(times)).replaceAll("%player%", name)); - } - } - handleBroadcast(processed,myDragon,dragon); - handleSpecialLoot(myDragon,dragon); - } - DamageManager.data.remove(dragon.getUniqueId()); - Lang.runCommands(myDragon.death_cmd,p); - if(p != null){ - for(String str : myDragon.msg_to_killer){ - Lang.sendFeedback(p,str.replaceAll("%times%",String.valueOf(times))); - } - } - TimerManager.startTimer(dragon.getWorld().getName()); - } - private static void handleSpecialLoot(final MyDragon myDragon, final EnderDragon dragon){ - List> list = DamageManager.getDamageList(dragon.getUniqueId()); - list.sort(DamageManager::sortByDamage); - List participants = myDragon.lootMap.get(0); - boolean tag = participants != null; - int size = list.size(); - for(int i=0;i pair = list.get(i); - String name = pair.first; - String damage = String.format("%.2f",pair.second); - //所有参与者 - if(tag) participants.forEach(loot -> loot.accept(name,damage)); - //针对特殊名次 - List loots = myDragon.lootMap.get(i+1); - if(loots!=null) loots.forEach(loot -> loot.accept(name,damage)); - } - } - public static void handleBroadcast(final List list,final MyDragon myDragon,final EnderDragon dragon){ - boolean find = false; - for(String str : list){ - if(str.contains("{damage_statistics}")){ - find = true; - break; - } - } - if(!find) Lang.broadcastMSG(list); - else{ - final TextComponent hover = getHover(myDragon,dragon); - for(String str : list){ - final String[] splits = str.split("\\{damage_statistics}"); - final ComponentBuilder builder = new ComponentBuilder(Lang.plugin_prefix); - int size = splits.length; - for(int i=0;ip.spigot().sendMessage(builder.create())); - } - } - } - public static TextComponent getHover(final MyDragon myDragon,final EnderDragon dragon) { - final TextComponent text = new TextComponent(Lang.dragon_damage_statistics_text); - List> list = DamageManager.getDamageList(dragon.getUniqueId()); - list.sort(DamageManager::sortByDamage); - double sum = 0d; - for(Pair pair : list){ - sum += pair.second; - } - StringBuilder builder = new StringBuilder(); - for(String raw : Lang.dragon_damage_statistics_hover_prefix){ - builder.append(raw - .replaceAll("%dragon_display_name%",myDragon.display_name) - .replaceAll("%damage_sum%",String.format("%.2f",sum)) - ).append("\n"); - } - int i = 0; - for(Pair pair : list){ - String raw = Lang.dragon_damage_statistics_hover_mt; - if(i < Config.damage_statistics_limit){ - double damage = pair.second; - double percent = damage/sum*100; - builder.append(raw - .replaceAll("%rank%", String.valueOf(++i)) - .replaceAll("%player%", pair.first) - .replaceAll("%damage%",String.format("%.2f",damage)) - .replaceAll("%percent%",String.format("%.2f%%",percent)) - ).append("\n"); - } - } - if(list.size()-i>0){ - String raw = Lang.dragon_damage_statistics_hover_exceeds_limit; - builder.append(raw - .replaceAll("%exceeds_number%", String.valueOf(list.size()-i)) - ).append("\n"); - } - for(String raw : Lang.dragon_damage_statistics_hover_suffix){ - builder.append(raw - .replaceAll("%dragon_display_name%",myDragon.display_name) - .replaceAll("%damage_sum%",String.format("%.2f",sum)) - ); - } - BaseComponent[] cmp = new ComponentBuilder(builder.toString()).create(); - text.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT,cmp)); - return text; - } - -} +package pers.xanadu.enderdragon.listener; + +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.EnderDragon; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.scheduler.BukkitRunnable; +import pers.xanadu.enderdragon.config.Config; +import pers.xanadu.enderdragon.config.Lang; +import pers.xanadu.enderdragon.manager.DamageManager; +import pers.xanadu.enderdragon.manager.DragonManager; +import pers.xanadu.enderdragon.manager.TimerManager; +import pers.xanadu.enderdragon.manager.WorldManager; +import pers.xanadu.enderdragon.metadata.MyDragon; +import pers.xanadu.enderdragon.reward.SpecialLoot; +import pers.xanadu.enderdragon.util.Pair; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.ThreadLocalRandom; + +import static pers.xanadu.enderdragon.EnderDragon.*; + +public class DragonDeathListener implements Listener { + @EventHandler + public void OnDragonDeath(final EntityDeathEvent e){ + if(!(e.getEntity() instanceof EnderDragon)) return; + EnderDragon dragon = (EnderDragon) e.getEntity(); + if(!WorldManager.enable_worlds.contains(dragon.getWorld().getName())) return; + String unique_name = DragonManager.getSpecialKey(dragon); + if(unique_name == null) return; + MyDragon myDragon = DragonManager.get_dragon_config(unique_name); + if(myDragon == null) return; + int times = data.getInt("times"); + data.set("times",times+1); + try{ + data.save(dataF); + }catch (IOException ex){ + Lang.error(Lang.plugin_file_save_error.replaceAll("\\{file_name}",dataF.getName())); + } + e.setDroppedExp(myDragon.exp_drop); + if(myDragon.dragon_egg_spawn_chance > ThreadLocalRandom.current().nextDouble(100)){ + new BukkitRunnable() { + @Override + public void run() { + Block block = e.getEntity().getWorld().getBlockAt(myDragon.dragon_egg_spawn_x, myDragon.dragon_egg_spawn_y, myDragon.dragon_egg_spawn_z); + block.setType(Material.DRAGON_EGG); + } + }.runTaskLater(plugin, myDragon.dragon_egg_spawn_delay); + } + Player p = e.getEntity().getKiller(); + myDragon.reward_dist.handle_dist(myDragon,dragon,p); + { + List processed = new ArrayList<>(); + if(p != null){ + for(String str : myDragon.death_broadcast_msg){ + processed.add(str.replaceAll("%times%",String.valueOf(times)).replaceAll("%player%",p.getDisplayName())); + } + } + else{ + StringBuilder names = new StringBuilder(); + List entities = dragon.getNearbyEntities(5,5,5); + for (Entity entity : entities) { + if (entity instanceof Player) { + names.append(((Player) entity).getDisplayName()).append(","); + } + } + String name = names.toString(); + if(name.equals("")) name = Lang.dragon_no_killer; + if(name.endsWith(",")) name = name.substring(0,name.length()-1); + for(String str : myDragon.death_broadcast_msg){ + processed.add(str.replaceAll("%times%",String.valueOf(times)).replaceAll("%player%", name)); + } + } + handleBroadcast(processed,myDragon,dragon); + handleSpecialLoot(myDragon,dragon); + } + DamageManager.data.remove(dragon.getUniqueId()); + Lang.runCommands(myDragon.death_cmd,p); + if(p != null){ + for(String str : myDragon.msg_to_killer){ + Lang.sendFeedback(p,str.replaceAll("%times%",String.valueOf(times))); + } + } + TimerManager.startTimer(dragon.getWorld().getName()); + } + private static void handleSpecialLoot(final MyDragon myDragon, final EnderDragon dragon){ + List> list = DamageManager.getDamageList(dragon.getUniqueId()); + list.sort(DamageManager::sortByDamage); + List participants = myDragon.lootMap.get(0); + // 是否给所有参与者发奖励 + boolean tag = participants != null; + int size = list.size(); + for(int i=0;i pair = list.get(i); + String name = pair.first; + String damage = String.format("%.2f",pair.second); + //所有参与者 + if(tag) participants.forEach(loot -> loot.accept(name,damage)); + //针对特殊名次 + List loots = myDragon.lootMap.get(i+1); + if(loots!=null) loots.forEach(loot -> loot.accept(name,damage)); + } + } + public static void handleBroadcast(final List list,final MyDragon myDragon,final EnderDragon dragon){ + boolean find = false; + for(String str : list){ + if(str.contains("{damage_statistics}")){ + find = true; + break; + } + } + if(!find) Lang.broadcastMSG(list); + else{ + final TextComponent hover = getHover(myDragon,dragon); + for(String str : list){ + final String[] splits = str.split("\\{damage_statistics}"); + final ComponentBuilder builder = new ComponentBuilder(Lang.plugin_prefix); + int size = splits.length; + for(int i=0;ip.spigot().sendMessage(builder.create())); + } + } + } + public static TextComponent getHover(final MyDragon myDragon,final EnderDragon dragon) { + final TextComponent text = new TextComponent(Lang.dragon_damage_statistics_text); + List> list = DamageManager.getDamageList(dragon.getUniqueId()); + list.sort(DamageManager::sortByDamage); + double sum = 0d; + for(Pair pair : list){ + sum += pair.second; + } + StringBuilder builder = new StringBuilder(); + for(String raw : Lang.dragon_damage_statistics_hover_prefix){ + builder.append(raw + .replaceAll("%dragon_display_name%",myDragon.display_name) + .replaceAll("%damage_sum%",String.format("%.2f",sum)) + ).append("\n"); + } + int i = 0; + for(Pair pair : list){ + String raw = Lang.dragon_damage_statistics_hover_mt; + if(i < Config.damage_statistics_limit){ + double damage = pair.second; + double percent = damage/sum*100; + builder.append(raw + .replaceAll("%rank%", String.valueOf(++i)) + .replaceAll("%player%", pair.first) + .replaceAll("%damage%",String.format("%.2f",damage)) + .replaceAll("%percent%",String.format("%.2f%%",percent)) + ).append("\n"); + } + } + if(list.size()-i>0){ + String raw = Lang.dragon_damage_statistics_hover_exceeds_limit; + builder.append(raw + .replaceAll("%exceeds_number%", String.valueOf(list.size()-i)) + ).append("\n"); + } + for(String raw : Lang.dragon_damage_statistics_hover_suffix){ + builder.append(raw + .replaceAll("%dragon_display_name%",myDragon.display_name) + .replaceAll("%damage_sum%",String.format("%.2f",sum)) + ); + } + BaseComponent[] cmp = new ComponentBuilder(builder.toString()).create(); + text.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT,cmp)); + return text; + } + +} diff --git a/src/main/java/pers/xanadu/enderdragon/util/NMSUtil.java b/src/main/java/pers/xanadu/enderdragon/util/NMSUtil.java index b719716..5521447 100644 --- a/src/main/java/pers/xanadu/enderdragon/util/NMSUtil.java +++ b/src/main/java/pers/xanadu/enderdragon/util/NMSUtil.java @@ -51,7 +51,7 @@ public class NMSUtil { public void init(){ String version = Version.getVersion(); try{ - this.CraftWorldClass = Class.forName("org.bukkit.craftbukkit." + version + ".CraftWorld"); + this.CraftWorldClass = ClassResolver.obc("CraftWorld"); this.getNMSWord = CraftWorldClass.getDeclaredMethod("getHandle"); this.WorldClass = this.getNMSWord.getReturnType().getSuperclass(); this.world_c_environment = CraftWorldClass.getDeclaredField("environment"); @@ -60,12 +60,12 @@ public class NMSUtil { this.WorldProviderClass = Class.forName("net.minecraft.server."+version+".WorldProvider"); //this.WorldProviderTheEndClass = Class.forName("net.minecraft.server."+version+".WorldProviderTheEnd"); } - this.CraftItemStackClass = Class.forName("org.bukkit.craftbukkit." + version + ".inventory.CraftItemStack"); - this.CraftMetaItemClass = Class.forName("org.bukkit.craftbukkit." + version + ".inventory.CraftMetaItem"); + this.CraftItemStackClass = ClassResolver.obc("inventory.CraftItemStack"); + this.CraftMetaItemClass = ClassResolver.obc("inventory.CraftMetaItem"); this.unhandledTags = CraftMetaItemClass.getDeclaredField("unhandledTags"); unhandledTags.setAccessible(true); this.NMSItemStackClass = CraftItemStackClass.getDeclaredField("handle").getType(); - this.CraftEntityClass = Class.forName("org.bukkit.craftbukkit."+version+".entity.CraftEntity"); + this.CraftEntityClass = ClassResolver.obc("entity.CraftEntity"); init_NBTTagCompoundClass(); init_NBTBaseClass(); if (!Version.isNBT_UPDATE()){ @@ -83,11 +83,17 @@ public class NMSUtil { if(Version.mcMainVersion<=16) this.MojangsonParserClass = Class.forName("net.minecraft.server."+version+".MojangsonParser"); - else this.MojangsonParserClass = Class.forName("net.minecraft.nbt.MojangsonParser"); - this.stringToCPD = MojangsonParserClass.getMethod(getMethodName(ReflectiveMethod.MojangsonParser_parse),String.class); + else if (Version.mcMainVersion < 26) this.MojangsonParserClass = Class.forName("net.minecraft.nbt.MojangsonParser"); + else { + // TODO: 2026/5/3 16:21 + this.MojangsonParserClass = null; + } + if (this.MojangsonParserClass != null) { + this.stringToCPD = MojangsonParserClass.getMethod(getMethodName(ReflectiveMethod.MojangsonParser_parse),String.class); + } if(Version.mcMainVersion>=14){ - this.CraftPersistentDataContainerClass = Class.forName("org.bukkit.craftbukkit." + version + ".persistence.CraftPersistentDataContainer"); + this.CraftPersistentDataContainerClass = ClassResolver.obc("persistence.CraftPersistentDataContainer"); this.PDCtoCPD = CraftPersistentDataContainerClass.getDeclaredMethod("toTagCompound"); if (!Version.isNBT_UPDATE()){ this.PersistentDataContainer_putAll = CraftPersistentDataContainerClass.getDeclaredMethod("putAll",NBTTagCompoundClass); @@ -101,6 +107,44 @@ public class NMSUtil { } if(Config.debug) check(); } + + public static final class ClassResolver { + + private static final String OBC_BASE = "org.bukkit.craftbukkit"; + private static final String NMS_LEGACY_BASE = "net.minecraft.server"; + private static final String NMS_MODERN_BASE = "net.minecraft"; + + private static final String VERSION = Version.getVersion(); + + private static boolean isModern() { + return Version.mcMainVersion >= 26; + } + + public static Class obc(String path) throws ClassNotFoundException { + String fullName; + + if (isModern()) { + fullName = OBC_BASE + "." + path; + } else { + fullName = OBC_BASE + "." + VERSION + "." + path; + } + + return Class.forName(fullName); + } + + public static Class nms(String path) throws ClassNotFoundException { + String fullName; + + if (isModern()) { + fullName = NMS_MODERN_BASE + "." + path; + } else { + fullName = NMS_LEGACY_BASE + "." + VERSION + "." + path; + } + + return Class.forName(fullName); + } + } + public void check(){ try{ Field[] fields = NMSUtil.class.getDeclaredFields(); @@ -303,7 +347,7 @@ public class NMSUtil { } private void init_NBTTagCompoundClass(){ try{ - Class CraftMetaBlockStateClass = Class.forName("org.bukkit.craftbukkit."+Version.getVersion()+".inventory.CraftMetaBlockState"); + Class CraftMetaBlockStateClass = ClassResolver.obc("inventory.CraftMetaBlockState"); Field field = CraftMetaBlockStateClass.getDeclaredField("blockEntityTag"); this.NBTTagCompoundClass = field.getType(); return; diff --git a/src/main/java/pers/xanadu/enderdragon/util/Version.java b/src/main/java/pers/xanadu/enderdragon/util/Version.java index 2fd3f5b..fe56444 100644 --- a/src/main/java/pers/xanadu/enderdragon/util/Version.java +++ b/src/main/java/pers/xanadu/enderdragon/util/Version.java @@ -35,15 +35,22 @@ public class Version { Field LEGACY_CB_VERSION = clazz.getField("LEGACY_CB_VERSION"); version = (String) LEGACY_CB_VERSION.get(null); }catch (ReflectiveOperationException e){ - throwable.printStackTrace(); - Lang.warn("Failed to get nms-version!"); - Bukkit.getServer().getPluginManager().disablePlugin(EnderDragon.plugin); + version = Bukkit.getVersion().split("-")[0]; } } String[] mc_version = getServer().getBukkitVersion().split("-")[0].split("\\."); - mcMainVersion = Integer.parseInt(mc_version[1]); - if(mc_version.length<=2) mcPatchVersion = 0; - else mcPatchVersion = Integer.parseInt(mc_version[2]); + + int first = Integer.parseInt(mc_version[0]); + // e.g. 26.1.2.build.53 + if (first >= 26) { + mcMainVersion = first; + mcPatchVersion = Integer.parseInt(mc_version[1]); + } else { + mcMainVersion = Integer.parseInt(mc_version[1]); + if(mc_version.length<=2) mcPatchVersion = 0; + else mcPatchVersion = Integer.parseInt(mc_version[2]); + } + Lang.info("Found version: " + version); try{ Class.forName("net.minecraftforge.server.ServerMain");