Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
9f61a29
feat: pre-test player/"legit" aimbot impl
Aug 27, 2025
a7f369a
fix: ensure on ground and movement state is checked properly prior to…
Aug 27, 2025
14ac3f3
fix: fix crashing when joining server and add smooth jitter
Aug 27, 2025
43063a1
fix: Add bar providers for aimbot targets. Separate out Zombies logic…
Aug 27, 2025
22b03a0
fix: temporarily remove blockhit and prevent execution in menus to re…
Aug 28, 2025
33ad0b3
cleanup redundant calls, methods, and comparisons
UndercoverGoose Aug 28, 2025
769d90c
create weapon helper and refactor
UndercoverGoose Aug 28, 2025
536404a
simple refactor to save whitespace bytes
UndercoverGoose Aug 28, 2025
ba9be2f
fix(requires review): some flagging issues on matrix ac, refactor com…
Aug 29, 2025
5af5920
feat: flags a lot. requires further testing. bezier control thing okr…
Aug 31, 2025
72f2e37
fix: rotations no longer jump so we are not flagging grimac/matrix an…
Aug 31, 2025
0325c2f
feat: mm aimbot
Sep 1, 2025
845530e
Merge remote-tracking branch 'origin/main' into feat/player-aimbot
Sep 1, 2025
448a9f6
Add AutoBow
Sep 3, 2025
a07995d
feat: AutoBow
Sep 3, 2025
b635101
fix: Ensure AutoBow's PlayerAimbot compliance & add generic mode
Sep 4, 2025
de41331
feat(AutoBow): PlayerAimbot position prediction for player shooting t…
Sep 4, 2025
0db370c
feat: Configurable draw duration and acceptable aim range
Sep 6, 2025
aefc76d
fix: occasionally autobow switches to arrow instead of bow
Sep 6, 2025
e0f1aef
fix: attempt 32767 to make autobow work
Sep 6, 2025
5691bac
feat: autobow worksgit add --all! AND doesn't flaggit add --all
Sep 7, 2025
70f64a9
fmt: yeah ok
Sep 7, 2025
1353629
fix: jitter when attacking and losing course
Sep 7, 2025
d445dff
Merge
microcrit Oct 10, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
org.gradle.jvmargs=-Xmx2G
org.gradle.jvmargs=-Xmx2G --enable-native-access=ALL-UNNAMED
org.gradle.parallel=true
org.gradle.caching=true

# Fabric Properties
minecraft_version=1.21.5
Expand Down
20 changes: 17 additions & 3 deletions src/main/java/dev/cigarette/agent/MurderMysteryAgent.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import java.util.HashMap;
import java.util.HashSet;
import java.util.Optional;
import java.util.UUID;

public class MurderMysteryAgent extends BaseAgent {
Expand Down Expand Up @@ -53,10 +54,9 @@ private void cleanupAvailableGold() {
}
}

private boolean isDetectiveItem(ItemStack item) {
public static boolean isDetectiveItem(ItemStack item) {
if (item.isOf(Items.ARROW)) return true;
if (item.isOf(Items.BOW)) return true;
return false;
return item.isOf(Items.BOW);
}

private PersistentPlayer getOrCreatePersistentPlayer(PlayerEntity player) {
Expand All @@ -83,6 +83,13 @@ private void createGold(ItemEntity item) {
availableGold.add(gold);
}

public static PersistentPlayer.Role getRole(PlayerEntity player) {
String playerName = player.getNameForScoreboard();
PersistentPlayer persistPlayer = persistentPlayers.get(playerName);
if (persistPlayer == null) return PersistentPlayer.Role.INNOCENT;
return persistPlayer.role;
}


@Override
public boolean inValidGame() {
Expand All @@ -104,6 +111,7 @@ protected void onValidTick(MinecraftClient client, @NotNull ClientWorld world, @
if (item == ItemStack.EMPTY) continue;
if (this.isDetectiveItem(item)) {
existingPlayer.setDetective();
existingPlayer.setItemStack(item);
continue;
}

Expand All @@ -113,6 +121,7 @@ protected void onValidTick(MinecraftClient client, @NotNull ClientWorld world, @
for (String knife : knives) {
if (knife.equals(knifeLang)) {
existingPlayer.setMurderer();
existingPlayer.setItemStack(item);
break;
}
}
Expand All @@ -139,13 +148,18 @@ public static class PersistentPlayer {
public PlayerEntity playerEntity;
public final String name;
public Role role;
public ItemStack itemStack;

public PersistentPlayer(PlayerEntity playerEntity) {
this.playerEntity = playerEntity;
this.name = playerEntity.getNameForScoreboard();
this.role = Role.INNOCENT;
}

public void setItemStack(ItemStack itemStack) {
this.itemStack = itemStack;
}

protected void setPlayerEntity(PlayerEntity playerEntity) {
this.playerEntity = playerEntity;
}
Expand Down
35 changes: 32 additions & 3 deletions src/main/java/dev/cigarette/agent/ZombiesAgent.java
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ public static ZombiesAgent.ZombieTarget getBestTarget(ClientPlayerEntity player)
return bestTarget;
}

private Vec3d calculatePredictedPosition(ZombiesAgent.ZombieTarget zombie, ClientPlayerEntity player) {
public static Vec3d calculatePredictedPosition(ZombiesAgent.ZombieTarget zombie, ClientPlayerEntity player) {
if (!Aimbot.INSTANCE.predictiveAim.getRawState()) {
return zombie.entity.getPos().subtract(player.getPos().add(0, player.getEyeHeight(EntityPose.STANDING), 0));
}
Expand All @@ -119,7 +119,36 @@ private Vec3d calculatePredictedPosition(ZombiesAgent.ZombieTarget zombie, Clien
return predictedBodyPos.add(0, zombie.entity.getEyeHeight(zombie.entity.getPose()), 0);
}

private Vec3d getPathfindingDirection(ZombiesAgent.ZombieTarget zombie, Vec3d zombiePos, Vec3d playerPos, Vec3d currentVelocity) {
public static Vec3d calculatePredictedPosition(ClientPlayerEntity target, ClientPlayerEntity player) {
Vec3d currentPos = target.getPos();
Vec3d playerPos = player.getEyePos();
Vec3d instantVelocity = target.getPos().subtract(target.lastX, target.lastY, target.lastZ);

double xVelocity = instantVelocity.x * Aimbot.INSTANCE.predictionTicks.getRawState().intValue();
double yVelocity = instantVelocity.y > LivingEntity.GRAVITY ? 0 : instantVelocity.y * (instantVelocity.y > 0 ? 1 : Aimbot.INSTANCE.predictionTicks.getRawState().intValue());
double zVelocity = instantVelocity.z * Aimbot.INSTANCE.predictionTicks.getRawState().intValue();
Vec3d currentVelocity = new Vec3d(xVelocity, yVelocity, zVelocity);

Vec3d pathDirection = getPathfindingDirection(null, currentPos, playerPos, currentVelocity);

if (pathDirection.lengthSquared() < 1.0E-7D) {
return target.getEyePos();
}

double distance = playerPos.distanceTo(currentPos);
double projectileSpeed = 20.0;
double timeToTarget = distance / projectileSpeed;

int maxPredictionTicks = Aimbot.INSTANCE.predictionTicks.getRawState().intValue();
double maxPredictionTime = maxPredictionTicks / 20.0;
timeToTarget = Math.min(timeToTarget, maxPredictionTime);

Vec3d predictedBodyPos = currentPos.add(pathDirection.multiply(timeToTarget));

return predictedBodyPos.add(0, target.getEyeHeight(target.getPose()), 0);
}

private static Vec3d getPathfindingDirection(ZombiesAgent.ZombieTarget zombie, Vec3d zombiePos, Vec3d playerPos, Vec3d currentVelocity) {
Vec3d directPath = playerPos.subtract(zombiePos).normalize();

if (currentVelocity.lengthSquared() > 1.0E-7D) {
Expand All @@ -133,7 +162,7 @@ private Vec3d getPathfindingDirection(ZombiesAgent.ZombieTarget zombie, Vec3d zo
return directPath.multiply(estimateZombieSpeed(zombie) / 20.0);
}

private double estimateZombieSpeed(ZombiesAgent.ZombieTarget zombie) {
private static double estimateZombieSpeed(ZombiesAgent.ZombieTarget zombie) {
return switch (zombie.type) {
case ZOMBIE, SKELETON, CREEPER, WITCH -> 5.0; // ~0.25 B/t * 20 t/s
case BLAZE -> 8.0;
Expand Down
6 changes: 4 additions & 2 deletions src/main/java/dev/cigarette/config/Config.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@
import dev.cigarette.module.combat.AutoClicker;
import dev.cigarette.module.combat.JumpReset;
import dev.cigarette.module.combat.PerfectHit;
import dev.cigarette.module.combat.PlayerAimbot;
import dev.cigarette.module.keybind.AddGlassBlock;
import dev.cigarette.module.keybind.BreakBlock;
import dev.cigarette.module.keybind.VClip;
import dev.cigarette.module.murdermystery.AutoBow;
import dev.cigarette.module.murdermystery.GoldESP;
import dev.cigarette.module.murdermystery.PlayerESP;
import dev.cigarette.module.render.ProjectileESP;
Expand Down Expand Up @@ -68,9 +70,9 @@ public void positionCategories() {
public static Config construct() {
Config cfg = new Config();
cfg.putModules("Bedwars", AutoBlockIn.INSTANCE, AutoTool.INSTANCE, Bridger.INSTANCE, DefenseViewer.INSTANCE, EntityESP.INSTANCE, FireballESP.INSTANCE);
cfg.putModules("Combat", AutoClicker.INSTANCE, JumpReset.INSTANCE, PerfectHit.INSTANCE);
cfg.putModules("Combat", AutoClicker.INSTANCE, JumpReset.INSTANCE, PerfectHit.INSTANCE, PlayerAimbot.INSTANCE);
cfg.putModules("Keybind", AddGlassBlock.INSTANCE, BreakBlock.INSTANCE, VClip.INSTANCE);
cfg.putModules("Murder Mystery", GoldESP.INSTANCE, PlayerESP.INSTANCE);
cfg.putModules("Murder Mystery", GoldESP.INSTANCE, PlayerESP.INSTANCE, AutoBow.INSTANCE);
cfg.putModules("Render", dev.cigarette.module.render.PlayerESP.INSTANCE, ProjectileESP.INSTANCE);
cfg.putModules("UI", GUI.INSTANCE, ModuleList.INSTANCE, Notifications.INSTANCE, TargetHUD.INSTANCE, Watermark.INSTANCE);
cfg.putModules("Zombies", Aimbot.INSTANCE, PowerupESP.INSTANCE, ReviveAura.INSTANCE, ZombieESP.INSTANCE);
Expand Down
1 change: 1 addition & 0 deletions src/main/java/dev/cigarette/gui/hud/bar/BarDisplay.java
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ protected void renderWidget(DrawContext context, int mouseX, int mouseY, float d
List<BarWidget> widgets = new ArrayList<>();
Set<String> seenUuids = new HashSet<>();
List<Class<?>> providerOrder = List.of(
dev.cigarette.gui.hud.bar.providers.AimbotTargetProvider.class,
dev.cigarette.gui.hud.bar.providers.MurderMysteryProvider.class,
dev.cigarette.gui.hud.bar.providers.BedwarsProvider.class,
dev.cigarette.gui.hud.bar.providers.ZombiesProvider.class,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package dev.cigarette.gui.hud.bar.providers;

import dev.cigarette.gui.CigaretteScreen;
import dev.cigarette.gui.hud.bar.BarDisplay;
import dev.cigarette.gui.hud.bar.api.BarWidget;
import dev.cigarette.gui.hud.bar.api.BarWidgetProvider;
import dev.cigarette.gui.hud.bar.widgets.EntityChipWidget;
import dev.cigarette.module.combat.PlayerAimbot;
import dev.cigarette.module.zombies.Aimbot;
import dev.cigarette.agent.ZombiesAgent;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.network.AbstractClientPlayerEntity;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.entity.Entity;

import java.util.List;
import java.util.UUID;

public class AimbotTargetProvider implements BarWidgetProvider {
@Override
public void collect(MinecraftClient mc, ClientWorld world, TextRenderer tr, List<BarWidget> out) {
if (mc == null || world == null || mc.player == null) return;

boolean playerAimbotRunning = false;
boolean zombiesAimbotRunning = false;
try { playerAimbotRunning = PlayerAimbot.INSTANCE.isRunning(); } catch (Throwable ignored) {}
try { zombiesAimbotRunning = Aimbot.INSTANCE.isRunning(); } catch (Throwable ignored) {}

if (playerAimbotRunning) {
AbstractClientPlayerEntity target = PlayerAimbot.getBestTargetFor(mc.player);
if (target != null) {
String label = target.getName().getString();
double sortKey = 0d;
try {
double dx = target.getX() - mc.player.getX();
double dz = target.getZ() - mc.player.getZ();
sortKey = BarDisplay.angle(mc.player.getYaw(), dx, dz);
label += " (" + Math.round(mc.player.distanceTo(target)) + "m)";
} catch (Throwable ignored) {}
float hp = Math.max(0f, Math.min(1f, target.getHealth() / target.getMaxHealth()));
out.add(new EntityChipWidget.Progress("aimbot:player:" + target.getUuid(), target, label, sortKey, 0,
hp, CigaretteScreen.SECONDARY_COLOR, CigaretteScreen.BACKGROUND_COLOR));
}
}

if (zombiesAimbotRunning) {
ZombiesAgent.ZombieTarget zt = ZombiesAgent.getClosestZombie();
if (zt != null && zt.uuid != null) {
Entity ent = findEntityByUuid(world, zt.uuid);
String label = zt.type.getName();
double sortKey = 0d;
if (ent == null) {
label = label + " [?]";
sortKey = 180.0;
} else {
try {
double dx = ent.getX() - mc.player.getX();
double dz = ent.getZ() - mc.player.getZ();
sortKey = BarDisplay.angle(mc.player.getYaw(), dx, dz);
label += " (" + Math.round(mc.player.distanceTo(ent)) + "m)";
} catch (Throwable ignored) {}
}
out.add(new EntityChipWidget("aimbot:zombies:" + zt.uuid, ent, label, sortKey, zt.type.getColor()));
}
}
}

private static Entity findEntityByUuid(ClientWorld world, UUID uuid) {
for (Entity e : world.getEntities()) if (uuid.equals(e.getUuid())) return e;
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@ public static void registerAll() {
BarWidgetRegistry.register(new ZombiesProvider());
BarWidgetRegistry.register(new BedwarsProvider());
BarWidgetRegistry.register(new NearbyPlayersProvider());
BarWidgetRegistry.register(new AimbotTargetProvider());
}
}

Loading