Adding health spoofing

- Optimized Materials class code.
- Optimized Horizontal
- Added kauri to command.
- Added health spoofing in JoinListener.
This commit is contained in:
Dawson
2022-09-22 16:58:34 -04:00
parent f463cda029
commit decd4e3c51
11 changed files with 90 additions and 94 deletions
@@ -296,18 +296,14 @@ public class Horizontal extends Check {
tagsBuilder.addTag("sneak-edge");
}
List<SimpleCollisionBox> collisionBoxes = Helper.getCollisions(player.getBukkitPlayer().getWorld(),
box.copy()
.addCoord(lmotionX ,lmotionY, lmotionZ), Materials.SOLID);
List<SimpleCollisionBox> collisionBoxes = Helper.toCollisionsDowncasted(Helper
.blockCollisions(player.getBlockInfo().blocks, box.copy()
.addCoord(lmotionX ,lmotionY, lmotionZ), Materials.SOLID));
double beforeY = lmotionY;
int yCount = 0;
for (SimpleCollisionBox blockBox : collisionBoxes) {
yCount++;
lmotionY = blockBox.calculateYOffset(box, lmotionY);
}
double afterY = lmotionY;
box = box.offset(0, lmotionY, 0);
boolean stepped = onGround || (originalY != lmotionY && originalY < 0);
@@ -456,7 +452,6 @@ public class Horizontal extends Check {
pmotionz = y;
pmotiony = z;
tagsBuilder.addTag(String.format("X: %.6f, Y: %.6f, z: %.6f", originalX, originalY, originalZ));
tags = tagsBuilder;
if (deltaAll < precision) {
@@ -649,4 +644,4 @@ public class Horizontal extends Check {
private static float roundToFloat(double d) {
return (float) ((double) Math.round(d * 1.0E8D) / 1.0E8D);
}
}
}
@@ -1,39 +0,0 @@
package dev.brighten.ac.check.impl.packet;
import dev.brighten.ac.api.check.CheckType;
import dev.brighten.ac.check.Check;
import dev.brighten.ac.check.CheckData;
import dev.brighten.ac.check.WAction;
import dev.brighten.ac.data.APlayer;
import dev.brighten.ac.packet.wrapper.out.WPacketPlayOutEntityMetadata;
import dev.brighten.ac.packet.wrapper.out.WPacketPlayOutSpawnEntityLiving;
@CheckData(name = "Metadata", checkId = "metadata", type = CheckType.BADPACKETS)
public class Metadata extends Check {
public Metadata(APlayer player) {
super(player);
}
WAction<WPacketPlayOutEntityMetadata> packet = packet -> {
debug("entityId: " + packet.getEntityId());
packet.getWatchedObjects().forEach(watchedObject -> {
debug("watchedObject: " + watchedObject.getObjectType() + "," + watchedObject.getDataValueId() + ", " + watchedObject.getWatchedObject());
});
};
WAction<WPacketPlayOutSpawnEntityLiving> spawn = packet -> {
debug("(spawned) entityId: " + packet.getEntityId());
packet.getWatchedObjects().forEach(watchedObject -> {
if(watchedObject.getDataValueId() == 0) {
byte bitInfo = (byte) watchedObject.getWatchedObject();
boolean sneaking = (bitInfo & 1 << 1) != 0;
boolean sprinting = (bitInfo & 1 << 3) != 0;
boolean invisible = (bitInfo & 1 << 5) != 0;
debug("sneaking:%s sprinting:%s invisible:%s", sneaking, sprinting, invisible);
}
debug("watchedObject: " + watchedObject.getObjectType() + "," + watchedObject.getDataValueId() + ", " + watchedObject.getWatchedObject());
});
};
}
@@ -47,7 +47,7 @@ import java.util.stream.Collectors;
import java.util.zip.CRC32;
@Init
@CommandAlias("anticheat|ac")
@CommandAlias("kauri|anticheat|ac")
@CommandPermission("anticheat.command")
public class AnticheatCommand extends BaseCommand {
@@ -3,8 +3,13 @@ package dev.brighten.ac.listener;
import dev.brighten.ac.Anticheat;
import dev.brighten.ac.data.APlayer;
import dev.brighten.ac.packet.handler.HandlerAbstract;
import dev.brighten.ac.packet.wrapper.PacketType;
import dev.brighten.ac.packet.wrapper.objects.WrappedWatchableObject;
import dev.brighten.ac.packet.wrapper.out.WPacketPlayOutEntityMetadata;
import dev.brighten.ac.packet.wrapper.out.WPacketPlayOutNamedEntitySpawn;
import dev.brighten.ac.utils.RunUtils;
import dev.brighten.ac.utils.annotation.Init;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@@ -28,6 +33,25 @@ public class JoinListener implements Listener {
.process(player, event.getType(), event.getPacket())) {
event.setCancelled(true);
}
if(event.getType().equals(PacketType.ENTITY_METADATA)) {
WPacketPlayOutEntityMetadata packet = event.getPacket();
for (WrappedWatchableObject watchedObject : packet.getWatchedObjects()) {
if(watchedObject.getDataValueId() == 6 && watchedObject.getWatchedObject() instanceof Float) {
watchedObject.setWatchedObject(1f);
Bukkit.broadcastMessage("Set watched object and sending packet:"
+ watchedObject.getWatchedObject());
HandlerAbstract.getHandler().sendPacket(player, packet.getPacket());
event.setCancelled(true);
break;
}
}
} else if(event.getType().equals(PacketType.NAMED_ENTITY_SPAWN)) {
WPacketPlayOutNamedEntitySpawn packet = event.getPacket();
}
});
});
@@ -42,7 +66,7 @@ public class JoinListener implements Listener {
if(player.isSendingPackets()) return;
/*if(event.getType().equals(PacketType.CLIENT_TRANSACTION)) {
if(event.getType().equals(PacketType.CLIENT_TRANSACTION)) {
if(player.getPacketQueue().size() > 0) {
player.setSendingPackets(true);
Object packetToSend = null;
@@ -73,7 +97,7 @@ public class JoinListener implements Listener {
break;
}
}
}*/
}
});
}
@@ -12,6 +12,7 @@ import dev.brighten.ac.utils.reflections.impl.CraftReflection;
import dev.brighten.ac.utils.reflections.impl.MinecraftReflection;
import dev.brighten.ac.utils.reflections.types.WrappedClass;
import io.netty.channel.*;
import lombok.SneakyThrows;
import net.minecraft.server.v1_8_R3.PacketLoginInStart;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@@ -152,8 +153,8 @@ public class ModernHandler extends HandlerAbstract {
@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);
getChannel(player).pipeline().writeAndFlush((new SilentObject(((WPacket) packet).getPacket())));
} else getChannel(player).pipeline().writeAndFlush(new SilentObject(packet));
}
@Override
@@ -192,7 +193,13 @@ public class ModernHandler extends HandlerAbstract {
private Player player;
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
if(msg instanceof SilentObject) {
super.channelRead(ctx, ((SilentObject)msg).packet);
return;
}
String name = msg.getClass().getName();
int index = name.lastIndexOf(".");
String packetName = name.substring(index + 1);
@@ -229,16 +236,18 @@ public class ModernHandler extends HandlerAbstract {
}
}
} else {
try {
super.channelRead(ctx, msg);
} catch (Exception e) {
e.printStackTrace();
}
super.channelRead(ctx, msg);
}
}
@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
if(msg instanceof SilentObject) {
super.write(ctx, ((SilentObject)msg).packet, promise);
return;
}
String name = msg.getClass().getName();
int index = name.lastIndexOf(".");
String packetName = name.substring(index + 1);
@@ -0,0 +1,8 @@
package dev.brighten.ac.packet.handler;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
class SilentObject {
public final Object packet;
}
@@ -159,6 +159,10 @@ public class PacketProcessor {
for (ListenerEntry tuple : list) {
tuple.getListener().onEvent(asyncInfo);
if (asyncInfo.isCancelled()) {
cancelled = true;
}
}
}
return cancelled ? null : info.getPacket();
@@ -591,16 +591,11 @@ public class Processor_18 implements PacketConverter {
PacketPlayOutNamedEntitySpawn packet = (PacketPlayOutNamedEntitySpawn) object;
PacketDataSerializer serial = serialize(packet);
WPacketPlayOutNamedEntitySpawn nes = WPacketPlayOutNamedEntitySpawn.builder().entityId(serial.e()).uuid(serial.g())
return WPacketPlayOutNamedEntitySpawn.builder().entityId(serial.e()).uuid(serial.g())
.x(serial.readInt() / 32.).y(serial.readInt() / 32.).z(serial.readInt() / 32.)
.yaw(serial.readByte() * 360.F / 256.F).pitch(serial.readByte() * 360.F / 256.F)
.itemInHand(MiscUtils.getById(serial.readShort()))
.build();
return nes;
}
@Override
@@ -627,8 +622,8 @@ public class Processor_18 implements PacketConverter {
return vanilla;
}
private static WrappedClass classSpawnEntityLiving = new WrappedClass(PacketPlayOutSpawnEntityLiving.class);
private static WrappedField splDataWatcher = classSpawnEntityLiving.getFieldByType(DataWatcher.class, 0),
private static final WrappedClass classSpawnEntityLiving = new WrappedClass(PacketPlayOutSpawnEntityLiving.class);
private static final WrappedField splDataWatcher = classSpawnEntityLiving.getFieldByType(DataWatcher.class, 0),
splWatchList = classSpawnEntityLiving.getFieldByType(List.class, 0);
@SneakyThrows
@@ -652,8 +647,8 @@ public class Processor_18 implements PacketConverter {
return builder.build();
}
private static WrappedClass dataWatcherClass = new WrappedClass(DataWatcher.class);
private static WrappedField watchableMap = dataWatcherClass.getFieldByName("d");
private static final WrappedClass dataWatcherClass = new WrappedClass(DataWatcher.class);
private static final WrappedField watchableMap = dataWatcherClass.getFieldByName("d");
@Override
public Object processSpawnLiving(WPacketPlayOutSpawnEntityLiving packet) {
PacketPlayOutSpawnEntityLiving vanilla = new PacketPlayOutSpawnEntityLiving();
@@ -674,10 +669,9 @@ public class Processor_18 implements PacketConverter {
try {
DataWatcher watcher = new DataWatcher(null);
packet.getWatchedObjects().forEach(w ->{
watcher.a(w.getDataValueId(), w.getWatchedObject());
System.out.println("Adding object: " + w.getDataValueId() + ";" + w.getWatchedObject());
});
for (WrappedWatchableObject w : packet.getWatchedObjects()) {
watcher.a(w.getDataValueId(), w.getWatchedObject());;
}
watcher.a(serializer);
splDataWatcher.set(vanilla, watcher);
@@ -751,7 +745,7 @@ public class Processor_18 implements PacketConverter {
serialized.b(packet.getEntityId());
List<DataWatcher.WatchableObject> watchedObjects = packet.getWatchedObjects().stream()
.map(w -> (DataWatcher.WatchableObject)w.getVanillaObject()).collect(Collectors.toList());
.map(w -> (DataWatcher.WatchableObject)w.toVanillaObject()).collect(Collectors.toList());
try {
DataWatcher.a(watchedObjects, serialized);
@@ -790,7 +784,6 @@ public class Processor_18 implements PacketConverter {
private static void writePacketData(PacketDataSerializer serializer, List<WrappedWatchableObject> objects) {
for (WrappedWatchableObject object : objects) {
System.out.println("Writing object:" + object.getDataValueId() + ";" + object.getWatchedObject());
int i = (object.getObjectType() << 5 | object.getDataValueId() & 31) & 255;
serializer.writeByte(i);
switch (object.getObjectType()) {
@@ -6,11 +6,13 @@ import dev.brighten.ac.packet.wrapper.WPacket;
import dev.brighten.ac.packet.wrapper.objects.WrappedWatchableObject;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Builder
@Getter
@Setter
public class WPacketPlayOutEntityMetadata extends WPacket {
private int entityId;
@@ -5,12 +5,14 @@ import dev.brighten.ac.packet.wrapper.PacketType;
import dev.brighten.ac.packet.wrapper.WPacket;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import java.util.UUID;
@Getter
@Setter
@Builder
public class WPacketPlayOutNamedEntitySpawn extends WPacket {
@@ -19,28 +19,38 @@ public class Materials {
static {
for (int i = 0; i < MATERIAL_FLAGS.length; i++) {
Material material = Material.values()[i];
Material mat = Material.values()[i];
//We use the one in BlockUtils also since we can't trust Material to include everything.
if (material.isSolid() || material.name().contains("COMPARATOR") || material.name().contains("DIODE")) {
if (mat.isSolid() || mat.name().contains("COMPARATOR") || mat.name().contains("DIODE")) {
MATERIAL_FLAGS[i] |= SOLID;
}
if (material.name().endsWith("_STAIRS")) {
if (mat.name().endsWith("_STAIRS")) {
MATERIAL_FLAGS[i] |= STAIRS;
}
if (material.name().contains("SLAB") || material.name().contains("STEP")) {
if (mat.name().contains("SLAB") || mat.name().contains("STEP")) {
MATERIAL_FLAGS[i] |= SLABS;
}
if(material.name().contains("SKULL"))
if(mat.name().contains("SKULL"))
MATERIAL_FLAGS[i] = SOLID;
if(material.name().contains("STATIONARY") || material.name().contains("LAVA") || material.name().contains("WATER")) {
if(material.name().contains("LAVA")) {
if(mat.name().contains("STATIONARY") || mat.name().contains("LAVA") || mat.name().contains("WATER")) {
if(mat.name().contains("LAVA")) {
MATERIAL_FLAGS[i] |= LIQUID | LAVA;
} else MATERIAL_FLAGS[i] |= LIQUID | WATER;
}
if (mat.name().contains("FENCE")) {
if(!mat.name().contains("GATE")) MATERIAL_FLAGS[mat.ordinal()] |= FENCE;
}
if(mat.name().contains("WALL")) MATERIAL_FLAGS[mat.ordinal()] |= WALL;
if(mat.name().contains("PLATE")) MATERIAL_FLAGS[mat.ordinal()] = 0;
if(mat.name().contains("BED") && !mat.name().contains("ROCK")) MATERIAL_FLAGS[mat.ordinal()] |= SLABS;
if(mat.name().contains("ICE")) MATERIAL_FLAGS[mat.ordinal()] |= ICE;
if(mat.name().contains("CARPET")) MATERIAL_FLAGS[mat.ordinal()] = SOLID;
if(mat.name().contains("SIGN")) MATERIAL_FLAGS[mat.ordinal()] = 0;
}
// fix some types where isSolid() returns the wrong value
@@ -60,18 +70,6 @@ public class Materials {
// ladders
MATERIAL_FLAGS[XMaterial.LADDER.parseMaterial().ordinal()] |= LADDER | SOLID;
MATERIAL_FLAGS[XMaterial.VINE.parseMaterial().ordinal()] |= LADDER | SOLID;
for (Material mat : Material.values()) {
if(!mat.isBlock()) continue;
if (mat.name().contains("FENCE")) {
if(!mat.name().contains("GATE")) MATERIAL_FLAGS[mat.ordinal()] |= FENCE;
}
if(mat.name().contains("WALL")) MATERIAL_FLAGS[mat.ordinal()] |= WALL;
if(mat.name().contains("PLATE")) MATERIAL_FLAGS[mat.ordinal()] = 0;
if(mat.name().contains("BED") && !mat.name().contains("ROCK")) MATERIAL_FLAGS[mat.ordinal()] |= SLABS;
if(mat.name().contains("ICE")) MATERIAL_FLAGS[mat.ordinal()] |= ICE;
if(mat.name().contains("CARPET")) MATERIAL_FLAGS[mat.ordinal()] = SOLID;
if(mat.name().contains("SIGN")) MATERIAL_FLAGS[mat.ordinal()] = 0;
}
}
public static int getBitmask(Material material) {