From d9f6511af188219cd20d9d79d89dc5710cbbf6a6 Mon Sep 17 00:00:00 2001 From: p2r3 Date: Sat, 23 Aug 2025 02:06:01 +0300 Subject: [PATCH] improve block placement checks --- src/packets.c | 9 +++++++-- src/procedures.c | 14 +++++++++++--- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/packets.c b/src/packets.c index 1798573..ee1ff8d 100644 --- a/src/packets.c +++ b/src/packets.c @@ -523,8 +523,13 @@ int cs_useItemOn (int client_fd) { // check if the block's placement conditions are met if ( - !(x == player->x && (y == player->y || y == player->y + 1) && z == player->z) && - (getBlockAt(x, y, z) == B_air) && + !( // player is not in the way + !isPassableBlock(block) && + x == player->x && + (y == player->y || y == player->y + 1) && + z == player->z + ) && + isReplaceableBlock(getBlockAt(x, y, z)) && (!isColumnBlock(block) || getBlockAt(x, y - 1, z) != B_air) ) { // decrease item amount in selected slot diff --git a/src/procedures.c b/src/procedures.c index 711333d..c1e6349 100644 --- a/src/procedures.c +++ b/src/procedures.c @@ -435,7 +435,6 @@ uint8_t isInstantlyMined (PlayerData *player, uint8_t block) { // Checks whether the given block has to have something beneath it uint8_t isColumnBlock (uint8_t block) { - return ( block == B_snow || block == B_moss_carpet || @@ -445,20 +444,29 @@ uint8_t isColumnBlock (uint8_t block) { block == B_sand || block == B_torch ); - } +// Checks whether the given block is non-solid uint8_t isPassableBlock (uint8_t block) { - return ( block == B_air || block == B_water || + block == B_snow || block == B_moss_carpet || block == B_short_grass || block == B_dead_bush || block == B_torch ); +} +// Checks whether the given block can be replaced by another block +uint8_t isReplaceableBlock (uint8_t block) { + return ( + block == B_air || + block == B_water || + block == B_short_grass || + block == B_snow + ); } void handlePlayerAction (PlayerData *player, int action, short x, short y, short z) {