Citizens2/src/main/java/net/citizensnpcs/npc/CitizensTraitManager.java

131 lines
5.5 KiB
Java
Raw Normal View History

2012-03-08 02:03:32 +01:00
package net.citizensnpcs.npc;
import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
2012-03-08 02:03:32 +01:00
2012-03-23 12:18:10 +01:00
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
2012-03-08 02:03:32 +01:00
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.api.trait.Trait;
import net.citizensnpcs.api.trait.TraitFactory;
import net.citizensnpcs.api.trait.TraitManager;
import net.citizensnpcs.api.trait.trait.Equipment;
import net.citizensnpcs.api.trait.trait.Inventory;
import net.citizensnpcs.api.trait.trait.MobType;
import net.citizensnpcs.api.trait.trait.Owner;
import net.citizensnpcs.api.trait.trait.Spawned;
import net.citizensnpcs.trait.Age;
import net.citizensnpcs.trait.CurrentLocation;
2012-03-08 02:03:32 +01:00
import net.citizensnpcs.trait.LookClose;
import net.citizensnpcs.trait.Powered;
import net.citizensnpcs.trait.Saddle;
import net.citizensnpcs.trait.Sheared;
import net.citizensnpcs.trait.VillagerProfession;
import net.citizensnpcs.trait.WoolColor;
2012-03-08 02:03:32 +01:00
import net.citizensnpcs.trait.text.Text;
import net.citizensnpcs.trait.waypoint.Waypoints;
public class CitizensTraitManager implements TraitManager {
2012-03-23 12:18:10 +01:00
private final Map<Plugin, Map<String, Class<? extends Trait>>> registered = new HashMap<Plugin, Map<String, Class<? extends Trait>>>();
2012-03-12 20:13:20 +01:00
private final Map<Class<? extends Trait>, Constructor<? extends Trait>> CACHED_CTORS = new HashMap<Class<? extends Trait>, Constructor<? extends Trait>>();
2012-03-08 02:03:32 +01:00
public CitizensTraitManager() {
// Register Citizens traits
2012-03-23 12:18:10 +01:00
Plugin plugin = Bukkit.getPluginManager().getPlugin("Citizens");
registerTrait(new TraitFactory(Age.class).withName("age").withPlugin(plugin));
registerTrait(new TraitFactory(CurrentLocation.class).withName("location").withPlugin(plugin));
registerTrait(new TraitFactory(Equipment.class).withName("equipment").withPlugin(plugin));
registerTrait(new TraitFactory(Inventory.class).withName("inventory").withPlugin(plugin));
registerTrait(new TraitFactory(LookClose.class).withName("look-close").withPlugin(plugin));
registerTrait(new TraitFactory(MobType.class).withName("type").withPlugin(plugin));
registerTrait(new TraitFactory(Owner.class).withName("owner").withPlugin(plugin));
registerTrait(new TraitFactory(Powered.class).withName("powered").withPlugin(plugin));
registerTrait(new TraitFactory(Saddle.class).withName("saddle").withPlugin(plugin));
registerTrait(new TraitFactory(Sheared.class).withName("sheared").withPlugin(plugin));
registerTrait(new TraitFactory(Spawned.class).withName("spawned").withPlugin(plugin));
registerTrait(new TraitFactory(Text.class).withName("text").withPlugin(plugin));
registerTrait(new TraitFactory(VillagerProfession.class).withName("profession").withPlugin(plugin));
registerTrait(new TraitFactory(Waypoints.class).withName("waypoints").withPlugin(plugin));
registerTrait(new TraitFactory(WoolColor.class).withName("wool-color").withPlugin(plugin));
2012-03-08 02:03:32 +01:00
}
2012-03-10 20:41:09 +01:00
@Override
public <T extends Trait> T getTrait(Class<T> clazz) {
return getTrait(clazz, null);
}
2012-03-08 02:03:32 +01:00
@SuppressWarnings("unchecked")
@Override
2012-03-10 20:41:09 +01:00
public <T extends Trait> T getTrait(String name) {
2012-03-23 12:18:10 +01:00
for (Plugin plugin : registered.keySet()) {
if (!registered.get(plugin).containsKey(name))
return null;
return (T) create(registered.get(plugin).get(name), null);
}
return null;
2012-03-08 02:03:32 +01:00
}
@Override
2012-03-10 20:41:09 +01:00
public void registerTrait(TraitFactory factory) {
2012-03-23 12:18:10 +01:00
Map<String, Class<? extends Trait>> map = registered.get(factory.getTraitPlugin());
if (map == null)
map = new HashMap<String, Class<? extends Trait>>();
map.put(factory.getTraitName(), factory.getTraitClass());
registered.put(factory.getTraitPlugin(), map);
2012-03-08 02:03:32 +01:00
}
@SuppressWarnings("unchecked")
public <T extends Trait> T getTrait(Class<T> clazz, NPC npc) {
2012-03-23 12:18:10 +01:00
for (Entry<Plugin, Map<String, Class<? extends Trait>>> entry : registered.entrySet()) {
for (Entry<String, Class<? extends Trait>> subEntry : entry.getValue().entrySet()) {
if (!subEntry.getValue().equals(clazz))
continue;
Trait t = create(subEntry.getValue(), npc);
t.setName(subEntry.getKey());
t.setPlugin(entry.getKey());
return (T) t;
}
}
2012-03-08 02:03:32 +01:00
return null;
}
@SuppressWarnings("unchecked")
2012-03-10 20:41:09 +01:00
public <T extends Trait> T getTrait(String name, NPC npc) {
2012-03-23 12:18:10 +01:00
for (Plugin plugin : registered.keySet()) {
Class<? extends Trait> clazz = registered.get(plugin).get(name);
if (clazz == null)
continue;
return (T) getTrait(clazz, npc);
}
return null;
2012-03-08 02:03:32 +01:00
}
@SuppressWarnings("unchecked")
private <T extends Trait> T create(Class<T> trait, NPC npc) {
Constructor<? extends Trait> constructor;
if (!CACHED_CTORS.containsKey(trait)) {
try {
constructor = trait.getConstructor(NPC.class);
constructor.setAccessible(true);
} catch (Exception ex) {
constructor = null;
}
CACHED_CTORS.put(trait, constructor);
2012-03-12 20:13:20 +01:00
} else
constructor = CACHED_CTORS.get(trait);
2012-03-08 02:03:32 +01:00
try {
if (constructor == null || npc == null)
return trait.newInstance();
return (T) constructor.newInstance(npc);
2012-03-08 02:03:32 +01:00
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
}