Citizens2/src/main/java/net/citizensnpcs/EventListen.java

201 lines
7.1 KiB
Java
Raw Normal View History

2012-01-19 08:38:40 +01:00
package net.citizensnpcs;
2012-01-23 15:30:15 +01:00
import net.citizensnpcs.Settings.Setting;
import net.citizensnpcs.api.event.NPCDamageByEntityEvent;
import net.citizensnpcs.api.event.NPCDamageEvent;
2012-03-11 07:43:18 +01:00
import net.citizensnpcs.api.event.NPCLeftClickEvent;
import net.citizensnpcs.api.event.NPCRightClickEvent;
2012-01-19 08:38:40 +01:00
import net.citizensnpcs.api.npc.NPC;
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-03-08 19:01:12 +01:00
import net.citizensnpcs.npc.entity.EntityHumanNPC;
import net.citizensnpcs.trait.CurrentLocation;
import net.citizensnpcs.trait.text.Text;
import net.citizensnpcs.util.Util;
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.EntityDeathEvent;
2012-01-19 08:38:40 +01:00
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
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);
npc.spawn(npc.getTrait(CurrentLocation.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()) {
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) {
if (!npcManager.isNPC(event.getEntity()))
2012-01-23 09:45:34 +01:00
return;
NPC npc = npcManager.getNPC(event.getEntity());
2012-01-23 09:45:34 +01:00
if (event instanceof EntityDamageByEntityEvent) {
2012-05-14 13:45:16 +02:00
NPCDamageByEntityEvent damageEvent = new NPCDamageByEntityEvent(npc, (EntityDamageByEntityEvent) event);
Bukkit.getPluginManager().callEvent(damageEvent);
2012-05-14 13:45:16 +02:00
if (!damageEvent.isCancelled() || !(damageEvent.getDamager() instanceof Player))
return;
2012-05-14 13:45:16 +02:00
Player damager = (Player) damageEvent.getDamager();
// Call left-click event
NPCLeftClickEvent leftClickEvent = new NPCLeftClickEvent(npc, damager);
Bukkit.getPluginManager().callEvent(leftClickEvent);
if (leftClickEvent.isCancelled())
return;
if (npc.getCharacter() != null)
npc.getCharacter().onLeftClick(npc, damager);
} else {
Bukkit.getPluginManager().callEvent(new NPCDamageEvent(npc, event));
2012-01-23 09:45:34 +01:00
}
}
2012-03-27 16:42:15 +02:00
@EventHandler
public void onEntityDeath(EntityDeathEvent event) {
if (!npcManager.isNPC(event.getEntity()))
return;
NPC npc = npcManager.getNPC(event.getEntity());
npc.despawn();
}
2012-01-23 09:45:34 +01:00
@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
NPC npc = npcManager.getNPC(event.getEntity());
2012-01-23 15:30:15 +01:00
Player player = (Player) event.getTarget();
2012-03-11 07:43:18 +01:00
// Call right-click event
NPCRightClickEvent rightClickEvent = new NPCRightClickEvent(npc, player);
Bukkit.getPluginManager().callEvent(rightClickEvent);
if (rightClickEvent.isCancelled())
return;
2012-03-04 19:06:33 +01:00
// If the NPC isn't a close talker
2012-03-25 10:43:24 +02:00
// TODO: move this into text.class
if (Util.isSettingFulfilled(player, Setting.TALK_ITEM) && !npc.getTrait(Text.class).shouldTalkClose())
npc.getTrait(Text.class).sendText(player);
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) {
if (!npcManager.isNPC(event.getRightClicked()))
2012-01-23 15:30:15 +01:00
return;
2012-03-11 07:43:18 +01:00
// Call target event for NPCs
2012-01-23 15:30:15 +01:00
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(CurrentLocation.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;
2012-03-02 11:36:54 +01:00
npc.despawn();
toRespawn.put(toIntPair(npc.getBukkitEntity().getLocation().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
}