Citizens2/src/net/citizensnpcs/npc/CitizensNPC.java

179 lines
4.4 KiB
Java
Raw Normal View History

2012-01-15 00:51:37 +01:00
package net.citizensnpcs.npc;
2012-01-19 11:52:58 +01:00
import java.util.HashMap;
import java.util.Map;
2012-01-15 00:51:37 +01:00
2012-01-16 22:18:47 +01:00
import net.citizensnpcs.api.CitizensAPI;
2012-01-15 00:58:47 +01:00
import net.citizensnpcs.api.event.NPCDespawnEvent;
2012-01-15 00:51:37 +01:00
import net.citizensnpcs.api.event.NPCSpawnEvent;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.api.npc.pathfinding.Navigator;
2012-01-22 08:10:25 +01:00
import net.citizensnpcs.api.npc.trait.Character;
2012-01-15 00:51:37 +01:00
import net.citizensnpcs.api.npc.trait.Trait;
2012-01-21 17:21:21 +01:00
import net.citizensnpcs.api.npc.trait.trait.SpawnLocation;
2012-01-15 00:51:37 +01:00
import net.citizensnpcs.resources.lib.CraftNPC;
2012-01-19 11:52:58 +01:00
import net.citizensnpcs.util.Messaging;
2012-01-15 00:51:37 +01:00
import org.bukkit.Bukkit;
2012-01-15 05:41:02 +01:00
import org.bukkit.ChatColor;
2012-01-15 00:51:37 +01:00
import org.bukkit.Location;
2012-01-20 14:15:14 +01:00
import org.bukkit.entity.Entity;
2012-01-15 00:51:37 +01:00
public class CitizensNPC implements NPC {
2012-01-19 12:43:21 +01:00
private final int id;
2012-01-22 08:10:25 +01:00
private Character character;
2012-01-19 12:43:21 +01:00
private final Map<Class<? extends Trait>, Trait> traits = new HashMap<Class<? extends Trait>, Trait>();
private String name;
private CraftNPC mcEntity;
private boolean spawned;
private final CitizensNPCManager manager;
public CitizensNPC(String name, Character character) {
this.name = name;
this.character = character;
manager = (CitizensNPCManager) CitizensAPI.getNPCManager();
2012-01-22 15:07:35 +01:00
id = manager.getUniqueID();
2012-01-19 12:43:21 +01:00
}
public CitizensNPC(int id, String name, Character character) {
this.name = name;
this.character = character;
manager = (CitizensNPCManager) CitizensAPI.getNPCManager();
this.id = id;
}
@Override
public String getFullName() {
return name;
}
@Override
public String getName() {
return ChatColor.stripColor(name);
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
2012-01-22 08:10:25 +01:00
public void addTrait(Trait trait) {
2012-01-22 15:07:35 +01:00
if (!hasTrait(trait.getClass())) {
2012-01-22 08:10:25 +01:00
traits.put(trait.getClass(), trait);
2012-01-22 15:07:35 +01:00
} else {
2012-01-22 08:10:25 +01:00
Messaging.debug("The NPC already has the trait '" + getTrait(trait.getClass()).getName() + "'.");
2012-01-22 15:07:35 +01:00
}
2012-01-19 12:43:21 +01:00
}
@Override
public Character getCharacter() {
return character;
}
@Override
public int getId() {
return id;
}
@Override
public Navigator getNavigator() {
// TODO add default navigator
return null;
}
@Override
2012-01-22 08:10:25 +01:00
public <T extends Trait> T getTrait(Class<T> clazz) {
Trait t = traits.get(clazz);
return t != null ? clazz.cast(t) : null;
2012-01-19 12:43:21 +01:00
}
@Override
public Iterable<Trait> getTraits() {
return traits.values();
}
@Override
public boolean hasTrait(Class<? extends Trait> trait) {
return traits.containsKey(trait);
}
@Override
public void removeTrait(Class<? extends Trait> trait) {
if (!hasTrait(trait)) {
Messaging.debug("The NPC does not have a trait with the name of '" + trait.getName() + ".");
return;
}
traits.remove(trait);
}
@Override
public void setCharacter(Character character) {
if (this.character.equals(character)) {
Messaging.debug("The NPC already has the character '" + character.getName() + "'.");
return;
}
this.character = character;
}
@Override
public boolean isSpawned() {
return spawned;
}
@Override
public void spawn(Location loc) {
if (isSpawned()) {
Messaging.debug("The NPC is already spawned.");
return;
}
NPCSpawnEvent spawnEvent = new NPCSpawnEvent(this, loc);
Bukkit.getPluginManager().callEvent(spawnEvent);
if (spawnEvent.isCancelled()) {
return;
}
2012-01-22 15:07:35 +01:00
if (mcEntity == null) {
2012-01-20 08:27:14 +01:00
mcEntity = manager.spawn(this, loc);
2012-01-22 15:07:35 +01:00
} else {
2012-01-20 08:27:14 +01:00
manager.spawn(this, loc);
2012-01-22 15:07:35 +01:00
}
2012-01-20 08:48:55 +01:00
// Set the location
2012-01-22 08:10:25 +01:00
addTrait(new SpawnLocation(loc));
2012-01-20 08:48:55 +01:00
2012-01-20 08:27:14 +01:00
spawned = true;
2012-01-19 12:43:21 +01:00
}
@Override
public void despawn() {
if (!isSpawned()) {
Messaging.debug("The NPC is already despawned.");
return;
}
Bukkit.getPluginManager().callEvent(new NPCDespawnEvent(this));
manager.despawn(this);
2012-01-20 08:48:55 +01:00
mcEntity.die();
2012-01-20 08:27:14 +01:00
spawned = false;
2012-01-19 12:43:21 +01:00
}
@Override
public void remove() {
2012-01-22 15:07:35 +01:00
if (isSpawned()) {
2012-01-19 12:43:21 +01:00
despawn();
2012-01-22 15:07:35 +01:00
}
2012-01-19 12:43:21 +01:00
manager.remove(this);
}
2012-01-20 14:15:14 +01:00
@Override
public Entity getBukkitEntity() {
return mcEntity.getBukkitEntity();
}
2012-01-19 12:43:21 +01:00
public CraftNPC getHandle() {
return mcEntity;
}
2012-01-15 00:51:37 +01:00
}