Changes to waypoints

This commit is contained in:
fullwall 2012-02-23 18:10:38 +08:00
parent 4ebdbdd33f
commit 3a1ad07033
4 changed files with 65 additions and 92 deletions

View File

@ -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<Class<? extends Trait>> defaultTraits = Lists.newArrayList(Owner.class, Spawned.class,
LookClose.class, SpawnLocation.class, Inventory.class);
private volatile CitizensNPCManager npcManager;
private final DefaultInstanceFactory<Character> characterManager = new DefaultInstanceFactory<Character>();
private final DefaultInstanceFactory<Trait> traitManager = new DefaultInstanceFactory<Trait>();
private final InstanceFactory<Character> characterManager = new DefaultInstanceFactory<Character>();
private final InstanceFactory<Trait> 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<Character> getCharacterManager() {
public InstanceFactory<Character> getCharacterManager() {
return characterManager;
}

View File

@ -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<Character> characterManager;
private final InstanceFactory<Character> characterManager;
public NPCCommands(Citizens plugin) {
npcManager = plugin.getNPCManager();
@ -41,14 +41,8 @@ public class NPCCommands {
Messaging.send(player, " <a>Type: <e>" + 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, "<a>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())

View File

@ -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();
}

View File

@ -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<? extends WaypointProvider> clazz, String name) {
providers.register(clazz, name);
}
private static final InstanceFactory<WaypointProvider> providers = DefaultInstanceFactory.create();
}