package keystrokesmod.module.impl.other; import keystrokesmod.module.Module; import keystrokesmod.module.impl.world.AntiBot; import keystrokesmod.module.setting.impl.ButtonSetting; import keystrokesmod.module.setting.impl.DescriptionSetting; import keystrokesmod.module.setting.impl.SliderSetting; import keystrokesmod.utility.BlockUtils; import keystrokesmod.utility.PlayerData; import keystrokesmod.utility.Utils; import net.minecraft.block.BlockAir; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.event.ClickEvent; import net.minecraft.item.ItemBlock; import net.minecraft.util.BlockPos; import net.minecraft.util.ChatComponentText; import net.minecraft.util.ChatStyle; import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import java.util.HashMap; import java.util.UUID; public class Anticheat extends Module { private SliderSetting interval; private ButtonSetting enemyAdd; private ButtonSetting autoReport; private ButtonSetting ignoreTeammates; private ButtonSetting atlasSuspect; private ButtonSetting shouldPing; private ButtonSetting autoBlock; private ButtonSetting noFall; private ButtonSetting noSlow; private ButtonSetting scaffold; private ButtonSetting legitScaffold; private HashMap> flags = new HashMap<>(); private HashMap players = new HashMap<>(); private long lastAlert; public Anticheat() { super("Anticheat", category.other); this.registerSetting(new DescriptionSetting("Tries to detect cheaters.")); this.registerSetting(interval = new SliderSetting("Flag interval", " second", 20.0, 0.0, 60.0, 1.0)); this.registerSetting(enemyAdd = new ButtonSetting("Add cheaters as enemy", false)); this.registerSetting(autoReport = new ButtonSetting("Auto report", false)); this.registerSetting(ignoreTeammates = new ButtonSetting("Ignore teammates", false)); this.registerSetting(atlasSuspect = new ButtonSetting("Only atlas suspect", false)); this.registerSetting(shouldPing = new ButtonSetting("Should ping", true)); this.registerSetting(new DescriptionSetting("Detected cheats")); this.registerSetting(autoBlock = new ButtonSetting("Autoblock", true)); this.registerSetting(noFall = new ButtonSetting("NoFall", true)); this.registerSetting(noSlow = new ButtonSetting("NoSlow", true)); this.registerSetting(scaffold = new ButtonSetting("Scaffold", true)); this.registerSetting(legitScaffold = new ButtonSetting("Legit scaffold", true)); this.closetModule = true; } private void alert(final EntityPlayer entityPlayer, ButtonSetting mode) { if (Utils.isFriended(entityPlayer) || (ignoreTeammates.isToggled() && Utils.isTeamMate(entityPlayer))) { return; } if (atlasSuspect.isToggled()) { if (!entityPlayer.getName().equals("Suspect§r")) { return; } } else if (enemyAdd.isToggled()) { Utils.addEnemy(entityPlayer.getName()); } final long currentTimeMillis = System.currentTimeMillis(); if (interval.getInput() > 0.0) { HashMap hashMap = flags.get(entityPlayer.getUniqueID()); if (hashMap == null) { hashMap = new HashMap<>(); } else { final Long n = hashMap.get(mode); if (n != null && Utils.timeBetween(n, currentTimeMillis) <= interval.getInput() * 1000.0) { return; } } hashMap.put(mode, currentTimeMillis); flags.put(entityPlayer.getUniqueID(), hashMap); } final ChatComponentText chatComponentText = new ChatComponentText(Utils.formatColor("&7[&dR&7]&r " + entityPlayer.getDisplayName().getUnformattedText() + " &7detected for &d" + mode.getName())); final ChatStyle chatStyle = new ChatStyle(); chatStyle.setChatClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/wdr " + entityPlayer.getName())); chatComponentText.appendSibling(new ChatComponentText(Utils.formatColor(" §7[§cWDR§7]")).setChatStyle(chatStyle)); mc.thePlayer.addChatMessage(chatComponentText); if (shouldPing.isToggled() && Utils.timeBetween(lastAlert, currentTimeMillis) >= 1500L) { mc.thePlayer.playSound("note.pling", 1.0f, 1.0f); lastAlert = currentTimeMillis; } if (autoReport.isToggled() && !Utils.isFriended(entityPlayer)) { mc.thePlayer.sendChatMessage("/wdr " + Utils.stripColor(entityPlayer.getGameProfile().getName())); } } public void onUpdate() { if (mc.isSingleplayer()) { return; } for (EntityPlayer entityPlayer : mc.theWorld.playerEntities) { if (entityPlayer == null) { continue; } if (entityPlayer == mc.thePlayer) { continue; } if (AntiBot.isBot(entityPlayer)) { continue; } PlayerData data = players.get(entityPlayer.getUniqueID()); if (data == null) { data = new PlayerData(); } data.update(entityPlayer); this.performCheck(entityPlayer, data); data.updateServerPos(entityPlayer); data.updateSneak(entityPlayer); players.put(entityPlayer.getUniqueID(), data); } } @SubscribeEvent public void onEntityJoin(EntityJoinWorldEvent e) { if (e.entity == mc.thePlayer) { players.clear(); flags.clear(); } } public void onDisable() { players.clear(); flags.clear(); lastAlert = 0L; } private void performCheck(EntityPlayer entityPlayer, PlayerData playerData) { if (autoBlock.isToggled() && playerData.autoBlockTicks >= 10) { alert(entityPlayer, autoBlock); return; } if (legitScaffold.isToggled() && playerData.sneakTicks >= 3) { alert(entityPlayer, legitScaffold); return; } if (noSlow.isToggled() && playerData.noSlowTicks >= 11 && playerData.speed >= 0.08) { alert(entityPlayer, noSlow); return; } if (scaffold.isToggled() && entityPlayer.isSwingInProgress && entityPlayer.rotationPitch >= 70.0f && entityPlayer.getHeldItem() != null && entityPlayer.getHeldItem().getItem() instanceof ItemBlock && playerData.fastTick >= 20 && entityPlayer.ticksExisted - playerData.lastSneakTick >= 30 && entityPlayer.ticksExisted - playerData.aboveVoidTicks >= 20) { boolean overAir = true; BlockPos blockPos = entityPlayer.getPosition().down(2); for (int i = 0; i < 4; ++i) { if (!(BlockUtils.getBlock(blockPos) instanceof BlockAir)) { overAir = false; break; } blockPos = blockPos.down(); } if (overAir) { alert(entityPlayer, scaffold); return; } } if (noFall.isToggled() && !entityPlayer.capabilities.isFlying) { double serverPosX = entityPlayer.serverPosX / 32; double serverPosY = entityPlayer.serverPosY / 32; double serverPosZ= entityPlayer.serverPosZ / 32; double deltaX = Math.abs(playerData.serverPosX - serverPosX); double deltaY = playerData.serverPosY - serverPosY; double deltaZ = Math.abs(playerData.serverPosZ - serverPosZ); if (deltaY >= 5 && deltaX <= 10 && deltaZ <= 10 && deltaY <= 40) { if (!Utils.overVoid(serverPosX, serverPosY, serverPosZ) && Utils.distanceToGround(entityPlayer) > 3 && !Utils.onLadder(entityPlayer) && !entityPlayer.isInWater() && !entityPlayer.isInLava()) { alert(entityPlayer, noFall); } } } } }