add enable_worlds

This commit is contained in:
Xanadu13
2024-02-29 20:38:27 +08:00
parent 282dcba1f4
commit 3d617506d3
15 changed files with 89 additions and 18 deletions
@@ -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);
@@ -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);
@@ -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;
@@ -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){
@@ -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);
@@ -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<EnderDragon> entities = getExplosionDragon(5f,bed_loc);
@@ -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);
@@ -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;
@@ -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));
}
}
@@ -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){
@@ -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<String> worlds = new ArrayList<>();
public static final List<String> all_worlds = new ArrayList<>();
public static final Set<String> 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<EnderDragon> getExplosionDragon(float power, Location loc){
@@ -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<T> extends AbstractSet<T> implements Serializable {
private static final long serialVersionUID = 1072237514L;
private final ConcurrentHashMap<T, Boolean> 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<T> iterator() {
return this.map.keySet().iterator();
}
}