From ee69d3ab9be6875d61ab03823bf73d172bd96452 Mon Sep 17 00:00:00 2001 From: p2r3 Date: Sat, 23 Aug 2025 04:24:06 +0300 Subject: [PATCH] support placing blocks on containers while sneaking --- include/globals.h | 1 + include/packets.h | 1 + src/main.c | 4 ++++ src/packets.c | 38 ++++++++++++++++++++++++++++---------- 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/include/globals.h b/include/globals.h index e655916..27cd61b 100644 --- a/include/globals.h +++ b/include/globals.h @@ -95,6 +95,7 @@ typedef struct { uint8_t craft_count[9]; // 0x01 - attack cooldown // 0x02 - has not spawned yet + // 0x04 - sneaking uint8_t flags; } PlayerData; diff --git a/include/packets.h b/include/packets.h index 85177af..c2968d8 100644 --- a/include/packets.h +++ b/include/packets.h @@ -49,6 +49,7 @@ int sc_systemChat (int client_fd, char* message, uint16_t len); int cs_interact (int client_fd); int sc_entityEvent (int client_fd, int entity_id, uint8_t status); int sc_removeEntity (int client_fd, int entity_id); +int cs_playerInput (int client_fd); int sc_registries (int client_fd); #endif diff --git a/src/main.c b/src/main.c index e174e5a..b036548 100644 --- a/src/main.c +++ b/src/main.c @@ -335,6 +335,10 @@ void handlePacket (int client_fd, int length, int packet_id) { } break; + case 0x2A: + if (state == STATE_PLAY) cs_playerInput(client_fd); + break; + case 0x34: if (state == STATE_PLAY) cs_setHeldItem(client_fd); break; diff --git a/src/packets.c b/src/packets.c index e74c7e6..f3d75d8 100644 --- a/src/packets.c +++ b/src/packets.c @@ -490,13 +490,19 @@ int cs_useItemOn (int client_fd) { int sequence = readVarInt(client_fd); sc_acknowledgeBlockChange(client_fd, sequence); - uint8_t target = getBlockAt(x, y, z); - if (target == B_crafting_table) { - sc_openScreen(client_fd, 12, "Crafting", 8); - return 0; - } else if (target == B_furnace) { - sc_openScreen(client_fd, 14, "Furnace", 7); - return 0; + PlayerData *player; + if (getPlayerData(client_fd, &player)) return 1; + + // Check interaction with containers when not sneaking + if (!(player->flags & 0x04)) { + uint8_t target = getBlockAt(x, y, z); + if (target == B_crafting_table) { + sc_openScreen(client_fd, 12, "Crafting", 8); + return 0; + } else if (target == B_furnace) { + sc_openScreen(client_fd, 14, "Furnace", 7); + return 0; + } } switch (face) { @@ -509,9 +515,6 @@ int cs_useItemOn (int client_fd) { default: break; } - PlayerData *player; - if (getPlayerData(client_fd, &player)) return 1; - uint16_t *item = &player->inventory_items[player->hotbar]; uint8_t *count = &player->inventory_count[player->hotbar]; uint8_t block = I_to_B(*item); @@ -1028,6 +1031,21 @@ int sc_removeEntity (int client_fd, int entity_id) { return 0; } +// C->S Player Input +int cs_playerInput (int client_fd) { + + uint8_t flags = readByte(client_fd); + + PlayerData *player; + if (getPlayerData(client_fd, &player)) return 1; + + // Set or clear sneaking flag + if (flags & 0x20) player->flags |= 0x04; + else player->flags &= ~0x04; + + return 0; +} + // S->C Registry Data (multiple packets) and Update Tags (configuration, multiple packets) int sc_registries (int client_fd) {