Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/modularships/src/modules/weapons/projectiles/Rocket.cc @ 10011

Last change on this file since 10011 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: 8.8 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 *      Oliver Scheuss
24 *   Co-authors:
25 *      simonmie
26 *
27 */
28
29/**
30    @file Rocket.h
31    @brief Implementation of the Rocket class.
32*/
33
34#include "Rocket.h"
35
36#include <BulletDynamics/Dynamics/btRigidBody.h>
37
38#include "core/CoreIncludes.h"
39#include "core/XMLPort.h"
40
41#include "Scene.h"
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 "sound/WorldSound.h"
48#include "worldentities/CameraPosition.h"
49#include "worldentities/pawns/Pawn.h"
50
51namespace orxonox
52{
53    RegisterClass(Rocket);
54
55    /**
56    @brief
57        Constructor. Registers the object and initializes some default values.
58    */
59    Rocket::Rocket(Context* context)
60        : ControllableEntity(context)
61        , BasicProjectile()
62        , RadarViewable(this, static_cast<WorldEntity*>(this))
63    {
64        RegisterObject(Rocket);// Register the Rocket class to the core
65
66        this->localAngularVelocity_ = 0;
67        this->lifetime_ = 100.0f;
68
69        if (GameMode::isMaster())
70        {
71            this->setCollisionType(WorldEntity::Kinematic);
72            this->setVelocity(0,0,-100);
73
74            // Create rocket model
75            Model* model = new Model(this->getContext());
76            model->setMeshSource("rocket.mesh");
77            model->scale(0.7f);
78            this->attach(model);
79
80            // Add effects.
81            ParticleEmitter* fire = new ParticleEmitter(this->getContext());
82            this->attach(fire);
83            fire->setOrientation(this->getOrientation());
84            fire->setSource("Orxonox/rocketfire");
85
86            this->enableCollisionCallback();
87            this->setCollisionResponse(false);
88            this->setCollisionType(Kinematic);
89
90            // Add collision shape
91            ConeCollisionShape* collisionShape = new ConeCollisionShape(this->getContext());
92            collisionShape->setRadius(3);
93            collisionShape->setHeight(500);
94            this->attachCollisionShape(collisionShape);
95
96            this->destroyTimer_.setTimer(this->lifetime_, false, createExecutor(createFunctor(&BasicProjectile::destroyObject, this)));
97
98            // Add sound
99            this->defSndWpnEngine_ = new WorldSound(this->getContext());
100            this->defSndWpnEngine_->setLooping(true);
101            this->defSndWpnEngine_->setSource("sounds/Rocket_engine.ogg");
102            this->defSndWpnEngine_->setVolume(1.0f);
103            this->attach(defSndWpnEngine_);
104
105            this->defSndWpnLaunch_ = new WorldSound(this->getContext());
106            this->defSndWpnLaunch_->setLooping(false);
107            this->defSndWpnLaunch_->setSource("sounds/Rocket_launch.ogg");
108            this->defSndWpnLaunch_->setVolume(1.0f);
109            this->attach(defSndWpnLaunch_);
110        }
111        else
112        {
113            this->defSndWpnEngine_ = 0;
114            this->defSndWpnLaunch_ = 0;
115        }
116
117        // Add camera
118        CameraPosition* camPosition = new CameraPosition(this->getContext());
119        camPosition->setPosition(0,4,15);
120        camPosition->setAllowMouseLook(true);
121        this->addCameraPosition(camPosition);
122
123        this->setRadarObjectColour(ColourValue(1.0, 0.5, 0.0)); // orange
124        this->setRadarObjectShape(RadarViewable::Triangle);
125        this->setRadarObjectScale(0.5f);
126    }
127
128    /**
129    @brief
130        Destructor. Destroys controller, if present and kills sounds, if playing.
131    */
132    Rocket::~Rocket()
133    {
134        if(this->isInitialized())
135        {
136            if (GameMode::isMaster())
137            {
138                this->destructionEffect();
139
140                if (this->getPlayer() && this->getController())
141                    this->player_->stopTemporaryControl();
142            }
143
144            if ( this->defSndWpnEngine_ )
145                this->defSndWpnEngine_->destroy();
146
147            if ( this->defSndWpnLaunch_ )
148                this->defSndWpnLaunch_->destroy();
149        }
150    }
151
152    /**
153    @brief
154        Sets the entity that fired the Rocket.
155    @param shooter
156        A pointer to the Pawn that fired the Rocket.
157    */
158    void Rocket::setShooter(Pawn* shooter)
159    {
160        this->BasicProjectile::setShooter(shooter);
161       
162        this->player_ = this->getShooter()->getPlayer();
163        if(this->player_)
164            this->player_->startTemporaryControl(this);
165
166        if( GameMode::isMaster() )
167        {
168            this->defSndWpnEngine_->play();
169            this->defSndWpnLaunch_->play();
170        }
171    }
172
173    /**
174    @brief
175        Defines which actions the Rocket has to take in each tick.
176    @param dt
177        The length of the tick.
178    */
179    void Rocket::tick(float dt)
180    {
181        SUPER(Rocket, tick, dt);
182
183        if( this->hasLocalController() )
184        {
185            this->setAngularVelocity(this->getOrientation() * this->localAngularVelocity_);
186            this->setVelocity( this->getOrientation()*WorldEntity::FRONT*this->getVelocity().length() );
187            this->localAngularVelocity_ = 0;
188        }
189
190       this->destroyCheck();
191    }
192
193    bool Rocket::collidesAgainst(WorldEntity* otherObject, const btCollisionShape* cs, btManifoldPoint& contactPoint)
194    {
195        return this->processCollision(otherObject, contactPoint, cs);
196    }
197
198    /**
199    @brief
200        Destroys the Rocket and stops the sound,
201    */
202    void Rocket::destroyObject(void)
203    {
204        if (GameMode::isMaster() && this->defSndWpnEngine_->isPlaying())
205            this->defSndWpnEngine_->stop();
206
207        this->BasicProjectile::destroyObject();
208    }
209
210    /**
211    @brief
212        Destroys the Rocket upon pressing "fire".
213    */
214    void Rocket::fired(unsigned int firemode)
215    {
216        this->destroyObject();
217    }
218
219    /**
220    @brief
221        The effects that are displayed, when the Rocket is destroyed.
222    */
223    void Rocket::destructionEffect()
224    {
225        ParticleSpawner *effect1, *effect2;
226        if(this->getShooter())
227        {
228            effect1 = new ParticleSpawner(this->getShooter()->getContext());
229            effect2 = new ParticleSpawner(this->getShooter()->getContext());
230        }
231        else
232        {
233            effect1 = new ParticleSpawner(this->getContext());
234            effect2 = new ParticleSpawner(this->getContext());
235        }
236
237        effect1->setPosition(this->getPosition());
238        effect1->setOrientation(this->getOrientation());
239        effect1->setDestroyAfterLife(true);
240        effect1->setSource("Orxonox/explosion4");
241        effect1->setLifetime(2.0f);
242
243        effect2->setPosition(this->getPosition());
244        effect2->setOrientation(this->getOrientation());
245        effect2->setDestroyAfterLife(true);
246        effect2->setSource("Orxonox/smoke4");
247        effect2->setLifetime(3.0f);
248    }
249
250    /**
251    @brief
252        Rotates the Rocket around the y-axis by the amount specified by the first component of the input 2-dim vector.
253    @param value
254        The vector determining the amount of the angular movement.
255    */
256    void Rocket::rotateYaw(const Vector2& value)
257    {
258        ControllableEntity::rotateYaw(value);
259
260        if( !this->isInMouseLook() )
261            this->localAngularVelocity_.y += value.x;
262    }
263
264    /**
265    @brief
266        Rotates the Rocket around the x-axis by the amount specified by the first component of the input 2-dim vector.
267    @param value
268        The vector determining the amount of the angular movement.
269    */
270    void Rocket::rotatePitch(const Vector2& value)
271    {
272        ControllableEntity::rotatePitch(value);
273
274        if( !this->isInMouseLook() )
275            this->localAngularVelocity_.x += value.x;
276    }
277
278    /**
279    @brief
280        Rotates the Rocket around the z-axis by the amount specified by the first component of the input 2-dim vector.
281    @param value
282        The vector determining the amount of the angular movement.
283    */
284    void Rocket::rotateRoll(const Vector2& value)
285    {
286        ControllableEntity::rotateRoll(value);
287
288        if( !this->isInMouseLook() )
289            this->localAngularVelocity_.z += value.x;
290    }
291
292}
Note: See TracBrowser for help on using the repository browser.