summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorayase <137056643@qq.com>2018-07-20 03:50:30 +0800
committerBarbz <BarbzYHOOL@users.noreply.github.com>2018-07-19 21:50:29 +0200
commitd29a1a330018b89ee608aa27e500068f5310ed2a (patch)
treed01c2010842d4b0390617af4e2ebb0ceabbf99ed /src
parent8b1f2ece8ae7f3eb4f885c293f1225ea1c216793 (diff)
Core: Easy module conf creation & reload (#931)
* Change the read method of the config of the module.Developers can now easily read the config file in cmake. e.g. AC_ADD_CONFIG_FILE("${CMAKE_CURRENT_LIST_DIR}/conf/my_first_module.conf.dist") * Update Master.h * Update cs_reload.cpp Command: `.reload config` can now reload the config file of all modules #981
Diffstat (limited to 'src')
-rw-r--r--src/cmake/ac_macros.cmake8
-rw-r--r--src/server/game/World/World.cpp40
-rw-r--r--src/server/game/World/World.h6
-rw-r--r--src/server/scripts/Commands/cs_reload.cpp1
-rw-r--r--src/server/worldserver/CMakeLists.txt27
-rw-r--r--src/server/worldserver/Master.cpp3
6 files changed, 85 insertions, 0 deletions
diff --git a/src/cmake/ac_macros.cmake b/src/cmake/ac_macros.cmake
index 60c415ab45..d107351e57 100644
--- a/src/cmake/ac_macros.cmake
+++ b/src/cmake/ac_macros.cmake
@@ -19,3 +19,11 @@ MACRO(AC_ADD_SCRIPT_LOADER script_dec include)
endif()
endif()
ENDMACRO()
+
+#
+#AC_ADD_CONFIG_FILE
+#
+MACRO(AC_ADD_CONFIG_FILE configFilePath)
+ CU_GET_GLOBAL("MODULE_CONFIG_FILE_LIST")
+ CU_ADD_GLOBAL("MODULE_CONFIG_FILE_LIST" "${configFilePath}")
+ENDMACRO() \ No newline at end of file
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index be33b5b6f3..b4d37fa41e 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -120,6 +120,8 @@ World::World()
m_CleaningFlags = 0;
+ m_configFileList = "";
+
memset(rate_values, 0, sizeof(rate_values));
memset(m_int_configs, 0, sizeof(m_int_configs));
memset(m_bool_configs, 0, sizeof(m_bool_configs));
@@ -414,6 +416,43 @@ bool World::RemoveQueuedPlayer(WorldSession* sess)
return found;
}
+void World::LoadModuleConfigSettings()
+{
+ Tokenizer configFileList(GetConfigFileList(), ',');
+ for (auto i = configFileList.begin(); i != configFileList.end(); i++)
+ {
+ std::string configFile = (*i) + std::string(".conf");
+
+ std::string conf_path = _CONF_DIR;
+ std::string cfg_file = conf_path + "/" + configFile;
+
+#if PLATFORM == PLATFORM_WINDOWS
+ cfg_file = configFile;
+#endif
+ std::string cfg_def_file = cfg_file + ".dist";
+
+ // Load .conf.dist config
+ if (!sConfigMgr->LoadMore(cfg_def_file.c_str()))
+ {
+ sLog->outString();
+ sLog->outError("Module config: Invalid or missing configuration dist file : %s", cfg_def_file.c_str());
+ sLog->outError("Module config: Verify that the file exists and has \'[worldserver]' written in the top of the file!");
+ sLog->outError("Module config: Use default settings!");
+ sLog->outString();
+ }
+
+ // Load .conf config
+ if (!sConfigMgr->LoadMore(cfg_file.c_str()))
+ {
+ sLog->outString();
+ sLog->outError("Module config: Invalid or missing configuration file : %s", cfg_file.c_str());
+ sLog->outError("Module config: Verify that the file exists and has \'[worldserver]' written in the top of the file!");
+ sLog->outError("Module config: Use default settings!");
+ sLog->outString();
+ }
+ }
+}
+
/// Initialize config values
void World::LoadConfigSettings(bool reload)
{
@@ -426,6 +465,7 @@ void World::LoadConfigSettings(bool reload)
}
}
+ LoadModuleConfigSettings();
sScriptMgr->OnBeforeConfigLoad(reload);
// Reload log levels and filters
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index d7ba0040ba..089f1fa641 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -642,6 +642,7 @@ class World
void SetInitialWorldSettings();
void LoadConfigSettings(bool reload = false);
+ void LoadModuleConfigSettings();
void SendWorldText(int32 string_id, ...);
void SendGlobalText(const char* text, WorldSession* self);
@@ -779,6 +780,9 @@ class World
std::string const& GetRealmName() const { return _realmName; } // pussywizard
void SetRealmName(std::string name) { _realmName = name; } // pussywizard
+ std::string GetConfigFileList() { return m_configFileList; }
+ void SetConfigFileList(std::string list) { m_configFileList = list; }
+
protected:
void _UpdateGameTime();
// callback for UpdateRealmCharacters
@@ -876,6 +880,8 @@ class World
void ProcessQueryCallbacks();
ACE_Future_Set<PreparedQueryResult> m_realmCharCallbacks;
+
+ std::string m_configFileList;
};
#define sWorld ACE_Singleton<World, ACE_Null_Mutex>::instance()
diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp
index 13fdf2c15b..1c5df7c657 100644
--- a/src/server/scripts/Commands/cs_reload.cpp
+++ b/src/server/scripts/Commands/cs_reload.cpp
@@ -315,6 +315,7 @@ public:
{
sLog->outString("Re-Loading config settings...");
sWorld->LoadConfigSettings(true);
+ sWorld->LoadModuleConfigSettings();//reload modules config setting
sMapMgr->InitializeVisibilityDistanceInfo();
handler->SendGlobalGMSysMessage("World config settings reloaded.");
return true;
diff --git a/src/server/worldserver/CMakeLists.txt b/src/server/worldserver/CMakeLists.txt
index fdc17078bc..37777822c9 100644
--- a/src/server/worldserver/CMakeLists.txt
+++ b/src/server/worldserver/CMakeLists.txt
@@ -213,4 +213,31 @@ if( USE_COREPCH )
add_cxx_pch(worldserver ${worldserver_PCH_HDR} ${worldserver_PCH_SRC})
endif()
+# handle config file
+CU_GET_GLOBAL("MODULE_CONFIG_FILE_LIST")
+FOREACH(configFile ${MODULE_CONFIG_FILE_LIST})
+if( WIN32 )
+ if ( MSVC )
+ add_custom_command(TARGET worldserver
+ POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy "${configFile}" ${CMAKE_BINARY_DIR}/bin/$(ConfigurationName)/
+ )
+ elseif ( MINGW )
+ add_custom_command(TARGET worldserver
+ POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy "${configFile}" ${CMAKE_BINARY_DIR}/bin/
+ )
+ endif()
+endif()
+install(FILES "${configFile}" DESTINATION ${CONF_DIR})
+ENDFOREACH()
+
+CU_GET_GLOBAL("MODULE_CONFIG_FILE_LIST")
+FOREACH(configFile ${MODULE_CONFIG_FILE_LIST})
+ get_filename_component(file_name ${configFile} NAME_WE)
+ set(CONFIG_LIST ${CONFIG_LIST}${file_name},)
+ENDFOREACH()
+add_definitions(-DCONFIG_FILE_LIST="\\"${CONFIG_LIST}\\"")
+# end handle config file
+
CU_RUN_HOOK("AFTER_WORLDSERVER_CMAKE")
diff --git a/src/server/worldserver/Master.cpp b/src/server/worldserver/Master.cpp
index eed349e405..4b76a8172f 100644
--- a/src/server/worldserver/Master.cpp
+++ b/src/server/worldserver/Master.cpp
@@ -153,6 +153,9 @@ int Master::Run()
// set server offline (not connectable)
LoginDatabase.DirectPExecute("UPDATE realmlist SET flag = (flag & ~%u) | %u WHERE id = '%d'", REALM_FLAG_OFFLINE, REALM_FLAG_INVALID, realmID);
+ //set module config file list
+ sWorld->SetConfigFileList(CONFIG_FILE_LIST);
+
///- Initialize the World
sWorld->SetInitialWorldSettings();