Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/orxonox/worldentities/ControllableEntity.h @ 8986

Last change on this file since 8986 was 8891, checked in by jo, 13 years ago

Ai and tutorial improvements merged back to the trunk. AI features: all weapons are used, the ai-firestrength is configurable, bots are able to collect pickups . I've set the tutorial level as default level.

  • Property svn:eol-style set to native
File size: 9.2 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            unsigned int getCurrentCameraIndex() const;
119            bool setCameraPosition(unsigned int index);
120
121            inline void setCameraPositionTemplate(const std::string& name)
122                { this->cameraPositionTemplate_ = name; }
123            inline const std::string& getCameraPositionTemplate() const
124                { return this->cameraPositionTemplate_; }
125
126            inline void setReverseCamera(CameraPosition* camera)
127                { this->reverseCamera_ = camera; }
128            inline CameraPosition* getReverseCamera() const
129                { return this->reverseCamera_; }
130
131            using WorldEntity::setPosition;
132            using WorldEntity::setOrientation;
133            using MobileEntity::setVelocity;
134            using MobileEntity::setAngularVelocity;
135
136            void setPosition(const Vector3& position);
137            void setOrientation(const Quaternion& orientation);
138            void setVelocity(const Vector3& velocity);
139            void setAngularVelocity(const Vector3& velocity);
140
141            inline bool hasLocalController() const
142                { return this->bHasLocalController_; }
143            inline bool hasHumanController() const
144                { return this->bHasHumanController_; }
145
146            inline bool isInMouseLook() const
147                { return this->bMouseLook_; }
148            inline float getMouseLookSpeed() const
149                { return this->mouseLookSpeed_; }
150            inline CameraPosition* getCurrentCameraPosition()
151                { return this->currentCameraPosition_; }
152
153            inline Controller* getXMLController() const
154                { return this->xmlcontroller_; }
155
156            inline Controller* getController() const
157                { return this->controller_.get(); }
158            void setController(Controller* val);
159
160
161            virtual void setTarget( WorldEntity* target );
162            virtual WorldEntity* getTarget()
163                { return this->target_.get(); }
164            void setTargetInternal( uint32_t targetID );
165            inline bool getRocket() const
166                { return this-> bIsRocket_; }
167
168        protected:
169            virtual void preDestroy();
170
171            virtual void setPlayer(PlayerInfo* player); // don't call this directly, use friend class PlayerInfo instead
172            virtual void removePlayer();                // don't call this directly, use friend class PlayerInfo instead
173
174            virtual void startLocalHumanControl();
175            virtual void stopLocalHumanControl();
176            virtual void parentChanged();
177
178            inline void setHudTemplate(const std::string& name)
179                { this->hudtemplate_ = name; }
180            // HACK-ish
181            void createHud(void);
182            void destroyHud(void);
183
184            Ogre::SceneNode* cameraPositionRootNode_;
185            bool bIsRocket_; //Workaround to see, if the controllable entity is a Rocket.
186
187        private:
188            void registerVariables();
189            void setXMLController(Controller* controller);
190
191            void overwrite();
192            void processOverwrite();
193
194            void processServerPosition();
195            void processServerLinearVelocity();
196            void processServerOrientation();
197            void processServerAngularVelocity();
198
199            void processClientPosition();
200            void processClientLinearVelocity();
201            void processClientOrientation();
202            void processClientAngularVelocity();
203
204            void networkcallback_changedplayerID();
205
206            // Bullet btMotionState related
207            void setWorldTransform(const btTransform& worldTrans);
208
209            unsigned int server_overwrite_;
210            unsigned int client_overwrite_;
211
212            bool bHasLocalController_;
213            bool bHasHumanController_;
214            bool bDestroyWhenPlayerLeft_;
215
216            Vector3 server_position_;
217            Vector3 client_position_;
218            Vector3 server_linear_velocity_;
219            Vector3 client_linear_velocity_;
220            Quaternion server_orientation_;
221            Quaternion client_orientation_;
222            Vector3 server_angular_velocity_;
223            Vector3 client_angular_velocity_;
224
225            PlayerInfo* player_;
226            PlayerInfo* formerPlayer_;
227            unsigned int playerID_;
228
229            std::string hudtemplate_;
230            OverlayGroup* hud_;
231
232            Camera* camera_;
233            bool bMouseLook_;
234            float mouseLookSpeed_;
235            std::list<SmartPtr<CameraPosition> > cameraPositions_;
236            CameraPosition* currentCameraPosition_;
237            std::string cameraPositionTemplate_;
238            Controller* xmlcontroller_;
239            WeakPtr<Controller> controller_;
240            CameraPosition* reverseCamera_;
241            WeakPtr<WorldEntity> target_;
242    };
243}
244
245#endif /* _ControllableEntity_H__ */
Note: See TracBrowser for help on using the repository browser.