diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/application.cc | 55 | ||||
-rw-r--r-- | src/core/entity.cc | 83 | ||||
-rw-r--r-- | src/core/entity.h | 21 | ||||
-rw-r--r-- | src/core/gameserver.cc | 6 | ||||
-rw-r--r-- | src/core/module.cc | 24 | ||||
-rw-r--r-- | src/core/module.h | 34 | ||||
-rw-r--r-- | src/core/net.h | 2 | ||||
-rw-r--r-- | src/core/player.h | 2 |
8 files changed, 158 insertions, 69 deletions
diff --git a/src/core/application.cc b/src/core/application.cc index 0d52b76..71d739f 100644 --- a/src/core/application.cc +++ b/src/core/application.cc @@ -84,20 +84,6 @@ void func_msg(std::string const &args) void func_load(std::string const &args) { - if (!args.size()) { - if (Module::current()) { - con_print << " currently loaded: " << Module::current()->label() << " " << Module::current()->name() << std::endl; - } - - std::string helpstr(" available modules:"); - for(Module::Registry::iterator it = Module::registry().begin(); it != Module::registry().end(); it++) { - helpstr += ' '; - helpstr += (*it).first; - } - con_print << helpstr << std::endl; - return; - } - std::string name(args); aux::to_label(name); application()->load(name); @@ -311,13 +297,32 @@ void Application::quit(int status) Module *Application::load(std::string const &module_label) { - if (game() && Module::current()->interactive()) { + if (!module_label.size()) { + if (Module::active()) { + con_print << " active module: " << Module::active()->label() << " " << Module::active()->name() << std::endl; + } + if (Module::loaded()) { + con_print << " loaded module: " << Module::loaded()->label() << " " << Module::loaded()->name() << std::endl; + } + if (module_interactive) { + con_print << " fallback module: " << module_interactive->label() << " " << module_interactive->name() << std::endl; + } + std::string helpstr(" available modules:"); + for(Module::Registry::iterator it = Module::registry().begin(); it != Module::registry().end(); it++) { + helpstr += ' '; + helpstr += (*it).first; + } + con_print << helpstr << std::endl; + return 0; + } +/* + if (Module::active() && Module::active()->interactive()) { con_warn << "Connected. Disconnect first.\n"; return 0; } - - if (Module::current() && Module::current()->interactive()) { - module_interactive = Module::current(); +*/ + if (Module::loaded() && Module::loaded()->interactive()) { + module_interactive = Module::loaded(); } return Module::load(module_label.c_str()); } @@ -325,13 +330,13 @@ Module *Application::load(std::string const &module_label) void Application::connect(std::string const &host) { if (connected()) { - 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()); - + if (!Module::active()->interactive()) { + if ((Module::loaded() == Module::active()) && (module_interactive)) { + disconnect(); + Module::load(module_interactive->label().c_str()); + } else { + disconnect(); + } } else { con_warn << "Connected. Disconnect first.\n"; return; diff --git a/src/core/entity.cc b/src/core/entity.cc index e74b8b5..27190a0 100644 --- a/src/core/entity.cc +++ b/src/core/entity.cc @@ -177,7 +177,7 @@ void Entity::set_label(char const *label) aux::to_label(entity_label); } -void Entity::set_label(std::string const &label) +void Entity::set_label(const std::string &label) { entity_label.assign(label); aux::to_label(entity_label); @@ -189,16 +189,35 @@ void Entity::set_name(char const *name) aux::strip_quotes(entity_name); } -void Entity::set_name(std::string const &name) +void Entity::set_name(const std::string &name) { entity_name.assign(name); aux::strip_quotes(entity_name); } +void Entity::set_visible(bool visible) +{ + if (visible) + show(); + else + hide(); +} + +void Entity::show() +{ + entity_visible = false; +} + +void Entity::hide() +{ + entity_visible = false; +} + void Entity::serialize_server_create(std::ostream & os) const { os << entity_moduletypeid << " " << entity_flags << " " + << (entity_visible ? 1 : 0) << " " << (entity_zone ? entity_zone->id() : 0) << " " << std::setprecision(8) << entity_location << " " << entity_color << " " @@ -216,10 +235,18 @@ void Entity::receive_server_create(std::istream &is) { unsigned int s; unsigned int zo; + unsigned int o = 0; std::string n; is >> entity_moduletypeid; is >> entity_flags; + + is >> o; + if (o) + entity_visible = true; + else + entity_visible = false; + is >> zo; set_zone(Zone::find(zo)); @@ -363,33 +390,43 @@ void EntityDynamic::receive_client_update(std::istream &is) void EntityDynamic::serialize_server_update(std::ostream & os) const { - os << std::setprecision(8) - << entity_location << " " - << entity_axis.forward() << " " - << entity_axis.left() << " " - << roundf(entity_speed * 100.0f) << " " - << entity_eventstate << " "; - - if (entity_eventstate != Normal) { - os << entity_timer << " "; + os << (visible() ? 1 : 0 ) << " "; + if (visible()) { + os << std::setprecision(8) + << entity_location << " " + << entity_axis.forward() << " " + << entity_axis.left() << " " + << roundf(entity_speed * 100.0f) << " " + << entity_eventstate << " "; + + if (entity_eventstate != Normal) { + os << entity_timer << " "; + } } } void EntityDynamic::receive_server_update(std::istream &is) { - is >> entity_location; - // axis up vector is the crossproduct of forward and left - is >> entity_axis[0]; - is >> entity_axis[1]; - entity_axis[2] = math::crossproduct(entity_axis.forward(), entity_axis.left()); - is >> entity_speed; - entity_speed /= 100.0f; - is >> entity_eventstate; - - if (entity_eventstate != Normal) { - is >> entity_timer; + unsigned int o; + is >> o; // visibility + if (o) { + entity_visible = true; + is >> entity_location; + // axis up vector is the crossproduct of forward and left + is >> entity_axis[0]; + is >> entity_axis[1]; + entity_axis[2] = math::crossproduct(entity_axis.forward(), entity_axis.left()); + is >> entity_speed; + entity_speed /= 100.0f; + is >> entity_eventstate; + + if (entity_eventstate != Normal) { + is >> entity_timer; + } else { + entity_timer = 0; + } } else { - entity_timer = 0; + entity_visible = false; } } diff --git a/src/core/entity.h b/src/core/entity.h index 4861b07..2c4814e 100644 --- a/src/core/entity.h +++ b/src/core/entity.h @@ -117,6 +117,9 @@ public: /// indicates a server-side entity inline bool serverside() const { return entity_serverside; } + /// general visibility + inline bool visible() const { return entity_visible; } + /*----- serializers ----------------------------------------------- */ /// serialize the entity to a stream @@ -148,6 +151,9 @@ public: */ virtual void frame(float seconds); + /// set dirty flag + inline void set_dirty() { entity_dirty = true; } + /// set the zone the entity is currently in /** * this fuction removes the entity from its previous zone @@ -159,13 +165,22 @@ public: void set_label(char const *label); /// set the label - void set_label(std::string const &label); + void set_label(const std::string &label); /// set the name void set_name(char const *name); /// set the name - void set_name(std::string const &name); + void set_name(const std::string &name); + + /// set visibility + void set_visible(bool visible = true); + + /// show the entity, make it visible + virtual void show(); + + /// hide the entity, make it invisible + virtual void hide(); /// clear all update flags virtual void clear_updates(); @@ -218,6 +233,7 @@ protected: // the previous zone the entity belonged too Zone *entity_oldzone; + bool entity_visible; bool entity_serverside; std::string entity_name; @@ -232,7 +248,6 @@ private: // the entity registry static Registry entity_registry; - static size_t entity_nextid; }; diff --git a/src/core/gameserver.cc b/src/core/gameserver.cc index 4fc3924..e73c6ce 100644 --- a/src/core/gameserver.cc +++ b/src/core/gameserver.cc @@ -125,7 +125,7 @@ GameServer::GameServer() : GameInterface() server_maxplayerid = 1; server_startup = application()->timestamp(); - server_module = Module::current(); + server_module = Module::loaded(); if (!server_module) { con_error << "No module loaded.\n"; abort(); @@ -137,7 +137,7 @@ GameServer::GameServer() : GameInterface() // set the name of the game core::Cvar::set("g_name", server_module->name().c_str(), core::Cvar::Game | core::Cvar::ReadOnly); - server_module->init(); + server_module->run(); if (!server_module->running()) { con_error << "Could not initialize module '" << server_module->name() << "'\n"; abort(); @@ -209,7 +209,7 @@ GameServer::~GameServer() if (server_module->running() && !Cvar::sv_dedicated->value()) player_disconnect(localplayer()); - server_module->shutdown(); + server_module->terminate(); } Func::remove("kick"); diff --git a/src/core/module.cc b/src/core/module.cc index 319d651..eec250e 100644 --- a/src/core/module.cc +++ b/src/core/module.cc @@ -14,6 +14,8 @@ namespace core /*-- static functions ----------------------------------------------*/ Module *Module::module_preload = 0; +Module *Module::module_active = 0; + Module::Registry Module::module_registry; Module *Module::find(const std::string &label) @@ -60,7 +62,7 @@ Module *Module::load(const char *label) return 0; } - con_print << " module" << module->label() << " " << module->name() << std::endl; + con_print << " module " << module->label() << " " << module->name() << std::endl; module_preload = module; return module; } @@ -88,11 +90,11 @@ void Module::list() /*-- instance functions --------------------------------------------*/ -Module::Module(const char *label, const char *name) : +Module::Module(const char *label, const char *name, bool interactive) : module_label(label), module_name(name) { module_running = false; - module_interactive = true; + module_interactive = interactive; } Module::~Module() @@ -101,9 +103,25 @@ Module::~Module() module_name.clear(); } +void Module::run() +{ + module_active = this; + module_running = true; + + init(); +} + +void Module::terminate() +{ + shutdown(); + module_running = false; + module_active = 0; +} + void Module::abort() { module_running = false; + module_active = 0; } } diff --git a/src/core/module.h b/src/core/module.h index bc4f765..64b41bd 100644 --- a/src/core/module.h +++ b/src/core/module.h @@ -17,7 +17,7 @@ namespace core class Module { public: - Module(const char *label, const char *name); + Module(const char *label, const char *name, bool interactive=true); virtual ~Module(); /*----- inspectors ------------------------------------------------ */ @@ -38,11 +38,11 @@ public: /*----- mutators -------------------------------------------------- */ - /// initialize the game module - virtual void init() = 0; + /// run the game module + void run(); - /// shutdown the game module - virtual void shutdown() = 0; + /// terminate a running game module + void terminate(); /// run one timeframe virtual void frame(float seconds) = 0; @@ -75,27 +75,39 @@ public: /// unload all modules static void clear(); + /// currently active module + static inline Module *active() { return module_active; } + /// currently loaded module - static inline Module *current() { return module_preload; } + static inline Module *loaded() { return module_preload; } /// module registry static inline Registry & registry() { return module_registry; } protected: - /// set the disconnected state + /// initialize the game module + virtual void init() = 0; + + /// shutdown the game module + virtual void shutdown() = 0; + + /// abort a running module void abort(); - bool module_running; +private: + bool module_interactive; + bool module_running; -private: std::string module_label; std::string module_name; - static Module *module_preload; - static Registry module_registry; + + static Module *module_preload; + static Module *module_active; + }; } diff --git a/src/core/net.h b/src/core/net.h index c724f85..92a17c5 100644 --- a/src/core/net.h +++ b/src/core/net.h @@ -11,7 +11,7 @@ namespace core { /// network protocol version -const unsigned int PROTOCOLVERSION = 11; +const unsigned int PROTOCOLVERSION = 12; /// maximum lenght of a (compressed) network message block const unsigned int FRAMESIZE = 1152; diff --git a/src/core/player.h b/src/core/player.h index aa31a35..c527433 100644 --- a/src/core/player.h +++ b/src/core/player.h @@ -104,6 +104,8 @@ public: void set_mission_target(Entity *new_mission_target); + inline void set_dirty() { player_dirty = true; } + /* -- should actually not be public --*/ /// dirty state |