package tc.oc.commons.bukkit.event; import org.bukkit.EntityLocation; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; import org.bukkit.event.player.PlayerMoveEvent; import tc.oc.commons.bukkit.util.BlockUtils; /** * Wraps PlayerMoveEvents that cross block boundaries. The from and to locations * are the same as the wrapped event, so the locations for consecutive coarse events * will not generally connect to each other. * * Cancelling a coarse event results in the player's position being reset to the * center of the block at the from location, with some adjustments to Y to try and * place them on the surface of the block. */ public class CoarsePlayerMoveEvent extends GeneralizingEvent { private static final HandlerList handlers = new HandlerList(); protected final Player player; protected final EntityLocation from; protected EntityLocation to; public CoarsePlayerMoveEvent(Event cause, Player player, EntityLocation from, EntityLocation to) { super(cause); this.player = player; this.from = from; this.to = to; } @Override public String toString() { return getClass().getSimpleName() + "{from=" + from + " to=" + to + " player=" + player + " cause=" + (getCause() == null ? null : getCause().getClass().getSimpleName()) + "}"; } public Player getPlayer() { return this.player; } @Override public Player getActor() { return getPlayer(); } public EntityLocation getFrom() { return this.from; } public EntityLocation getBlockFrom() { return BlockUtils.center(this.from); } public EntityLocation getTo() { return this.to; } public EntityLocation getBlockTo() { return BlockUtils.center(this.to); } public void setTo(EntityLocation newLoc) { if(this.cause instanceof PlayerMoveEvent) { ((PlayerMoveEvent) this.cause).setTo(newLoc); } } @Override public HandlerList getHandlers() { return handlers; } public static HandlerList getHandlerList() { return handlers; } }