Citizens2/src/main/java/net/citizensnpcs/trait/waypoint/LinearWaypointProvider.java

95 lines
3.5 KiB
Java
Raw Normal View History

2012-02-27 12:16:01 +01:00
package net.citizensnpcs.trait.waypoint;
2012-03-02 11:36:54 +01:00
import java.util.Iterator;
2012-02-27 12:16:01 +01:00
import java.util.List;
import net.citizensnpcs.api.ai.NavigationCallback;
import net.citizensnpcs.api.util.DataKey;
import net.citizensnpcs.editor.Editor;
2012-02-28 13:11:25 +01:00
import net.citizensnpcs.util.Messaging;
2012-02-27 12:16:01 +01:00
2012-03-08 19:01:12 +01:00
import org.bukkit.Bukkit;
2012-02-27 12:16:01 +01:00
import org.bukkit.ChatColor;
2012-03-02 12:39:47 +01:00
import org.bukkit.Location;
2012-02-27 12:16:01 +01:00
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import com.google.common.collect.Lists;
2012-03-02 11:36:54 +01:00
public class LinearWaypointProvider implements WaypointProvider, Iterable<Waypoint> {
private final GenericWaypointCallback callback = new GenericWaypointCallback(this);
2012-02-27 12:16:01 +01:00
private final List<Waypoint> waypoints = Lists.newArrayList();
@Override
public Editor createEditor(final Player player) {
return new Editor() {
2012-02-27 12:16:01 +01:00
@Override
public void begin() {
2012-02-28 13:11:25 +01:00
player.sendMessage(ChatColor.AQUA + "Entered the linear waypoint editor!");
2012-03-02 12:39:47 +01:00
Messaging.send(player, "<e>Left click<a> to add a waypoint, <e>right click<a> to remove.");
2012-02-27 12:16:01 +01:00
}
@Override
public void end() {
2012-03-02 12:39:47 +01:00
player.sendMessage(ChatColor.AQUA + "Exited the linear waypoint editor.");
2012-03-02 11:36:54 +01:00
callback.onProviderChanged();
2012-02-27 12:16:01 +01:00
}
@EventHandler
@SuppressWarnings("unused")
public void onPlayerInteract(PlayerInteractEvent event) {
2012-02-28 08:39:00 +01:00
if (!event.getPlayer().equals(player))
return;
2012-02-27 12:16:01 +01:00
if (event.getAction() == Action.LEFT_CLICK_BLOCK) {
2012-03-02 12:39:47 +01:00
Location at = event.getClickedBlock().getLocation();
waypoints.add(new Waypoint(at));
Messaging.send(player, String.format("<e>Added<a> a waypoint at (<e>%d<a>, <e>%d<a>, <e>%d<a>).",
at.getBlockX(), at.getBlockY(), at.getBlockZ()));
2012-02-27 12:16:01 +01:00
} else if (waypoints.size() > 0) {
waypoints.remove(waypoints.size() - 1);
Messaging.send(player, String.format("<e>Removed<a> a waypoint (<e>%d<a> remaining)", waypoints
.size()));
2012-02-27 12:16:01 +01:00
}
}
};
}
2012-03-02 11:36:54 +01:00
@Override
public NavigationCallback getCallback() {
return callback;
}
@Override
public Iterator<Waypoint> iterator() {
return waypoints.iterator();
}
2012-02-27 12:16:01 +01:00
@Override
public void load(DataKey key) {
for (DataKey root : key.getRelative("waypoints").getIntegerSubKeys()) {
2012-03-08 19:01:12 +01:00
root = root.getRelative("location");
waypoints.add(new Waypoint(new Location(Bukkit.getWorld(root.getString("world")), root.getDouble("x"), root
.getDouble("y"), root.getDouble("z"), (float) root.getDouble("yaw", 0), (float) root.getDouble(
"pitch", 0))));
2012-02-27 12:16:01 +01:00
}
2012-03-02 12:39:47 +01:00
callback.onProviderChanged();
2012-02-27 12:16:01 +01:00
}
@Override
public void save(DataKey key) {
key = key.getRelative("waypoints");
for (int i = 0; i < waypoints.size(); ++i) {
2012-03-08 19:01:12 +01:00
Location location = waypoints.get(i).getLocation();
key = key.getRelative(Integer.toString(i) + ".location");
key.setString("world", location.getWorld().getName());
key.setDouble("x", location.getX());
key.setDouble("y", location.getY());
key.setDouble("z", location.getZ());
key.setDouble("yaw", location.getYaw());
key.setDouble("pitch", location.getPitch());
2012-02-27 12:16:01 +01:00
}
}
2012-03-08 19:01:12 +01:00
}