diff --git a/src/com/massivecraft/massivecore/MassiveCore.java b/src/com/massivecraft/massivecore/MassiveCore.java index 1219a9c7..efb5b826 100644 --- a/src/com/massivecraft/massivecore/MassiveCore.java +++ b/src/com/massivecraft/massivecore/MassiveCore.java @@ -180,6 +180,7 @@ public class MassiveCore extends MassivePlugin EngineTeleportMixinCause.get().activate(); MassiveCoreEngineWorldNameSet.get().activate(); MassiveCoreEngineCommandRegistration.get().activate(); + MassiveCoreEngineDestination.get().activate(); PlayerUtil.get().activate(); EngineChestGui.get().activate(); diff --git a/src/com/massivecraft/massivecore/MassiveCoreEngineDestination.java b/src/com/massivecraft/massivecore/MassiveCoreEngineDestination.java new file mode 100644 index 00000000..68384658 --- /dev/null +++ b/src/com/massivecraft/massivecore/MassiveCoreEngineDestination.java @@ -0,0 +1,200 @@ +package com.massivecraft.massivecore; + +import java.util.Arrays; +import java.util.List; +import java.util.Set; + +import org.bukkit.World; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.plugin.Plugin; + +import com.massivecraft.massivecore.cmd.arg.ARPS; +import com.massivecraft.massivecore.cmd.arg.ARSenderId; +import com.massivecraft.massivecore.cmd.arg.ARWorldId; +import com.massivecraft.massivecore.collections.MassiveSet; +import com.massivecraft.massivecore.event.EventMassiveCoreDestination; +import com.massivecraft.massivecore.ps.PS; +import com.massivecraft.massivecore.teleport.Destination; +import com.massivecraft.massivecore.teleport.DestinationJump; +import com.massivecraft.massivecore.teleport.DestinationPlayer; +import com.massivecraft.massivecore.teleport.DestinationSimple; +import com.massivecraft.massivecore.teleport.DestinationThat; +import com.massivecraft.massivecore.teleport.DestinationThere; +import com.massivecraft.massivecore.teleport.DestinationTop; +import com.massivecraft.massivecore.teleport.DestinationUtil; +import com.massivecraft.massivecore.teleport.DestinationWorld; +import com.massivecraft.massivecore.util.IdUtil; + +public class MassiveCoreEngineDestination extends EngineAbstract +{ + // -------------------------------------------- // + // INSTANCE & CONSTRUCT + // -------------------------------------------- // + + private static MassiveCoreEngineDestination i = new MassiveCoreEngineDestination(); + public static MassiveCoreEngineDestination get() { return i; } + + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public Plugin getPlugin() + { + return MassiveCore.get(); + } + + // -------------------------------------------- // + // DESTINATION ARG + // -------------------------------------------- // + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void destinationPs(EventMassiveCoreDestination event) + { + try + { + PS ps = ARPS.get().read(event.getArg(), event.getSender()); + Destination destination = new DestinationSimple(ps); + event.setDestination(destination); + } + catch (MassiveException exception) + { + event.setException(exception); + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + public void destinationArg(EventMassiveCoreDestination event) + { + final String arg = event.getArg().toLowerCase(); + final CommandSender sender = event.getSender(); + + try + { + Destination destination = destinationArg(arg, sender); + if (destination == null) return; + event.setDestination(destination); + } + catch (MassiveException e) + { + event.setException(e); + } + catch (Exception e) + { + event.setException(new MassiveException().addMsg("%s", e.getMessage())); + } + + event.setCancelled(true); + } + + public static final Set ALIASES_TOP = new MassiveSet("top"); + public static final Set ALIASES_THERE = new MassiveSet("there"); + public static final Set ALIASES_THAT = new MassiveSet("that"); + public static final Set ALIASES_JUMP = new MassiveSet("jump"); + public static final Set ALIASES_WORLD = new MassiveSet("w", "world", "worldspawn", "wspawn"); + public static final Set ALIASES_PLAYER = new MassiveSet("p", "player", "here", "me", "self"); + + public Destination destinationArg(String arg, CommandSender sender) throws MassiveException + { + // Prepare + arg = arg.toLowerCase(); + + List parts = Arrays.asList(arg.split("[\\s\\,\\:]+", 2)); + String first = parts.get(0); + String rest = null; + if (parts.size() > 1) rest = parts.get(1); + + arg = arg.replace("\\s+", ""); + + // TOP + if (ALIASES_TOP.contains(arg)) + { + Player player = DestinationUtil.getPlayer(sender); + return new DestinationTop(player); + } + + // THERE + if (ALIASES_THERE.contains(arg)) + { + Player player = DestinationUtil.getPlayer(sender); + return new DestinationThere(player); + } + + // THAT + if (ALIASES_THAT.contains(arg)) + { + Player player = DestinationUtil.getPlayer(sender); + return new DestinationThat(player); + } + + // JUMP + if (ALIASES_JUMP.contains(arg)) + { + Player player = DestinationUtil.getPlayer(sender); + return new DestinationJump(player); + } + + // World Explicit + if (ALIASES_WORLD.contains(first)) + { + String worldId; + if (rest != null) + { + worldId = ARWorldId.get().read(rest, sender); + } + else + { + Player player = DestinationUtil.getPlayer(sender); + World world = player.getWorld(); + worldId = world.getName(); + } + return new DestinationWorld(worldId); + } + + // World Implicit + try + { + String worldId = ARWorldId.get().read(arg, sender); + return new DestinationWorld(worldId); + } + catch (Exception e) + { + + } + + // Player Explicit + if (ALIASES_PLAYER.contains(first)) + { + String playerId; + if (rest != null) + { + playerId = ARSenderId.get().read(rest, sender); + } + else + { + Player player = DestinationUtil.getPlayer(sender); + playerId = IdUtil.getId(player); + } + return new DestinationPlayer(playerId); + } + + // Player Implicit + try + { + String playerId = ARSenderId.get().read(arg, sender); + return new DestinationPlayer(playerId); + } + catch (Exception e) + { + + } + + // Null + return null; + } + +} diff --git a/src/com/massivecraft/massivecore/chestgui/ChestActionAbstract.java b/src/com/massivecraft/massivecore/chestgui/ChestActionAbstract.java new file mode 100644 index 00000000..4a2539ff --- /dev/null +++ b/src/com/massivecraft/massivecore/chestgui/ChestActionAbstract.java @@ -0,0 +1,28 @@ +package com.massivecraft.massivecore.chestgui; + +import org.bukkit.entity.HumanEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +public class ChestActionAbstract implements ChestAction +{ + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public boolean onClick(InventoryClickEvent event) + { + HumanEntity human = event.getWhoClicked(); + if ( ! (human instanceof Player)) return false; + Player player = (Player)human; + + return onClick(event, player); + } + + public boolean onClick(InventoryClickEvent event, Player player) + { + return false; + } + +} diff --git a/src/com/massivecraft/massivecore/chestgui/ChestActionCommand.java b/src/com/massivecraft/massivecore/chestgui/ChestActionCommand.java index 0b051531..1bcaa735 100644 --- a/src/com/massivecraft/massivecore/chestgui/ChestActionCommand.java +++ b/src/com/massivecraft/massivecore/chestgui/ChestActionCommand.java @@ -2,13 +2,12 @@ package com.massivecraft.massivecore.chestgui; import java.security.InvalidParameterException; -import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryClickEvent; import com.massivecraft.massivecore.mixin.Mixin; -public class ChestActionCommand implements ChestAction +public class ChestActionCommand extends ChestActionAbstract { // -------------------------------------------- // // FIELD @@ -52,12 +51,8 @@ public class ChestActionCommand implements ChestAction // -------------------------------------------- // @Override - public boolean onClick(InventoryClickEvent event) + public boolean onClick(InventoryClickEvent event, Player player) { - HumanEntity human = event.getWhoClicked(); - if ( ! (human instanceof Player)) return false; - Player player = (Player)human; - String commandLine = this.getCommandLine(); if (commandLine == null) return false; diff --git a/src/com/massivecraft/massivecore/chestgui/ChestGui.java b/src/com/massivecraft/massivecore/chestgui/ChestGui.java index 6e71016a..05c866c9 100644 --- a/src/com/massivecraft/massivecore/chestgui/ChestGui.java +++ b/src/com/massivecraft/massivecore/chestgui/ChestGui.java @@ -34,12 +34,12 @@ public class ChestGui // FIELDS: ACTIONS // -------------------------------------------- // - protected Map itemToAction = new MassiveMap(); - public Map getItemToAction() { return this.itemToAction; } - public ChestAction removeAction(ItemStack item) { return this.itemToAction.remove(item); } - public ChestAction setAction(ItemStack item, ChestAction action) { return this.itemToAction.put(item, action); } - public ChestAction setAction(ItemStack item, String command) { return this.setAction(item, new ChestActionCommand(command)); } - public ChestAction getAction(ItemStack item) { return this.itemToAction.get(item); } + protected Map indexToAction = new MassiveMap(); + public Map getIndexToAction() { return this.indexToAction; } + public ChestAction removeAction(ItemStack item) { return this.indexToAction.remove(item); } + public ChestAction setAction(int index, ChestAction action) { return this.indexToAction.put(index, action); } + public ChestAction setAction(int index, String command) { return this.setAction(index, new ChestActionCommand(command)); } + public ChestAction getAction(int index) { return this.indexToAction.get(index); } // -------------------------------------------- // // FIELDS: SOUND diff --git a/src/com/massivecraft/massivecore/chestgui/EngineChestGui.java b/src/com/massivecraft/massivecore/chestgui/EngineChestGui.java index 0c468e57..77d4ce9d 100644 --- a/src/com/massivecraft/massivecore/chestgui/EngineChestGui.java +++ b/src/com/massivecraft/massivecore/chestgui/EngineChestGui.java @@ -6,11 +6,11 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.Plugin; import com.massivecraft.massivecore.EngineAbstract; import com.massivecraft.massivecore.MassiveCore; +import com.massivecraft.massivecore.mixin.Mixin; import com.massivecraft.massivecore.util.InventoryUtil; public class EngineChestGui extends EngineAbstract @@ -51,23 +51,28 @@ public class EngineChestGui extends EngineAbstract event.setCancelled(true); event.setResult(Result.DENY); - // ... and if there is an item ... - ItemStack item = event.getCurrentItem(); - if (InventoryUtil.isNothing(item)) return; + // ... warn on bottom inventory ... + if (InventoryUtil.isBottomInventory(event)) + { + Mixin.msgOne(event.getWhoClicked(), "Exit the GUI to edit your items."); + return; + } - // ... and this item has an action ... - ChestAction action = gui.getAction(item); + // ... and if this slot index ... + int index = event.getSlot(); + + // ... has an action ... + ChestAction action = gui.getAction(index); if (action == null) return; - // ... then use that action ... - action.onClick(event); - - // ... play the sound ... + // ... then play the sound ... gui.playSound(event.getWhoClicked()); - // ... and close the GUI. + // ... close the GUI ... event.getView().close(); + // ... and use that action. + action.onClick(event); } @EventHandler(priority = EventPriority.LOW) diff --git a/src/com/massivecraft/massivecore/cmd/DeprecatedCommand.java b/src/com/massivecraft/massivecore/cmd/DeprecatedCommand.java new file mode 100644 index 00000000..49aea730 --- /dev/null +++ b/src/com/massivecraft/massivecore/cmd/DeprecatedCommand.java @@ -0,0 +1,45 @@ +package com.massivecraft.massivecore.cmd; + +import com.massivecraft.massivecore.cmd.MassiveCommand; +import com.massivecraft.massivecore.cmd.VisibilityMode; + + +public class DeprecatedCommand extends MassiveCommand +{ + // -------------------------------------------- // + // FIELDS + // -------------------------------------------- // + + public MassiveCommand target; + + // -------------------------------------------- // + // CONSTRUCT + // -------------------------------------------- // + + public DeprecatedCommand(MassiveCommand target, String... aliases) + { + // Fields + this.target = target; + + // Aliases + this.setAliases(aliases); + + // Args + this.setErrorOnToManyArgs(false); + + // Visibility + this.setVisibilityMode(VisibilityMode.INVISIBLE); + } + + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public void perform() + { + msg("Use this new command instead:"); + sendMessage(target.getUseageTemplate(true)); + } + +} diff --git a/src/com/massivecraft/massivecore/cmd/arg/ARDestination.java b/src/com/massivecraft/massivecore/cmd/arg/ARDestination.java new file mode 100644 index 00000000..3d25e8bc --- /dev/null +++ b/src/com/massivecraft/massivecore/cmd/arg/ARDestination.java @@ -0,0 +1,39 @@ +package com.massivecraft.massivecore.cmd.arg; + +import org.bukkit.command.CommandSender; + +import com.massivecraft.massivecore.MassiveException; +import com.massivecraft.massivecore.event.EventMassiveCoreDestination; +import com.massivecraft.massivecore.teleport.Destination; + +public class ARDestination extends ArgReaderAbstract +{ + // -------------------------------------------- // + // INSTANCE & CONSTRUCT + // -------------------------------------------- // + + private static ARDestination i = new ARDestination(); + public static ARDestination get() { return i; } + + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public Destination read(String arg, CommandSender sender) throws MassiveException + { + EventMassiveCoreDestination event = new EventMassiveCoreDestination(arg, sender, null); + event.run(); + + MassiveException exception = event.getException(); + if (exception != null) throw exception; + + Destination ret = event.getDestination(); + if (ret == null) throw new MassiveException().addMsg("Unknown destination \"%s\".", arg); + + if ( ! ret.hasPs()) throw new MassiveException().addMessage(ret.getMessagePsNull(sender)); + + return ret; + } + +} diff --git a/src/com/massivecraft/massivecore/cmd/arg/ARPS.java b/src/com/massivecraft/massivecore/cmd/arg/ARPS.java new file mode 100644 index 00000000..634b924f --- /dev/null +++ b/src/com/massivecraft/massivecore/cmd/arg/ARPS.java @@ -0,0 +1,216 @@ +package com.massivecraft.massivecore.cmd.arg; + +import java.util.Arrays; +import java.util.List; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Entity; + +import com.massivecraft.massivecore.MassiveException; +import com.massivecraft.massivecore.ps.PS; +import com.massivecraft.massivecore.ps.PSBuilder; +import com.mysql.jdbc.StringUtils; + +public class ARPS extends ArgReaderAbstract +{ + // -------------------------------------------- // + // INSTANCE & CONSTRUCT + // -------------------------------------------- // + + private static ARPS i = new ARPS(); + public static ARPS get() { return i; } + + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public PS read(String arg, CommandSender sender) throws MassiveException + { + // Ellador 34 13 78.6 (standard one) + // 34 13 79 (standard one) + // pitch14.5 + // worldEllador,yaw14, + // x15,y18,z8003 + // x15 y32 z99 wEllador + // x:15 y:32 z:99 w:Ellador + + // We get the sender ps + PS senderPs = new PSBuilder().build(); + if (sender instanceof Entity) senderPs = PS.valueOf((Entity)sender); + + // We remove all commas optionally followed by spaces + String argInner = arg.replaceAll("\\:\\s*", ""); + + // We split on comma and space to get the list of raw entries. + List parts = Arrays.asList(argInner.split("[\\s,]+")); + + // Then we test the standard ones + if (parts.size() == 4) + { + try + { + String world = ARWorldId.get().read(parts.get(0), sender); + double locationX = ARDouble.get().read(parts.get(1), sender); + double locationY = ARDouble.get().read(parts.get(2), sender); + double locationZ = ARDouble.get().read(parts.get(3), sender); + return new PSBuilder(senderPs).world(world).locationX(locationX).locationY(locationY).locationZ(locationZ).build(); + } + catch (Exception e) + { + + } + + try + { + double locationX = ARDouble.get().read(parts.get(0), sender); + double locationY = ARDouble.get().read(parts.get(1), sender); + double locationZ = ARDouble.get().read(parts.get(2), sender); + String world = ARWorldId.get().read(parts.get(3), sender); + return new PSBuilder(senderPs).world(world).locationX(locationX).locationY(locationY).locationZ(locationZ).build(); + } + catch (Exception e) + { + + } + } + else if (parts.size() == 3) + { + try + { + double locationX = ARDouble.get().read(parts.get(0), sender); + double locationY = ARDouble.get().read(parts.get(1), sender); + double locationZ = ARDouble.get().read(parts.get(2), sender); + return new PSBuilder(senderPs).locationX(locationX).locationY(locationY).locationZ(locationZ).build(); + } + catch (Exception e) + { + + } + } + + // Then we split each entry using known prefixes and append the ps builder. + PSBuilder ret = new PSBuilder(senderPs); + boolean something = false; + for (String part : parts) + { + String value; + + value = getValue(part, PS.NAME_SERIALIZED_WORLD, PS.NAME_FULL_WORLD); + if (value != null) + { + ret.world(ARWorldId.get().read(value, sender)); + something = true; + } + + value = getValue(part, PS.NAME_SERIALIZED_BLOCKX, PS.NAME_FULL_BLOCKX); + if (value != null) + { + ret.blockX(ARInteger.get().read(value, sender)); + something = true; + } + + value = getValue(part, PS.NAME_SERIALIZED_BLOCKY, PS.NAME_FULL_BLOCKY); + if (value != null) + { + ret.blockY(ARInteger.get().read(value, sender)); + something = true; + } + + value = getValue(part, PS.NAME_SERIALIZED_BLOCKZ, PS.NAME_FULL_BLOCKZ); + if (value != null) + { + ret.blockZ(ARInteger.get().read(value, sender)); + something = true; + } + + value = getValue(part, PS.NAME_SERIALIZED_LOCATIONX, PS.NAME_FULL_LOCATIONX, "x"); + if (value != null) + { + ret.locationX(ARDouble.get().read(value, sender)); + something = true; + } + + value = getValue(part, PS.NAME_SERIALIZED_LOCATIONY, PS.NAME_FULL_LOCATIONY, "y"); + if (value != null) + { + ret.locationY(ARDouble.get().read(value, sender)); + something = true; + } + + value = getValue(part, PS.NAME_SERIALIZED_LOCATIONZ, PS.NAME_FULL_LOCATIONZ, "z"); + if (value != null) + { + ret.locationZ(ARDouble.get().read(value, sender)); + something = true; + } + + value = getValue(part, PS.NAME_SERIALIZED_CHUNKX, PS.NAME_FULL_CHUNKX); + if (value != null) + { + ret.chunkX(ARInteger.get().read(value, sender)); + something = true; + } + + value = getValue(part, PS.NAME_SERIALIZED_CHUNKZ, PS.NAME_FULL_CHUNKZ); + if (value != null) + { + ret.chunkZ(ARInteger.get().read(value, sender)); + something = true; + } + + value = getValue(part, PS.NAME_SERIALIZED_PITCH, PS.NAME_FULL_PITCH); + if (value != null) + { + ret.pitch(ARFloat.get().read(value, sender)); + something = true; + } + + value = getValue(part, PS.NAME_SERIALIZED_YAW, PS.NAME_FULL_YAW); + if (value != null) + { + ret.yaw(ARFloat.get().read(value, sender)); + something = true; + } + + value = getValue(part, PS.NAME_SERIALIZED_VELOCITYX, PS.NAME_FULL_VELOCITYX); + if (value != null) + { + ret.velocityX(ARDouble.get().read(value, sender)); + something = true; + } + + value = getValue(part, PS.NAME_SERIALIZED_VELOCITYY, PS.NAME_FULL_VELOCITYY); + if (value != null) + { + ret.velocityY(ARDouble.get().read(value, sender)); + something = true; + } + + value = getValue(part, PS.NAME_SERIALIZED_VELOCITYZ, PS.NAME_FULL_VELOCITYZ); + if (value != null) + { + ret.velocityZ(ARDouble.get().read(value, sender)); + something = true; + } + } + + if ( ! something) + { + throw new MassiveException().addMsg("Invalid physical state \"%s\".", arg); + } + + return ret.build(); + } + + public static String getValue(String entry, String... prefixes) + { + for (String prefix : prefixes) + { + if ( ! StringUtils.startsWithIgnoreCase(entry, prefix)) continue; + return entry.substring(prefix.length()); + } + return null; + } + +} diff --git a/src/com/massivecraft/massivecore/event/EventMassiveCoreDestination.java b/src/com/massivecraft/massivecore/event/EventMassiveCoreDestination.java new file mode 100644 index 00000000..9be02117 --- /dev/null +++ b/src/com/massivecraft/massivecore/event/EventMassiveCoreDestination.java @@ -0,0 +1,48 @@ +package com.massivecraft.massivecore.event; + +import org.bukkit.command.CommandSender; +import org.bukkit.event.HandlerList; + +import com.massivecraft.massivecore.MassiveException; +import com.massivecraft.massivecore.teleport.Destination; + +public class EventMassiveCoreDestination extends EventMassiveCore +{ + // -------------------------------------------- // + // REQUIRED EVENT CODE + // -------------------------------------------- // + + private static final HandlerList handlers = new HandlerList(); + @Override public HandlerList getHandlers() { return handlers; } + public static HandlerList getHandlerList() { return handlers; } + + // -------------------------------------------- // + // FIELD + // -------------------------------------------- // + + protected final String arg; + public String getArg() { return this.arg; } + + protected final CommandSender sender; + public CommandSender getSender() { return this.sender; } + + public Destination destination = null; + public Destination getDestination() { return this.destination; } + public void setDestination(Destination destination) { this.destination = destination; } + + public MassiveException exception = null; + public MassiveException getException() { return this.exception; } + public void setException(MassiveException exception) { this.exception = exception; } + + // -------------------------------------------- // + // CONSTRUCT + // -------------------------------------------- // + + public EventMassiveCoreDestination(String arg, CommandSender sender, Destination destination) + { + this.arg = arg; + this.sender = sender; + this.destination = destination; + } + +} diff --git a/src/com/massivecraft/massivecore/event/EventMassiveCorePlayerPSTeleport.java b/src/com/massivecraft/massivecore/event/EventMassiveCorePlayerPSTeleport.java index b18ba6f7..6f0e0bc5 100644 --- a/src/com/massivecraft/massivecore/event/EventMassiveCorePlayerPSTeleport.java +++ b/src/com/massivecraft/massivecore/event/EventMassiveCorePlayerPSTeleport.java @@ -1,13 +1,11 @@ package com.massivecraft.massivecore.event; -import org.bukkit.Bukkit; -import org.bukkit.event.Cancellable; -import org.bukkit.event.Event; import org.bukkit.event.HandlerList; import com.massivecraft.massivecore.ps.PS; +import com.massivecraft.massivecore.teleport.Destination; -public class EventMassiveCorePlayerPSTeleport extends Event implements Cancellable, Runnable +public class EventMassiveCorePlayerPSTeleport extends EventMassiveCore { // -------------------------------------------- // // REQUIRED EVENT CODE @@ -21,44 +19,25 @@ public class EventMassiveCorePlayerPSTeleport extends Event implements Cancellab // FIELDS // -------------------------------------------- // - private boolean cancelled; - @Override public boolean isCancelled() { return this.cancelled; } - @Override public void setCancelled(boolean cancelled) { this.cancelled = cancelled; } - - private final String teleporteeId; + protected final String teleporteeId; public String getTeleporteeId() { return this.teleporteeId; } - private final PS from; - public PS getFrom() { return this.from; } + protected final PS origin; + public PS getOrigin() { return this.origin; } - private PS to; - public PS getTo() { return this.to; } - public void setTo(PS to) { this.to = to; } - - private String desc; - public String getDesc() { return this.desc; } - public void setDesc(String desc) { this.desc = desc; } + protected Destination destination; + public Destination getDestination() { return this.destination; } + public void setDestination(Destination destination) { this.destination = destination; } // -------------------------------------------- // // CONSTRUCT // -------------------------------------------- // - public EventMassiveCorePlayerPSTeleport(String teleporteeId, PS from, PS to, String desc) + public EventMassiveCorePlayerPSTeleport(String teleporteeId, PS origin, Destination destination) { this.teleporteeId = teleporteeId; - this.from = from; - this.to = to; - this.desc = desc; - } - - // -------------------------------------------- // - // RUN - // -------------------------------------------- // - - @Override - public void run() - { - Bukkit.getPluginManager().callEvent(this); + this.origin = origin; + this.destination = destination; } } diff --git a/src/com/massivecraft/massivecore/mixin/Mixin.java b/src/com/massivecraft/massivecore/mixin/Mixin.java index 72200e20..b015afe9 100644 --- a/src/com/massivecraft/massivecore/mixin/Mixin.java +++ b/src/com/massivecraft/massivecore/mixin/Mixin.java @@ -15,8 +15,7 @@ import org.bukkit.permissions.Permissible; import com.massivecraft.massivecore.Predictate; import com.massivecraft.massivecore.event.EventMassiveCorePlayerLeave; import com.massivecraft.massivecore.ps.PS; -import com.massivecraft.massivecore.store.SenderEntity; -import com.massivecraft.massivecore.teleport.PSGetter; +import com.massivecraft.massivecore.teleport.Destination; public class Mixin { @@ -212,94 +211,17 @@ public class Mixin return getTeleportMixin().isCausedByMixin(event); } - // PS - public static void teleport(Object teleporteeObject, PS to) throws TeleporterException + public static void teleport(Object teleporteeObject, Destination destination) throws TeleporterException { - getTeleportMixin().teleport(teleporteeObject, to); + getTeleportMixin().teleport(teleporteeObject, destination); } - public static void teleport(Object teleporteeObject, PS to, String desc) throws TeleporterException + public static void teleport(Object teleporteeObject, Destination destination, Permissible delayPermissible) throws TeleporterException { - getTeleportMixin().teleport(teleporteeObject, to, desc); + getTeleportMixin().teleport(teleporteeObject, destination, delayPermissible); } - public static void teleport(Object teleporteeObject, PS to, String desc, Permissible delayPermissible) throws TeleporterException + public static void teleport(Object teleporteeObject, Destination destination, int delaySeconds) throws TeleporterException { - getTeleportMixin().teleport(teleporteeObject, to, desc, delayPermissible); - } - public static void teleport(Object teleporteeObject, PS to, String desc, int delaySeconds) throws TeleporterException - { - getTeleportMixin().teleport(teleporteeObject, to, desc, delaySeconds); - } - - // CommandSender - public static void teleport(Object teleporteeObject, CommandSender to) throws TeleporterException - { - getTeleportMixin().teleport(teleporteeObject, to); - } - public static void teleport(Object teleporteeObject, CommandSender to, String desc) throws TeleporterException - { - getTeleportMixin().teleport(teleporteeObject, to, desc); - } - public static void teleport(Object teleporteeObject, CommandSender to, String desc, Permissible delayPermissible) throws TeleporterException - { - getTeleportMixin().teleport(teleporteeObject, to, desc, delayPermissible); - } - public static void teleport(Object teleporteeObject, CommandSender to, String desc, int delaySeconds) throws TeleporterException - { - getTeleportMixin().teleport(teleporteeObject, to, desc, delaySeconds); - } - - // SenderEntity - public static void teleport(Object teleporteeObject, SenderEntity to) throws TeleporterException - { - getTeleportMixin().teleport(teleporteeObject, to); - } - public static void teleport(Object teleporteeObject, SenderEntity to, String desc) throws TeleporterException - { - getTeleportMixin().teleport(teleporteeObject, to, desc); - } - public static void teleport(Object teleporteeObject, SenderEntity to, String desc, Permissible delayPermissible) throws TeleporterException - { - getTeleportMixin().teleport(teleporteeObject, to, desc, delayPermissible); - } - public static void teleport(Object teleporteeObject, SenderEntity to, String desc, int delaySeconds) throws TeleporterException - { - getTeleportMixin().teleport(teleporteeObject, to, desc, delaySeconds); - } - - // String - public static void teleport(Object teleporteeObject, String to) throws TeleporterException - { - getTeleportMixin().teleport(teleporteeObject, to); - } - public static void teleport(Object teleporteeObject, String to, String desc) throws TeleporterException - { - getTeleportMixin().teleport(teleporteeObject, to, desc); - } - public static void teleport(Object teleporteeObject, String to, String desc, Permissible delayPermissible) throws TeleporterException - { - getTeleportMixin().teleport(teleporteeObject, to, desc, delayPermissible); - } - public static void teleport(Object teleporteeObject, String to, String desc, int delaySeconds) throws TeleporterException - { - getTeleportMixin().teleport(teleporteeObject, to, desc, delaySeconds); - } - - // PSGetter - public static void teleport(Object teleporteeObject, PSGetter to) throws TeleporterException - { - getTeleportMixin().teleport(teleporteeObject, to); - } - public static void teleport(Object teleporteeObject, PSGetter to, String desc) throws TeleporterException - { - getTeleportMixin().teleport(teleporteeObject, to, desc); - } - public static void teleport(Object teleporteeObject, PSGetter to, String desc, Permissible delayPermissible) throws TeleporterException - { - getTeleportMixin().teleport(teleporteeObject, to, desc, delayPermissible); - } - public static void teleport(Object teleporteeObject, PSGetter to, String desc, int delaySeconds) throws TeleporterException - { - getTeleportMixin().teleport(teleporteeObject, to, desc, delaySeconds); + getTeleportMixin().teleport(teleporteeObject, destination, delaySeconds); } // -------------------------------------------- // diff --git a/src/com/massivecraft/massivecore/mixin/TeleportMixin.java b/src/com/massivecraft/massivecore/mixin/TeleportMixin.java index 578be54d..305a340a 100644 --- a/src/com/massivecraft/massivecore/mixin/TeleportMixin.java +++ b/src/com/massivecraft/massivecore/mixin/TeleportMixin.java @@ -1,12 +1,9 @@ package com.massivecraft.massivecore.mixin; -import org.bukkit.command.CommandSender; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.permissions.Permissible; -import com.massivecraft.massivecore.ps.PS; -import com.massivecraft.massivecore.store.SenderEntity; -import com.massivecraft.massivecore.teleport.PSGetter; +import com.massivecraft.massivecore.teleport.Destination; public interface TeleportMixin { @@ -28,34 +25,8 @@ public interface TeleportMixin // COMMAND SENDER // -------------------------------------------- // - // PS - public void teleport(Object teleporteeObject, PS to) throws TeleporterException; - public void teleport(Object teleporteeObject, PS to, String desc) throws TeleporterException; - public void teleport(Object teleporteeObject, PS to, String desc, Permissible delayPermissible) throws TeleporterException; - public void teleport(Object teleporteeObject, PS to, String desc, int delaySeconds) throws TeleporterException; - - // CommandSender - public void teleport(Object teleporteeObject, CommandSender to) throws TeleporterException; - public void teleport(Object teleporteeObject, CommandSender to, String desc) throws TeleporterException; - public void teleport(Object teleporteeObject, CommandSender to, String desc, Permissible delayPermissible) throws TeleporterException; - public void teleport(Object teleporteeObject, CommandSender to, String desc, int delaySeconds) throws TeleporterException; - - // SenderEntity - public void teleport(Object teleporteeObject, SenderEntity to) throws TeleporterException; - public void teleport(Object teleporteeObject, SenderEntity to, String desc) throws TeleporterException; - public void teleport(Object teleporteeObject, SenderEntity to, String desc, Permissible delayPermissible) throws TeleporterException; - public void teleport(Object teleporteeObject, SenderEntity to, String desc, int delaySeconds) throws TeleporterException; - - // String - public void teleport(Object teleporteeObject, String to) throws TeleporterException; - public void teleport(Object teleporteeObject, String to, String desc) throws TeleporterException; - public void teleport(Object teleporteeObject, String to, String desc, Permissible delayPermissible) throws TeleporterException; - public void teleport(Object teleporteeObject, String to, String desc, int delaySeconds) throws TeleporterException; - - // PSGetter - public void teleport(Object teleporteeObject, PSGetter to) throws TeleporterException; - public void teleport(Object teleporteeObject, PSGetter to, String desc) throws TeleporterException; - public void teleport(Object teleporteeObject, PSGetter to, String desc, Permissible delayPermissible) throws TeleporterException; - public void teleport(Object teleporteeObject, PSGetter to, String desc, int delaySeconds) throws TeleporterException; + public void teleport(Object teleporteeObject, Destination destination) throws TeleporterException; + public void teleport(Object teleporteeObject, Destination destination, Permissible delayPermissible) throws TeleporterException; + public void teleport(Object teleporteeObject, Destination destination, int delaySeconds) throws TeleporterException; } diff --git a/src/com/massivecraft/massivecore/mixin/TeleportMixinAbstract.java b/src/com/massivecraft/massivecore/mixin/TeleportMixinAbstract.java index 2ae0c9b3..fc52b631 100644 --- a/src/com/massivecraft/massivecore/mixin/TeleportMixinAbstract.java +++ b/src/com/massivecraft/massivecore/mixin/TeleportMixinAbstract.java @@ -1,15 +1,10 @@ package com.massivecraft.massivecore.mixin; -import org.bukkit.command.CommandSender; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.permissions.Permissible; import com.massivecraft.massivecore.MassiveCoreMConf; -import com.massivecraft.massivecore.ps.PS; -import com.massivecraft.massivecore.store.SenderEntity; -import com.massivecraft.massivecore.teleport.PSGetter; -import com.massivecraft.massivecore.teleport.PSGetterPS; -import com.massivecraft.massivecore.teleport.PSGetterPlayer; +import com.massivecraft.massivecore.teleport.Destination; public abstract class TeleportMixinAbstract implements TeleportMixin { @@ -23,7 +18,7 @@ public abstract class TeleportMixinAbstract implements TeleportMixin } // -------------------------------------------- // - // CHECK + // OVERRIDE // -------------------------------------------- // @Override @@ -31,134 +26,25 @@ public abstract class TeleportMixinAbstract implements TeleportMixin { return EngineTeleportMixinCause.get().isCausedByTeleportMixin(event); } - - // -------------------------------------------- // - // SENDER OBJECT - // -------------------------------------------- // - - // PS + @Override - public void teleport(Object teleportee, PS to) throws TeleporterException + public void teleport(Object teleportee, Destination destination) throws TeleporterException { - this.teleport(teleportee, to, null); + this.teleport(teleportee, destination, 0); } @Override - public void teleport(Object teleportee, PS to, String desc) throws TeleporterException + public void teleport(Object teleportee, Destination destination, Permissible delayPermissible) throws TeleporterException { - this.teleport(teleportee, to, desc, 0); + this.teleport(teleportee, destination, getTpdelay(delayPermissible)); } + // TO OVERRIDE + /* @Override - public void teleport(Object teleportee, PS to, String desc, Permissible delayPermissible) throws TeleporterException + public void teleport(Object teleporteeObject, Destination destination, int delaySeconds) throws TeleporterException { - this.teleport(teleportee, to, desc, getTpdelay(delayPermissible)); + // TODO Auto-generated method stub } - - @Override - public void teleport(Object teleportee, PS to, String desc, int delaySeconds) throws TeleporterException - { - this.teleport(teleportee, PSGetterPS.valueOf(to), desc, delaySeconds); - } - - // CommandSender - @Override - public void teleport(Object teleportee, CommandSender to) throws TeleporterException - { - this.teleport(teleportee, to, null); - } - - @Override - public void teleport(Object teleportee, CommandSender to, String desc) throws TeleporterException - { - this.teleport(teleportee, to, desc, 0); - } - - @Override - public void teleport(Object teleportee, CommandSender to, String desc, Permissible delayPermissible) throws TeleporterException - { - this.teleport(teleportee, to, desc, getTpdelay(delayPermissible)); - } - - @Override - public void teleport(Object teleportee, CommandSender to, String desc, int delaySeconds) throws TeleporterException - { - this.teleport(teleportee, PSGetterPlayer.valueOf(to), desc, delaySeconds); - } - - // SenderEntity - @Override - public void teleport(Object teleportee, SenderEntity to) throws TeleporterException - { - this.teleport(teleportee, to, null); - } - - @Override - public void teleport(Object teleportee, SenderEntity to, String desc) throws TeleporterException - { - this.teleport(teleportee, to, desc, 0); - } - - @Override - public void teleport(Object teleportee, SenderEntity to, String desc, Permissible delayPermissible) throws TeleporterException - { - this.teleport(teleportee, to, desc, getTpdelay(delayPermissible)); - } - - @Override - public void teleport(Object teleportee, SenderEntity to, String desc, int delaySeconds) throws TeleporterException - { - this.teleport(teleportee, PSGetterPlayer.valueOf(to), desc, delaySeconds); - } - - // String - @Override - public void teleport(Object teleportee, String to) throws TeleporterException - { - this.teleport(teleportee, to, null); - } - - @Override - public void teleport(Object teleportee, String to, String desc) throws TeleporterException - { - this.teleport(teleportee, to, desc, 0); - } - - @Override - public void teleport(Object teleportee, String to, String desc, Permissible delayPermissible) throws TeleporterException - { - this.teleport(teleportee, to, desc, getTpdelay(delayPermissible)); - } - - @Override - public void teleport(Object teleportee, String to, String desc, int delaySeconds) throws TeleporterException - { - this.teleport(teleportee, PSGetterPlayer.valueOf(to), desc, delaySeconds); - } - - // PSGetter - @Override - public void teleport(Object teleportee, PSGetter to) throws TeleporterException - { - this.teleport(teleportee, to, null); - } - - @Override - public void teleport(Object teleportee, PSGetter to, String desc) throws TeleporterException - { - this.teleport(teleportee, to, desc, 0); - } - - @Override - public void teleport(Object teleportee, PSGetter to, String desc, Permissible delayPermissible) throws TeleporterException - { - this.teleport(teleportee, to, desc, getTpdelay(delayPermissible)); - } - - // To implement! - /*@Override - public void teleport(Object teleportee, PSGetter to, String desc, int delaySeconds) throws TeleporterException - { - //this.teleport(teleportee, to, desc, delaySeconds); - }*/ + */ } diff --git a/src/com/massivecraft/massivecore/mixin/TeleportMixinDefault.java b/src/com/massivecraft/massivecore/mixin/TeleportMixinDefault.java index 5ffe6112..10ae5332 100644 --- a/src/com/massivecraft/massivecore/mixin/TeleportMixinDefault.java +++ b/src/com/massivecraft/massivecore/mixin/TeleportMixinDefault.java @@ -7,7 +7,7 @@ import org.bukkit.util.Vector; import com.massivecraft.massivecore.event.EventMassiveCorePlayerPSTeleport; import com.massivecraft.massivecore.ps.PS; -import com.massivecraft.massivecore.teleport.PSGetter; +import com.massivecraft.massivecore.teleport.Destination; import com.massivecraft.massivecore.teleport.ScheduledTeleport; import com.massivecraft.massivecore.util.IdUtil; import com.massivecraft.massivecore.util.Txt; @@ -71,11 +71,14 @@ public class TeleportMixinDefault extends TeleportMixinAbstract // -------------------------------------------- // @Override - public void teleport(Object teleporteeObject, PSGetter toGetter, String desc, int delaySeconds) throws TeleporterException + public void teleport(Object teleporteeObject, Destination destination, int delaySeconds) throws TeleporterException { String teleporteeId = IdUtil.getId(teleporteeObject); if (!IdUtil.isPlayerId(teleporteeId)) throw new TeleporterException(Txt.parse("%s is not a player.", Mixin.getDisplayName(teleporteeId, IdUtil.getConsole()))); + if ( ! destination.hasPs()) throw new TeleporterException(destination.getMessagePsNull(teleporteeId)); + + String desc = destination.getDesc(teleporteeId); if (delaySeconds > 0) { // With delay @@ -88,22 +91,18 @@ public class TeleportMixinDefault extends TeleportMixinAbstract Mixin.msgOne(teleporteeId, "Teleporting in "+delaySeconds+"s unless you move."); } - new ScheduledTeleport(teleporteeId, toGetter, desc, delaySeconds).schedule(); + new ScheduledTeleport(teleporteeId, destination, delaySeconds).schedule(); } else { // Without delay AKA "now"/"at once" - // Resolve the getter - PS to = toGetter.getPS(); - // Run event - EventMassiveCorePlayerPSTeleport event = new EventMassiveCorePlayerPSTeleport(teleporteeId, Mixin.getSenderPs(teleporteeId), to, desc); + EventMassiveCorePlayerPSTeleport event = new EventMassiveCorePlayerPSTeleport(teleporteeId, Mixin.getSenderPs(teleporteeId), destination); event.run(); if (event.isCancelled()) return; - if (event.getTo() == null) return; - to = event.getTo(); - desc = event.getDesc(); + destination = event.getDestination(); + desc = destination.getDesc(teleporteeId); if (desc != null) { @@ -113,13 +112,13 @@ public class TeleportMixinDefault extends TeleportMixinAbstract Player teleportee = IdUtil.getPlayer(teleporteeId); if (teleportee != null) { - teleportPlayer(teleportee, to); + teleportPlayer(teleportee, destination.getPs()); } else { - Mixin.setSenderPs(teleporteeId, to); + Mixin.setSenderPs(teleporteeId, destination.getPs()); } } } -} \ No newline at end of file +} diff --git a/src/com/massivecraft/massivecore/mixin/TeleporterException.java b/src/com/massivecraft/massivecore/mixin/TeleporterException.java index c95c4464..ccef38bd 100644 --- a/src/com/massivecraft/massivecore/mixin/TeleporterException.java +++ b/src/com/massivecraft/massivecore/mixin/TeleporterException.java @@ -28,4 +28,5 @@ public class TeleporterException extends Exception { super(message, cause, enableSuppression, writableStackTrace); } + } diff --git a/src/com/massivecraft/massivecore/teleport/Destination.java b/src/com/massivecraft/massivecore/teleport/Destination.java new file mode 100644 index 00000000..0ac48a13 --- /dev/null +++ b/src/com/massivecraft/massivecore/teleport/Destination.java @@ -0,0 +1,15 @@ +package com.massivecraft.massivecore.teleport; + +import java.io.Serializable; + +import com.massivecraft.massivecore.ps.PS; + +public interface Destination extends Serializable +{ + public PS getPs(); + public boolean hasPs(); + public String getMessagePsNull(Object watcherObject); + + public String getDesc(Object watcherObject); + public void setDesc(String desc); +} diff --git a/src/com/massivecraft/massivecore/teleport/DestinationAbstract.java b/src/com/massivecraft/massivecore/teleport/DestinationAbstract.java new file mode 100644 index 00000000..fa8b67e5 --- /dev/null +++ b/src/com/massivecraft/massivecore/teleport/DestinationAbstract.java @@ -0,0 +1,46 @@ +package com.massivecraft.massivecore.teleport; + +import com.massivecraft.massivecore.ps.PSFormatHumanSpace; +import com.massivecraft.massivecore.util.Txt; + +public abstract class DestinationAbstract implements Destination +{ + private static final long serialVersionUID = 1L; + + // -------------------------------------------- // + // FIELDS + // -------------------------------------------- // + + protected String desc = null; + + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public boolean hasPs() + { + return this.getPs() != null; + } + + @Override + public String getMessagePsNull(Object watcherObject) + { + String desc = this.getDesc(watcherObject); + return Txt.parse("Location for %s could not be found.", desc); + } + + @Override + public String getDesc(Object watcherObject) + { + if (this.desc != null) return this.desc; + return PSFormatHumanSpace.get().format(this.getPs()); + } + + @Override + public void setDesc(String desc) + { + this.desc = desc; + } + +} diff --git a/src/com/massivecraft/massivecore/teleport/DestinationJump.java b/src/com/massivecraft/massivecore/teleport/DestinationJump.java new file mode 100644 index 00000000..dc2a1f7a --- /dev/null +++ b/src/com/massivecraft/massivecore/teleport/DestinationJump.java @@ -0,0 +1,47 @@ +package com.massivecraft.massivecore.teleport; + +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import com.massivecraft.massivecore.ps.PS; + +public class DestinationJump extends DestinationPlayer +{ + private static final long serialVersionUID = 1L; + + // -------------------------------------------- // + // CONSTRUCT + // -------------------------------------------- // + + public DestinationJump(String playerId) + { + super(playerId); + } + + public DestinationJump(Object playerObject) + { + super(playerObject); + } + + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public PS getPs() + { + Player player = this.getPlayer(); + if (player == null) return null; + + Location location = DestinationUtil.getJumpLocation(player); + + return PS.valueOf(location); + } + + @Override + public String getDesc(Object watcherObject) + { + return "Jump for " + super.getDesc(watcherObject, false); + } + +} diff --git a/src/com/massivecraft/massivecore/teleport/DestinationPlayer.java b/src/com/massivecraft/massivecore/teleport/DestinationPlayer.java new file mode 100644 index 00000000..9f7d64db --- /dev/null +++ b/src/com/massivecraft/massivecore/teleport/DestinationPlayer.java @@ -0,0 +1,80 @@ +package com.massivecraft.massivecore.teleport; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.massivecraft.massivecore.mixin.Mixin; +import com.massivecraft.massivecore.ps.PS; +import com.massivecraft.massivecore.util.IdUtil; +import com.massivecraft.massivecore.util.Txt; + +public class DestinationPlayer extends DestinationAbstract +{ + private static final long serialVersionUID = 1L; + + // -------------------------------------------- // + // FIELDS + // -------------------------------------------- // + + protected String playerId; + + public String getPlayerId() { return this.playerId; } + public void setPlayerId(String playerId) { this.playerId = playerId; } + + public void setPlayer(Object playerObject) { this.playerId = IdUtil.getId(playerObject); } + public CommandSender getSender() { return IdUtil.getSender(this.playerId); } + public Player getPlayer() { return IdUtil.getPlayer(this.playerId); } + + // -------------------------------------------- // + // CONSTRUCT + // -------------------------------------------- // + + public DestinationPlayer(String playerId) + { + this.setPlayerId(playerId); + } + + public DestinationPlayer(Object playerObject) + { + this.setPlayer(playerObject); + } + + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public PS getPs() + { + return Mixin.getSenderPs(this.playerId); + } + + @Override + public String getDesc(Object watcherObject) + { + return this.getDesc(watcherObject, true); + } + + public String getDesc(Object watcherObject, boolean prefix) + { + String ret = ""; + + // Player Prefix + if (prefix) + { + ret += "Player "; + } + + // Display Name + ret += Mixin.getDisplayName(this.getPlayerId(), watcherObject); + + // Offline Suffix + if (Mixin.isOffline(this.getPlayerId())) + { + ret += Txt.parse(" [Offline]"); + } + + return ret; + } + +} diff --git a/src/com/massivecraft/massivecore/teleport/PSGetterPS.java b/src/com/massivecraft/massivecore/teleport/DestinationSimple.java similarity index 61% rename from src/com/massivecraft/massivecore/teleport/PSGetterPS.java rename to src/com/massivecraft/massivecore/teleport/DestinationSimple.java index c3eece5a..3f43f648 100644 --- a/src/com/massivecraft/massivecore/teleport/PSGetterPS.java +++ b/src/com/massivecraft/massivecore/teleport/DestinationSimple.java @@ -2,7 +2,7 @@ package com.massivecraft.massivecore.teleport; import com.massivecraft.massivecore.ps.PS; -public final class PSGetterPS extends PSGetterAbstract +public class DestinationSimple extends DestinationAbstract { private static final long serialVersionUID = 1L; @@ -10,24 +10,27 @@ public final class PSGetterPS extends PSGetterAbstract // FIELDS // -------------------------------------------- // - private final PS ps; + protected PS ps = null; + public void setPs(PS ps) { this.ps = ps; } // -------------------------------------------- // // CONSTRUCT // -------------------------------------------- // - private PSGetterPS(PS ps) + public DestinationSimple() { - this.ps = ps; + this(null, null); } - // -------------------------------------------- // - // VALUE OF - // -------------------------------------------- // - - public static PSGetterPS valueOf(PS ps) + public DestinationSimple(PS ps) { - return new PSGetterPS(ps); + this(ps, null); + } + + public DestinationSimple(PS ps, String desc) + { + this.ps = ps; + this.desc = desc; } // -------------------------------------------- // @@ -35,7 +38,7 @@ public final class PSGetterPS extends PSGetterAbstract // -------------------------------------------- // @Override - public PS getPS() + public PS getPs() { return this.ps; } diff --git a/src/com/massivecraft/massivecore/teleport/DestinationThat.java b/src/com/massivecraft/massivecore/teleport/DestinationThat.java new file mode 100644 index 00000000..8a6f4cc8 --- /dev/null +++ b/src/com/massivecraft/massivecore/teleport/DestinationThat.java @@ -0,0 +1,47 @@ +package com.massivecraft.massivecore.teleport; + +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import com.massivecraft.massivecore.ps.PS; + +public class DestinationThat extends DestinationPlayer +{ + private static final long serialVersionUID = 1L; + + // -------------------------------------------- // + // CONSTRUCT + // -------------------------------------------- // + + public DestinationThat(String playerId) + { + super(playerId); + } + + public DestinationThat(Object playerObject) + { + super(playerObject); + } + + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public PS getPs() + { + Player player = this.getPlayer(); + if (player == null) return null; + + Location location = DestinationUtil.getThatLocation(player); + + return PS.valueOf(location); + } + + @Override + public String getDesc(Object watcherObject) + { + return "That for " + super.getDesc(watcherObject, false); + } + +} diff --git a/src/com/massivecraft/massivecore/teleport/DestinationThere.java b/src/com/massivecraft/massivecore/teleport/DestinationThere.java new file mode 100644 index 00000000..bf9a4d0d --- /dev/null +++ b/src/com/massivecraft/massivecore/teleport/DestinationThere.java @@ -0,0 +1,47 @@ +package com.massivecraft.massivecore.teleport; + +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import com.massivecraft.massivecore.ps.PS; + +public class DestinationThere extends DestinationPlayer +{ + private static final long serialVersionUID = 1L; + + // -------------------------------------------- // + // CONSTRUCT + // -------------------------------------------- // + + public DestinationThere(String playerId) + { + super(playerId); + } + + public DestinationThere(Object playerObject) + { + super(playerObject); + } + + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public PS getPs() + { + Player player = this.getPlayer(); + if (player == null) return null; + + Location location = DestinationUtil.getThereLocation(player); + + return PS.valueOf(location); + } + + @Override + public String getDesc(Object watcherObject) + { + return "There for " + super.getDesc(watcherObject, false); + } + +} diff --git a/src/com/massivecraft/massivecore/teleport/DestinationTop.java b/src/com/massivecraft/massivecore/teleport/DestinationTop.java new file mode 100644 index 00000000..782ab223 --- /dev/null +++ b/src/com/massivecraft/massivecore/teleport/DestinationTop.java @@ -0,0 +1,48 @@ +package com.massivecraft.massivecore.teleport; + +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import com.massivecraft.massivecore.ps.PS; + +public class DestinationTop extends DestinationPlayer +{ + private static final long serialVersionUID = 1L; + + // -------------------------------------------- // + // CONSTRUCT + // -------------------------------------------- // + + public DestinationTop(String playerId) + { + super(playerId); + } + + public DestinationTop(Object playerObject) + { + super(playerObject); + } + + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public PS getPs() + { + Player player = this.getPlayer(); + if (player == null) return null; + + Location location = player.getLocation(); + location.setY(location.getWorld().getHighestBlockYAt(location) + 1); + + return PS.valueOf(location); + } + + @Override + public String getDesc(Object watcherObject) + { + return "Top for " + super.getDesc(watcherObject, false); + } + +} diff --git a/src/com/massivecraft/massivecore/teleport/DestinationUtil.java b/src/com/massivecraft/massivecore/teleport/DestinationUtil.java new file mode 100644 index 00000000..78f9d749 --- /dev/null +++ b/src/com/massivecraft/massivecore/teleport/DestinationUtil.java @@ -0,0 +1,140 @@ +package com.massivecraft.massivecore.teleport; + +import java.util.Iterator; + +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.util.BlockIterator; + +import com.massivecraft.massivecore.MassiveException; + +public class DestinationUtil +{ + public static Player getPlayer(CommandSender sender) throws MassiveException + { + if ( ! (sender instanceof Player)) throw new MassiveException().addMsg("You must be a player to use this destination."); + return (Player)sender; + } + + // We strictly avoid blocks since they have a tendency to not accept outside world coordinates. + + public static Location getThatLocation(LivingEntity livingEntity) + { + BlockIterator iter = createHeadlessIterator(livingEntity); + Block block = nextSolid(iter); + + // Nothing solid in sight + if (block == null) return null; + + Location oldLocation = livingEntity.getLocation(); + Location targetLocation = moveLocationToBlock(oldLocation, block); + return targetLocation; + } + + public static Location getThereLocation(LivingEntity livingEntity) + { + BlockIterator iter = createHeadlessIterator(livingEntity); + Block block = nextBeforeSolid(iter); + + // Nothing solid in sight + if (block == null) return null; + + Location oldLocation = livingEntity.getLocation(); + Location targetLocation = moveLocationToBlock(oldLocation, block); + return targetLocation; + } + + public static Location getJumpLocation(LivingEntity livingEntity) + { + BlockIterator iter = createHeadlessIterator(livingEntity); + Block block = nextSolid(iter); + + // Nothing solid in sight + if (block == null) return null; + + Location oldLocation = livingEntity.getLocation(); + Location targetLocation = moveUp(moveLocationToBlock(oldLocation, block)); + return targetLocation; + } + + public static BlockIterator createHeadlessIterator(LivingEntity livingEntity) + { + BlockIterator ret = new BlockIterator(livingEntity, 300); + ret.next(); + return ret; + } + + public static Block nextSolid(Iterator iter) + { + if (iter == null) return null; + while (iter.hasNext()) + { + Block block = iter.next(); + if (block.getType().isSolid()) return block; + } + return null; + } + + public static Block nextBeforeSolid(Iterator iter) + { + if (iter == null) return null; + Block ret = null; + while (iter.hasNext()) + { + Block block = iter.next(); + if (block.getType().isSolid()) break; + ret = block; + } + return ret; + } + + public static Location moveUp(Location location) + { + Location ret = location.clone(); + while (!canStandIn(ret)) + { + ret.add(0, 1, 0); + } + return ret; + } + + public static boolean canStandIn(Location location) + { + return canStandIn(location.getWorld(), location.getBlockX(), location.getBlockY(), location.getBlockZ()); + } + + public static boolean canStandIn(World world, int x, int y, int z) + { + if (isSolid(world, x, y, z)) return false; + if (isSolid(world, x, y+1, z)) return false; + if (!isSolid(world, x, y-1, z)) return false; + return true; + } + + public static boolean isSolid(World world, int x, int y, int z) + { + if (y > world.getMaxHeight()) return false; + if (y < 0) return false; + return world.getBlockAt(x, y, z).getType().isSolid(); + } + + public static Location moveLocationToBlock(Location location, Block block) + { + return moveLocationToBlockCoords(location, block.getX(), block.getY(), block.getZ()); + } + + public static Location moveLocationToBlockCoords(Location location, int x, int y, int z) + { + Location ret = location.clone(); + + ret.setX(x + location.getX() - location.getBlockX()); + ret.setY(y + location.getY() - location.getBlockY()); + ret.setZ(z + location.getZ() - location.getBlockZ()); + + return ret; + } +} diff --git a/src/com/massivecraft/massivecore/teleport/DestinationWorld.java b/src/com/massivecraft/massivecore/teleport/DestinationWorld.java new file mode 100644 index 00000000..445b29a4 --- /dev/null +++ b/src/com/massivecraft/massivecore/teleport/DestinationWorld.java @@ -0,0 +1,72 @@ +package com.massivecraft.massivecore.teleport; + +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.massivecraft.massivecore.mixin.Mixin; +import com.massivecraft.massivecore.ps.PS; + +public class DestinationWorld extends DestinationAbstract +{ + private static final long serialVersionUID = 1L; + + // -------------------------------------------- // + // FIELDS + // -------------------------------------------- // + + protected String worldId; + + public String getWorldId() { return this.worldId; } + public void setWorldId(String worldId) { this.worldId = worldId; } + + public void setWorld(World world) { this.worldId = (world == null ? null : world.getName()); } + public World getWorld() { return Bukkit.getWorld(this.worldId); } + + // -------------------------------------------- // + // CONSTRUCT + // -------------------------------------------- // + + public DestinationWorld() + { + + } + + public DestinationWorld(CommandSender sender) + { + if ( ! (sender instanceof Player)) return; + Player player = (Player)sender; + this.setWorld(player.getWorld()); + } + + public DestinationWorld(World world) + { + this.setWorld(world); + } + + public DestinationWorld(String worldId) + { + this.setWorldId(worldId); + } + + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public PS getPs() + { + String worldId = this.getWorldId(); + if (worldId == null) return null; + + return Mixin.getWorldSpawnPs(worldId); + } + + @Override + public String getDesc(Object watcherObject) + { + return "World " + Mixin.getWorldDisplayName(this.getWorldId()); + } + +} diff --git a/src/com/massivecraft/massivecore/teleport/EngineScheduledTeleport.java b/src/com/massivecraft/massivecore/teleport/EngineScheduledTeleport.java index 678fa2f7..20b2c326 100644 --- a/src/com/massivecraft/massivecore/teleport/EngineScheduledTeleport.java +++ b/src/com/massivecraft/massivecore/teleport/EngineScheduledTeleport.java @@ -102,7 +102,7 @@ public class EngineScheduledTeleport extends EngineAbstract scheduledTeleport.unschedule(); // ... and inform the teleportee. - Mixin.msgOne(scheduledTeleport.getTeleporteeId(), "Cancelled teleport to "+scheduledTeleport.getDestinationDesc()+"."); + Mixin.msgOne(scheduledTeleport.getTeleporteeId(), "Cancelled teleport to "+scheduledTeleport.getDestination().getDesc(scheduledTeleport.getTeleporteeId())+"."); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) diff --git a/src/com/massivecraft/massivecore/teleport/PSGetter.java b/src/com/massivecraft/massivecore/teleport/PSGetter.java deleted file mode 100644 index 9126d05c..00000000 --- a/src/com/massivecraft/massivecore/teleport/PSGetter.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.massivecraft.massivecore.teleport; - -import java.io.Serializable; - -import com.massivecraft.massivecore.ps.PS; - -public interface PSGetter extends Serializable -{ - public PS getPS(); -} diff --git a/src/com/massivecraft/massivecore/teleport/PSGetterAbstract.java b/src/com/massivecraft/massivecore/teleport/PSGetterAbstract.java deleted file mode 100644 index 7816a892..00000000 --- a/src/com/massivecraft/massivecore/teleport/PSGetterAbstract.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.massivecraft.massivecore.teleport; - -public abstract class PSGetterAbstract implements PSGetter -{ - private static final long serialVersionUID = 1L; - - public boolean hasPS() - { - return this.getPS() != null; - } -} diff --git a/src/com/massivecraft/massivecore/teleport/PSGetterPlayer.java b/src/com/massivecraft/massivecore/teleport/PSGetterPlayer.java deleted file mode 100644 index 1686ccfd..00000000 --- a/src/com/massivecraft/massivecore/teleport/PSGetterPlayer.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.massivecraft.massivecore.teleport; - -import org.bukkit.command.CommandSender; - -import com.massivecraft.massivecore.mixin.Mixin; -import com.massivecraft.massivecore.ps.PS; -import com.massivecraft.massivecore.store.SenderEntity; -import com.massivecraft.massivecore.util.IdUtil; - -public final class PSGetterPlayer extends PSGetterAbstract -{ - private static final long serialVersionUID = 1L; - - // -------------------------------------------- // - // FIELDS - // -------------------------------------------- // - - private final String senderId; - public String getSenderId() { return this.senderId; } - - // -------------------------------------------- // - // CONSTRUCT - // -------------------------------------------- // - - private PSGetterPlayer(String senderId) - { - this.senderId = senderId; - } - - // -------------------------------------------- // - // VALUE OF - // -------------------------------------------- // - - public static PSGetterPlayer valueOf(CommandSender player) - { - return new PSGetterPlayer(IdUtil.getId(player)); - } - - public static PSGetterPlayer valueOf(SenderEntity playerEntity) - { - return new PSGetterPlayer(playerEntity.getId()); - } - - public static PSGetterPlayer valueOf(String playerId) - { - return new PSGetterPlayer(playerId); - } - - // -------------------------------------------- // - // OVERRIDE - // -------------------------------------------- // - - @Override - public PS getPS() - { - return Mixin.getSenderPs(this.senderId); - } - -} diff --git a/src/com/massivecraft/massivecore/teleport/ScheduledTeleport.java b/src/com/massivecraft/massivecore/teleport/ScheduledTeleport.java index a1c6c1ac..6a972aff 100644 --- a/src/com/massivecraft/massivecore/teleport/ScheduledTeleport.java +++ b/src/com/massivecraft/massivecore/teleport/ScheduledTeleport.java @@ -12,11 +12,8 @@ public class ScheduledTeleport implements Runnable private final String teleporteeId; public String getTeleporteeId() { return this.teleporteeId; } - private final PSGetter destinationGetter; - public PSGetter getDestinationGetter() { return this.destinationGetter; } - - private final String destinationDesc; - public String getDestinationDesc() { return this.destinationDesc; } + private final Destination destination; + public Destination getDestination() { return this.destination; } private final int delaySeconds; public int getDelaySeconds() { return this.delaySeconds; } @@ -30,11 +27,10 @@ public class ScheduledTeleport implements Runnable // CONSTRUCT // -------------------------------------------- // - public ScheduledTeleport(String teleporteeId, PSGetter destinationGetter, String destinationDesc, int delaySeconds) + public ScheduledTeleport(String teleporteeId, Destination destination, int delaySeconds) { this.teleporteeId = teleporteeId; - this.destinationGetter = destinationGetter; - this.destinationDesc = destinationDesc; + this.destination = destination; this.delaySeconds = delaySeconds; this.dueMillis = 0; } @@ -69,7 +65,7 @@ public class ScheduledTeleport implements Runnable try { - Mixin.teleport(this.getTeleporteeId(), this.getDestinationGetter(), this.getDestinationDesc()); + Mixin.teleport(this.getTeleporteeId(), this.getDestination(), 0); } catch (TeleporterException e) {