commit e5dfe53d14c67dcf18bf7c84a672eb490a0329dc from: Henry Wandover via: GitHub date: Mon Sep 15 18:30:33 2025 UTC implement cactus damage * Added cactus damage for players and issues the respective death message. Halts if condition is reached * style nitpicks --------- Co-authored-by: p2r3 commit - ff8951934097c499e8282150b679feca7d53ea4c commit + e5dfe53d14c67dcf18bf7c84a672eb490a0329dc blob - 07f1032f49506cc12acc1cb6965600965a419a27 blob + 06f8368e342a02b0d903ea07aeb4a7b94c37d186 --- include/globals.h +++ include/globals.h @@ -142,6 +142,9 @@ // every time a block is broken. #define ENABLE_PICKUP_ANIMATION +// If defined, players are able to receive damage from nearby cacti. +#define ENABLE_CACTUS_DAMAGE + // If defined, logs unrecognized packet IDs // #define DEV_LOG_UNKNOWN_PACKETS blob - 780d6e055a8239a2ee9ca2454ec435e49dac2244 blob + 464e7a4df918d7c63b3d2568dbc3d194f7974d27 --- src/procedures.c +++ src/procedures.c @@ -1389,10 +1389,14 @@ void hurtEntity (int entity_id, int attacker_id, uint8 strcpy((char *)recv_buffer + player_name_len, " was slain by "); strcpy((char *)recv_buffer + player_name_len + 14, attacker->name); recv_buffer[player_name_len + 14 + strlen(attacker->name)] = '\0'; + } else if (damage_type == D_cactus) { + // Killed by being near a cactus + strcpy((char *)recv_buffer + player_name_len, " was pricked to death"); + recv_buffer[player_name_len + 21] = '\0'; } else { // Unknown death reason strcpy((char *)recv_buffer + player_name_len, " died"); - recv_buffer[player_name_len + 4] = '\0'; + recv_buffer[player_name_len + 5] = '\0'; } } else player->health -= effective_damage; @@ -1502,6 +1506,15 @@ void handleServerTick (int64_t time_since_last_tick) { if (block >= B_lava && block < B_lava + 4) { hurtEntity(player->client_fd, -1, D_lava, 8); } + #ifdef ENABLE_CACTUS_DAMAGE + // Tick damage from a cactus block if one is under/inside or around the player. + if (block == B_cactus || + getBlockAt(player->x + 1, player->y, player->z) == B_cactus || + getBlockAt(player->x - 1, player->y, player->z) == B_cactus || + getBlockAt(player->x, player->y, player->z + 1) == B_cactus || + getBlockAt(player->x, player->y, player->z - 1) == B_cactus + ) hurtEntity(player->client_fd, -1, D_cactus, 4); + #endif // Heal from saturation if player is able and has enough food if (player->health >= 20 || player->health == 0) continue; if (player->hunger < 18) continue;