diff --git a/src/main/java/net/citizensnpcs/trait/Controllable.java b/src/main/java/net/citizensnpcs/trait/Controllable.java index ffb057bae..4a417a406 100644 --- a/src/main/java/net/citizensnpcs/trait/Controllable.java +++ b/src/main/java/net/citizensnpcs/trait/Controllable.java @@ -34,6 +34,18 @@ public class Controllable extends Trait implements Toggleable, CommandConfigurab super("controllable"); } + @Override + public void configure(CommandContext args) { + if (args.hasFlag('f')) + explicitType = EntityType.BLAZE; + else if (args.hasFlag('n')) + explicitType = null; + else if (args.hasValueFlag("explicittype")) + explicitType = Util.matchEntityType(args.getFlag("explicittype")); + if (npc.isSpawned()) + loadController(); + } + private void enterOrLeaveVehicle(Player player) { EntityPlayer handle = ((CraftPlayer) player).getHandle(); if (getHandle().passenger != null) { @@ -58,6 +70,34 @@ public class Controllable extends Trait implements Toggleable, CommandConfigurab explicitType = Util.matchEntityType(key.getString("explicittype")); } + private void loadController() { + EntityType type = npc.getBukkitEntity().getType(); + if (explicitType != null) + type = explicitType; + Class clazz = controllerTypes.get(type); + if (clazz == null) { + controller = new GroundController(); + return; + } + Constructor innerConstructor = null; + try { + innerConstructor = clazz.getConstructor(Controllable.class); + innerConstructor.setAccessible(true); + } catch (Exception e) { + e.printStackTrace(); + } + + try { + if (innerConstructor == null) { + controller = clazz.newInstance(); + } else + controller = innerConstructor.newInstance(this); + } catch (Exception e) { + e.printStackTrace(); + controller = new GroundController(); + } + } + public boolean mount(Player toMount) { if (npc.getBukkitEntity().getPassenger() != null) return false; @@ -99,34 +139,6 @@ public class Controllable extends Trait implements Toggleable, CommandConfigurab loadController(); } - private void loadController() { - EntityType type = npc.getBukkitEntity().getType(); - if (explicitType != null) - type = explicitType; - Class clazz = controllerTypes.get(type); - if (clazz == null) { - controller = new GroundController(); - return; - } - Constructor innerConstructor = null; - try { - innerConstructor = clazz.getConstructor(Controllable.class); - innerConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - - try { - if (innerConstructor == null) { - controller = clazz.newInstance(); - } else - controller = innerConstructor.newInstance(this); - } catch (Exception e) { - e.printStackTrace(); - controller = new GroundController(); - } - } - @Override public void run() { if (!enabled || !npc.isSpawned() || getHandle().passenger == null) @@ -236,16 +248,4 @@ public class Controllable extends Trait implements Toggleable, CommandConfigurab controllerTypes.put(EntityType.ENDER_DRAGON, AirController.class); controllerTypes.put(EntityType.GHAST, AirController.class); } - - @Override - public void configure(CommandContext args) { - if (args.hasFlag('f')) - explicitType = EntityType.BLAZE; - else if (args.hasFlag('n')) - explicitType = null; - else if (args.hasValueFlag("explicittype")) - explicitType = Util.matchEntityType(args.getFlag("explicittype")); - if (npc.isSpawned()) - loadController(); - } } diff --git a/src/main/java/net/citizensnpcs/trait/waypoint/DelayWaypointTrigger.java b/src/main/java/net/citizensnpcs/trait/waypoint/DelayWaypointTrigger.java new file mode 100644 index 000000000..ac063492e --- /dev/null +++ b/src/main/java/net/citizensnpcs/trait/waypoint/DelayWaypointTrigger.java @@ -0,0 +1,33 @@ +package net.citizensnpcs.trait.waypoint; + +import net.citizensnpcs.api.CitizensAPI; +import net.citizensnpcs.api.npc.NPC; +import net.citizensnpcs.api.persistence.Persist; + +import org.bukkit.Bukkit; +import org.bukkit.Location; + +public class DelayWaypointTrigger implements WaypointTrigger { + @Persist + private int delay = 0; + + @Override + public void onWaypointReached(NPC npc, Location waypoint) { + if (delay > 0) + scheduleTask(npc.getTrait(Waypoints.class).getCurrentProvider()); + } + + private void scheduleTask(final WaypointProvider provider) { + provider.setPaused(true); + Bukkit.getScheduler().scheduleSyncDelayedTask(CitizensAPI.getPlugin(), new Runnable() { + @Override + public void run() { + provider.setPaused(false); + } + }, delay); + } + + public void setDelay(int newDelay) { + delay = newDelay; + } +} diff --git a/src/main/java/net/citizensnpcs/trait/waypoint/LinearWaypointProvider.java b/src/main/java/net/citizensnpcs/trait/waypoint/LinearWaypointProvider.java index fb8a0274e..5d195052f 100644 --- a/src/main/java/net/citizensnpcs/trait/waypoint/LinearWaypointProvider.java +++ b/src/main/java/net/citizensnpcs/trait/waypoint/LinearWaypointProvider.java @@ -4,8 +4,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import javax.annotation.Nullable; - import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.ai.Goal; import net.citizensnpcs.api.ai.GoalSelector; @@ -36,8 +34,6 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerItemHeldEvent; import org.bukkit.metadata.FixedMetadataValue; -import com.google.common.base.Function; -import com.google.common.collect.Iterators; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -280,14 +276,14 @@ public class LinearWaypointProvider implements WaypointProvider { } private class LinearWaypointGoal implements Goal { - private Location currentDestination; - private Iterator itr; + private Waypoint currentDestination; + private Iterator itr; private boolean paused; private GoalSelector selector; private void ensureItr() { if (itr == null || !itr.hasNext()) - itr = Iterators.transform(waypoints.iterator(), WAYPOINT_TRANSFORMER); + itr = waypoints.iterator(); } private Navigator getNavigator() { @@ -303,10 +299,12 @@ public class LinearWaypointProvider implements WaypointProvider { if (selector == null || !event.getNavigator().equals(getNavigator())) return; selector.finish(); + if (event.getNavigator().getTargetAsLocation().equals(currentDestination.getLocation())) + currentDestination.onReach(npc); } public void onProviderChanged() { - itr = Iterators.transform(waypoints.iterator(), WAYPOINT_TRANSFORMER); + itr = waypoints.iterator(); if (currentDestination != null) selector.finish(); } @@ -336,7 +334,7 @@ public class LinearWaypointProvider implements WaypointProvider { return false; } if (waypoints.size() == 1) { - // avoid pathing to the same point and wasting memory. + // avoid pathing to the same point repeatedly Location dest = npc.getBukkitEntity().getLocation(); if (waypoints.get(0).getLocation().distanceSquared(dest) < 3) return false; @@ -346,16 +344,9 @@ public class LinearWaypointProvider implements WaypointProvider { if (shouldExecute) { this.selector = selector; currentDestination = itr.next(); - getNavigator().setTarget(currentDestination); + getNavigator().setTarget(currentDestination.getLocation()); } return shouldExecute; } } - - private static final Function WAYPOINT_TRANSFORMER = new Function() { - @Override - public Location apply(@Nullable Waypoint input) { - return input == null ? null : input.getLocation(); - } - }; } \ No newline at end of file diff --git a/src/main/java/net/citizensnpcs/trait/waypoint/TeleportWaypointTrigger.java b/src/main/java/net/citizensnpcs/trait/waypoint/TeleportWaypointTrigger.java new file mode 100644 index 000000000..36dea9d02 --- /dev/null +++ b/src/main/java/net/citizensnpcs/trait/waypoint/TeleportWaypointTrigger.java @@ -0,0 +1,17 @@ +package net.citizensnpcs.trait.waypoint; + +import net.citizensnpcs.api.npc.NPC; +import net.citizensnpcs.api.persistence.Persist; + +import org.bukkit.Location; + +public class TeleportWaypointTrigger implements WaypointTrigger { + @Persist + private Location location; + + @Override + public void onWaypointReached(NPC npc, Location waypoint) { + if (location != null) + npc.getBukkitEntity().teleport(waypoint); + } +} diff --git a/src/main/java/net/citizensnpcs/trait/waypoint/Waypoint.java b/src/main/java/net/citizensnpcs/trait/waypoint/Waypoint.java index 5857cd052..fb45009f9 100644 --- a/src/main/java/net/citizensnpcs/trait/waypoint/Waypoint.java +++ b/src/main/java/net/citizensnpcs/trait/waypoint/Waypoint.java @@ -2,6 +2,7 @@ package net.citizensnpcs.trait.waypoint; import java.util.List; +import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.persistence.Persist; import net.citizensnpcs.api.persistence.PersistenceLoader; @@ -24,7 +25,12 @@ public class Waypoint { return location; } + public void onReach(NPC npc) { + for (WaypointTrigger trigger : triggers) + trigger.onWaypointReached(npc, location); + } + static { - PersistenceLoader.registerPersistDelegate(WaypointTrigger.class, WaypointTriggerPersister.class); + PersistenceLoader.registerPersistDelegate(WaypointTrigger.class, WaypointTriggerRegistry.class); } } \ No newline at end of file diff --git a/src/main/java/net/citizensnpcs/trait/waypoint/WaypointTriggerPersister.java b/src/main/java/net/citizensnpcs/trait/waypoint/WaypointTriggerPersister.java deleted file mode 100644 index 20f2732a4..000000000 --- a/src/main/java/net/citizensnpcs/trait/waypoint/WaypointTriggerPersister.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.citizensnpcs.trait.waypoint; - -import net.citizensnpcs.api.persistence.Persister; -import net.citizensnpcs.api.util.DataKey; - -public class WaypointTriggerPersister implements Persister { - @Override - public Object create(DataKey root) { - // TODO Auto-generated method stub - return null; - } - - @Override - public void save(Object instance, DataKey root) { - // TODO Auto-generated method stub - } -} diff --git a/src/main/java/net/citizensnpcs/trait/waypoint/WaypointTriggerRegistry.java b/src/main/java/net/citizensnpcs/trait/waypoint/WaypointTriggerRegistry.java new file mode 100644 index 000000000..f87fe6aba --- /dev/null +++ b/src/main/java/net/citizensnpcs/trait/waypoint/WaypointTriggerRegistry.java @@ -0,0 +1,29 @@ +package net.citizensnpcs.trait.waypoint; + +import java.util.Map; + +import net.citizensnpcs.api.persistence.PersistenceLoader; +import net.citizensnpcs.api.persistence.Persister; +import net.citizensnpcs.api.util.DataKey; + +import com.google.common.collect.Maps; + +public class WaypointTriggerRegistry implements Persister { + @Override + public Object create(DataKey root) { + String type = root.getString("type"); + Class clazz = triggers.get(type); + return clazz == null ? null : PersistenceLoader.load(clazz, root); + } + + @Override + public void save(Object instance, DataKey root) { + PersistenceLoader.save(instance, root); + } + + private static final Map> triggers = Maps.newHashMap(); + static { + triggers.put("teleport", TeleportWaypointTrigger.class); + triggers.put("delay", DelayWaypointTrigger.class); + } +}