From d28c35fd600e788fb9b101dccd1f35d8096045a9 Mon Sep 17 00:00:00 2001 From: fullwall Date: Wed, 21 Nov 2012 20:10:21 +0800 Subject: [PATCH] EventListen calls with DespawnReason --- .../java/net/citizensnpcs/EventListen.java | 17 +++++++------ src/main/java/net/citizensnpcs/Settings.java | 4 ++-- .../net/citizensnpcs/npc/CitizensNPC.java | 17 ++++++++++++- .../java/net/citizensnpcs/util/Messages.java | 2 +- .../citizensnpcs/util/PlayerAnimation.java | 24 +++++++++---------- 5 files changed, 41 insertions(+), 23 deletions(-) diff --git a/src/main/java/net/citizensnpcs/EventListen.java b/src/main/java/net/citizensnpcs/EventListen.java index 70bbedad8..7f22de6d1 100644 --- a/src/main/java/net/citizensnpcs/EventListen.java +++ b/src/main/java/net/citizensnpcs/EventListen.java @@ -4,6 +4,7 @@ import java.util.List; import net.citizensnpcs.Settings.Setting; import net.citizensnpcs.api.CitizensAPI; +import net.citizensnpcs.api.event.DespawnReason; import net.citizensnpcs.api.event.EntityTargetNPCEvent; import net.citizensnpcs.api.event.NPCCombustByBlockEvent; import net.citizensnpcs.api.event.NPCCombustByEntityEvent; @@ -82,16 +83,13 @@ public class EventListen implements Listener { @EventHandler(ignoreCancelled = true) public void onChunkUnload(ChunkUnloadEvent event) { ChunkCoord coord = toCoord(event.getChunk()); - boolean forceLoad = Setting.KEEP_CHUNKS_LOADED.asBoolean(); for (NPC npc : npcRegistry) { if (!npc.isSpawned()) continue; Location loc = npc.getBukkitEntity().getLocation(); - if (forceLoad && loc.getChunk().isLoaded()) - continue; // location#getChunk() forces chunk to load boolean sameChunkCoordinates = coord.z == loc.getBlockZ() >> 4 && coord.x == loc.getBlockX() >> 4; - if (event.getWorld().equals(loc.getWorld()) && sameChunkCoordinates) { - npc.despawn(); + if (sameChunkCoordinates && event.getWorld().equals(loc.getWorld())) { + npc.despawn(DespawnReason.CHUNK_UNLOAD); toRespawn.put(coord, npc.getId()); Messaging.debug("Despawned", npc.getId(), "due to chunk unload at [" + coord.x + "," + coord.z + "]"); @@ -161,7 +159,7 @@ public class EventListen implements Listener { return; NPC npc = npcRegistry.getNPC(event.getEntity()); Bukkit.getPluginManager().callEvent(new NPCDeathEvent(npc, event)); - npc.despawn(); + npc.despawn(DespawnReason.DEATH); } @EventHandler(priority = EventPriority.HIGHEST) @@ -272,7 +270,12 @@ public class EventListen implements Listener { NPC npc = npcRegistry.getById(id); if (npc == null) return; - npc.spawn(npc.getTrait(CurrentLocation.class).getLocation()); + Location spawn = npc.getTrait(CurrentLocation.class).getLocation(); + if (spawn == null) { + Messaging.debug("Couldn't find a spawn location for despawned NPC ID: " + id); + return; + } + npc.spawn(spawn); } private void storeForRespawn(NPC npc) { diff --git a/src/main/java/net/citizensnpcs/Settings.java b/src/main/java/net/citizensnpcs/Settings.java index 3434afddd..0b7afbb4d 100644 --- a/src/main/java/net/citizensnpcs/Settings.java +++ b/src/main/java/net/citizensnpcs/Settings.java @@ -68,6 +68,7 @@ public class Settings { } }, HIGHLIGHT_COLOUR("general.color-scheme.message-highlight", ""), + KEEP_CHUNKS_LOADED("npc.chunks.always-keep-loaded", false), LOCALE("general.translation.locale", ""), MAX_NPC_LIMIT_CHECKS("npc.limits.max-permission-checks", 100), MAX_SPEED("npc.limits.max-speed", 100), @@ -84,8 +85,7 @@ public class Settings { SUBPLUGIN_FOLDER("subplugins.folder", "plugins"), TALK_CLOSE_MAXIMUM_COOLDOWN("npc.text.max-talk-cooldown", 60), TALK_CLOSE_MINIMUM_COOLDOWN("npc.text.min-talk-cooldown", 30), - TALK_ITEM("npc.text.talk-item", "340"), - KEEP_CHUNKS_LOADED("npc.chunks.always-keep-loaded", false); + TALK_ITEM("npc.text.talk-item", "340"); protected String path; protected Object value; diff --git a/src/main/java/net/citizensnpcs/npc/CitizensNPC.java b/src/main/java/net/citizensnpcs/npc/CitizensNPC.java index 8e3fa11b5..1e80fd535 100644 --- a/src/main/java/net/citizensnpcs/npc/CitizensNPC.java +++ b/src/main/java/net/citizensnpcs/npc/CitizensNPC.java @@ -5,8 +5,10 @@ import java.util.List; import javax.annotation.Nullable; import net.citizensnpcs.EventListen; +import net.citizensnpcs.Settings.Setting; import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.ai.Navigator; +import net.citizensnpcs.api.event.DespawnReason; import net.citizensnpcs.api.event.NPCDespawnEvent; import net.citizensnpcs.api.event.NPCSpawnEvent; import net.citizensnpcs.api.exception.NPCLoadException; @@ -48,10 +50,23 @@ public abstract class CitizensNPC extends AbstractNPC { @Override public boolean despawn() { + return despawn(DespawnReason.PLUGIN); + } + + @Override + public boolean despawn(DespawnReason reason) { if (!isSpawned()) return false; - Bukkit.getPluginManager().callEvent(new NPCDespawnEvent(this)); + NPCDespawnEvent event = new NPCDespawnEvent(this, reason); + if (reason == DespawnReason.CHUNK_UNLOAD) + event.setCancelled(Setting.KEEP_CHUNKS_LOADED.asBoolean()); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) { + getBukkitEntity().getLocation().getChunk(); + // ensure that we are in a loaded chunk. + return false; + } boolean keepSelected = getTrait(Spawned.class).shouldSpawn(); if (!keepSelected) data().remove("selectors"); diff --git a/src/main/java/net/citizensnpcs/util/Messages.java b/src/main/java/net/citizensnpcs/util/Messages.java index 721789e2a..44bf1e119 100644 --- a/src/main/java/net/citizensnpcs/util/Messages.java +++ b/src/main/java/net/citizensnpcs/util/Messages.java @@ -82,6 +82,7 @@ public class Messages { public static final String INVALID_ANIMATION = "citizens.editors.waypoints.triggers.animation.invalid-animation"; public static final String INVALID_POSE_NAME = "citizens.commands.npc.pose.invalid-name"; public static final String INVALID_PROFESSION = "citizens.commands.npc.profession.invalid-profession"; + public static final String INVALID_SKELETON_TYPE = "citizens.commands.npc.skeletontype.invalid-type"; public static final String INVALID_SPAWN_LOCATION = "citizens.commands.npc.create.invalid-location"; public static final String INVALID_TRIGGER_TELEPORT_FORMAT = "citizens.editors.waypoints.triggers.teleport.invalid-format"; public static final String LINEAR_WAYPOINT_EDITOR_ADDED_WAYPOINT = "citizens.editors.waypoints.linear.added-waypoint"; @@ -211,5 +212,4 @@ public class Messages { public static final String WAYPOINT_TRIGGER_TELEPORT_PROMPT = "citizens.editors.waypoints.triggers.teleport.prompt"; public static final String WORLD_NOT_FOUND = "citizens.commands.errors.missing-world"; public static final String WRITING_DEFAULT_SETTING = "citizens.settings.writing-default"; - public static final String INVALID_SKELETON_TYPE = "citizens.commands.npc.skeletontype.invalid-type"; } diff --git a/src/main/java/net/citizensnpcs/util/PlayerAnimation.java b/src/main/java/net/citizensnpcs/util/PlayerAnimation.java index 190a705a6..4f37415aa 100644 --- a/src/main/java/net/citizensnpcs/util/PlayerAnimation.java +++ b/src/main/java/net/citizensnpcs/util/PlayerAnimation.java @@ -24,6 +24,12 @@ public enum PlayerAnimation { sendPacketNearby(packet, player, radius); } }, + SIT { + @Override + protected void playAnimation(EntityPlayer player, int radius) { + player.mount(player); + } + }, SLEEP { @Override protected void playAnimation(EntityPlayer player, int radius) { @@ -32,18 +38,6 @@ public enum PlayerAnimation { sendPacketNearby(packet, player, radius); } }, - SIT { - @Override - protected void playAnimation(EntityPlayer player, int radius) { - player.mount(player); - } - }, - STOP_SITTING { - @Override - protected void playAnimation(EntityPlayer player, int radius) { - player.mount(null); - } - }, SNEAK { @Override protected void playAnimation(EntityPlayer player, int radius) { @@ -52,6 +46,12 @@ public enum PlayerAnimation { radius); } }, + STOP_SITTING { + @Override + protected void playAnimation(EntityPlayer player, int radius) { + player.mount(null); + } + }, STOP_SLEEPING { @Override protected void playAnimation(EntityPlayer player, int radius) {