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

180 lines
6.5 KiB
Java
Raw Normal View History

2012-01-19 08:38:40 +01:00
package net.citizensnpcs;
2012-01-22 08:10:25 +01:00
import java.util.ArrayList;
2012-02-19 18:45:43 +01:00
import java.util.HashMap;
2012-01-22 08:10:25 +01:00
import java.util.List;
2012-02-19 18:45:43 +01:00
import java.util.Map;
2012-01-19 08:38:40 +01:00
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-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
public class EventListen implements Listener {
2012-01-28 05:11:23 +01:00
private volatile CitizensNPCManager npcManager;
2012-03-02 11:36:54 +01:00
private final Map<Chunk, List<Integer>> toRespawn = new HashMap<Chunk, List<Integer>>();
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
/*
* World events
*/
@EventHandler
public void onChunkLoad(ChunkLoadEvent event) {
2012-02-19 18:45:43 +01:00
if (!toRespawn.containsKey(event.getChunk()))
return;
for (int id : toRespawn.get(event.getChunk())) {
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-02-19 18:45:43 +01:00
toRespawn.remove(event.getChunk());
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-02-19 18:45:43 +01:00
List<Integer> respawn = new ArrayList<Integer>();
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-02-19 18:45:43 +01:00
respawn.add(npc.getId());
2012-01-19 12:43:21 +01:00
}
}
2012-02-26 06:23:43 +01:00
if (respawn.size() > 0)
toRespawn.put(event.getChunk(), respawn);
}
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;
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) {
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
NPC npc = npcManager.getNPC(event.getEntity());
2012-01-23 15:30:15 +01:00
Player player = (Player) event.getTarget();
2012-03-02 11:19:18 +01:00
if (!player.hasMetadata("selected") || player.getMetadata("selected").size() == 0
|| player.getMetadata("selected").get(0).asInt() != npc.getId()) {
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"))) {
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())
return;
}
2012-01-23 15:30:15 +01:00
}
2012-03-01 13:07:54 +01:00
player.openInventory(npc.getInventory());
if (npc.getCharacter() != null)
npc.getCharacter().onRightClick(npc, player);
2012-01-23 15:30:15 +01:00
}
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;
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
2012-03-02 11:36:54 +01:00
/*
* Player events
*/
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());
}
@EventHandler
public void onWorldLoad(WorldLoadEvent event) {
for (Chunk chunk : toRespawn.keySet()) {
if (event.getWorld().isChunkLoaded(chunk)) {
for (int id : toRespawn.get(chunk)) {
NPC npc = npcManager.getNPC(id);
npc.spawn(npc.getTrait(SpawnLocation.class).getLocation());
}
toRespawn.remove(chunk);
}
}
}
@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();
if (toRespawn.containsKey(loc.getChunk()))
toRespawn.get(loc.getChunk()).add(npc.getId());
else {
List<Integer> respawn = new ArrayList<Integer>();
respawn.add(npc.getId());
toRespawn.put(loc.getChunk(), respawn);
}
}
2012-02-26 07:35:44 +01:00
}
2012-01-19 08:38:40 +01:00
}