improve block placement checks

This commit is contained in:
p2r3
2025-08-23 02:06:01 +03:00
parent eb57e545f6
commit d9f6511af1
2 changed files with 18 additions and 5 deletions

View File

@@ -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

View File

@@ -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) {