]> git.lizzy.rs Git - dragonblocks_alpha.git/blob - src/server/server_item.c
Trees break if they have no connection to ground
[dragonblocks_alpha.git] / src / server / server_item.c
1 #include "node.h"
2 #include "server/server_item.h"
3 #include "server/server_node.h"
4 #include "server/server_terrain.h"
5 #include "server/tree_physics.h"
6
7 static void use_dig(__attribute__((unused)) ServerPlayer *player, ItemStack *stack, bool pointed, v3s32 pos)
8 {
9         if (!pointed)
10                 return;
11
12         v3s32 off;
13         TerrainChunk *chunk = terrain_get_chunk_nodep(server_terrain, pos, &off, false);
14         if (!chunk)
15                 return;
16         TerrainChunkMeta *meta = chunk->extra;
17         terrain_lock_chunk(chunk);
18
19         TerrainNode *node = &chunk->data[off.x][off.y][off.z];
20
21         if (!(node_def[node->type].dig_class & item_def[stack->type].dig_class)) {
22                 pthread_mutex_unlock(&chunk->mtx);
23                 return;
24         }
25
26         *node = server_node_create(NODE_AIR);
27         meta->tgsb.raw.nodes[off.x][off.y][off.z] = STAGE_PLAYER;
28
29         pthread_mutex_unlock(&chunk->mtx);
30
31         server_terrain_lock_and_send_chunk(chunk);
32
33         // destroy trees if they have no connection to ground
34         // todo: run in seperate thread to not block client connection
35         tree_physics_check(pos);
36 }
37
38 ServerItemDef server_item_def[COUNT_ITEM] = {
39         // unknown
40         {
41                 .use = NULL,
42         },
43         // none
44         {
45                 .use = NULL,
46         },
47         // pickaxe
48         {
49                 .use = &use_dig,
50         },
51         // axe
52         {
53                 .use = &use_dig,
54         },
55         // shovel
56         {
57                 .use = &use_dig,
58         },
59 };