mirror of
https://github.com/NoCheatPlus/NoCheatPlus.git
synced 2024-09-27 14:13:11 +02:00
[BLEEDING] First attempt to make slime blocks work.
This commit is contained in:
parent
a51965c57d
commit
3eab23ae92
@ -324,6 +324,11 @@ public class MCAccessBukkit implements MCAccess, BlockPropertiesSetup{
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean dealFallDamageFiresAnEvent() {
|
||||
return AlmostBoolean.NO; // Assumption.
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(Player player) {
|
||||
// // TODO: Consider using reflection (detect CraftPlayer, access EntityPlayer + check if possible (!), use flags for if valid or invalid.)
|
||||
|
@ -24,145 +24,150 @@ import fr.neatmonster.nocheatplus.utilities.BlockCache;
|
||||
import fr.neatmonster.nocheatplus.utilities.ReflectionUtil;
|
||||
|
||||
public class MCAccessCB2512 implements MCAccess{
|
||||
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB2512(){
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_4_5.", new String[]{"Entity" , "dead"});
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_4_5.Block.class,
|
||||
new String[]{"v", "w", "x", "y", "z", "A"}, double.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
return "1.4.5";
|
||||
}
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB2512(){
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_4_5.", new String[]{"Entity" , "dead"});
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_4_5.Block.class,
|
||||
new String[]{"v", "w", "x", "y", "z", "A"}, double.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB2512";
|
||||
}
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
return "1.4.5";
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB2512";
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB2512(world);
|
||||
}
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_4_5.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else return entityHeight;
|
||||
}
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB2512(world);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isSolid());
|
||||
}
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_4_5.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else return entityHeight;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isLiquid());
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isSolid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isLiquid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) return AlmostBoolean.NO;
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()){
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) return AlmostBoolean.YES;
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) return AlmostBoolean.NO;
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()){
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) return AlmostBoolean.YES;
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (int) Math.round(damage));
|
||||
}
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0 ;
|
||||
}
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (int) Math.round(damage));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0 ;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
mcPlayer.deathTicks = deathTicks;
|
||||
mcPlayer.dead = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
switch(mat){
|
||||
case SAND:
|
||||
case GRAVEL:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
switch(mat){
|
||||
case SAND:
|
||||
case GRAVEL:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean dealFallDamageFiresAnEvent() {
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
@ -24,145 +24,150 @@ import fr.neatmonster.nocheatplus.utilities.BlockCache;
|
||||
import fr.neatmonster.nocheatplus.utilities.ReflectionUtil;
|
||||
|
||||
public class MCAccessCB2545 implements MCAccess{
|
||||
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB2545(){
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_4_6.", new String[]{"Entity" , "dead"});
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_4_6.Block.class,
|
||||
new String[]{"v", "w", "x", "y", "z", "A"}, double.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
return "1.4.6";
|
||||
}
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB2545(){
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_4_6.", new String[]{"Entity" , "dead"});
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_4_6.Block.class,
|
||||
new String[]{"v", "w", "x", "y", "z", "A"}, double.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB2545";
|
||||
}
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
return "1.4.6";
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB2545";
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB2545(world);
|
||||
}
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_4_6.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else return entityHeight;
|
||||
}
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB2545(world);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isSolid());
|
||||
}
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_4_6.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else return entityHeight;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isLiquid());
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isSolid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isLiquid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) return AlmostBoolean.NO;
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()){
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) return AlmostBoolean.YES;
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) return AlmostBoolean.NO;
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()){
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) return AlmostBoolean.YES;
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (int) Math.round(damage));
|
||||
}
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0 ;
|
||||
}
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (int) Math.round(damage));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0 ;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
mcPlayer.deathTicks = deathTicks;
|
||||
mcPlayer.dead = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
switch(mat){
|
||||
case SAND:
|
||||
case GRAVEL:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
switch(mat){
|
||||
case SAND:
|
||||
case GRAVEL:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean dealFallDamageFiresAnEvent() {
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
@ -24,146 +24,151 @@ import fr.neatmonster.nocheatplus.utilities.BlockCache;
|
||||
import fr.neatmonster.nocheatplus.utilities.ReflectionUtil;
|
||||
|
||||
public class MCAccessCB2602 implements MCAccess{
|
||||
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB2602(){
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_4_R1.", new String[]{"Entity" , "dead"});
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_4_R1.Block.class,
|
||||
new String[]{"v", "w", "x", "y", "z", "A"}, double.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
// 1_4_R1
|
||||
return "1.4.7";
|
||||
}
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB2602(){
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_4_R1.", new String[]{"Entity" , "dead"});
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_4_R1.Block.class,
|
||||
new String[]{"v", "w", "x", "y", "z", "A"}, double.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB2602";
|
||||
}
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
// 1_4_R1
|
||||
return "1.4.7";
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB2602";
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB2602(world);
|
||||
}
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_4_R1.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else return entityHeight;
|
||||
}
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB2602(world);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isSolid());
|
||||
}
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_4_R1.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else return entityHeight;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isLiquid());
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isSolid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isLiquid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) return AlmostBoolean.NO;
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()){
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) return AlmostBoolean.YES;
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) return AlmostBoolean.NO;
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()){
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) return AlmostBoolean.YES;
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (int) Math.round(damage));
|
||||
}
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0 ;
|
||||
}
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (int) Math.round(damage));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0 ;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
mcPlayer.deathTicks = deathTicks;
|
||||
mcPlayer.dead = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
switch(mat){
|
||||
case SAND:
|
||||
case GRAVEL:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
switch(mat){
|
||||
case SAND:
|
||||
case GRAVEL:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean dealFallDamageFiresAnEvent() {
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
@ -24,147 +24,152 @@ import fr.neatmonster.nocheatplus.utilities.BlockCache;
|
||||
import fr.neatmonster.nocheatplus.utilities.ReflectionUtil;
|
||||
|
||||
public class MCAccessCB2645 implements MCAccess{
|
||||
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB2645(){
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_5_R1.", new String[]{"Entity" , "dead"});
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_5_R1.Block.class,
|
||||
new String[]{"u", "v", "w", "x", "y", "z"}, double.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
// 1_5_R1
|
||||
return "1.5";
|
||||
}
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB2645(){
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_5_R1.", new String[]{"Entity" , "dead"});
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_5_R1.Block.class,
|
||||
new String[]{"u", "v", "w", "x", "y", "z"}, double.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB2645";
|
||||
}
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
// 1_5_R1
|
||||
return "1.5";
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB2645";
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB2645(world);
|
||||
}
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_5_R1.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else return entityHeight;
|
||||
}
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB2645(world);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isSolid());
|
||||
}
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_5_R1.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else return entityHeight;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isLiquid());
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isSolid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isLiquid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) return AlmostBoolean.NO;
|
||||
// TODO: Does this need a method call for the "real" box? Might be no problem during moving events, though.
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()){
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) return AlmostBoolean.YES;
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) return AlmostBoolean.NO;
|
||||
// TODO: Does this need a method call for the "real" box? Might be no problem during moving events, though.
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()){
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) return AlmostBoolean.YES;
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (int) Math.round(damage));
|
||||
}
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0 ;
|
||||
}
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (int) Math.round(damage));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0 ;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
mcPlayer.deathTicks = deathTicks;
|
||||
mcPlayer.dead = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
switch(mat){
|
||||
case SAND:
|
||||
case GRAVEL:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
switch(mat){
|
||||
case SAND:
|
||||
case GRAVEL:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean dealFallDamageFiresAnEvent() {
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
@ -24,149 +24,154 @@ import fr.neatmonster.nocheatplus.utilities.BlockCache;
|
||||
import fr.neatmonster.nocheatplus.utilities.ReflectionUtil;
|
||||
|
||||
public class MCAccessCB2691 implements MCAccess{
|
||||
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB2691(){
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_5_R2.", new String[]{"Entity" , "dead"});
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_5_R2.Block.class,
|
||||
new String[]{"u", "v", "w", "x", "y", "z"}, double.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
// 1_5_R2
|
||||
return "1.5.1";
|
||||
}
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB2691(){
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_5_R2.", new String[]{"Entity" , "dead"});
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_5_R2.Block.class,
|
||||
new String[]{"u", "v", "w", "x", "y", "z"}, double.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB2691";
|
||||
}
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
// 1_5_R2
|
||||
return "1.5.1";
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB2691";
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB2691(world);
|
||||
}
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_5_R2.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else {
|
||||
return entityHeight;
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB2691(world);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isSolid());
|
||||
}
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_5_R2.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else {
|
||||
return entityHeight;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isLiquid());
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isSolid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isLiquid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) return AlmostBoolean.NO;
|
||||
// TODO: Does this need a method call for the "real" box? Might be no problem during moving events, though.
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()){
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) return AlmostBoolean.YES;
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) return AlmostBoolean.NO;
|
||||
// TODO: Does this need a method call for the "real" box? Might be no problem during moving events, though.
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()){
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) return AlmostBoolean.YES;
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (int) Math.round(damage));
|
||||
}
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0 ;
|
||||
}
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (int) Math.round(damage));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0 ;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
mcPlayer.deathTicks = deathTicks;
|
||||
mcPlayer.dead = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
switch(mat){
|
||||
case SAND:
|
||||
case GRAVEL:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
switch(mat){
|
||||
case SAND:
|
||||
case GRAVEL:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean dealFallDamageFiresAnEvent() {
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
@ -24,148 +24,153 @@ import fr.neatmonster.nocheatplus.utilities.BlockCache;
|
||||
import fr.neatmonster.nocheatplus.utilities.ReflectionUtil;
|
||||
|
||||
public class MCAccessCB2763 implements MCAccess{
|
||||
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB2763(){
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_5_R3.", new String[]{"Entity" , "dead"});
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_5_R3.Block.class,
|
||||
new String[]{"u", "v", "w", "x", "y", "z"}, double.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
// 1_5_R3
|
||||
return "1.5.2";
|
||||
}
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB2763(){
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_5_R3.", new String[]{"Entity" , "dead"});
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_5_R3.Block.class,
|
||||
new String[]{"u", "v", "w", "x", "y", "z"}, double.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB2763";
|
||||
}
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
// 1_5_R3
|
||||
return "1.5.2";
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB2763";
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB2763(world);
|
||||
}
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_5_R3.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else return entityHeight;
|
||||
}
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB2763(world);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isSolid());
|
||||
}
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_5_R3.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else return entityHeight;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isLiquid());
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isSolid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isLiquid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) return AlmostBoolean.NO;
|
||||
// TODO: Does this need a method call for the "real" box? Might be no problem during moving events, though.
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()){
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) return AlmostBoolean.YES;
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) return AlmostBoolean.NO;
|
||||
// TODO: Does this need a method call for the "real" box? Might be no problem during moving events, though.
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()){
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) return AlmostBoolean.YES;
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (int) Math.round(damage));
|
||||
}
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0 ;
|
||||
}
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (int) Math.round(damage));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0 ;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
mcPlayer.deathTicks = deathTicks;
|
||||
mcPlayer.dead = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
// TODO: TEST: return mat.hasGravity();
|
||||
switch(mat){
|
||||
case SAND:
|
||||
case GRAVEL:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
// TODO: TEST: return mat.hasGravity();
|
||||
switch(mat){
|
||||
case SAND:
|
||||
case GRAVEL:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean dealFallDamageFiresAnEvent() {
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
@ -24,142 +24,147 @@ import fr.neatmonster.nocheatplus.utilities.BlockCache;
|
||||
import fr.neatmonster.nocheatplus.utilities.ReflectionUtil;
|
||||
|
||||
public class MCAccessCB2794 implements MCAccess{
|
||||
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB2794(){
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_6_R1.", new String[]{"Entity" , "dead"});
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_6_R1.Block.class,
|
||||
new String[]{"u", "v", "w", "x", "y", "z"}, double.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
// 1_6_R1
|
||||
return "1.6.1";
|
||||
}
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB2794(){
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_6_R1.", new String[]{"Entity" , "dead"});
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_6_R1.Block.class,
|
||||
new String[]{"u", "v", "w", "x", "y", "z"}, double.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB2794";
|
||||
}
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
// 1_6_R1
|
||||
return "1.6.1";
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB2794";
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB2794(world);
|
||||
}
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_6_R1.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else return entityHeight;
|
||||
}
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB2794(world);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isSolid());
|
||||
}
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_6_R1.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else return entityHeight;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isLiquid());
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isSolid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isLiquid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) return AlmostBoolean.NO;
|
||||
// TODO: Does this need a method call for the "real" box? Might be no problem during moving events, though.
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()){
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) return AlmostBoolean.YES;
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) return AlmostBoolean.NO;
|
||||
// TODO: Does this need a method call for the "real" box? Might be no problem during moving events, though.
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()){
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) return AlmostBoolean.YES;
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (float) damage);
|
||||
}
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0.0f ;
|
||||
}
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (float) damage);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0.0f ;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
mcPlayer.deathTicks = deathTicks;
|
||||
mcPlayer.dead = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
// TODO: Test/check.
|
||||
return mat.hasGravity();
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
// TODO: Test/check.
|
||||
return mat.hasGravity();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean dealFallDamageFiresAnEvent() {
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
@ -24,143 +24,148 @@ import fr.neatmonster.nocheatplus.utilities.BlockCache;
|
||||
import fr.neatmonster.nocheatplus.utilities.ReflectionUtil;
|
||||
|
||||
public class MCAccessCB2808 implements MCAccess{
|
||||
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB2808(){
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_6_R2.", new String[]{"Entity" , "dead"});
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_6_R2.Block.class,
|
||||
new String[]{"u", "v", "w", "x", "y", "z"}, double.class);
|
||||
// TODO: Nail it down further.
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
// 1_6_R2
|
||||
return "1.6.2";
|
||||
}
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB2808(){
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_6_R2.", new String[]{"Entity" , "dead"});
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_6_R2.Block.class,
|
||||
new String[]{"u", "v", "w", "x", "y", "z"}, double.class);
|
||||
// TODO: Nail it down further.
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB2808";
|
||||
}
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
// 1_6_R2
|
||||
return "1.6.2";
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB2808";
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB2808(world);
|
||||
}
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_6_R2.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else return entityHeight;
|
||||
}
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB2808(world);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isSolid());
|
||||
}
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_6_R2.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else return entityHeight;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isLiquid());
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isSolid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isLiquid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) return AlmostBoolean.NO;
|
||||
// TODO: Does this need a method call for the "real" box? Might be no problem during moving events, though.
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()){
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) return AlmostBoolean.YES;
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) return AlmostBoolean.NO;
|
||||
// TODO: Does this need a method call for the "real" box? Might be no problem during moving events, though.
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()){
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) return AlmostBoolean.YES;
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (float) damage);
|
||||
}
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0.0f ;
|
||||
}
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (float) damage);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0.0f ;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
mcPlayer.deathTicks = deathTicks;
|
||||
mcPlayer.dead = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
// TODO: Test/check.
|
||||
return mat.hasGravity();
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
// TODO: Test/check.
|
||||
return mat.hasGravity();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean dealFallDamageFiresAnEvent() {
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
@ -24,144 +24,149 @@ import fr.neatmonster.nocheatplus.utilities.BlockCache;
|
||||
import fr.neatmonster.nocheatplus.utilities.ReflectionUtil;
|
||||
|
||||
public class MCAccessCB2882 implements MCAccess{
|
||||
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB2882(){
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_6_R3.", new String[]{"Entity" , "dead"});
|
||||
// block bounds, original: minX, maxX, minY, maxY, minZ, maxZ
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_6_R3.Block.class,
|
||||
new String[]{"u", "v", "w", "x", "y", "z"}, double.class);
|
||||
// TODO: Nail it down further.
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
// 1_6_R3
|
||||
return "1.6.4";
|
||||
}
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB2882(){
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_6_R3.", new String[]{"Entity" , "dead"});
|
||||
// block bounds, original: minX, maxX, minY, maxY, minZ, maxZ
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_6_R3.Block.class,
|
||||
new String[]{"u", "v", "w", "x", "y", "z"}, double.class);
|
||||
// TODO: Nail it down further.
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB2882";
|
||||
}
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
// 1_6_R3
|
||||
return "1.6.4";
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB2882";
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB2882(world);
|
||||
}
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_6_R3.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else return entityHeight;
|
||||
}
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB2882(world);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isSolid());
|
||||
}
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_6_R3.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else return entityHeight;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isLiquid());
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isSolid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.byId[id];
|
||||
if (block == null || block.material == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.material.isLiquid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) return AlmostBoolean.NO;
|
||||
// TODO: Does this need a method call for the "real" box? Might be no problem during moving events, though.
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()){
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) return AlmostBoolean.YES;
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) return AlmostBoolean.NO;
|
||||
// TODO: Does this need a method call for the "real" box? Might be no problem during moving events, though.
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()){
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) return AlmostBoolean.YES;
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (float) damage);
|
||||
}
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0.0f ;
|
||||
}
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (float) damage);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0.0f ;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
mcPlayer.deathTicks = deathTicks;
|
||||
mcPlayer.dead = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
// TODO: Test/check.
|
||||
return mat.hasGravity();
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
// TODO: Test/check.
|
||||
return mat.hasGravity();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean dealFallDamageFiresAnEvent() {
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
@ -24,144 +24,149 @@ import fr.neatmonster.nocheatplus.utilities.BlockCache;
|
||||
import fr.neatmonster.nocheatplus.utilities.ReflectionUtil;
|
||||
|
||||
public class MCAccessCB2922 implements MCAccess{
|
||||
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB2922(){
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_7_R1.", new String[]{"Entity" , "dead"});
|
||||
// block bounds, original: minX, maxX, minY, maxY, minZ, maxZ
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_7_R1.Block.class,
|
||||
new String[]{"x", "y", "z", "A", "B", "C"}, double.class);
|
||||
// TODO: Nail it down further.
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
// 1_7_R1
|
||||
return "1.7.2";
|
||||
}
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB2922(){
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_7_R1.", new String[]{"Entity" , "dead"});
|
||||
// block bounds, original: minX, maxX, minY, maxY, minZ, maxZ
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_7_R1.Block.class,
|
||||
new String[]{"x", "y", "z", "A", "B", "C"}, double.class);
|
||||
// TODO: Nail it down further.
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB2922";
|
||||
}
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
// 1_7_R1
|
||||
return "1.7.2";
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB2922";
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB2922(world);
|
||||
}
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_7_R1.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else return entityHeight;
|
||||
}
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB2922(world);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.e(id);
|
||||
if (block == null || block.getMaterial() == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.getMaterial().isSolid());
|
||||
}
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_7_R1.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else return entityHeight;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.e(id);
|
||||
if (block == null || block.getMaterial() == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.getMaterial().isLiquid());
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.e(id);
|
||||
if (block == null || block.getMaterial() == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.getMaterial().isSolid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.e(id);
|
||||
if (block == null || block.getMaterial() == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.getMaterial().isLiquid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) return AlmostBoolean.NO;
|
||||
// TODO: Does this need a method call for the "real" box? Might be no problem during moving events, though.
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()){
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) return AlmostBoolean.YES;
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) return AlmostBoolean.NO;
|
||||
// TODO: Does this need a method call for the "real" box? Might be no problem during moving events, though.
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()){
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) return AlmostBoolean.YES;
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (float) damage);
|
||||
}
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0.0f ;
|
||||
}
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (float) damage);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0.0f ;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
mcPlayer.deathTicks = deathTicks;
|
||||
mcPlayer.dead = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
// TODO: Test/check.
|
||||
return mat.hasGravity();
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
// TODO: Test/check.
|
||||
return mat.hasGravity();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean dealFallDamageFiresAnEvent() {
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
@ -24,144 +24,149 @@ import fr.neatmonster.nocheatplus.utilities.BlockCache;
|
||||
import fr.neatmonster.nocheatplus.utilities.ReflectionUtil;
|
||||
|
||||
public class MCAccessCB3026 implements MCAccess{
|
||||
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB3026(){
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_7_R2.", new String[]{"Entity" , "dead"});
|
||||
// block bounds, original: minX, maxX, minY, maxY, minZ, maxZ
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_7_R2.Block.class,
|
||||
new String[]{"x", "y", "z", "A", "B", "C"}, double.class);
|
||||
// TODO: Nail it down further.
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
// 1_7_R2
|
||||
return "1.7.5";
|
||||
}
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB3026(){
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_7_R2.", new String[]{"Entity" , "dead"});
|
||||
// block bounds, original: minX, maxX, minY, maxY, minZ, maxZ
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_7_R2.Block.class,
|
||||
new String[]{"x", "y", "z", "A", "B", "C"}, double.class);
|
||||
// TODO: Nail it down further.
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB3026";
|
||||
}
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
// 1_7_R2
|
||||
return "1.7.5";
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB3026";
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB3026(world);
|
||||
}
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_7_R2.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else return entityHeight;
|
||||
}
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB3026(world);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.e(id);
|
||||
if (block == null || block.getMaterial() == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.getMaterial().isSolid());
|
||||
}
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_7_R2.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else return entityHeight;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.e(id);
|
||||
if (block == null || block.getMaterial() == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.getMaterial().isLiquid());
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.e(id);
|
||||
if (block == null || block.getMaterial() == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.getMaterial().isSolid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.e(id);
|
||||
if (block == null || block.getMaterial() == null) return AlmostBoolean.MAYBE;
|
||||
else return AlmostBoolean.match(block.getMaterial().isLiquid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) return AlmostBoolean.NO;
|
||||
// TODO: Does this need a method call for the "real" box? Might be no problem during moving events, though.
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()){
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) return AlmostBoolean.YES;
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) return AlmostBoolean.NO;
|
||||
// TODO: Does this need a method call for the "real" box? Might be no problem during moving events, though.
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()){
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) return AlmostBoolean.YES;
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
else return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (float) damage);
|
||||
}
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0.0f ;
|
||||
}
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (float) damage);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0.0f ;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
mcPlayer.deathTicks = deathTicks;
|
||||
mcPlayer.dead = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
// TODO: Test/check.
|
||||
return mat.hasGravity();
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
// TODO: Test/check.
|
||||
return mat.hasGravity();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean dealFallDamageFiresAnEvent() {
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
@ -24,163 +24,168 @@ import fr.neatmonster.nocheatplus.utilities.BlockCache;
|
||||
import fr.neatmonster.nocheatplus.utilities.ReflectionUtil;
|
||||
|
||||
public class MCAccessCB3043 implements MCAccess{
|
||||
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB3043() {
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_7_R3.", new String[] {"Entity" , "dead"});
|
||||
// block bounds, original: minX, maxX, minY, maxY, minZ, maxZ
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_7_R3.Block.class,
|
||||
new String[]{"x", "y", "z", "A", "B", "C"}, double.class);
|
||||
// TODO: Nail it down further.
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
// 1_7_R3
|
||||
return "1.7.8|1.7.9";
|
||||
}
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB3043() {
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_7_R3.", new String[] {"Entity" , "dead"});
|
||||
// block bounds, original: minX, maxX, minY, maxY, minZ, maxZ
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_7_R3.Block.class,
|
||||
new String[]{"x", "y", "z", "A", "B", "C"}, double.class);
|
||||
// TODO: Nail it down further.
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB3043";
|
||||
}
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
// 1_7_R3
|
||||
return "1.7.8|1.7.9";
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB3043";
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB3043(world);
|
||||
}
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_7_R3.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else return entityHeight;
|
||||
}
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB3043(world);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.e(id);
|
||||
if (block == null || block.getMaterial() == null) {
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
else {
|
||||
return AlmostBoolean.match(block.getMaterial().isSolid());
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_7_R3.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else return entityHeight;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.e(id);
|
||||
if (block == null || block.getMaterial() == null) {
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
else {
|
||||
return AlmostBoolean.match(block.getMaterial().isLiquid());
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.e(id);
|
||||
if (block == null || block.getMaterial() == null) {
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
else {
|
||||
return AlmostBoolean.match(block.getMaterial().isSolid());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.e(id);
|
||||
if (block == null || block.getMaterial() == null) {
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
else {
|
||||
return AlmostBoolean.match(block.getMaterial().isLiquid());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) return AlmostBoolean.NO;
|
||||
// TODO: Does this need a method call for the "real" box? Might be no problem during moving events, though.
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()) {
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) {
|
||||
return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
}
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) {
|
||||
return AlmostBoolean.YES;
|
||||
}
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) {
|
||||
return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
}
|
||||
else {
|
||||
return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) return AlmostBoolean.NO;
|
||||
// TODO: Does this need a method call for the "real" box? Might be no problem during moving events, though.
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()) {
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) {
|
||||
return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
}
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) {
|
||||
return AlmostBoolean.YES;
|
||||
}
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) {
|
||||
return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
}
|
||||
else {
|
||||
return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) {
|
||||
return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
}
|
||||
else {
|
||||
return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) {
|
||||
return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
}
|
||||
else {
|
||||
return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (float) damage);
|
||||
}
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (float) damage);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0.0f ;
|
||||
}
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0.0f ;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
mcPlayer.deathTicks = deathTicks;
|
||||
mcPlayer.dead = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
// TODO: Test/check.
|
||||
return mat.hasGravity();
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
// TODO: Test/check.
|
||||
return mat.hasGravity();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean dealFallDamageFiresAnEvent() {
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
@ -24,165 +24,170 @@ import fr.neatmonster.nocheatplus.utilities.BlockCache;
|
||||
import fr.neatmonster.nocheatplus.utilities.ReflectionUtil;
|
||||
|
||||
public class MCAccessCB3100 implements MCAccess{
|
||||
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB3100() {
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_7_R4.", new String[] {"Entity" , "dead"});
|
||||
// block bounds, original: minX, maxX, minY, maxY, minZ, maxZ
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_7_R4.Block.class,
|
||||
new String[]{"x", "y", "z", "A", "B", "C"}, double.class);
|
||||
// TODO: Nail it down further.
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
// 1_7_R4
|
||||
return "1.7.10";
|
||||
}
|
||||
/**
|
||||
* Constructor to let it fail.
|
||||
*/
|
||||
public MCAccessCB3100() {
|
||||
getCommandMap();
|
||||
ReflectionUtil.checkMembers("net.minecraft.server.v1_7_R4.", new String[] {"Entity" , "dead"});
|
||||
// block bounds, original: minX, maxX, minY, maxY, minZ, maxZ
|
||||
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_7_R4.Block.class,
|
||||
new String[]{"x", "y", "z", "A", "B", "C"}, double.class);
|
||||
// TODO: Nail it down further.
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB3100";
|
||||
}
|
||||
@Override
|
||||
public String getMCVersion() {
|
||||
// 1_7_R4
|
||||
return "1.7.10";
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
@Override
|
||||
public String getServerVersionTag() {
|
||||
return "CB3100";
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB3100(world);
|
||||
}
|
||||
@Override
|
||||
public CommandMap getCommandMap() {
|
||||
return ((CraftServer) Bukkit.getServer()).getCommandMap();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_7_R4.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else return entityHeight;
|
||||
}
|
||||
@Override
|
||||
public BlockCache getBlockCache(final World world) {
|
||||
return new BlockCacheCB3100(world);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.getById(id);
|
||||
if (block == null || block.getMaterial() == null) {
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
else {
|
||||
return AlmostBoolean.match(block.getMaterial().isSolid());
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public double getHeight(final Entity entity) {
|
||||
final net.minecraft.server.v1_7_R4.Entity mcEntity = ((CraftEntity) entity).getHandle();
|
||||
final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.height, mcEntity.boundingBox.e - mcEntity.boundingBox.b));
|
||||
if (entity instanceof LivingEntity) {
|
||||
return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight);
|
||||
} else return entityHeight;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.getById(id);
|
||||
if (block == null || block.getMaterial() == null) {
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
else {
|
||||
return AlmostBoolean.match(block.getMaterial().isLiquid());
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockSolid(final int id) {
|
||||
final Block block = Block.getById(id);
|
||||
if (block == null || block.getMaterial() == null) {
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
else {
|
||||
return AlmostBoolean.match(block.getMaterial().isSolid());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isBlockLiquid(final int id) {
|
||||
final Block block = Block.getById(id);
|
||||
if (block == null || block.getMaterial() == null) {
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
else {
|
||||
return AlmostBoolean.match(block.getMaterial().isLiquid());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) {
|
||||
return AlmostBoolean.NO;
|
||||
}
|
||||
// TODO: Does this need a method call for the "real" box? Might be no problem during moving events, though.
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()) {
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) {
|
||||
return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
}
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) {
|
||||
return AlmostBoolean.YES;
|
||||
}
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
@Override
|
||||
public double getWidth(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle().width;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) {
|
||||
return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
}
|
||||
else {
|
||||
return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public AlmostBoolean isIllegalBounds(final Player player) {
|
||||
final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (entityPlayer.dead) {
|
||||
return AlmostBoolean.NO;
|
||||
}
|
||||
// TODO: Does this need a method call for the "real" box? Might be no problem during moving events, though.
|
||||
final AxisAlignedBB box = entityPlayer.boundingBox;
|
||||
if (!entityPlayer.isSleeping()) {
|
||||
// This can not really test stance but height of bounding box.
|
||||
final double dY = Math.abs(box.e - box.b);
|
||||
if (dY > 1.8) {
|
||||
return AlmostBoolean.YES; // dY > 1.65D ||
|
||||
}
|
||||
if (dY < 0.1D && entityPlayer.length >= 0.1) {
|
||||
return AlmostBoolean.YES;
|
||||
}
|
||||
}
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) {
|
||||
return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
}
|
||||
else {
|
||||
return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public double getJumpAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.JUMP)) {
|
||||
return mcPlayer.getEffect(MobEffectList.JUMP).getAmplifier();
|
||||
}
|
||||
else {
|
||||
return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
@Override
|
||||
public double getFasterMovementAmplifier(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (mcPlayer.hasEffect(MobEffectList.FASTER_MOVEMENT)) {
|
||||
return mcPlayer.getEffect(MobEffectList.FASTER_MOVEMENT).getAmplifier();
|
||||
}
|
||||
else {
|
||||
return Double.NEGATIVE_INFINITY;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
@Override
|
||||
public int getInvulnerableTicks(final Player player) {
|
||||
return ((CraftPlayer) player).getHandle().invulnerableTicks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (float) damage);
|
||||
}
|
||||
@Override
|
||||
public void setInvulnerableTicks(final Player player, final int ticks) {
|
||||
((CraftPlayer) player).getHandle().invulnerableTicks = ticks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
@Override
|
||||
public void dealFallDamage(final Player player, final double damage) {
|
||||
((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (float) damage);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0.0f ;
|
||||
}
|
||||
@Override
|
||||
public boolean isComplexPart(final Entity entity) {
|
||||
return ((CraftEntity) entity).getHandle() instanceof EntityComplexPart;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
@Override
|
||||
public boolean shouldBeZombie(final Player player) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
return !mcPlayer.dead && mcPlayer.getHealth() <= 0.0f ;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDead(final Player player, final int deathTicks) {
|
||||
final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
mcPlayer.deathTicks = deathTicks;
|
||||
mcPlayer.dead = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
// TODO: Test/check.
|
||||
return mat.hasGravity();
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasGravity(final Material mat) {
|
||||
// TODO: Test/check.
|
||||
return mat.hasGravity();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean dealFallDamageFiresAnEvent() {
|
||||
return AlmostBoolean.MAYBE;
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
// // Main direction.
|
||||
// mcPlayer.yaw = LocUtil.correctYaw(mcPlayer.yaw);
|
||||
// mcPlayer.pitch = LocUtil.correctPitch(mcPlayer.pitch);
|
||||
// // Consider setting the lastYaw here too.
|
||||
// }
|
||||
|
||||
}
|
||||
|
@ -176,6 +176,11 @@ public class MCAccessCBDev implements MCAccess{
|
||||
return mat.hasGravity();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean dealFallDamageFiresAnEvent() {
|
||||
return AlmostBoolean.YES;
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void correctDirection(final Player player) {
|
||||
// final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle();
|
||||
|
@ -9,6 +9,7 @@ import org.bukkit.command.CommandMap;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
|
||||
|
||||
import fr.neatmonster.nocheatplus.compat.AlmostBoolean;
|
||||
import fr.neatmonster.nocheatplus.compat.bukkit.MCAccessBukkit;
|
||||
import fr.neatmonster.nocheatplus.utilities.BlockCache;
|
||||
|
||||
@ -53,4 +54,9 @@ public class MCAccessGlowstone extends MCAccessBukkit{
|
||||
((GlowPlayer) player).damage(damage, DamageCause.FALL);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AlmostBoolean dealFallDamageFiresAnEvent() {
|
||||
return AlmostBoolean.YES; // Assumption (it's native access).
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -13,7 +13,7 @@ import fr.neatmonster.nocheatplus.checks.CheckType;
|
||||
import fr.neatmonster.nocheatplus.checks.ViolationData;
|
||||
import fr.neatmonster.nocheatplus.checks.moving.MovingConfig;
|
||||
import fr.neatmonster.nocheatplus.checks.moving.MovingData;
|
||||
import fr.neatmonster.nocheatplus.checks.moving.MovingListener;
|
||||
import fr.neatmonster.nocheatplus.checks.moving.MovingUtil;
|
||||
import fr.neatmonster.nocheatplus.permissions.Permissions;
|
||||
import fr.neatmonster.nocheatplus.utilities.BlockProperties;
|
||||
import fr.neatmonster.nocheatplus.utilities.StringUtil;
|
||||
@ -46,7 +46,7 @@ public class Critical extends Check {
|
||||
if (mcFallDistance > 0.0 && data.debug && player.hasPermission(Permissions.ADMINISTRATION_DEBUG)) {
|
||||
final MovingData mData = MovingData.getData(player);
|
||||
|
||||
if (MovingListener.shouldCheckSurvivalFly(player, mData, mCc) && CheckType.MOVING_NOFALL.isEnabled(player)) {
|
||||
if (MovingUtil.shouldCheckSurvivalFly(player, mData, mCc) && CheckType.MOVING_NOFALL.isEnabled(player)) {
|
||||
// TODO: Set max y in MovingListener, to be independent of sf/nofall!
|
||||
player.sendMessage("Critical: fd=" + mcFallDistance + "(" + mData.noFallFallDistance +") y=" + loc.getY() + ((mData.hasSetBack() && mData.getSetBackY() < mData.noFallMaxY) ? (" jumped=" + StringUtil.fdec3.format(mData.noFallMaxY - mData.getSetBackY())): ""));
|
||||
}
|
||||
@ -61,7 +61,7 @@ public class Critical extends Check {
|
||||
// TODO: Skip near the highest jump height (needs check if head collided with something solid, which also detects low jump).
|
||||
if (dataM.sfLowJump || mcFallDistance < cc.criticalFallDistance && !BlockProperties.isResetCond(player, loc, mCc.yOnGround)) {
|
||||
final MovingConfig ccM = MovingConfig.getConfig(player);
|
||||
if (MovingListener.shouldCheckSurvivalFly(player, dataM, ccM)) {
|
||||
if (MovingUtil.shouldCheckSurvivalFly(player, dataM, ccM)) {
|
||||
data.criticalVL += 1.0;
|
||||
// Execute whatever actions are associated with this check and
|
||||
// the violation level and find out if we should cancel the event.
|
||||
|
@ -35,7 +35,7 @@ import fr.neatmonster.nocheatplus.checks.moving.LocationTrace.TraceEntry;
|
||||
import fr.neatmonster.nocheatplus.checks.moving.MediumLiftOff;
|
||||
import fr.neatmonster.nocheatplus.checks.moving.MovingConfig;
|
||||
import fr.neatmonster.nocheatplus.checks.moving.MovingData;
|
||||
import fr.neatmonster.nocheatplus.checks.moving.MovingListener;
|
||||
import fr.neatmonster.nocheatplus.checks.moving.MovingUtil;
|
||||
import fr.neatmonster.nocheatplus.compat.BridgeHealth;
|
||||
import fr.neatmonster.nocheatplus.components.JoinLeaveListener;
|
||||
import fr.neatmonster.nocheatplus.logging.Streams;
|
||||
@ -297,7 +297,7 @@ public class FightListener extends CheckListener implements JoinLeaveListener{
|
||||
if (hDist >= 0.23) {
|
||||
// TODO: Might need to check hDist relative to speed / modifiers.
|
||||
final MovingConfig mc = MovingConfig.getConfig(player);
|
||||
if (now <= mData.timeSprinting + mc.sprintingGrace && MovingListener.shouldCheckSurvivalFly(player, mData, mc)){
|
||||
if (now <= mData.timeSprinting + mc.sprintingGrace && MovingUtil.shouldCheckSurvivalFly(player, mData, mc)){
|
||||
// Judge as "lost sprint" problem.
|
||||
// TODO: What would mData.lostSprintCount > 0 mean here?
|
||||
mData.lostSprintCount = 7;
|
||||
@ -566,7 +566,7 @@ public class FightListener extends CheckListener implements JoinLeaveListener{
|
||||
if (damagedData.debug || mdata.debug) {
|
||||
NCPAPIProvider.getNoCheatPlusAPI().getLogManager().debug(Streams.TRACE_FILE, damagedPlayer.getName() + " received knockback level: " + level);
|
||||
}
|
||||
MovingListener.addVelocity(damagedPlayer, mdata, mcc, dir.getX(), vy, dir.getZ());
|
||||
mdata.addVelocity(damagedPlayer, mcc, dir.getX(), vy, dir.getZ());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -7,12 +7,15 @@ import org.bukkit.Location;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import fr.neatmonster.nocheatplus.NCPAPIProvider;
|
||||
import fr.neatmonster.nocheatplus.checks.access.ACheckData;
|
||||
import fr.neatmonster.nocheatplus.checks.access.CheckDataFactory;
|
||||
import fr.neatmonster.nocheatplus.checks.access.ICheckData;
|
||||
import fr.neatmonster.nocheatplus.logging.Streams;
|
||||
import fr.neatmonster.nocheatplus.utilities.ActionAccumulator;
|
||||
import fr.neatmonster.nocheatplus.utilities.ActionFrequency;
|
||||
import fr.neatmonster.nocheatplus.utilities.PlayerLocation;
|
||||
import fr.neatmonster.nocheatplus.utilities.TickTask;
|
||||
|
||||
/**
|
||||
* Player specific data for the moving checks.
|
||||
@ -119,7 +122,7 @@ public class MovingData extends ACheckData {
|
||||
public double verticalFreedom;
|
||||
public double verticalVelocity;
|
||||
public int verticalVelocityUsed = 0;
|
||||
|
||||
|
||||
/** Horizontal velocity modeled as an axis (always positive) */
|
||||
private final AxisVelocity horVel = new AxisVelocity();
|
||||
|
||||
@ -522,21 +525,13 @@ public class MovingData extends ACheckData {
|
||||
public void addHorizontalVelocity(final Velocity vel) {
|
||||
horVel.add(vel);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add vertical velocity (distance). <br>
|
||||
* @param vel
|
||||
*/
|
||||
public void addVerticalVelocity(final Velocity vel) {
|
||||
horVel.add(vel);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove all vertical and horizontal velocity.
|
||||
*/
|
||||
public void removeAllVelocity() {
|
||||
horVel.clear();
|
||||
// verVel.clear();
|
||||
// verVel.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -546,7 +541,7 @@ public class MovingData extends ACheckData {
|
||||
*/
|
||||
public void removeInvalidVelocity(final int tick) {
|
||||
horVel.removeInvalid(tick);
|
||||
// verVel.removeInvalid(tick);
|
||||
// verVel.removeInvalid(tick);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -555,7 +550,7 @@ public class MovingData extends ACheckData {
|
||||
public void clearActiveHorVel() {
|
||||
horVel.clearActive();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Clear only active horizontal velocity.
|
||||
*/
|
||||
@ -570,14 +565,14 @@ public class MovingData extends ACheckData {
|
||||
public boolean hasQueuedHorVel() {
|
||||
return horVel.hasQueued();
|
||||
}
|
||||
|
||||
// public boolean hasActiveVerVel() {
|
||||
// return verVel.hasActive();
|
||||
// }
|
||||
|
||||
// public boolean hasQueuedVerVel() {
|
||||
// return verVel.hasQueued();
|
||||
// }
|
||||
// public boolean hasActiveVerVel() {
|
||||
// return verVel.hasActive();
|
||||
// }
|
||||
|
||||
// public boolean hasQueuedVerVel() {
|
||||
// return verVel.hasQueued();
|
||||
// }
|
||||
|
||||
/**
|
||||
* Called for moving events, increase age of velocity, decrease amounts, check which entries are invalid. Both horizontal and vertical.
|
||||
@ -585,9 +580,9 @@ public class MovingData extends ACheckData {
|
||||
public void velocityTick() {
|
||||
// Horizontal velocity (intermediate concept).
|
||||
horVel.tick();
|
||||
|
||||
|
||||
// Vertical velocity (new concept).
|
||||
// verVel.tick();
|
||||
// verVel.tick();
|
||||
if (verticalVelocity <= 0.09D) {
|
||||
verticalVelocityUsed ++;
|
||||
verticalVelocityCounter--;
|
||||
@ -779,4 +774,50 @@ public class MovingData extends ACheckData {
|
||||
trace = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add velocity to internal book-keeping.
|
||||
* @param player
|
||||
* @param data
|
||||
* @param cc
|
||||
* @param vx
|
||||
* @param vy
|
||||
* @param vz
|
||||
*/
|
||||
public void addVelocity(final Player player, final MovingConfig cc, final double vx, final double vy, final double vz) {
|
||||
|
||||
final int tick = TickTask.getTick();
|
||||
removeInvalidVelocity(tick - cc.velocityActivationTicks);
|
||||
|
||||
if (debug) {
|
||||
NCPAPIProvider.getNoCheatPlusAPI().getLogManager().debug(Streams.TRACE_FILE, player.getName() + " new velocity: " + vx + ", " + vy + ", " + vz);
|
||||
}
|
||||
|
||||
boolean used = false;
|
||||
if (vy > 0D) {
|
||||
used = true;
|
||||
if (verticalFreedom <= 0.001 && verticalVelocityCounter >= 0) {
|
||||
verticalVelocity = 0;
|
||||
}
|
||||
verticalVelocity += vy;
|
||||
verticalFreedom += verticalVelocity;
|
||||
verticalVelocityCounter = Math.min(100, Math.max(verticalVelocityCounter, cc.velocityGraceTicks ) + 1 + (int) Math.round(vy * 10.0)); // 50;
|
||||
verticalVelocityUsed = 0;
|
||||
}
|
||||
|
||||
|
||||
if (vx != 0.0 && vz != 0.0) {
|
||||
final double newVal = Math.sqrt(vx * vx + vz * vz);
|
||||
used = true;
|
||||
final Velocity vel = new Velocity(tick, newVal, cc.velocityActivationCounter, Math.max(20, 1 + (int) Math.round(newVal * 10.0)));
|
||||
addHorizontalVelocity(vel);
|
||||
}
|
||||
|
||||
// Set dirty flag here.
|
||||
if (used) {
|
||||
sfDirty = true; // TODO: Only needed for vertical velocity? Get rid anyway :p.
|
||||
sfNoLowJump = true;
|
||||
}
|
||||
// TODO: clear accounting here ?
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -83,65 +83,6 @@ import fr.neatmonster.nocheatplus.utilities.build.BuildParameters;
|
||||
*/
|
||||
public class MovingListener extends CheckListener implements TickListener, IRemoveData, IHaveCheckType, INotifyReload, INeedConfig, JoinLeaveListener{
|
||||
|
||||
/**
|
||||
* Check if the player is to be checked by the survivalfly check.
|
||||
* @param player
|
||||
* @param data
|
||||
* @param cc
|
||||
* @return
|
||||
*/
|
||||
public static final boolean shouldCheckSurvivalFly(final Player player, final MovingData data, final MovingConfig cc) {
|
||||
return cc.survivalFlyCheck && !NCPExemptionManager.isExempted(player, CheckType.MOVING_SURVIVALFLY) && !player.hasPermission(Permissions.MOVING_SURVIVALFLY) &&
|
||||
(cc.ignoreCreative || player.getGameMode() != GameMode.CREATIVE) && !player.isFlying() && (cc.ignoreAllowFlight || !player.getAllowFlight());
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle an illegal move by a player, attempt to restore a valid location.
|
||||
* @param event
|
||||
* @param player
|
||||
* @param data
|
||||
*/
|
||||
public static void handleIllegalMove(final PlayerMoveEvent event, final Player player, final MovingData data)
|
||||
{
|
||||
// This might get extended to a check-like thing.
|
||||
boolean restored = false;
|
||||
final PlayerLocation pLoc = new PlayerLocation(NCPAPIProvider.getNoCheatPlusAPI().getMCAccess(), null);
|
||||
// (Mind that we don't set the block cache here).
|
||||
final Location loc = player.getLocation();
|
||||
if (!restored && data.hasSetBack()) {
|
||||
final Location setBack = data.getSetBack(loc);
|
||||
pLoc.set(setBack, player);
|
||||
if (!pLoc.isIllegal()) {
|
||||
event.setFrom(setBack);
|
||||
event.setTo(setBack);
|
||||
restored = true;
|
||||
}
|
||||
else {
|
||||
data.resetSetBack();
|
||||
}
|
||||
}
|
||||
if (!restored) {
|
||||
pLoc.set(loc, player);
|
||||
if (!pLoc.isIllegal()) {
|
||||
event.setFrom(loc);
|
||||
event.setTo(loc);
|
||||
restored = true;
|
||||
}
|
||||
}
|
||||
pLoc.cleanup();
|
||||
if (!restored) {
|
||||
// TODO: reset the bounding box of the player ?
|
||||
if (MovingConfig.getConfig(player).tempKickIllegal) {
|
||||
NCPAPIProvider.getNoCheatPlusAPI().denyLogin(player.getName(), 24L * 60L * 60L * 1000L);
|
||||
StaticLog.logSevere("[NCP] could not restore location for " + player.getName() + ", kicking them and deny login for 24 hours");
|
||||
} else {
|
||||
StaticLog.logSevere("[NCP] could not restore location for " + player.getName() + ", kicking them.");
|
||||
}
|
||||
CheckUtils.kickIllegalMove(player);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/** The instance of NoCheatPlus. */
|
||||
private final Plugin plugin = Bukkit.getPluginManager().getPlugin("NoCheatPlus"); // TODO
|
||||
|
||||
@ -238,7 +179,7 @@ public class MovingListener extends CheckListener implements TickListener, IRemo
|
||||
if (Math.abs(loc.getX() - 0.5 - block.getX()) <= 1D
|
||||
&& Math.abs(loc.getZ() - 0.5 - block.getZ()) <= 1D
|
||||
&& loc.getY() - blockY > 0D && loc.getY() - blockY < 2D
|
||||
&& (canJumpOffTop(mat) || BlockProperties.isLiquid(mat))) {
|
||||
&& (MovingUtil.canJumpOffTop(mat) || BlockProperties.isLiquid(mat))) {
|
||||
// The creative fly and/or survival fly check is enabled, the
|
||||
// block was placed below the player and is
|
||||
// solid, so do what we have to do.
|
||||
@ -248,16 +189,6 @@ public class MovingListener extends CheckListener implements TickListener, IRemo
|
||||
useLoc.setWorld(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Used for a workaround that resets the set-back for the case of jumping on just placed blocks.
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
private static boolean canJumpOffTop(final Material blockType) {
|
||||
// TODO: Test if this can be removed!
|
||||
return BlockProperties.isGround(blockType) || BlockProperties.isSolid(blockType);
|
||||
}
|
||||
|
||||
/**
|
||||
* We listen to this event to prevent player from flying by sending bed leaving packets.
|
||||
*
|
||||
@ -288,7 +219,7 @@ public class MovingListener extends CheckListener implements TickListener, IRemo
|
||||
final MovingData data = MovingData.getData(player);
|
||||
final MovingConfig cc = MovingConfig.getConfig(player);
|
||||
Location target = null;
|
||||
final boolean sfCheck = shouldCheckSurvivalFly(player, data, cc);
|
||||
final boolean sfCheck = MovingUtil.shouldCheckSurvivalFly(player, data, cc);
|
||||
if (sfCheck) {
|
||||
target = data.getSetBack(loc);
|
||||
}
|
||||
@ -452,7 +383,7 @@ public class MovingListener extends CheckListener implements TickListener, IRemo
|
||||
}
|
||||
// Check for illegal move and bounding box etc.
|
||||
if (moveInfo.from.isIllegal() || moveInfo.to.isIllegal()) {
|
||||
handleIllegalMove(event, player, data);
|
||||
MovingUtil.handleIllegalMove(event, player, data);
|
||||
moveInfo.cleanup();
|
||||
parkedInfo.add(moveInfo);
|
||||
return;
|
||||
@ -548,7 +479,7 @@ public class MovingListener extends CheckListener implements TickListener, IRemo
|
||||
// Check which fly check to use.
|
||||
final boolean checkCf;
|
||||
final boolean checkSf;
|
||||
if (shouldCheckSurvivalFly(player, data, cc)) {
|
||||
if (MovingUtil.shouldCheckSurvivalFly(player, data, cc)) {
|
||||
checkCf = false;
|
||||
checkSf = true;
|
||||
data.adjustWalkSpeed(player.getWalkSpeed(), tick, cc.speedGrace);
|
||||
@ -563,6 +494,17 @@ public class MovingListener extends CheckListener implements TickListener, IRemo
|
||||
else{
|
||||
checkCf = checkSf = false;
|
||||
}
|
||||
|
||||
boolean checkNf = true;
|
||||
if (checkSf || checkCf) {
|
||||
// Check jumping on things like slime blocks.
|
||||
if (to.getY() < from.getY() && player.getFallDistance() > 1f && (BlockProperties.getBlockFlags(pTo.getTypeIdBelow()) & BlockProperties.F_BOUNCE25) != 0L) {
|
||||
// Apply changes to NoFall and other.
|
||||
processTrampoline(player, pFrom, pTo, data, cc);
|
||||
// Skip NoFall.
|
||||
checkNf = false;
|
||||
}
|
||||
}
|
||||
|
||||
// Flying checks.
|
||||
if (checkSf) {
|
||||
@ -587,7 +529,10 @@ public class MovingListener extends CheckListener implements TickListener, IRemo
|
||||
// Only check if passable has not already set back.
|
||||
newTo = survivalFly.check(player, pFrom, pTo, data, cc, time);
|
||||
}
|
||||
final boolean checkNf = cc.noFallCheck && !NCPExemptionManager.isExempted(player, CheckType.MOVING_NOFALL) && !player.hasPermission(Permissions.MOVING_NOFALL);
|
||||
// Only check NoFall, if not already vetoed.
|
||||
if (checkNf) {
|
||||
checkNf = cc.noFallCheck && !NCPExemptionManager.isExempted(player, CheckType.MOVING_NOFALL) && !player.hasPermission(Permissions.MOVING_NOFALL);
|
||||
}
|
||||
if (newTo == null) {
|
||||
// Hover.
|
||||
// TODO: Could reset for from-on-ground as well, for not too big moves.
|
||||
@ -669,6 +614,32 @@ public class MovingListener extends CheckListener implements TickListener, IRemo
|
||||
parkedInfo.add(moveInfo);
|
||||
}
|
||||
|
||||
private void processTrampoline(final Player player, final PlayerLocation from, final PlayerLocation to, final MovingData data, final MovingConfig cc) {
|
||||
// TODO: Where to put...
|
||||
// TODO: Other side conditions (fluids, web)
|
||||
// TODO: Fake fall distance exploit (to bounce off slime blocks :p).
|
||||
// TODO: Confine further (depends on which checks are enabled, if possible to check, e.g. noFallMaxY).
|
||||
// Check for slime block below explicitly.
|
||||
// The center of the player must be above the block.
|
||||
if (cc.debug) {
|
||||
NCPAPIProvider.getNoCheatPlusAPI().getLogManager().debug(Streams.TRACE_FILE, player.getName() + " Trampoline effect...");
|
||||
}
|
||||
// TODO: Consider making this just a checking method (use result for applying effects).
|
||||
// CHEATING: Add velocity.
|
||||
// TODO: 1. Confine for direct use (no latency here). 2. Hard set velocity? 3.. Switch to friction based.
|
||||
if (!survivalFly.isReallySneaking(player)) {
|
||||
data.addVelocity(player, cc, 0.0, (double) player.getFallDistance() / 30.0, 0.0);
|
||||
}
|
||||
// CHEATING: Remove fall distance:
|
||||
// TODO: Test under which conditions the player would still take fall damage.
|
||||
// TODO: Depends on NoFall being enabled as well.
|
||||
player.setFallDistance(0f);
|
||||
data.noFallFallDistance = 0f;
|
||||
data.noFallMaxY = 0.0;
|
||||
data.noFallSkipAirCheck = true;
|
||||
// (Skipping the NoFall check is necessary, because THIS move can be big.)
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param player
|
||||
@ -1022,53 +993,7 @@ public class MovingListener extends CheckListener implements TickListener, IRemo
|
||||
// Process velocity.
|
||||
final Vector velocity = event.getVelocity();
|
||||
final MovingConfig cc = MovingConfig.getConfig(player);
|
||||
addVelocity(player, data, cc, velocity.getX(), velocity.getY(), velocity.getZ());
|
||||
}
|
||||
|
||||
/**
|
||||
* Add velocity to internal book-keeping.
|
||||
* @param player
|
||||
* @param data
|
||||
* @param cc
|
||||
* @param vx
|
||||
* @param vy
|
||||
* @param vz
|
||||
*/
|
||||
public static void addVelocity(final Player player, final MovingData data, final MovingConfig cc, final double vx, final double vy, final double vz) {
|
||||
|
||||
final int tick = TickTask.getTick();
|
||||
data.removeInvalidVelocity(tick - cc.velocityActivationTicks);
|
||||
|
||||
if (data.debug) {
|
||||
NCPAPIProvider.getNoCheatPlusAPI().getLogManager().debug(Streams.TRACE_FILE, player.getName() + " new velocity: " + vx + ", " + vy + ", " + vz);
|
||||
}
|
||||
|
||||
boolean used = false;
|
||||
if (vy > 0D) {
|
||||
used = true;
|
||||
if (data.verticalFreedom <= 0.001 && data.verticalVelocityCounter >= 0) {
|
||||
data.verticalVelocity = 0;
|
||||
}
|
||||
data.verticalVelocity += vy;
|
||||
data.verticalFreedom += data.verticalVelocity;
|
||||
data.verticalVelocityCounter = Math.min(100, Math.max(data.verticalVelocityCounter, cc.velocityGraceTicks ) + 1 + (int) Math.round(vy * 10.0)); // 50;
|
||||
data.verticalVelocityUsed = 0;
|
||||
}
|
||||
|
||||
|
||||
if (vx != 0.0 && vz != 0.0) {
|
||||
final double newVal = Math.sqrt(vx * vx + vz * vz);
|
||||
used = true;
|
||||
final Velocity vel = new Velocity(tick, newVal, cc.velocityActivationCounter, Math.max(20, 1 + (int) Math.round(newVal * 10.0)));
|
||||
data.addHorizontalVelocity(vel);
|
||||
}
|
||||
|
||||
// Set dirty flag here.
|
||||
if (used) {
|
||||
data.sfDirty = true; // TODO: Only needed for vertical velocity? Get rid anyway :p.
|
||||
data.sfNoLowJump = true;
|
||||
}
|
||||
// TODO: clear accounting here ?
|
||||
data.addVelocity(player, cc, velocity.getX(), velocity.getY(), velocity.getZ());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1178,7 +1103,7 @@ public class MovingListener extends CheckListener implements TickListener, IRemo
|
||||
return;
|
||||
}
|
||||
final MovingConfig cc = MovingConfig.getConfig(player);
|
||||
if (event.isCancelled() || !shouldCheckSurvivalFly(player, data, cc) || !noFall.isEnabled(player)) {
|
||||
if (event.isCancelled() || !MovingUtil.shouldCheckSurvivalFly(player, data, cc) || !noFall.isEnabled(player)) {
|
||||
data.clearNoFallData();
|
||||
return;
|
||||
}
|
||||
@ -1659,7 +1584,7 @@ public class MovingListener extends CheckListener implements TickListener, IRemo
|
||||
else{
|
||||
if (data.sfHoverTicks > cc.sfHoverTicks) {
|
||||
// Re-Check if survivalfly can apply at all.
|
||||
if (shouldCheckSurvivalFly(player, data, cc)) {
|
||||
if (MovingUtil.shouldCheckSurvivalFly(player, data, cc)) {
|
||||
handleHoverViolation(player, loc, cc, data);
|
||||
// Assume the player might still be hovering.
|
||||
res = false;
|
||||
|
@ -0,0 +1,92 @@
|
||||
package fr.neatmonster.nocheatplus.checks.moving;
|
||||
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.player.PlayerMoveEvent;
|
||||
|
||||
import fr.neatmonster.nocheatplus.NCPAPIProvider;
|
||||
import fr.neatmonster.nocheatplus.checks.CheckType;
|
||||
import fr.neatmonster.nocheatplus.hooks.NCPExemptionManager;
|
||||
import fr.neatmonster.nocheatplus.logging.StaticLog;
|
||||
import fr.neatmonster.nocheatplus.permissions.Permissions;
|
||||
import fr.neatmonster.nocheatplus.utilities.BlockProperties;
|
||||
import fr.neatmonster.nocheatplus.utilities.CheckUtils;
|
||||
import fr.neatmonster.nocheatplus.utilities.PlayerLocation;
|
||||
|
||||
/**
|
||||
* Static utility methods.
|
||||
* @author dev1mc
|
||||
*
|
||||
*/
|
||||
public class MovingUtil {
|
||||
|
||||
/**
|
||||
* Check if the player is to be checked by the survivalfly check.
|
||||
* @param player
|
||||
* @param data
|
||||
* @param cc
|
||||
* @return
|
||||
*/
|
||||
public static final boolean shouldCheckSurvivalFly(final Player player, final MovingData data, final MovingConfig cc) {
|
||||
return cc.survivalFlyCheck && !NCPExemptionManager.isExempted(player, CheckType.MOVING_SURVIVALFLY) && !player.hasPermission(Permissions.MOVING_SURVIVALFLY) &&
|
||||
(cc.ignoreCreative || player.getGameMode() != GameMode.CREATIVE) && !player.isFlying() && (cc.ignoreAllowFlight || !player.getAllowFlight());
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle an illegal move by a player, attempt to restore a valid location.
|
||||
* @param event
|
||||
* @param player
|
||||
* @param data
|
||||
*/
|
||||
public static void handleIllegalMove(final PlayerMoveEvent event, final Player player, final MovingData data)
|
||||
{
|
||||
// This might get extended to a check-like thing.
|
||||
boolean restored = false;
|
||||
final PlayerLocation pLoc = new PlayerLocation(NCPAPIProvider.getNoCheatPlusAPI().getMCAccess(), null);
|
||||
// (Mind that we don't set the block cache here).
|
||||
final Location loc = player.getLocation();
|
||||
if (!restored && data.hasSetBack()) {
|
||||
final Location setBack = data.getSetBack(loc);
|
||||
pLoc.set(setBack, player);
|
||||
if (!pLoc.isIllegal()) {
|
||||
event.setFrom(setBack);
|
||||
event.setTo(setBack);
|
||||
restored = true;
|
||||
}
|
||||
else {
|
||||
data.resetSetBack();
|
||||
}
|
||||
}
|
||||
if (!restored) {
|
||||
pLoc.set(loc, player);
|
||||
if (!pLoc.isIllegal()) {
|
||||
event.setFrom(loc);
|
||||
event.setTo(loc);
|
||||
restored = true;
|
||||
}
|
||||
}
|
||||
pLoc.cleanup();
|
||||
if (!restored) {
|
||||
// TODO: reset the bounding box of the player ?
|
||||
if (MovingConfig.getConfig(player).tempKickIllegal) {
|
||||
NCPAPIProvider.getNoCheatPlusAPI().denyLogin(player.getName(), 24L * 60L * 60L * 1000L);
|
||||
StaticLog.logSevere("[NCP] could not restore location for " + player.getName() + ", kicking them and deny login for 24 hours");
|
||||
} else {
|
||||
StaticLog.logSevere("[NCP] could not restore location for " + player.getName() + ", kicking them.");
|
||||
}
|
||||
CheckUtils.kickIllegalMove(player);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Used for a workaround that resets the set-back for the case of jumping on just placed blocks.
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
public static boolean canJumpOffTop(final Material blockType) {
|
||||
return BlockProperties.isGround(blockType) || BlockProperties.isSolid(blockType);
|
||||
}
|
||||
|
||||
}
|
@ -76,14 +76,20 @@ public class NoFall extends Check {
|
||||
|
||||
|
||||
private void dealFallDamage(final Player player, final double damage) {
|
||||
// TODO: Byte code compatibility ?
|
||||
final EntityDamageEvent event = BridgeHealth.getEntityDamageEvent(player, DamageCause.FALL, damage);
|
||||
Bukkit.getPluginManager().callEvent(event);
|
||||
if (!event.isCancelled()){
|
||||
// TODO: account for no damage ticks etc.
|
||||
player.setLastDamageCause(event);
|
||||
mcAccess.dealFallDamage(player, BridgeHealth.getDamage(event));
|
||||
if (mcAccess.dealFallDamageFiresAnEvent().decide()) {
|
||||
// TODO: Better decideOptimistically?
|
||||
mcAccess.dealFallDamage(player, damage);
|
||||
}
|
||||
else {
|
||||
final EntityDamageEvent event = BridgeHealth.getEntityDamageEvent(player, DamageCause.FALL, damage);
|
||||
Bukkit.getPluginManager().callEvent(event);
|
||||
if (!event.isCancelled()){
|
||||
// TODO: account for no damage ticks etc.
|
||||
player.setLastDamageCause(event);
|
||||
mcAccess.dealFallDamage(player, BridgeHealth.getDamage(event));
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: let this be done by the damage event (!).
|
||||
// data.clearNoFallData(); // -> currently done in the damage eventhandling method.
|
||||
player.setFallDistance(0);
|
||||
|
@ -589,6 +589,15 @@ public class SurvivalFly extends Check {
|
||||
return hAllowedDistance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Access method from outside.
|
||||
* @param player
|
||||
* @return
|
||||
*/
|
||||
public boolean isReallySneaking(final Player player) {
|
||||
return reallySneaking.contains(player.getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if touching the ground was lost (client did not send, or server did not put it through).
|
||||
* @param player
|
||||
@ -1140,6 +1149,7 @@ public class SurvivalFly extends Check {
|
||||
double yMargin = cc.yOnGround;
|
||||
// TODO: Might set margin higher depending on distance to 0 of block and last y distance etc.
|
||||
// TODO: check with iY + 0.25 removed.
|
||||
// TODO: Slime blocks ?
|
||||
if (BlockProperties.isOnGround(from.getBlockCache(), Math.min(data.fromX, from.getX()) - r, iY - yMargin, Math.min(data.fromZ, from.getZ()) - r, Math.max(data.fromX, from.getX()) + r, iY + 0.25, Math.max(data.fromZ, from.getZ()) + r, 0L)) {
|
||||
return applyLostGround(player, from, true, data, "interpolate");
|
||||
}
|
||||
|
@ -20,120 +20,126 @@ import fr.neatmonster.nocheatplus.utilities.BlockCache;
|
||||
*
|
||||
*/
|
||||
public interface MCAccess {
|
||||
|
||||
/**
|
||||
* Simple version identifiers, if several must be separated by '|' like "1.4.2|1.4.4|1.4.5", to indicate multiple sub-versions supported use "1.5.x", use "?" to indicate general future support.
|
||||
* @return
|
||||
*/
|
||||
public String getMCVersion();
|
||||
|
||||
/**
|
||||
* Server version tag, like CB 2511.
|
||||
* @return
|
||||
*/
|
||||
public String getServerVersionTag();
|
||||
|
||||
/**
|
||||
* Get the servers command map.
|
||||
* @return May return null if not supported.
|
||||
*/
|
||||
public CommandMap getCommandMap();
|
||||
|
||||
/**
|
||||
* Get a BlockCache implementation.
|
||||
* @param world May be null to store an instance of BlockCache for future use.
|
||||
* @return
|
||||
*/
|
||||
public BlockCache getBlockCache(World world);
|
||||
|
||||
/**
|
||||
* Get height of an entity (attack relevant, the maximal "thing" found).
|
||||
*/
|
||||
public double getHeight(Entity entity);
|
||||
|
||||
/**
|
||||
* Return some width.
|
||||
* @param entity
|
||||
* @return
|
||||
*/
|
||||
public double getWidth(Entity entity);
|
||||
|
||||
/**
|
||||
* NMS Block static.
|
||||
* @param id
|
||||
* @return MAYBE if undecided, YES or NO if decided.
|
||||
*/
|
||||
public AlmostBoolean isBlockSolid(int id);
|
||||
|
||||
/**
|
||||
* NMS Block static..
|
||||
* @param id
|
||||
* @return MAYBE if undecided, YES or NO if decided.
|
||||
*/
|
||||
public AlmostBoolean isBlockLiquid(int id);
|
||||
|
||||
/**
|
||||
* Does only check y bounds, returns false if dead. this is half a check as auxiliary means for PlayerLocation.isIllegal.
|
||||
* @param player
|
||||
* @return MAYBE if undecided, YES or NO if decided.
|
||||
*/
|
||||
public AlmostBoolean isIllegalBounds(Player player);
|
||||
|
||||
/**
|
||||
*
|
||||
* @param player
|
||||
* @return Double.NEGATIVE_INFINITY if not present.
|
||||
*/
|
||||
public double getJumpAmplifier(Player player);
|
||||
|
||||
/**
|
||||
*
|
||||
* @return Double.NEGATIVE_INFINITY if not present.
|
||||
*/
|
||||
public double getFasterMovementAmplifier(Player player);
|
||||
/**
|
||||
* Simple version identifiers, if several must be separated by '|' like "1.4.2|1.4.4|1.4.5", to indicate multiple sub-versions supported use "1.5.x", use "?" to indicate general future support.
|
||||
* @return
|
||||
*/
|
||||
public String getMCVersion();
|
||||
|
||||
public int getInvulnerableTicks(Player player);
|
||||
/**
|
||||
* Server version tag, like CB 2511.
|
||||
* @return
|
||||
*/
|
||||
public String getServerVersionTag();
|
||||
|
||||
public void setInvulnerableTicks(Player player, int ticks);
|
||||
/**
|
||||
* Get the servers command map.
|
||||
* @return May return null if not supported.
|
||||
*/
|
||||
public CommandMap getCommandMap();
|
||||
|
||||
public void dealFallDamage(Player player, double damage);
|
||||
/**
|
||||
* Get a BlockCache implementation.
|
||||
* @param world May be null to store an instance of BlockCache for future use.
|
||||
* @return
|
||||
*/
|
||||
public BlockCache getBlockCache(World world);
|
||||
|
||||
/**
|
||||
* This may well be removed, if possible to check with Bukkit.
|
||||
* @param damaged
|
||||
* @return
|
||||
*/
|
||||
public boolean isComplexPart(Entity damaged);
|
||||
/**
|
||||
* Get height of an entity (attack relevant, the maximal "thing" found).
|
||||
*/
|
||||
public double getHeight(Entity entity);
|
||||
|
||||
/**
|
||||
* Return some width.
|
||||
* @param entity
|
||||
* @return
|
||||
*/
|
||||
public double getWidth(Entity entity);
|
||||
|
||||
/**
|
||||
* NMS Block static.
|
||||
* @param id
|
||||
* @return MAYBE if undecided, YES or NO if decided.
|
||||
*/
|
||||
public AlmostBoolean isBlockSolid(int id);
|
||||
|
||||
/**
|
||||
* NMS Block static..
|
||||
* @param id
|
||||
* @return MAYBE if undecided, YES or NO if decided.
|
||||
*/
|
||||
public AlmostBoolean isBlockLiquid(int id);
|
||||
|
||||
/**
|
||||
* Does only check y bounds, returns false if dead. this is half a check as auxiliary means for PlayerLocation.isIllegal.
|
||||
* @param player
|
||||
* @return MAYBE if undecided, YES or NO if decided.
|
||||
*/
|
||||
public AlmostBoolean isIllegalBounds(Player player);
|
||||
|
||||
/**
|
||||
*
|
||||
* @param player
|
||||
* @return Double.NEGATIVE_INFINITY if not present.
|
||||
*/
|
||||
public double getJumpAmplifier(Player player);
|
||||
|
||||
/**
|
||||
*
|
||||
* @return Double.NEGATIVE_INFINITY if not present.
|
||||
*/
|
||||
public double getFasterMovementAmplifier(Player player);
|
||||
|
||||
public int getInvulnerableTicks(Player player);
|
||||
|
||||
public void setInvulnerableTicks(Player player, int ticks);
|
||||
|
||||
public void dealFallDamage(Player player, double damage);
|
||||
|
||||
/**
|
||||
* If dealFallDamage(Player, double) will fire a damage event.
|
||||
* @return
|
||||
*/
|
||||
public AlmostBoolean dealFallDamageFiresAnEvent();
|
||||
|
||||
/**
|
||||
* This may well be removed, if possible to check with Bukkit.
|
||||
* @param damaged
|
||||
* @return
|
||||
*/
|
||||
public boolean isComplexPart(Entity damaged);
|
||||
|
||||
/**
|
||||
* Tests if player is not set to dead but has no health.
|
||||
* @param player
|
||||
* @return
|
||||
*/
|
||||
public boolean shouldBeZombie(Player player);
|
||||
|
||||
/**
|
||||
* Ensure the player is really taken out: Set flag + death ticks.
|
||||
*
|
||||
* TODO: Check if still necessary + make knowledge-base entries for what to check.
|
||||
*
|
||||
* @param player
|
||||
* @param deathTicks
|
||||
*/
|
||||
public void setDead(Player player, int deathTicks);
|
||||
|
||||
/**
|
||||
* Usually sand and gravel. Not for fastest access.
|
||||
* @param type
|
||||
* @return
|
||||
*/
|
||||
public boolean hasGravity(Material type);
|
||||
|
||||
// /**
|
||||
// * Correct the direction (yaw + pitch). If this can't be done lightly it should just do nothing. Check pitch and yaw before calling, use auxiliary methods from LocUtil.
|
||||
// * @param player
|
||||
// */
|
||||
// public void correctDirection(Player player);
|
||||
|
||||
/**
|
||||
* Tests if player is not set to dead but has no health.
|
||||
* @param player
|
||||
* @return
|
||||
*/
|
||||
public boolean shouldBeZombie(Player player);
|
||||
|
||||
/**
|
||||
* Ensure the player is really taken out: Set flag + death ticks.
|
||||
*
|
||||
* TODO: Check if still necessary + make knowledge-base entries for what to check.
|
||||
*
|
||||
* @param player
|
||||
* @param deathTicks
|
||||
*/
|
||||
public void setDead(Player player, int deathTicks);
|
||||
|
||||
/**
|
||||
* Usually sand and gravel. Not for fastest access.
|
||||
* @param type
|
||||
* @return
|
||||
*/
|
||||
public boolean hasGravity(Material type);
|
||||
|
||||
// /**
|
||||
// * Correct the direction (yaw + pitch). If this can't be done lightly it should just do nothing. Check pitch and yaw before calling, use auxiliary methods from LocUtil.
|
||||
// * @param player
|
||||
// */
|
||||
// public void correctDirection(Player player);
|
||||
|
||||
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ import fr.neatmonster.nocheatplus.compat.blocks.init.BlockInit;
|
||||
import fr.neatmonster.nocheatplus.config.WorldConfigProvider;
|
||||
import fr.neatmonster.nocheatplus.logging.StaticLog;
|
||||
import fr.neatmonster.nocheatplus.utilities.BlockFlags;
|
||||
import fr.neatmonster.nocheatplus.utilities.BlockProperties;
|
||||
|
||||
public class BlocksMC1_8 implements BlockPropertiesSetup {
|
||||
|
||||
@ -22,6 +23,8 @@ public class BlocksMC1_8 implements BlockPropertiesSetup {
|
||||
public void setupBlockProperties(WorldConfigProvider<?> worldConfigProvider) {
|
||||
// 165(SLIME_BLOCK
|
||||
BlockInit.setAs(165, Material.TNT); // Full block, instant break.
|
||||
// Add the bouncing flag.
|
||||
BlockProperties.setBlockFlags(165, BlockProperties.getBlockFlags(165) | BlockProperties.F_BOUNCE25);
|
||||
|
||||
// 166(BARRIER
|
||||
BlockInit.setAs(166, Material.BEDROCK); // Full block, unbreakable.
|
||||
|
@ -367,13 +367,19 @@ public class BlockProperties {
|
||||
|
||||
/** Meta-flag to indicate that the (max.-) edges should mean a collision, can be passed to collidesBlock. */
|
||||
public static final long F_COLLIDE_EDGES = 0x100000;
|
||||
|
||||
|
||||
/** Thick fence (default wooden fence). */
|
||||
public static final long F_THICK_FENCE = 0x200000;
|
||||
|
||||
|
||||
/** Fence gate style with 0x04 being fully passable. */
|
||||
public static final long F_PASSABLE_X4 = 0x200000;
|
||||
|
||||
// TODO: Separate no fall damage flag ? [-> on ground could return "dominating" flags, or extra flags]
|
||||
/** Like slime block: bounce back 25% of fall height without taking fall damage [TODO: Check/adjust]. */
|
||||
public static final long F_BOUNCE25 = 0x400000;
|
||||
|
||||
// TODO: When flags are out, switch to per-block classes :p.
|
||||
|
||||
/**
|
||||
* Map flag to names.
|
||||
*/
|
||||
@ -601,7 +607,7 @@ public class BlockProperties {
|
||||
}) {
|
||||
blockFlags[mat.getId()] |= F_HEIGHT150 | F_VARIABLE | F_THICK_FENCE;
|
||||
}
|
||||
|
||||
|
||||
// Fence gate(s).
|
||||
for (final Material mat : new Material[]{
|
||||
Material.FENCE_GATE,
|
||||
@ -1334,7 +1340,7 @@ public class BlockProperties {
|
||||
pLoc.cleanup();
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Simple checking method, heavy. No isIllegal check.
|
||||
* @param player
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user