Add useNativeCitizensRegistry game rule

This commit is contained in:
Daniel Saukel 2020-08-31 22:28:36 +02:00
parent 3ee64194fc
commit cae69090be
10 changed files with 35 additions and 14 deletions

View File

@ -355,6 +355,10 @@ public class GameRule<V> {
* If group tags are used. * If group tags are used.
*/ */
public static final GameRule<Boolean> GROUP_TAG_ENABLED = new GameRule<>(Boolean.class, "groupTagEnabled", false); public static final GameRule<Boolean> GROUP_TAG_ENABLED = new GameRule<>(Boolean.class, "groupTagEnabled", false);
/**
* If Citizens NPCs should be copied to the native registry.
*/
public static final GameRule<Boolean> USE_NATIVE_CITIZENS_REGISTRY = new GameRule<>(Boolean.class, "useNativeCitizensRegistry", false);
/** /**
* An array of all game rules that exist natively in DungeonsXL. * An array of all game rules that exist natively in DungeonsXL.

View File

@ -24,9 +24,8 @@ import de.erethon.dungeonsxl.api.player.InstancePlayer;
import de.erethon.dungeonsxl.config.DMessage; import de.erethon.dungeonsxl.config.DMessage;
import de.erethon.dungeonsxl.player.DGlobalPlayer; import de.erethon.dungeonsxl.player.DGlobalPlayer;
import de.erethon.dungeonsxl.player.DPermission; import de.erethon.dungeonsxl.player.DPermission;
import org.bukkit.command.CommandSender;
import java.util.List; import java.util.List;
import org.bukkit.command.CommandSender;
/** /**
* @author Goh Wei Wen * @author Goh Wei Wen

View File

@ -16,7 +16,6 @@
*/ */
package de.erethon.dungeonsxl.dungeon; package de.erethon.dungeonsxl.dungeon;
import de.erethon.commons.player.PlayerUtil;
import de.erethon.dungeonsxl.DungeonsXL; import de.erethon.dungeonsxl.DungeonsXL;
import de.erethon.dungeonsxl.api.dungeon.Dungeon; import de.erethon.dungeonsxl.api.dungeon.Dungeon;
import de.erethon.dungeonsxl.api.dungeon.Game; import de.erethon.dungeonsxl.api.dungeon.Game;

View File

@ -18,6 +18,7 @@ package de.erethon.dungeonsxl.mob;
import de.erethon.commons.misc.NumberUtil; import de.erethon.commons.misc.NumberUtil;
import de.erethon.dungeonsxl.DungeonsXL; import de.erethon.dungeonsxl.DungeonsXL;
import de.erethon.dungeonsxl.api.dungeon.GameRule;
import de.erethon.dungeonsxl.api.mob.ExternalMobProvider; import de.erethon.dungeonsxl.api.mob.ExternalMobProvider;
import de.erethon.dungeonsxl.api.world.GameWorld; import de.erethon.dungeonsxl.api.world.GameWorld;
import java.util.HashSet; import java.util.HashSet;
@ -27,6 +28,7 @@ import net.citizensnpcs.api.event.NPCDeathEvent;
import net.citizensnpcs.api.npc.AbstractNPC; import net.citizensnpcs.api.npc.AbstractNPC;
import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.npc.NPC;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.LivingEntity; import org.bukkit.entity.LivingEntity;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
@ -69,6 +71,17 @@ public class CitizensMobProvider implements ExternalMobProvider, Listener {
*/ */
public void removeSpawnedNPC(NPC npc) { public void removeSpawnedNPC(NPC npc) {
spawnedNPCs.remove(npc); spawnedNPCs.remove(npc);
npc.destroy();
}
public void removeSpawnedNPCs(World world) {
Set<NPC> worldNPCs = new HashSet<>();
for (NPC npc : spawnedNPCs) {
if (npc.getStoredLocation().getWorld().equals(world)) {
worldNPCs.add(npc);
}
}
worldNPCs.forEach(this::removeSpawnedNPC);
} }
@Override @Override
@ -93,19 +106,19 @@ public class CitizensMobProvider implements ExternalMobProvider, Listener {
return; return;
} }
NPC npc = registry.createTransientClone((AbstractNPC) source); GameWorld gameWorld = DungeonsXL.getInstance().getGameWorld(location.getWorld());
if (gameWorld == null) {
return;
}
boolean nativeRegistry = gameWorld.getDungeon().getRules().getState(GameRule.USE_NATIVE_CITIZENS_REGISTRY);
NPC npc = nativeRegistry ? source.clone() : registry.createTransientClone((AbstractNPC) source);
if (npc.isSpawned()) { if (npc.isSpawned()) {
npc.despawn(); npc.despawn();
} }
npc.spawn(location); npc.spawn(location);
spawnedNPCs.add(npc); spawnedNPCs.add(npc);
GameWorld gameWorld = DungeonsXL.getInstance().getGameWorld(location.getWorld());
if (gameWorld == null) {
return;
}
new DMob((LivingEntity) npc.getEntity(), gameWorld, mob); new DMob((LivingEntity) npc.getEntity(), gameWorld, mob);
} }

View File

@ -17,7 +17,6 @@
package de.erethon.dungeonsxl.player; package de.erethon.dungeonsxl.player;
import de.erethon.commons.chat.MessageUtil; import de.erethon.commons.chat.MessageUtil;
import de.erethon.commons.player.PlayerUtil;
import de.erethon.dungeonsxl.DungeonsXL; import de.erethon.dungeonsxl.DungeonsXL;
import de.erethon.dungeonsxl.api.player.EditPlayer; import de.erethon.dungeonsxl.api.player.EditPlayer;
import de.erethon.dungeonsxl.api.world.EditWorld; import de.erethon.dungeonsxl.api.world.EditWorld;

View File

@ -19,7 +19,6 @@ package de.erethon.dungeonsxl.player;
import de.erethon.caliburn.item.VanillaItem; import de.erethon.caliburn.item.VanillaItem;
import de.erethon.caliburn.mob.VanillaMob; import de.erethon.caliburn.mob.VanillaMob;
import de.erethon.commons.chat.MessageUtil; import de.erethon.commons.chat.MessageUtil;
import de.erethon.commons.player.PlayerUtil;
import de.erethon.dungeonsxl.DungeonsXL; import de.erethon.dungeonsxl.DungeonsXL;
import de.erethon.dungeonsxl.api.Reward; import de.erethon.dungeonsxl.api.Reward;
import de.erethon.dungeonsxl.api.dungeon.Game; import de.erethon.dungeonsxl.api.dungeon.Game;

View File

@ -16,7 +16,6 @@
*/ */
package de.erethon.dungeonsxl.player; package de.erethon.dungeonsxl.player;
import de.erethon.commons.player.PlayerUtil;
import de.erethon.dungeonsxl.api.player.GamePlayer; import de.erethon.dungeonsxl.api.player.GamePlayer;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;

View File

@ -23,6 +23,7 @@ import de.erethon.dungeonsxl.DungeonsXL;
import de.erethon.dungeonsxl.api.event.world.EditWorldSaveEvent; import de.erethon.dungeonsxl.api.event.world.EditWorldSaveEvent;
import de.erethon.dungeonsxl.api.event.world.EditWorldUnloadEvent; import de.erethon.dungeonsxl.api.event.world.EditWorldUnloadEvent;
import de.erethon.dungeonsxl.api.world.EditWorld; import de.erethon.dungeonsxl.api.world.EditWorld;
import de.erethon.dungeonsxl.mob.CitizensMobProvider;
import de.erethon.dungeonsxl.player.DEditPlayer; import de.erethon.dungeonsxl.player.DEditPlayer;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@ -158,6 +159,10 @@ public class DEditWorld extends DInstanceWorld implements EditWorld {
return; return;
} }
if (Bukkit.getPluginManager().getPlugin("Citizens") != null) {
((CitizensMobProvider) plugin.getExternalMobProviderRegistry().get("CI")).removeSpawnedNPCs(getWorld());
}
kickAllPlayers(); kickAllPlayers();
if (save) { if (save) {

View File

@ -34,6 +34,7 @@ import de.erethon.dungeonsxl.api.mob.DungeonMob;
import de.erethon.dungeonsxl.api.player.PlayerGroup; import de.erethon.dungeonsxl.api.player.PlayerGroup;
import de.erethon.dungeonsxl.api.sign.DungeonSign; import de.erethon.dungeonsxl.api.sign.DungeonSign;
import de.erethon.dungeonsxl.api.world.GameWorld; import de.erethon.dungeonsxl.api.world.GameWorld;
import de.erethon.dungeonsxl.mob.CitizensMobProvider;
import de.erethon.dungeonsxl.sign.button.ReadySign; import de.erethon.dungeonsxl.sign.button.ReadySign;
import de.erethon.dungeonsxl.sign.passive.StartSign; import de.erethon.dungeonsxl.sign.passive.StartSign;
import de.erethon.dungeonsxl.sign.windup.MobSign; import de.erethon.dungeonsxl.sign.windup.MobSign;
@ -467,6 +468,10 @@ public class DGameWorld extends DInstanceWorld implements GameWorld {
return; return;
} }
if (Bukkit.getPluginManager().getPlugin("Citizens") != null) {
((CitizensMobProvider) plugin.getExternalMobProviderRegistry().get("CI")).removeSpawnedNPCs(getWorld());
}
kickAllPlayers(); kickAllPlayers();
Bukkit.unloadWorld(getWorld(), /* SPIGOT-5225 */ !Version.isAtLeast(Version.MC1_14_4)); Bukkit.unloadWorld(getWorld(), /* SPIGOT-5225 */ !Version.isAtLeast(Version.MC1_14_4));

View File

@ -17,7 +17,6 @@
package de.erethon.dungeonsxl.world; package de.erethon.dungeonsxl.world;
import de.erethon.commons.chat.MessageUtil; import de.erethon.commons.chat.MessageUtil;
import de.erethon.commons.player.PlayerUtil;
import de.erethon.dungeonsxl.DungeonsXL; import de.erethon.dungeonsxl.DungeonsXL;
import de.erethon.dungeonsxl.api.DungeonsAPI; import de.erethon.dungeonsxl.api.DungeonsAPI;
import de.erethon.dungeonsxl.api.dungeon.GameRule; import de.erethon.dungeonsxl.api.dungeon.GameRule;