From 9a727ea763b24020cbdc5a9c678fbc2b586082bb Mon Sep 17 00:00:00 2001 From: Dawson <30784509+funkemunky@users.noreply.github.com> Date: Fri, 7 Oct 2022 14:45:45 -0400 Subject: [PATCH] stuffs --- .../check/impl/movement/speed/Horizontal.java | 193 ++++++++++-------- .../ac/check/impl/packet/order/Timer.java | 6 +- .../brighten/ac/command/AnticheatCommand.java | 2 +- .../java/dev/brighten/ac/data/APlayer.java | 14 +- .../ac/handler/EntityLocationHandler.java | 6 +- .../brighten/ac/handler/MovementHandler.java | 24 ++- .../brighten/ac/handler/PacketHandler.java | 18 +- .../brighten/ac/handler/entity/FakeMob.java | 14 +- .../handler/keepalive/KeepaliveProcessor.java | 7 +- .../brighten/ac/listener/JoinListener.java | 4 +- .../ac/packet/handler/HandlerAbstract.java | 14 ++ .../ac/packet/handler/LegacyHandler.java | 20 +- .../ac/packet/handler/ModernHandler.java | 65 +++--- .../ac/packet/wrapper/PacketConverter.java | 8 + .../ac/packet/wrapper/PacketType.java | 4 + .../ac/packet/wrapper/impl/Processor_18.java | 39 ++++ .../wrapper/in/WPacketPlayInTransaction.java | 48 +++++ .../wrapper/out/WPacketPlayOutPosition.java | 3 +- .../java/dev/brighten/ac/utils/Helper.java | 6 +- 19 files changed, 341 insertions(+), 154 deletions(-) create mode 100644 src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInTransaction.java diff --git a/src/main/java/dev/brighten/ac/check/impl/movement/speed/Horizontal.java b/src/main/java/dev/brighten/ac/check/impl/movement/speed/Horizontal.java index e43114f..809854f 100644 --- a/src/main/java/dev/brighten/ac/check/impl/movement/speed/Horizontal.java +++ b/src/main/java/dev/brighten/ac/check/impl/movement/speed/Horizontal.java @@ -29,9 +29,9 @@ public class Horizontal extends Check { private boolean maybeSkippedPos; private final Timer lastSkipPos = new TickTimer(); private int lastFlying; - + private KLocation previousFrom; - private Vector motionX = new Vector(0,0,0); + private Vector motionX = new Vector(0, 0, 0); private static final boolean[] TRUE_FALSE = new boolean[]{true, false}; public double strafe, forward; @@ -70,12 +70,12 @@ public class Horizontal extends Check { TagsBuilder tags = null; for (Iteration it : iterations) { + TagsBuilder tagsBuilder = new TagsBuilder(); float forward = it.f, strafe = it.s; - if (it.sprinting && forward <= 0) { - continue; - } + tagsBuilder.addTag("forward:" + it.f); + tagsBuilder.addTag("strafe:" + it.s); if (it.sneaking) { tagsBuilder.addTag("sneak"); @@ -103,33 +103,8 @@ public class Horizontal extends Check { lmotionY = motionX.getY(), lmotionZ = motionX.getZ(); - lmotionY-= 0.08; - lmotionY*= 0.98f; - - if(player.getBlockInfo().onSoulSand - && player.getBlockInfo().collisionMaterialCount. - containsKey(Material.SOUL_SAND)) { - - int i; - for(i = 0 - ; i < player.getBlockInfo() - .collisionMaterialCount - .get(Material.SOUL_SAND) - ; i++) { - lmotionX*= 0.4; - lmotionZ*= 0.4; - } - - if(i > 0) { - tagsBuilder.addTag("soulSand:" + i); - } - } - - if(player.getBlockInfo().inWeb) { - lmotionX*= 0.25; - lmotionZ*= 0.25; - tagsBuilder.addTag("web"); - } + lmotionY -= 0.08; + lmotionY *= 0.98f; //The "1" will effectively remove lastFriction from the equation lmotionX *= (lastLastClientGround ? lfriction : 1) * 0.9100000262260437D; @@ -145,6 +120,10 @@ public class Horizontal extends Check { lmotionZ = 0; tagsBuilder.addTag("motionZZero"); } + if (Math.abs(lmotionY) < 0.003) { + lmotionY = 0; + tagsBuilder.addTag("motionYZero"); + } } else { if (Math.abs(lmotionX) < 0.005) { lmotionX = 0; @@ -154,6 +133,10 @@ public class Horizontal extends Check { lmotionZ = 0; tagsBuilder.addTag("motionZZero"); } + if (Math.abs(lmotionY) < 0.005) { + lmotionY = 0; + tagsBuilder.addTag("motionYZero"); + } } // Attack slowdown @@ -190,7 +173,7 @@ public class Horizontal extends Check { f5 = (float) (aiMoveSpeed * (0.16277136F / (drag * drag * drag))); if (it.jumped) { - if(it.sprinting) { + if (it.sprinting) { float rot = player.getMovement().getTo().getLoc().yaw * 0.017453292F; lmotionX -= sin(it.fastMath, rot) * 0.2F; lmotionZ += cos(it.fastMath, rot) * 0.2F; @@ -206,6 +189,8 @@ public class Horizontal extends Check { f5 = it.sprinting ? 0.025999999F : 0.02f; } + tagsBuilder.addTag("mathit:" + it.fastMath); + if (player.getPlayerVersion().isOrAbove(ProtocolVersion.V1_9)) { double keyedMotion = forward * forward + strafe * strafe; @@ -240,22 +225,43 @@ public class Horizontal extends Check { } } - if(Math.abs(lmotionY) < (player.getPlayerVersion().isBelow(ProtocolVersion.V1_9) ? 0.005 : 0.003)) { - lmotionY = 0; + if (player.getBlockInfo().onSoulSand + && player.getBlockInfo().collisionMaterialCount. + containsKey(Material.SOUL_SAND)) { + + int i; + for (i = 0 + ; i < player.getBlockInfo() + .collisionMaterialCount + .get(Material.SOUL_SAND) + ; i++) { + lmotionX *= 0.4; + lmotionZ *= 0.4; + } + + if (i > 0) { + tagsBuilder.addTag("soulSand:" + i); + } + } + + if (player.getBlockInfo().inWeb) { + lmotionX *= 0.25; + lmotionZ *= 0.25; + tagsBuilder.addTag("web"); } double originalX = lmotionX, originalY = lmotionY, originalZ = lmotionZ; SimpleCollisionBox box = player.getMovement().getFrom().getBox().copy(); - if(it.sneaking && onGround) { + if (it.edge && it.sneaking && onGround) { double d6; // 1.9+ changes from 0.05 to 0.03 - double protocolOffset = player.getPlayerVersion().isBelow(ProtocolVersion.V1_9) ? 0.05D : 0.03D; + double protocolOffset = player.getPlayerVersion().isBelow(ProtocolVersion.V1_9) ? 0.05D : 0.03D; for (d6 = protocolOffset; lmotionX != 0.0D && Helper.getCollisions(player, box.copy() - .offset(lmotionX, 0 ,0)).isEmpty(); originalX = lmotionX) { + .offset(lmotionX, 0, 0)).isEmpty(); originalX = lmotionX) { if (lmotionX < d6 && lmotionX >= -d6) { lmotionX = 0.0D; } else if (lmotionX > 0.0D) { @@ -266,7 +272,7 @@ public class Horizontal extends Check { } for (; lmotionZ != 0.0D && Helper.getCollisions(player, box.copy() - .offset(0, 0 ,lmotionZ)).isEmpty(); originalZ = lmotionZ) { + .offset(0, 0, lmotionZ)).isEmpty(); originalZ = lmotionZ) { if (lmotionZ < d6 && lmotionZ >= -d6) { lmotionZ = 0.0D; } else if (lmotionZ > 0.0D) { @@ -277,7 +283,7 @@ public class Horizontal extends Check { } for (; lmotionX != 0.0D && lmotionZ != 0.0D && Helper.getCollisions(player, box.copy() - .offset(lmotionX, -1.0 ,lmotionZ)).isEmpty(); + .offset(lmotionX, -1.0, lmotionZ)).isEmpty(); originalZ = lmotionZ) { if (lmotionX < d6 && lmotionX >= -d6) { lmotionX = 0.0D; @@ -301,7 +307,7 @@ public class Horizontal extends Check { } List collisionBoxes = Helper.getCollisions(player, box.copy() - .addCoord(lmotionX ,lmotionY, lmotionZ)); + .addCoord(lmotionX, lmotionY, lmotionZ)); for (SimpleCollisionBox blockBox : collisionBoxes) { lmotionY = blockBox.calculateYOffset(box, lmotionY); @@ -310,19 +316,19 @@ public class Horizontal extends Check { box = box.offset(0, lmotionY, 0); boolean stepped = onGround || (originalY != lmotionY && originalY < 0); - + for (SimpleCollisionBox blockBox : collisionBoxes) { lmotionX = blockBox.calculateXOffset(box, lmotionX); } - box = box.offset(lmotionX,0,0); + box = box.offset(lmotionX, 0, 0); for (SimpleCollisionBox blockBox : collisionBoxes) { lmotionZ = blockBox.calculateZOffset(box, lmotionZ); } box = box.offset(0, 0, lmotionZ); - if(stepped && (lmotionX != originalX || lmotionZ != originalZ)) { + if (stepped && (lmotionX != originalX || lmotionZ != originalZ)) { double d11 = lmotionX; double d7 = lmotionY; double d8 = lmotionZ; @@ -410,37 +416,34 @@ public class Horizontal extends Check { tagsBuilder.addTag("stepped"); } - double x = ((box.minX + box.maxX) / 2.0D) - player.getMovement().getFrom().getX(); - double y = box.minY - player.getMovement().getFrom().getY(); - double z = ((box.minZ + box.maxZ) / 2.0D) - player.getMovement().getFrom().getZ(); - if (originalX != lmotionX) { - lmotionX = 0.0D; + lmotionX = 0.0D; tagsBuilder.addTag("x-collision"); } if (originalY != lmotionY) { - lmotionY = 0.0D; + lmotionY = 0.0D; tagsBuilder.addTag("y-collision"); } if (originalZ != lmotionZ) { - lmotionZ = 0.0D; + lmotionZ = 0.0D; tagsBuilder.addTag("z-collision"); } - double diffX = player.getMovement().getDeltaX() - x, - diffY = player.getMovement().getDeltaY() - y, - diffZ = player.getMovement().getDeltaZ() - z; + + double diffX = player.getMovement().getDeltaX() - lmotionX, + diffY = player.getMovement().getDeltaY() - lmotionY, + diffZ = player.getMovement().getDeltaZ() - lmotionZ; double delta = (diffX * diffX) + (diffZ * diffZ); double deltaAll = delta + (diffY * diffY); if (deltaAll < smallDelta) { smallDelta = deltaAll; smallestDeltaXZ = delta; - predictedMotionX = x; - predictedMotionY = y; - predictedMotionZ = z; + predictedMotionX = lmotionX; + predictedMotionY = lmotionY; + predictedMotionZ = lmotionZ; tags = tagsBuilder; @@ -448,28 +451,34 @@ public class Horizontal extends Check { this.strafe = it.s * 0.98f; this.forward = it.f * 0.98f; - if(precision < 1E-11) + if (precision < 1E-11) motionX = new Vector(lmotionX, lmotionY, lmotionZ); - else motionX = new Vector(player.getMovement().getDeltaX(), player.getMovement().getDeltaY(), player.getMovement().getDeltaZ()); + else + motionX = new Vector(player.getMovement().getDeltaX(), player.getMovement().getDeltaY(), player.getMovement().getDeltaZ()); if (player.getInfo().getLastCancel().isPassed(2)) player.getInfo() .setLastKnownGoodPosition(player .getMovement().getFrom().getLoc() .clone()); + + if(deltaAll < 1E-18) { + found = true; + break; + } } } } iterations.clear(); - if(!found) { + if (!found) { motionX = new Vector(player.getMovement().getDeltaX(), player.getMovement().getDeltaY(), player.getMovement().getDeltaZ()); } - double pmotion = Math.hypot(predictedMotionX, predictedMotionZ); final String builtTags = tags == null ? "null" : tags.build(); if (smallestDeltaXZ > (precision) + && !player.getBlockInfo().collidesHorizontally && player.getMovement().getDeltaXZ() > 0.1) { if ((buffer += smallestDeltaXZ > 58E-5 ? 1 : 0.5) > 1) { buffer = Math.min(3.5f, buffer); //Ensuring we don't have a run-away buffer @@ -480,22 +489,23 @@ public class Horizontal extends Check { } else if (buffer > 0) buffer -= 0.05f; - debug("(%s): py=%.5f dy=%.5f pm=%.5f dxz=%.5f skip=%s b=%.1f tags=[%s]", - precision, predictedMotionY, player.getMovement().getDeltaY(), pmotion, - player.getMovement().getDeltaXZ(), maybeSkippedPos, buffer, builtTags); + /*debug("(%s): py=%.5f dy=%.5f pm=%.5f dxz=%.5f skip=%s b=%.1f tags=[%s]", + precision, predictedMotionY, player.getMovement().getDeltaY(), pmotion, + player.getMovement().getDeltaXZ(), maybeSkippedPos, buffer, builtTags);*/ + debug("x=%s z=%s tags=[%s]", predictedMotionX, predictedMotionZ, builtTags); } - if(ProtocolVersion.getGameVersion().isBelow(ProtocolVersion.V1_9)) { + if (ProtocolVersion.getGameVersion().isBelow(ProtocolVersion.V1_9)) { maybeSkippedPos = !packet.isMoved(); } else { - if(player.getPlayerTick() - lastFlying > 1) { + if (player.getPlayerTick() - lastFlying > 1) { maybeSkippedPos = true; debug("maybe skipped pos"); } lastFlying = player.getPlayerTick(); } - if(maybeSkippedPos) { + if (maybeSkippedPos) { lastSkipPos.reset(); } lastLastClientGround = player.getMovement().getFrom().isOnGround(); @@ -503,9 +513,9 @@ public class Horizontal extends Check { }; private double getPrecision() { - if(player.getBlockInfo().onSoulSand) { + if (player.getBlockInfo().onSoulSand) { return 5E-4; - } else if(lastSkipPos.isNotPassed(2)) { + } else if (lastSkipPos.isNotPassed(2)) { return 0.03; } return 5E-13; @@ -525,17 +535,20 @@ public class Horizontal extends Check { MathHelper.floor_double(lastUnderBlockLoc.z))).getType(); for (int f = -1; f < 2; f++) { for (int s = -1; s < 2; s++) { - for (boolean sneaking : getSneakingIteration()) { - for (boolean sprinting : getSprintIteration(f, sneaking)) { - for (int fastMath = 0; fastMath <= 2; fastMath++) { - for (boolean attack : TRUE_FALSE) { - for (boolean using : TRUE_FALSE) { - for (boolean jumped : getJumpingIteration(player.getMovement().getFrom().isOnGround())) { - iterations.add(new Iteration(underMaterial, lastUnderMaterial, f, s, - fastMath, sprinting, attack, using, sneaking, jumped)); + for (boolean sneaking : getSneakingIteration(f, s)) { + for (boolean sprinting : getSprintIteration(f, sneaking)) { + for(boolean edge : getEdgeIteration(sneaking)) { + for (int fastMath = 0; fastMath <= 2; fastMath++) { + for (boolean attack : TRUE_FALSE) { + for (boolean using : TRUE_FALSE) { + for (boolean jumped : + getJumpingIteration(player.getMovement().getFrom().isOnGround())) { + iterations.add(new Iteration(underMaterial, lastUnderMaterial, f, s, + fastMath, sprinting, sneaking, edge, attack, using, jumped)); + } } } - } + } } } } @@ -548,25 +561,25 @@ public class Horizontal extends Check { @AllArgsConstructor private static class Iteration { - public Material underMaterial, lastUnderMaterial; - public int f, s, fastMath; - public boolean sprinting, attack, using, sneaking, jumped; + public Material underMaterial, lastUnderMaterial; + public int f, s, fastMath; + public boolean sprinting, sneaking, edge, attack, using, jumped; } private static boolean[] getSprintIteration(int f, boolean sneaking) { - if(f > 0 && !sneaking) { - return new boolean[] {true, false}; - } - - return new boolean[] {false}; + return f > 0 ? new boolean[]{true, false} : new boolean[] {false}; } - private static boolean[] getSneakingIteration() { - return new boolean[] {true, false}; + private static boolean[] getSneakingIteration(int f, int s) { + return f != 0 || s != 0 ? new boolean[]{true, false} : new boolean[] {false}; + } + + private static boolean[] getEdgeIteration(boolean sneaking) { + return sneaking ? new boolean[] {true, false} : new boolean[] {false}; } private static boolean[] getJumpingIteration(boolean onGround) { - return onGround ? new boolean[] {true, false} : new boolean[] {false}; + return onGround ? new boolean[]{true, false} : new boolean[]{false}; } private static final float[] SIN_TABLE_FAST = new float[4096], SIN_TABLE_FAST_NEW = new float[4096]; @@ -575,6 +588,7 @@ public class Horizontal extends Check { public static float sin(int type, float value) { switch (type) { + case 0: default: { return SIN_TABLE[(int) (value * 10430.378F) & 65535]; } @@ -589,6 +603,7 @@ public class Horizontal extends Check { public static float cos(int type, float value) { switch (type) { + case 0: default: return SIN_TABLE[(int) (value * 10430.378F + 16384.0F) & 65535]; case 1: diff --git a/src/main/java/dev/brighten/ac/check/impl/packet/order/Timer.java b/src/main/java/dev/brighten/ac/check/impl/packet/order/Timer.java index 91cb595..f21a10e 100644 --- a/src/main/java/dev/brighten/ac/check/impl/packet/order/Timer.java +++ b/src/main/java/dev/brighten/ac/check/impl/packet/order/Timer.java @@ -10,9 +10,9 @@ import dev.brighten.ac.data.APlayer; import dev.brighten.ac.packet.ProtocolVersion; import dev.brighten.ac.packet.wrapper.in.WPacketPlayInBlockPlace; import dev.brighten.ac.packet.wrapper.in.WPacketPlayInFlying; +import dev.brighten.ac.packet.wrapper.in.WPacketPlayInTransaction; import dev.brighten.ac.packet.wrapper.out.WPacketPlayOutPosition; import dev.brighten.ac.utils.timer.impl.TickTimer; -import net.minecraft.server.v1_8_R3.PacketPlayInTransaction; @CheckData(name = "Timer", checkId = "timer", type = CheckType.ORDER) public class Timer extends Check { @@ -38,10 +38,10 @@ public class Timer extends Check { /** * Fixing bug with 1.9 since flying packets are not always sent */ - WTimedAction transaction = (packet, timestamp) -> { + WTimedAction transaction = (packet, timestamp) -> { if(player.getPlayerVersion().isBelow(ProtocolVersion.V1_9)) return; - Anticheat.INSTANCE.getKeepaliveProcessor().getKeepById(packet.b()).ifPresent(ka -> { + Anticheat.INSTANCE.getKeepaliveProcessor().getKeepById(packet.getAction()).ifPresent(ka -> { long delta = timestamp - ka.startStamp; if(delta < 1095L && totalTimer - (timestamp + 100) > 3000L) { diff --git a/src/main/java/dev/brighten/ac/command/AnticheatCommand.java b/src/main/java/dev/brighten/ac/command/AnticheatCommand.java index 149e6b0..0ab57b3 100644 --- a/src/main/java/dev/brighten/ac/command/AnticheatCommand.java +++ b/src/main/java/dev/brighten/ac/command/AnticheatCommand.java @@ -280,7 +280,7 @@ public class AnticheatCommand extends BaseCommand { public void onTitle(CommandSender sender, OnlinePlayer target, String title) { PacketPlayOutTitle packetSubtitle = new PacketPlayOutTitle(PacketPlayOutTitle.EnumTitleAction.TITLE, CraftChatMessage.fromString(Color.translate(title))[0]); - HandlerAbstract.getHandler().sendPacket(target.getPlayer(), packetSubtitle); + HandlerAbstract.getHandler().sendPacketSilently(target.getPlayer(), packetSubtitle); sender.sendMessage(Color.Green + "Sent title!"); } diff --git a/src/main/java/dev/brighten/ac/data/APlayer.java b/src/main/java/dev/brighten/ac/data/APlayer.java index b3ba4a6..333ca42 100644 --- a/src/main/java/dev/brighten/ac/data/APlayer.java +++ b/src/main/java/dev/brighten/ac/data/APlayer.java @@ -18,6 +18,7 @@ import dev.brighten.ac.handler.protocolsupport.ProtocolAPI; import dev.brighten.ac.messages.Messages; import dev.brighten.ac.packet.ProtocolVersion; import dev.brighten.ac.packet.handler.HandlerAbstract; +import dev.brighten.ac.packet.wrapper.WPacket; import dev.brighten.ac.utils.KLocation; import dev.brighten.ac.utils.RunUtils; import dev.brighten.ac.utils.Tuple; @@ -176,7 +177,7 @@ public class APlayer { instantTransaction.put(startId, new Tuple<>(startAction, runnable)); } - HandlerAbstract.getHandler().sendPacket(this, new PacketPlayOutTransaction(0, startId, false)); + HandlerAbstract.getHandler().sendPacketSilently(this, new PacketPlayOutTransaction(0, startId, false)); short finalEndId = endId, finalStartId = startId; Anticheat.INSTANCE.onTickEnd(() -> { @@ -186,7 +187,7 @@ public class APlayer { } HandlerAbstract.getHandler() - .sendPacket(this, new PacketPlayOutTransaction(0, finalEndId, false)); + .sendPacketSilently(this, new PacketPlayOutTransaction(0, finalEndId, false)); }); } @@ -194,6 +195,15 @@ public class APlayer { playerTick++; } + public void sendPacketSilently(Object packet) { + if(sniffing) { + sniffedPackets.add("(Silent) [" + Anticheat.INSTANCE.getKeepaliveProcessor().tick + "] " + + "" + (packet instanceof WPacket ? ((WPacket)packet).getPacketType() + : HandlerAbstract.getPacketType(packet)) + ": " + packet); + } + HandlerAbstract.getHandler().sendPacketSilently(this, packet); + } + public void sendPacket(Object packet) { HandlerAbstract.getHandler().sendPacket(this, packet); } diff --git a/src/main/java/dev/brighten/ac/handler/EntityLocationHandler.java b/src/main/java/dev/brighten/ac/handler/EntityLocationHandler.java index 5a25bc0..5fe05e6 100644 --- a/src/main/java/dev/brighten/ac/handler/EntityLocationHandler.java +++ b/src/main/java/dev/brighten/ac/handler/EntityLocationHandler.java @@ -95,7 +95,8 @@ public class EntityLocationHandler { * @param packet WrappedOutRelativePosition */ void onRelPosition(WPacketPlayOutEntity packet) { - Optional op = Anticheat.INSTANCE.getWorldInfo(data.getBukkitPlayer().getWorld()).getEntity(packet.getId()); + Optional op = Anticheat.INSTANCE.getWorldInfo(data.getBukkitPlayer().getWorld()) + .getEntity(packet.getId()); if(!op.isPresent()) return; @@ -134,7 +135,8 @@ public class EntityLocationHandler { * @param packet WrappedOutEntityTeleportPacket */ void onTeleportSent(WPacketPlayOutEntityTeleport packet) { - Optional op = Anticheat.INSTANCE.getWorldInfo(data.getBukkitPlayer().getWorld()).getEntity(packet.getEntityId()); + Optional op = Anticheat.INSTANCE.getWorldInfo(data.getBukkitPlayer().getWorld()) + .getEntity(packet.getEntityId()); if(!op.isPresent()) return; diff --git a/src/main/java/dev/brighten/ac/handler/MovementHandler.java b/src/main/java/dev/brighten/ac/handler/MovementHandler.java index 5974b72..02af16b 100644 --- a/src/main/java/dev/brighten/ac/handler/MovementHandler.java +++ b/src/main/java/dev/brighten/ac/handler/MovementHandler.java @@ -1,5 +1,6 @@ package dev.brighten.ac.handler; +import com.google.common.collect.Sets; import dev.brighten.ac.data.APlayer; import dev.brighten.ac.data.obj.CMove; import dev.brighten.ac.handler.compat.CompatHandler; @@ -50,8 +51,11 @@ public class MovementHandler { @Setter private boolean excuseNextFlying; + private boolean sentPositionUpdate; + @Getter - private final Timer lastTeleport = new TickTimer(), lastHighRate = new TickTimer(); + private final Timer lastTeleport = new TickTimer(), lastHighRate = new TickTimer(), + lastFlying = new TickTimer(); @Getter private int teleportsToConfirm; @@ -294,6 +298,8 @@ public class MovementHandler { || player.getInfo().isRiptiding() || hasLevitation); + lastFlying.reset(); + /* ata.playerInfo.generalCancel = data.getPlayer().getAllowFlight() || this.creativelastLastY @@ -386,6 +392,22 @@ it this.cinematic = this.ticks > 5; if(cinematic) lastCinematic.reset(); + sentPositionUpdate = false; + } + + private static final Set + relFlags = Sets.newHashSet(WPacketPlayOutPosition.EnumPlayerTeleportFlags.X, + WPacketPlayOutPosition.EnumPlayerTeleportFlags.Y, + WPacketPlayOutPosition.EnumPlayerTeleportFlags.Z, + WPacketPlayOutPosition.EnumPlayerTeleportFlags.X_ROT, + WPacketPlayOutPosition.EnumPlayerTeleportFlags.Y_ROT); + + public void runPositionHackFix() { + if(sentPositionUpdate) return; + + player.sendPacket(WPacketPlayOutPosition.builder().x(0).y(0).z(0).yaw(0).pitch(0).flags(relFlags) + .build()); + sentPositionUpdate = true; } boolean isInvalidGCD() { diff --git a/src/main/java/dev/brighten/ac/handler/PacketHandler.java b/src/main/java/dev/brighten/ac/handler/PacketHandler.java index 66f07f4..e11644a 100644 --- a/src/main/java/dev/brighten/ac/handler/PacketHandler.java +++ b/src/main/java/dev/brighten/ac/handler/PacketHandler.java @@ -16,7 +16,6 @@ import lombok.val; import net.minecraft.server.v1_8_R3.PacketDataSerializer; import net.minecraft.server.v1_8_R3.PacketPlayInCustomPayload; import net.minecraft.server.v1_8_R3.PacketPlayInSteerVehicle; -import net.minecraft.server.v1_8_R3.PacketPlayInTransaction; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.inventory.ItemStack; @@ -30,11 +29,11 @@ public class PacketHandler { long timestamp = System.currentTimeMillis(); switch (type) { case CLIENT_TRANSACTION: { - PacketPlayInTransaction packet = (PacketPlayInTransaction) packetObject; + WPacketPlayInTransaction packet = (WPacketPlayInTransaction) packetObject; - if(packet.a() == 0) { - if(Anticheat.INSTANCE.getKeepaliveProcessor().keepAlives.getIfPresent(packet.b()) != null) { - Anticheat.INSTANCE.getKeepaliveProcessor().addResponse(player, packet.b()); + if(packet.getId() == 0) { + if(Anticheat.INSTANCE.getKeepaliveProcessor().keepAlives.getIfPresent(packet.getAction()) != null) { + Anticheat.INSTANCE.getKeepaliveProcessor().addResponse(player, packet.getAction()); val optional = Anticheat.INSTANCE.getKeepaliveProcessor().getResponse(player); @@ -46,6 +45,11 @@ public class PacketHandler { player.getLagInfo().setLastTransPing(player.getLagInfo().getTransPing()); player.getLagInfo().setTransPing(current - ka.start); + if(player.getPlayerVersion().isOrAbove(ProtocolVersion.V1_9) + && player.getMovement().getLastFlying().isPassed(1)) { + player.getMovement().runPositionHackFix(); + } + if(player.instantTransaction.size() > 0) { synchronized (player.instantTransaction) { Deque toRemove = new LinkedList<>(); @@ -87,7 +91,7 @@ public class PacketHandler { }); player.getLagInfo().getLastClientTransaction().reset(); } - Optional.ofNullable(player.instantTransaction.remove(packet.b())) + Optional.ofNullable(player.instantTransaction.remove(packet.getAction())) .ifPresent(t -> t.two.accept(t.one)); } break; @@ -330,7 +334,7 @@ public class PacketHandler { } } - if(player.sniffing) { + if(player.sniffing && type != PacketType.UNKNOWN) { player.sniffedPackets.add("[" + Anticheat.INSTANCE.getKeepaliveProcessor().tick + "] " + "" + type.name() + ": " + packetObject.toString()); } diff --git a/src/main/java/dev/brighten/ac/handler/entity/FakeMob.java b/src/main/java/dev/brighten/ac/handler/entity/FakeMob.java index 426f12a..1df8c64 100644 --- a/src/main/java/dev/brighten/ac/handler/entity/FakeMob.java +++ b/src/main/java/dev/brighten/ac/handler/entity/FakeMob.java @@ -69,7 +69,7 @@ public class FakeMob { .watchedObjects(objects) .build(); - player.sendPacket(packet); + player.sendPacketSilently(packet); watching.add(player); } @@ -90,14 +90,14 @@ public class FakeMob { .watchedObjects(objects) .build(); - watching.forEach(player -> player.sendPacket(packet)); + watching.forEach(player -> player.sendPacketSilently(packet)); } public void despawn() { for (APlayer aPlayer : watching) { PacketPlayOutEntityDestroy destroyEntity = new PacketPlayOutEntityDestroy(entityId); - aPlayer.sendPacket(destroyEntity); + aPlayer.sendPacketSilently(destroyEntity); } watching = Collections.emptyList(); @@ -108,7 +108,7 @@ public class FakeMob { WPacketPlayOutEntity packet = WPacketPlayOutEntity.builder().id(entityId).x(dx).y(dy).z(dz).moved(true).build(); for (APlayer player : watching) { - player.sendPacket(packet); + player.sendPacketSilently(packet); } } @@ -117,7 +117,7 @@ public class FakeMob { .pitch(dpitch).moved(true).looked(true).build(); for (APlayer player : watching) { - player.sendPacket(packet); + player.sendPacketSilently(packet); } } @@ -126,7 +126,7 @@ public class FakeMob { .looked(true).build(); for (APlayer player : watching) { - player.sendPacket(packet); + player.sendPacketSilently(packet); } } @@ -137,7 +137,7 @@ public class FakeMob { .build(); for (APlayer player : watching) { - player.sendPacket(packet); + player.sendPacketSilently(packet); } } } diff --git a/src/main/java/dev/brighten/ac/handler/keepalive/KeepaliveProcessor.java b/src/main/java/dev/brighten/ac/handler/keepalive/KeepaliveProcessor.java index 678ae56..e8c8c19 100644 --- a/src/main/java/dev/brighten/ac/handler/keepalive/KeepaliveProcessor.java +++ b/src/main/java/dev/brighten/ac/handler/keepalive/KeepaliveProcessor.java @@ -5,12 +5,12 @@ import com.google.common.cache.CacheBuilder; import dev.brighten.ac.Anticheat; import dev.brighten.ac.data.APlayer; import dev.brighten.ac.packet.handler.HandlerAbstract; +import dev.brighten.ac.packet.wrapper.out.WPacketPlayOutTransaction; import dev.brighten.ac.utils.BukkitRunnable; import dev.brighten.ac.utils.RunUtils; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMaps; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import net.minecraft.server.v1_8_R3.PacketPlayOutTransaction; import org.bukkit.scheduler.BukkitTask; import java.util.Optional; @@ -60,9 +60,10 @@ public class KeepaliveProcessor implements BukkitRunnable { .getNearbyEntities(2 + dh, 3 + dy, 2 + dh); } - PacketPlayOutTransaction transaction = new PacketPlayOutTransaction(0, currentKeepalive.id, false); + WPacketPlayOutTransaction transaction = WPacketPlayOutTransaction.builder().id(0) + .action(currentKeepalive.id).accept(false).build(); - HandlerAbstract.getHandler().sendPacket(value.getBukkitPlayer(), transaction); + HandlerAbstract.getHandler().sendPacketSilently(value.getBukkitPlayer(), transaction); } } diff --git a/src/main/java/dev/brighten/ac/listener/JoinListener.java b/src/main/java/dev/brighten/ac/listener/JoinListener.java index 8f802cc..fd306b1 100644 --- a/src/main/java/dev/brighten/ac/listener/JoinListener.java +++ b/src/main/java/dev/brighten/ac/listener/JoinListener.java @@ -41,7 +41,7 @@ public class JoinListener implements Listener { if (watchedObject.getDataValueId() == 6 && watchedObject.getWatchedObject() instanceof Float) { watchedObject.setWatchedObject(1f); - HandlerAbstract.getHandler().sendPacket(player, packet.getPacket()); + HandlerAbstract.getHandler().sendPacketSilently(player, packet.getPacket()); event.setCancelled(true); break; } @@ -67,7 +67,7 @@ public class JoinListener implements Listener { Object packetToSend = null; synchronized (player.getPacketQueue()) { while((packetToSend = player.getPacketQueue().pollFirst()) != null) { - HandlerAbstract.getHandler().sendPacket(player, packetToSend); + HandlerAbstract.getHandler().sendPacketSilently(player, packetToSend); } } player.setSendingPackets(false); diff --git a/src/main/java/dev/brighten/ac/packet/handler/HandlerAbstract.java b/src/main/java/dev/brighten/ac/packet/handler/HandlerAbstract.java index 56cfa13..8653b56 100644 --- a/src/main/java/dev/brighten/ac/packet/handler/HandlerAbstract.java +++ b/src/main/java/dev/brighten/ac/packet/handler/HandlerAbstract.java @@ -2,6 +2,7 @@ package dev.brighten.ac.packet.handler; import dev.brighten.ac.data.APlayer; import dev.brighten.ac.packet.ProtocolVersion; +import dev.brighten.ac.packet.wrapper.PacketType; import dev.brighten.ac.utils.reflections.Reflections; import dev.brighten.ac.utils.reflections.types.WrappedClass; import dev.brighten.ac.utils.reflections.types.WrappedField; @@ -32,10 +33,23 @@ public abstract class HandlerAbstract{ public abstract void remove(Player player); + public abstract void sendPacketSilently(Player player, Object packet); + + public abstract void sendPacketSilently(APlayer player, Object packet); + public abstract void sendPacket(Player player, Object packet); public abstract void sendPacket(APlayer player, Object packet); + public static PacketType getPacketType(Object object) { + String name = object.getClass().getName(); + int index = name.lastIndexOf("."); + String packetName = name.substring(index + 1); + + return PacketType + .getByPacketId(packetName).orElse(PacketType.UNKNOWN); + } + public void shutdown() { handler.shutdown(); handler = null; diff --git a/src/main/java/dev/brighten/ac/packet/handler/LegacyHandler.java b/src/main/java/dev/brighten/ac/packet/handler/LegacyHandler.java index cc0e322..1e22693 100644 --- a/src/main/java/dev/brighten/ac/packet/handler/LegacyHandler.java +++ b/src/main/java/dev/brighten/ac/packet/handler/LegacyHandler.java @@ -22,12 +22,14 @@ import java.util.HashMap; import java.util.Map; import java.util.Set; +//TODO Make this feature-parody with ModernHandler public class LegacyHandler extends HandlerAbstract { private final Map channelCache = new HashMap<>(); - private Set uninjectedChannels = Collections.newSetFromMap(new MapMaker().weakKeys().makeMap()); + private final Set uninjectedChannels = Collections.newSetFromMap(new MapMaker().weakKeys().makeMap()); - private static WrappedField fieldChannel = new WrappedClass(NetworkManager.class).getFieldByType(Channel.class, 0); + private final static WrappedField fieldChannel = new WrappedClass(NetworkManager.class) + .getFieldByType(Channel.class, 0); @Override public void add(Player player) { @@ -60,6 +62,18 @@ public class LegacyHandler extends HandlerAbstract { channel.eventLoop().execute(() -> channel.pipeline().remove(handlerName)); } + @Override + public void sendPacketSilently(Player player, Object packet) { + if(packet instanceof WPacket) { + getChannel(player).pipeline().writeAndFlush(((WPacket) packet).getPacket()); + } else getChannel(player).pipeline().writeAndFlush(packet); + } + + @Override + public void sendPacketSilently(APlayer player, Object packet) { + this.sendPacketSilently(player.getBukkitPlayer(), packet); + } + @Override public void sendPacket(Player player, Object packet) { if(packet instanceof WPacket) { @@ -69,7 +83,7 @@ public class LegacyHandler extends HandlerAbstract { @Override public void sendPacket(APlayer player, Object packet) { - this.sendPacket(player.getBukkitPlayer(), packet); + sendPacket(player.getBukkitPlayer(), packet); } @Override diff --git a/src/main/java/dev/brighten/ac/packet/handler/ModernHandler.java b/src/main/java/dev/brighten/ac/packet/handler/ModernHandler.java index d24804c..978a413 100644 --- a/src/main/java/dev/brighten/ac/packet/handler/ModernHandler.java +++ b/src/main/java/dev/brighten/ac/packet/handler/ModernHandler.java @@ -17,25 +17,27 @@ import org.bukkit.Bukkit; import org.bukkit.entity.Player; import java.lang.reflect.Method; -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; import java.util.logging.Level; public class ModernHandler extends HandlerAbstract { private final Map channelCache = new HashMap<>(); - private Map protocolLookup = new MapMaker().weakKeys().makeMap(); - private final Set uninjectedChannels = Collections.newSetFromMap(new MapMaker().weakKeys().makeMap()); + private final Map protocolLookup = new MapMaker().weakKeys().makeMap(); - private ChannelInboundHandlerAdapter serverChannelHandler; - private ChannelInitializer beginInitProtocol; - private ChannelInitializer endInitProtocol; - private List serverChannels = Lists.newArrayList(); + private final ChannelInboundHandlerAdapter serverChannelHandler; + private final ChannelInitializer beginInitProtocol; + private final ChannelInitializer endInitProtocol; + private final List serverChannels = Lists.newArrayList(); public ModernHandler() { endInitProtocol = new ChannelInitializer() { @Override - protected void initChannel(Channel channel) throws Exception { + protected void initChannel(Channel channel) { try { // Stop injecting channels if (Anticheat.INSTANCE.isEnabled()) { @@ -52,7 +54,7 @@ public class ModernHandler extends HandlerAbstract { beginInitProtocol = new ChannelInitializer() { @Override - protected void initChannel(Channel channel) throws Exception { + protected void initChannel(Channel channel) { channel.pipeline().addLast(endInitProtocol); } @@ -61,7 +63,7 @@ public class ModernHandler extends HandlerAbstract { serverChannelHandler = new ChannelInboundHandlerAdapter() { @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + public void channelRead(ChannelHandlerContext ctx, Object msg) { Channel channel = (Channel) msg; channel.pipeline().addFirst(beginInitProtocol); ctx.fireChannelRead(msg); @@ -149,13 +151,6 @@ public class ModernHandler extends HandlerAbstract { }); } - @Override - public void sendPacket(Player player, Object packet) { - if(packet instanceof WPacket) { - getChannel(player).pipeline().writeAndFlush((new SilentObject(((WPacket) packet).getPacket()))); - } else getChannel(player).pipeline().writeAndFlush(new SilentObject(packet)); - } - @Override public void shutdown() { Bukkit.getOnlinePlayers().forEach(this::remove); @@ -172,9 +167,28 @@ public class ModernHandler extends HandlerAbstract { serverChannels.clear(); } + @Override + public void sendPacketSilently(Player player, Object packet) { + if(packet instanceof WPacket) { + getChannel(player).pipeline().writeAndFlush((new SilentObject(((WPacket) packet).getPacket()))); + } else getChannel(player).pipeline().writeAndFlush(new SilentObject(packet)); + } + + @Override + public void sendPacketSilently(APlayer player, Object packet) { + this.sendPacketSilently(player.getBukkitPlayer(), packet); + } + + @Override + public void sendPacket(Player player, Object packet) { + if(packet instanceof WPacket) { + getChannel(player).pipeline().writeAndFlush(((WPacket) packet).getPacket()); + } else getChannel(player).pipeline().writeAndFlush(packet); + } + @Override public void sendPacket(APlayer player, Object packet) { - this.sendPacket(player.getBukkitPlayer(), packet); + sendPacket(player.getBukkitPlayer(), packet); } @Override @@ -199,12 +213,7 @@ public class ModernHandler extends HandlerAbstract { return; } - String name = msg.getClass().getName(); - int index = name.lastIndexOf("."); - String packetName = name.substring(index + 1); - - PacketType type = PacketType - .getByPacketId(packetName).orElse(PacketType.UNKNOWN); + PacketType type = HandlerAbstract.getPacketType(msg); if(type == PacketType.LOGIN_START) { PacketLoginInStart packet = (PacketLoginInStart) msg; @@ -247,14 +256,10 @@ public class ModernHandler extends HandlerAbstract { return; } - String name = msg.getClass().getName(); - int index = name.lastIndexOf("."); - String packetName = name.substring(index + 1); - if(player != null) { try { - Object returnedObject = Anticheat.INSTANCE.getPacketProcessor().call(player, msg, PacketType - .getByPacketId(packetName).orElse(PacketType.UNKNOWN)); + Object returnedObject = Anticheat.INSTANCE.getPacketProcessor().call(player, msg, + HandlerAbstract.getPacketType(msg)); if (returnedObject != null) { super.write(ctx, returnedObject, promise); diff --git a/src/main/java/dev/brighten/ac/packet/wrapper/PacketConverter.java b/src/main/java/dev/brighten/ac/packet/wrapper/PacketConverter.java index fc4ff66..5b8375a 100644 --- a/src/main/java/dev/brighten/ac/packet/wrapper/PacketConverter.java +++ b/src/main/java/dev/brighten/ac/packet/wrapper/PacketConverter.java @@ -27,6 +27,8 @@ public interface PacketConverter { WPacketPlayOutPosition processServerPosition(Object object); + Object processServerPosition(WPacketPlayOutPosition packet); + WPacketPlayOutAttachEntity processAttach(Object object); WPacketPlayOutEntity processOutEntity(Object object); @@ -78,4 +80,10 @@ public interface PacketConverter { Object processEntityMetadata(WPacketPlayOutEntityMetadata packet); WPacketPlayOutEntityDestroy processEntityDestroy(Object object); + + WPacketPlayInTransaction processClientTransaction(Object object); + + WPacketPlayOutTransaction processServerTransaction(Object object); + + Object processServerTransaction(WPacketPlayOutTransaction packet); } diff --git a/src/main/java/dev/brighten/ac/packet/wrapper/PacketType.java b/src/main/java/dev/brighten/ac/packet/wrapper/PacketType.java index f36de55..ca026f6 100644 --- a/src/main/java/dev/brighten/ac/packet/wrapper/PacketType.java +++ b/src/main/java/dev/brighten/ac/packet/wrapper/PacketType.java @@ -144,6 +144,10 @@ public enum PacketType { return convert.processEntityMetadata(object); case ENTITY_DESTROY: return convert.processEntityDestroy(object); + case CLIENT_TRANSACTION: + return convert.processClientTransaction(object); + case SERVER_TRANSACTION: + return convert.processServerTransaction(object); default: return object; } diff --git a/src/main/java/dev/brighten/ac/packet/wrapper/impl/Processor_18.java b/src/main/java/dev/brighten/ac/packet/wrapper/impl/Processor_18.java index 0a64c92..8dd6c28 100644 --- a/src/main/java/dev/brighten/ac/packet/wrapper/impl/Processor_18.java +++ b/src/main/java/dev/brighten/ac/packet/wrapper/impl/Processor_18.java @@ -185,6 +185,14 @@ public class Processor_18 implements PacketConverter { .build(); } + @Override + public Object processServerPosition(WPacketPlayOutPosition packet) { + return new PacketPlayOutPosition(packet.getX(), packet.getY(), packet.getZ(), packet.getYaw(), packet.getPitch(), + packet.getFlags().stream() + .map(f -> PacketPlayOutPosition.EnumPlayerTeleportFlags.valueOf(f.name())) + .collect(Collectors.toSet())); + } + @Override public WPacketPlayOutAttachEntity processAttach(Object object) { PacketDataSerializer serial = new PacketDataSerializer(Unpooled.buffer()); @@ -704,6 +712,37 @@ public class Processor_18 implements PacketConverter { return WPacketPlayOutEntityDestroy.builder().entityIds(entityIds).build(); } + @Override + public WPacketPlayInTransaction processClientTransaction(Object object) { + PacketPlayInTransaction packet = (PacketPlayInTransaction) object; + PacketDataSerializer serialized = serialize(packet); + + int id = serialized.readByte(); + short action = serialized.readShort(); + boolean accept = serialized.readByte() != 0; + + return WPacketPlayInTransaction.builder().id(id).action(action) + .accept(accept).build(); + } + + @Override + public WPacketPlayOutTransaction processServerTransaction(Object object) { + PacketPlayOutTransaction packet = (PacketPlayOutTransaction) object; + PacketDataSerializer serialized = serialize(packet); + + int id = serialized.readUnsignedByte(); + short action = serialized.readShort(); + boolean accept = serialized.readBoolean(); + + return WPacketPlayOutTransaction.builder().id(id).action(action).accept(accept) + .build(); + } + + @Override + public Object processServerTransaction(WPacketPlayOutTransaction packet) { + return new PacketPlayOutTransaction(packet.getId(), packet.getAction(), packet.isAccept()); + } + private PacketDataSerializer serialize(Packet packet) { PacketDataSerializer serial = new PacketDataSerializer(Unpooled.buffer()); try { diff --git a/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInTransaction.java b/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInTransaction.java new file mode 100644 index 0000000..a33b9c7 --- /dev/null +++ b/src/main/java/dev/brighten/ac/packet/wrapper/in/WPacketPlayInTransaction.java @@ -0,0 +1,48 @@ +package dev.brighten.ac.packet.wrapper.in; + +import dev.brighten.ac.packet.wrapper.PacketType; +import dev.brighten.ac.packet.wrapper.WPacket; +import lombok.Builder; +import lombok.Getter; + +import java.util.Objects; + +@Getter +@Builder +public class WPacketPlayInTransaction extends WPacket { + private int id; + private short action; + private boolean accept; + + @Override + public PacketType getPacketType() { + return PacketType.CLIENT_TRANSACTION; + } + + @Override + public Object getPacket() { + return null; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + WPacketPlayInTransaction that = (WPacketPlayInTransaction) o; + return id == that.id && action == that.action && accept == that.accept; + } + + @Override + public int hashCode() { + return Objects.hash(id, action, accept); + } + + @Override + public String toString() { + return "WPacketPlayInTransaction{" + + "id=" + id + + ", action=" + action + + ", accept=" + accept + + '}'; + } +} diff --git a/src/main/java/dev/brighten/ac/packet/wrapper/out/WPacketPlayOutPosition.java b/src/main/java/dev/brighten/ac/packet/wrapper/out/WPacketPlayOutPosition.java index 247a155..7e0b712 100644 --- a/src/main/java/dev/brighten/ac/packet/wrapper/out/WPacketPlayOutPosition.java +++ b/src/main/java/dev/brighten/ac/packet/wrapper/out/WPacketPlayOutPosition.java @@ -1,5 +1,6 @@ package dev.brighten.ac.packet.wrapper.out; +import dev.brighten.ac.Anticheat; import dev.brighten.ac.packet.wrapper.PacketType; import dev.brighten.ac.packet.wrapper.WPacket; import lombok.Builder; @@ -26,7 +27,7 @@ public class WPacketPlayOutPosition extends WPacket { @Override public Object getPacket() { - return null; + return Anticheat.INSTANCE.getPacketProcessor().getPacketConverter().processServerPosition(this); } public enum EnumPlayerTeleportFlags { diff --git a/src/main/java/dev/brighten/ac/utils/Helper.java b/src/main/java/dev/brighten/ac/utils/Helper.java index 77cacb1..69b9607 100644 --- a/src/main/java/dev/brighten/ac/utils/Helper.java +++ b/src/main/java/dev/brighten/ac/utils/Helper.java @@ -59,7 +59,7 @@ public class Helper { .longD(true) .data(new int[0]) .build(); - players.forEach(p -> HandlerAbstract.getHandler().sendPacket(p, packet)); + players.forEach(p -> HandlerAbstract.getHandler().sendPacketSilently(p, packet)); } } @@ -119,7 +119,7 @@ public class Helper { while(var14.hasNext()) { Player p = var14.next(); - HandlerAbstract.getHandler().sendPacket(p, packet); + HandlerAbstract.getHandler().sendPacketSilently(p, packet); } } } @@ -144,7 +144,7 @@ public class Helper { while(var4.hasNext()) { Player p = var4.next(); - HandlerAbstract.getHandler().sendPacket(p, packet); + HandlerAbstract.getHandler().sendPacketSilently(p, packet); } }