Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/presentation/src/world_entities/world_entity.h @ 10710

Last change on this file since 10710 was 10710, checked in by rennerc, 17 years ago

player cannot shoot throu walls
per default worldentities cannot be killed
weapon correct again

File size: 14.7 KB
Line 
1/*!
2 * @file world_entity.h
3 * Definition of the basic WorldEntity
4 */
5
6#ifndef _WORLD_ENTITY_H
7#define _WORLD_ENTITY_H
8
9#include "p_node.h"
10#include "synchronizeable.h"
11#include "model.h"
12
13#include "cr_engine.h"
14#include "collision_filter.h"
15#include "object_manager.h"
16#include "glincl.h"
17
18#include "aabb_tree_node.h"
19
20#include "physics_interface.h"
21
22#include <vector>
23
24
25// FORWARD DECLARATION
26namespace OrxSound { class SoundBuffer; class SoundSource; }
27namespace OrxGui { class GLGuiWidget; class GLGuiBar; class GLGuiEnergyWidget; class GLGuiEnergyWidgetVertical; };
28namespace CoRe { class Collision; }
29
30class BVTree;
31class BoundingVolume;
32class AABBTreeNode;
33class Model;
34class Track;
35class TiXmlElement;
36
37class ObjectInformationFile;
38class MountPoint;
39
40
41//! Basis-class all interactive stuff in the world is derived from
42class WorldEntity : public PNode
43{
44  ObjectListDeclaration(WorldEntity);
45
46public:
47  WorldEntity();
48  virtual ~WorldEntity ();
49
50  virtual void loadParams(const TiXmlElement* root);
51
52  void loadModel(const std::string& fileName, float scaling = 1.0f, unsigned int modelNumber = 0, unsigned int obbTreeDepth = 4);
53  void loadModel2(const std::string& fileN, float scal = 1.0f){this->loadModel(fileN,scal,0,4);}
54  void setModel(Model* model, unsigned int modelNumber = 0);
55  Model* getModel(unsigned int modelNumber = 0) const { return (this->models.size() > modelNumber)? this->models[modelNumber] : NULL; };
56
57  void loadMountPoints(const std::string& fileName);
58  inline void loadMD2Texture(const std::string& fileName) { this->md2TextureFileName = fileName; }
59
60  void addMountPoint(MountPoint* mountPoint);
61  void addMountPoint(int slot, MountPoint* mountPoint);
62  void mount(int slot, WorldEntity* entity);
63  void unmount(int slot);
64
65  void setForwardDamageToParent( bool val ){ this->forwardDamageToParent = val; }
66
67  /** @param visibility if the Entity should be visible (been draw) */
68  void setVisibility (bool visibility) { this->bVisible = visibility; };
69  /** @returns true if the entity is visible, false otherwise */
70  inline bool isVisible() const { return this->bVisible; };
71
72  virtual void reset();
73
74  virtual void postSpawn ();
75  virtual void leaveWorld ();
76
77  virtual void tick (float time);
78  virtual void draw () const;
79  void draw(const Model* model) const;
80  void debugDrawMountPoints() const;
81
82  /* --- Collision Detection Block  --- */
83  bool buildObbTree(int depth);
84  virtual void collidesWith (WorldEntity* entity, const Vector& location);
85  virtual void collidesWithGround(const Vector& location);
86  virtual void collidesWithGround(const Vector& feet, const Vector& ray_1, const Vector& ray_2);
87
88  /** @returns a reference to the obb tree of this worldentity */
89  inline BVTree* getOBBTree() const { return this->obbTree; };
90  inline void setOBBTree(OBBTree* tree) { /*if( this->obbTree != NULL) delete this->obbTree;*/ this->obbTree = (BVTree*)tree; }
91  void drawBVTree(int depth, int drawMode) const;
92  inline AABB* getModelAABB() const { return (this->aabbNode)?this->aabbNode->getAABB():NULL;}
93
94  virtual void hit(float damage, WorldEntity* killer);
95
96
97  /* --- Collision Reaction Block --- */
98  void subscribeReaction(CoRe::CREngine::ReactionType type, const ClassID& target1);
99  void subscribeReaction(CoRe::CREngine::ReactionType type, const ClassID& target1, const ClassID& target2);
100  void subscribeReaction(CoRe::CREngine::ReactionType type, const ClassID& target1, const ClassID& target2, const ClassID& target3);
101
102  void unsubscribeReaction(CoRe::CREngine::ReactionType type);
103  void unsubscribeReactions();
104
105  /** @return true if there is at least on collision reaction subscribed */
106  inline bool isReactive() const { return this->_collisionFilter.isReactive(); }
107
108  /** @param worldEntity the world entity to be checked @returns true if there is a collisionreaction registered for the worldEntity */
109  inline bool isReactive( const WorldEntity& worldEntity) const { return this->_collisionFilter(worldEntity); }
110  /** @param worldEntity the world entity to be checked @param type special reaction type @returns true if collision reaction reg. */
111  inline bool isReactive( const WorldEntity& worldEntity, const CoRe::CREngine::ReactionType& type) const
112  { return this->_collisionFilter(worldEntity, type); }
113
114
115  const CoRe::CollisionFilter& getCollisionFilter(CoRe::CREngine::ReactionType type) const { return this->_collisionFilter; }
116
117  /** @returns true if this entity is standing on ground (BSP model) */
118  bool isOnGround() const { return this->_bOnGround; }
119  /** @param flag: marks if this entity is standing on ground */
120  void setOnGround(bool flag) { this->_bOnGround = flag; }
121
122  virtual void destroy( WorldEntity* killer );
123
124
125  /* @returns the Count of Faces on this WorldEntity */
126  //unsigned int getFaceCount () const { return (this->model != NULL)?this->model->getFaceCount():0; };
127  //  void addAbility(Ability* ability);
128  //  void removeAbility(Ability* ability);
129  //  void setCharacterAttributes(CharacterAttributes* charAttr);
130  //  CharacterAttributes* getCharacterAttributes();
131
132  /* --- Object Manager Block --- */
133  void toList(OM_LIST list);
134  void toListS(const std::string& listName);
135
136  void toReflectionList();
137  void removeFromReflectionList();
138
139  /** @returns a Reference to the objectListNumber to set. */
140  OM_LIST& getOMListNumber() { return this->objectListNumber; }
141  /** @returns a Reference to the Iterator */
142  ObjectManager::EntityList::iterator& getEntityIterator() { return this->objectListIterator; }
143
144  void hide() { if( this->objectListNumber != OM_DEAD) this->lastObjectListNumber = this->objectListNumber; this->toList(OM_DEAD); }
145  void unhide() { if( this->objectListNumber != this->lastObjectListNumber) this->toList(this->lastObjectListNumber); }
146
147
148  /* --- Character Attribute Block --- */
149  /** @returns the scaling of the model */
150  float getScaling(){return this->scaling;}
151  /** @returns the damage dealt by this world entity */
152  float getDamage() const { return this->damage; }
153  /** sets the damage dealt to @param damage damage per second */
154  void setDamage(float damage) { this->damage = damage; }
155  /** @returns the Energy of the entity */
156  float getHealth() const { return this->health; };
157  /** @returns the Maximum energy this entity can be charged with */
158  float getHealthMax() const { return this->healthMax; }
159  float increaseHealth(float health);
160  float decreaseHealth(float health);
161  void increaseHealthMax(float increaseHealth);
162  OrxGui::GLGuiWidget* getHealthWidget();
163  OrxGui::GLGuiWidget* getImplantWidget();
164  OrxGui::GLGuiWidget* getShieldWidget();
165  OrxGui::GLGuiWidget* getElectronicWidget();
166  bool hasHealthWidget() const { return this->healthWidget != NULL; };
167
168  float getShield() const { return this->shield; };
169  float getShieldMax() const { return this->shieldMax; };
170  float increaseShield(float shield);
171  float decreaseShield(float shield);
172  bool getShieldActive() { return this->bShieldActive; };
173
174  float getElectronic() const { return this->electronic; };
175  float getElectronicMax() const { return this->electronicMax; };
176  float increaseElectronic(float electronic);
177  float decreaseElectronic(float electronic);
178
179  bool systemFailure() {  return (this->electronic < float(rand())/float(RAND_MAX) * this->electronicTH); };
180
181  void resetElectronic() { this->electronic = this->electronicMax; };
182  void resetShield()  { this->shield = this->shieldMax; this->bShieldActive = true; };
183  void resetHealth() { this->health = this->healthMax; };
184
185  void createHealthWidget();
186  void createShieldWidget();
187  void createElectronicWidget();
188
189  void regen(float time);
190
191  void loadShield(float cur, float max, float th, float regen)
192      { this->setShield(cur); this->setShieldMax(max); this->setShieldTH(th); this->setShieldRegen(regen); };
193  void loadHealth(float cur, float max, float regen = 0) { this->setHealth(cur); this->setHealthMax(max); this->setHealthRegen(regen); };
194  void loadElectronic(float cur, float max, float th, float regen)
195      { this->setElectronic(cur); this->setElectronicMax(max); this->setElectronicTH(th); this->setElectronicRegen(regen); };
196
197
198  virtual void varChangeHandler( std::list<int> & id );
199
200
201  //FIXME: the PhysicsInterface and the whole PEngine should probably be reviewed. Here its just used to store the vars
202  /* --- Physics Interface --- */
203  inline PhysicsInterface getPhysicsInterface() const { return this->physicsInterface; }
204  inline float getMass() const { return this->physicsInterface.getMass(); }
205  inline float getTotalMass() const { return this->physicsInterface.getTotalMass(); }
206  inline void setVelocity(const Vector& vel) { this->velocity = vel; }
207
208
209  /* --- Misc Stuff Block --- */
210  void debugWE() { this->debugEntity(); }
211  ;  ///FIXME
212  void debugEntity() const;
213
214  void pauseTrack(bool stop);
215
216//   void updateHealthWidget();
217//   void updateElectronicWidget();
218//   void updateShieldWidget();
219
220protected:
221  inline void setHealth(float health) { this->health = health; this->updateHealthWidget();};
222  void setHealthWidgetVisibility(bool visibility);
223  void setHealthMax(float healthMax);
224//   void createHealthWidget();
225//   void createShieldWidget();
226//   void createElectronicWidget();
227  void setHealthRegen(float regen) { this->healthRegen = regen; };
228  void createImplantWidget();
229    //  CharacterAttributes*    charAttr;         //!< the character attributes of a world_entity
230
231  void setShield(float shield) { this->shield = shield; };
232  void setShieldMax(float shield) { this->shieldMax = shield; };
233  void setShieldTH(float th) { this->shieldTH = th; };
234  void setShieldRegen(float regen) { this->shieldRegen = regen; };
235  void setShieldActive(bool active) { this->bShieldActive = active; };
236
237  void setElectronic(float electronic) { this->electronic = electronic; };
238  void setElectronicMax(float electronic) { this->electronicMax = electronic; };
239  void setElectronicTH(float th) { this->electronicTH = th; };
240  void setElectronicRegen(float regen) { this->electronicRegen = regen; };
241 
242  void setDamageable( bool damageable ){ this->damageable = damageable; }
243  bool getDamageable(){ return this->damageable; }
244
245  inline void drawDebugTrack(int flag) { this->bDrawTrack = (bool)flag; }
246  inline bool isDrawTrack() const { return this->bDrawTrack; }
247
248private:
249  void updateHealthWidget();
250  void updateElectronicWidget();
251  void updateShieldWidget();
252  void addTrack(const TiXmlElement* root);
253
254
255
256protected:
257  std::vector<MountPoint*> mountPoints;       //!< A list with mount points for this model
258  std::map<int, MountPoint*> mountPointMap;
259
260
261
262private:
263
264  //!< TODO maybe we will move the following three entries and the corresponding functions to Playable AND NPC
265  //!< started transfering shield/electronic/health from spaceship to WE! (nico, 4.Jun.07)
266
267
268  bool                    damageable;             //!< weather this we can be damaged/killed
269  float                   damage;                 //!< the damage dealt to other objects by colliding.
270  float                   health;                 //!< The Energy of this Entity, if the Entity has any energy at all.
271  bool                    forwardDamageToParent;  //!< if true, damage taken will be forwardet to parent
272  float                   healthMax;              //!< The Maximal energy this entity can take.
273  float                                         implantEnergy;          //!< energy of implants
274  float                   healthRegen;        //!< Regeneration Rate of Health, mesured in units per second
275  OrxGui::GLGuiEnergyWidgetVertical* healthWidget;    //!< The Slider (if wanted).
276  OrxGui::GLGuiEnergyWidgetVertical* implantWidget; 
277
278  float       shield;             //!< current shield
279  float       shieldMax;          //!< maximum shield
280  float       shieldRegen;        //!< shield regeneration rate per second
281  float       shieldTH;           //!< shield threshhold for reactivation
282  bool        bShieldActive;      //!< wheather the shield is working
283  OrxGui::GLGuiEnergyWidgetVertical* shieldWidget; //!< holds the widget that shows the shield bar
284
285  float       electronic;         //!< current electronic
286  float       electronicMax;      //!< maximum electronic
287  float       electronicRegen;    //!< electronic regenration rate per tick
288  float       electronicTH;       //!< Threshhold for electronic failure
289  OrxGui::GLGuiEnergyWidgetVertical* electronicWidget; //!< holds the widget that shows the electronic bar
290
291
292  std::vector<Model*>     models;             //!< The model that should be loaded for this entity.
293  ObjectInformationFile*  oiFile;             //!< Reference to the object information file discribing the model of this WE
294  std::string             md2TextureFileName; //!< the file name of the md2 model texture, only if this
295  std::string             modelLODName;       //!< the name of the model lod file
296  BVTree*                 obbTree;            //!< this is the obb tree reference needed for collision detection
297  AABBTreeNode*           aabbNode;           //!< the tree node of the first level of a axis aligned bounding boxes tree: model dimension
298
299  bool                    bCollide;           //!< If it should be considered for the collisiontest.
300  bool                    bVisible;           //!< If it should be visible.
301
302  OM_LIST                 objectListNumber;                //!< The ObjectList from ObjectManager this Entity is in.
303  ObjectManager::EntityList::iterator objectListIterator;  //!< The iterator position of this Entity in the given list of the ObjectManager.
304  OM_LIST                 lastObjectListNumber;            //!< the last ObjectList from the ObjectManager this Entity was is in
305
306  /* collision reaction stuff */
307  CoRe::CollisionFilter   _collisionFilter;                //!< filter for collision event filtering (not every entity listens to all collisions)
308  bool                    _bOnGround;                      //!< flag true if the object is on the ground
309
310  PhysicsInterface        physicsInterface;                //!< the physics object of the WorldEntity
311
312  /* network help structures */
313  float                   scaling;                         //!< model's scaling factor
314  int                     scaling_handle;                  //!< handle for syncing var
315
316  std::string             modelFileName;                   //!< model's file name
317  int                     modelFileName_handle;            //!< handle for syncing var
318
319  int                     list_write;                      //!< entity's list
320  int                     list_handle;                     //!< handle for list changes
321
322  float                   health_write;
323  int                     health_handle;
324
325  float                   healthMax_write;
326  int                     healthMax_handle;
327 
328
329
330
331
332protected:
333  Vector                  velocity;                        //!< speed of the entity
334  Track*                  entityTrack;                     //!< this is the track this entity follows (or NULL if none)
335  bool                    bDrawTrack;                      //!< if true draws the debug track
336
337};
338
339#endif /* _WORLD_ENTITY_H */
Note: See TracBrowser for help on using the repository browser.