Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2010-11-12 16:24:17 +0000
committerStijn Buys <ingar@osirion.org>2010-11-12 16:24:17 +0000
commitb460b3193e54b7364bb75ff26ce6f999887e454b (patch)
treed35e4972fd3ee54b9922908e3791a53bae96af14
parentc0c2a0ccc335b00983bf69b99b7a44505ed24b47 (diff)
moved global entity info type to core::Entity::infotype(),
automatic generation of jumppoint and jumpgate names and descriptions, prepared game code for the seperation of Entity::radius() and Model::radius()
-rw-r--r--src/core/entity.cc12
-rw-r--r--src/core/entity.h13
-rw-r--r--src/core/gameserver.cc5
-rw-r--r--src/core/parser.cc14
-rw-r--r--src/core/parser.h11
-rw-r--r--src/game/base/cargo.cc5
-rw-r--r--src/game/base/cargo.h2
-rw-r--r--src/game/base/faction.cc5
-rw-r--r--src/game/base/faction.h2
-rw-r--r--src/game/base/game.cc30
-rw-r--r--src/game/base/jumppoint.cc29
-rw-r--r--src/game/base/ship.cc2
-rw-r--r--src/game/base/shipmodel.cc11
-rw-r--r--src/game/base/shipmodel.h12
-rw-r--r--src/game/base/template.cc7
-rw-r--r--src/game/base/template.h2
16 files changed, 120 insertions, 42 deletions
diff --git a/src/core/entity.cc b/src/core/entity.cc
index 7f48c08..9e467fe 100644
--- a/src/core/entity.cc
+++ b/src/core/entity.cc
@@ -29,6 +29,8 @@ using math::Vector3f;
/* ---- Static functions for the Entity registry ------------------- */
+const InfoType *Entity::entity_infotype = 0;
+
Entity::Registry Entity::entity_registry;
size_t Entity::entity_nextid = 0;
@@ -314,7 +316,9 @@ void Entity::set_model(model::Model *model)
// server-side property should not clear modelname
entity_model = model;
if (entity_model) {
- entity_radius = entity_model->radius();
+
+ //entity_radius = entity_model->radius();
+
entity_modelname.assign(entity_model->name());
}
@@ -502,6 +506,10 @@ void Entity::remove_menu(std::string const &label)
void Entity::reset()
{
+ if (!radius()) {
+ return;
+ }
+
// location and orientation
btTransform t;
t.setIdentity();
@@ -918,7 +926,7 @@ void EntityControlable::set_zone(Zone *zone)
if (entity_zone) {
entity_zone->add(this);
- if (body() && entity_zone->physics()) {
+ if (body() && entity_zone->physics()) {
entity_zone->physics()->addRigidBody(body());
entity_zone->physics()->addAction(entity_actioninterface);
reset();
diff --git a/src/core/entity.h b/src/core/entity.h
index 48dd949..1996e10 100644
--- a/src/core/entity.h
+++ b/src/core/entity.h
@@ -402,6 +402,16 @@ public:
virtual void serialize_server_update(std::ostream & os) const;
/* ---- static --------------------------------------------- */
+
+ /// default infotype for entities
+ static inline const InfoType *infotype() {
+ return entity_infotype;
+ }
+
+ /// set the default infotype for entities
+ static inline void set_infotype(const InfoType *infotype) {
+ entity_infotype = infotype;
+ }
/// type definition for the entity registry
typedef std::map<unsigned int, Entity*> Registry;
@@ -492,6 +502,9 @@ private:
static size_t entity_nextid;
static void add(Entity *ent);
+
+ static const InfoType *entity_infotype;
+
};
diff --git a/src/core/gameserver.cc b/src/core/gameserver.cc
index 5ea6206..7d6fc96 100644
--- a/src/core/gameserver.cc
+++ b/src/core/gameserver.cc
@@ -130,7 +130,8 @@ GameServer::GameServer() : GameInterface()
server_maxplayerid = 1;
server_startup = application()->timestamp();
- Parser::init();
+ // create the default infotype for entities
+ Entity::set_infotype(new InfoType("entity"));
Physics::init();
@@ -237,7 +238,7 @@ GameServer::~GameServer()
Physics::done();
- Parser::done();
+ Entity::set_infotype(0);
server_instance = 0;
}
diff --git a/src/core/parser.cc b/src/core/parser.cc
index 3806b99..953cd50 100644
--- a/src/core/parser.cc
+++ b/src/core/parser.cc
@@ -11,18 +11,6 @@
namespace core
{
-InfoType *Parser::entity_infotype = 0;
-
-void Parser::init()
-{
- entity_infotype = new InfoType("entity");
-}
-
-void Parser::done()
-{
- entity_infotype = 0;
-}
-
bool Parser::got_entity_key(filesystem::IniFile &inifile, core::Entity *entity)
{
math::Vector3f v;
@@ -60,7 +48,7 @@ bool Parser::got_entity_key(filesystem::IniFile &inifile, core::Entity *entity)
} else if (inifile.got_key_string("info", strval)) {
if (!entity->info()) {
- entity->set_info(new Info(entity_infotype, entity->label().c_str()));
+ entity->set_info(new Info(Entity::infotype(), entity->label().c_str()));
}
entity->info()->add_text(strval);
return true;
diff --git a/src/core/parser.h b/src/core/parser.h
index 993c307..06ddc27 100644
--- a/src/core/parser.h
+++ b/src/core/parser.h
@@ -18,19 +18,8 @@ namespace core
class Parser
{
public:
- /// initialize parser infotypes
- static void init();
-
- /// clean up parser internals
- static void done();
-
/// read default entity keys from an ini file
static bool got_entity_key(filesystem::IniFile &inifile, core::Entity *entity);
-
-private:
- /// default infotype for entities
- static InfoType *entity_infotype;
-
};
}
diff --git a/src/game/base/cargo.cc b/src/game/base/cargo.cc
index 41cce1b..e75064e 100644
--- a/src/game/base/cargo.cc
+++ b/src/game/base/cargo.cc
@@ -104,6 +104,11 @@ bool Cargo::init()
return true;
}
+void Cargo::done()
+{
+ core::Func::remove("list_cargo");
+}
+
/* ---- class Cargo -------------------------------------------- */
Cargo::Cargo() : core::Info(cargo_infotype)
diff --git a/src/game/base/cargo.h b/src/game/base/cargo.h
index bee0502..4d90611 100644
--- a/src/game/base/cargo.h
+++ b/src/game/base/cargo.h
@@ -29,6 +29,8 @@ public:
static bool init();
+ static void done();
+
static void list();
static inline const core::InfoType *infotype() {
diff --git a/src/game/base/faction.cc b/src/game/base/faction.cc
index 2194844..6fb70cf 100644
--- a/src/game/base/faction.cc
+++ b/src/game/base/faction.cc
@@ -108,6 +108,11 @@ bool Faction::init()
return true;
}
+void Faction::done()
+{
+ core::Func::remove("list_faction");
+}
+
Faction::Faction() :
core::Info(faction_infotype),
faction_color(),
diff --git a/src/game/base/faction.h b/src/game/base/faction.h
index 608f7c7..997b6fc 100644
--- a/src/game/base/faction.h
+++ b/src/game/base/faction.h
@@ -54,6 +54,8 @@ public:
*/
static bool init();
+ static void done();
+
/**
* @brief list available factions
*/
diff --git a/src/game/base/game.cc b/src/game/base/game.cc
index fa83a0a..30970f9 100644
--- a/src/game/base/game.cc
+++ b/src/game/base/game.cc
@@ -887,7 +887,7 @@ Game::Game() : core::Module("Project::OSiRiON", true)
return;
}
- // add engine functions
+ // add game functions
core::Func *func = 0;
func = core::Func::add("join", Game::func_join);
@@ -966,8 +966,17 @@ Game::~Game()
// clear defaults
Default::clear();
+ // clear Cargo
+ Cargo::done();
+
+ // clear ShipModel
+ ShipModel::done();
+
+ // clear Templates
+ Template::done();
+
// clear Factions
- Faction::clear();
+ Faction::done();
}
bool Game::load_world()
@@ -1081,6 +1090,7 @@ bool Game::load_zone(core::Zone *zone)
while (zoneini.getline()) {
if (zoneini.got_section()) {
+
if (zoneini.got_section("zone")) {
continue;
@@ -1094,24 +1104,28 @@ bool Game::load_zone(core::Zone *zone)
navpoint = new NavPoint();
entity = navpoint;
navpoint->set_zone(zone);
+ navpoint->set_radius(0);
count ++;
} else if (zoneini.got_section("jumpgate")) {
jumppoint = new JumpGate();
entity = jumppoint;
jumppoint->set_zone(zone);
+ jumppoint->set_radius(0);
count ++;
} else if (zoneini.got_section("jumppoint")) {
jumppoint = new JumpPoint();
entity = jumppoint;
jumppoint->set_zone(zone);
+ jumppoint->set_radius(0);
count ++;
} else if (zoneini.got_section("racetrack")) {
racetrack = new RaceTrack();
entity = racetrack;
racetrack->set_zone(zone);
+ racetrack->set_radius(0);
} else if (zoneini.got_section("checkpoint")) {
checkpoint = new CheckPoint(racetrack);
@@ -1119,6 +1133,7 @@ bool Game::load_zone(core::Zone *zone)
if (!racetrack) {
zoneini.unknown_error("checkpoint without racetrack");
}
+ checkpoint->set_radius(0);
} else if (zoneini.got_section("planet")) {
planet = new Planet();
@@ -1130,11 +1145,13 @@ bool Game::load_zone(core::Zone *zone)
station = new Station();
entity = station;
station->set_zone(zone);
+ station->set_radius(0);
count ++;
} else if (zoneini.got_section("entity")) {
entity = new core::Entity();
entity->set_zone(zone);
+ entity->set_radius(0);
count ++;
} else if (zoneini.got_section("cargo")) {
@@ -1422,6 +1439,15 @@ bool Game::validate_zone(core::Zone *zone)
}
}
+ if (!entity->radius()) {
+ if (entity->model()) {
+ entity->set_radius(entity->model()->radius());
+ } else {
+ entity->set_radius(0.25f);
+ }
+ con_debug << " " << entity->label() << " radius set to " << entity->radius() << std::endl;
+ }
+
// initialize physics on planets and entities with a model
if ((entity->entity_moduletypeid == planet_enttype) || (entity->model())) {
entity->reset();
diff --git a/src/game/base/jumppoint.cc b/src/game/base/jumppoint.cc
index 82ed489..8af39b0 100644
--- a/src/game/base/jumppoint.cc
+++ b/src/game/base/jumppoint.cc
@@ -71,9 +71,22 @@ void JumpPoint::validate()
}
jumppoint_target = static_cast<JumpPoint *>(targetentity);
+
+ // overwrite name and info, remove the "system" part from the name
+ std::string name("Jumppoint " + zone()->name() + " -> " + target()->zone()->name());
+ for (size_t pos = name.find(" system"); pos != std::string::npos; pos = name.find(" system")) {
+ name.erase(pos, 7);
+ }
+ set_name(name);
+
+ if (!info()) {
+ set_info(new core::Info(core::Entity::infotype(), label().c_str()));
+ }
+ info()->clear_text();
+ info()->add_text("Jumppoint to the " + target()->zone()->name());
+
- con_debug << " jumppoint to " << targetzone->label() << std::endl;
- //con_debug << " Jumppoint " << zone->label() << ":" << label() << " with target " << targetlabel() << std::endl;
+ con_debug << " " << label() << " jumppoint to " << target()->zone()->label() << ":" << target()->label() << std::endl;
}
/* ---- class JumpGate --------------------------------------------- */
@@ -97,6 +110,18 @@ JumpGate::~JumpGate()
void JumpGate::validate()
{
JumpPoint::validate();
+
+ // overwrite name and info
+ // overwrite name and info, remove the "system" part from the name
+ std::string name("Jumpgate " + zone()->name() + " -> " + target()->zone()->name());
+ for (size_t pos = name.find(" system"); pos != std::string::npos; pos = name.find(" system")) {
+ name.erase(pos, 7);
+ }
+ set_name(name);
+
+ info()->clear_text();
+ info()->add_text("Jumpgate to the " + target()->zone()->name());
+
if (target()) {
set_flag(core::Entity::Dockable);
} else {
diff --git a/src/game/base/ship.cc b/src/game/base/ship.cc
index 38ade38..0b31a91 100644
--- a/src/game/base/ship.cc
+++ b/src/game/base/ship.cc
@@ -68,7 +68,7 @@ Ship::Ship(core::Player *owner, ShipModel *shipmodel) : core::EntityControlable(
set_label(shipmodel->label());
}
- if (shipmodel->dock()) {
+ if (shipmodel->dockable()) {
using core::MenuDescription;
using core::ButtonDescription;
diff --git a/src/game/base/shipmodel.cc b/src/game/base/shipmodel.cc
index 4cf55bf..1cea640 100644
--- a/src/game/base/shipmodel.cc
+++ b/src/game/base/shipmodel.cc
@@ -73,7 +73,7 @@ bool ShipModel::init()
shipmodel->set_jumpdrive(b);
continue;
} else if (inifile.got_key_bool("dock", b)) {
- shipmodel->set_dock(b);
+ shipmodel->set_dockable(b);
continue;
} else if (inifile.got_key_float("maxspeed", f)) {
shipmodel->set_maxspeed(f * 0.01f);
@@ -145,6 +145,11 @@ bool ShipModel::init()
return true;
}
+void ShipModel::done()
+{
+ core::Func::remove("list_ship");
+}
+
ShipModel::ShipModel() : core::Info(shipmodel_infotype)
{
shipmodel_maxspeed = 0;
@@ -159,7 +164,7 @@ ShipModel::ShipModel() : core::Info(shipmodel_infotype)
shipmodel_maxcargo = 0.0f;
shipmodel_jumpdrive = false; // no jumpdrive capability
- shipmodel_dock = false; // not dockable
+ shipmodel_dockable = false; // not dockable
}
ShipModel::~ShipModel()
@@ -195,7 +200,7 @@ void ShipModel::generate_info()
add_text("^Bhyperspace jump drive");
}
- if (dock()) {
+ if (dockable()) {
add_text("^Bdockable");
}
}
diff --git a/src/game/base/shipmodel.h b/src/game/base/shipmodel.h
index 9da50a6..25473d4 100644
--- a/src/game/base/shipmodel.h
+++ b/src/game/base/shipmodel.h
@@ -34,8 +34,8 @@ public:
}
/// indicates if players can dock this ship model
- inline const bool dock() const {
- return shipmodel_dock;
+ inline const bool dockable() const {
+ return shipmodel_dockable;
}
/// default mass
@@ -139,8 +139,8 @@ protected:
}
/// set dock capability
- inline void set_dock(const bool dock) {
- shipmodel_dock = dock;
+ inline void set_dockable(const bool dockable) {
+ shipmodel_dockable = dockable;
}
/// set radius
@@ -166,6 +166,8 @@ public:
static bool init();
+ static void done();
+
static void list();
static inline const core::InfoType *infotype() {
@@ -187,7 +189,7 @@ private:
float shipmodel_maxcargo;
bool shipmodel_jumpdrive;
- bool shipmodel_dock;
+ bool shipmodel_dockable;
const Template *shipmodel_template;
diff --git a/src/game/base/template.cc b/src/game/base/template.cc
index 1cdac1a..7861538 100644
--- a/src/game/base/template.cc
+++ b/src/game/base/template.cc
@@ -116,7 +116,7 @@ bool Template::init()
entitytemplate = Template::find(std::string("navpoint"));
NavPoint::set_template(entitytemplate);
- if (entitytemplate) {
+ if (!entitytemplate) {
con_warn << "Template 'navpoint' not found!" << std::endl;
}
@@ -128,6 +128,11 @@ bool Template::init()
return true;
}
+void Template::done()
+{
+ core::Func::remove("list_template");
+}
+
Template::Template() :
core::Info(template_infotype),
template_color(),
diff --git a/src/game/base/template.h b/src/game/base/template.h
index 47c9ff3..5780e9c 100644
--- a/src/game/base/template.h
+++ b/src/game/base/template.h
@@ -66,6 +66,8 @@ public:
static bool init();
+ static void done();
+
static void list();
static Template *find(const std::string & label);