Try to support MonsterEffect.JUMP

This commit is contained in:
Evenprime 2012-02-05 17:30:37 +01:00
parent fa4ca4a75f
commit 03688f6e86
6 changed files with 56 additions and 11 deletions

View File

@ -25,7 +25,10 @@ public interface NoCheatPlayer {
public float getSpeedAmplifier();
public float getJumpAmplifier();
public boolean isCreative();
public ExecutionHistory getExecutionHistory();
}

View File

@ -24,7 +24,7 @@ import cc.co.evenprime.bukkit.nocheat.config.Permissions;
public class BlockBreakCheckListener implements Listener, EventManager {
private final List<BlockBreakCheck> checks;
private final NoCheat plugin;
private final NoCheat plugin;
public BlockBreakCheckListener(NoCheat plugin) {
@ -33,14 +33,15 @@ public class BlockBreakCheckListener implements Listener, EventManager {
this.checks.add(new NoswingCheck(plugin));
this.checks.add(new ReachCheck(plugin));
this.checks.add(new DirectionCheck(plugin));
this.plugin = plugin;
}
@EventHandler(priority = EventPriority.LOWEST)
public void blockBreak(final BlockBreakEvent event) {
if(event.isCancelled()) return;
if(event.isCancelled())
return;
boolean cancelled = false;
@ -78,8 +79,9 @@ public class BlockBreakCheckListener implements Listener, EventManager {
@EventHandler(priority = EventPriority.MONITOR)
public void blockHit(final BlockDamageEvent event) {
if(event.isCancelled()) return;
if(event.isCancelled())
return;
NoCheatPlayer player = plugin.getPlayer(event.getPlayer());
BlockBreakData data = BlockBreakCheck.getData(player.getDataStore());

View File

@ -1,7 +1,6 @@
package cc.co.evenprime.bukkit.nocheat.checks.moving;
import java.util.Locale;
import cc.co.evenprime.bukkit.nocheat.NoCheat;
import cc.co.evenprime.bukkit.nocheat.NoCheatPlayer;
import cc.co.evenprime.bukkit.nocheat.actions.ParameterName;
@ -78,8 +77,19 @@ public class FlyingCheck extends MovingCheck {
resultHoriz *= 100;
double jumpAmplifier = player.getJumpAmplifier();
if(jumpAmplifier > data.lastJumpAmplifier) {
data.lastJumpAmplifier = jumpAmplifier;
}
double speedLimitVertical = ccmoving.flyingSpeedLimitVertical * data.lastJumpAmplifier;
if(data.from.y >= data.to.y && data.lastJumpAmplifier > 0) {
data.lastJumpAmplifier--;
}
// super simple, just check distance compared to max distance
resultVert = Math.max(0.0D, yDistance - data.vertFreedom - ccmoving.flyingSpeedLimitVertical) * 100;
resultVert = Math.max(0.0D, yDistance - data.vertFreedom - speedLimitVertical) * 100;
result = resultHoriz + resultVert;

View File

@ -32,6 +32,7 @@ public class MovingData implements DataItem {
public int morePacketsFailed;
public int jumpPhase;
public double lastJumpAmplifier;
public final PreciseLocation runflySetBackPoint = new PreciseLocation();

View File

@ -62,7 +62,7 @@ public class RunningCheck extends MovingCheck {
PreciseLocation newToLocation = null;
final double resultHoriz = Math.max(0.0D, checkHorizontal(player, data, CheckUtil.isLiquid(fromType) && CheckUtil.isLiquid(toType), horizontalDistance, cc));
final double resultVert = Math.max(0.0D, checkVertical(data, fromOnGround, toOnGround, cc));
final double resultVert = Math.max(0.0D, checkVertical(player, data, fromOnGround, toOnGround, cc));
final double result = (resultHoriz + resultVert) * 100;
@ -214,21 +214,34 @@ public class RunningCheck extends MovingCheck {
* Calculate if and how much the player "failed" this check.
*
*/
private double checkVertical(final MovingData data, final boolean fromOnGround, final boolean toOnGround, final MovingConfig cc) {
private double checkVertical(final NoCheatPlayer player, final MovingData data, final boolean fromOnGround, final boolean toOnGround, final MovingConfig cc) {
// How much higher did the player move than expected??
double distanceAboveLimit = 0.0D;
double limit = data.vertFreedom + cc.jumpheight;
double jumpAmplifier = player.getJumpAmplifier();
if(jumpAmplifier > data.lastJumpAmplifier) {
data.lastJumpAmplifier = jumpAmplifier;
}
if(data.jumpPhase > jumpingLimit) {
double limit = data.vertFreedom + cc.jumpheight;
limit *= data.lastJumpAmplifier;
if(data.jumpPhase > jumpingLimit + data.lastJumpAmplifier) {
limit -= (data.jumpPhase - jumpingLimit) * 0.15D;
}
distanceAboveLimit = data.to.y - data.runflySetBackPoint.y - limit;
if(distanceAboveLimit > 0) {
data.checknamesuffix = "vertical";
}
if(toOnGround || fromOnGround) {
data.lastJumpAmplifier = 0;
}
return distanceAboveLimit;
}

View File

@ -77,6 +77,22 @@ public class NoCheatPlayerImpl implements NoCheatPlayer {
}
}
@Override
public float getJumpAmplifier() {
EntityPlayer ep = ((CraftPlayer) player).getHandle();
if(ep.hasEffect(MobEffectList.JUMP)) {
int amp = ep.getEffect(MobEffectList.JUMP).getAmplifier();
// Very rough estimates only
if(amp > 20) {
return 1.5F * (float) (ep.getEffect(MobEffectList.JUMP).getAmplifier() + 1);
} else {
return 1.2F * (float) (ep.getEffect(MobEffectList.JUMP).getAmplifier() + 1);
}
} else {
return 1.0F;
}
}
public boolean isSprinting() {
return player.isSprinting();
}