diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/application.cc | 37 | ||||
-rw-r--r-- | src/core/application.h | 7 | ||||
-rw-r--r-- | src/core/gameconnection.h | 4 | ||||
-rw-r--r-- | src/core/gameinterface.h | 3 | ||||
-rw-r--r-- | src/core/gameserver.cc | 11 | ||||
-rw-r--r-- | src/core/gameserver.h | 3 | ||||
-rw-r--r-- | src/core/module.cc | 1 | ||||
-rw-r--r-- | src/core/module.h | 4 |
8 files changed, 60 insertions, 10 deletions
diff --git a/src/core/application.cc b/src/core/application.cc index 2b3f41f..c02db9b 100644 --- a/src/core/application.cc +++ b/src/core/application.cc @@ -98,15 +98,9 @@ void func_load(std::string const &args) return; } - if (game()) { - con_warn << "Connected. Disconnect first.\n"; - return; - } - std::string name(args); aux::to_label(name); - - Module::load(name.c_str()); + application()->load(name); } // --------------- signal_handler ----------------------------------- @@ -156,6 +150,8 @@ Application::Application() application_time = 0; application_game = 0; + module_interactive = 0; + #ifndef _WIN32 sys::signal(SIGHUP, signal_handler); sys::signal(SIGINT, signal_handler); @@ -312,11 +308,33 @@ void Application::quit(int status) } +Module *Application::load(std::string const &module_name) +{ + if (game()) { + con_warn << "Connected. Disconnect first.\n"; + return 0; + } + + if (Module::current() && Module::current()->interactive()) { + module_interactive = Module::current(); + } + return Module::load(module_name.c_str()); +} + void Application::connect(std::string const &host) { if (connected()) { - con_warn << "Connected. Disconnect first.\n"; - return; + if (!Module::current()->interactive() && module_interactive) { + /* if the current running module is non-interactive, + disconnect, and load the last interactive module_interactive + */ + disconnect(); + Module::load(module_interactive->label().c_str()); + + } else { + con_warn << "Connected. Disconnect first.\n"; + return; + } } if (application_game) { @@ -350,6 +368,7 @@ void Application::disconnect() notify_disconnect(); delete application_game; application_game = 0; + notify_zoneclear(0); con_print << "^BDisconnected.\n"; } } diff --git a/src/core/application.h b/src/core/application.h index 0dfa652..3769941 100644 --- a/src/core/application.h +++ b/src/core/application.h @@ -13,6 +13,7 @@ #include "core/netserver.h" #include "core/netconnection.h" #include "core/gameinterface.h" +#include "core/module.h" namespace core { @@ -46,6 +47,9 @@ public: /// disconnect from the game module void disconnect(); + /// load a module + Module *load(std::string const &module_name); + /*----- virtual mutators ------------------------------------------ */ /// initialize the application @@ -100,6 +104,9 @@ private: float application_time; GameInterface *application_game; static Application *application_instance; + + /// last loaded interactive module + Module *module_interactive; }; /// pointer to the current Application diff --git a/src/core/gameconnection.h b/src/core/gameconnection.h index ecf50f2..973d96f 100644 --- a/src/core/gameconnection.h +++ b/src/core/gameconnection.h @@ -28,6 +28,10 @@ public: /// returns true if the game connection can not run a time frime inline bool error() { return !connection_running; } + /// returns true if the game is running an interactive module + inline bool interactive() { return true; } + + /*----- mutators -------------------------------------------------- */ /// run a game connection time frame diff --git a/src/core/gameinterface.h b/src/core/gameinterface.h index 69cd588..b6d7cb6 100644 --- a/src/core/gameinterface.h +++ b/src/core/gameinterface.h @@ -54,6 +54,9 @@ public: /// returns true if the game server can run a time frime virtual bool running() = 0; + /// returns true if the game is running an interactive module + virtual bool interactive() = 0; + /*----- mutators ------------------------------------------------- */ /// clear all game variables, game functions and entities diff --git a/src/core/gameserver.cc b/src/core/gameserver.cc index 70786af..4037c70 100644 --- a/src/core/gameserver.cc +++ b/src/core/gameserver.cc @@ -135,7 +135,7 @@ GameServer::GameServer() : GameInterface() con_print << " module '^B" << server_module->name() << "^N'\n"; - if ((Cvar::sv_dedicated->value() || Cvar::sv_private->value())) { + if (server_module->interactive() && (Cvar::sv_dedicated->value() || Cvar::sv_private->value())) { server_network = new NetServer(Cvar::net_host->str(), (unsigned int) Cvar::net_port->value()); if (!server_network->valid()) { delete server_network; @@ -220,6 +220,15 @@ void GameServer::abort() server_running = false; } +bool GameServer::interactive() +{ + if (!server_module) { + return false; + } else { + return server_module->interactive(); + } +} + void GameServer::showtime() { using namespace std; diff --git a/src/core/gameserver.h b/src/core/gameserver.h index b25f1a0..0dfdd9d 100644 --- a/src/core/gameserver.h +++ b/src/core/gameserver.h @@ -33,6 +33,9 @@ public: /// returns true if the game server can not run a time frime inline bool error() { return !server_running; } + /// returns true if the game is running an interactive module + bool interactive(); + /// show the current time void showtime(); diff --git a/src/core/module.cc b/src/core/module.cc index 29c9eb8..ae78260 100644 --- a/src/core/module.cc +++ b/src/core/module.cc @@ -76,6 +76,7 @@ Module::Module(const char *name) : module_name(name) { module_running = false; + module_interactive = true; } Module::~Module() diff --git a/src/core/module.h b/src/core/module.h index b46c296..20029cf 100644 --- a/src/core/module.h +++ b/src/core/module.h @@ -33,6 +33,9 @@ public: /// label of the module inline std::string const & label() const { return module_label; } + /// indicates if this is an interactive module or not + inline bool interactive() const { return module_interactive; } + /*----- mutators -------------------------------------------------- */ /// initialize the game module @@ -80,6 +83,7 @@ protected: void abort(); bool module_running; + bool module_interactive; private: std::string module_name; |