From 3d0e765367f067510d65320637472e7fd67574d8 Mon Sep 17 00:00:00 2001 From: fullwall Date: Thu, 23 Feb 2012 18:10:38 +0800 Subject: [PATCH] Changes to waypoints --- src/net/citizensnpcs/Citizens.java | 17 +-- .../command/command/NPCCommands.java | 106 +++++------------- .../trait/waypoint/WaypointProvider.java | 6 +- .../trait/waypoint/Waypoints.java | 28 +++++ 4 files changed, 65 insertions(+), 92 deletions(-) diff --git a/src/net/citizensnpcs/Citizens.java b/src/net/citizensnpcs/Citizens.java index 9eb859ba3..a755b1628 100644 --- a/src/net/citizensnpcs/Citizens.java +++ b/src/net/citizensnpcs/Citizens.java @@ -3,7 +3,6 @@ package net.citizensnpcs; import java.io.File; import java.io.IOException; import java.sql.SQLException; -import java.util.List; import java.util.logging.Level; import net.citizensnpcs.Settings.Setting; @@ -13,6 +12,7 @@ import net.citizensnpcs.api.exception.NPCLoadException; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.npc.trait.Character; import net.citizensnpcs.api.npc.trait.DefaultInstanceFactory; +import net.citizensnpcs.api.npc.trait.InstanceFactory; import net.citizensnpcs.api.npc.trait.Trait; import net.citizensnpcs.api.npc.trait.trait.Inventory; import net.citizensnpcs.api.npc.trait.trait.Owner; @@ -49,18 +49,14 @@ import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; import com.google.common.collect.Iterators; -import com.google.common.collect.Lists; public class Citizens extends JavaPlugin { private static final String COMPATIBLE_MC_VERSION = "1.1"; - @SuppressWarnings("unchecked") - private static final List> defaultTraits = Lists.newArrayList(Owner.class, Spawned.class, - LookClose.class, SpawnLocation.class, Inventory.class); - private volatile CitizensNPCManager npcManager; - private final DefaultInstanceFactory characterManager = new DefaultInstanceFactory(); - private final DefaultInstanceFactory traitManager = new DefaultInstanceFactory(); + private final InstanceFactory characterManager = new DefaultInstanceFactory(); + private final InstanceFactory traitManager = DefaultInstanceFactory.create(Owner.class, Spawned.class, + LookClose.class, SpawnLocation.class, Inventory.class); private final CommandManager commands = new CommandManager(); private Settings config; private Storage saves; @@ -187,9 +183,6 @@ public class Citizens extends JavaPlugin { // Register commands registerCommands(); - // Register default traits - traitManager.registerAll(defaultTraits); - Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new NPCUpdater(npcManager), 0, 1); Messaging.log("v" + getDescription().getVersion() + " enabled."); @@ -239,7 +232,7 @@ public class Citizens extends JavaPlugin { return npcManager; } - public DefaultInstanceFactory getCharacterManager() { + public InstanceFactory getCharacterManager() { return characterManager; } diff --git a/src/net/citizensnpcs/command/command/NPCCommands.java b/src/net/citizensnpcs/command/command/NPCCommands.java index 68000c172..e39df9c4c 100644 --- a/src/net/citizensnpcs/command/command/NPCCommands.java +++ b/src/net/citizensnpcs/command/command/NPCCommands.java @@ -4,7 +4,7 @@ import net.citizensnpcs.Citizens; import net.citizensnpcs.Settings.Setting; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.npc.trait.Character; -import net.citizensnpcs.api.npc.trait.DefaultInstanceFactory; +import net.citizensnpcs.api.npc.trait.InstanceFactory; import net.citizensnpcs.api.npc.trait.trait.MobType; import net.citizensnpcs.api.npc.trait.trait.Owner; import net.citizensnpcs.api.npc.trait.trait.SpawnLocation; @@ -25,7 +25,7 @@ import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; @Requirements(selected = true, ownership = true) public class NPCCommands { private final CitizensNPCManager npcManager; - private final DefaultInstanceFactory characterManager; + private final InstanceFactory characterManager; public NPCCommands(Citizens plugin) { npcManager = plugin.getNPCManager(); @@ -41,14 +41,8 @@ public class NPCCommands { Messaging.send(player, " Type: " + npc.getTrait(MobType.class).getType()); } - @Command( - aliases = { "npc" }, - usage = "create [name] --type (type) --char (character)", - desc = "Create a new NPC", - modifiers = { "create" }, - min = 2, - max = 5, - permission = "npc.create") + @Command(aliases = { "npc" }, usage = "create [name] --type (type) --char (character)", desc = "Create a new NPC", + modifiers = { "create" }, min = 2, max = 5, permission = "npc.create") @Requirements public void createNPC(CommandContext args, Player player, NPC npc) { String name = args.getString(1); @@ -70,8 +64,9 @@ public class NPCCommands { if (args.hasValueFlag("char")) { String character = args.getFlag("char").toLowerCase(); if (characterManager.getInstance(character, create) == null) { - Messaging.sendError(player, "The character '" + args.getFlag("char") + "' does not exist. " - + create.getName() + " was created at your location without a character."); + Messaging.sendError(player, + "The character '" + args.getFlag("char") + "' does not exist. " + create.getName() + + " was created at your location without a character."); success = false; } else { create.setCharacter(characterManager.getInstance(character, create)); @@ -92,27 +87,16 @@ public class NPCCommands { Messaging.send(player, successMsg); } - @Command( - aliases = { "npc" }, - usage = "despawn", - desc = "Despawn an NPC", - modifiers = { "despawn" }, - min = 1, - max = 1, - permission = "npc.despawn") + @Command(aliases = { "npc" }, usage = "despawn", desc = "Despawn an NPC", modifiers = { "despawn" }, min = 1, + max = 1, permission = "npc.despawn") public void despawnNPC(CommandContext args, Player player, NPC npc) { npc.getTrait(Spawned.class).setSpawned(false); npc.despawn(); Messaging.send(player, ChatColor.GREEN + "You despawned " + StringHelper.wrap(npc.getName()) + "."); } - @Command( - aliases = { "npc" }, - usage = "remove (all)", - desc = "Remove an NPC", - modifiers = { "remove" }, - min = 1, - max = 2) + @Command(aliases = { "npc" }, usage = "remove (all)", desc = "Remove an NPC", modifiers = { "remove" }, min = 1, + max = 2) @Requirements public void removeNPC(CommandContext args, Player player, NPC npc) { if (args.argsLength() == 2) { @@ -140,14 +124,8 @@ public class NPCCommands { Messaging.send(player, "You permanently removed " + StringHelper.wrap(npc.getName()) + "."); } - @Command( - aliases = { "npc" }, - usage = "rename [name]", - desc = "Rename an NPC", - modifiers = { "rename" }, - min = 2, - max = 2, - permission = "npc.rename") + @Command(aliases = { "npc" }, usage = "rename [name]", desc = "Rename an NPC", modifiers = { "rename" }, min = 2, + max = 2, permission = "npc.rename") public void renameNPC(CommandContext args, Player player, NPC npc) { String oldName = npc.getName(); String newName = args.getString(1); @@ -156,18 +134,13 @@ public class NPCCommands { newName = newName.substring(0, 15); } npc.setName(newName); - Messaging.send(player, ChatColor.GREEN + "You renamed " + StringHelper.wrap(oldName) + " to " - + StringHelper.wrap(newName) + "."); + Messaging.send(player, + ChatColor.GREEN + "You renamed " + StringHelper.wrap(oldName) + " to " + StringHelper.wrap(newName) + + "."); } - @Command( - aliases = { "npc" }, - usage = "select [id]", - desc = "Selects an NPC with the given ID", - modifiers = { "select" }, - min = 2, - max = 2, - permission = "npc.select") + @Command(aliases = { "npc" }, usage = "select [id]", desc = "Selects an NPC with the given ID", + modifiers = { "select" }, min = 2, max = 2, permission = "npc.select") @Requirements(ownership = true) public void selectNPC(CommandContext args, Player player, NPC npc) { NPC toSelect = npcManager.getNPC(args.getInteger(1)); @@ -183,13 +156,8 @@ public class NPCCommands { Messaging.sendWithNPC(player, Setting.SELECTION_MESSAGE.asString(), toSelect); } - @Command( - aliases = { "npc" }, - usage = "character [character]", - desc = "Sets the character of an NPC", - modifiers = { "character" }, - min = 2, - max = 2) + @Command(aliases = { "npc" }, usage = "character [character]", desc = "Sets the character of an NPC", + modifiers = { "character" }, min = 2, max = 2) public void setNPCCharacter(CommandContext args, Player player, NPC npc) { String name = args.getString(1).toLowerCase(); Character character = characterManager.getInstance(name, npc); @@ -206,19 +174,13 @@ public class NPCCommands { Messaging.sendError(player, "You don't have permission to execute that command."); return; } - Messaging.send(player, StringHelper.wrap(npc.getName() + "'s") + " character is now '" - + StringHelper.wrap(name) + "'."); + Messaging.send(player, + StringHelper.wrap(npc.getName() + "'s") + " character is now '" + StringHelper.wrap(name) + "'."); npc.setCharacter(character); } - @Command( - aliases = { "npc" }, - usage = "spawn [id]", - desc = "Spawn an existing NPC", - modifiers = { "spawn" }, - min = 2, - max = 2, - permission = "npc.spawn") + @Command(aliases = { "npc" }, usage = "spawn [id]", desc = "Spawn an existing NPC", modifiers = { "spawn" }, + min = 2, max = 2, permission = "npc.spawn") @Requirements public void spawnNPC(CommandContext args, Player player, NPC npc) { NPC respawn = npcManager.getNPC(args.getInteger(1)); @@ -242,14 +204,8 @@ public class NPCCommands { } } - @Command( - aliases = { "npc" }, - usage = "tphere", - desc = "Teleport an NPC to your location", - modifiers = { "tphere" }, - min = 1, - max = 1, - permission = "npc.tphere") + @Command(aliases = { "npc" }, usage = "tphere", desc = "Teleport an NPC to your location", + modifiers = { "tphere" }, min = 1, max = 1, permission = "npc.tphere") public void teleportNPCToPlayer(CommandContext args, Player player, NPC npc) { // Spawn the NPC if it isn't spawned to prevent NPEs if (!npc.isSpawned()) @@ -259,14 +215,8 @@ public class NPCCommands { Messaging.send(player, StringHelper.wrap(npc.getName()) + " was teleported to your location."); } - @Command( - aliases = { "npc" }, - usage = "tp", - desc = "Teleport to an NPC", - modifiers = { "tp", "teleport" }, - min = 1, - max = 1, - permission = "npc.tp") + @Command(aliases = { "npc" }, usage = "tp", desc = "Teleport to an NPC", modifiers = { "tp", "teleport" }, min = 1, + max = 1, permission = "npc.tp") public void teleportToNPC(CommandContext args, Player player, NPC npc) { // Spawn the NPC if it isn't spawned to prevent NPEs if (!npc.isSpawned()) diff --git a/src/net/citizensnpcs/trait/waypoint/WaypointProvider.java b/src/net/citizensnpcs/trait/waypoint/WaypointProvider.java index e4d86a7ee..b8a0dfae4 100644 --- a/src/net/citizensnpcs/trait/waypoint/WaypointProvider.java +++ b/src/net/citizensnpcs/trait/waypoint/WaypointProvider.java @@ -1,15 +1,17 @@ package net.citizensnpcs.trait.waypoint; import net.citizensnpcs.api.npc.ai.NavigationCallback; +import net.citizensnpcs.api.util.DataKey; import net.citizensnpcs.editor.Editor; import org.bukkit.entity.Player; public interface WaypointProvider { - public Editor createEditor(Player player); - public void addWaypoint(Waypoint waypoint); + public void load(DataKey key); + + public void save(DataKey key); public NavigationCallback getCallback(); } \ No newline at end of file diff --git a/src/net/citizensnpcs/trait/waypoint/Waypoints.java b/src/net/citizensnpcs/trait/waypoint/Waypoints.java index 0fdd1e1f6..cdc7a9e7c 100644 --- a/src/net/citizensnpcs/trait/waypoint/Waypoints.java +++ b/src/net/citizensnpcs/trait/waypoint/Waypoints.java @@ -2,13 +2,19 @@ package net.citizensnpcs.trait.waypoint; import net.citizensnpcs.api.exception.NPCLoadException; import net.citizensnpcs.api.npc.NPC; +import net.citizensnpcs.api.npc.trait.DefaultInstanceFactory; +import net.citizensnpcs.api.npc.trait.InstanceFactory; import net.citizensnpcs.api.npc.trait.SaveId; import net.citizensnpcs.api.npc.trait.Trait; import net.citizensnpcs.api.util.DataKey; +import net.citizensnpcs.editor.Editor; + +import org.bukkit.entity.Player; @SaveId("waypoints") public class Waypoints extends Trait { private final NPC npc; + private String providerName; private WaypointProvider provider; public Waypoints(NPC npc) { @@ -17,9 +23,31 @@ public class Waypoints extends Trait { @Override public void load(DataKey key) throws NPCLoadException { + if (provider == null) { + providerName = key.getString("provider", "linear"); + provider = providers.getInstance(providerName); + if (provider == null) + return; + } + provider.load(key); + npc.getAI().registerNavigationCallback(provider.getCallback()); } @Override public void save(DataKey key) { + if (provider == null) + return; + provider.save(key); + key.setString("provider", providerName); } + + public Editor getEditor(Player player) { + return provider.createEditor(player); + } + + public void registerWaypointProvider(Class clazz, String name) { + providers.register(clazz, name); + } + + private static final InstanceFactory providers = DefaultInstanceFactory.create(); } \ No newline at end of file