Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/sagerjFS16/src/orxonox/worldentities/ControllableEntity.h @ 11396

Last change on this file since 11396 was 11174, checked in by sagerj, 9 years ago

everything beneath weaponmode changed to push/release - wm modified only need to implement timer/ticker

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