1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Initial directory structure rework

This commit is contained in:
Perttu Ahola 2012-03-10 15:56:24 +02:00
parent 9c5e422d3a
commit c89d1cf072
134 changed files with 136 additions and 101 deletions

View file

@ -40,7 +40,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
static std::string getTextureCacheDir()
{
return porting::path_userdata + DIR_DELIM + "cache" + DIR_DELIM + "texture";
return porting::path_user + DIR_DELIM + "cache" + DIR_DELIM + "textures";
}
struct TextureRequest

View file

@ -726,7 +726,7 @@ void the_game(
if(address == ""){
draw_load_screen(L"Creating server...", driver, font);
infostream<<"Creating server"<<std::endl;
server = new Server(map_dir, configpath);
server = new Server(map_dir, configpath, "mesetint");
server->start(port);
}

View file

@ -174,7 +174,7 @@ void GUIPauseMenu::regenerateGui(v2u32 screensize)
SWPRINTF_CHARSTRING
,
BUILD_INFO,
porting::path_userdata.c_str()
porting::path_user.c_str()
);*/
std::ostringstream os;
@ -182,7 +182,7 @@ void GUIPauseMenu::regenerateGui(v2u32 screensize)
os<<"by Perttu Ahola and contributors\n";
os<<"celeron55@gmail.com\n";
os<<BUILD_INFO<<"\n";
os<<"ud_path = "<<wrap_rows(porting::path_userdata, 20)<<"\n";
os<<"path_user = "<<wrap_rows(porting::path_user, 20)<<"\n";
Environment->addStaticText(narrow_to_wide(os.str()).c_str(), rect, false, true, this, 259);
}

View file

@ -1157,19 +1157,18 @@ int main(int argc, char *argv[])
porting::signal_handler_init();
bool &kill = *porting::signal_handler_killstatus();
// Initialize porting::path_data and porting::path_userdata
porting::initializePaths();
// Create user data directory
fs::CreateDir(porting::path_userdata);
fs::CreateDir(porting::path_user);
init_gettext((porting::path_data+DIR_DELIM+".."+DIR_DELIM+"locale").c_str());
init_gettext((porting::path_share+DIR_DELIM+".."+DIR_DELIM+"locale").c_str());
// Initialize debug streams
#ifdef RUN_IN_PLACE
std::string debugfile = DEBUGFILE;
#else
std::string debugfile = porting::path_userdata+DIR_DELIM+DEBUGFILE;
std::string debugfile = porting::path_user+DIR_DELIM+DEBUGFILE;
#endif
debugstreams_init(disable_stderr, debugfile.c_str());
// Initialize debug stacks
@ -1221,10 +1220,12 @@ int main(int argc, char *argv[])
else
{
core::array<std::string> filenames;
filenames.push_back(porting::path_userdata +
filenames.push_back(porting::path_user +
DIR_DELIM + "minetest.conf");
#ifdef RUN_IN_PLACE
filenames.push_back(porting::path_userdata +
// Try also from a lower level (to aid having the same configuration
// for many RUN_IN_PLACE installs)
filenames.push_back(porting::path_user +
DIR_DELIM + ".." + DIR_DELIM + "minetest.conf");
#endif
@ -1278,11 +1279,22 @@ int main(int argc, char *argv[])
port = 30000;
// Map directory
std::string map_dir = porting::path_userdata+DIR_DELIM+"world";
std::string map_dir = porting::path_user + DIR_DELIM + "server" + DIR_DELIM + "worlds" + DIR_DELIM + "world";
if(cmd_args.exists("map-dir"))
map_dir = cmd_args.get("map-dir");
else if(g_settings->exists("map-dir"))
map_dir = g_settings->get("map-dir");
else{
// No map-dir option was specified.
// Check if the world is found from the default directory, and if
// not, see if the legacy world directory exists.
std::string legacy_map_dir = porting::path_user+DIR_DELIM+".."+DIR_DELIM+"world";
if(!fs::PathExists(map_dir) && fs::PathExists(legacy_map_dir)){
errorstream<<"Warning: Using legacy world directory \""
<<legacy_map_dir<<"\""<<std::endl;
map_dir = legacy_map_dir;
}
}
// Run dedicated server if asked to
if(cmd_args.getFlag("server"))
@ -1293,7 +1305,7 @@ int main(int argc, char *argv[])
g_timegetter = new SimpleTimeGetter();
// Create server
Server server(map_dir.c_str(), configpath);
Server server(map_dir, configpath, "mesetint");
server.start(port);
// Run server

View file

@ -124,12 +124,12 @@ void signal_handler_init(void)
Path mangler
*/
std::string path_data = ".." DIR_DELIM "data";
std::string path_userdata = "..";
std::string path_share = ".." DIR_DELIM "share";
std::string path_user = ".." DIR_DELIM "user";
std::string getDataPath(const char *subpath)
{
return path_data + DIR_DELIM + subpath;
return path_share + DIR_DELIM + subpath;
}
void pathRemoveFile(char *path, char delim)
@ -163,16 +163,13 @@ void initializePaths()
char buf[buflen];
DWORD len;
// Find path of executable and set path_data relative to it
// Find path of executable and set path_share relative to it
len = GetModuleFileName(GetModuleHandle(NULL), buf, buflen);
assert(len < buflen);
pathRemoveFile(buf, '\\');
// Use "./bin/../data"
path_data = std::string(buf) + DIR_DELIM ".." DIR_DELIM "data";
// Use "./bin/.."
path_userdata = std::string(buf) + DIR_DELIM "..";
path_share = std::string(buf) + "\\..\\share";
path_user = std::string(buf) + "\\..\\user";
/*
Linux
@ -187,11 +184,8 @@ void initializePaths()
pathRemoveFile(buf, '/');
// Use "./bin/../data"
path_data = std::string(buf) + "/../data";
// Use "./bin/../"
path_userdata = std::string(buf) + "/..";
path_share = std::string(buf) + "/../share";
path_user = std::string(buf) + "/../user";
/*
OS X
@ -201,8 +195,8 @@ void initializePaths()
//TODO: Get path of executable. This assumes working directory is bin/
dstream<<"WARNING: Relative path not properly supported on OS X and FreeBSD"
<<std::endl;
path_data = std::string("../data");
path_userdata = std::string("..");
path_share = std::string("../share");
path_user = std::string("../user");
#endif
@ -224,19 +218,18 @@ void initializePaths()
char buf[buflen];
DWORD len;
// Find path of executable and set path_data relative to it
// Find path of executable and set path_share relative to it
len = GetModuleFileName(GetModuleHandle(NULL), buf, buflen);
assert(len < buflen);
pathRemoveFile(buf, '\\');
// Use "./bin/../data"
path_data = std::string(buf) + DIR_DELIM ".." DIR_DELIM "data";
//path_data = std::string(buf) + "/../share/" + PROJECT_NAME;
// Use ".\bin\..\share"
path_share = std::string(buf) + "\\..\\share";
// Use "C:\Documents and Settings\user\Application Data\<PROJECT_NAME>"
len = GetEnvironmentVariable("APPDATA", buf, buflen);
assert(len < buflen);
path_userdata = std::string(buf) + DIR_DELIM + PROJECT_NAME;
path_user = std::string(buf) + DIR_DELIM + PROJECT_NAME;
/*
Linux
@ -251,15 +244,15 @@ void initializePaths()
pathRemoveFile(buf, '/');
path_data = std::string(buf) + "/../share/" + PROJECT_NAME;
//path_data = std::string(INSTALL_PREFIX) + "/share/" + PROJECT_NAME;
if (!fs::PathExists(path_data)) {
dstream<<"WARNING: data path " << path_data << " not found!";
path_data = std::string(buf) + "/../data";
dstream<<" Trying " << path_data << std::endl;
path_share = std::string(buf) + "/../share/" + PROJECT_NAME;
//path_share = std::string(INSTALL_PREFIX) + "/share/" + PROJECT_NAME;
if (!fs::PathExists(path_share)) {
dstream<<"WARNING: data path " << path_share << " not found!";
path_share = std::string(buf) + "/../data";
dstream<<" Trying " << path_share << std::endl;
}
path_userdata = std::string(getenv("HOME")) + "/." + PROJECT_NAME;
path_user = std::string(getenv("HOME")) + "/." + PROJECT_NAME;
/*
OS X
@ -276,7 +269,7 @@ void initializePaths()
{
dstream<<"Bundle resource path: "<<path<<std::endl;
//chdir(path);
path_data = std::string(path) + "/data";
path_share = std::string(path) + "/share";
}
else
{
@ -285,19 +278,19 @@ void initializePaths()
}
CFRelease(resources_url);
path_userdata = std::string(getenv("HOME")) + "/Library/Application Support/" + PROJECT_NAME;
path_user = std::string(getenv("HOME")) + "/Library/Application Support/" + PROJECT_NAME;
#elif defined(__FreeBSD__)
path_data = std::string(INSTALL_PREFIX) + "/share/" + PROJECT_NAME;
path_userdata = std::string(getenv("HOME")) + "/." + PROJECT_NAME;
path_share = std::string(INSTALL_PREFIX) + "/share/" + PROJECT_NAME;
path_user = std::string(getenv("HOME")) + "/." + PROJECT_NAME;
#endif
#endif // RUN_IN_PLACE
dstream<<"path_data = "<<path_data<<std::endl;
dstream<<"path_userdata = "<<path_userdata<<std::endl;
dstream<<"path_share = "<<path_share<<std::endl;
dstream<<"path_user = "<<path_user<<std::endl;
}
} //namespace porting

View file

@ -59,7 +59,7 @@ bool * signal_handler_killstatus(void);
/*
Path of static data directory.
*/
extern std::string path_data;
extern std::string path_share;
/*
Directory for storing user data. Examples:
@ -67,7 +67,7 @@ extern std::string path_data;
Linux: "~/.<PROJECT_NAME>"
Mac: "~/Library/Application Support/<PROJECT_NAME>"
*/
extern std::string path_userdata;
extern std::string path_user;
/*
Get full path of stuff in data directory.
@ -76,7 +76,7 @@ extern std::string path_userdata;
std::string getDataPath(const char *subpath);
/*
Initialize path_data and path_userdata.
Initialize path_share and path_user.
*/
void initializePaths();

View file

@ -843,13 +843,17 @@ u32 PIChecksum(core::list<PlayerInfo> &l)
*/
Server::Server(
std::string mapsavedir,
std::string configpath
std::string path_world,
std::string path_config,
std::string gamename
):
m_gamename(gamename),
m_path_world(path_world),
m_path_config(path_config),
m_env(NULL),
m_con(PROTOCOL_ID, 512, CONNECTION_TIMEOUT, this),
m_authmanager(mapsavedir+DIR_DELIM+"auth.txt"),
m_banmanager(mapsavedir+DIR_DELIM+"ipban.txt"),
m_authmanager(path_world+DIR_DELIM+"auth.txt"),
m_banmanager(path_world+DIR_DELIM+"ipban.txt"),
m_lua(NULL),
m_itemdef(createItemDefManager()),
m_nodedef(createNodeDefManager()),
@ -859,12 +863,15 @@ Server::Server(
m_time_counter(0),
m_time_of_day_send_timer(0),
m_uptime(0),
m_mapsavedir(mapsavedir),
m_configpath(configpath),
m_shutdown_requested(false),
m_ignore_map_edit_events(false),
m_ignore_map_edit_events_peer_id(0)
{
infostream<<"Server created."<<std::endl;
infostream<<"- path_world = "<<path_world<<std::endl;
infostream<<"- path_config = "<<path_config<<std::endl;
infostream<<"- gamename = "<<gamename<<std::endl;
m_liquid_transform_timer = 0.0;
m_print_info_timer = 0.0;
m_objectdata_timer = 0.0;
@ -876,27 +883,35 @@ Server::Server(
m_step_dtime_mutex.Init();
m_step_dtime = 0.0;
JMutexAutoLock envlock(m_env_mutex);
JMutexAutoLock conlock(m_con_mutex);
// Figure out some paths
m_path_share = porting::path_share + DIR_DELIM + "server";
m_path_game = m_path_share + DIR_DELIM + "games" + DIR_DELIM + m_gamename;
// Path to builtin.lua
std::string builtinpath = porting::path_data + DIR_DELIM + "builtin.lua";
std::string builtinpath = m_path_share + DIR_DELIM + "builtin.lua";
// Add default global mod search path
m_modspaths.push_front(porting::path_data + DIR_DELIM + "mods");
m_modspaths.push_front(m_path_game + DIR_DELIM "mods");
// Add world mod search path
m_modspaths.push_front(mapsavedir + DIR_DELIM + "worldmods");
// Add user mod search path
m_modspaths.push_front(porting::path_userdata + DIR_DELIM + "usermods");
m_modspaths.push_front(m_path_world + DIR_DELIM + "worldmods");
// Add addon mod search path
for(std::set<std::string>::const_iterator i = m_path_addons.begin();
i != m_path_addons.end(); i++){
m_modspaths.push_front((*i) + DIR_DELIM + "mods");
}
// Print out mod search paths
infostream<<"Mod search paths:"<<std::endl;
infostream<<"- mod search paths:"<<std::endl;
for(core::list<std::string>::Iterator i = m_modspaths.begin();
i != m_modspaths.end(); i++){
std::string modspath = *i;
infostream<<" "<<modspath<<std::endl;
}
// Lock environment
JMutexAutoLock envlock(m_env_mutex);
JMutexAutoLock conlock(m_con_mutex);
// Initialize scripting
infostream<<"Server: Initializing scripting"<<std::endl;
@ -936,7 +951,7 @@ Server::Server(
// Initialize Environment
m_env = new ServerEnvironment(new ServerMap(mapsavedir, this), m_lua,
m_env = new ServerEnvironment(new ServerMap(path_world, this), m_lua,
this, this);
// Give environment reference to scripting api
@ -946,15 +961,15 @@ Server::Server(
m_env->getMap().addEventReceiver(this);
// If file exists, load environment metadata
if(fs::PathExists(m_mapsavedir+DIR_DELIM+"env_meta.txt"))
if(fs::PathExists(m_path_world+DIR_DELIM+"env_meta.txt"))
{
infostream<<"Server: Loading environment metadata"<<std::endl;
m_env->loadMeta(m_mapsavedir);
m_env->loadMeta(m_path_world);
}
// Load players
infostream<<"Server: Loading players"<<std::endl;
m_env->deSerializePlayers(m_mapsavedir);
m_env->deSerializePlayers(m_path_world);
/*
Add some test ActiveBlockModifiers to environment
@ -1002,13 +1017,13 @@ Server::~Server()
Save players
*/
infostream<<"Server: Saving players"<<std::endl;
m_env->serializePlayers(m_mapsavedir);
m_env->serializePlayers(m_path_world);
/*
Save environment metadata
*/
infostream<<"Server: Saving environment metadata"<<std::endl;
m_env->saveMeta(m_mapsavedir);
m_env->saveMeta(m_path_world);
}
/*
@ -1065,7 +1080,7 @@ void Server::start(unsigned short port)
m_thread.setRun(true);
m_thread.Start();
infostream<<"Server: Started on port "<<port<<std::endl;
infostream<<"Server started on port "<<port<<"."<<std::endl;
}
void Server::stop()
@ -1803,10 +1818,10 @@ void Server::AsyncRunStep()
m_env->getMap().save(MOD_STATE_WRITE_NEEDED);
// Save players
m_env->serializePlayers(m_mapsavedir);
m_env->serializePlayers(m_path_world);
// Save environment metadata
m_env->saveMeta(m_mapsavedir);
m_env->saveMeta(m_path_world);
}
}
}
@ -4110,8 +4125,8 @@ void Server::setPlayerPassword(const std::string &name, const std::wstring &pass
// Saves g_settings to configpath given at initialization
void Server::saveConfig()
{
if(m_configpath != "")
g_settings->updateConfigFile(m_configpath.c_str());
if(m_path_config != "")
g_settings->updateConfigFile(m_path_config.c_str());
}
void Server::notifyPlayer(const char *name, const std::wstring msg)

View file

@ -392,6 +392,7 @@ public:
*/
Server(
std::string gamename,
std::string mapsavedir,
std::string configpath
);
@ -526,7 +527,7 @@ public:
const ModSpec* getModSpec(const std::string &modname);
std::string getWorldPath(){ return m_mapsavedir; }
std::string getWorldPath(){ return m_path_world; }
private:
@ -631,6 +632,21 @@ private:
Variables
*/
// Game name
std::string m_gamename;
// World directory
std::string m_path_world;
// Path to user's configuration file ("" = no configuration file)
std::string m_path_config;
// Equivalent of /usr/share/minetest/server
std::string m_path_share;
// Equivalent of /usr/share/minetest/server/games/gamename
std::string m_path_game;
// Equivalent of /usr/share/minetest/server/addons/gamename
// and ~/.minetest/server/addons/gamename
std::set<std::string> m_path_addons;
// Some timers
float m_liquid_transform_timer;
float m_print_info_timer;
@ -724,12 +740,6 @@ private:
/*
Random stuff
*/
// Map directory
std::string m_mapsavedir;
// Configuration path ("" = no configuration file)
std::string m_configpath;
// Mod parent directory paths
core::list<std::string> m_modspaths;

View file

@ -163,17 +163,16 @@ int main(int argc, char *argv[])
porting::signal_handler_init();
bool &kill = *porting::signal_handler_killstatus();
// Initialize porting::path_data and porting::path_userdata
porting::initializePaths();
// Create user data directory
fs::CreateDir(porting::path_userdata);
fs::CreateDir(porting::path_user);
// Initialize debug streams
#ifdef RUN_IN_PLACE
std::string debugfile = DEBUGFILE;
#else
std::string debugfile = porting::path_userdata+DIR_DELIM+DEBUGFILE;
std::string debugfile = porting::path_user+DIR_DELIM+DEBUGFILE;
#endif
debugstreams_init(disable_stderr, debugfile.c_str());
// Initialize debug stacks
@ -283,10 +282,12 @@ int main(int argc, char *argv[])
else
{
core::array<std::string> filenames;
filenames.push_back(porting::path_userdata +
filenames.push_back(porting::path_user +
DIR_DELIM + "minetest.conf");
#ifdef RUN_IN_PLACE
filenames.push_back(porting::path_userdata +
// Try also from a lower level (to aid having the same configuration
// for many RUN_IN_PLACE installs)
filenames.push_back(porting::path_user +
DIR_DELIM + ".." + DIR_DELIM + "minetest.conf");
#endif
@ -334,28 +335,31 @@ int main(int argc, char *argv[])
// Port?
u16 port = 30000;
if(cmd_args.exists("port") && cmd_args.getU16("port") != 0)
{
port = cmd_args.getU16("port");
}
else if(g_settings->exists("port") && g_settings->getU16("port") != 0)
{
port = g_settings->getU16("port");
}
else
{
dstream<<"Please specify port (in config or on command line)"
<<std::endl;
}
// Figure out path to map
std::string map_dir = porting::path_userdata+DIR_DELIM+"world";
// Map directory
std::string map_dir = porting::path_user + DIR_DELIM + "server" + DIR_DELIM + "worlds" + DIR_DELIM + "world";
if(cmd_args.exists("map-dir"))
map_dir = cmd_args.get("map-dir");
else if(g_settings->exists("map-dir"))
map_dir = g_settings->get("map-dir");
else{
// No map-dir option was specified.
// Check if the world is found from the default directory, and if
// not, see if the legacy world directory exists.
std::string legacy_map_dir = porting::path_user+DIR_DELIM+".."+DIR_DELIM+"world";
if(!fs::PathExists(map_dir) && fs::PathExists(legacy_map_dir)){
errorstream<<"Warning: Using legacy world directory \""
<<legacy_map_dir<<"\""<<std::endl;
map_dir = legacy_map_dir;
}
}
// Create server
Server server(map_dir.c_str(), configpath);
Server server(map_dir, configpath, "mesetint");
server.start(port);
// Run server

View file

@ -132,8 +132,9 @@ std::string getTexturePath(const std::string &filename)
*/
if(fullpath == "")
{
std::string rel_path = std::string("clienttextures")+DIR_DELIM+filename;
std::string testpath = porting::path_data + DIR_DELIM + rel_path;
std::string rel_path = std::string("client")
+ DIR_DELIM + "textures" + DIR_DELIM + filename;
std::string testpath = porting::path_share + DIR_DELIM + rel_path;
// Check all filename extensions. Returns "" if not found.
fullpath = getImagePath(testpath);
}
@ -997,7 +998,7 @@ void TextureSource::buildMainAtlas(class IGameDef *gamedef)
/*
Write image to file so that it can be inspected
*/
/*std::string atlaspath = porting::path_userdata
/*std::string atlaspath = porting::path_user
+ DIR_DELIM + "generated_texture_atlas.png";
infostream<<"Removing and writing texture atlas for inspection to "
<<atlaspath<<std::endl;