Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/core7/src/libraries/core/BaseObject.h @ 10576

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

removed changedGametype and getOldGametype from BaseObject. the gametype is never supposed to change anyway. the only exception is PlayerInfo which may change a gametype. but this happens in a completely controlled manner and can be done with a separate new function (switchGametype).

  • Property svn:eol-style set to native
File size: 10.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/**
30    @defgroup BaseObject BaseObject
31    @ingroup Core
32*/
33
34/**
35    @file
36    @ingroup BaseObject
37    @brief Declaration of BaseObject, the base class of all objects in Orxonox.
38
39    The BaseObject is the parent of all classes representing an instance in the game.
40*/
41
42#ifndef _BaseObject_H__
43#define _BaseObject_H__
44
45#include "CorePrereqs.h"
46
47#include <map>
48#include <list>
49
50#include "util/mbool.h"
51#include "class/OrxonoxClass.h"
52#include "class/Super.h"
53#include "object/StrongPtr.h"
54
55namespace orxonox
56{
57    class Scene;
58    class Gametype;
59    class Level;
60
61    /// The BaseObject is the parent of all classes representing an instance in the game.
62    class _CoreExport BaseObject : public OrxonoxClass
63    {
64        template <class T> friend class XMLPortClassParamContainer;
65
66        public:
67            BaseObject(Context* context);
68            virtual ~BaseObject();
69            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
70            virtual void XMLEventPort(Element& xmlelement, XMLPort::Mode mode);
71
72            /** @brief Returns if the object was initialized (passed the object registration). @return True was the object is initialized */
73            inline bool isInitialized() const { return this->bInitialized_; }
74
75            /** @brief Sets the name of the object. @param name The name */
76            inline void setName(const std::string& name) { this->oldName_ = this->name_; this->name_ = name; this->changedName(); }
77            /** @brief Returns the name of the object. */
78            inline const std::string& getName() const { return this->name_; }
79            /** @brief Returns the old name of the object. */
80            inline const std::string& getOldName() const { return this->oldName_; }
81            /** @brief This function gets called if the name of the object changes. */
82            virtual void changedName() {}
83
84            /** @brief Sets the state of the objects activity. @param bActive True = active */
85            inline void setActive(bool bActive)
86            {
87                if (this->bActive_ != bActive)
88                {
89                    this->bActive_ = bActive;
90                    this->changedActivity();
91                }
92            }
93            /** @brief Returns the state of the objects activity. @return The state of the activity */
94            inline const mbool& isActive() const { return this->bActive_; }
95            /** @brief This function gets called if the activity of the object changes. */
96            virtual void changedActivity() {}
97
98            /** @brief Sets the state of the objects visibility. @param bVisible True = visible */
99            inline void setVisible(bool bVisible)
100            {
101                if (this->bVisible_ != bVisible)
102                {
103                    this->bVisible_ = bVisible;
104                    this->changedVisibility();
105                }
106            }
107            /** @brief Returns the state of the objects visibility. @return The state of the visibility */
108            inline const mbool& isVisible() const { return this->bVisible_; }
109            /** @brief This function gets called if the visibility of the object changes. */
110            virtual void changedVisibility() {}
111
112            void setMainState(bool state);
113
114            /** @brief Sets the name of the main state (used for event reactions). */
115            void setMainStateName(const std::string& name)
116            {
117                if (this->mainStateName_ != name)
118                {
119                    this->mainStateName_ = name;
120                    this->changedMainStateName();
121                }
122            }
123            /** @brief Returns the name of the main state. */
124            inline const std::string& getMainStateName() const { return this->mainStateName_; }
125            /** @brief This function gets called if the main state name of the object changes. */
126            virtual void changedMainStateName();
127
128            /** @brief Sets a pointer to the xml file that loaded this object. @param file The pointer to the XMLFile */
129            inline void setFile(const XMLFile* file) { this->file_ = file; }
130            /** @brief Returns a pointer to the XMLFile that loaded this object. @return The XMLFile */
131            inline const XMLFile* getFile() const { return this->file_; }
132            const std::string& getFilename() const;
133
134            void addTemplate(const std::string& name);
135            void addTemplate(Template* temp);
136            /** @brief Returns the set of all aplied templates. */
137            inline const std::set<Template*>& getTemplates() const
138                { return this->templates_; }
139
140            inline void setNamespace(const StrongPtr<Namespace>& ns) { this->namespace_ = ns; }
141            inline Namespace* getNamespace() const { return this->namespace_; }
142
143            inline void setCreator(BaseObject* creator) { this->creator_ = creator; }
144            inline BaseObject* getCreator() const { return this->creator_; }
145
146            inline void setScene(const StrongPtr<Scene>& scene, uint32_t sceneID) { this->scene_ = scene; this->sceneID_=sceneID; }
147            inline Scene* getScene() const { return this->scene_; }
148            inline virtual uint32_t getSceneID() const { return this->sceneID_; }
149
150            inline void setGametype(const StrongPtr<Gametype>& gametype) { this->gametype_ = gametype; }
151            inline Gametype* getGametype() const { return this->gametype_; }
152
153            inline void setLevel(const StrongPtr<Level>& level) { this->level_ = level; }
154            inline Level* getLevel() const { return this->level_; }
155
156            void addEventSource(BaseObject* source, const std::string& state);
157            void removeEventSource(BaseObject* source);
158            BaseObject* getEventSource(unsigned int index, const std::string& state) const;
159
160            void addEventListener(BaseObject* listener);
161            BaseObject* getEventListener(unsigned int index) const;
162
163            void fireEvent(const std::string& name = "");
164            void fireEvent(bool activate, const std::string& name = "");
165            void fireEvent(bool activate, BaseObject* originator, const std::string& name = "");
166            void fireEvent(Event& event);
167
168            virtual void processEvent(Event& event);
169
170            /** @brief Sets the indentation of the debug output in the Loader. @param indentation The indentation */
171            inline void setLoaderIndentation(const std::string& indentation) { this->loaderIndentation_ = indentation; }
172            /** @brief Returns the indentation of the debug output in the Loader. @return The indentation */
173            inline const std::string& getLoaderIndentation() const { return this->loaderIndentation_; }
174
175            static void loadAllEventStates(Element& xmlelement, XMLPort::Mode mode, BaseObject* object, Identifier* identifier);
176
177        protected:
178            void addEventState(const std::string& name, EventState* container);
179            EventState* getEventState(const std::string& name) const;
180
181            std::string             name_;                     //!< The name of the object
182            std::string             oldName_;                  //!< The old name of the object
183            mbool                   bActive_;                  //!< True = the object is active
184            mbool                   bVisible_;                 //!< True = the object is visible
185            std::string             mainStateName_;
186            FunctorPtr              mainStateFunctor_;
187            std::set<std::string>   networkTemplateNames_;
188
189        private:
190            /** @brief Adds an object which listens to the events of this object. */
191            void registerEventListener(BaseObject* object);
192            /** @brief Removes an event listener from this object. */
193            inline void unregisterEventListener(BaseObject* object)
194                { this->eventListeners_.erase(object); }
195
196            void setXMLName(const std::string& name);
197            const std::string& getSingleTemplate(void) const;
198            Template* getTemplate(unsigned int index) const;
199            void registerEventStates();
200
201            bool                   bInitialized_;              //!< True if the object was initialized (passed the object registration)
202            const XMLFile*         file_;                      //!< The XMLFile that loaded this object
203            Element*               lastLoadedXMLElement_;      //!< Non 0 if the TinyXML attributes have already been copied to our own lowercase map
204            std::map<std::string, std::string> xmlAttributes_; //!< Lowercase XML attributes
205            std::string            loaderIndentation_;         //!< Indentation of the debug output in the Loader
206            StrongPtr<Namespace>   namespace_;
207            BaseObject*            creator_;
208            StrongPtr<Scene>       scene_;
209            uint32_t               sceneID_;
210            StrongPtr<Gametype>    gametype_;
211            StrongPtr<Level>       level_;
212            std::set<Template*>    templates_;
213
214            std::map<BaseObject*, std::string>  eventSources_;           //!< List of objects which send events to this object, mapped to the state which they affect
215            std::set<BaseObject*>               eventListeners_;         //!< List of objects which listen to the events of this object
216            std::set<BaseObject*>               eventListenersXML_;      //!< List of objects which listen to the events of this object through the "eventlisteners" subsection in XML
217            std::map<std::string, EventState*>  eventStates_;            //!< Maps the name of the event states to their helper objects
218            bool                                bRegisteredEventStates_; //!< Becomes true after the object registered its event states (with XMLEventPort)
219    };
220
221    SUPER_FUNCTION(0, BaseObject, XMLPort, false);
222    SUPER_FUNCTION(2, BaseObject, changedActivity, false);
223    SUPER_FUNCTION(3, BaseObject, changedVisibility, false);
224    SUPER_FUNCTION(4, BaseObject, XMLEventPort, false);
225    SUPER_FUNCTION(8, BaseObject, changedName, false);
226}
227
228#endif /* _BaseObject_H__ */
Note: See TracBrowser for help on using the repository browser.