80 lines
2.5 KiB
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();
|
|
}
|
|
}
|
|
}
|
|
} |