diff options
Diffstat (limited to 'src/game/base/game.cc')
-rw-r--r-- | src/game/base/game.cc | 60 |
1 files changed, 40 insertions, 20 deletions
diff --git a/src/game/base/game.cc b/src/game/base/game.cc index 418bfb5..d99f80c 100644 --- a/src/game/base/game.cc +++ b/src/game/base/game.cc @@ -37,8 +37,6 @@ core::Entity *Default::view = 0; ShipModel *Default::shipmodel = 0; long Default::credits = 0; -const float planet_safe_distance = 150.0f; - void Default::clear() { zone = 0; @@ -170,16 +168,13 @@ void Game::func_dock(core::Player *player, core::Entity *entity) if (!player->control()) return; - if (player->control()->zone() != entity->zone()) - return; - if (player->control() == entity) return; - if ((entity->flags() & core::Entity::Dockable) == 0) + if (player->control()->zone() != entity->zone()) return; - - if (player->control()->state() != core::Entity::Normal) + + if ((entity->flags() & core::Entity::Dockable) == 0) return; if (player->control()->moduletype() != ship_enttype) @@ -188,28 +183,53 @@ void Game::func_dock(core::Player *player, core::Entity *entity) if (!(entity->flags() & core::Entity::Dockable)) { return; } - + Ship * ship = static_cast<Ship *>(player->control()); - + + // check distance float range = entity->radius() + ship->radius(); + if (entity->moduletype() == planet_enttype) { - range = planet_safe_distance; + range += planet_safe_distance; } + core::Player *owner = (entity->type() == core::Entity::Controlable ? static_cast<core::EntityControlable *>(entity)->owner() : 0 ); if (math::distance(entity->location(), ship->location()) > range) { - if (ship->owner()) { - ship->owner()->send("^W" + entity->name() + " out of range"); + if (owner) { + player->send("^W" + owner->name() + "^W's " + entity->name() + " out of range"); + } else { + player->send("^W" + entity->name() + " out of range"); } return; } + + if ((player->control()->state() == core::Entity::Impulse) || (player->control()->state() == core::Entity::ImpulseInitiate)) { + player->send("^WCan not dock at impulse speed"); + return; + } + + if (player->control()->state() != core::Entity::Normal) + return; + + if (entity->moduletype() == jumpgate_enttype) { + // jumpgates their own docking function + JumpGate *jumpgate = static_cast<JumpGate *>(entity); + jumpgate->func_dock(ship); + return; + + } else { + ship->get_location().assign(entity->location()); + ship->set_state(core::Entity::Docked); + ship->reset(); - ship->get_location().assign(entity->location()); - ship->set_state(core::Entity::Docked); - ship->reset(); - - if (ship->owner() && ship->owner()->control() == ship) { - ship->owner()->set_view(entity); - ship->owner()->send("^BDocking at " + entity->name()); + if (player->control() == ship) { + player->set_view(entity); + if (owner) { + player->send("^BDocking at " + owner->name() + "^B's " + entity->name()); + } else { + player->send("^BDocking at " + entity->name()); + } + } } } |