package eu.univento.core.api.events; import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerMoveEvent; import java.util.WeakHashMap; /** * @author Crislibaer */ public class MoveEventFilter implements Listener { public static class PlayerBlockMoveEvent extends PlayerMoveEvent { public PlayerBlockMoveEvent(PlayerMoveEvent pEvent) { super(pEvent.getPlayer(), pEvent.getFrom(), pEvent.getTo()); } } private static class BlockPosition { public int x; public int y; public int z; public World world; } private Server mServer; private WeakHashMap mLastPosition = new WeakHashMap<>(); public MoveEventFilter(Server pServer) { mServer = pServer; } @EventHandler public void onPlayerMove(PlayerMoveEvent pEvent) { if(pEvent.isCancelled() || pEvent instanceof PlayerBlockMoveEvent) { return; } BlockPosition lastPos = mLastPosition.get(pEvent.getPlayer()); Location currentPos = pEvent.getTo(); boolean fireEvent = false; if(lastPos == null) { lastPos = new BlockPosition(); mLastPosition.put(pEvent.getPlayer(), lastPos); fireEvent = true; } else if(lastPos.x != currentPos.getBlockX() || lastPos.z != currentPos.getBlockZ() || lastPos.y != currentPos.getBlockY()) { fireEvent = true; } else if(lastPos.world != currentPos.getWorld()) { fireEvent = true; } if(fireEvent) { // make sure that our event is synchronous assert !pEvent.isAsynchronous(); // fire event PlayerBlockMoveEvent event = new PlayerBlockMoveEvent(pEvent); mServer.getPluginManager().callEvent(event); // check event state and only update new position if event does not gets canceled if(!event.isCancelled()) { // update new position lastPos.world = currentPos.getWorld(); lastPos.x = currentPos.getBlockX(); lastPos.y = currentPos.getBlockY(); lastPos.z = currentPos.getBlockZ(); } } } }