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");