Add map saving
parent
a6ad85b204
commit
4013688f9b
|
@ -1,3 +1,4 @@
|
|||
*.o
|
||||
DragonblocksServer
|
||||
Dragonblocks
|
||||
map
|
||||
|
|
19
src/map.c
19
src/map.c
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
20
src/server.c
20
src/server.c
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue