Add map saving

master
Elias Fleckenstein 2021-03-24 13:24:44 +01:00
parent a6ad85b204
commit 4013688f9b
4 changed files with 42 additions and 0 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
*.o
DragonblocksServer
Dragonblocks
map

View File

@ -138,6 +138,25 @@ MapBlock *map_deserialize_block(int fd)
return block;
}
bool map_serialize(int fd, Map *map)
{
for (size_t s = 0; s < map->sectors.siz; s++) {
MapSector *sector = map->sectors.ptr[s];
for (size_t b = 0; b < sector->blocks.siz; b++)
if (! map_serialize_block(fd, sector->blocks.ptr[b]))
return false;
}
return true;
}
void map_deserialize(int fd, Map *map)
{
MapBlock *block;
while ((block = map_deserialize_block(fd)) != NULL)
map_add_block(map, block);
}
v3s32 map_node_to_block_pos(v3s32 pos, v3u8 *offset)
{
if (offset)

View File

@ -43,6 +43,8 @@ void map_add_block(Map *map, MapBlock *block);
bool map_deserialize_node(int fd, MapNode *buf);
bool map_serialize_block(int fd, MapBlock *block);
MapBlock *map_deserialize_block(int fd);
bool map_serialize(int fd, Map *map);
void map_deserialize(int fd, Map *map);
v3s32 map_node_to_block_pos(v3s32 pos, v3u8 *offset);

View File

@ -3,6 +3,7 @@
#include <unistd.h>
#include <errno.h>
#include <netdb.h>
#include <fcntl.h>
#include "server.h"
#include "signal.h"
#include "util.h"
@ -37,6 +38,17 @@ void server_shutdown(Server *srv)
shutdown(srv->sockfd, SHUT_RDWR);
close(srv->sockfd);
FILE *mapfile = fopen("map", "w");
if (mapfile) {
if (map_serialize(fileno(mapfile), srv->map))
printf("Saved map\n");
else
perror("map_serialize");
fclose(mapfile);
} else {
perror("fopen");
}
map_delete(srv->map);
exit(EXIT_SUCCESS);
@ -144,5 +156,13 @@ int main(int argc, char **argv)
server.map = map_create(NULL);
FILE *mapfile = fopen("map", "r");
if (mapfile) {
map_deserialize(fileno(mapfile), server.map);
fclose(mapfile);
} else if (errno != ENOENT) {
perror("fopen");
}
for ever accept_client(&server);
}