Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/base/game.cc')
-rw-r--r--src/game/base/game.cc60
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());
+ }
+ }
}
}