Workaround for placing blocks below yourself

This commit is contained in:
Evenprime 2011-08-22 13:39:03 +02:00
parent 6a7e7d239f
commit 911d62a411
4 changed files with 67 additions and 3 deletions

View File

@ -3,7 +3,7 @@ name: NoCheat
author: Evenprime
main: cc.co.evenprime.bukkit.nocheat.NoCheat
version: 1.14c
version: 1.14d
softdepend: [ Permissions, CraftIRC ]

View File

@ -9,6 +9,7 @@ import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.event.Listener;
import org.bukkit.event.Event.Priority;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.plugin.PluginManager;
import org.bukkit.util.Vector;
@ -22,6 +23,7 @@ import cc.co.evenprime.bukkit.nocheat.actions.LogAction;
import cc.co.evenprime.bukkit.nocheat.config.NoCheatConfiguration;
import cc.co.evenprime.bukkit.nocheat.data.MovingData;
import cc.co.evenprime.bukkit.nocheat.data.PermissionData;
import cc.co.evenprime.bukkit.nocheat.listeners.MovingBlockMonitor;
import cc.co.evenprime.bukkit.nocheat.listeners.MovingPlayerListener;
import cc.co.evenprime.bukkit.nocheat.listeners.MovingPlayerMonitor;
@ -263,6 +265,36 @@ public class MovingCheck extends Check {
data.maxYVelocity += v.getY();
}
}
/** An attempt to work around lag during tower building **/
public void blockPlaced(BlockPlaceEvent event) {
Player player = event.getPlayer();
MovingData data = plugin.getDataManager().getMovingData(player);
if(event.getBlockPlaced() == null || data.setBackPoint == null) {
return;
}
Location lblock = event.getBlockPlaced().getLocation();
Location lplayer = player.getLocation();
if(Math.abs(lplayer.getBlockX() - lblock.getBlockX()) <= 1 && Math.abs(lplayer.getBlockZ() - lblock.getBlockZ()) <= 1 && lplayer.getBlockY() - lblock.getBlockY() >= 0 && lplayer.getBlockY() - lblock.getBlockY()<= 2) {
int type = helper.types[event.getBlockPlaced().getTypeId()];
if(helper.isSolid(type) || helper.isLiquid(type)) {
if(lblock.getBlockY()+1 >= data.setBackPoint.getY()) {
data.setBackPoint.setY(lblock.getBlockY()+1);
data.jumpPhase = 0;
}
}
}
}
/**
* Perform actions that were specified in the config file
@ -399,13 +431,17 @@ public class MovingCheck extends Check {
PluginManager pm = Bukkit.getServer().getPluginManager();
Listener movingPlayerMonitor = new MovingPlayerMonitor(plugin.getDataManager(), this);
Listener movingBlockMonitor = new MovingBlockMonitor(this);
// Register listeners for moving check
pm.registerEvent(Event.Type.PLAYER_MOVE, new MovingPlayerListener(plugin.getDataManager(), this), Priority.Lowest, plugin);
pm.registerEvent(Event.Type.PLAYER_MOVE, movingPlayerMonitor, Priority.Monitor, plugin);
pm.registerEvent(Event.Type.BLOCK_PLACE, movingBlockMonitor, Priority.Monitor, plugin);
pm.registerEvent(Event.Type.PLAYER_TELEPORT, movingPlayerMonitor, Priority.Monitor, plugin);
pm.registerEvent(Event.Type.PLAYER_PORTAL, movingPlayerMonitor, Priority.Monitor, plugin);
pm.registerEvent(Event.Type.PLAYER_RESPAWN, movingPlayerMonitor, Priority.Monitor, plugin);
pm.registerEvent(Event.Type.PLAYER_VELOCITY, movingPlayerMonitor, Priority.Monitor, plugin);
}
}

View File

@ -150,7 +150,7 @@ public class MovingEventHelper {
return result;
}
private final boolean isSolid(int value) {
public final boolean isSolid(int value) {
return (value & SOLID) == SOLID;
}

View File

@ -0,0 +1,28 @@
package cc.co.evenprime.bukkit.nocheat.listeners;
import org.bukkit.event.block.BlockListener;
import org.bukkit.event.block.BlockPlaceEvent;
import cc.co.evenprime.bukkit.nocheat.checks.MovingCheck;
/**
* Handle events for all Block related events
*
* @author Evenprime
*
*/
public class MovingBlockMonitor extends BlockListener {
private final MovingCheck check;
public MovingBlockMonitor(MovingCheck check) {
this.check = check;
}
@Override
public void onBlockPlace(BlockPlaceEvent event) {
if(!event.isCancelled())
check.blockPlaced(event);
}
}