multiworld support pt1

master
darkrose 2017-08-15 20:47:12 +10:00
parent 7db73b0136
commit 157f9511ab
6 changed files with 208 additions and 14 deletions

View File

@ -194,6 +194,7 @@ set(common_SRCS
string.c
bridge_temp.cpp
servercommand.c
world.c
log.cpp
content_sao.cpp
mapgen/mapgen.cpp
@ -450,7 +451,7 @@ else()
set(CMAKE_CXX_FLAGS_RELEASE "${OPT_FLAGS} ${SAFETY_FLAGS} -Wall -DNDEBUG -pipe -fpermissive -Wno-write-strings")
set(CMAKE_C_FLAGS_RELEASE "${OPT_FLAGS} ${SAFETY_FLAGS} -Wall -DNDEBUG -pipe")
set(CMAKE_CXX_FLAGS_DEBUG "${SAFETY_FLAGS} -Wall -O0 -g3 -ggdb -fpermissive -Wno-write-strings")
set(CMAKE_C_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
set(CMAKE_C_FLAGS_DEBUG "${SAFETY_FLAGS} -Wall -O0 -g3 -ggdb")
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${OPT_LDFLAGS} ${SAFETY_LDFLAGS}")
set(CMAKE_MODULE_LINKER_FLAGS_RELEASE ${CMAKE_EXE_LINKER_FLAGS_RELEASE})

View File

@ -113,6 +113,7 @@ int config_load_command(command_context_t *ctx, array_t *args);
int config_ignore_command(command_context_t *ctx, array_t *args);
void config_init(int argc, char** argv);
void config_save(char* section, char* type, char* file);
void config_clear(char* section);
/* defined in config_default.c */
void config_default_init(void);
@ -183,6 +184,13 @@ int command_adduser(command_context_t *ctx, array_t *args);
int command_clearobjects(command_context_t *ctx, array_t *args);
int command_setpassword(command_context_t *ctx, array_t *args);
/* defined in world.c */
int world_create(char* name);
int world_load(char* name);
void world_unload(void);
int world_init(char* name);
void world_exit(void);
#ifdef __cplusplus
}
#include <string>

View File

@ -408,3 +408,24 @@ void config_save(char* section, char* type, char* file)
file_flush(f);
file_free(f);
}
/* clears all config values for section (i.e. "world.*") to defaults */
void config_clear(char* section)
{
nvp_t *n;
int l;
/* don't clear everything, only sections */
if (!section)
return;
l = strlen(section);
n = config.items;
while (n) {
if (n->value && !strncmp(n->name,section,l)) {
free(n->value);
n->value = NULL;
}
n = n->next;
}
}

View File

@ -791,9 +791,6 @@ int main(int argc, char *argv[])
Game parameters
*/
/* TODO: configise this */
path_world_setter((char*)"default");
// Run dedicated server if asked to
if (config_get_bool("server")) {
DSTACK("Dedicated server branch");
@ -801,6 +798,9 @@ int main(int argc, char *argv[])
// Create time getter
g_timegetter = new SimpleTimeGetter();
char* v = config_get("server.world");
world_init(v);
// Create server
Server server;
server.start();
@ -808,6 +808,8 @@ int main(int argc, char *argv[])
// Run server
dedicated_server_loop(server, kill);
world_exit();
config_save(NULL,NULL,NULL);
return 0;
@ -1208,14 +1210,17 @@ int main(int argc, char *argv[])
/*
Run game
*/
the_game(
kill,
input,
device,
font,
password,
error_message
);
if (!world_init(NULL)) {
the_game(
kill,
input,
device,
font,
password,
error_message
);
world_exit();
}
#if USE_AUDIO == 1
sound_stop_effects(0);
#endif

View File

@ -231,8 +231,7 @@ int main(int argc, char *argv[])
std::cout<<std::endl;
/* TODO: configise this */
path_world_setter((char*)"default");
world_init(NULL);
// Create server
Server server;
@ -244,6 +243,7 @@ int main(int argc, char *argv[])
// Run server
dedicated_server_loop(server, kill);
http_server.stop();
world_exit();
} //try
catch(con::PeerNotFoundException &e)

159
src/world.c Normal file
View File

@ -0,0 +1,159 @@
/************************************************************************
* world.c
* voxelands - 3d voxel world sandbox game
* Copyright (C) Lisa 'darkrose' Milne 2017 <lisa@ltmnet.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
************************************************************************/
#include "common.h"
#include "path.h"
static int world_exists(char* name)
{
char buff[2048];
char nbuff[256];
if (!name)
return 0;
name = trim(name);
if (str_sanitise(nbuff,256,name) < 1)
return 0;
if (!path_get("worlds",nbuff,1,buff,2048))
return 0;
return 1;
}
int world_create(char* name)
{
char buff[2048];
char nbuff[256];
char nbuff1[256];
int i;
if (!name)
name = "New World";
name = trim(name);
if (!name[0])
name = "New World";
if (str_sanitise(nbuff,256,name) < 1)
return 1;
if (!path_get("worlds",nbuff,1,buff,2048)) {
if (!path_get("worlds",nbuff,0,buff,2048))
return 1;
config_set("world.path",buff);
config_set("world.name",name);
return path_create("world","players");
}
for (i=1; i<100; i++) {
snprintf(nbuff1,256,"%s_%d",nbuff,i);
if (!path_get("worlds",nbuff1,1,buff,2048)) {
if (!path_get("worlds",nbuff1,0,buff,2048))
return 1;
config_set("world.path",nbuff1);
snprintf(nbuff,256,"%s %d",name,i);
config_set("world.name",nbuff);
return path_create("world","players");
}
}
return 1;
}
int world_load(char* name)
{
char buff[2048];
char nbuff[256];
config_clear("world");
if (!name) {
#ifdef SERVER
name = config_get("server.world");
#else
name = config_get("client.world");
#endif
if (!name)
return 1;
}
name = trim(name);
snprintf(nbuff,256,"%s",name);
if (str_sanitise(buff,2048,nbuff) < 1)
return 1;
config_set("world.path",buff);
config_set("world.name",nbuff);
if (path_get("world","world.cfg",1,buff,2048)) {
config_load("world","world.cfg");
}else{
vlprintf(CN_WARN,"Unknown world config: using defaults");
}
config_set("world.version",VERSION_STRING);
#ifdef SERVER
config_set("server.world",nbuff);
#else
config_set("client.world",nbuff);
#endif
return 0;
}
/* save the world data, then clear all world.* config */
void world_unload()
{
config_save("world","world","world.cfg");
config_clear("world");
}
/* initialise and/or create a world */
int world_init(char* name)
{
if (!world_exists(name)) {
if (world_create(name))
return 1;
}
if (world_load(name))
return 1;
/* TODO: init server/environment/etc */
return 0;
}
/* shutdown, save, clear, and free the current world */
void world_exit()
{
/* TODO: shutdown server/environment/etc */
world_unload();
}