diff options
author | Stijn Buys <ingar@osirion.org> | 2013-11-09 00:29:58 +0000 |
---|---|---|
committer | Stijn Buys <ingar@osirion.org> | 2013-11-09 00:29:58 +0000 |
commit | 41fcb9f3915db02c9255dc62f03d6b4a55e5b6d3 (patch) | |
tree | fd7953b9a59cc3a9c5aa3a70522bf46b787cfb16 /src | |
parent | cf4deaa44bebafc829e21704f186e01faa2f940d (diff) |
Nudge ships on launch and cargopods on creation to prevent them from spawning inside other objects.
Diffstat (limited to 'src')
-rw-r--r-- | src/core/entity.cc | 27 | ||||
-rw-r--r-- | src/core/entity.h | 5 | ||||
-rw-r--r-- | src/game/base/ship.cc | 11 |
3 files changed, 40 insertions, 3 deletions
diff --git a/src/core/entity.cc b/src/core/entity.cc index 89e494a..4c4c35b 100644 --- a/src/core/entity.cc +++ b/src/core/entity.cc @@ -757,6 +757,33 @@ void EntityDynamic::set_state(int state) } } +void EntityDynamic::nudge() +{ + if (!zone()) { + return; + } + + for (Zone::Content::const_iterator it = zone()->content().begin(); it != zone()->content().end(); it++) { + const Entity *other = (*it); + if ((other->type() != Projectile) && (other != this)) { + // check distance + const float d = math::distance(location(), other->location()); + const float r = radius() + other->radius(); + + if ( d < r ) { + // nudge into randomize direction + math::Axis nudge_axis(axis()); + nudge_axis.change_direction(math::randomf(60.0f) - 30.0f); + nudge_axis.change_pitch(math::randomf(60.0f) - 30.0f); + set_location(location() + nudge_axis.forward() * (r - d + 0.001f)); + + // restart search + it = zone()->content().begin(); + } + } + } +} + void EntityDynamic::reset() { // no bullet physics on NonSolid entities diff --git a/src/core/entity.h b/src/core/entity.h index adeac0f..a1de121 100644 --- a/src/core/entity.h +++ b/src/core/entity.h @@ -674,6 +674,11 @@ public: virtual void reset(); /** + * @brief nudge the entity out of the radius of other entities in its current zune + */ + void nudge(); + + /** * @brief physics collision callback * This funcion is called by the physics engine if the entity collides with another entity. * It can be implemented by game child classes to provide collision effects and feedback. diff --git a/src/game/base/ship.cc b/src/game/base/ship.cc index 05edf9c..08838ad 100644 --- a/src/game/base/ship.cc +++ b/src/game/base/ship.cc @@ -381,7 +381,9 @@ void Ship::eject(core::Item *item, const long eject_amount, const bool eject_mes owner()->sound("game/eject"); } - // reset cargopod physics + // reset cargopod physics + pod->nudge(); + pod->reset(); assert(pod->body()); @@ -528,10 +530,13 @@ void Ship::launch() get_axis().assign(ship_dock->axis()); - if (ship_dock->type() == core::Entity::Globe) + if (ship_dock->type() == core::Entity::Globe) { get_location().assign(ship_dock->location() + (ship_dock->axis().forward() * (PLANET_SAFE_DISTANCE + this->radius() + ship_dock->radius()))); - else + } else { get_location().assign(ship_dock->location() + (ship_dock->axis().forward() * (this->radius() + ship_dock->radius()))); + } + + nudge(); ship_dock = 0; |