Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/presentation3/src/modules/pickup/PickupManager.cc @ 6965

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

Cleaned up in PickupInventory, to be able to improve it at a later stage.

File size: 7.6 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 *      ...
24 *   Co-authors:
25 *      ...
26 *
27*/
28
29/**
30    @file PickupManager.cc
31    @brief Implementation of the PickupManager class.
32*/
33
34#include "PickupManager.h"
35
36#include "core/CoreIncludes.h"
37#include "core/LuaState.h"
38#include "core/GUIManager.h"
39#include "core/ScopedSingletonManager.h"
40#include "core/Identifier.h"
41#include "interfaces/PickupCarrier.h"
42#include "infos/PlayerInfo.h"
43#include "worldentities/pawns/Pawn.h"
44#include "PickupRepresentation.h"
45
46#include "ToluaBindPickup.h"
47
48namespace orxonox
49{
50    // Register tolua_open function when loading the library
51    DeclareToluaInterface(Pickup);
52   
53    ManageScopedSingleton(PickupManager, ScopeID::Graphics, false);
54   
55    /*static*/ const std::string PickupManager::guiName_s = "PickupInventory";
56   
57    /**
58    @brief
59        Constructor. Registers the PickupManager and creates the default PickupRepresentation.
60    */
61    PickupManager::PickupManager() : defaultRepresentation_(NULL)
62    {
63        RegisterRootObject(PickupManager);
64       
65        this->defaultRepresentation_ = new PickupRepresentation();
66        this->pickupsIndex_ = 0;
67       
68        COUT(3) << "PickupManager created." << std::endl;
69    }
70   
71    /**
72    @brief
73        Destructor.
74        Destroys the default PickupRepresentation.
75    */
76    PickupManager::~PickupManager()
77    {
78        if(this->defaultRepresentation_ != NULL)
79            this->defaultRepresentation_->destroy();
80       
81        this->representations_.clear();
82       
83        COUT(3) << "PickupManager destroyed." << std::endl;
84    }
85   
86    /**
87    @brief
88        Registers a PickupRepresentation together with the PickupIdentifier of the Pickupable the PickupRepresentation represents.
89        For every type of Pickupable (uniquely idnetified by a PickupIdentifier) there can be one (and just one) PickupRepresentation registered.
90    @param identifier
91        The PickupIdentifier identifying the Pickupable.
92    @param representation
93        A pointer to the PickupRepresentation.
94    @return
95        Returns true if successful and false if not.
96    */
97    bool PickupManager::registerRepresentation(const PickupIdentifier* identifier, PickupRepresentation* representation)
98    {       
99        if(identifier == NULL || representation == NULL || this->representations_.find(identifier) != this->representations_.end()) //!< If the Pickupable already has a Representation registered.
100            return false;
101       
102        this->representations_[identifier] = representation;
103       
104        COUT(4) << "PickupRepresentation " << representation << " registered with the PickupManager." << std::endl;
105        return true;
106    }
107   
108    /**
109    @brief
110        Unegisters a PickupRepresentation together with the PickupIdentifier of the Pickupable the PickupRepresentation represents.
111    @param identifier
112        The PickupIdentifier identifying the Pickupable.
113    @param representation
114        A pointer to the PickupRepresentation.
115    @return
116        Returns true if successful and false if not.
117    */
118    bool PickupManager::unregisterRepresentation(const PickupIdentifier* identifier, PickupRepresentation* representation)
119    {       
120        if(identifier == NULL || representation == NULL)
121            return false;
122       
123        std::map<const PickupIdentifier*, PickupRepresentation*, PickupIdentifierCompare>::iterator it = this->representations_.find(identifier);
124        if(it == this->representations_.end()) //!< If the Pickupable is not registered in the first place.
125            return false;
126       
127        this->representations_.erase(it);
128       
129        COUT(4) << "PickupRepresentation " << representation << " unregistered with the PickupManager." << std::endl;
130        return true;
131    }
132   
133    /**
134    @brief
135        Get the PickupRepresentation representing the Pickupable with the input PickupIdentifier.
136    @param identifier
137        The PickupIdentifier.
138    @return
139        Returns a pointer to the PickupRepresentation.
140    */
141    PickupRepresentation* PickupManager::getRepresentation(const PickupIdentifier* identifier)
142    {
143        std::map<const PickupIdentifier*, PickupRepresentation*, PickupIdentifierCompare>::iterator it = this->representations_.find(identifier);
144        if(it == this->representations_.end())
145        {
146            COUT(4) << "PickupManager::getRepresentation() returned default representation." << std::endl;
147            return this->defaultRepresentation_;
148        }
149       
150        return it->second;
151    }
152
153    int PickupManager::getNumPickups(void)
154    {
155        this->pickupsList_.clear();
156        this->pickupsIndex_ = 0;
157       
158        PlayerInfo* player = GUIManager::getInstance().getPlayer(PickupManager::guiName_s);
159        PickupCarrier* carrier = NULL;
160        if (player != NULL)
161            carrier =  dynamic_cast<PickupCarrier*>(player->getControllableEntity());
162        else
163            return 0;
164
165        std::vector<PickupCarrier*>* carriers = this->getAllCarriers(carrier);
166        for(std::vector<PickupCarrier*>::iterator it = carriers->begin(); it != carriers->end(); it++)
167        {
168            std::set<Pickupable*> pickups = (*it)->getPickups();
169            for(std::set<Pickupable*>::iterator pickup = pickups.begin(); pickup != pickups.end(); pickup++)
170            {
171                this->pickupsList_.insert(*pickup);
172            }
173        }
174        delete carriers;
175
176        this->pickupsIterator_ = this->pickupsList_.begin();
177        return this->pickupsList_.size();
178    }
179
180    std::vector<PickupCarrier*>* PickupManager::getAllCarriers(PickupCarrier* carrier)
181    {
182        //TODO: More efficiently.
183        std::vector<PickupCarrier*>* carriers = new std::vector<PickupCarrier*>();
184        carriers->insert(carriers->end(), carrier);
185        std::vector<PickupCarrier*>* children = carrier->getCarrierChildren();
186        for(std::vector<PickupCarrier*>::iterator it = children->begin(); it != children->end(); it++)
187        {
188            std::vector<PickupCarrier*>* childrensChildren = this->getAllCarriers(*it);
189            for(std::vector<PickupCarrier*>::iterator it2 = childrensChildren->begin(); it2 != childrensChildren->end(); it2++)
190            {
191                carriers->insert(carriers->end(), *it2);
192            }
193            delete childrensChildren;
194        }
195        delete children;
196        return carriers;
197    }
198
199    void PickupManager::dropPickup(orxonox::Pickupable* pickup)
200    {
201        if(!pickup->isPickedUp())
202            return;
203       
204        PickupCarrier* carrier = pickup->getCarrier();
205        if(pickup != NULL && carrier != NULL)
206            carrier->drop(pickup);
207    }
208
209    void PickupManager::usePickup(orxonox::Pickupable* pickup, bool use)
210    {
211        if(!pickup->isPickedUp())
212            return;
213
214        PickupCarrier* carrier = pickup->getCarrier();
215        if(pickup != NULL && carrier != NULL)
216            pickup->setUsed(use);
217    }
218   
219}
Note: See TracBrowser for help on using the repository browser.