]> git.lizzy.rs Git - dragonblocks_alpha.git/blobdiff - src/server/server_item.c
Trees break if they have no connection to ground
[dragonblocks_alpha.git] / src / server / server_item.c
index e411d7efb2325f0a4160d1ff22de671a41aacda2..a8065915c3850e6391db2b8437085d2415c10285 100644 (file)
@@ -1,23 +1,38 @@
 #include "node.h"
 #include "server/server_item.h"
+#include "server/server_node.h"
 #include "server/server_terrain.h"
+#include "server/tree_physics.h"
 
 static void use_dig(__attribute__((unused)) ServerPlayer *player, ItemStack *stack, bool pointed, v3s32 pos)
 {
        if (!pointed)
                return;
 
-       NodeType node = terrain_get_node(server_terrain, pos).type;
-
-       if (node == NODE_UNLOADED)
+       v3s32 off;
+       TerrainChunk *chunk = terrain_get_chunk_nodep(server_terrain, pos, &off, false);
+       if (!chunk)
                return;
+       TerrainChunkMeta *meta = chunk->extra;
+       terrain_lock_chunk(chunk);
+
+       TerrainNode *node = &chunk->data[off.x][off.y][off.z];
 
-       if (!(node_def[node].dig_class & item_def[stack->type].dig_class))
+       if (!(node_def[node->type].dig_class & item_def[stack->type].dig_class)) {
+               pthread_mutex_unlock(&chunk->mtx);
                return;
+       }
+
+       *node = server_node_create(NODE_AIR);
+       meta->tgsb.raw.nodes[off.x][off.y][off.z] = STAGE_PLAYER;
+
+       pthread_mutex_unlock(&chunk->mtx);
+
+       server_terrain_lock_and_send_chunk(chunk);
 
-       terrain_set_node(server_terrain, pos,
-               terrain_node_create(NODE_AIR, (Blob) {0, NULL}),
-               false, NULL);
+       // destroy trees if they have no connection to ground
+       // todo: run in seperate thread to not block client connection
+       tree_physics_check(pos);
 }
 
 ServerItemDef server_item_def[COUNT_ITEM] = {