Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/proxy/src/world_entities/space_ships/turbine_hover.cc @ 9643

Last change on this file since 9643 was 9643, checked in by patrick, 18 years ago

localhost now gets its own ip, hoover is added to the correct team

File size: 18.2 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11### File Specific:
12   main-programmer: Benjamin Grauer
13   co-programmer: ...
14
15*/
16
17#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WORLD_ENTITY
18
19#include "turbine_hover.h"
20
21#include "weapons/weapon_manager.h"
22#include "weapons/test_gun.h"
23#include "weapons/turret.h"
24#include "weapons/cannon.h"
25
26#include "util/loading/factory.h"
27#include "key_mapper.h"
28#include "state.h"
29
30#include "graphics_engine.h"
31#include "dot_emitter.h"
32#include "sprite_particles.h"
33
34#include "debug.h"
35
36CREATE_FACTORY(TurbineHover, CL_TURBINE_HOVER);
37
38/**
39 *  destructs the turbine_hover, deletes alocated memory
40 */
41TurbineHover::~TurbineHover ()
42{
43  this->setPlayer(NULL);
44}
45
46/**
47 * @brief loads a TurbineHover information from a specified file.
48 * @param fileName the name of the File to load the turbine_hover from (absolute path)
49 */
50TurbineHover::TurbineHover(const std::string& fileName)
51{
52  this->init();
53  TiXmlDocument doc(fileName);
54
55  if(!doc.LoadFile())
56  {
57    PRINTF(2)("Loading file %s failed for TurbineHover.\n", fileName.c_str());
58    return;
59  }
60
61  this->loadParams(doc.RootElement());
62}
63
64/**
65 * @brief creates a new Spaceship from Xml Data
66 * @param root the xml element containing spaceship data
67
68   @todo add more parameters to load
69*/
70TurbineHover::TurbineHover(const TiXmlElement* root)
71{
72  this->init();
73  if (root != NULL)
74    this->loadParams(root);
75
76  //weapons:
77  Weapon* wpRight = new TestGun(0);
78  wpRight->setName("testGun Right");
79  Weapon* wpLeft = new TestGun(1);
80  wpLeft->setName("testGun Left");
81  //Weapon* cannon = dynamic_cast<Weapon*>(Factory::fabricate(CL_HYPERBLASTER));
82
83  //  cannon->setName("BFG");
84
85  this->addWeapon(wpLeft, 1, 0);
86  this->addWeapon(wpRight,1 ,1);
87  //this->addWeapon(cannon, 0, 2);
88
89  this->getWeaponManager().changeWeaponConfig(1);
90  dynamic_cast<Element2D*>(this->getWeaponManager().getFixedTarget())->setVisibility( false);
91
92  this->loadModel("models/ships/hoverglider_mainbody.obj");
93
94}
95
96
97/**
98 * @brief initializes a TurbineHover
99 */
100void TurbineHover::init()
101{
102  //  this->setRelDir(Quaternion(M_PI, Vector(1,0,0)));
103  this->setClassID(CL_TURBINE_HOVER, "TurbineHover");
104
105  this->setSupportedPlaymodes(Playable::Full3D | Playable::Horizontal | Playable::Vertical);
106
107  this->loadModel("models/ships/hoverglider_wing.obj", 1.0f, 3);
108  this->loadModel("models/ships/hoverglider_turbine.obj", 1.0f, 4);
109  this->loadModel("models/ships/hoverglider_turbine_rotors.obj", 1.0f, 5);
110
111  bForward = bBackward = bLeft = bRight = bAscend = bDescend = false;
112  mouseSensitivity = 0.005;
113
114  this->rotorSpeed = 1000.0f;
115  this->rotorCycle = 0.0f;
116  this->cameraLook = 0.0f;
117  this->rotation = 0.0f;
118  this->acceleration = 10.0f;
119  this->airFriction = 2.0f;
120
121  this->setHealthMax(100);
122  this->setHealth(100);
123
124
125  // camera - issue
126  this->cameraNode.addNodeFlags(PNODE_PROHIBIT_DELETE_WITH_PARENT);
127  this->cameraNode.addNodeFlags(PNODE_PROHIBIT_CHILD_DELETE);
128  //this->cameraNode.setParentMode(PNODE_ROTATE_MOVEMENT);
129  this->cameraNode.setParent(this);
130  this->cameraNode.setRelCoor(0,5,0);
131
132  // rotors
133  this->wingNodeLeft.addNodeFlags(PNODE_PROHIBIT_DELETE_WITH_PARENT );
134  this->wingNodeLeft.addNodeFlags(PNODE_PROHIBIT_CHILD_DELETE);
135  this->wingNodeLeft.setParent(this);
136  this->wingNodeLeft.setRelCoor(-1.5, -.3, -1.0);
137  this->rotorNodeLeft.addNodeFlags(PNODE_PROHIBIT_DELETE_WITH_PARENT);
138  this->rotorNodeLeft.setParent(&this->wingNodeLeft);
139  this->rotorNodeLeft.setRelCoor(0, 1.0, -2.3);
140
141  this->wingNodeRight.addNodeFlags(PNODE_PROHIBIT_DELETE_WITH_PARENT);
142  this->wingNodeRight.addNodeFlags(PNODE_PROHIBIT_CHILD_DELETE);
143  this->wingNodeRight.setParent(this);
144  this->wingNodeRight.setRelCoor(-1.5, -0.3, 1.0);
145  this->rotorNodeRight.addNodeFlags(PNODE_PROHIBIT_DELETE_WITH_PARENT);
146  this->rotorNodeRight.setParent(&this->wingNodeRight);
147  this->rotorNodeRight.setRelCoor(0, 1.0, 2.3);
148
149  // PARTICLES
150  this->burstEmitter[0] = new DotEmitter(200, 5.0, .01);
151  this->burstEmitter[0]->setParent(&this->rotorNodeLeft);
152  this->burstEmitter[0]->setRelCoor(0, -0.7, 0);
153  this->burstEmitter[0]->setRelDir(Quaternion(-M_PI_2, Vector(0,0,1)));
154  this->burstEmitter[0]->setName("TurbineHover_Burst_emitter_Left");
155
156  this->burstEmitter[1] = new DotEmitter(200, 5.0, .01);
157  this->burstEmitter[1]->setParent(&this->rotorNodeRight);
158  this->burstEmitter[1]->setRelCoor(0, -0.7, 0);
159  this->burstEmitter[1]->setRelDir(Quaternion(-M_PI_2, Vector(0,0,1)));
160  this->burstEmitter[1]->setName("TurbineHover_Burst_emitter_Right");
161
162
163  this->burstSystem = new SpriteParticles(1000);
164  this->burstSystem->addEmitter(this->burstEmitter[0]);
165  this->burstSystem->addEmitter(this->burstEmitter[1]);
166  this->burstSystem->setName("SpaceShip_Burst_System");
167  ((SpriteParticles*)this->burstSystem)->setMaterialTexture("maps/radial-trans-noise.png");
168  this->burstSystem->setLifeSpan(1.0, .3);
169  this->burstSystem->setRadius(0.0, 1.5);
170  this->burstSystem->setRadius(0.05, 1.8);
171  this->burstSystem->setRadius(.5, .8);
172  this->burstSystem->setRadius(1.0, 0);
173  this->burstSystem->setColor(0.0, .7,.7,1,.5);
174  this->burstSystem->setColor(0.2, 0,0,0.8,.5);
175  this->burstSystem->setColor(0.5, .5,.5,.8,.3);
176  this->burstSystem->setColor(1.0, .8,.8,.8,.0);
177
178
179  //add events to the eventlist of the Playable
180  this->registerEvent(KeyMapper::PEV_FORWARD);
181  this->registerEvent(KeyMapper::PEV_BACKWARD);
182  this->registerEvent(KeyMapper::PEV_LEFT);
183  this->registerEvent(KeyMapper::PEV_RIGHT);
184  this->registerEvent(KeyMapper::PEV_UP);
185  this->registerEvent(KeyMapper::PEV_DOWN);
186  this->registerEvent(KeyMapper::PEV_FIRE1);
187  this->registerEvent(KeyMapper::PEV_NEXT_WEAPON);
188  this->registerEvent(KeyMapper::PEV_PREVIOUS_WEAPON);
189  this->registerEvent(EV_MOUSE_MOTION);
190
191  dynamic_cast<Element2D*>(this->getWeaponManager().getFixedTarget())->setVisibility( false);
192
193  // WEAPON_MANAGER configuration
194  this->getWeaponManager().setSlotCount(5);
195
196  this->getWeaponManager().setSlotPosition(0, Vector(-0.28, 1.186, -2.750), &this->wingNodeLeft);
197  this->getWeaponManager().setSlotCapability(0, WTYPE_ALLDIRS | WTYPE_DIRECTIONAL);
198
199  this->getWeaponManager().setSlotPosition(1, Vector(-0.28, 1.186, 2.750), &this->wingNodeRight);
200  this->getWeaponManager().setSlotCapability(1, WTYPE_ALLDIRS | WTYPE_DIRECTIONAL);
201
202  this->getWeaponManager().setSlotPosition(2, Vector(-1.63, .809, -.003));
203  this->getWeaponManager().setSlotCapability(2, WTYPE_HEAVY);
204
205  /// TODO: THESE ARE TOO MUCH
206  this->getWeaponManager().setSlotPosition(3, Vector(-1.63, .678, -.652));
207  this->getWeaponManager().setSlotDirection(3, Quaternion(-24/180 * M_PI, Vector(1,0,0)));
208
209  this->getWeaponManager().setSlotPosition(4, Vector(-1.63, .678, .652));
210  this->getWeaponManager().setSlotDirection(4, Quaternion(24/180 * M_PI, Vector(1,0,0)));
211
212  this->cameraNode.setRelCoor(1,5,0);
213  this->getWeaponManager().getFixedTarget()->setParent(&this->cameraNode);
214  this->getWeaponManager().getFixedTarget()->setRelCoor(1000,0,0);
215
216  registerVar( new SynchronizeableBool( &bForward, &bForward, "bForward", PERMISSION_OWNER ) );
217  registerVar( new SynchronizeableBool( &bBackward, &bBackward, "bBackward", PERMISSION_OWNER ) );
218  registerVar( new SynchronizeableBool( &bLeft, &bLeft, "bLeft", PERMISSION_OWNER ) );
219  registerVar( new SynchronizeableBool( &bRight, &bRight, "bRight", PERMISSION_OWNER ) );
220  registerVar( new SynchronizeableBool( &bAscend, &bAscend, "bAscend", PERMISSION_OWNER ) );
221  registerVar( new SynchronizeableBool( &bDescend, &bDescend, "bDescend", PERMISSION_OWNER ) );
222  registerVar( new SynchronizeableQuaternion( &direction, &direction, "direction", PERMISSION_OWNER ) );
223  registerVar( new SynchronizeableFloat( &cameraLook, &cameraLook, "cameraLook", PERMISSION_OWNER ) );
224  registerVar( new SynchronizeableFloat( &rotation, &rotation, "rotation", PERMISSION_OWNER ) );
225
226  if( State::isOnline())
227    toList( OM_PLAYERS );
228}
229
230/**
231 * @brief loads the Settings of a TurbineHover from an XML-element.
232 * @param root the XML-element to load the Spaceship's properties from
233 */
234void TurbineHover::loadParams(const TiXmlElement* root)
235{
236  Playable::loadParams(root);
237}
238
239
240void TurbineHover::setBoostColor(const Color& color)
241{
242  this->burstSystem->setColor(0.0, color);
243  this->burstSystem->setColor(0.2, color * 0.6);
244  this->burstSystem->setColor(0.5, color * .3 + Color(0.5, 0.5, 0.8, 0.3));
245  this->burstSystem->setColor(1.0, 0.8, 0.8, 0.8, 0.0);
246
247  printf(":::::::::::::::::::::::\n");
248  this->burstSystem->debug();
249}
250
251void TurbineHover::setPlayDirection(const Quaternion& rot, float speed)
252{
253  this->direction = Quaternion (rot.getHeading(), Vector(0,1,0));
254}
255
256void TurbineHover::enter()
257{
258  dynamic_cast<Element2D*>(this->getWeaponManager().getFixedTarget())->setVisibility( true);
259
260  if (State::getCameraNode != NULL)
261  {
262    State::getCameraNode()->setParentSoft(&this->cameraNode);
263    State::getCameraNode()->setRelCoorSoft(-10, 0,0);
264    State::getCameraTargetNode()->setParentSoft(&this->cameraNode);
265  }
266}
267
268void TurbineHover::leave()
269{
270  dynamic_cast<Element2D*>(this->getWeaponManager().getFixedTarget())->setVisibility( false);
271  this->detachCamera();
272
273}
274
275void TurbineHover::setTeam(int teamID)
276{
277  printf("::::::::::::::::: TEAM ::: %d\n", teamID);
278  if (teamID == 0)
279    this->setBoostColor(Color::blue);
280  else if (teamID == 1)
281    this->setBoostColor(Color::red);
282
283  // set the local team id, very important
284  this->setTeamId(teamID);
285}
286
287
288
289/**
290 * @brief effect that occurs after the TurbineHover is spawned
291*/
292void TurbineHover::postSpawn ()
293{
294  //setCollision(new CollisionCluster(1.0, Vector(0,0,0)));
295}
296
297/**
298 * @brief the action occuring if the turbine_hover left the game
299*/
300void TurbineHover::leftWorld ()
301{}
302
303/**
304 * @brief this function is called, when two entities collide
305 * @param entity: the world entity with whom it collides
306 *
307 * Implement behaviour like damage application or other miscellaneous collision stuff in this function
308 */
309void TurbineHover::collidesWith(WorldEntity* entity, const Vector& location)
310{
311  Playable::collidesWith(entity, location);
312}
313
314
315
316/**
317 * @brief the function called for each passing timeSnap
318 * @param time The timespan passed since last update
319*/
320void TurbineHover::tick (float dt)
321{
322  //  this->debugNode(1);
323  Playable::tick(dt);
324
325  // spaceship controlled movement
326
327  // TRYING TO FIX PNode.
328  //this->cameraNode.setRelCoor(Vector(0.0f, 5.0f, 0.0f));//, 30.0f);
329  //this->cameraNode.setRelDir(Quaternion(this->smoothRotator  *10.0, Vector(0,1,0)));
330
331  this->movement(dt);
332  this->rotorCycle += this->rotorSpeed * dt;
333}
334
335
336#include "shared_network_data.h"
337
338/**
339 * @brief calculate the velocity
340 * @param time the timeslice since the last frame
341*/
342void TurbineHover::movement (float dt)
343{
344  Vector accel(0.0, 0.0, 0.0);
345
346  if( this->bForward )
347  {
348    accel += Vector(this->acceleration, 0, 0);
349  }
350
351  if( this->bBackward )
352  {
353    accel -= Vector(this->acceleration, 0, 0);
354  }
355  if( this->bLeft)
356  {
357    accel -= Vector(0, 0, this->acceleration);
358  }
359
360  if( this->bRight)
361  {
362    accel += Vector(0, 0, this->acceleration);
363  }
364
365  if (this->bAscend )
366  {
367    accel += Vector(0, this->acceleration, 0);
368  }
369  if (this->bDescend )
370  {
371    accel -= Vector(0, this->acceleration, 0);
372  }
373
374  switch(this->getPlaymode())
375  {
376    case Playable::Full3D:
377      {
378        Vector accelerationDir = this->getAbsDir().apply(accel * this->acceleration);
379
380        // this is the air friction (necessary for a smooth control)
381        Vector damping = (this->velocity * this->airFriction);
382
383
384        this->velocity += (accelerationDir - damping)* dt;
385        //if (this->getOwner() != SharedNetworkData::getInstance()->getHostID())
386          this->shiftCoor (this->velocity * dt);
387
388        // limit the maximum rotation speed.
389        if (this->rotation != 0.0f)
390        {
391          float maxRot = 10.0 * dt;
392          if (unlikely(this->rotation > maxRot)) this->rotation = maxRot;
393          if (unlikely(this->rotation < -maxRot)) this->rotation = -maxRot;
394          this->direction *= Quaternion(-M_PI/4.0*this->rotation, Vector(0,1,0));
395
396          this->rotation = 0.0f;
397        }
398
399        //if (this->getOwner() != SharedNetworkData::getInstance()->getHostID())
400          this->setRelDirSoft(this->direction * Quaternion(-cameraLook, Vector(0,0,1)), 5);
401
402        this->wingNodeLeft.setRelDirSoft(Quaternion(accel.z * .05 +this->rotation, Vector(1,0,0)), 5);
403        this->rotorNodeLeft.setRelDirSoft(Quaternion(-accel.x * .07+this->rotation + cameraLook, Vector(0,0,1)), 5);
404
405        this->wingNodeRight.setRelDirSoft(Quaternion(accel.z * .05 +this->rotation, Vector(1,0,0)), 5);
406        this->rotorNodeRight.setRelDirSoft(Quaternion(-accel.x*.07 -this->rotation + cameraLook, Vector(0,0,1)), 5);
407      }
408      break;
409
410    case Playable::Horizontal:
411      {
412        accel.y = 0.0;
413        Vector accelerationDir = this->getAbsDir().apply(accel * this->acceleration);
414        accelerationDir.y = 0.0;
415
416        // this is the air friction (necessary for a smooth control)
417        Vector damping = (this->velocity * this->airFriction);
418
419
420        this->velocity += (accelerationDir - damping)* dt;
421        this->shiftCoor (this->velocity * dt);
422
423        // limit the maximum rotation speed.
424        if (this->rotation != 0.0f)
425        {
426          float maxRot = 10.0 * dt;
427          if (unlikely(this->rotation > maxRot)) this->rotation = maxRot;
428          if (unlikely(this->rotation < -maxRot)) this->rotation = -maxRot;
429          this->direction *= Quaternion(-M_PI/4.0*this->rotation, Vector(0,1,0));
430
431          this->rotation = 0.0f;
432        }
433
434        this->setRelDirSoft(this->direction, 5);
435
436        this->wingNodeLeft.setRelDirSoft(Quaternion(accel.z * .05 +this->rotation, Vector(1,0,0)), 5);
437        this->rotorNodeLeft.setRelDirSoft(Quaternion(-accel.x * .07+this->rotation, Vector(0,0,1)), 5);
438
439        this->wingNodeRight.setRelDirSoft(Quaternion(accel.z * .05 +this->rotation, Vector(1,0,0)), 5);
440        this->rotorNodeRight.setRelDirSoft(Quaternion(-accel.x*.07 -this->rotation, Vector(0,0,1)), 5);
441      }
442      break;
443
444    case Playable::Vertical:
445      {
446        accel.z = 0;
447        Vector accelerationDir = this->getAbsDir().apply(accel * this->acceleration);
448        accelerationDir.z=0;
449
450        // this is the air friction (necessary for a smooth control)
451        Vector damping = (this->velocity * this->airFriction);
452
453        this->velocity += (accelerationDir - damping)* dt;
454        this->shiftCoor (this->velocity * dt);
455
456        this->setRelDirSoft(this->direction * Quaternion(-cameraLook, Vector(0,0,1)), 5);
457
458        this->wingNodeLeft.setRelDirSoft(Quaternion(accel.z * .05 +this->rotation, Vector(1,0,0)), 5);
459        this->rotorNodeLeft.setRelDirSoft(Quaternion(-accel.x * .07+this->rotation + cameraLook, Vector(0,0,1)), 5);
460
461        this->wingNodeRight.setRelDirSoft(Quaternion(accel.z * .05 +this->rotation, Vector(1,0,0)), 5);
462        this->rotorNodeRight.setRelDirSoft(Quaternion(-accel.x*.07 -this->rotation + cameraLook, Vector(0,0,1)), 5);
463      }
464      break;
465    default:
466      PRINTF(2)("Playmode %s Not Implemented\n", Playable::playmodeToString(this->getPlaymode()).c_str());
467  }
468}
469
470
471void TurbineHover::draw() const
472{
473  Vector tmpRot;
474  WorldEntity::draw();
475
476  glPushMatrix();
477  /// LEFT SIDE
478  glTranslatef (this->wingNodeLeft.getAbsCoor ().x,
479                this->wingNodeLeft.getAbsCoor ().y,
480                this->wingNodeLeft.getAbsCoor ().z);
481  tmpRot = this->wingNodeLeft.getAbsDir().getSpacialAxis();
482  glRotatef (this->wingNodeLeft.getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
483  this->getModel(3)->draw();
484  glPopMatrix ();
485
486  glPushMatrix();
487  glTranslatef (this->rotorNodeLeft.getAbsCoor ().x,
488                this->rotorNodeLeft.getAbsCoor ().y,
489                this->rotorNodeLeft.getAbsCoor ().z);
490  tmpRot = this->rotorNodeLeft.getAbsDir().getSpacialAxis();
491  glRotatef (this->rotorNodeLeft.getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
492  this->getModel(4)->draw();
493  glRotatef(this->rotorCycle, 0,1,0);
494  this->getModel(5)->draw();
495  glPopMatrix ();
496
497  /// RIGHT SIDE
498  glPushMatrix();
499  glTranslatef (this->wingNodeRight.getAbsCoor ().x,
500                this->wingNodeRight.getAbsCoor ().y,
501                this->wingNodeRight.getAbsCoor ().z);
502  tmpRot = this->wingNodeRight.getAbsDir().getSpacialAxis();
503  glRotatef (this->wingNodeRight.getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
504  glScalef(1,1,-1);
505  this->getModel(3)->draw();
506  glPopMatrix ();
507
508  glPushMatrix();
509  glTranslatef (this->rotorNodeRight.getAbsCoor ().x,
510                this->rotorNodeRight.getAbsCoor ().y,
511                this->rotorNodeRight.getAbsCoor ().z);
512  tmpRot = this->rotorNodeRight.getAbsDir().getSpacialAxis();
513  glRotatef (this->rotorNodeRight.getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
514  glScalef(1,1,-1);
515  this->getModel(4)->draw();
516  glRotatef(this->rotorCycle, 0,1,0);
517  this->getModel(5)->draw();
518  glPopMatrix ();
519}
520
521/**
522 * @todo switch statement ??
523 */
524void TurbineHover::process(const Event &event)
525{
526  Playable::process(event);
527
528  if( event.type == KeyMapper::PEV_LEFT)
529    this->bLeft = event.bPressed;
530  else if( event.type == KeyMapper::PEV_RIGHT)
531    this->bRight = event.bPressed;
532  else if( event.type == KeyMapper::PEV_UP)
533    this->bAscend = event.bPressed; //this->shiftCoor(0,.1,0);
534  else if( event.type == KeyMapper::PEV_DOWN)
535    this->bDescend = event.bPressed; //this->shiftCoor(0,-.1,0);
536  else if( event.type == KeyMapper::PEV_FORWARD)
537    this->bForward = event.bPressed; //this->shiftCoor(0,.1,0);
538  else if( event.type == KeyMapper::PEV_BACKWARD)
539    this->bBackward = event.bPressed; //this->shiftCoor(0,-.1,0);
540  else if( event.type == EV_MOUSE_MOTION)
541  {
542    float xMouse, yMouse;
543    xMouse = event.xRel*mouseSensitivity;
544    yMouse = event.yRel*mouseSensitivity;
545
546    // rotate the Player around the y-axis
547    this->rotation += xMouse;
548
549    this->cameraLook += yMouse;
550    // rotate the Camera around the z-axis
551    if (cameraLook > M_PI_4)
552      cameraLook = M_PI_4;
553    else if (cameraLook < -M_PI_4)
554      cameraLook = -M_PI_4;
555    //this->cameraNode.setRelDirSoft(this->direction,10);
556  }
557}
558
559
560/**
561 *  respawning function called by the GameRules
562 */
563void TurbineHover::respawn( )
564{
565  if( State::isOnline())
566    toList( OM_PLAYERS );
567
568//   this->damageTicker = 0.0f;
569
570  Playable::respawn();
571}
Note: See TracBrowser for help on using the repository browser.