diff --git a/src/main/java/pers/xanadu/enderdragon/config/Config.java b/src/main/java/pers/xanadu/enderdragon/config/Config.java index ff844fe..4be0f70 100644 --- a/src/main/java/pers/xanadu/enderdragon/config/Config.java +++ b/src/main/java/pers/xanadu/enderdragon/config/Config.java @@ -6,6 +6,7 @@ import java.io.*; import java.lang.reflect.Field; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.*; import java.util.jar.JarEntry; import java.util.jar.JarFile; @@ -21,6 +22,7 @@ public class Config { public static boolean advanced_setting_save_respawn_status; public static boolean advanced_setting_save_bossbar; public static boolean advanced_setting_glowing_fix; + //public static boolean advanced_setting_can_spawn_not_the_end; public static boolean advanced_setting_backslash_split_reward; public static String damage_visible_mode; public static int damage_statistics_limit; @@ -98,10 +100,7 @@ public class Config { } } catch (IOException ignored) {} } - public static void copyFile(String source, String dest,boolean replace) { - if (source == null || source.equals("")) return; - source = source.replace('\\', '/'); - File inFile = new File("plugins/EnderDragon", source); + public static void copyFile(File source, String dest, boolean replace) { File outFile = new File("plugins/EnderDragon", dest); int lastIndex = dest.lastIndexOf('/'); File outDir = new File("plugins/EnderDragon", dest.substring(0, Math.max(lastIndex, 0))); @@ -110,8 +109,8 @@ public class Config { } try { if (!outFile.exists() || replace) { - InputStream in = new FileInputStream(inFile); - OutputStream out = new FileOutputStream(outFile); + InputStream in = Files.newInputStream(source.toPath()); + OutputStream out = Files.newOutputStream(outFile.toPath()); byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { @@ -121,9 +120,15 @@ public class Config { in.close(); } } catch (IOException ignored) { - Lang.error("Failed to copy file: "+inFile.getPath()+" -> "+outFile.getPath()); + Lang.error("Failed to copy file: "+source.getPath()+" -> "+outFile.getPath()); } } + public static void copyFile(String source, String dest,boolean replace) { + if (source == null || source.equals("")) return; + source = source.replace('\\', '/'); + File inFile = new File("plugins/EnderDragon", source); + copyFile(inFile, dest, replace); + } public static void saveDirectoryResource(String srcDirectory,boolean replace) { String destDirectory = new File(plugin.getDataFolder(),srcDirectory).getPath(); try { diff --git a/src/main/java/pers/xanadu/enderdragon/manager/DragonManager.java b/src/main/java/pers/xanadu/enderdragon/manager/DragonManager.java index 1fb38e5..3ea3922 100644 --- a/src/main/java/pers/xanadu/enderdragon/manager/DragonManager.java +++ b/src/main/java/pers/xanadu/enderdragon/manager/DragonManager.java @@ -27,6 +27,7 @@ import java.io.File; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ThreadLocalRandom; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -37,6 +38,8 @@ public class DragonManager { static final ArrayList dragons = new ArrayList<>(); static final Map mp = new HashMap<>(); public static List dragon_names = new ArrayList<>(); + public static final Map existing_dragon = new ConcurrentHashMap<>(); + public static final Map main_dragon = new ConcurrentHashMap<>(); private static int sum = 0; private static final int[][] nxt = {{3,0},{0,3},{-3,0},{0,-3}}; private static final int[][] nxt_2 = {{2,0},{0,2},{-2,0},{0,-2}}; @@ -485,6 +488,39 @@ public class DragonManager { return false; } } + + /** + * Only used to initialize. DON'T use this if speed is essential. + * @param world world + * @return The dragon found in this world. + */ + public static EnderDragon getEnderDragon(final World world){ + if(world.getEnvironment() != World.Environment.THE_END){ + return world.getEntitiesByClass(EnderDragon.class).iterator().next(); + } + if(Version.mcMainVersion >= 16){ + DragonBattle battle = world.getEnderDragonBattle(); + assert battle != null; + return battle.getEnderDragon(); + } + try { + Object battle = getEnderDragonBattle(world); + assert battle != null; + Field k = EnderDragonBattleClass.getDeclaredField("k"); + k.setAccessible(true); + Object dragonKilled = k.get(battle); + if((boolean) dragonKilled) return null; + Field m = EnderDragonBattleClass.getDeclaredField("m"); + m.setAccessible(true); + Object uuid = m.get(battle); +// Field d = EnderDragonBattleClass.getDeclaredField("d"); +// d.setAccessible(true); +// Object worldServer = d.get(battle); + return (EnderDragon) Bukkit.getEntity((UUID) uuid); + } catch (ReflectiveOperationException e) { + return null; + } + } public static Location getEndPortalLocation(final World world){ if(world == null) return null; if(world.getEnvironment() != World.Environment.THE_END) return null; diff --git a/src/main/java/pers/xanadu/enderdragon/metadata/DragonInfo.java b/src/main/java/pers/xanadu/enderdragon/metadata/DragonInfo.java index cfda84c..8b725c6 100644 --- a/src/main/java/pers/xanadu/enderdragon/metadata/DragonInfo.java +++ b/src/main/java/pers/xanadu/enderdragon/metadata/DragonInfo.java @@ -1,8 +1,15 @@ package pers.xanadu.enderdragon.metadata; +import org.bukkit.entity.EnderDragon; + public class DragonInfo { + private final EnderDragon handle; public String unique_name; - public DragonInfo(String unique_name){ + public DragonInfo(final EnderDragon dragon, String unique_name){ + this.handle = dragon; this.unique_name = unique_name; } + public EnderDragon getHandle(){ + return handle; + } } diff --git a/src/main/resources/config-zhcn.yml b/src/main/resources/config-zhcn.yml index 8f741ff..e57f4b9 100644 --- a/src/main/resources/config-zhcn.yml +++ b/src/main/resources/config-zhcn.yml @@ -97,5 +97,7 @@ advanced_setting: world_env_fix: false save_respawn_status: false save_bossbar: false + # to do: 允许在非末地环境使用/ed spawn或respawn复活末影龙 + # can_spawn_not_the_end: false backslash_split: reward: false \ No newline at end of file diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 0ad3a95..502a245 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -96,5 +96,7 @@ advanced_setting: world_env_fix: false save_respawn_status: false save_bossbar: false + # to-do + # can_spawn_not_the_end: false backslash_split: reward: false \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 526d305..7e3f92b 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: EnderDragon -version: 2.5.0-dev +version: 2.5.0 main: pers.xanadu.enderdragon.EnderDragon author: Xanadu13 api-version: 1.13