Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/modules/weapons/IceGunFreezer.cc @ 10796

Last change on this file since 10796 was 10629, checked in by fvultier, 9 years ago

Merged towerdefenseFabien branch back to trunk. The towerdefense Minigame is now a plugin.

File size: 3.4 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*     Fabien Vultier
24*   Co-authors:
25*      ...
26*
27*/
28
29/**
30    @file IceGunFreezer.h
31    @brief Implementation of the IceGunFreezer class.
32*/
33
34#include "core/CoreIncludes.h"
35#include "core/command/Executor.h"
36
37#include "IceGunFreezer.h"
38
39namespace orxonox
40{
41    RegisterClass(IceGunFreezer);
42
43    /**
44    @brief
45        Constructor.
46    */
47    IceGunFreezer::IceGunFreezer(Context* context) : StaticEntity(context)
48    {
49        RegisterObject(IceGunFreezer);
50
51        model = new Model(this->getContext());
52        model->setMeshSource("IceStar.mesh");
53        model->setScale(4.0);
54        this->attach(model);
55        model->setPosition(Vector3(0,0,0));
56    }
57
58    IceGunFreezer::~IceGunFreezer()
59    {
60
61    }
62
63    /**
64    @brief
65        The controlling happens here. This method defines what the controller has to do each tick.
66    @param dt
67        The duration of the tick.
68    */
69    void IceGunFreezer::tick(float dt)
70    {
71        SUPER(IceGunFreezer, tick, dt);
72
73
74    }
75
76    /**
77    @brief
78        Sets the freeze time variable to the passed value.
79    */
80    void IceGunFreezer::setFreezeTime(float freezeTime)
81    {
82        freezeTime_ = freezeTime;
83    }
84
85    /**
86    @brief
87        Sets the freeze factor variable to the passed value.
88    */
89    void IceGunFreezer::setFreezeFactor(float freezeFactor)
90    {
91        freezeFactor_ = freezeFactor;
92    }   
93
94    /**
95    @brief
96        Try to slow down the WorldEntity where this is attached to. It is only possible to slow down a SpaceShip.
97    */
98    void IceGunFreezer::startFreezing()
99    {
100        WorldEntity* parent = this->getParent();
101
102        // Check if the freezer is attached to a parent and check if the parent is a SpaceShip
103        if (parent != NULL && parent->isA(Class(SpaceShip)))
104        {
105            freezedSpaceShip_ = orxonox_cast<SpaceShip*>(parent);
106            //Slow down the SpaceShip
107            freezedSpaceShip_->addSpeedFactor(freezeFactor_);
108        }
109
110        // Start timer even if the victim is not a SpaceShip to avoid that the IceGunFreezer gets never destroyed if it collided against a Pawn
111        this->freezeTimer_.setTimer(this->freezeTime_, false, createExecutor(createFunctor(&IceGunFreezer::stopFreezing, this)));
112    }
113
114    /**
115    @brief
116        This method is called by the timer. It gives back the original engine strength to the hit SpaceShip.
117    */
118    void IceGunFreezer::stopFreezing()
119    {
120        if (freezedSpaceShip_ != NULL && freezeFactor_ != 0.0)
121        {
122            freezedSpaceShip_->addSpeedFactor(1/freezeFactor_);
123        }
124
125        this->destroy();
126    }   
127}
Note: See TracBrowser for help on using the repository browser.