Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/weaponFS15/src/modules/weapons/projectiles/GravityBomb.cc @ 10502

Last change on this file since 10502 was 10502, checked in by meggiman, 9 years ago

Bugfix: Game crashed if a pawn was directly hit by the bomb. Changed Radar Color to red.

File size: 3.1 KB
RevLine 
[10336]1/*
2 * GravityBomb.cc
3 *
4 *  Created on: Mar 26, 2015
[10455]5 *      Author: Manuel Eggimann
[10336]6 */
7#include "GravityBomb.h"
[10369]8#include "graphics/Model.h"
[10336]9
10
11namespace orxonox{
12        RegisterClass(GravityBomb);
13
[10502]14        const float GravityBomb::LIFETIME = 2.5;  ///< The gravity bomb lifetime in seconds.
[10435]15
[10336]16        GravityBomb::GravityBomb(Context* context):
[10341]17                                BasicProjectile(),
18                                MovableEntity(context),
19                                RadarViewable(this,static_cast<WorldEntity*>(this))
[10336]20                {
21                        RegisterObject(GravityBomb);
22
[10391]23                        this->setMass(10.0);
[10502]24                        this->hasCollided_ = false;
[10341]25                        if (GameMode::isMaster())
26                        {
[10369]27                                //Define CollisionType of the bomb
[10435]28                                this->timeToLife_= LIFETIME;
[10369]29                                this->setCollisionResponse(false);
[10391]30                                this->setCollisionType(WorldEntity::Dynamic);
[10341]31                                this->enableCollisionCallback();
[10336]32
[10341]33                                //Add Collision Shape
34                                SphereCollisionShape* collisionShape = new SphereCollisionShape(context);
[10369]35                                collisionShape->setRadius(1.0);
[10341]36                                this->attachCollisionShape(collisionShape);
37
38                                //Create Bomb Model
[10435]39                    Model* rocketModel = new Model(this->getContext());
40                    rocketModel->setMeshSource("GravityBombRocket.mesh"); //Demo Model from SimpleRocket
41                    rocketModel->scale(3.0f);
42                    this->attach(rocketModel);
[10455]43                                //Add second model because the bomb consists of the bomb and attached rockets (2 separate models)
[10435]44                    Model* bombModel =  new Model(this->getContext());
45                    bombModel->setMeshSource("GravityBomb.mesh"); //Demo Model from SimpleRocket
46                                bombModel->scale(3.0f);
47                                this->attach(bombModel);
48
[10455]49                                //Add particle effect to the flying rockets.
50                                ParticleEmitter* fire = new ParticleEmitter(this->getContext());
51                                fire->setOrientation(this->getOrientation());
52                                fire->setSource("Orxonox/simplerocketfire");
53                                this->attach(fire);
54
55                                //Add sound effect while the bomb is flying.
56                                WorldSound* bombSound = new WorldSound(context);
57                                bombSound->setSource("sounds/GravityBombFlight.ogg");
58                                bombSound->setLooping(true);
59                                bombSound->setVolume(1.0);
60                                this->attach(bombSound);
61                                bombSound->play();
[10341]62                        }
[10336]63                }
64
65        GravityBomb::~GravityBomb(){}
66
67        void GravityBomb::tick(float dt)
68        {
[10502]69                SUPER(GravityBomb, tick, dt);
70                timeToLife_ -= dt;
71                if (timeToLife_ < 0)
72                {
73                        //orxout(debug_output) << "bomb has stoped moving" <<endl;
74                        setVelocity(Vector3::ZERO); //Stop the bomb.
75                        detonate();
76                        this->destroy();
77                }
78                else 
79                {
80                        if (hasCollided_) detonate();
81                        destroyCheck(); //Bomb is going to be destroyed by destroyCheck(). As written in BasicProectile, this Method should be called by every Projectile.
82                }
[10336]83        }
84
85        bool GravityBomb::collidesAgainst(WorldEntity* otherObject, const btCollisionShape* cs, btManifoldPoint& contactPoint)
86        {
[10502]87                hasCollided_ = processCollision(otherObject, contactPoint, cs);
88                return hasCollided_;
[10336]89        }
[10341]90
91        void GravityBomb::detonate()
92        {
[10455]93                //Create the GravityBombField and destroy the Projectil.
[10341]94                GravityBombField* field = new GravityBombField(this->getContext());
[10435]95                field->setShooter(this->getShooter());
[10391]96                field->setPosition(getPosition());
[10455]97                //orxout(debug_output) << "detonating. Creating GravityBombField." <<endl;
98                //orxout(debug_output) << "Field is at Position: " << getPosition() << endl;
[10341]99        }
[10336]100}
101
102
Note: See TracBrowser for help on using the repository browser.