Core/src/eu/univento/core/api/events/MoveEventFilter.java

89 lines
2.4 KiB
Java

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<Player, BlockPosition> 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();
}
}
}
}