Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/modules/pickup/items/MetaPickup.cc @ 7533

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

Documenting in pickups module.
Cleaning up in PickupManager.
Removed some obsolete functions in HumanController and ControllableEntity, which were remenants of the old pickups module.
Fixed a bug.

  • Property svn:eol-style set to native
File size: 7.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 *      Damian 'Mozork' Frick
24 *   Co-authors:
25 *      ...
26 *
27*/
28
29/**
30    @file MetaPickup.cc
31    @brief Implementation of the MetaPickup class.
32*/
33
34#include "core/CoreIncludes.h"
35#include "core/XMLPort.h"
36#include "worldentities/pawns/Pawn.h"
37#include "interfaces/PickupCarrier.h"
38#include "pickup/PickupIdentifier.h"
39
40#include "MetaPickup.h"
41
42namespace orxonox {
43
44    CreateFactory(MetaPickup);
45
46    //! Setting the static variables to their values.
47    /*static*/ const std::string MetaPickup::metaTypeNone_s = "none";
48    /*static*/ const std::string MetaPickup::metaTypeUse_s = "use";
49    /*static*/ const std::string MetaPickup::metaTypeDrop_s = "drop";
50    /*static*/ const std::string MetaPickup::metaTypeDestroy_s = "destroy";
51    /*static*/ const std::string MetaPickup::metaTypeDestroyCarrier_s = "destroyCarrier";
52
53    /**
54    @brief
55        Constructor. Registers and initializes the object.
56    */
57    MetaPickup::MetaPickup(BaseObject* creator) : Pickup(creator)
58    {
59        RegisterObject(MetaPickup);
60
61        this->initialize();
62    }
63
64    /**
65    @brief
66        Destructor.
67    */
68    MetaPickup::~MetaPickup()
69    {
70
71    }
72
73    /**
74    @brief
75        Initializes the object.
76    */
77    void MetaPickup::initialize(void)
78    {
79        this->addTarget(ClassIdentifier<PickupCarrier>::getIdentifier());
80
81        this->setActivationTypeDirect(pickupActivationType::immediate);
82        this->setDurationTypeDirect(pickupDurationType::once);
83        this->metaType_ = pickupMetaType::none;
84    }
85
86    /**
87    @brief
88        Helper method to initialize the PickupIdentifier.
89    */
90    void MetaPickup::initializeIdentifier(void)
91    {
92        std::string val = this->getMetaType();
93        std::string type = "metaType";
94        this->pickupIdentifier_->addParameter(type, val);
95    }
96
97    /**
98    @brief
99        Method for creating a MetaPickup object through XML.
100    */
101    void MetaPickup::XMLPort(Element& xmlelement, orxonox::XMLPort::Mode mode)
102    {
103        SUPER(MetaPickup, XMLPort, xmlelement, mode);
104
105        XMLPortParam(MetaPickup, "metaType", setMetaType, getMetaType, xmlelement, mode);
106
107        this->initializeIdentifier();
108    }
109
110    /**
111    @brief
112        Is called when the pickup has transited from used to unused or the other way around.
113        Any Class overwriting this method must call its SUPER function by adding SUPER(Classname, changedUsed); to their changdeUsed method.
114    */
115    void MetaPickup::changedUsed(void)
116    {
117        SUPER(MetaPickup, changedUsed);
118
119        //! If the MetaPickup transited to used.
120        if(this->isUsed())
121        {
122            PickupCarrier* carrier = this->getCarrier();
123            if(this->getMetaTypeDirect() != pickupMetaType::none && carrier != NULL)
124            {
125                if(this->getMetaTypeDirect() == pickupMetaType::destroyCarrier)
126                {
127                    this->Pickupable::destroy(); //TODO: Needed?
128                    Pawn* pawn = orxonox_cast<Pawn*>(carrier);
129                    pawn->kill();
130                    return;
131                }
132                std::set<Pickupable*> pickups = carrier->getPickups();
133                //! Set all Pickupables carried by the PickupCarrier either to used or drop them, depending on the meta type.
134                for(std::set<Pickupable*>::iterator it = pickups.begin(); it != pickups.end(); it++)
135                {
136                    Pickup* pickup = dynamic_cast<Pickup*>(*it);
137                    if(this->getMetaTypeDirect() == pickupMetaType::use)
138                    {
139                        if(pickup != NULL && pickup != this && pickup->isOnUse() && !pickup->isUsed())
140                        {
141                            pickup->setUsed(true);
142                        }
143                    }
144                    if(this->getMetaTypeDirect() == pickupMetaType::drop)
145                    {
146                        if(pickup != NULL && pickup != this)
147                        {
148                            pickup->drop();
149                        }
150                    }
151                    if(this->getMetaTypeDirect() == pickupMetaType::destroy)
152                    {
153                        if(pickup != NULL && pickup != this)
154                        {
155                            pickup->Pickupable::destroy();
156                        }
157                    }
158                }
159            }
160            this->Pickupable::destroy();
161        }
162    }
163
164    /**
165    @brief
166        Creates a duplicate of the input OrxonoxClass.
167    @param item
168        A pointer to the Orxonox class.
169    */
170    void MetaPickup::clone(OrxonoxClass*& item)
171    {
172        if(item == NULL)
173            item = new MetaPickup(this);
174
175        SUPER(MetaPickup, clone, item);
176
177        MetaPickup* pickup = dynamic_cast<MetaPickup*>(item);
178        pickup->setMetaTypeDirect(this->getMetaTypeDirect());
179
180        pickup->initializeIdentifier();
181    }
182
183    /**
184    @brief
185        Get the meta type of this MetaPickup.
186    @return
187        Returns a string with the meta type of the MetaPickup.
188    */
189    const std::string& MetaPickup::getMetaType(void)
190    {
191        switch(this->getMetaTypeDirect())
192        {
193            case pickupMetaType::none:
194                return MetaPickup::metaTypeNone_s;
195            case pickupMetaType::use:
196                return MetaPickup::metaTypeUse_s;
197            case pickupMetaType::drop:
198                return MetaPickup::metaTypeDrop_s;
199            case pickupMetaType::destroy:
200                return MetaPickup::metaTypeDestroy_s;
201            case pickupMetaType::destroyCarrier:
202                return MetaPickup::metaTypeDestroyCarrier_s;
203            default:
204                return BLANKSTRING;
205        }
206    }
207
208    /**
209    @brief
210        Set the meta type of this MetaPickup.
211    @param type
212        A string with the type to be set.
213    */
214    void MetaPickup::setMetaType(const std::string& type)
215    {
216        if(type == MetaPickup::metaTypeNone_s)
217        {
218            this->setMetaTypeDirect(pickupMetaType::none);
219        }
220        else if(type == MetaPickup::metaTypeUse_s)
221        {
222            this->setMetaTypeDirect(pickupMetaType::use);
223        }
224        else if(type == MetaPickup::metaTypeDrop_s)
225        {
226            this->setMetaTypeDirect(pickupMetaType::drop);
227        }
228        else if(type == MetaPickup::metaTypeDestroy_s)
229        {
230            this->setMetaTypeDirect(pickupMetaType::destroy);
231        }
232        else if(type == MetaPickup::metaTypeDestroyCarrier_s)
233        {
234            this->setMetaTypeDirect(pickupMetaType::destroyCarrier);
235        }
236        else
237            COUT(2) << "Invalid metaType '" << type << "' in MetaPickup." << std::endl;
238    }
239
240}
Note: See TracBrowser for help on using the repository browser.