Treat small range teleports differently. [Ticket: BukkitDev-452]

This commit is contained in:
asofold 2013-02-26 17:52:56 +01:00
parent ac048474b7
commit 62102c7d8b

View File

@ -828,25 +828,55 @@ public class MovingListener extends CheckListener implements TickListener, IRemo
data.onSetBack(teleported); data.onSetBack(teleported);
} else { } else {
// Only if it wasn't NoCheatPlus, drop data from more packets check. // Only if it wasn't NoCheatPlus, drop data from more packets check.
if (!event.isCancelled()){ if (to != null && !event.isCancelled()){
// Normal teleport. // Normal teleport.
ref = to;
double fallDistance = data.noFallFallDistance; // Detect small distance teleports.
data.clearMorePacketsData(); boolean smallRange = false;
data.clearFlyData();
data.resetPositions(to); final double margin = 0.1;
data.setSetBack(to); final Location from = event.getFrom();
// TODO: How to account for plugins that reset the fall distance here?
if (fallDistance > 1.0 && fallDistance - player.getFallDistance() > 0.0){ if (event.getCause() == TeleportCause.UNKNOWN){
// Reset fall distance if set so in the config. // Check special small range teleports (moved too quickly).
if (!MovingConfig.getConfig(player).noFallTpReset){ if (from != null && from.getWorld().equals(to.getWorld())){
// (Set fall distance if set to not reset.) if (CheckUtils.distance(from, to) < margin){
player.setFallDistance((float) fallDistance); smallRange = true;
}
else if (data.toX != Double.MAX_VALUE && data.hasSetBack()){
final Location setBack = data.getSetBack(to);
if (CheckUtils.distance(to.getX(), to.getY(), to.getZ(), setBack.getX(), setBack.getY(), setBack.getZ()) < margin){
smallRange = true;
}
}
} }
} }
if (event.getCause() == TeleportCause.ENDER_PEARL){
// Prevent NoFall violations for ender-pearls. if (smallRange){
data.noFallSkipAirCheck = true; // Very small range teleport, keep set back etc.
ref = to;
}
else{
// "real" teleport
ref = to;
double fallDistance = data.noFallFallDistance;
data.clearMorePacketsData();
data.clearFlyData();
data.resetPositions(to);
data.setSetBack(to);
// TODO: How to account for plugins that reset the fall distance here?
if (fallDistance > 1.0 && fallDistance - player.getFallDistance() > 0.0){
// Reset fall distance if set so in the config.
if (!MovingConfig.getConfig(player).noFallTpReset){
// (Set fall distance if set to not reset.)
player.setFallDistance((float) fallDistance);
}
}
if (event.getCause() == TeleportCause.ENDER_PEARL){
// Prevent NoFall violations for ender-pearls.
data.noFallSkipAirCheck = true;
}
data.sfHoverTicks = -1; // Important against concurrent modification exception.
} }
} }
else{ else{
@ -860,8 +890,8 @@ public class MovingListener extends CheckListener implements TickListener, IRemo
// Reset stuff. // Reset stuff.
Combined.resetYawRate(player, ref.getYaw(), System.currentTimeMillis(), true); Combined.resetYawRate(player, ref.getYaw(), System.currentTimeMillis(), true);
data.resetTeleported(); data.resetTeleported();
// Prevent further moving processing for nested events.
processingEvents.remove(player.getName()); processingEvents.remove(player.getName());
data.sfHoverTicks = -1; // Important against concurrent modification exception.
} }
/** /**