mirror of
https://github.com/CitizensDev/Citizens2.git
synced 2024-10-01 08:37:57 +02:00
refactor a bit
This commit is contained in:
parent
c2b11b70c1
commit
51e0313cb6
Binary file not shown.
@ -2,3 +2,6 @@ name: Citizens
|
|||||||
authors: [aPunch, fullwall]
|
authors: [aPunch, fullwall]
|
||||||
version: 2.0
|
version: 2.0
|
||||||
main: net.citizensnpcs.Citizens
|
main: net.citizensnpcs.Citizens
|
||||||
|
commands:
|
||||||
|
npc:
|
||||||
|
description: Basic commands for all NPC-related things
|
@ -1,16 +1,30 @@
|
|||||||
package net.citizensnpcs;
|
package net.citizensnpcs;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
import net.citizensnpcs.api.CitizensAPI;
|
import net.citizensnpcs.api.CitizensAPI;
|
||||||
|
import net.citizensnpcs.api.DataKey;
|
||||||
|
import net.citizensnpcs.api.exception.NPCLoadException;
|
||||||
import net.citizensnpcs.api.npc.NPC;
|
import net.citizensnpcs.api.npc.NPC;
|
||||||
|
import net.citizensnpcs.api.npc.trait.Character;
|
||||||
|
import net.citizensnpcs.api.npc.trait.Trait;
|
||||||
import net.citizensnpcs.api.npc.trait.trait.LocationTrait;
|
import net.citizensnpcs.api.npc.trait.trait.LocationTrait;
|
||||||
import net.citizensnpcs.npc.CitizensNPCManager;
|
import net.citizensnpcs.npc.CitizensNPCManager;
|
||||||
|
import net.citizensnpcs.npc.trait.CitizensCharacterManager;
|
||||||
|
import net.citizensnpcs.storage.Storage;
|
||||||
|
import net.citizensnpcs.storage.flatfile.YamlStorage;
|
||||||
import net.citizensnpcs.util.Messaging;
|
import net.citizensnpcs.util.Messaging;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
public class Citizens extends JavaPlugin {
|
public class Citizens extends JavaPlugin {
|
||||||
private CitizensNPCManager npcManager;
|
private CitizensNPCManager npcManager;
|
||||||
|
private CitizensCharacterManager characterManager;
|
||||||
|
private Storage saves;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDisable() {
|
public void onDisable() {
|
||||||
@ -20,7 +34,12 @@ public class Citizens extends JavaPlugin {
|
|||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
npcManager = new CitizensNPCManager();
|
npcManager = new CitizensNPCManager();
|
||||||
|
characterManager = new CitizensCharacterManager();
|
||||||
CitizensAPI.setNPCManager(npcManager);
|
CitizensAPI.setNPCManager(npcManager);
|
||||||
|
CitizensAPI.setCharacterManager(characterManager);
|
||||||
|
|
||||||
|
// TODO database support
|
||||||
|
saves = new YamlStorage(getDataFolder() + File.separator + "saves.yml");
|
||||||
|
|
||||||
// Register events
|
// Register events
|
||||||
new EventListen(this);
|
new EventListen(this);
|
||||||
@ -32,18 +51,42 @@ public class Citizens extends JavaPlugin {
|
|||||||
if (Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() {
|
if (Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
setupNPCs();
|
try {
|
||||||
|
setupNPCs();
|
||||||
|
} catch (NPCLoadException ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}, 100) == -1) {
|
}, /* TODO how long should delay be? */100) == -1) {
|
||||||
Messaging.log("Issue enabling plugin. Disabling.");
|
Messaging.log("Issue enabling plugin. Disabling.");
|
||||||
getServer().getPluginManager().disablePlugin(this);
|
getServer().getPluginManager().disablePlugin(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setupNPCs() {
|
@Override
|
||||||
// TODO set up saving
|
public boolean onCommand(CommandSender sender, Command cmd, String cmdName, String[] args) {
|
||||||
for (NPC npc : npcManager.getNPCs()) {
|
if (args[0].equals("test")) {
|
||||||
npc.spawn(((LocationTrait) npc.getTrait("location")).getLocation());
|
NPC npc = npcManager.createNPC("aPunch");
|
||||||
|
npc.spawn(((Player) sender).getLocation());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupNPCs() throws NPCLoadException {
|
||||||
|
// TODO needs fixing
|
||||||
|
for (DataKey key : saves.getKey("npc").getIntegerSubKeys()) {
|
||||||
|
int id = Integer.parseInt(key.name());
|
||||||
|
if (!key.keyExists("name"))
|
||||||
|
throw new NPCLoadException("Could not find a name for the NPC with ID '" + id + "'.");
|
||||||
|
Character character = characterManager.getCharacter(key.getString("character"));
|
||||||
|
NPC npc = npcManager.createNPC(key.getString("name"), character);
|
||||||
|
if (character != null) {
|
||||||
|
character.load(key);
|
||||||
|
}
|
||||||
|
for (Trait t : npc.getTraits()) {
|
||||||
|
t.load(key);
|
||||||
|
}
|
||||||
|
npc.spawn(npc.getTrait(LocationTrait.class).getLocation());
|
||||||
}
|
}
|
||||||
Messaging.log("Loaded " + npcManager.getNPCs().size() + " NPCs.");
|
Messaging.log("Loaded " + npcManager.getNPCs().size() + " NPCs.");
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ import net.citizensnpcs.api.CitizensAPI;
|
|||||||
import net.citizensnpcs.api.npc.NPC;
|
import net.citizensnpcs.api.npc.NPC;
|
||||||
import net.citizensnpcs.api.npc.trait.trait.LocationTrait;
|
import net.citizensnpcs.api.npc.trait.trait.LocationTrait;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
@ -57,7 +58,7 @@ public class EventListen implements Listener {
|
|||||||
public void onChunkLoad(ChunkLoadEvent event) {
|
public void onChunkLoad(ChunkLoadEvent event) {
|
||||||
for (int id : toRespawn) {
|
for (int id : toRespawn) {
|
||||||
NPC npc = CitizensAPI.getNPCManager().getNPC(id);
|
NPC npc = CitizensAPI.getNPCManager().getNPC(id);
|
||||||
npc.spawn(((LocationTrait) npc.getTrait("location")).getLocation());
|
npc.spawn(npc.getTrait(LocationTrait.class).getLocation());
|
||||||
toRespawn.remove(id);
|
toRespawn.remove(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -68,10 +69,9 @@ public class EventListen implements Listener {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
for (NPC npc : CitizensAPI.getNPCManager().getNPCs()) {
|
for (NPC npc : CitizensAPI.getNPCManager().getNPCs()) {
|
||||||
LocationTrait loc = (LocationTrait) npc.getTrait("location");
|
Location loc = npc.getTrait(LocationTrait.class).getLocation();
|
||||||
if (event.getWorld().equals(loc.getLocation().getWorld())
|
if (event.getWorld().equals(loc.getWorld()) && event.getChunk().getX() == loc.getChunk().getX()
|
||||||
&& event.getChunk().getX() == loc.getLocation().getChunk().getX()
|
&& event.getChunk().getZ() == loc.getChunk().getZ()) {
|
||||||
&& event.getChunk().getZ() == loc.getLocation().getChunk().getZ()) {
|
|
||||||
toRespawn.add(npc.getId());
|
toRespawn.add(npc.getId());
|
||||||
npc.despawn();
|
npc.despawn();
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package net.citizensnpcs.npc;
|
package net.citizensnpcs.npc;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashMap;
|
||||||
import java.util.Set;
|
import java.util.Map;
|
||||||
|
|
||||||
import net.citizensnpcs.api.CitizensAPI;
|
import net.citizensnpcs.api.CitizensAPI;
|
||||||
import net.citizensnpcs.api.event.NPCDespawnEvent;
|
import net.citizensnpcs.api.event.NPCDespawnEvent;
|
||||||
@ -12,6 +12,7 @@ import net.citizensnpcs.api.npc.pathfinding.Navigator;
|
|||||||
import net.citizensnpcs.api.npc.trait.Trait;
|
import net.citizensnpcs.api.npc.trait.Trait;
|
||||||
import net.citizensnpcs.api.npc.trait.trait.LocationTrait;
|
import net.citizensnpcs.api.npc.trait.trait.LocationTrait;
|
||||||
import net.citizensnpcs.resources.lib.CraftNPC;
|
import net.citizensnpcs.resources.lib.CraftNPC;
|
||||||
|
import net.citizensnpcs.util.Messaging;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
@ -20,22 +21,27 @@ import org.bukkit.Location;
|
|||||||
public class CitizensNPC implements NPC {
|
public class CitizensNPC implements NPC {
|
||||||
private final int id;
|
private final int id;
|
||||||
private Character character = null;
|
private Character character = null;
|
||||||
private final Set<Trait> traits = new HashSet<Trait>();
|
private final Map<Class<? extends Trait>, Trait> traits = new HashMap<Class<? extends Trait>, Trait>();
|
||||||
private String name;
|
private String name;
|
||||||
private CraftNPC mcEntity;
|
private CraftNPC mcEntity;
|
||||||
private boolean spawned;
|
private boolean spawned;
|
||||||
private final CitizensNPCManager manager;
|
private final CitizensNPCManager manager;
|
||||||
|
private final Factory factory = new Factory();
|
||||||
|
|
||||||
protected CitizensNPC(String name, Character character, Trait... traits) {
|
public CitizensNPC(String name, Character character) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.character = character;
|
this.character = character;
|
||||||
for (Trait trait : traits) {
|
|
||||||
this.traits.add(trait);
|
|
||||||
}
|
|
||||||
manager = (CitizensNPCManager) CitizensAPI.getNPCManager();
|
manager = (CitizensNPCManager) CitizensAPI.getNPCManager();
|
||||||
id = manager.getUniqueID();
|
id = manager.getUniqueID();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public CitizensNPC(int id, String name, Character character) {
|
||||||
|
this.name = name;
|
||||||
|
this.character = character;
|
||||||
|
manager = (CitizensNPCManager) CitizensAPI.getNPCManager();
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getFullName() {
|
public String getFullName() {
|
||||||
return name;
|
return name;
|
||||||
@ -52,16 +58,11 @@ public class CitizensNPC implements NPC {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addTrait(Trait trait) {
|
public void addTrait(Class<? extends Trait> trait) {
|
||||||
if (!hasTrait(trait))
|
if (!hasTrait(trait))
|
||||||
traits.add(trait);
|
traits.put(trait, factory.create(trait));
|
||||||
else
|
else
|
||||||
System.out.println("The NPC already has the trait '" + trait.getName() + "'.");
|
Messaging.debug("The NPC already has the trait '" + trait.getName() + "'.");
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addTrait(String name) {
|
|
||||||
addTrait(getTrait(name));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -81,48 +82,40 @@ public class CitizensNPC implements NPC {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Trait getTrait(String name) {
|
public <T extends Trait> T getTrait(Class<T> trait) {
|
||||||
for (Trait trait : traits) {
|
Trait t = traits.get(trait);
|
||||||
if (trait.getName().equals(name)) {
|
if (t != null) {
|
||||||
return trait;
|
return trait.cast(t);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return null;
|
|
||||||
|
T create = factory.create(trait);
|
||||||
|
addTrait(trait);
|
||||||
|
return create;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Iterable<Trait> getTraits() {
|
public Iterable<Trait> getTraits() {
|
||||||
return traits;
|
return traits.values();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasTrait(Trait trait) {
|
public boolean hasTrait(Class<? extends Trait> trait) {
|
||||||
return traits.contains(trait);
|
return traits.containsKey(trait);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasTrait(String name) {
|
public void removeTrait(Class<? extends Trait> trait) {
|
||||||
return hasTrait(getTrait(name));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void removeTrait(Trait trait) {
|
|
||||||
if (!hasTrait(trait)) {
|
if (!hasTrait(trait)) {
|
||||||
System.out.println("The NPC does not have a trait with the name of '" + trait.getName() + ".");
|
Messaging.debug("The NPC does not have a trait with the name of '" + trait.getName() + ".");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
traits.remove(trait);
|
traits.remove(trait);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void removeTrait(String name) {
|
|
||||||
removeTrait(getTrait(name));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setCharacter(Character character) {
|
public void setCharacter(Character character) {
|
||||||
if (this.character.equals(character)) {
|
if (this.character.equals(character)) {
|
||||||
System.out.println("The NPC already has the character '" + character.getName() + "'.");
|
Messaging.debug("The NPC already has the character '" + character.getName() + "'.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.character = character;
|
this.character = character;
|
||||||
@ -135,7 +128,7 @@ public class CitizensNPC implements NPC {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void spawn(Location loc) {
|
public void spawn(Location loc) {
|
||||||
if (spawned) {
|
if (isSpawned()) {
|
||||||
System.out.println("The NPC is already spawned.");
|
System.out.println("The NPC is already spawned.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -147,13 +140,13 @@ public class CitizensNPC implements NPC {
|
|||||||
}
|
}
|
||||||
|
|
||||||
spawned = true;
|
spawned = true;
|
||||||
addTrait(new LocationTrait(loc));
|
getTrait(LocationTrait.class).setLocation(loc);
|
||||||
mcEntity = manager.spawn(this, loc);
|
mcEntity = manager.spawn(this, loc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void despawn() {
|
public void despawn() {
|
||||||
if (!spawned) {
|
if (!isSpawned()) {
|
||||||
System.out.println("The NPC is already despawned.");
|
System.out.println("The NPC is already despawned.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -167,7 +160,7 @@ public class CitizensNPC implements NPC {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void remove() {
|
public void remove() {
|
||||||
if (spawned) {
|
if (isSpawned()) {
|
||||||
despawn();
|
despawn();
|
||||||
}
|
}
|
||||||
manager.remove(this);
|
manager.remove(this);
|
||||||
@ -176,4 +169,22 @@ public class CitizensNPC implements NPC {
|
|||||||
public CraftNPC getHandle() {
|
public CraftNPC getHandle() {
|
||||||
return mcEntity;
|
return mcEntity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -35,12 +35,7 @@ public class CitizensNPCManager implements NPCManager {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public NPC createNPC(String name, Character character) {
|
public NPC createNPC(String name, Character character) {
|
||||||
return createNPC(name, character);
|
CitizensNPC npc = new CitizensNPC(name, character);
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public NPC createNPC(String name, Character character, Trait... traits) {
|
|
||||||
CitizensNPC npc = new CitizensNPC(name, character, traits);
|
|
||||||
byID.put(npc.getId(), npc);
|
byID.put(npc.getId(), npc);
|
||||||
return npc;
|
return npc;
|
||||||
}
|
}
|
||||||
@ -61,23 +56,11 @@ public class CitizensNPCManager implements NPCManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<NPC> getNPCs(Trait trait) {
|
public Collection<NPC> getNPCs(Class<? extends Trait> trait) {
|
||||||
Set<NPC> npcs = new HashSet<NPC>();
|
Set<NPC> npcs = new HashSet<NPC>();
|
||||||
for (NPC npc : spawned.values()) {
|
for (NPC npc : spawned.values()) {
|
||||||
if (npc.hasTrait(trait)) {
|
if (npc.hasTrait(trait))
|
||||||
npcs.add(npc);
|
npcs.add(npc);
|
||||||
}
|
|
||||||
}
|
|
||||||
return npcs;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<NPC> getNPCs(String name) {
|
|
||||||
Set<NPC> npcs = new HashSet<NPC>();
|
|
||||||
for (NPC npc : spawned.values()) {
|
|
||||||
if (npc.hasTrait(name)) {
|
|
||||||
npcs.add(npc);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return npcs;
|
return npcs;
|
||||||
}
|
}
|
||||||
@ -112,7 +95,7 @@ public class CitizensNPCManager implements NPCManager {
|
|||||||
public void despawn(NPC npc) {
|
public void despawn(NPC npc) {
|
||||||
CraftNPC mcEntity = ((CitizensNPC) npc).getHandle();
|
CraftNPC mcEntity = ((CitizensNPC) npc).getHandle();
|
||||||
// TODO send Packet29DestroyEntity
|
// TODO send Packet29DestroyEntity
|
||||||
getWorldServer(((LocationTrait) npc.getTrait("location")).getLocation().getWorld()).removeEntity(mcEntity);
|
getWorldServer(npc.getTrait(LocationTrait.class).getLocation().getWorld()).removeEntity(mcEntity);
|
||||||
spawned.remove(mcEntity.getPlayer());
|
spawned.remove(mcEntity.getPlayer());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
41
src/net/citizensnpcs/npc/trait/CitizensCharacterManager.java
Normal file
41
src/net/citizensnpcs/npc/trait/CitizensCharacterManager.java
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package net.citizensnpcs.npc.trait;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import net.citizensnpcs.api.npc.trait.Character;
|
||||||
|
import net.citizensnpcs.api.npc.trait.CharacterManager;
|
||||||
|
|
||||||
|
public class CitizensCharacterManager implements CharacterManager {
|
||||||
|
private final Map<String, Class<? extends Character>> registered = new HashMap<String, Class<? extends Character>>();
|
||||||
|
private final Set<Character> characters = new HashSet<Character>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Character getCharacter(String name) {
|
||||||
|
if (registered.get(name) == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
for (Character character : characters) {
|
||||||
|
if (character.getName().equals(name)) {
|
||||||
|
return character;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void registerCharacter(Class<? extends Character> character) {
|
||||||
|
if (registered.containsValue(character)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Character register = character.newInstance();
|
||||||
|
registered.put(register.getName(), character);
|
||||||
|
characters.add(register);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user