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>2008-09-10 19:17:52 +0000
committerStijn Buys <ingar@osirion.org>2008-09-10 19:17:52 +0000
commit83fb219e62113a9f41888af4f2726e5ce5305970 (patch)
tree3ba9780192fc7aa7d1fe7988b30a85c5ba08d422 /src/game/ship.cc
parent033bd59cfc2dff93529ad448459ad6348ea29c8d (diff)
serverside entities
Diffstat (limited to 'src/game/ship.cc')
-rw-r--r--src/game/ship.cc137
1 files changed, 85 insertions, 52 deletions
diff --git a/src/game/ship.cc b/src/game/ship.cc
index 167c82a..0dde90e 100644
--- a/src/game/ship.cc
+++ b/src/game/ship.cc
@@ -38,8 +38,6 @@ Ship::Ship(core::Player *owner, ShipModel *shipmodel) :
ship_shipmodel = shipmodel;
ship_jumpdrive = shipmodel->shipmodel_jumpdrive;
- ship_jumptargetzone = 0;
-
ship_impulsedrive_timer = 0;
ship_jumpdrive_timer = 0;
@@ -71,7 +69,6 @@ void Ship::impulse()
if (entity_eventstate == core::Entity::JumpInitiate) {
ship_jumpdrive_timer = 0;
- ship_jumptargetzone = 0;
entity_timer = 0;
}
@@ -90,58 +87,74 @@ void Ship::impulse()
void Ship::jump(std::string const &args)
{
- if (!jumpdrive() && !Game::instance()->g_devel->value()) {
- core::server()->send(owner(), "This ship is not equiped with a hyperspace drive!");
- return;
-
- } else if (entity_eventstate == core::Entity::Jump) {
- return;
+ // devel mode provides instant jump access to arbitrary systems
+ if (Game::instance()->g_devel->value() && (args.size())) {
+
+ core::Zone *jumptargetzone = 0;
+ std::string target;
+ std::istringstream is(args);
+ if (!(is >> target)) {
+ std::string helpstr;
+ for (core::Zone::Registry::iterator it = core::Zone::registry().begin(); it != core::Zone::registry().end(); it++) {
+ core::Zone *zone = (*it).second;
+ if (helpstr.size())
+ helpstr.append("^N|^B");
+ helpstr.append(zone->label());
+ }
+
+ core::server()->send(owner(), "Usage: jump [^B" + helpstr + "^N]");
+ return;
+ }
+
+ aux::to_lowercase(target);
+ jumptargetzone = core::Zone::find_zone(target);
+ if (!jumptargetzone) {
+ core::server()->send(owner(), "Unknown system '" + target + '\'');
+ return;
+ }
+
+ if (jumptargetzone == zone()) {
+ core::server()->send(owner(), "Already in the " + jumptargetzone->name() + '.');
+ return;
+ }
+
+ core::server()->send(owner(), "Jumping to '" + jumptargetzone->name() + '\'');
+ set_zone(jumptargetzone);
+ if (owner()->control() == (EntityControlable*) this)
+ owner()->set_zone(jumptargetzone);
- } else if (entity_eventstate == core::Entity::JumpInitiate) {
- core::server()->send(owner(), "Jump aborted, hyperspace drive deactivated.");
- ship_jumptargetzone = 0;
ship_jumpdrive_timer = 0;
entity_timer = 0;
- entity_eventstate = core::Entity::Normal;
+ entity_eventstate = core::Entity::Jump;
+ entity_dirty = true;
return;
- }
-
- std::string target;
- std::istringstream is(args);
- if (!(is >> target)) {
- std::string helpstr;
- for (core::Zone::Registry::iterator it = core::Zone::registry().begin(); it != core::Zone::registry().end(); it++) {
- core::Zone *zone = (*it).second;
- if (helpstr.size())
- helpstr.append("^N|^B");
- helpstr.append(zone->label());
- }
- core::server()->send(owner(), "Usage: jump [^B" + helpstr + "^N]");
- return;
- }
+ } else {
+ if (!jumpdrive() && !Game::instance()->g_devel->value()) {
+ core::server()->send(owner(), "This ship is not equiped with a hyperspace drive!");
+ return;
- aux::to_lowercase(target);
- ship_jumptargetzone = core::Zone::find_zone(target);
- if (!ship_jumptargetzone) {
- core::server()->send(owner(), "Unknown system '" + target + '\'');
- return;
- }
+ } else if (entity_eventstate == core::Entity::Jump) {
+ return;
- if (ship_jumptargetzone == zone()) {
- core::server()->send(owner(), "Already in the " + ship_jumptargetzone->name() + '.');
- ship_jumptargetzone = 0;
- return;
- }
+ } else if (entity_eventstate == core::Entity::JumpInitiate) {
+ core::server()->send(owner(), "Jump aborted, hyperspace drive deactivated.");
+ ship_jumpdrive_timer = 0;
+ entity_timer = 0;
+ entity_eventstate = core::Entity::Normal;
+ return;
+ }
+
+ entity_eventstate = core::Entity::JumpInitiate;
+ if (Game::instance()->g_devel->value()) {
+ entity_timer = 0;
+ } else {
+ entity_timer = 8;
+ }
- entity_eventstate = core::Entity::JumpInitiate;
- if (Game::instance()->g_devel->value()) {
- entity_timer = 0;
- } else {
- entity_timer = 10;
+ ship_jumpdrive_timer = core::server()->time();
+ entity_dirty = true;
}
- ship_jumpdrive_timer = core::server()->time();
- entity_dirty = true;
}
void Ship::frame(float seconds)
@@ -171,14 +184,34 @@ void Ship::frame(float seconds)
entity_timer -= 1.0f;
if (entity_timer <= 0) {
- core::server()->send(owner(), "Jumping to '" + ship_jumptargetzone->name() + '\'');
- set_zone(ship_jumptargetzone);
- if (owner()->control() == (EntityControlable*) this)
- owner()->set_zone(ship_jumptargetzone);
+ // find closest jumppoint
+ float d = -1;
+ JumpPoint *jumppoint = 0;
+ for (core::Zone::Content::iterator it = zone()->content().begin(); it != zone()->content().end(); it++) {
+ core::Entity *entity = (*it);
+ if (entity->moduletype() == jumppoint_enttype) {
+ JumpPoint *te = static_cast<JumpPoint *>(entity);
+ float d1 = math::distance(location(), te->location());
+ if ((d < 0) || (d1 < d1)) {
+ d = d1;
+ jumppoint = te;
+ }
+ }
+ }
+ if (jumppoint && jumppoint->target()) {
+ core::server()->send(owner(), "Jumping to '" + jumppoint->target()->zone()->name() + '\'');
+ set_zone(jumppoint->target()->zone());
+ if (owner()->control() == (EntityControlable*) this)
+ owner()->set_zone(jumppoint->target()->zone());
+ entity_eventstate = core::Entity::Jump;
+ entity_location.assign(jumppoint->target()->location() + location() - jumppoint->location());
+ } else {
+ core::server()->send(owner(), "Jump failed!");
+ entity_eventstate = core::Entity::Normal;
+ }
ship_jumpdrive_timer = 0;
- ship_jumptargetzone = 0;
entity_timer = 0;
- entity_eventstate = core::Entity::Jump;
+
entity_dirty = true;
return;
} else {