diff options
author | Stijn Buys <ingar@osirion.org> | 2008-09-10 19:17:52 +0000 |
---|---|---|
committer | Stijn Buys <ingar@osirion.org> | 2008-09-10 19:17:52 +0000 |
commit | 83fb219e62113a9f41888af4f2726e5ce5305970 (patch) | |
tree | 3ba9780192fc7aa7d1fe7988b30a85c5ba08d422 /src/game/ship.cc | |
parent | 033bd59cfc2dff93529ad448459ad6348ea29c8d (diff) |
serverside entities
Diffstat (limited to 'src/game/ship.cc')
-rw-r--r-- | src/game/ship.cc | 137 |
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 { |