Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/orxonox/objects/Level.cc @ 2803

Last change on this file since 2803 was 2710, checked in by rgrieder, 16 years ago

Merged buildsystem3 containing buildsystem2 containing Adi's buildsystem branch back to the trunk.
Please update the media directory if you were not using buildsystem3 before.

File size: 4.9 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 *      Fabian 'x3n' Landau
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#include "OrxonoxStableHeaders.h"
30#include "Level.h"
31
32#include "core/CoreIncludes.h"
33#include "core/XMLPort.h"
34#include "core/Loader.h"
35#include "core/XMLFile.h"
36#include "core/Template.h"
37#include "core/Core.h"
38
39#include "LevelManager.h"
40#include "objects/infos/PlayerInfo.h"
41#include "objects/gametypes/Gametype.h"
42#include "overlays/OverlayGroup.h"
43
44#include "util/Math.h"
45
46namespace orxonox
47{
48    CreateFactory(Level);
49
50    Level::Level(BaseObject* creator) : BaseObject(creator), Synchronisable(creator)
51    {
52        RegisterObject(Level);
53
54        this->registerVariables();
55        this->xmlfilename_ = this->getFilename();
56
57        if (this->xmlfilename_.length() >= Core::getMediaPathString().length())
58            this->xmlfilename_ = this->xmlfilename_.substr(Core::getMediaPathString().length());
59    }
60
61    Level::~Level()
62    {
63        if (this->isInitialized())
64        {
65            if (LevelManager::getInstancePtr())
66                LevelManager::getInstance().releaseActivity(this);
67
68            if (this->xmlfile_)
69                Loader::unload(this->xmlfile_);
70        }
71    }
72
73    void Level::XMLPort(Element& xmlelement, XMLPort::Mode mode)
74    {
75        SUPER(Level, XMLPort, xmlelement, mode);
76
77        XMLPortParam(Level, "description", setDescription, getDescription, xmlelement, mode);
78        XMLPortParam(Level, "gametype", setGametypeString, getGametypeString, xmlelement, mode).defaultValues("Gametype");
79
80        XMLPortObjectExtended(Level, BaseObject, "", addObject, getObject, xmlelement, mode, true, false);
81    }
82
83    void Level::registerVariables()
84    {
85        registerVariable(this->xmlfilename_, variableDirection::toclient, new NetworkCallback<Level>(this, &Level::networkcallback_applyXMLFile));
86        registerVariable(this->name_,        variableDirection::toclient, new NetworkCallback<Level>(this, &Level::changedName));
87        registerVariable(this->description_, variableDirection::toclient);
88    }
89
90    void Level::networkcallback_applyXMLFile()
91    {
92        COUT(0) << "Loading level \"" << this->xmlfilename_ << "\"..." << std::endl;
93
94        ClassTreeMask mask;
95        mask.exclude(Class(BaseObject));
96        mask.include(Class(Template));
97        mask.include(Class(OverlayGroup)); // HACK to include the ChatOverlay
98
99        this->xmlfile_ = new XMLFile(Core::getMediaPathString() + this->xmlfilename_, mask);
100
101        Loader::open(this->xmlfile_);
102    }
103
104    void Level::setGametypeString(const std::string& gametype)
105    {
106        Identifier* identifier = ClassByString(gametype);
107        if (identifier && identifier->isA(Class(Gametype)))
108        {
109            this->gametype_ = gametype;
110
111            Gametype* rootgametype = dynamic_cast<Gametype*>(identifier->fabricate(this));
112            this->setGametype(rootgametype);
113
114            for (std::list<BaseObject*>::iterator it = this->objects_.begin(); it != this->objects_.end(); ++it)
115                (*it)->setGametype(rootgametype);
116
117            if (LevelManager::getInstancePtr())
118                LevelManager::getInstance().requestActivity(this);
119        }
120    }
121
122
123    void Level::addObject(BaseObject* object)
124    {
125        this->objects_.push_back(object);
126        object->setGametype(this->getGametype());
127    }
128
129    BaseObject* Level::getObject(unsigned int index) const
130    {
131        unsigned int i = 0;
132        for (std::list<BaseObject*>::const_iterator it = this->objects_.begin(); it != this->objects_.end(); ++it)
133        {
134            if (i == index)
135                return (*it);
136            ++i;
137        }
138        return 0;
139    }
140
141    void Level::playerEntered(PlayerInfo* player)
142    {
143        COUT(3) << "player entered level (id: " << player->getClientID() << ", name: " << player->getName() << ")" << std::endl;
144        player->setGametype(this->getGametype());
145    }
146
147    void Level::playerLeft(PlayerInfo* player)
148    {
149        COUT(3) << "player left level (id: " << player->getClientID() << ", name: " << player->getName() << ")" << std::endl;
150        player->setGametype(0);
151    }
152}
Note: See TracBrowser for help on using the repository browser.