From 7f1d744092fe0737e082b831a4330b834fc98b17 Mon Sep 17 00:00:00 2001 From: asofold Date: Thu, 21 Dec 2017 23:11:40 +0100 Subject: [PATCH] Add a dedicated compat module for 1.11.2 (1_11_R1). --- NCPCompatSpigotCB1_11_R1/pom.xml | 52 ++++ .../spigotcb1_11_R1/AttributeAccess.java | 57 ++++ .../BlockCacheSpigotCB1_11_R1.java | 162 ++++++++++ .../EntityAccessLastPositionAndLook.java | 57 ++++ .../MCAccessSpigotCB1_11_R1.java | 278 ++++++++++++++++++ NCPPlugin/pom.xml | 7 +- .../compat/registry/MCAccessFactory.java | 3 +- pom.xml | 1 + 8 files changed, 615 insertions(+), 2 deletions(-) create mode 100644 NCPCompatSpigotCB1_11_R1/pom.xml create mode 100644 NCPCompatSpigotCB1_11_R1/src/main/java/fr/neatmonster/nocheatplus/compat/spigotcb1_11_R1/AttributeAccess.java create mode 100644 NCPCompatSpigotCB1_11_R1/src/main/java/fr/neatmonster/nocheatplus/compat/spigotcb1_11_R1/BlockCacheSpigotCB1_11_R1.java create mode 100644 NCPCompatSpigotCB1_11_R1/src/main/java/fr/neatmonster/nocheatplus/compat/spigotcb1_11_R1/EntityAccessLastPositionAndLook.java create mode 100644 NCPCompatSpigotCB1_11_R1/src/main/java/fr/neatmonster/nocheatplus/compat/spigotcb1_11_R1/MCAccessSpigotCB1_11_R1.java diff --git a/NCPCompatSpigotCB1_11_R1/pom.xml b/NCPCompatSpigotCB1_11_R1/pom.xml new file mode 100644 index 00000000..63e677d7 --- /dev/null +++ b/NCPCompatSpigotCB1_11_R1/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + fr.neatmonster + ncpcompatspigotcb1_11_r1 + jar + NCPCompatSpigotCB1_11_R1 + 1.1-SNAPSHOT + + + fr.neatmonster + nocheatplus-parent + 1.1-SNAPSHOT + + + + + fr.neatmonster + ncpcore + 1.1-SNAPSHOT + provided + + + org.bukkit + craftbukkit + 1.11.2-R0.1-SNAPSHOT + provided + + + + Compatibility for SpigotCB1_11_R1. + +To add a new compat module two other pom.xml files have to be modified: +- Root pom (parent): Add as module within profile with id 'all'. +- NCPPlugin: Add as dependency for the profile with id 'all'. +- (Add a new profile for this specific module, altering both poms mentioned above. If the profile already exists, pointing at ncpcompatspigotcb1_11_R1, a new profile can be made with updating NCPCompatSpigotCB1_11_R1 then.) + +The NCPPlugin sub-project contains the relevant factories (MCAccessFactory, EntityAccessFactory, AttributeAccessFactory). + + + + + org.apache.maven.plugins + maven-deploy-plugin + + true + + + + + + \ No newline at end of file diff --git a/NCPCompatSpigotCB1_11_R1/src/main/java/fr/neatmonster/nocheatplus/compat/spigotcb1_11_R1/AttributeAccess.java b/NCPCompatSpigotCB1_11_R1/src/main/java/fr/neatmonster/nocheatplus/compat/spigotcb1_11_R1/AttributeAccess.java new file mode 100644 index 00000000..856aa6ca --- /dev/null +++ b/NCPCompatSpigotCB1_11_R1/src/main/java/fr/neatmonster/nocheatplus/compat/spigotcb1_11_R1/AttributeAccess.java @@ -0,0 +1,57 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package fr.neatmonster.nocheatplus.compat.spigotcb1_11_R1; + +import org.bukkit.craftbukkit.v1_11_R1.entity.CraftLivingEntity; +import org.bukkit.entity.Player; + +import fr.neatmonster.nocheatplus.compat.AttribUtil; +import fr.neatmonster.nocheatplus.components.modifier.IAttributeAccess; +import fr.neatmonster.nocheatplus.utilities.ReflectionUtil; +import net.minecraft.server.v1_11_R1.AttributeInstance; +import net.minecraft.server.v1_11_R1.AttributeModifier; +import net.minecraft.server.v1_11_R1.GenericAttributes; + +public class AttributeAccess implements IAttributeAccess { + + public AttributeAccess() { + if (ReflectionUtil.getClass("net.minecraft.server.v1_11_R1.AttributeInstance") == null) { + throw new RuntimeException("Service not available."); + } + } + + @Override + public double getSpeedAttributeMultiplier(Player player) { + final AttributeInstance attr = ((CraftLivingEntity) player).getHandle().getAttributeInstance(GenericAttributes.MOVEMENT_SPEED); + final double val = attr.getValue() / attr.b(); + final AttributeModifier mod = attr.a(AttribUtil.ID_SPRINT_BOOST); + if (mod == null) { + return val; + } else { + return val / AttribUtil.getMultiplier(mod.c(), mod.d()); + } + } + + @Override + public double getSprintAttributeMultiplier(Player player) { + final AttributeModifier mod = ((CraftLivingEntity) player).getHandle().getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).a(AttribUtil.ID_SPRINT_BOOST); + if (mod == null) { + return 1.0; + } else { + return AttribUtil.getMultiplier(mod.c(), mod.d()); + } + } + +} diff --git a/NCPCompatSpigotCB1_11_R1/src/main/java/fr/neatmonster/nocheatplus/compat/spigotcb1_11_R1/BlockCacheSpigotCB1_11_R1.java b/NCPCompatSpigotCB1_11_R1/src/main/java/fr/neatmonster/nocheatplus/compat/spigotcb1_11_R1/BlockCacheSpigotCB1_11_R1.java new file mode 100644 index 00000000..176cb98e --- /dev/null +++ b/NCPCompatSpigotCB1_11_R1/src/main/java/fr/neatmonster/nocheatplus/compat/spigotcb1_11_R1/BlockCacheSpigotCB1_11_R1.java @@ -0,0 +1,162 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package fr.neatmonster.nocheatplus.compat.spigotcb1_11_R1; + +import java.util.Iterator; +import java.util.List; + +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_11_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_11_R1.entity.CraftEntity; +import org.bukkit.entity.Entity; + +import fr.neatmonster.nocheatplus.utilities.map.BlockCache; +import net.minecraft.server.v1_11_R1.AxisAlignedBB; +import net.minecraft.server.v1_11_R1.BlockPosition; +import net.minecraft.server.v1_11_R1.EntityBoat; +import net.minecraft.server.v1_11_R1.EntityShulker; +import net.minecraft.server.v1_11_R1.EnumDirection; +import net.minecraft.server.v1_11_R1.IBlockAccess; +import net.minecraft.server.v1_11_R1.IBlockData; +import net.minecraft.server.v1_11_R1.TileEntity; + +public class BlockCacheSpigotCB1_11_R1 extends BlockCache { + + protected net.minecraft.server.v1_11_R1.World world; + protected World bukkitWorld; + + private final IBlockAccess iBlockAccess = new IBlockAccess() { + + @Override + public int getBlockPower(BlockPosition pos, EnumDirection dir) { + return world.getBlockPower(pos, dir); + } + + @Override + public TileEntity getTileEntity(BlockPosition pos) { + return world.getTileEntity(pos); + } + + @Override + public IBlockData getType(BlockPosition pos) { + // TODO: Can this be cached ? + return world.getType(pos); + } + + @Override + public boolean isEmpty(BlockPosition pos) { + // TODO: Can (and should) this be cached ? + return world.isEmpty(pos); + } + + }; + + public BlockCacheSpigotCB1_11_R1(World world) { + setAccess(world); + } + + @Override + public BlockCache setAccess(World world) { + if (world != null) { + this.maxBlockY = world.getMaxHeight() - 1; + this.world = ((CraftWorld) world).getHandle(); + this.bukkitWorld = world; + } else { + this.world = null; + this.bukkitWorld = null; + } + return this; + } + + @Override + public Material fetchTypeId(final int x, final int y, final int z) { + return bukkitWorld.getBlockAt(x, y, z).getType(); + } + + @SuppressWarnings("deprecation") + @Override + public int fetchData(final int x, final int y, final int z) { + return bukkitWorld.getBlockAt(x, y, z).getData(); + } + + @Override + public double[] fetchBounds(final int x, final int y, final int z){ + final Material id = getType(x, y, z); + @SuppressWarnings("deprecation") + final net.minecraft.server.v1_11_R1.Block block = net.minecraft.server.v1_11_R1.Block.getById(id.getId()); + if (block == null) { + // TODO: Convention for null blocks -> full ? + return null; + } + final BlockPosition pos = new BlockPosition(x, y, z); + // TODO: Deprecation warning below (reason / substitute?). + @SuppressWarnings("deprecation") + final AxisAlignedBB bb = block.b(iBlockAccess.getType(pos), iBlockAccess, pos); + if (bb == null) { + return new double[] {0.0, 0.0, 0.0, 1.0, 1.0, 1.0}; // Special case. + //return null; + } + // minX, minY, minZ, maxX, maxY, maxZ + return new double[]{bb.a, bb.b, bb.c, bb.d, bb.e, bb.f}; + } + + @Override + public boolean standsOnEntity(final Entity entity, final double minX, final double minY, final double minZ, final double maxX, final double maxY, final double maxZ){ + try{ + // TODO: Find some simplification! + + final net.minecraft.server.v1_11_R1.Entity mcEntity = ((CraftEntity) entity).getHandle(); + + final AxisAlignedBB box = new AxisAlignedBB(minX, minY, minZ, maxX, maxY, maxZ); + @SuppressWarnings("rawtypes") + final List list = world.getEntities(mcEntity, box); + @SuppressWarnings("rawtypes") + final Iterator iterator = list.iterator(); + while (iterator.hasNext()) { + final net.minecraft.server.v1_11_R1.Entity other = (net.minecraft.server.v1_11_R1.Entity) iterator.next(); + if (mcEntity == other || !(other instanceof EntityBoat) && !(other instanceof EntityShulker)) { // && !(other instanceof EntityMinecart)) continue; + continue; + } + if (minY >= other.locY && minY - other.locY <= 0.7){ + return true; + } + // Still check this for some reason. + final AxisAlignedBB otherBox = other.getBoundingBox(); + if (box.a > otherBox.d || box.d < otherBox.a || box.b > otherBox.e || box.e < otherBox.b || box.c > otherBox.f || box.f < otherBox.c) { + continue; + } + else { + return true; + } + } + } + catch (Throwable t){ + // Ignore exceptions (Context: DisguiseCraft). + } + return false; + } + + /* (non-Javadoc) + * @see fr.neatmonster.nocheatplus.utilities.BlockCache#cleanup() + */ + @Override + public void cleanup() { + super.cleanup(); + world = null; + bukkitWorld = null; + } + +} diff --git a/NCPCompatSpigotCB1_11_R1/src/main/java/fr/neatmonster/nocheatplus/compat/spigotcb1_11_R1/EntityAccessLastPositionAndLook.java b/NCPCompatSpigotCB1_11_R1/src/main/java/fr/neatmonster/nocheatplus/compat/spigotcb1_11_R1/EntityAccessLastPositionAndLook.java new file mode 100644 index 00000000..717f15c8 --- /dev/null +++ b/NCPCompatSpigotCB1_11_R1/src/main/java/fr/neatmonster/nocheatplus/compat/spigotcb1_11_R1/EntityAccessLastPositionAndLook.java @@ -0,0 +1,57 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package fr.neatmonster.nocheatplus.compat.spigotcb1_11_R1; + +import org.bukkit.craftbukkit.v1_11_R1.entity.CraftEntity; +import org.bukkit.entity.Entity; + +import fr.neatmonster.nocheatplus.components.entity.IEntityAccessLastPositionAndLook; +import fr.neatmonster.nocheatplus.components.location.IGetPositionWithLook; +import fr.neatmonster.nocheatplus.components.location.ISetPositionWithLook; +import fr.neatmonster.nocheatplus.utilities.ReflectionUtil; + +public class EntityAccessLastPositionAndLook implements IEntityAccessLastPositionAndLook { + + public EntityAccessLastPositionAndLook() { + ReflectionUtil.checkMembers(net.minecraft.server.v1_11_R1.Entity.class, double.class, new String[] { + "lastX", "lastY", "lastZ" + }); + ReflectionUtil.checkMembers(net.minecraft.server.v1_11_R1.Entity.class, float.class, new String[] { + "lastYaw", "lastPitch" + }); + } + + @Override + public void getPositionAndLook(final Entity entity, final ISetPositionWithLook location) { + // TODO: Error handling / conventions. + final net.minecraft.server.v1_11_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + location.setX(nmsEntity.lastX); + location.setY(nmsEntity.lastY); + location.setZ(nmsEntity.lastZ); + location.setYaw(nmsEntity.lastYaw); + location.setPitch(nmsEntity.lastPitch); + } + + @Override + public void setPositionAndLook(Entity entity, IGetPositionWithLook location) { + final net.minecraft.server.v1_11_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + nmsEntity.lastX = location.getX(); + nmsEntity.lastY = location.getY(); + nmsEntity.lastZ = location.getZ(); + nmsEntity.lastYaw = location.getYaw(); + nmsEntity.lastPitch = location.getPitch(); + } + +} diff --git a/NCPCompatSpigotCB1_11_R1/src/main/java/fr/neatmonster/nocheatplus/compat/spigotcb1_11_R1/MCAccessSpigotCB1_11_R1.java b/NCPCompatSpigotCB1_11_R1/src/main/java/fr/neatmonster/nocheatplus/compat/spigotcb1_11_R1/MCAccessSpigotCB1_11_R1.java new file mode 100644 index 00000000..d4992859 --- /dev/null +++ b/NCPCompatSpigotCB1_11_R1/src/main/java/fr/neatmonster/nocheatplus/compat/spigotcb1_11_R1/MCAccessSpigotCB1_11_R1.java @@ -0,0 +1,278 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package fr.neatmonster.nocheatplus.compat.spigotcb1_11_R1; + +import java.lang.reflect.Method; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.command.CommandMap; +import org.bukkit.craftbukkit.v1_11_R1.CraftServer; +import org.bukkit.craftbukkit.v1_11_R1.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; + +import fr.neatmonster.nocheatplus.compat.AlmostBoolean; +import fr.neatmonster.nocheatplus.compat.MCAccess; +import fr.neatmonster.nocheatplus.utilities.ReflectionUtil; +import fr.neatmonster.nocheatplus.utilities.location.LocUtil; +import fr.neatmonster.nocheatplus.utilities.map.BlockCache; +import net.minecraft.server.v1_11_R1.AxisAlignedBB; +import net.minecraft.server.v1_11_R1.Block; +import net.minecraft.server.v1_11_R1.BlockPosition; +import net.minecraft.server.v1_11_R1.DamageSource; +import net.minecraft.server.v1_11_R1.EntityComplexPart; +import net.minecraft.server.v1_11_R1.EntityPlayer; +import net.minecraft.server.v1_11_R1.IBlockAccess; +import net.minecraft.server.v1_11_R1.IBlockData; +import net.minecraft.server.v1_11_R1.MobEffectList; + +public class MCAccessSpigotCB1_11_R1 implements MCAccess { + + private final MobEffectList JUMP; + private final MobEffectList FASTER_MOVEMENT; + + /** + * Test for availability in constructor. + */ + public MCAccessSpigotCB1_11_R1() { + // try { + getCommandMap(); + Method blockGetAABB = ReflectionUtil.getMethod(Block.class, "b", IBlockData.class, IBlockAccess.class, BlockPosition.class); + if (blockGetAABB.getReturnType() != AxisAlignedBB.class + || !blockGetAABB.isAnnotationPresent(Deprecated.class)) { + throw new RuntimeException(); + } + if (ReflectionUtil.getConstructor(BlockPosition.class, int.class, int.class, int.class) == null) { + throw new RuntimeException(); + } + ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_11_R1.EntityLiving.class, + new String[]{"getHeadHeight"}, float.class); + ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_11_R1.EntityPlayer.class, + new String[]{"getHealth"}, float.class); + ReflectionUtil.checkMembers(net.minecraft.server.v1_11_R1.AxisAlignedBB.class, double.class, + "a", "b", "c", "d", "e", "f"); + ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_11_R1.AttributeInstance.class, + new String[]{"b"}, double.class); + ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_11_R1.AttributeModifier.class, + new String[]{"c"}, int.class); + ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_11_R1.AttributeModifier.class, + new String[]{"d"}, double.class); + ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_11_R1.Material.class, + new String[]{"isSolid", "isLiquid"}, boolean.class); + // TODO: Confine the following by types as well. + ReflectionUtil.checkMembers("net.minecraft.server.v1_11_R1.", + new String[] {"Entity" , "length", "width", "locY"}); + ReflectionUtil.checkMembers("net.minecraft.server.v1_11_R1.", + new String[] {"EntityPlayer" , "dead", "deathTicks", "invulnerableTicks"}); + + // obc: getHandle() for CraftWorld, CraftPlayer, CraftEntity. + // nms: Several: AxisAlignedBB, WorldServer + // nms: Block.getById(int), BlockPosition(int, int, int), WorldServer.getEntities(Entity, AxisAlignedBB) + // nms: AttributeInstance.a(UUID), EntityComplexPart, EntityPlayer.getAttributeInstance(IAttribute). + + // } catch(Throwable t) { + // NCPAPIProvider.getNoCheatPlusAPI().getLogManager().severe(Streams.INIT, t); + // throw new RuntimeException("NO WERK"); + // } + JUMP = MobEffectList.getByName("jump_boost"); + if (JUMP == null) { + throw new RuntimeException(); + } + FASTER_MOVEMENT = MobEffectList.getByName("speed"); + if (FASTER_MOVEMENT == null) { + throw new RuntimeException(); + } + } + + @Override + public String getMCVersion() { + // 1.11 (1_11_R1) + return "1.11-1.11.2"; + } + + @Override + public String getServerVersionTag() { + return "Spigot-CB-1.11_R1"; + } + + @Override + public CommandMap getCommandMap() { + return ((CraftServer) Bukkit.getServer()).getCommandMap(); + } + + @Override + public BlockCache getBlockCache() { + return getBlockCache(null); + } + + @Override + public BlockCache getBlockCache(final World world) { + return new BlockCacheSpigotCB1_11_R1(world); + } + + @Override + public double getHeight(final Entity entity) { + // (entity.getHeight() returns the length field, but we access nms anyway.) + final net.minecraft.server.v1_11_R1.Entity mcEntity = ((CraftEntity) entity).getHandle(); + final AxisAlignedBB boundingBox = mcEntity.getBoundingBox(); + final double entityHeight = Math.max(mcEntity.length, Math.max(mcEntity.getHeadHeight(), boundingBox.e - boundingBox.b)); + if (entity instanceof LivingEntity) { + return Math.max(((LivingEntity) entity).getEyeHeight(), entityHeight); + } else { + return entityHeight; + } + } + + private net.minecraft.server.v1_11_R1.Material getMaterial(int blockId) { + final Block block = Block.getById(blockId); + if (block == null) { + return null; + } + // (Currently no update state, since we don't have any position.) + return block.getBlockData().getMaterial(); + } + + @Override + public AlmostBoolean isBlockSolid(final Material id) { + @SuppressWarnings("deprecation") + final net.minecraft.server.v1_11_R1.Material material = getMaterial(id.getId()); + if (material == null) { + return AlmostBoolean.MAYBE; + } + else { + return AlmostBoolean.match(material.isSolid()); + } + } + + @Override + public AlmostBoolean isBlockLiquid(final Material id) { + @SuppressWarnings("deprecation") + final net.minecraft.server.v1_11_R1.Material material = getMaterial(id.getId()); + if (material == null) { + return AlmostBoolean.MAYBE; + } + else { + return AlmostBoolean.match(material.isLiquid()); + } + } + + @Override + public double getWidth(final Entity entity) { + return ((CraftEntity) entity).getHandle().width; + } + + @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.getBoundingBox(); + if (LocUtil.isBadCoordinate(box.a, box.b, box.c, box.d, box.e, box.f)) { + return AlmostBoolean.YES; + } + 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 getJumpAmplifier(final Player player) { + final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle(); + if (mcPlayer.hasEffect(JUMP)) { + return mcPlayer.getEffect(JUMP).getAmplifier(); + } + else { + return Double.NEGATIVE_INFINITY; + } + } + + @Override + public double getFasterMovementAmplifier(final Player player) { + final EntityPlayer mcPlayer = ((CraftPlayer) player).getHandle(); + if (mcPlayer.hasEffect(FASTER_MOVEMENT)) { + return mcPlayer.getEffect(FASTER_MOVEMENT).getAmplifier(); + } + else { + return Double.NEGATIVE_INFINITY; + } + } + + @Override + public int getInvulnerableTicks(final Player player) { + return ((CraftPlayer) player).getHandle().invulnerableTicks; + } + + @Override + public void setInvulnerableTicks(final Player player, final int ticks) { + ((CraftPlayer) player).getHandle().invulnerableTicks = ticks; + } + + @Override + public void dealFallDamage(final Player player, final double damage) { + ((CraftPlayer) player).getHandle().damageEntity(DamageSource.FALL, (float) damage); + } + + @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) { + return mat.hasGravity(); + } + + @Override + public AlmostBoolean dealFallDamageFiresAnEvent() { + return AlmostBoolean.YES; + } + + // @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. + // } + +} diff --git a/NCPPlugin/pom.xml b/NCPPlugin/pom.xml index 35b30cfd..8ad8027e 100644 --- a/NCPPlugin/pom.xml +++ b/NCPPlugin/pom.xml @@ -152,7 +152,7 @@ fr.neatmonster - ncpcompatcbdev + ncpcompatspigotcb1_11_r1 1.1-SNAPSHOT @@ -281,6 +281,11 @@ ncpcompatspigotcb1_10_r1 1.1-SNAPSHOT + + fr.neatmonster + ncpcompatspigotcb1_11_r1 + 1.1-SNAPSHOT + fr.neatmonster ncpcompatcbdev diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/compat/registry/MCAccessFactory.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/compat/registry/MCAccessFactory.java index 4b7f5f05..904da159 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/compat/registry/MCAccessFactory.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/compat/registry/MCAccessFactory.java @@ -112,9 +112,10 @@ public class MCAccessFactory { final String[] classNames = new String[] { // Current DEV / LATEST: CB (Spigot) - "fr.neatmonster.nocheatplus.compat.cbdev.MCAccessCBDev", // latest / tests. + //"fr.neatmonster.nocheatplus.compat.cbdev.MCAccessCBDev", // latest / tests. // Dedicated: CB (Spigot) + "fr.neatmonster.nocheatplus.compat.spigotcb1_11_R1.MCAccessSpigotCB1_11_R1", // 1.11.2 (1_11_R1) "fr.neatmonster.nocheatplus.compat.spigotcb1_10_R1.MCAccessSpigotCB1_10_R1", // 1.10-1.10.2 (1_10_R1) "fr.neatmonster.nocheatplus.compat.spigotcb1_9_R2.MCAccessSpigotCB1_9_R2", // 1.9.4 (1_9_R2) "fr.neatmonster.nocheatplus.compat.spigotcb1_9_R1.MCAccessSpigotCB1_9_R1", // 1.9-1.9.3 (1_9_R1) diff --git a/pom.xml b/pom.xml index e9d62233..a0c5691e 100644 --- a/pom.xml +++ b/pom.xml @@ -162,6 +162,7 @@ NCPCompatSpigotCB1_9_R1 NCPCompatSpigotCB1_9_R2 NCPCompatSpigotCB1_10_R1 + NCPCompatSpigotCB1_11_R1 NCPCompatCBDev