Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/orxonox/interfaces/Pickupable.cc @ 6725

Last change on this file since 6725 was 6725, checked in by dafrick, 14 years ago

Resolved bug, that caused orxonox to crash whenever a level with pickups was loaded twice in one session.
Also some more debug/info output, commenting and cleanup.

File size: 8.0 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 *      Damian 'Mozork' Frick
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30    @file Pickupable.cc
31    @brief Implementation of the Pickupable class.
32*/
33
34#include "Pickupable.h"
35
36#include "core/Identifier.h"
37#include "core/CoreIncludes.h"
38#include "pickup/PickupIdentifier.h"
39#include "PickupCarrier.h"
40
41namespace orxonox
42{
43   
44    /**
45    @brief
46        Constructor. Registers the objects and initializes its member variables.
47    */
48    Pickupable::Pickupable() : pickupIdentifier_(NULL), used_(false), pickedUp_(false)
49    {       
50        RegisterRootObject(Pickupable);
51       
52        this->carrier_ = NULL;
53       
54        this->pickupIdentifier_ = new PickupIdentifier(this);
55    }
56   
57    /**
58    @brief
59        Destructor.
60    */
61    Pickupable::~Pickupable()
62    {
63        if(this->isUsed())
64            this->setUsed(false);
65       
66        if(this->isPickedUp() && this->getCarrier() != NULL)
67        {
68            this->getCarrier()->drop(this, false);
69            this->setCarrier(NULL);
70        }
71       
72        if(this->pickupIdentifier_ != NULL)
73            this->pickupIdentifier_->destroy();
74    }
75   
76    /**
77    @brief
78        Sets the Pickupable to used or unused, depending on the input.
79    @param used
80        If used is true the Pickupable is set to used, it is set to unused, otherwise.
81    @return
82        Returns true if the used state was changed, false if not.
83    */
84    bool Pickupable::setUsed(bool used)
85    {
86        if(this->used_ == used)
87            return false;
88       
89        COUT(4) << "Pickupable (&" << this << ") set to used " << used << "." << std::endl;
90       
91        this->used_ = used;
92        this->changedUsed();
93        return true;
94    }
95   
96    /**
97    @brief
98        Get whether the given PickupCarrier is a target of this Pickupable.
99    @param carrier
100        The PickupCarrier of which it has to be determinde whether it is a target of this Pickupable.
101    @return
102        Returns true if the given PickupCarrier is a target.
103    */
104    bool Pickupable::isTarget(const PickupCarrier* carrier) const
105    {
106        return this->isTarget(carrier->getIdentifier());
107    }
108   
109    /**
110    @brief
111        Get whether a given class, represented by the input Identifier, is a target of this Pickupable.
112    @param target
113        The Identifier of which it has to be determinde whether it is a target of this Pickupable.
114    @return
115        Returns true if the given Identifier is a target.
116    */
117    bool Pickupable::isTarget(Identifier* target) const
118    {
119        //! Iterate through all targets of this Pickupable.
120        for(std::list<Identifier*>::const_iterator it = this->targets_.begin(); it != this->targets_.end(); it++)
121        {
122            if(target->isA(*it))
123                return true;
124        }
125        return false;
126    }
127       
128    /**
129    @brief
130        Add a PickupCarrier as target of this Pickupable.
131    @param target
132        The PickupCarrier to be added.
133    @return
134        Returns true if the target was added, false if not.
135    */
136    bool Pickupable::addTarget(PickupCarrier* target)
137    {
138        return this->addTarget(target->getIdentifier());
139    }
140   
141    /**
142    @brief
143        Add a class, representetd by the input Identifier, as target of this Pickupable.
144    @param target
145        The Identifier to be added.
146    @return
147        Returns true if the target was added, false if not.
148    */
149    bool Pickupable::addTarget(Identifier* target)
150    {
151        if(this->isTarget(target)) //!< If the input target is already present in the list of targets.
152            return false;
153       
154        COUT(4) << "Target " << target->getName() << " added to Pickupable (&" << this << ")." << std::endl;
155        this->targets_.push_back(target);
156        return true;
157    }
158   
159    /**
160    @brief 
161        Sets the Pickupable to picked up.
162        This method will be called by the PickupCarrier picking the Pickupable up.
163    @param carrier
164        The PickupCarrier that picked the Pickupable up.
165    @return
166        Returns false if, for some reason, the pickup could not be picked up, e.g. it was picked up already.
167    */
168    bool Pickupable::pickedUp(PickupCarrier* carrier)
169    {
170        if(this->isPickedUp()) //!< If the Pickupable is already picked up.
171            return false;
172       
173        COUT(4) << "Pickupable (&" << this << ") got picked up by a PickupCarrier (&" << carrier << ")." << std::endl;
174        this->setCarrier(carrier);
175        this->setPickedUp(true);
176        return true;
177    }
178   
179    /**
180    @brief
181        Helper method to set the Pickupable to either picked up or not picked up.
182    @param pickedUp
183        The value this->pickedUp_ should be set to.
184    @return
185        Returns true if the pickedUp status was changed, false if not.
186    */
187    bool Pickupable::setPickedUp(bool pickedUp)
188    {
189        if(this->pickedUp_ == pickedUp)
190            return false;
191       
192        COUT(4) << "Pickupable (&" << this << ") set to pickedUp " << pickedUp << "." << std::endl;
193       
194        this->pickedUp_ = pickedUp;
195        this->changedPickedUp();
196        return true;
197    }
198       
199    /**
200    @brief
201        Sets the carrier of the Pickupable.
202    @param carrier
203        Sets the input PickupCarrier as the carrier of the pickup.
204    */
205    inline bool Pickupable::setCarrier(PickupCarrier* carrier)
206    {
207        if(this->carrier_ == carrier)
208            return false;
209       
210        COUT(4) << "Pickupable (&" << this << ") changed Carrier (& " << carrier << ")." << std::endl;
211       
212        this->carrier_ = carrier;
213        this->changedCarrier();
214        return true;
215    }
216   
217    /**
218    @brief
219        Sets the Pickupable to not picked up or dropped.
220        This method will be called by the PickupCarrier dropping the Pickupable.
221    @return
222        Returns false if the pickup could not be dropped.
223    */
224    bool Pickupable::dropped(void)
225    {
226        if(!this->isPickedUp()) //!< If the Pickupable is not picked up.
227            return false;
228       
229        COUT(4) << "Pickupable (&" << this << ") got dropped up by a PickupCarrier (&" << this->getCarrier() << ")." << std::endl;
230        this->setUsed(false);
231        this->setPickedUp(false);
232       
233        bool created = this->createSpawner();
234       
235        this->setCarrier(NULL);
236       
237        if(!created)
238        {
239            this->destroy();
240        }
241       
242        return true;
243    }
244   
245    /**
246    @brief
247        Creates a duplicate of the Pickupable.
248    @return
249        Returns the clone of this pickup as a pointer to a Pickupable.
250    */
251    Pickupable* Pickupable::clone(void)
252    {
253        OrxonoxClass* item = NULL;
254        this->clone(item);
255       
256        Pickupable* pickup = dynamic_cast<Pickupable*>(item);
257       
258        COUT(4) << "Pickupable (&" << this << ") cloned. Clone is new Pickupable (&" << pickup << ")." << std::endl;
259        return pickup;
260    }
261   
262    /**
263    @brief
264        Creates a duplicate of the input OrxonoxClass.
265        This method needs to be implemented by any Class inheriting from Pickupable.
266    @param item
267        A reference to a pointer to the OrxonoxClass that is to be duplicated.
268    */
269    void Pickupable::clone(OrxonoxClass*& item)
270    {
271        SUPER(Pickupable, clone, item);
272    }
273   
274}
Note: See TracBrowser for help on using the repository browser.