- MapBlock *block = map_get_block(map, map_node_to_block_pos(pos, &offset), true);
- MapNode *current_node = &block->data[offset.x][offset.y][offset.z];
- map_node_clear(current_node);
- *current_node = node;
+ MapBlock *block = map_get_block(map, map_node_to_block_pos(pos, &offset), create);
+ if (block) {
+ pthread_mutex_lock(&block->mtx);
+ if (! map->callbacks.set_node || map->callbacks.set_node(block, offset, &node, arg)) {
+ block->data[offset.x][offset.y][offset.z] = node;
+ if (map->callbacks.after_set_node)
+ map->callbacks.after_set_node(block, offset, arg);
+ } else {
+ map_node_delete(node);
+ }
+ pthread_mutex_unlock(&block->mtx);
+ }