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

80 lines
2.5 KiB
Java

/*
* Copyright (c) 2017 univento.eu - All rights reserved
* You are not allowed to use, distribute or modify this code
*/
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 final Server mServer;
private final 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();
}
}
}
}