Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2008-10-18 17:58:45 +0000
committerStijn Buys <ingar@osirion.org>2008-10-18 17:58:45 +0000
commit35613f0860a2d8cb643ca8de006de08503e48e53 (patch)
tree8a5436de643e818e68a82df2e5cb2df2145f5062 /src/core
parentdb287e4a5133125bb6f25ba21ea97c47b19ac67f (diff)
example module
Diffstat (limited to 'src/core')
-rw-r--r--src/core/application.cc55
-rw-r--r--src/core/entity.cc83
-rw-r--r--src/core/entity.h21
-rw-r--r--src/core/gameserver.cc6
-rw-r--r--src/core/module.cc24
-rw-r--r--src/core/module.h34
-rw-r--r--src/core/net.h2
-rw-r--r--src/core/player.h2
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