89 lines
2.4 KiB
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();
|
|
}
|
|
}
|
|
}
|
|
} |