Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

Loads of changes.
1) PickupInventory should now be working even for extreme cases.
2) Added support for inactive Spawnpoints in Gametype.
3) Made Pickupable rewardble. meaning from now on any Pickupable can be given as a reward for completing Quests.
4) Added some keybinds to KeybindMenu, such as PickupInventory, QuestGUI and Chat.

File size: 8.1 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 "util/Convert.h"
42#include "interfaces/PickupCarrier.h"
43#include "infos/PlayerInfo.h"
44#include "worldentities/pawns/Pawn.h"
45#include "PickupRepresentation.h"
46
47#include "ToluaBindPickup.h"
48
49namespace orxonox
50{
51    // Register tolua_open function when loading the library
52    DeclareToluaInterface(Pickup);
53   
54    ManageScopedSingleton(PickupManager, ScopeID::Graphics, false);
55   
56    /*static*/ const std::string PickupManager::guiName_s = "PickupInventory";
57   
58    /**
59    @brief
60        Constructor. Registers the PickupManager and creates the default PickupRepresentation.
61    */
62    PickupManager::PickupManager() : defaultRepresentation_(NULL)
63    {
64        RegisterRootObject(PickupManager);
65       
66        this->defaultRepresentation_ = new PickupRepresentation();
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       
157        PlayerInfo* player = GUIManager::getInstance().getPlayer(PickupManager::guiName_s);
158        PickupCarrier* carrier = NULL;
159        if (player != NULL)
160            carrier =  dynamic_cast<PickupCarrier*>(player->getControllableEntity());
161        else
162            return 0;
163
164        std::vector<PickupCarrier*>* carriers = this->getAllCarriers(carrier);
165        for(std::vector<PickupCarrier*>::iterator it = carriers->begin(); it != carriers->end(); it++)
166        {
167            std::set<Pickupable*> pickups = (*it)->getPickups();
168            for(std::set<Pickupable*>::iterator pickup = pickups.begin(); pickup != pickups.end(); pickup++)
169            {
170                this->pickupsList_.insert(std::pair<Pickupable*, WeakPtr<Pickupable> >(*pickup, WeakPtr<Pickupable>(*pickup)));
171            }
172        }
173        delete carriers;
174
175        this->pickupsIterator_ = this->pickupsList_.begin();
176        return this->pickupsList_.size();
177    }
178
179    std::vector<PickupCarrier*>* PickupManager::getAllCarriers(PickupCarrier* carrier)
180    {
181        //TODO: More efficiently.
182        std::vector<PickupCarrier*>* carriers = new std::vector<PickupCarrier*>();
183        carriers->insert(carriers->end(), carrier);
184        std::vector<PickupCarrier*>* children = carrier->getCarrierChildren();
185        for(std::vector<PickupCarrier*>::iterator it = children->begin(); it != children->end(); it++)
186        {
187            std::vector<PickupCarrier*>* childrensChildren = this->getAllCarriers(*it);
188            for(std::vector<PickupCarrier*>::iterator it2 = childrensChildren->begin(); it2 != childrensChildren->end(); it2++)
189            {
190                carriers->insert(carriers->end(), *it2);
191            }
192            delete childrensChildren;
193        }
194        delete children;
195        return carriers;
196    }
197
198    void PickupManager::dropPickup(orxonox::Pickupable* pickup)
199    {
200        std::map<Pickupable*, WeakPtr<Pickupable> >::iterator it = this->pickupsList_.find(pickup);
201        if(pickup == NULL || it == this->pickupsList_.end() || it->second.get() == NULL)
202            return;
203
204        if(!pickup->isPickedUp())
205            return;
206
207        PickupCarrier* carrier = pickup->getCarrier();
208        if(pickup != NULL && carrier != NULL)
209        {
210            carrier->drop(pickup);
211        }
212    }
213
214    void PickupManager::usePickup(orxonox::Pickupable* pickup, bool use)
215    {
216        std::map<Pickupable*, WeakPtr<Pickupable> >::iterator it = this->pickupsList_.find(pickup);
217        if(pickup == NULL || it == this->pickupsList_.end() || it->second.get() == NULL)
218            return;
219       
220        if(!pickup->isPickedUp())
221            return;
222
223        PickupCarrier* carrier = pickup->getCarrier();
224        if(pickup != NULL && carrier != NULL)
225            pickup->setUsed(use);
226    }
227   
228}
Note: See TracBrowser for help on using the repository browser.