0x0E C0EPacketClickWindow

Player clicks in an inventory window. Handles item moves: pickup, shift-click, number key swap, middle click, drop, drag init, and double-click.

Serverbound (Client → Server) · PLAY · net/minecraft/network/play/client/C0EPacketClickWindow.java
playerinventorycontaineritem

Fields

FieldTypeDescription
windowIdbyteContainer window ID
slotIdshortSlot index (-999=outside, -1=drop)
usedButtonbyteMouse button + shift modifier
actionNumbershortTransaction ID, incremented server-side
modebyte0=click, 1=shiftClick, 2=numKey, 3=midClick, 4=drop, 5=drag, 6=doubleClick
clickedItemItemStackItem in slot before the click

Wire Encoding

FieldTypeNotes
Window IDbyte0=player inv
Slotshort-999=outside window
Used Buttonbyte0=left, 1=right + shift
Action NumbershortTransaction counter
Modebyte0=click, 1=shiftClick, 2=numKey, 3=midClick, 4=drop, 5/6=drag
Clicked ItemSlotItemStack before click

MCP References

MCPNetHandlerPlayServer.processClickWindow()

Handler Interface

HNDINetHandlerPlayServer

Notes

The server validates every click against its own inventory state — actionNumber must match. If validation fails, S32PacketConfirmTransaction(accepted=false) reverts the client's inventory via S30PacketWindowItems. Almost NO module constructs C0E directly — they call mc.playerController.windowClick() which sends C0E internally. Rise 6.0 BufferAbuseInventoryMove and RektSky B5 ChestStealer are exceptions that construct C0E directly.

implementation Implementation Cases

ChestStealer (Vestige 3.0, Gugustus)

Usually NOT constructed directly — modules use mc.playerController.windowClick() which sends C0E internally. Disabler cancels C0E to prevent server from detecting fast inventory actions.

Vanilla hook: EventSendPacket / PlayerControllerMP.windowClick()
AutoArmor (Vestige 3.0, Gugustus)

Usually NOT constructed directly — modules use mc.playerController.windowClick() which sends C0E internally. Disabler cancels C0E to prevent server from detecting fast inventory actions.

Vanilla hook: EventSendPacket / PlayerControllerMP.windowClick()
InvManager (Vestige 3.0, Gugustus)

Usually NOT constructed directly — modules use mc.playerController.windowClick() which sends C0E internally. Disabler cancels C0E to prevent server from detecting fast inventory actions.

Vanilla hook: EventSendPacket / PlayerControllerMP.windowClick()
AutoPot (Vestige 3.0, Gugustus)

Usually NOT constructed directly — modules use mc.playerController.windowClick() which sends C0E internally. Disabler cancels C0E to prevent server from detecting fast inventory actions.

Vanilla hook: EventSendPacket / PlayerControllerMP.windowClick()
← Back to all packets