Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/presentation/src/orxonox/worldentities/ControllableEntity.h @ 8580

Last change on this file since 8580 was 8580, checked in by dafrick, 13 years ago

Merging game immersion branch into presentation branch.

  • Property svn:eol-style set to native
File size: 8.8 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 *      Reto Grieder
26 *
27 */
28
29#ifndef _ControllableEntity_H__
30#define _ControllableEntity_H__
31
32#include "OrxonoxPrereqs.h"
33
34#include <list>
35#include <string>
36#include "util/Math.h"
37#include "MobileEntity.h"
38
39namespace orxonox
40{
41    class _OrxonoxExport ControllableEntity : public MobileEntity
42    {
43        friend class PlayerInfo; // PlayerInfo uses setPlayer and removePlayer
44
45        public:
46            ControllableEntity(BaseObject* creator);
47            virtual ~ControllableEntity();
48
49            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
50            virtual void tick(float dt);
51            void setConfigValues();
52
53            virtual void changedPlayer() {}
54
55            inline PlayerInfo* getPlayer() const
56                { return this->player_; }
57            /**
58            @brief Get the player even after the ControllableEntity has stopped being the players ControllableEntity.
59            @return Returns the most recent PlayerInfo.
60            */
61            inline PlayerInfo* getFormerPlayer() const
62                { return this->formerPlayer_; }
63
64            inline void setDestroyWhenPlayerLeft(bool bDestroy)
65                { this->bDestroyWhenPlayerLeft_ = bDestroy; }
66            inline bool getDestroyWhenPlayerLeft() const
67                { return this->bDestroyWhenPlayerLeft_; }
68
69            virtual void moveFrontBack(const Vector2& value) {}
70            virtual void moveRightLeft(const Vector2& value) {}
71            virtual void moveUpDown(const Vector2& value) {}
72
73            virtual void rotateYaw(const Vector2& value);
74            virtual void rotatePitch(const Vector2& value);
75            virtual void rotateRoll(const Vector2& value);
76
77            inline void moveFrontBack(float value)
78                { this->moveFrontBack(Vector2(value, 0)); }
79            inline void moveRightLeft(float value)
80                { this->moveRightLeft(Vector2(value, 0)); }
81            inline void moveUpDown(float value)
82                { this->moveUpDown(Vector2(value, 0)); }
83
84            inline void rotateYaw(float value)
85                { this->rotateYaw(Vector2(value, 0)); }
86            inline void rotatePitch(float value)
87                { this->rotatePitch(Vector2(value, 0)); }
88            inline void rotateRoll(float value)
89                { this->rotateRoll(Vector2(value, 0)); }
90
91            void fire(unsigned int firemode);
92            virtual void fired(unsigned int firemode) {}
93            virtual void reload() {}
94
95            /**
96            @brief Tells the ControllableEntity to either start or stop boosting.
97                   This doesn't mean, that the ControllableEntity will do so, there might be additional restrictions on boosting, but if it can, then it will.
98            @param bBoost If true the ControllableEntity is told to start boosting, if false it is told to stop.
99            */
100            virtual void boost(bool bBoost) {}
101           
102            virtual void greet() {}
103            virtual void switchCamera();
104            virtual void mouseLook();
105
106            inline const std::string& getHudTemplate() const
107                { return this->hudtemplate_; }
108
109            inline Camera* getCamera() const
110                { return this->camera_; }
111            inline OverlayGroup* getHUD() const
112                { return this->hud_; }
113
114            void addCameraPosition(CameraPosition* position);
115            CameraPosition* getCameraPosition(unsigned int index) const;
116            inline const std::list<SmartPtr<CameraPosition> >& getCameraPositions() const
117                { return this->cameraPositions_; }
118
119            inline void setCameraPositionTemplate(const std::string& name)
120                { this->cameraPositionTemplate_ = name; }
121            inline const std::string& getCameraPositionTemkplate() const
122                { return this->cameraPositionTemplate_; }
123
124            inline void setReverseCamera(CameraPosition* camera)
125                { this->reverseCamera_ = camera; }
126            inline CameraPosition* getReverseCamera() const
127                { return this->reverseCamera_; }
128
129            using WorldEntity::setPosition;
130            using WorldEntity::setOrientation;
131            using MobileEntity::setVelocity;
132            using MobileEntity::setAngularVelocity;
133
134            void setPosition(const Vector3& position);
135            void setOrientation(const Quaternion& orientation);
136            void setVelocity(const Vector3& velocity);
137            void setAngularVelocity(const Vector3& velocity);
138
139            inline bool hasLocalController() const
140                { return this->bHasLocalController_; }
141            inline bool hasHumanController() const
142                { return this->bHasHumanController_; }
143
144            inline bool isInMouseLook() const
145                { return this->bMouseLook_; }
146            inline float getMouseLookSpeed() const
147                { return this->mouseLookSpeed_; }
148            inline CameraPosition* getCurrentCameraPosition()
149                { return this->currentCameraPosition_; }
150
151            inline Controller* getXMLController() const
152                { return this->xmlcontroller_; }
153
154            inline Controller* getController() const
155                { return this->controller_; }
156            inline void setController(Controller* val)
157                { this->controller_ = val; }
158
159            virtual void setTarget( WorldEntity* target );
160            virtual WorldEntity* getTarget()
161                { return this->target_.get(); }
162            void setTargetInternal( uint32_t targetID );
163
164        protected:
165            virtual void preDestroy();
166
167            virtual void setPlayer(PlayerInfo* player); // don't call this directly, use friend class PlayerInfo instead
168            virtual void removePlayer();                // don't call this directly, use friend class PlayerInfo instead
169
170            virtual void startLocalHumanControl();
171            virtual void stopLocalHumanControl();
172            virtual void parentChanged();
173
174            inline void setHudTemplate(const std::string& name)
175                { this->hudtemplate_ = name; }
176
177            Ogre::SceneNode* cameraPositionRootNode_;
178
179        private:
180            void registerVariables();
181            void setXMLController(Controller* controller);
182
183            void overwrite();
184            void processOverwrite();
185
186            void processServerPosition();
187            void processServerLinearVelocity();
188            void processServerOrientation();
189            void processServerAngularVelocity();
190
191            void processClientPosition();
192            void processClientLinearVelocity();
193            void processClientOrientation();
194            void processClientAngularVelocity();
195
196            void networkcallback_changedplayerID();
197
198            // Bullet btMotionState related
199            void setWorldTransform(const btTransform& worldTrans);
200
201            unsigned int server_overwrite_;
202            unsigned int client_overwrite_;
203
204            bool bHasLocalController_;
205            bool bHasHumanController_;
206            bool bDestroyWhenPlayerLeft_;
207
208            Vector3 server_position_;
209            Vector3 client_position_;
210            Vector3 server_linear_velocity_;
211            Vector3 client_linear_velocity_;
212            Quaternion server_orientation_;
213            Quaternion client_orientation_;
214            Vector3 server_angular_velocity_;
215            Vector3 client_angular_velocity_;
216
217            PlayerInfo* player_;
218            PlayerInfo* formerPlayer_;
219            unsigned int playerID_;
220
221            std::string hudtemplate_;
222            OverlayGroup* hud_;
223
224            Camera* camera_;
225            bool bMouseLook_;
226            float mouseLookSpeed_;
227            std::list<SmartPtr<CameraPosition> > cameraPositions_;
228            CameraPosition* currentCameraPosition_;
229            std::string cameraPositionTemplate_;
230            Controller* xmlcontroller_;
231            Controller* controller_;
232            CameraPosition* reverseCamera_;
233            WeakPtr<WorldEntity> target_;
234    };
235}
236
237#endif /* _ControllableEntity_H__ */
Note: See TracBrowser for help on using the repository browser.