From 3d617506d367d948fff35856a0181a433bf4c361 Mon Sep 17 00:00:00 2001 From: Xanadu13 Date: Thu, 29 Feb 2024 20:38:27 +0800 Subject: [PATCH] add enable_worlds --- .../enderdragon/command/TabCompleter.java | 6 +-- .../listener/DragonAttackListener.java | 2 + .../listener/DragonBaseHurtListener.java | 2 + .../DragonDamageByPlayerListener.java | 2 + .../listener/DragonDeathListener.java | 2 + .../listener/DragonExplosionHurtListener.java | 6 +++ .../listener/DragonFireballListener.java | 2 + .../listener/DragonHealListener.java | 2 + .../listener/DragonSpawnListener.java | 19 ++++++--- .../mythiclib/PlayerAttackListener.java | 2 + .../enderdragon/manager/WorldManager.java | 17 ++++---- .../nms/BossBar/v1_14_R1/BossBarManager.java | 2 +- .../nms/BossBar/v1_15_R1/BossBarManager.java | 2 +- .../v1_16_R1_above/BossBarManager.java | 2 +- .../enderdragon/util/ConcurrentSet.java | 39 +++++++++++++++++++ 15 files changed, 89 insertions(+), 18 deletions(-) create mode 100644 src/main/java/pers/xanadu/enderdragon/util/ConcurrentSet.java diff --git a/src/main/java/pers/xanadu/enderdragon/command/TabCompleter.java b/src/main/java/pers/xanadu/enderdragon/command/TabCompleter.java index 7923336..4ffab20 100644 --- a/src/main/java/pers/xanadu/enderdragon/command/TabCompleter.java +++ b/src/main/java/pers/xanadu/enderdragon/command/TabCompleter.java @@ -34,7 +34,7 @@ public class TabCompleter implements org.bukkit.command.TabCompleter { result.addAll(arguments_drop); } else if(args[0].equalsIgnoreCase("respawn")){ - result.addAll(WorldManager.worlds); + result.addAll(WorldManager.all_worlds); } else if(args[0].equalsIgnoreCase("respawn_cd")){ result.addAll(arguments_respawn_cd); @@ -60,11 +60,11 @@ public class TabCompleter implements org.bukkit.command.TabCompleter { else if("respawn_cd".equals(args[0])){ String str = args[1].toLowerCase(); if("get".equals(str) || "remove".equals(str) || "removeAll".equals(str) || "set".equals(str) || "start".equals(str)){ - result.addAll(WorldManager.worlds); + result.addAll(WorldManager.all_worlds); } } else if("spawn".equals(args[0])){ - result.addAll(WorldManager.worlds); + result.addAll(WorldManager.all_worlds); } else if("action".equals(args[0])){ result.addAll(arguments_action); diff --git a/src/main/java/pers/xanadu/enderdragon/listener/DragonAttackListener.java b/src/main/java/pers/xanadu/enderdragon/listener/DragonAttackListener.java index b94897a..0ad070d 100644 --- a/src/main/java/pers/xanadu/enderdragon/listener/DragonAttackListener.java +++ b/src/main/java/pers/xanadu/enderdragon/listener/DragonAttackListener.java @@ -7,6 +7,7 @@ import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.potion.PotionEffect; import pers.xanadu.enderdragon.manager.DragonManager; +import pers.xanadu.enderdragon.manager.WorldManager; import pers.xanadu.enderdragon.util.ExtraPotionEffect; import pers.xanadu.enderdragon.metadata.MyDragon; @@ -17,6 +18,7 @@ public class DragonAttackListener implements Listener { Entity attack = e.getDamager(); if(!(attack instanceof EnderDragon)) return; EnderDragon dragon = (EnderDragon) attack; + 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); diff --git a/src/main/java/pers/xanadu/enderdragon/listener/DragonBaseHurtListener.java b/src/main/java/pers/xanadu/enderdragon/listener/DragonBaseHurtListener.java index 3fbd345..3141557 100644 --- a/src/main/java/pers/xanadu/enderdragon/listener/DragonBaseHurtListener.java +++ b/src/main/java/pers/xanadu/enderdragon/listener/DragonBaseHurtListener.java @@ -6,6 +6,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageByEntityEvent; import pers.xanadu.enderdragon.event.DragonDamageByPlayerEvent; +import pers.xanadu.enderdragon.manager.WorldManager; import static pers.xanadu.enderdragon.EnderDragon.pm; @@ -17,6 +18,7 @@ public class DragonBaseHurtListener implements Listener { Entity victim = e.getEntity(); Entity entity = e.getDamager(); if(victim instanceof EnderDragon){ + if(!WorldManager.enable_worlds.contains(victim.getWorld().getName())) return; EnderDragon dragon = (EnderDragon) victim; if(entity instanceof Player){ Player player = (Player) entity; diff --git a/src/main/java/pers/xanadu/enderdragon/listener/DragonDamageByPlayerListener.java b/src/main/java/pers/xanadu/enderdragon/listener/DragonDamageByPlayerListener.java index e293383..e1027eb 100644 --- a/src/main/java/pers/xanadu/enderdragon/listener/DragonDamageByPlayerListener.java +++ b/src/main/java/pers/xanadu/enderdragon/listener/DragonDamageByPlayerListener.java @@ -11,6 +11,7 @@ import pers.xanadu.enderdragon.config.Config; import pers.xanadu.enderdragon.config.Lang; import pers.xanadu.enderdragon.event.DragonDamageByPlayerEvent; import pers.xanadu.enderdragon.manager.DamageManager; +import pers.xanadu.enderdragon.manager.WorldManager; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; @@ -22,6 +23,7 @@ public class DragonDamageByPlayerListener implements Listener { if(e.isCancelled()) return; Player p = e.getDamager(); EnderDragon dragon = e.getDragon(); + if(!WorldManager.enable_worlds.contains(dragon.getWorld().getName())) return; double health = dragon.getHealth(); double damage = Math.min(e.getFinalDamage(),health); if(damage > 0.0d){ diff --git a/src/main/java/pers/xanadu/enderdragon/listener/DragonDeathListener.java b/src/main/java/pers/xanadu/enderdragon/listener/DragonDeathListener.java index 4bc73a7..f94b7db 100644 --- a/src/main/java/pers/xanadu/enderdragon/listener/DragonDeathListener.java +++ b/src/main/java/pers/xanadu/enderdragon/listener/DragonDeathListener.java @@ -19,6 +19,7 @@ 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; @@ -37,6 +38,7 @@ public class DragonDeathListener implements Listener { 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); diff --git a/src/main/java/pers/xanadu/enderdragon/listener/DragonExplosionHurtListener.java b/src/main/java/pers/xanadu/enderdragon/listener/DragonExplosionHurtListener.java index ef74694..2c5765b 100644 --- a/src/main/java/pers/xanadu/enderdragon/listener/DragonExplosionHurtListener.java +++ b/src/main/java/pers/xanadu/enderdragon/listener/DragonExplosionHurtListener.java @@ -15,6 +15,7 @@ import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.player.PlayerBedEnterEvent; import pers.xanadu.enderdragon.event.DragonDamageByPlayerEvent; import pers.xanadu.enderdragon.event.PlayerExplodeDragonEvent; +import pers.xanadu.enderdragon.manager.WorldManager; import java.util.Collection; import java.util.UUID; @@ -34,6 +35,7 @@ public class DragonExplosionHurtListener implements Listener { Entity victim = e.getEntity(); Entity entity = e.getDamager(); if(victim instanceof EnderDragon){ + if(!WorldManager.enable_worlds.contains(victim.getWorld().getName())) return; EnderDragon dragon = (EnderDragon) victim; if(entity instanceof TNTPrimed){ TNTPrimed tnt = (TNTPrimed) entity; @@ -56,6 +58,7 @@ public class DragonExplosionHurtListener implements Listener { if(e.getCause() != EntityDamageEvent.DamageCause.BLOCK_EXPLOSION) return; Entity entity = e.getEntity(); if(entity instanceof EnderDragon){ + if(!WorldManager.enable_worlds.contains(entity.getWorld().getName())) return; EnderDragon dragon = (EnderDragon) entity; for(UUID uuid : mp.keySet()){ PlayerExplodeDragonEvent ped = mp.get(uuid); @@ -72,7 +75,10 @@ public class DragonExplosionHurtListener implements Listener { @EventHandler(priority = EventPriority.HIGH) public void OnPlayerClickBed(final PlayerBedEnterEvent e){ Player p = e.getPlayer(); + // more precise judgement is needed. + // try World::isBedWorks() if(p.getWorld().getEnvironment() != World.Environment.THE_END) return; + if(!WorldManager.enable_worlds.contains(p.getWorld().getName())) return; long time = pers.xanadu.enderdragon.EnderDragon.getInstance().getWorldDataManager().getGameTime(e.getPlayer().getWorld()); Location bed_loc = e.getBed().getLocation(); Collection entities = getExplosionDragon(5f,bed_loc); diff --git a/src/main/java/pers/xanadu/enderdragon/listener/DragonFireballListener.java b/src/main/java/pers/xanadu/enderdragon/listener/DragonFireballListener.java index 3f8c4f3..589ceda 100644 --- a/src/main/java/pers/xanadu/enderdragon/listener/DragonFireballListener.java +++ b/src/main/java/pers/xanadu/enderdragon/listener/DragonFireballListener.java @@ -10,6 +10,7 @@ import org.bukkit.event.Listener; import org.bukkit.event.entity.EntitySpawnEvent; import org.bukkit.potion.PotionEffect; import pers.xanadu.enderdragon.manager.DragonManager; +import pers.xanadu.enderdragon.manager.WorldManager; import pers.xanadu.enderdragon.metadata.MyDragon; import static pers.xanadu.enderdragon.manager.DragonManager.getSpecialKey; @@ -41,6 +42,7 @@ public class DragonFireballListener implements Listener { if(effectCloud.getSource() == null) return; if(!(effectCloud.getSource() instanceof EnderDragon)) return; EnderDragon dragon = (EnderDragon) effectCloud.getSource(); + if(!WorldManager.enable_worlds.contains(dragon.getWorld().getName())) return; String unique_name = getSpecialKey(dragon); if(unique_name == null) return; MyDragon myDragon = DragonManager.get_dragon_config(unique_name); diff --git a/src/main/java/pers/xanadu/enderdragon/listener/DragonHealListener.java b/src/main/java/pers/xanadu/enderdragon/listener/DragonHealListener.java index 25bf4d4..b26329a 100644 --- a/src/main/java/pers/xanadu/enderdragon/listener/DragonHealListener.java +++ b/src/main/java/pers/xanadu/enderdragon/listener/DragonHealListener.java @@ -6,6 +6,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityRegainHealthEvent; import pers.xanadu.enderdragon.manager.DragonManager; +import pers.xanadu.enderdragon.manager.WorldManager; import pers.xanadu.enderdragon.metadata.MyDragon; import static pers.xanadu.enderdragon.manager.DragonManager.getSpecialKey; @@ -15,6 +16,7 @@ public class DragonHealListener implements Listener { public void OnDragonHeal(final EntityRegainHealthEvent e){ if(!(e.getEntity() instanceof EnderDragon)) return; EnderDragon dragon = (EnderDragon) e.getEntity(); + if(!WorldManager.enable_worlds.contains(dragon.getWorld().getName())) return; if(!e.getRegainReason().equals(EntityRegainHealthEvent.RegainReason.ENDER_CRYSTAL)) return; String unique_name = getSpecialKey(dragon); if(unique_name == null) return; diff --git a/src/main/java/pers/xanadu/enderdragon/listener/DragonSpawnListener.java b/src/main/java/pers/xanadu/enderdragon/listener/DragonSpawnListener.java index 657ed6e..e16e7ae 100644 --- a/src/main/java/pers/xanadu/enderdragon/listener/DragonSpawnListener.java +++ b/src/main/java/pers/xanadu/enderdragon/listener/DragonSpawnListener.java @@ -1,6 +1,7 @@ package pers.xanadu.enderdragon.listener; import org.bukkit.Bukkit; +import org.bukkit.World; import org.bukkit.attribute.Attribute; import org.bukkit.boss.BarColor; import org.bukkit.boss.BarFlag; @@ -15,6 +16,8 @@ import pers.xanadu.enderdragon.config.Config; import pers.xanadu.enderdragon.config.Lang; import pers.xanadu.enderdragon.event.DragonRespawnPostEvent; import pers.xanadu.enderdragon.manager.DamageManager; +import pers.xanadu.enderdragon.manager.DragonManager; +import pers.xanadu.enderdragon.manager.WorldManager; import pers.xanadu.enderdragon.metadata.DragonInfo; import pers.xanadu.enderdragon.metadata.MyDragon; import pers.xanadu.enderdragon.util.Version; @@ -30,19 +33,20 @@ public class DragonSpawnListener implements Listener { @EventHandler(priority = EventPriority.LOW) public void OnDragonSpawn(final CreatureSpawnEvent e){ if(!(e.getEntity() instanceof EnderDragon)) return; - if(Config.blacklist_worlds.contains(e.getEntity().getWorld().getName())) return; + if(!WorldManager.enable_worlds.contains(e.getEntity().getWorld().getName())) return; if(Config.blacklist_spawn_reason.contains(e.getSpawnReason().name())) return; EnderDragon dragon = (EnderDragon) e.getEntity(); + World world = dragon.getWorld(); MyDragon myDragon = null; if(e.getSpawnReason() == CreatureSpawnEvent.SpawnReason.DEFAULT){ - myDragon = getDesignatedDragon(dragon.getWorld()); + myDragon = getDesignatedDragon(world); } if(myDragon == null) myDragon = judge(); if(myDragon == null) { Lang.warn("special_dragon_jude_mode setting error!"); return; } - DragonInfo info = new DragonInfo(myDragon.unique_name); + DragonInfo info = new DragonInfo(dragon,myDragon.unique_name); Bukkit.getPluginManager().callEvent(new DragonRespawnPostEvent(dragon,e.getSpawnReason(),info)); MyDragon update = getFromInfo(info); if(update == null) { @@ -51,6 +55,11 @@ public class DragonSpawnListener implements Listener { else{ myDragon = update; } + { + existing_dragon.put(dragon.getUniqueId(),new DragonInfo(dragon,myDragon.unique_name)); + DragonInfo old = main_dragon.get(world.getName()); + if(old == null || !old.getHandle().isValid()) main_dragon.put(world.getName(),new DragonInfo(dragon,myDragon.unique_name)); + } setSpecialKey(dragon, myDragon.unique_name); DamageManager.data.put(dragon.getUniqueId(),new ConcurrentHashMap<>()); int times = data.getInt("times"); @@ -86,10 +95,10 @@ public class DragonSpawnListener implements Listener { } } else if(Version.mcMainVersion >= 12){ - getInstance().getBossBarManager().setBossBar(dragon.getWorld(),myDragon); + getInstance().getBossBarManager().setBossBar(world,myDragon); } if(Config.advanced_setting_save_bossbar){ - getInstance().getBossBarManager().saveBossBarData(Collections.singletonList(dragon.getWorld())); + getInstance().getBossBarManager().saveBossBarData(Collections.singletonList(world)); } } diff --git a/src/main/java/pers/xanadu/enderdragon/listener/mythiclib/PlayerAttackListener.java b/src/main/java/pers/xanadu/enderdragon/listener/mythiclib/PlayerAttackListener.java index efc2175..208ddf6 100644 --- a/src/main/java/pers/xanadu/enderdragon/listener/mythiclib/PlayerAttackListener.java +++ b/src/main/java/pers/xanadu/enderdragon/listener/mythiclib/PlayerAttackListener.java @@ -7,6 +7,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import pers.xanadu.enderdragon.event.DragonDamageByPlayerEvent; +import pers.xanadu.enderdragon.manager.WorldManager; import static pers.xanadu.enderdragon.EnderDragon.pm; @@ -16,6 +17,7 @@ public class PlayerAttackListener implements Listener { if(e.isCancelled()) return; if(!(e.getEntity() instanceof org.bukkit.entity.EnderDragon)) return; EnderDragon dragon = (EnderDragon) e.getEntity(); + if(!WorldManager.enable_worlds.contains(dragon.getWorld().getName())) return; DamageMetadata damage = e.getDamage(); double final_damage = damage.getDamage(); if(final_damage > 0.0d){ diff --git a/src/main/java/pers/xanadu/enderdragon/manager/WorldManager.java b/src/main/java/pers/xanadu/enderdragon/manager/WorldManager.java index d8fde3f..ecb5373 100644 --- a/src/main/java/pers/xanadu/enderdragon/manager/WorldManager.java +++ b/src/main/java/pers/xanadu/enderdragon/manager/WorldManager.java @@ -5,29 +5,32 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.EnderDragon; import org.bukkit.entity.Entity; +import pers.xanadu.enderdragon.config.Config; import pers.xanadu.enderdragon.config.Lang; +import pers.xanadu.enderdragon.util.ConcurrentSet; import pers.xanadu.enderdragon.util.Version; import java.lang.reflect.Field; import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; +import java.util.*; import static java.lang.Math.sqrt; import static pers.xanadu.enderdragon.EnderDragon.getInstance; import static pers.xanadu.enderdragon.util.MathUtil.*; public class WorldManager { - public static final List worlds = new ArrayList<>(); + public static final List all_worlds = new ArrayList<>(); + public static final Set enable_worlds = new ConcurrentSet<>(); private Field dimension; private Field world_provider; private Method getDimensionID; public static void reload(){ - worlds.clear(); - Bukkit.getWorlds().forEach(world -> worlds.add(world.getName())); + all_worlds.clear(); + Bukkit.getWorlds().forEach(world -> all_worlds.add(world.getName())); + enable_worlds.clear(); + enable_worlds.addAll(all_worlds); + Config.blacklist_worlds.forEach(enable_worlds::remove); } public static Collection getExplosionDragon(float power, Location loc){ diff --git a/src/main/java/pers/xanadu/enderdragon/nms/BossBar/v1_14_R1/BossBarManager.java b/src/main/java/pers/xanadu/enderdragon/nms/BossBar/v1_14_R1/BossBarManager.java index 130b358..fa61932 100644 --- a/src/main/java/pers/xanadu/enderdragon/nms/BossBar/v1_14_R1/BossBarManager.java +++ b/src/main/java/pers/xanadu/enderdragon/nms/BossBar/v1_14_R1/BossBarManager.java @@ -82,4 +82,4 @@ public class BossBarManager implements I_BossBarManager { } public void setBossBar(World world, final MyDragon myDragon){ } -} +} \ No newline at end of file diff --git a/src/main/java/pers/xanadu/enderdragon/nms/BossBar/v1_15_R1/BossBarManager.java b/src/main/java/pers/xanadu/enderdragon/nms/BossBar/v1_15_R1/BossBarManager.java index f6e779d..6f36013 100644 --- a/src/main/java/pers/xanadu/enderdragon/nms/BossBar/v1_15_R1/BossBarManager.java +++ b/src/main/java/pers/xanadu/enderdragon/nms/BossBar/v1_15_R1/BossBarManager.java @@ -83,4 +83,4 @@ public class BossBarManager implements I_BossBarManager { public void setBossBar(World world, final MyDragon myDragon){ } -} +} \ No newline at end of file diff --git a/src/main/java/pers/xanadu/enderdragon/nms/BossBar/v1_16_R1_above/BossBarManager.java b/src/main/java/pers/xanadu/enderdragon/nms/BossBar/v1_16_R1_above/BossBarManager.java index dfa714b..da2dace 100644 --- a/src/main/java/pers/xanadu/enderdragon/nms/BossBar/v1_16_R1_above/BossBarManager.java +++ b/src/main/java/pers/xanadu/enderdragon/nms/BossBar/v1_16_R1_above/BossBarManager.java @@ -68,4 +68,4 @@ public class BossBarManager implements I_BossBarManager { } public void setBossBar(World world, final MyDragon myDragon){ } -} +} \ No newline at end of file diff --git a/src/main/java/pers/xanadu/enderdragon/util/ConcurrentSet.java b/src/main/java/pers/xanadu/enderdragon/util/ConcurrentSet.java new file mode 100644 index 0000000..e730449 --- /dev/null +++ b/src/main/java/pers/xanadu/enderdragon/util/ConcurrentSet.java @@ -0,0 +1,39 @@ +package pers.xanadu.enderdragon.util; + +import java.io.Serializable; +import java.util.AbstractSet; +import java.util.Iterator; +import java.util.concurrent.ConcurrentHashMap; + +public class ConcurrentSet extends AbstractSet implements Serializable { + private static final long serialVersionUID = 1072237514L; + private final ConcurrentHashMap map = new ConcurrentHashMap<>(); + + public ConcurrentSet() { + } + + public int size() { + return this.map.size(); + } + + public boolean contains(Object o) { + return this.map.containsKey(o); + } + + public boolean add(T o) { + return this.map.putIfAbsent(o, Boolean.TRUE) == null; + } + + public boolean remove(Object o) { + return this.map.remove(o) != null; + } + + public void clear() { + this.map.clear(); + } + + public Iterator iterator() { + return this.map.keySet().iterator(); + } + +}