Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/presentation2012merge/src/modules/pickup/items/InvisiblePickup.cc @ 9305

Last change on this file since 9305 was 9305, checked in by landauf, 12 years ago

simplified code a little by using MultiType instead of explicit conversion

  • Property svn:eol-style set to native
File size: 6.7 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 *      Benedict Simlinger
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30    @file InvisiblePickup.cc
31    @brief Implementation of the InvisiblePickup class.
32*/
33
34#include "InvisiblePickup.h"
35
36#include <sstream>
37//#include <OgreEntity.h>
38//#include <OgreAnimationState.h>
39#include "core/CoreIncludes.h"
40#include "core/XMLPort.h"
41
42#include "pickup/PickupIdentifier.h"
43#include "worldentities/pawns/Pawn.h"
44
45namespace orxonox
46{
47
48    CreateFactory(InvisiblePickup);
49
50    /**
51    @brief
52        Constructor. Registers the object and initializes the member variables.
53    */
54    InvisiblePickup::InvisiblePickup(BaseObject* creator) : Pickup(creator)
55    {
56        RegisterObject(InvisiblePickup);
57        this->initialize();
58    }
59
60    /**
61    @brief
62        Destructor.
63    */
64    InvisiblePickup::~InvisiblePickup()
65    {
66    }
67
68    /**
69    @brief
70    Initializes the member variables.
71    */
72    void InvisiblePickup::initialize(void)
73    {
74        this->duration_ = 0.0f;
75        // Defines who is allowed to pick up the pickup.
76        this->addTarget(ClassIdentifier<Pawn>::getIdentifier());
77    }
78
79    /**
80    @brief
81        Initializes the PickupIdentifier of this pickup.
82    */
83    void InvisiblePickup::initializeIdentifier(void)
84    {
85        this->pickupIdentifier_->addParameter("duration", this->getDuration());
86    }
87
88    /**
89    @brief
90        Method for creating a HealthPickup object through XML.
91    */
92    void InvisiblePickup::XMLPort(Element& xmlelement, orxonox::XMLPort::Mode mode)
93    {
94        SUPER(InvisiblePickup, XMLPort, xmlelement, mode);
95        XMLPortParam(InvisiblePickup, "duration", setDuration, getDuration, xmlelement, mode);
96
97        this->initializeIdentifier();
98    }
99
100    /**
101    @brief
102        Is called when the pickup has transited from used to unused or the other way around.
103    */
104    void InvisiblePickup::changedUsed(void)
105    {
106        SUPER(InvisiblePickup, changedUsed);
107
108        // If the pickup has transited to used.
109        if (this->isUsed())
110        {
111            // If its durationType is continuous, we set a Timer to be reminded, when the time has run out.
112            if(this->isContinuous())
113            {
114                if(!this->durationTimer_.isActive() && this->durationTimer_.getRemainingTime() > 0.0f)
115                {
116                    this->durationTimer_.unpauseTimer();
117                }
118                else
119                {
120                    this->durationTimer_.setTimer(this->getDuration(), false, createExecutor(createFunctor(&InvisiblePickup::pickupTimerCallback, this)));
121                }
122            }
123
124            this->setInvisible(true);
125
126        }
127        else
128        {
129            this->setInvisible(false);
130
131            // We destroy the pickup if either, the pickup has activationType immediate and durationType once or it has durationType continuous and the duration was exceeded.
132            if((!this->isContinuous() && this->isImmediate()) || (this->isContinuous() && !this->durationTimer_.isActive() && this->durationTimer_.getRemainingTime() == this->getDuration()))
133            {
134                this->Pickupable::destroy();
135            }
136            // We pause the Timer if the pickup is continuous and the duration is not yet exceeded,
137            else if(this->isContinuous() && this->durationTimer_.isActive())
138            {
139                this->durationTimer_.pauseTimer();
140            }
141        }
142    }
143
144    /**
145    @brief
146        Creates a duplicate of the input OrxonoxClass.
147    @param item
148        A pointer to the Orxonox class.
149    */
150    void InvisiblePickup::clone(OrxonoxClass*& item)
151    {
152        if(item == NULL)
153            item = new InvisiblePickup(this);
154
155        SUPER(InvisiblePickup, clone, item);
156
157        InvisiblePickup* pickup = orxonox_cast<InvisiblePickup*>(item);
158        pickup->setDuration(this->getDuration());
159        pickup->initializeIdentifier();
160    }
161
162    /**
163    @brief
164        Sets the invisibility.
165    @param invisibility
166        The invisibility.
167    */
168    bool InvisiblePickup::setInvisible(bool invisibility)
169    {
170        Pawn* pawn = this->carrierToPawnHelper();
171        if(pawn == NULL)
172            return false;
173
174        pawn->setVisible(!invisibility);
175        //TODO: Invisibility should imply radar invisibility as well, thus this should be solved in Pawn.
176        pawn->setRadarVisibility(!invisibility);
177
178// Test to change Material at runtime!
179
180//      Ogre::MaterialPtr mat = this->mesh_.getEntity()->getSubEntity(0)->getMaterial();
181//      mat->setDiffuse(0.4, 0.3, 0.1, 0.1);
182//      mat->setAmbient(0.3, 0.7, 0.8);
183//      mat->setSpecular(0.5, 0.5, 0.5, 0.1);
184//      Ogre::SceneBlendType sbt = Ogre::SBT_ADD;
185//
186//      mat->setSceneBlending(sbt);
187
188        return true;
189    }
190
191    /**
192    @brief
193        Helper to transform the PickupCarrier to a Pawn, and throw an error message if the conversion fails.
194    @return
195        A pointer to the Pawn, or NULL if the conversion failed.
196    */
197    Pawn* InvisiblePickup::carrierToPawnHelper(void)
198    {
199        PickupCarrier* carrier = this->getCarrier();
200        Pawn* pawn = orxonox_cast<Pawn*>(carrier);
201
202        if(pawn == NULL)
203        {
204            orxout(internal_error, context::pickups) << "Invalid PickupCarrier in InvisiblePickup." << endl;
205        }
206        return pawn;
207    }
208
209    /**
210    @brief
211        Sets the time the InvisibilityPickup will last.
212    @param duration
213        The duration in seconds.
214    */
215    void InvisiblePickup::setDuration(float duration)
216    {
217        if(duration >= 0.0f)
218        {
219            this->duration_ = duration;
220        }
221        else
222        {
223            orxout(internal_error, context::pickups) << "Invalid duration in InvisiblePickup." << endl;
224            this->duration_ = 0.0f;
225        }
226    }
227
228    /**
229    @brief
230        Helper method. Is called by the Timer as soon as it expires.
231    */
232    void InvisiblePickup::pickupTimerCallback(void)
233    {
234        this->setUsed(false);
235    }
236
237}
Note: See TracBrowser for help on using the repository browser.