diff --git a/lib/CitizensAPI.jar b/lib/CitizensAPI.jar index 62b719747..36e99a431 100644 Binary files a/lib/CitizensAPI.jar and b/lib/CitizensAPI.jar differ diff --git a/lib/bukkit-1.2.3-R0.2-SNAPSHOT.jar b/lib/bukkit-1.2.3-R0.2-SNAPSHOT.jar index c810f7dd9..b918b7532 100644 Binary files a/lib/bukkit-1.2.3-R0.2-SNAPSHOT.jar and b/lib/bukkit-1.2.3-R0.2-SNAPSHOT.jar differ diff --git a/src/main/java/net/citizensnpcs/Citizens.java b/src/main/java/net/citizensnpcs/Citizens.java index baa4ed738..1a1f33208 100644 --- a/src/main/java/net/citizensnpcs/Citizens.java +++ b/src/main/java/net/citizensnpcs/Citizens.java @@ -28,6 +28,7 @@ import net.citizensnpcs.command.exception.UnhandledCommandException; import net.citizensnpcs.command.exception.WrappedCommandException; import net.citizensnpcs.editor.Editor; import net.citizensnpcs.npc.CitizensCharacterManager; +import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.CitizensNPCManager; import net.citizensnpcs.npc.CitizensTraitManager; import net.citizensnpcs.util.Messaging; @@ -242,7 +243,7 @@ public class Citizens extends JavaPlugin { public void save() { config.save(); for (NPC npc : npcManager) - npc.save(saves.getKey("npc." + npc.getId())); + ((CitizensNPC) npc).save(saves.getKey("npc." + npc.getId())); saves.save(); } @@ -256,7 +257,7 @@ public class Citizens extends JavaPlugin { NPC npc = npcManager.createNPC(EntityType.valueOf(key.getString("traits.type").toUpperCase()), id, key .getString("name"), null); try { - npc.load(key); + ((CitizensNPC) npc).load(key); } catch (NPCException ex) { Messaging.log(ex.getMessage()); } diff --git a/src/main/java/net/citizensnpcs/NPCUpdater.java b/src/main/java/net/citizensnpcs/NPCUpdater.java index b3cbf6c4c..2098b236a 100644 --- a/src/main/java/net/citizensnpcs/NPCUpdater.java +++ b/src/main/java/net/citizensnpcs/NPCUpdater.java @@ -1,6 +1,7 @@ package net.citizensnpcs; import net.citizensnpcs.api.npc.NPC; +import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.CitizensNPCManager; public class NPCUpdater implements Runnable { @@ -15,7 +16,7 @@ public class NPCUpdater implements Runnable { for (NPC npc : npcManager) { if (!npc.isSpawned()) continue; - npc.update(); + ((CitizensNPC) npc).update(); } } } \ No newline at end of file diff --git a/src/main/java/net/citizensnpcs/npc/CitizensNPC.java b/src/main/java/net/citizensnpcs/npc/CitizensNPC.java index d6da11827..4933e9cbb 100644 --- a/src/main/java/net/citizensnpcs/npc/CitizensNPC.java +++ b/src/main/java/net/citizensnpcs/npc/CitizensNPC.java @@ -1,11 +1,18 @@ package net.citizensnpcs.npc; +import java.util.logging.Level; + import net.citizensnpcs.Settings.Setting; +import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.event.NPCDespawnEvent; import net.citizensnpcs.api.event.NPCSpawnEvent; +import net.citizensnpcs.api.exception.NPCLoadException; import net.citizensnpcs.api.npc.AbstractNPC; +import net.citizensnpcs.api.npc.character.Character; +import net.citizensnpcs.api.trait.Trait; import net.citizensnpcs.api.trait.trait.SpawnLocation; import net.citizensnpcs.api.trait.trait.Spawned; +import net.citizensnpcs.api.util.DataKey; import net.citizensnpcs.npc.ai.CitizensAI; import net.citizensnpcs.util.Messaging; import net.citizensnpcs.util.StringHelper; @@ -116,9 +123,55 @@ public abstract class CitizensNPC extends AbstractNPC { return true; } - @Override public void update() { super.update(); ai.update(); } + + public void load(DataKey root) throws NPCLoadException { + Character character = CitizensAPI.getCharacterManager().getCharacter(root.getString("character")); + + // Load the character if it exists + if (character != null) { + character.load(root.getRelative("characters." + character.getName())); + setCharacter(character); + } + + // Load traits + for (DataKey traitKey : root.getRelative("traits").getSubKeys()) { + Trait trait = CitizensAPI.getTraitManager().getTrait(traitKey.name(), this); + if (trait == null) + throw new NPCLoadException("No trait with the name '" + traitKey.name() + + "' exists. Was it registered properly?"); + try { + trait.load(traitKey); + } catch (Exception ex) { + Bukkit.getLogger().log( + Level.SEVERE, + "[Citizens] The trait '" + traitKey.name() + + "' failed to load properly for the NPC with the ID '" + getId() + "'. " + + ex.getMessage()); + ex.printStackTrace(); + } + addTrait(trait); + } + + // Spawn the NPC + if (getTrait(Spawned.class).shouldSpawn()) + spawn(getTrait(SpawnLocation.class).getLocation()); + } + + public void save(DataKey root) { + root.setString("name", getFullName()); + + // Save the character if it exists + if (getCharacter() != null) { + root.setString("character", getCharacter().getName()); + getCharacter().save(root.getRelative("characters." + getCharacter().getName())); + } + + // Save all existing traits + for (Trait trait : getTraits()) + trait.save(root.getRelative("traits." + trait.getName())); + } } \ No newline at end of file