]> git.lizzy.rs Git - dragonblocks_alpha.git/blob - src/map.h
Make server thread-safe
[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 <stdio.h>
7 #include "array.h"
8 #include "list.h"
9 #include "node.h"
10 #include "types.h"
11
12 #define ITERATE_MAPBLOCK for (u8 x = 0; x < 16; x++) for (u8 y = 0; y < 16; y++) for (u8 z = 0; z < 16; z++)
13
14 typedef struct
15 {
16         Node type;
17         // here will be a NodeState (union)
18 } MapNode;
19
20 typedef enum
21 {
22         MBS_CREATED,
23         MBS_INITIALIZING,
24         MBS_READY,
25         MBS_UNSENT,
26         MBS_SENDING,
27 } MapBlockState;
28
29 typedef MapNode MapBlockData[16][16][16];
30
31 typedef struct
32 {
33         MapBlockData data;
34         List metadata[16][16][16];
35         v3s32 pos;
36         MapBlockState state;
37         pthread_mutex_t mtx;
38         void *extra;
39 } MapBlock;
40
41 typedef struct
42 {
43         pthread_rwlock_t rwlck;
44         Array blocks;
45         v2s32 pos;
46         u64 hash;
47 } MapSector;
48
49 typedef struct
50 {
51         pthread_rwlock_t rwlck;
52         Array sectors;
53 } Map;
54
55 Map *map_create();
56 void map_delete(Map *map);
57
58 MapSector *map_get_sector_raw(Map *map, size_t idx);
59 MapBlock *map_get_block_raw(MapSector *sector, size_t idx);
60 MapSector *map_get_sector(Map *map, v2s32 pos, bool create);
61 MapBlock *map_get_block(Map *map, v3s32 pos, bool create);
62
63 void map_free_block(MapBlock *block);
64
65 bool map_deserialize_node(int fd, MapNode *buf);
66 bool map_serialize_block(FILE *file, MapBlock *block);
67 bool map_deserialize_block(int fd, Map *map, MapBlock **blockptr, bool dummy);
68 bool map_serialize(FILE *file, Map *map);
69 void map_deserialize(int fd, Map *map);
70
71 v3s32 map_node_to_block_pos(v3s32 pos, v3u8 *offset);
72
73 MapNode map_get_node(Map *map, v3s32 pos);
74 void map_set_node(Map *map, v3s32 pos, MapNode node);
75 MapNode map_node_create(Node type);
76 void map_node_clear(MapNode *node);
77
78 #endif