6 #include <dragontype/bintree.h>
7 #include <dragontype/number.h>
8 #include <dragontype/list.h>
11 #define MAPBLOCK_SIZE 16
12 #define ITERATE_MAPBLOCK for (u8 x = 0; x < MAPBLOCK_SIZE; x++) for (u8 y = 0; y < MAPBLOCK_SIZE; y++) for (u8 z = 0; z < MAPBLOCK_SIZE; z++)
14 typedef struct MapNode
20 typedef MapNode MapBlockData[MAPBLOCK_SIZE][MAPBLOCK_SIZE][MAPBLOCK_SIZE];
32 pthread_rwlock_t rwlck;
39 void (*create_block)(MapBlock *block);
40 void (*delete_block)(MapBlock *block);
41 bool (*get_block)(MapBlock *block, bool create);
42 bool (*set_node) (MapBlock *block, v3u8 offset, MapNode *node, void *arg);
43 void (*after_set_node)(MapBlock *block, v3u8 offset, void *arg);
48 pthread_rwlock_t rwlck;
50 pthread_rwlock_t cached_rwlck;
52 MapCallbacks callbacks;
55 Map *map_create(MapCallbacks callbacks);
56 void map_delete(Map *map);
58 MapSector *map_get_sector(Map *map, v2s32 pos, bool create);
59 MapBlock *map_get_block(Map *map, v3s32 pos, bool create);
61 MapBlock *map_allocate_block(v3s32 pos);
62 void map_free_block(MapBlock *block);
64 void map_serialize_block(MapBlock *block, char **dataptr, size_t *sizeptr, size_t *rawsizeptr);
65 bool map_deserialize_block(MapBlock *block, const char *data, size_t size, size_t rawsize);
67 v3s32 map_node_to_block_pos(v3s32 pos, v3u8 *offset);
69 MapNode map_get_node(Map *map, v3s32 pos);
70 void map_set_node(Map *map, v3s32 pos, MapNode node, bool create, void *arg);
72 MapNode map_node_create(Node type, void *data, size_t size);
73 void map_node_delete(MapNode node);