2012-01-19 08:38:40 +01:00
|
|
|
package net.citizensnpcs;
|
|
|
|
|
2012-01-23 15:30:15 +01:00
|
|
|
import net.citizensnpcs.Settings.Setting;
|
2012-01-19 08:38:40 +01:00
|
|
|
import net.citizensnpcs.api.npc.NPC;
|
2012-02-23 12:17:15 +01:00
|
|
|
import net.citizensnpcs.api.trait.trait.Owner;
|
|
|
|
import net.citizensnpcs.api.trait.trait.SpawnLocation;
|
2012-02-27 14:01:38 +01:00
|
|
|
import net.citizensnpcs.editor.Editor;
|
2012-01-23 15:30:15 +01:00
|
|
|
import net.citizensnpcs.npc.CitizensNPCManager;
|
2012-02-26 07:35:44 +01:00
|
|
|
import net.citizensnpcs.resource.lib.EntityHumanNPC;
|
2012-03-03 15:15:45 +01:00
|
|
|
import net.citizensnpcs.trait.text.Text;
|
2012-01-23 15:30:15 +01:00
|
|
|
import net.citizensnpcs.util.Messaging;
|
2012-01-19 08:38:40 +01:00
|
|
|
|
2012-01-23 15:30:15 +01:00
|
|
|
import org.bukkit.Bukkit;
|
2012-02-19 18:45:43 +01:00
|
|
|
import org.bukkit.Chunk;
|
2012-01-19 11:52:58 +01:00
|
|
|
import org.bukkit.Location;
|
2012-02-26 07:35:44 +01:00
|
|
|
import org.bukkit.craftbukkit.CraftServer;
|
|
|
|
import org.bukkit.craftbukkit.entity.CraftPlayer;
|
2012-01-19 08:38:40 +01:00
|
|
|
import org.bukkit.entity.Player;
|
|
|
|
import org.bukkit.event.EventHandler;
|
|
|
|
import org.bukkit.event.Listener;
|
|
|
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
|
|
|
import org.bukkit.event.entity.EntityDamageEvent;
|
|
|
|
import org.bukkit.event.entity.EntityTargetEvent;
|
2012-01-23 15:30:15 +01:00
|
|
|
import org.bukkit.event.entity.EntityTargetEvent.TargetReason;
|
2012-02-26 07:35:44 +01:00
|
|
|
import org.bukkit.event.player.PlayerChangedWorldEvent;
|
2012-01-23 15:30:15 +01:00
|
|
|
import org.bukkit.event.player.PlayerInteractEntityEvent;
|
2012-02-27 14:01:38 +01:00
|
|
|
import org.bukkit.event.player.PlayerQuitEvent;
|
2012-01-19 08:38:40 +01:00
|
|
|
import org.bukkit.event.world.ChunkLoadEvent;
|
|
|
|
import org.bukkit.event.world.ChunkUnloadEvent;
|
2012-02-26 06:23:43 +01:00
|
|
|
import org.bukkit.event.world.WorldLoadEvent;
|
|
|
|
import org.bukkit.event.world.WorldUnloadEvent;
|
2012-01-19 08:38:40 +01:00
|
|
|
|
2012-03-02 11:59:40 +01:00
|
|
|
import com.google.common.collect.ArrayListMultimap;
|
|
|
|
import com.google.common.collect.ListMultimap;
|
|
|
|
import com.google.gson.internal.Pair;
|
|
|
|
|
2012-01-19 08:38:40 +01:00
|
|
|
public class EventListen implements Listener {
|
2012-01-28 05:11:23 +01:00
|
|
|
private volatile CitizensNPCManager npcManager;
|
2012-03-02 11:59:40 +01:00
|
|
|
private final ListMultimap<Pair<Integer, Integer>, Integer> toRespawn = ArrayListMultimap.create();
|
2012-01-22 08:10:25 +01:00
|
|
|
|
2012-01-25 16:29:54 +01:00
|
|
|
public EventListen(CitizensNPCManager npcManager) {
|
|
|
|
this.npcManager = npcManager;
|
2012-01-22 08:10:25 +01:00
|
|
|
}
|
2012-01-19 08:38:40 +01:00
|
|
|
|
2012-01-19 12:43:21 +01:00
|
|
|
/*
|
2012-03-06 01:32:53 +01:00
|
|
|
* Chunk events
|
2012-01-19 12:43:21 +01:00
|
|
|
*/
|
|
|
|
@EventHandler
|
|
|
|
public void onChunkLoad(ChunkLoadEvent event) {
|
2012-03-02 11:59:40 +01:00
|
|
|
Pair<Integer, Integer> coord = toIntPair(event.getChunk());
|
|
|
|
if (!toRespawn.containsKey(coord))
|
2012-02-19 18:45:43 +01:00
|
|
|
return;
|
2012-03-02 11:59:40 +01:00
|
|
|
for (int id : toRespawn.get(coord)) {
|
2012-02-19 18:45:43 +01:00
|
|
|
NPC npc = npcManager.getNPC(id);
|
2012-02-26 06:23:43 +01:00
|
|
|
npc.spawn(npc.getTrait(SpawnLocation.class).getLocation());
|
2012-01-19 12:43:21 +01:00
|
|
|
}
|
2012-03-02 11:59:40 +01:00
|
|
|
toRespawn.removeAll(coord);
|
2012-01-19 12:43:21 +01:00
|
|
|
}
|
2012-01-19 08:38:40 +01:00
|
|
|
|
2012-01-19 12:43:21 +01:00
|
|
|
@EventHandler
|
|
|
|
public void onChunkUnload(ChunkUnloadEvent event) {
|
|
|
|
if (event.isCancelled())
|
|
|
|
return;
|
2012-01-19 08:38:40 +01:00
|
|
|
|
2012-03-02 11:59:40 +01:00
|
|
|
Pair<Integer, Integer> coord = toIntPair(event.getChunk());
|
2012-01-28 05:11:23 +01:00
|
|
|
for (NPC npc : npcManager) {
|
2012-01-28 21:16:30 +01:00
|
|
|
if (!npc.isSpawned())
|
2012-02-26 06:23:43 +01:00
|
|
|
continue;
|
2012-01-21 17:21:21 +01:00
|
|
|
Location loc = npc.getBukkitEntity().getLocation();
|
2012-01-19 12:43:21 +01:00
|
|
|
if (event.getWorld().equals(loc.getWorld()) && event.getChunk().getX() == loc.getChunk().getX()
|
|
|
|
&& event.getChunk().getZ() == loc.getChunk().getZ()) {
|
2012-01-21 17:21:21 +01:00
|
|
|
npc.getTrait(SpawnLocation.class).setLocation(loc);
|
2012-01-19 12:43:21 +01:00
|
|
|
npc.despawn();
|
2012-03-02 11:59:40 +01:00
|
|
|
toRespawn.put(coord, npc.getId());
|
2012-01-19 12:43:21 +01:00
|
|
|
}
|
|
|
|
}
|
2012-02-26 06:23:43 +01:00
|
|
|
}
|
|
|
|
|
2012-01-23 09:45:34 +01:00
|
|
|
/*
|
|
|
|
* Entity events
|
|
|
|
*/
|
|
|
|
@EventHandler
|
|
|
|
public void onEntityDamage(EntityDamageEvent event) {
|
2012-01-25 16:29:54 +01:00
|
|
|
if (!npcManager.isNPC(event.getEntity()))
|
2012-01-23 09:45:34 +01:00
|
|
|
return;
|
|
|
|
|
2012-02-20 06:09:01 +01:00
|
|
|
event.setCancelled(true);
|
2012-01-23 09:45:34 +01:00
|
|
|
if (event instanceof EntityDamageByEntityEvent) {
|
|
|
|
EntityDamageByEntityEvent e = (EntityDamageByEntityEvent) event;
|
|
|
|
if (e.getDamager() instanceof Player) {
|
2012-01-25 16:29:54 +01:00
|
|
|
NPC npc = npcManager.getNPC(event.getEntity());
|
2012-01-23 09:45:34 +01:00
|
|
|
if (npc.getCharacter() != null)
|
|
|
|
npc.getCharacter().onLeftClick(npc, (Player) e.getDamager());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@EventHandler
|
|
|
|
public void onEntityTarget(EntityTargetEvent event) {
|
2012-01-29 00:19:45 +01:00
|
|
|
if (event.isCancelled() || !npcManager.isNPC(event.getEntity()) || !(event.getTarget() instanceof Player))
|
|
|
|
return;
|
2012-01-23 09:45:34 +01:00
|
|
|
|
2012-01-25 16:29:54 +01:00
|
|
|
NPC npc = npcManager.getNPC(event.getEntity());
|
2012-01-23 15:30:15 +01:00
|
|
|
Player player = (Player) event.getTarget();
|
2012-03-02 12:10:46 +01:00
|
|
|
if (!player.hasMetadata("selected") || player.getMetadata("selected").size() == 0
|
|
|
|
|| player.getMetadata("selected").get(0).asInt() != npc.getId()) {
|
2012-02-18 05:53:28 +01:00
|
|
|
if (player.getItemInHand().getTypeId() == Setting.SELECTION_ITEM.asInt()
|
|
|
|
&& (npc.getTrait(Owner.class).getOwner().equals(player.getName()) || player
|
2012-02-19 18:07:19 +01:00
|
|
|
.hasPermission("citizens.admin"))) {
|
2012-01-25 16:29:54 +01:00
|
|
|
npcManager.selectNPC(player, npc);
|
2012-01-30 12:58:59 +01:00
|
|
|
Messaging.sendWithNPC(player, Setting.SELECTION_MESSAGE.asString(), npc);
|
|
|
|
if (!Setting.QUICK_SELECT.asBoolean())
|
2012-01-25 11:09:02 +01:00
|
|
|
return;
|
|
|
|
}
|
2012-01-23 15:30:15 +01:00
|
|
|
}
|
2012-03-04 19:06:33 +01:00
|
|
|
// If the NPC isn't a close talker
|
|
|
|
if (player.getItemInHand().getTypeId() == Setting.TALK_ITEM.asInt()
|
|
|
|
&& !npc.getTrait(Text.class).shouldTalkClose())
|
2012-03-03 15:15:45 +01:00
|
|
|
npc.getTrait(Text.class).sendText(player);
|
|
|
|
|
2012-01-25 11:09:02 +01:00
|
|
|
if (npc.getCharacter() != null)
|
|
|
|
npc.getCharacter().onRightClick(npc, player);
|
2012-01-23 15:30:15 +01:00
|
|
|
}
|
|
|
|
|
2012-03-06 01:32:53 +01:00
|
|
|
/*
|
|
|
|
* Player events
|
|
|
|
*/
|
2012-02-27 14:01:38 +01:00
|
|
|
@EventHandler
|
2012-03-02 11:36:54 +01:00
|
|
|
public void onPlayerChangedWorld(PlayerChangedWorldEvent event) {
|
|
|
|
if (!(((CraftPlayer) event.getPlayer()).getHandle() instanceof EntityHumanNPC))
|
|
|
|
return;
|
|
|
|
|
|
|
|
((CraftServer) Bukkit.getServer()).getHandle().players.remove(((CraftPlayer) event.getPlayer()).getHandle());
|
2012-02-27 14:01:38 +01:00
|
|
|
}
|
|
|
|
|
2012-01-23 15:30:15 +01:00
|
|
|
@EventHandler
|
|
|
|
public void onPlayerInteractEntity(PlayerInteractEntityEvent event) {
|
2012-01-25 16:29:54 +01:00
|
|
|
if (!npcManager.isNPC(event.getRightClicked()))
|
2012-01-23 15:30:15 +01:00
|
|
|
return;
|
|
|
|
|
|
|
|
Bukkit.getPluginManager().callEvent(
|
|
|
|
new EntityTargetEvent(event.getRightClicked(), event.getPlayer(), TargetReason.CUSTOM));
|
2012-01-23 09:45:34 +01:00
|
|
|
}
|
2012-02-26 07:35:44 +01:00
|
|
|
|
|
|
|
@EventHandler
|
2012-03-02 11:36:54 +01:00
|
|
|
public void onPlayerQuit(PlayerQuitEvent event) {
|
|
|
|
Editor.leave(event.getPlayer());
|
|
|
|
}
|
|
|
|
|
2012-03-06 01:32:53 +01:00
|
|
|
/*
|
|
|
|
* World events
|
|
|
|
*/
|
2012-03-02 11:36:54 +01:00
|
|
|
@EventHandler
|
|
|
|
public void onWorldLoad(WorldLoadEvent event) {
|
2012-03-02 11:59:40 +01:00
|
|
|
for (Pair<Integer, Integer> chunk : toRespawn.keySet()) {
|
|
|
|
if (!event.getWorld().isChunkLoaded(chunk.first, chunk.second))
|
|
|
|
continue;
|
|
|
|
for (int id : toRespawn.get(chunk)) {
|
|
|
|
NPC npc = npcManager.getNPC(id);
|
|
|
|
npc.spawn(npc.getTrait(SpawnLocation.class).getLocation());
|
2012-03-02 11:36:54 +01:00
|
|
|
}
|
2012-03-02 11:59:40 +01:00
|
|
|
toRespawn.removeAll(chunk);
|
2012-03-02 11:36:54 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@EventHandler
|
|
|
|
public void onWorldUnload(WorldUnloadEvent event) {
|
|
|
|
if (event.isCancelled())
|
2012-02-26 07:35:44 +01:00
|
|
|
return;
|
|
|
|
|
2012-03-02 11:36:54 +01:00
|
|
|
for (NPC npc : npcManager) {
|
|
|
|
if (!npc.isSpawned() || !npc.getBukkitEntity().getWorld().equals(event.getWorld()))
|
|
|
|
continue;
|
|
|
|
Location loc = npc.getBukkitEntity().getLocation();
|
|
|
|
npc.getTrait(SpawnLocation.class).setLocation(loc);
|
|
|
|
npc.despawn();
|
2012-03-02 11:59:40 +01:00
|
|
|
toRespawn.put(toIntPair(loc.getChunk()), npc.getId());
|
2012-03-02 11:36:54 +01:00
|
|
|
}
|
2012-02-26 07:35:44 +01:00
|
|
|
}
|
2012-03-02 11:59:40 +01:00
|
|
|
|
|
|
|
private Pair<Integer, Integer> toIntPair(Chunk chunk) {
|
|
|
|
return new Pair<Integer, Integer>(chunk.getX(), chunk.getZ());
|
|
|
|
}
|
2012-01-19 08:38:40 +01:00
|
|
|
}
|