0x32 S32PacketConfirmTransaction
Server confirms or rejects an inventory transaction from C0EPacketClickWindow. accepted=false causes client to revert inventory.
Fields
| Field | Type | Description |
|---|---|---|
| windowId | byte | Window ID of the container |
| actionNumber | short | Transaction action number from the click packet |
| accepted | boolean | Whether the server accepted the click |
Wire Encoding
| Field | Type | Notes |
|---|---|---|
| Window ID | byte | |
| Action Number | short | |
| Accepted | bool | false = reject + inventory revert |
MCP References
MCP
NetHandlerPlayClient.handleConfirmTransaction()Handler Interface
HND
INetHandlerPlayClientNotes
If accepted=false, the client empties and refills its inventory by re-reading all slots from the server (C30PacketWindowItems is re-sent). This is how the server corrects desynced client inventory.
implementation Implementation Cases
Disabler
(Tenacity 5.1, Vestige 3.0, Gugustus)
Cancel or delay transaction confirmations. Disabler buffers S32. Backtrack delays S32 for reach extension.
package dev.tenacity.module.impl.exploit;
import dev.tenacity.Tenacity;
import dev.tenacity.event.impl.game.WorldEvent;
import dev.tenacity.event.impl.network.PacketReceiveEvent;
import dev.tenacity.event.impl.network.PacketSendEvent;
import dev.tenacity.event.impl.player.MotionEvent;
import dev.tenacity.module.Category;
import dev.tenacity.module.Module;
import dev.tenacity.module.impl.movement.Speed;
import dev.tenacity.module.settings.impl.BooleanSetting;
import dev.tenacity.module.settings.impl.MultipleBoolSetting;
import dev.tenacity.module.settings.impl.NumberSetting;
import dev.tenacity.ui.mainmenu.CustomMainMenu;
import dev.tenacity.utils.misc.MathUtils;
import dev.tenacity.utils.player.ChatUtil;
import dev.tenacity.utils.player.MovementUtils;
import dev.tenacity.utils.player.RotationUtils;
import dev.tenacity.utils.server.PacketUtils;
import dev.tenacity.utils.server.ServerUtils;
import dev.tenacity.utils.time.TimerUtil;
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.client.gui.inventory.GuiInventory;
import net.minecraft.client.multiplayer.GuiConnecting;
import net.minecraft.entity.player.PlayerCapabilities;
import net.minecraft.network.Packet;
import net.minecraft.network.play.client.*;
import net.minecraft.network.play.server.S07PacketRespawn;
import net.minecraft.network.play.server.S08PacketPlayerPosLook;
import net.minecraft.potion.Potion;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.ChatComponentText;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
public final class Disabler extends Module {
private final MultipleBoolSetting disablers = new MultipleBoolSetting("Disablers",
new BooleanSetting("Watchdog Strafe", false),
new BooleanSetting("Watchdog Timer", false),
new BooleanSetting("MMC", false),
new BooleanSetting("C06->C04", false),
new BooleanSetting("C04->C06", false),
new BooleanSetting("Hover", false),
new BooleanSetting("Spoof Ground", false),
new BooleanSetting("C0B Cancel", false),
new BooleanSetting("C0C Spam", false),
new BooleanSetting("Verus", false),
new BooleanSetting("Omni Sprint", false),
new BooleanSetting("Void TP", false),
new BooleanSetting("Silent S08", false));
private final NumberSetting hoverHeight = new NumberSetting("Hover Height", 0.1, 5, 0.01, 0.01);
private final BooleanSetting onGround = new BooleanSetting("On Ground", true);
private final NumberSetting TPDelay = new NumberSetting("TP Delay", 20, 100, 5, 1);
private final TimerUtil timer = new TimerUtil(), joinTimer = new TimerUtil();
private boolean synced;
private final CopyOnWriteArrayList<Packet> watchdogPlayerPackets = new CopyOnWriteArrayList<>(), watchdogC0FC00Packets = new CopyOnWriteArrayList<>(), watchdogInvPackets = new CopyOnWriteArrayList<>();
private final CopyOnWriteArrayList<Packet> packets = new CopyOnWriteArrayList<>();
private double s08Y;
public static boolean spiking;
public static final TimerUtil spikeTimer = new TimerUtil();
private int airTicks;
public Disabler() {
super("Disabler", Category.EXPLOIT, "Disables some anticheats");
TPDelay.addParent(disablers, voidTPDisabler -> voidTPDisabler.getSetting("Void TP").isEnabled());
hoverHeight.addParent(disablers, hoverDisabler -> hoverDisabler.getSetting("Hover").isEnabled());
onGround.addParent(disablers, spoofGroundDisabler -> spoofGroundDisabler.getSetting("Spoof Ground").isEnabled());
this.addSettings(disablers, TPDelay, onGround, hoverHeight);
}
@Override
public void onMotionEvent(MotionEvent event) {
final List<BooleanSetting> enabledBooleanSettings = disablers.getBoolSettings().stream().filter(BooleanSetting::isEnabled).collect(Collectors.toList());
if(enabledBooleanSettings.size() == 1) {
setSuffix(enabledBooleanSettings.get(0).name);
} else if(enabledBooleanSettings.size() > 1) {
setSuffix(enabledBooleanSettings.size() + " Enabled");
} else {
setSuffix("None");
}
for(BooleanSetting booleanSetting : disablers.getBoolSettings()) {
if(booleanSetting.isEnabled()) {
switch(booleanSetting.name) {
case "MMC":
if (timer.hasTimeElapsed(MathUtils.getRandomInRange(1000, 1500), true)) {
packets.forEach(PacketUtils::sendPacketNoEvent);
packets.clear();
}
break;
case "Watchdog Timer":
if(spikeTimer.hasTimeElapsed(700, true)) {
timer.reset();
}
break;
case "C0C Spam":
PacketUtils.sendPacketNoEvent(new C0CPacketInput());
break;
}
}
}
}
@Override
public void onPacketSendEvent(PacketSendEvent event) {
if(mc.thePlayer == null) return;
for(BooleanSetting booleanSetting : disablers.getBoolSettings()) {
if(booleanSetting.isEnabled()) {
switch(booleanSetting.name) {
case "Watchdog Strafe":
if(ServerUtils.isOnHypixel()) {
if(event.getPacket() instanceof C03PacketPlayer && !mc.thePlayer.isPotionActive(Potion.jump)) {
final C03PacketPlayer c03 = (C03PacketPlayer) event.getPacket();
if(Tenacity.INSTANCE.getModuleCollection().getModule(Speed.class).isEnabled() && mc.thePlayer.fallDistance < 1)
c03.setOnGround(true);
if(Tenacity.INSTANCE.getModuleCollection().getModule(Speed.class).isEnabled() && mc.thePlayer.ticksExisted % 4 != 0 && mc.thePlayer.fallDistance < 1) {
event.cancel();
watchdogPlayerPackets.add(event.getPacket());
} else if (!watchdogPlayerPackets.isEmpty()) {
watchdogPlayerPackets.forEach(PacketUtils::sendPacketNoEvent);
watchdogPlayerPackets.clear();
}
}
}
break;
case "Watchdog Timer":
if(ServerUtils.isOnHypixel()) {
if(event.getPacket() instanceof C03PacketPlayer) {
final C03PacketPlayer c03 = (C03PacketPlayer) event.getPacket();
if(!c03.isMoving() && !c03.getRotating()) {
event.cancel();
break;
}
}
if(!timer.hasTimeElapsed(350)) {
if(event.getPacket() instanceof C0FPacketConfirmTransaction || event.getPacket() instanceof C00PacketKeepAlive) {
event.cancel();
watchdogC0FC00Packets.add(event.getPacket());
}
} else if(!watchdogC0FC00Packets.isEmpty()) {
watchdogC0FC00Packets.forEach(PacketUtils::sendPacketNoEvent);
watchdogC0FC00Packets.clear();
}
}
break;
case "Void TP":
if(event.getPacket() instanceof C03PacketPlayer) {
final C03PacketPlayer c03 = (C03PacketPlayer) event.getPacket();
if(mc.thePlayer.ticksExisted % TPDelay.getValue() == 0) {
c03.setY(c03.getPositionY() - 1000);
}
}
break;
case "MMC":
if (event.getPacket() instanceof C0BPacketEntityAction) {
final C0BPacketEntityAction c0b = (C0BPacketEntityAction) event.getPacket();
if (c0b.getAction().equals(C0BPacketEntityAction.Action.START_SPRINTING)) {
if (EntityPlayerSP.serverSprintState) {
PacketUtils.sendPacketNoEvent(new C0BPacketEntityAction(mc.thePlayer, C0BPacketEntityAction.Action.STOP_SPRINTING));
EntityPlayerSP.serverSprintState = false;
}
}
event.cancel();
}
if (event.getPacket() instanceof C0FPacketConfirmTransaction || event.getPacket() instanceof C00PacketKeepAlive) {
event.cancel();
packets.add(event.getPacket());
}
break;
case "C06->C04":
if (event.getPacket() instanceof C03PacketPlayer.C06PacketPlayerPosLook) {
final C03PacketPlayer.C06PacketPlayerPosLook c06 = (C03PacketPlayer.C06PacketPlayerPosLook) event.getPacket();
event.setPacket(new C03PacketPlayer.C04PacketPlayerPosition(c06.getPositionX(), c06.getPositionY(), c06.getPositionZ(), c06.isOnGround()));
}
break;
case "C04->C06":
if (event.getPacket() instanceof C03PacketPlayer.C04PacketPlayerPosition) {
final C03PacketPlayer.C04PacketPlayerPosition c04 = (C03PacketPlayer.C04PacketPlayerPosition) event.getPacket();
event.setPacket(new C03PacketPlayer.C06PacketPlayerPosLook(c04.getPositionX(), c04.getPositionY(), c04.getPositionZ(), mc.thePlayer.rotationYaw, mc.thePlayer.rotationPitch, c04.isOnGround()));
}
break;
case "Hover":
if (event.getPacket() instanceof C03PacketPlayer) {
final C03PacketPlayer c03 = (C03PacketPlayer) event.getPacket();
c03.setY(mc.thePlayer.posY + hoverHeight.getValue());
}
break;
case "Spoof Ground":
if (event.getPacket() instanceof C03PacketPlayer) {
final C03PacketPlayer c03 = (C03PacketPlayer) event.getPacket();
c03.setOnGround(onGround.isEnabled());
}
break;
case "C0B Cancel":
if (event.getPacket() instanceof C0BPacketEntityAction) event.cancel();
break;
case "Verus":
if(event.getPacket() instanceof C0FPacketConfirmTransaction || event.getPacket() instanceof C00PacketKeepAlive) event.cancel();
break;
case "Omni Sprint":
if (event.getPacket() instanceof C0BPacketEntityAction) {
final C0BPacketEntityAction c0b = (C0BPacketEntityAction) event.getPacket();
if (c0b.getAction().equals(C0BPacketEntityAction.Action.START_SPRINTING)) {
if (EntityPlayerSP.serverSprintState) {
PacketUtils.sendPacketNoEvent(new C0BPacketEntityAction(mc.thePlayer, C0BPacketEntityAction.Action.STOP_SPRINTING));
EntityPlayerSP.serverSprintState = false;
}
}
event.cancel();
}
break;
}
}
}
}
@Override
public void onPacketReceiveEvent(PacketReceiveEvent event) {
for(BooleanSetting booleanSetting : disablers.getBoolSettings()) {
if (booleanSetting.isEnabled()) {
switch (booleanSetting.name) {
case "Silent S08":
if(event.getPacket() instanceof S08PacketPlayerPosLook) {
final S08PacketPlayerPosLook s08 = (S08PacketPlayerPosLook) event.getPacket();
event.cancel();
PacketUtils.sendPacketNoEvent(new C03PacketPlayer.C06PacketPlayerPosLook(s08.getX(), s08.getY(), s08.getZ(), s08.getYaw(), s08.getPitch(), false));
}
break;
}
}
}
}
private boolean isBlockUnder() {
if (mc.thePlayer.posY < 0) return false;
for (int offset = 0; offset < (int) mc.thePlayer.posY + 2; offset += 2) {
AxisAlignedBB bb = mc.thePlayer.getEntityBoundingBox().offset(0, -offset, 0);
if (!mc.theWorld.getCollidingBoundingBoxes(mc.thePlayer, bb).isEmpty()) {
return true;
}
}
return false;
}
@Override
public void onWorldEvent(WorldEvent event) {
watchdogC0FC00Packets.clear();
timer.reset();
}
}
InvManager
(Tenacity 5.1, Vestige 3.0, Gugustus)
Cancel or delay transaction confirmations. Disabler buffers S32. Backtrack delays S32 for reach extension.
Backtrack
(Tenacity 5.1, Vestige 3.0, Gugustus)
Cancel or delay transaction confirmations. Disabler buffers S32. Backtrack delays S32 for reach extension.