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.trait.Character;
|
|
|
|
import net.citizensnpcs.api.npc.NPC;
|
|
|
|
import net.citizensnpcs.api.npc.pathfinding.Navigator;
|
|
|
|
import net.citizensnpcs.api.npc.trait.Trait;
|
2012-01-15 04:52:31 +01:00
|
|
|
import net.citizensnpcs.api.npc.trait.trait.LocationTrait;
|
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;
|
|
|
|
|
|
|
|
public class CitizensNPC implements NPC {
|
|
|
|
private final int id;
|
|
|
|
private Character character = null;
|
2012-01-19 11:52:58 +01:00
|
|
|
private final Map<Class<? extends Trait>, Trait> traits = new HashMap<Class<? extends Trait>, Trait>();
|
2012-01-15 05:41:02 +01:00
|
|
|
private String name;
|
2012-01-15 00:51:37 +01:00
|
|
|
private CraftNPC mcEntity;
|
2012-01-15 04:52:31 +01:00
|
|
|
private boolean spawned;
|
2012-01-15 05:23:58 +01:00
|
|
|
private final CitizensNPCManager manager;
|
2012-01-19 11:52:58 +01:00
|
|
|
private final Factory factory = new Factory();
|
2012-01-15 00:51:37 +01:00
|
|
|
|
2012-01-19 11:52:58 +01:00
|
|
|
public CitizensNPC(String name, Character character) {
|
2012-01-15 05:41:02 +01:00
|
|
|
this.name = name;
|
2012-01-15 00:51:37 +01:00
|
|
|
this.character = character;
|
2012-01-16 22:18:47 +01:00
|
|
|
manager = (CitizensNPCManager) CitizensAPI.getNPCManager();
|
2012-01-15 05:23:58 +01:00
|
|
|
id = manager.getUniqueID();
|
2012-01-15 00:51:37 +01:00
|
|
|
}
|
|
|
|
|
2012-01-19 11:52:58 +01:00
|
|
|
public CitizensNPC(int id, String name, Character character) {
|
|
|
|
this.name = name;
|
|
|
|
this.character = character;
|
|
|
|
manager = (CitizensNPCManager) CitizensAPI.getNPCManager();
|
|
|
|
this.id = id;
|
|
|
|
}
|
|
|
|
|
2012-01-15 05:41:02 +01:00
|
|
|
@Override
|
|
|
|
public String getFullName() {
|
|
|
|
return name;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String getName() {
|
|
|
|
return ChatColor.stripColor(name);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void setName(String name) {
|
|
|
|
this.name = name;
|
|
|
|
}
|
|
|
|
|
2012-01-15 00:51:37 +01:00
|
|
|
@Override
|
2012-01-19 11:52:58 +01:00
|
|
|
public void addTrait(Class<? extends Trait> trait) {
|
2012-01-15 00:51:37 +01:00
|
|
|
if (!hasTrait(trait))
|
2012-01-19 11:52:58 +01:00
|
|
|
traits.put(trait, factory.create(trait));
|
2012-01-15 00:51:37 +01:00
|
|
|
else
|
2012-01-19 11:52:58 +01:00
|
|
|
Messaging.debug("The NPC already has the trait '" + trait.getName() + "'.");
|
2012-01-15 00:51:37 +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-19 11:52:58 +01:00
|
|
|
public <T extends Trait> T getTrait(Class<T> trait) {
|
|
|
|
Trait t = traits.get(trait);
|
|
|
|
if (t != null) {
|
|
|
|
return trait.cast(t);
|
2012-01-15 00:51:37 +01:00
|
|
|
}
|
|
|
|
|
2012-01-19 11:52:58 +01:00
|
|
|
T create = factory.create(trait);
|
|
|
|
addTrait(trait);
|
|
|
|
return create;
|
2012-01-15 00:51:37 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2012-01-19 11:52:58 +01:00
|
|
|
public Iterable<Trait> getTraits() {
|
|
|
|
return traits.values();
|
2012-01-15 00:51:37 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2012-01-19 11:52:58 +01:00
|
|
|
public boolean hasTrait(Class<? extends Trait> trait) {
|
|
|
|
return traits.containsKey(trait);
|
2012-01-15 00:51:37 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2012-01-19 11:52:58 +01:00
|
|
|
public void removeTrait(Class<? extends Trait> trait) {
|
2012-01-15 05:23:58 +01:00
|
|
|
if (!hasTrait(trait)) {
|
2012-01-19 11:52:58 +01:00
|
|
|
Messaging.debug("The NPC does not have a trait with the name of '" + trait.getName() + ".");
|
2012-01-15 05:23:58 +01:00
|
|
|
return;
|
|
|
|
}
|
2012-01-15 00:51:37 +01:00
|
|
|
traits.remove(trait);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2012-01-15 05:23:58 +01:00
|
|
|
public void setCharacter(Character character) {
|
|
|
|
if (this.character.equals(character)) {
|
2012-01-19 11:52:58 +01:00
|
|
|
Messaging.debug("The NPC already has the character '" + character.getName() + "'.");
|
2012-01-15 05:23:58 +01:00
|
|
|
return;
|
|
|
|
}
|
2012-01-15 00:51:37 +01:00
|
|
|
this.character = character;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2012-01-15 04:52:31 +01:00
|
|
|
public boolean isSpawned() {
|
|
|
|
return spawned;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2012-01-15 05:23:58 +01:00
|
|
|
public void spawn(Location loc) {
|
2012-01-19 11:52:58 +01:00
|
|
|
if (isSpawned()) {
|
2012-01-15 05:23:58 +01:00
|
|
|
System.out.println("The NPC is already spawned.");
|
|
|
|
return;
|
|
|
|
}
|
2012-01-15 04:52:31 +01:00
|
|
|
|
2012-01-15 00:51:37 +01:00
|
|
|
NPCSpawnEvent spawnEvent = new NPCSpawnEvent(this, loc);
|
|
|
|
Bukkit.getPluginManager().callEvent(spawnEvent);
|
|
|
|
if (spawnEvent.isCancelled()) {
|
|
|
|
return;
|
|
|
|
}
|
2012-01-15 20:33:49 +01:00
|
|
|
|
|
|
|
spawned = true;
|
2012-01-19 11:52:58 +01:00
|
|
|
getTrait(LocationTrait.class).setLocation(loc);
|
2012-01-15 08:00:04 +01:00
|
|
|
mcEntity = manager.spawn(this, loc);
|
2012-01-15 00:51:37 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2012-01-15 05:23:58 +01:00
|
|
|
public void despawn() {
|
2012-01-19 11:52:58 +01:00
|
|
|
if (!isSpawned()) {
|
2012-01-15 05:23:58 +01:00
|
|
|
System.out.println("The NPC is already despawned.");
|
|
|
|
return;
|
|
|
|
}
|
2012-01-15 04:52:31 +01:00
|
|
|
|
2012-01-15 00:58:47 +01:00
|
|
|
Bukkit.getPluginManager().callEvent(new NPCDespawnEvent(this));
|
|
|
|
|
2012-01-15 20:33:49 +01:00
|
|
|
spawned = false;
|
2012-01-15 00:51:37 +01:00
|
|
|
mcEntity.die();
|
2012-01-15 05:23:58 +01:00
|
|
|
manager.despawn(this);
|
2012-01-15 00:51:37 +01:00
|
|
|
}
|
|
|
|
|
2012-01-15 04:52:31 +01:00
|
|
|
@Override
|
|
|
|
public void remove() {
|
2012-01-19 11:52:58 +01:00
|
|
|
if (isSpawned()) {
|
2012-01-15 05:23:58 +01:00
|
|
|
despawn();
|
|
|
|
}
|
|
|
|
manager.remove(this);
|
2012-01-15 04:52:31 +01:00
|
|
|
}
|
|
|
|
|
2012-01-15 00:51:37 +01:00
|
|
|
public CraftNPC getHandle() {
|
|
|
|
return mcEntity;
|
|
|
|
}
|
2012-01-19 11:52:58 +01:00
|
|
|
|
|
|
|
private class Factory {
|
|
|
|
private final Map<Class<? extends Trait>, Trait> created = new HashMap<Class<? extends Trait>, Trait>();
|
|
|
|
|
|
|
|
public <T extends Trait> T create(Class<T> clazz) {
|
|
|
|
if (created.containsKey(clazz)) {
|
|
|
|
return clazz.cast(created.get(clazz));
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
Trait trait = clazz.newInstance();
|
|
|
|
created.put(clazz, trait);
|
|
|
|
return clazz.cast(trait);
|
|
|
|
} catch (Exception ex) {
|
|
|
|
ex.printStackTrace();
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2012-01-15 00:51:37 +01:00
|
|
|
}
|