]> git.lizzy.rs Git - dragonblocks_alpha.git/blob - src/map.h
Redesign map handling
[dragonblocks_alpha.git] / src / map.h
1 #ifndef _MAP_H_
2 #define _MAP_H_
3
4 #include <stdbool.h>
5 #include <pthread.h>
6 #include "array.h"
7 #include "list.h"
8 #include "node.h"
9 #include "types.h"
10
11 #define ITERATE_MAPBLOCK for (u8 x = 0; x < 16; x++) for (u8 y = 0; y < 16; y++) for (u8 z = 0; z < 16; z++)
12
13 typedef struct
14 {
15         Node type;
16         List meta;
17 } MapNode;
18
19 typedef enum
20 {
21         MBS_CREATED,
22         MBS_PROCESSING,
23         MBS_READY,
24         MBS_MODIFIED,
25 } MapBlockState;
26
27 typedef struct
28 {
29         MapNode data[16][16][16];
30         v3s32 pos;
31         MapBlockState state;
32         pthread_mutex_t mtx;
33         void *extra;
34 } MapBlock;
35
36 typedef struct
37 {
38         Array blocks;
39         v2s32 pos;
40         u64 hash;
41 } MapSector;
42
43 typedef struct
44 {
45         Array sectors;
46 } Map;
47
48 Map *map_create();
49 void map_delete(Map *map);
50
51 MapSector *map_get_sector_raw(Map *map, size_t idx);
52 MapBlock *map_get_block_raw(MapSector *sector, size_t idx);
53 MapSector *map_get_sector(Map *map, v2s32 pos, bool create);
54 MapBlock *map_get_block(Map *map, v3s32 pos, bool create);
55
56 void map_free_block(MapBlock *block);
57
58 bool map_deserialize_node(int fd, MapNode *buf);
59 bool map_serialize_block(int fd, MapBlock *block);
60 bool map_deserialize_block(int fd, Map *map, MapBlock **blockptr, bool dummy);
61 bool map_serialize(int fd, Map *map);
62 void map_deserialize(int fd, Map *map);
63
64 v3s32 map_node_to_block_pos(v3s32 pos, v3u8 *offset);
65
66 MapNode map_get_node(Map *map, v3s32 pos);
67 void map_set_node(Map *map, v3s32 pos, MapNode node);
68 MapNode map_node_create(Node type);
69 void map_node_clear(MapNode *node);
70
71 #endif