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>2012-11-14 16:04:30 +0000
committerStijn Buys <ingar@osirion.org>2012-11-14 16:04:30 +0000
commit31c6d4c5bb5ff17fa926d7d65f8b9a93918fbd3f (patch)
tree8c2a203b771ffc8c18dbbbc66f9fc9e4d5249dae /src/game/base/ship.cc
parent5a3ac6c9f437290e88fa2ac2f194f91d4cb8a2a8 (diff)
Added initial weapon projectiles.
Diffstat (limited to 'src/game/base/ship.cc')
-rw-r--r--src/game/base/ship.cc28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/game/base/ship.cc b/src/game/base/ship.cc
index 22725e0..8be6e6c 100644
--- a/src/game/base/ship.cc
+++ b/src/game/base/ship.cc
@@ -13,6 +13,7 @@
#include "core/entity.h"
#include "base/game.h"
#include "base/ship.h"
+#include "base/projectile.h"
#include "math/functions.h"
using math::degrees360f;
@@ -77,6 +78,13 @@ Ship::Ship(core::Player *owner, const ShipModel *shipmodel) : core::EntityContro
if (model()) {
add_slots();
slots()->load(model());
+
+ for (core::Slots::iterator it = slots()->begin(); it != slots()->end(); it++) {
+ // default fire rate: 1 projectile / second
+ (*it)->set_interval(1000);
+ (*it)->set_lifespan(5000);
+ (*it)->set_speed(5.0f);
+ }
}
// menus for docked players
@@ -756,6 +764,26 @@ void Ship::frame(const unsigned long elapsed)
*/
EntityControlable::frame(elapsed);
+
+ if (model() && slots() && has_controlflag(core::EntityControlable::ControlFlagFire)) {
+
+ const float modelscale = radius() / model()->radius();
+
+ for (core::Slots::iterator it = slots()->begin(); it != slots()->end(); it++) {
+ // create projectiles
+ if ((*it)->last_fired() + (*it)->interval() <= core::server()->timestamp()) {
+ (*it)->set_last_fired(core::server()->timestamp());
+ Projectile * projectile = new Projectile((*it)->lifespan());
+ projectile->set_zone(zone());
+ projectile->set_axis(axis() * (*it)->axis());
+ projectile->set_location(location() + (axis() * (*it)->location() * modelscale) + projectile->axis().forward() * projectile->radius());
+
+ projectile->reset();
+ projectile->body()->setDamping(0.0f, 0.0f);
+ projectile->body()->setLinearVelocity(math::to_btVector3(projectile->axis().forward() * (*it)->speed()));
+ }
+ }
+ }
}