Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/core7/src/orxonox/Level.cc @ 10563

Last change on this file since 10563 was 10563, checked in by landauf, 10 years ago

level should be it's own level (the same pattern that is already used for Namespace, Scene, and Gametype)

  • Property svn:eol-style set to native
File size: 6.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 *      Fabian 'x3n' Landau
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#include "Level.h"
30
31#include "util/Math.h"
32#include "core/CoreIncludes.h"
33#include "core/Loader.h"
34#include "core/Template.h"
35#include "core/XMLFile.h"
36#include "core/XMLPort.h"
37
38#include "infos/PlayerInfo.h"
39#include "gametypes/Gametype.h"
40#include "overlays/OverlayGroup.h"
41#include "LevelManager.h"
42
43namespace orxonox
44{
45    RegisterClass(Level);
46
47    Level::Level(Context* context) : BaseObject(context), Synchronisable(context), Context(context)
48    {
49        RegisterObject(Level);
50
51        this->setLevel(StrongPtr<Level>(this, false));
52
53        this->registerVariables();
54        this->xmlfilename_ = this->getFilename();
55        this->xmlfile_ = 0;
56    }
57
58    Level::~Level()
59    {
60        if (this->isInitialized())
61        {
62            if (LevelManager::exists())
63                LevelManager::getInstance().releaseActivity(this);
64
65            if (this->xmlfile_)
66                Loader::getInstance().unload(this->xmlfile_);
67        }
68    }
69
70    void Level::XMLPort(Element& xmlelement, XMLPort::Mode mode)
71    {
72        SUPER(Level, XMLPort, xmlelement, mode);
73
74        XMLPortParam(Level, "gametype", setGametypeString, getGametypeString, xmlelement, mode).defaultValues("Gametype");
75
76        XMLPortObject(Level, MeshLodInformation, "lodinformation", addLodInfo, getLodInfo, xmlelement, mode);
77        XMLPortObjectExtended(Level, BaseObject, "", addObject, getObject, xmlelement, mode, true, false);
78    }
79
80    void Level::registerVariables()
81    {
82        registerVariable(this->xmlfilename_,            VariableDirection::ToClient, new NetworkCallback<Level>(this, &Level::networkcallback_applyXMLFile));
83        registerVariable(this->name_,                   VariableDirection::ToClient, new NetworkCallback<Level>(this, &Level::changedName));
84        registerVariable(this->networkTemplateNames_,   VariableDirection::ToClient, new NetworkCallback<Level>(this, &Level::networkCallbackTemplatesChanged));
85    }
86
87    void Level::networkcallback_applyXMLFile()
88    {
89        orxout(user_status) << "Loading level \"" << this->xmlfilename_ << "\"..." << endl;
90
91        ClassTreeMask mask;
92        mask.exclude(Class(BaseObject));
93        mask.include(Class(Template));
94        mask.include(Class(OverlayGroup)); // HACK to include the ChatOverlay
95
96        this->xmlfile_ = new XMLFile(mask, this->xmlfilename_);
97
98        Loader::getInstance().load(this->xmlfile_);
99    }
100
101    void Level::networkCallbackTemplatesChanged()
102    {
103        for( std::set<std::string>::iterator it = this->networkTemplateNames_.begin(); it!=this->networkTemplateNames_.end(); ++it )
104        {
105            assert(Template::getTemplate(*it));
106            Template::getTemplate(*it)->applyOn(this);
107        }
108    }
109
110    void Level::setGametypeString(const std::string& gametype)
111    {
112        Identifier* identifier = ClassByString(gametype);
113
114        if (!identifier || !identifier->isA(Class(Gametype)))
115        {
116            orxout(internal_error) << "\"" << gametype << "\" is not a valid gametype." << endl;
117            identifier = Class(Gametype);
118            this->gametype_ = "Gametype";
119        }
120        else
121            this->gametype_ = gametype;
122
123        Gametype* rootgametype = orxonox_cast<Gametype*>(identifier->fabricate(this));
124        rootgametype->setLevel(NULL); // avoid circular references
125        this->setGametype(rootgametype);
126
127        for (std::list<BaseObject*>::iterator it = this->objects_.begin(); it != this->objects_.end(); ++it)
128            (*it)->setGametype(rootgametype);
129
130        if (LevelManager::exists())
131            LevelManager::getInstance().requestActivity(this);
132    }
133
134
135    void Level::addObject(BaseObject* object)
136    {
137        this->objects_.push_back(object);
138    }
139
140    BaseObject* Level::getObject(unsigned int index) const
141    {
142        unsigned int i = 0;
143        for (std::list<BaseObject*>::const_iterator it = this->objects_.begin(); it != this->objects_.end(); ++it)
144        {
145            if (i == index)
146                return (*it);
147            ++i;
148        }
149        return 0;
150    }
151
152    void Level::addLodInfo(MeshLodInformation* lodInformation)
153    {
154        std::string meshName = lodInformation->getMeshName();
155//         this->lodInformation_.insert(std::make_pair(meshName,lodInformation));
156        if( this->lodInformation_.find(meshName) != this->lodInformation_.end())
157            orxout(verbose, context::lod) << "replacing lod information for " << meshName << endl;
158        this->lodInformation_[meshName] = lodInformation;
159    }
160
161    MeshLodInformation* Level::getLodInfo(std::string meshName) const
162    {
163        if(this->lodInformation_.find(meshName)!=this->lodInformation_.end())
164            return this->lodInformation_.find(meshName)->second;
165
166        return 0;
167    }
168
169    void Level::playerEntered(PlayerInfo* player)
170    {
171        orxout(internal_info) << "player entered level (id: " << player->getClientID() << ", name: " << player->getName() << ')' << endl;
172        player->setGametype(this->getGametype());
173    }
174
175    void Level::playerLeft(PlayerInfo* player)
176    {
177        orxout(internal_info) << "player left level (id: " << player->getClientID() << ", name: " << player->getName() << ')' << endl;
178        player->setGametype(0);
179    }
180}
Note: See TracBrowser for help on using the repository browser.