Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/gamecontent/src/modules/weapons/projectiles/Rocket.cc @ 8923

Last change on this file since 8923 was 8923, checked in by jo, 13 years ago

Tutorial level enhancements (quest work, better texts are still needed), reverted old rocket hack, reworked configurable botlevel for the ai.

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