Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/modularships/src/modules/weapons/projectiles/SimpleRocket.cc @ 10054

Last change on this file since 10054 was 10011, checked in by noep, 11 years ago

Cleaned up the process passing the collisionshape which was hit to the Pawn. Started implementation of ModularSpaceShip and ShipPart.

  • Property svn:eol-style set to native
File size: 6.5 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Gabriel Nadler
24 *   Co-authors:
25 *      simonmie
26 *
27 */
28
29/**
30    @file SimpleRocket.h
31    @brief Implementation of the SimpleRocket class.
32*/
33
34
35#include "SimpleRocket.h"
36
37#include <BulletDynamics/Dynamics/btRigidBody.h>
38
39#include "core/CoreIncludes.h"
40#include "core/XMLPort.h"
41
42#include "controllers/Controller.h"
43#include "graphics/Model.h"
44#include "graphics/ParticleSpawner.h"
45#include "infos/PlayerInfo.h"
46#include "objects/collisionshapes/ConeCollisionShape.h"
47#include "worldentities/pawns/Pawn.h"
48#include "sound/WorldSound.h"
49
50#include "weapons/RocketController.h"
51
52namespace orxonox
53{
54    RegisterClass(SimpleRocket);
55
56    const float SimpleRocket::FUEL_PERCENTAGE = 0.8f;
57
58    SimpleRocket::SimpleRocket(Context* context)
59        : ControllableEntity(context)
60        , BasicProjectile()
61        , RadarViewable(this, static_cast<WorldEntity*>(this))
62    {
63        RegisterObject(SimpleRocket);// Register the SimpleRocket class to the core
64
65        this->localAngularVelocity_ = 0;
66        this->lifetime_ = 10.f;
67
68        this->setMass(15.0);
69
70        if (GameMode::isMaster())
71        {
72            this->setCollisionType(WorldEntity::Kinematic);
73            this->fuel_ = true;
74
75            // Create rocket model.
76            Model* model = new Model(this->getContext());
77            model->setMeshSource("rocket.mesh");
78            model->scale(0.7f);
79            this->attach(model);
80
81            // Add effects.
82            this->fire_ = new ParticleEmitter(this->getContext());
83            this->attach(this->fire_);
84
85            this->fire_->setOrientation(this->getOrientation());
86            this->fire_->setSource("Orxonox/simplerocketfire");
87            this->enableCollisionCallback();
88            this->setCollisionResponse(false);
89            this->setCollisionType(Kinematic);
90
91            // Add collision shape.
92            // TODO: fix the orientation and size of this collision shape to match the rocket
93            ConeCollisionShape* collisionShape = new ConeCollisionShape(this->getContext());
94            collisionShape->setOrientation(this->getOrientation());
95            collisionShape->setRadius(1.5f);
96            collisionShape->setHeight(5);
97            this->attachCollisionShape(collisionShape);
98
99            this->destroyTimer_.setTimer(this->lifetime_, false, createExecutor(createFunctor(&BasicProjectile::destroyObject, this)));
100        }
101
102        this->setRadarObjectColour(ColourValue(1.0, 1.0, 0.0)); // yellow
103        this->setRadarObjectShape(RadarViewable::Triangle);
104        this->setRadarObjectScale(0.5f);
105    }
106
107
108
109    /**
110    @brief
111        Updates state of rocket, disables fire if no fuel
112    @param dt
113        tick-length
114    */
115    void SimpleRocket::tick(float dt)
116    {
117        SUPER(SimpleRocket, tick, dt);
118
119        if (GameMode::isMaster())
120        {
121            this->setAngularVelocity(this->getOrientation() * this->localAngularVelocity_);
122            this->setVelocity( this->getOrientation()*WorldEntity::FRONT*this->getVelocity().length() );
123            this->localAngularVelocity_ = 0;
124
125            if (this->fuel_)
126            {
127                if (this->destroyTimer_.getRemainingTime() < this->FUEL_PERCENTAGE*this->lifetime_ )
128                    this->fuel_ = false;
129            } else
130                this->disableFire();
131        }
132
133        this->destroyCheck();
134    }
135
136    /**
137    @brief
138        Sets the Acceleration to 0 and detaches the fire.
139    */
140    void SimpleRocket::disableFire()
141    {
142        this->setAcceleration(0,0,0);
143        this->fire_->detachFromParent();
144    }
145
146    /**
147    @brief
148        Destructor. Destroys controller, if present and kills sounds, if playing.
149    */
150    SimpleRocket::~SimpleRocket()
151    {
152        if (this->isInitialized())
153        {
154            if( GameMode::isMaster() )
155            {
156                this->getController()->destroy();
157            }
158        }
159    }
160
161    /**
162    @brief
163        Set the entity that fired the SimpleRocket.
164    @param shooter
165        A pointer to the Pawn that fired the SimpleRocket.
166    */
167    void SimpleRocket::setShooter(Pawn* shooter)
168    {
169        BasicProjectile::setShooter(shooter);
170
171        this->player_ = this->getShooter()->getPlayer();
172    }
173
174    bool SimpleRocket::collidesAgainst(WorldEntity* otherObject, const btCollisionShape* cs, btManifoldPoint& contactPoint)
175    {
176        return this->processCollision(otherObject, contactPoint, cs);
177    }
178
179    /**
180    @brief
181        Rotates the SimpleRocket around the y-axis by the amount specified by the first component of the input 2-dim vector.
182    @param value
183        The vector determining the amount of the angular movement.
184    */
185    void SimpleRocket::rotateYaw(const Vector2& value)
186    {
187        ControllableEntity::rotateYaw(value);
188
189        if( !this->isInMouseLook() )
190            this->localAngularVelocity_.y += value.x;
191    }
192
193    /**
194    @brief
195        Rotates the SimpleRocket around the x-axis by the amount specified by the first component of the input 2-dim vector.
196    @param value
197        The vector determining the amount of the angular movement.
198    */
199    void SimpleRocket::rotatePitch(const Vector2& value)
200    {
201        ControllableEntity::rotatePitch(value);
202
203        if( !this->isInMouseLook() )
204            this->localAngularVelocity_.x += value.x;
205    }
206
207    /**
208    @brief
209        Rotates the SimpleRocket around the z-axis by the amount specified by the first component of the input 2-dim vector.
210    @param value
211        The vector determining the amount of the angular movement.
212    */
213    void SimpleRocket::rotateRoll(const Vector2& value)
214    {
215        ControllableEntity::rotateRoll(value);
216
217        if( !this->isInMouseLook() )
218            this->localAngularVelocity_.z += value.x;
219    }
220
221}
Note: See TracBrowser for help on using the repository browser.