Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/scriptchanges.new/src/world_entities/creatures/fps_player.cc @ 10370

Last change on this file since 10370 was 10370, checked in by snellen, 17 years ago

removed position output

File size: 11.2 KB
RevLine 
[8685]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: Patrick Boenzli
13   co-programmer: ...
14
15*/
16
17#include "fps_player.h"
18
19#include "interactive_model.h"
[8731]20#include "state.h"
[8685]21
22#include "src/lib/util/loading/factory.h"
23
[9110]24#include "md2/md2Model.h"
25
[8776]26#include "weapons/weapon_manager.h"
27#include "weapons/test_gun.h"
28#include "weapons/turret.h"
29#include "weapons/cannon.h"
[8894]30#include "weapons/fps_sniper_rifle.h"
[9235]31#include "weapons/aiming_system.h"
[8776]32
[9110]33#include "aabb.h"
[9869]34#include "bsp_entity.h"
[9110]35
[8685]36#include "key_mapper.h"
37
[8687]38#include "debug.h"
[8685]39
[9110]40#include "shared_network_data.h"
[8685]41
[8687]42
[10114]43
44ObjectListDefinition(FPSPlayer);
[9869]45CREATE_FACTORY(FPSPlayer);
[8731]46
[8894]47#include "script_class.h"
[9869]48CREATE_SCRIPTABLE_CLASS(FPSPlayer,
49                        addMethod("setAbsCoor", Executor3<PNode, lua_State*,float,float,float>(&PNode::setAbsCoor))
50                            ->addMethod("getAbsCoorX", Executor0ret<PNode, lua_State*, float>(&PNode::getAbsCoorX))
51                            ->addMethod("getAbsCoorY", Executor0ret<PNode, lua_State*, float>(&PNode::getAbsCoorY))
52                            ->addMethod("getAbsCoorZ", Executor0ret<PNode, lua_State*, float>(&PNode::getAbsCoorZ))
[8894]53                       );
[8685]54
[8894]55
[8685]56/**
57 *  destructs the FPSPlayer, deletes alocated memory
58 */
59FPSPlayer::~FPSPlayer ()
60{
61  this->setPlayer(NULL);
[9235]62
63  if( this->aimingSystem)
64    delete this->aimingSystem;
[8685]65}
66
67
68/**
69 *  creates a new FPSPlayer from Xml Data
70 * @param root the xml element containing FPSPlayer data
71 *
72 */
73FPSPlayer::FPSPlayer(const TiXmlElement* root)
74{
75  this->init();
76
77  if (root != NULL)
78    this->loadParams(root);
79
80}
81
82
83/**
84 * initializes a FPSPlayer
85 */
86void FPSPlayer::init()
87{
[9869]88  this->registerObject(this, FPSPlayer::_objectList);
[8685]89
90  this->bLeft = false;
91  this->bRight = false;
92  this->bForward = false;
93  this->bBackward = false;
94  this->bJump = false;
[9003]95  this->bPosBut = false;
[9235]96  this->bFire = false;
[8731]97
[8685]98  this->xMouse = 0.0f;
99  this->yMouse = 0.0f;
100
101  this->setHealthMax(100);
102  this->setHealth(80);
103
[9003]104  this->fallVelocity = 0.0f;
[9110]105  this->jumpForce = 0.0f;
[8685]106
[8731]107  this->cameraNode.setParent(this);
108
109  this->attitude = this->getAbsDir().getAttitude();
110  this->heading = this->getAbsDir().getHeading();
111
[8685]112  //add events to the eventlist
113  registerEvent(KeyMapper::PEV_FORWARD);
114  registerEvent(KeyMapper::PEV_BACKWARD);
115  registerEvent(KeyMapper::PEV_LEFT);
116  registerEvent(KeyMapper::PEV_RIGHT);
117  registerEvent(KeyMapper::PEV_FIRE1);
[8687]118  registerEvent(KeyMapper::PEV_JUMP);
[8685]119  registerEvent(EV_MOUSE_MOTION);
120
[10321]121  this->aimingSystem = NULL;
[8685]122
[8776]123  // weapon manager for the fps
[8685]124  dynamic_cast<Element2D*>(this->getWeaponManager().getFixedTarget())->setVisibility( false);
125
[9235]126  if( State::isOnline())
[10316]127  {
128    Weapon* wpRight = new FPSSniperRifle(0);
129    wpRight->setName("testGun Right");
[9235]130    this->addWeapon(wpRight,1, 0);
[10316]131    wpRight->addChild(this->aimingSystem);
132
133    this->toList( OM_PLAYERS );
134  }
135
[10340]136  this->aimingSystem = new AimingSystem(this);
[10316]137
[10340]138
[8776]139  this->getWeaponManager().changeWeaponConfig(1);
140  this->getWeaponManager().setSlotCount(2);
[9235]141  this->getWeaponManager().setSlotDirection(0, Quaternion(M_PI_4*-0.55f, Vector(0,0,1)));
[8776]142  this->getWeaponManager().setSlotCapability(0, WTYPE_ALLDIRS | WTYPE_DIRECTIONAL);
[9110]143  this->getWeaponManager().setSlotDirection(1, Quaternion(M_PI_4*.5, Vector(1,0,0)));
144  this->getWeaponManager().setSlotPosition(0, Vector(1.5, -0.7, 1.1));
[9003]145  this->getWeaponManager().setSlotPosition(1, Vector(5.0, 0.0, 0.0));
[8776]146
[8844]147  this->getWeaponManager().setParentNode(&this->cameraNode);
[8846]148  this->cameraNode.addNodeFlags(PNODE_PROHIBIT_CHILD_DELETE);
149
[8776]150  this->getWeaponManager().getFixedTarget()->setParent(&this->cameraNode);
151  this->getWeaponManager().getFixedTarget()->setRelCoor(1000,0,0);
152
153
[8686]154  // network registration
[8685]155  registerVar( new SynchronizeableBool( &bLeft, &bLeft, "bLeft", PERMISSION_OWNER ) );
156  registerVar( new SynchronizeableBool( &bRight, &bRight, "bRight", PERMISSION_OWNER ) );
157  registerVar( new SynchronizeableBool( &bForward, &bForward, "bForward", PERMISSION_OWNER ) );
158  registerVar( new SynchronizeableBool( &bBackward, &bBackward, "bBackward", PERMISSION_OWNER ) );
[9235]159  registerVar( new SynchronizeableBool( &bJump, &bJump, "bJump", PERMISSION_OWNER ) );
[9110]160  registerVar( new SynchronizeableFloat( &heading, &heading, "heading", PERMISSION_OWNER ) );
161  registerVar( new SynchronizeableFloat( &attitude, &attitude, "attitude", PERMISSION_OWNER ) );
[9235]162
163    //subscribe to collision reaction
[10013]164  this->subscribeReaction(CoRe::CREngine::CR_PHYSICS_FULL_WALK, BspEntity::staticClassID());
[9235]165
166  this->initWeapon = false;
167  this->damageTicker = 0.0f;
[10326]168
[8685]169}
170
171
172/**
173 * loads the Settings of a FPSPlayer from an XML-element.
174 * @param root the XML-element to load the Spaceship's properties from
175 */
176void FPSPlayer::loadParams(const TiXmlElement* root)
177{
178  Playable::loadParams(root);
179}
180
[10316]181
[8685]182void FPSPlayer::setPlayDirection(const Quaternion& quat, float speed)
183{
[8731]184  this->attitude = this->getAbsDir().getAttitude();
185  this->heading = this->getAbsDir().getHeading();
[8685]186}
187
188
189void FPSPlayer::reset()
190{
191  this->bLeft = false;
192  this->bRight = false;
193  this->bForward = false;
194  this->bBackward = false;
195  this->xMouse = 0.0f;
196  this->yMouse = 0.0f;
197
198  this->setHealth(80);
199}
200
201
202void FPSPlayer::enter()
203{
[8731]204  dynamic_cast<Element2D*>(this->getWeaponManager().getFixedTarget())->setVisibility( true );
205
206  State::getCameraNode()->setParentSoft(&this->cameraNode);
207  State::getCameraTargetNode()->setParentSoft(&this->cameraNode);
208
209  this->getWeaponManager().getFixedTarget()->setParent(State::getCameraTargetNode());
210  this->getWeaponManager().getFixedTarget()->setRelCoor(0,0,0);
211
[9235]212  if ( !State::isOnline() )
[9110]213  {
[9235]214    this->respawn();
[9110]215  }
[8685]216}
217
218void FPSPlayer::leave()
219{
220  dynamic_cast<Element2D*>(this->getWeaponManager().getFixedTarget())->setVisibility( false);
221  this->detachCamera();
222}
223
224
225
226/**
227 *  the function called for each passing timeSnap
228 * @param time The timespan passed since last update
229 */
230void FPSPlayer::tick (float time)
231{
[9110]232
[9235]233  if ( !this->initWeapon )
[9003]234  {
[9235]235    this->initWeapon = true;
236
237    this->cameraNode.setParentMode(PNODE_ROTATE_AND_MOVE);
238
239    this->getWeaponManager().getParentNode()->setParentMode(PNODE_ROTATE_AND_MOVE);
240    this->getWeaponManager().getFixedTarget()->setParent(&this->cameraNode);
241    this->getWeaponManager().getFixedTarget()->setParentMode(PNODE_ROTATE_AND_MOVE);
242
243
[10340]244    if( this->aimingSystem != NULL)
245    {
246      this->aimingSystem->toList(OM_GROUP_01);
247      this->aimingSystem->setParent(&this->cameraNode);
248  //     this->aimingSystem->setParentMode(PNODE_ROTATE_AND_MOVE);
249      this->aimingSystem->setRelDir(Quaternion(M_PI_4*-0.58f, Vector(0,0,1)));
250      this->aimingSystem->setRelCoor(0, -1, -1);
251    }
[9235]252
253
254    AABB* box = this->getModelAABB();
255    if( box != NULL)
256    {
257      float f = 1.0;
258      this->cameraNode.setRelCoor(0, box->halfLength[1] * f, 0);
259//       this->cameraNode.setRelCoor(10, box->halfLength[1] * f, 0);
260
261      float v = 0.1f;
262      this->getWeaponManager().setSlotPosition(0, Vector(-8.0, box->halfLength[1] * v, 1.1));
263      this->getWeaponManager().setSlotPosition(1, Vector(5.0, box->halfLength[1] * v, 0.0));
264    }
[9003]265  }
[9110]266
[8685]267
[9235]268  this->getWeaponManager().tick(time);
269  if( this->bFire)
270  {
271    this->getWeaponManager().fire();
272  }
273
274
275  //dealing damage
[9494]276  if ( State::isOnline() && (SharedNetworkData::getInstance()->isMasterServer() /*|| SharedNetworkData::getInstance()->isProxyServerActive()*/))
[9235]277  {
278    this->damageTicker -= time;
279
280    if ( this->damageTicker <= 0.0f && this->beFire() )
281    {
282      this->damageTicker = 0.25;
283
284      WorldEntity * victim = aimingSystem->getNearestTarget();
285
286      if ( victim )
287      {
[9406]288        PRINTF(0)("FIRE: hit %s\n", victim->getClassCName());
[9235]289        victim->hit( 20, this );
290      }
291      else
292      {
293        PRINTF(0)("FIRE: nothing hit\n");
294      }
295    }
296  }
297
298
[9110]299  if( ( xMouse != 0 || yMouse != 0 ) && (this->getOwner() == SharedNetworkData::getInstance()->getHostID() || !State::isOnline() ) )
[8685]300  {
[8687]301    xMouse *= time ;
302    yMouse *= time ;
[8685]303
[10340]304    heading -= xMouse/5.;
305    attitude-= yMouse/5.;
[8685]306
307
[9235]308    if ( attitude > 1.95 )
309      attitude = 1.95;
310    else if ( attitude < -1.07 )
311      attitude = -1.07;
[8685]312
313    xMouse = yMouse = 0;
314  }
315
[9110]316  this->setAbsDir(Quaternion(heading, Vector(0,1,0)));
[10331]317  this->cameraNode.setRelDir(Quaternion( attitude, Vector( 0, 0, 1 ) ));
[8685]318
319  Vector velocity;
320
321  if ( this->bForward )
322  {
323    velocity += this->getAbsDirX();
324  }
325
326  if ( this->bBackward )
327  {
328    velocity -= this->getAbsDirX();
329  }
330
331  if ( this->bRight )
332  {
333    velocity += this->getAbsDirZ();
334  }
335
336  if ( this->bLeft )
337  {
338    velocity -= this->getAbsDirZ();
339  }
340
[9003]341
[8685]342  velocity *= 100;
343
[10331]344  if( this->getModel( 0) != NULL && this->getModel(0)->isA(InteractiveModel::staticClassID()))
[9110]345  {
[10326]346    if( this->bJump)
[9110]347    {
[10326]348      if( this->jumpForce < 1.0f)
349      {
350        this->jumpForce = 300.0f;
[9003]351
[10326]352        if( ((InteractiveModel*)this->getModel(0))->getAnimation() != JUMP)
353          ((InteractiveModel*)this->getModel(0))->setAnimation(JUMP);
354      }
[9110]355    }
[10326]356    else if(velocity.len() != 0.0f)
357    {
358      if( ((InteractiveModel*)this->getModel(0))->getAnimation() != RUN)
359        ((InteractiveModel*)this->getModel(0))->setAnimation(RUN);
360    }
361    else
362    {
363      if( ((InteractiveModel*)this->getModel(0))->getAnimation() != STAND)
364        ((InteractiveModel*)this->getModel(0))->setAnimation(STAND);
365    }
[9110]366  }
367
368
369  velocity.y += this->jumpForce;
370  if( this->jumpForce > 1.0f)
371    this->jumpForce *= 0.9f;
372
373
[9003]374  // physical falling of the player
[10340]375  if( !this->isOnGround())
[9003]376  {
377    this->fallVelocity += 300.0f * time;
378    velocity -= Vector(0.0, 1.0, 0.0) * this->fallVelocity;
[9235]379
380//     PRINTF(0)("vel %f\n", this->fallVelocity);
[9003]381  }
382  else
383  {
384    this->fallVelocity = 0.0f;
385  }
386
[8685]387  this->shiftCoor( velocity*time );
388
389
390
391
[9003]392
393
394
[10114]395  if( likely(this->getModel(0) != NULL) && this->getModel(0)->isA(InteractiveModel::staticClassID()))
[8693]396  {
397    ((InteractiveModel*)this->getModel(0))->tick(time);
398  }
[8685]399
[9235]400  this->setOnGround(false);
[10326]401  if( this->aimingSystem != NULL)
402    this->aimingSystem->flushList();
[8685]403}
404
405
406
[8686]407/**
408 *  draws the MD2Creature after transforming it.
409 */
410void FPSPlayer::draw () const
411{
412  // only draw if this entity is not the player since the player nevers sees himself
[8699]413  if( this->getCurrentPlayer() == NULL)
[8686]414    WorldEntity::draw();
415}
[8685]416
417
418
419/**
[8686]420 * process
[8685]421 */
422void FPSPlayer::process(const Event &event)
423{
424  Playable::process(event);
425
426  if( event.type == KeyMapper::PEV_LEFT)
427    this->bLeft = event.bPressed;
428  else if( event.type == KeyMapper::PEV_RIGHT)
429    this->bRight = event.bPressed;
430  else if( event.type == KeyMapper::PEV_FORWARD)
431    this->bForward = event.bPressed; //this->shiftCoor(0,.1,0);
432  else if( event.type == KeyMapper::PEV_BACKWARD)
433    this->bBackward = event.bPressed; //this->shiftCoor(0,-.1,0);
434  else if( event.type == EV_MOUSE_MOTION)
435  {
436    this->xMouse += event.xRel;
437    this->yMouse += event.yRel;
438  }
[8705]439  else if( event.type == KeyMapper::PEV_JUMP)
[9235]440  {
[9110]441    this->bJump = event.bPressed;
[9235]442  }
443  else if( event.type == KeyMapper::PEV_FIRE1)
444  {
445    this->bFire = event.bPressed;
446  }
[8685]447}
448
449
[9235]450void FPSPlayer::respawn( )
451{
452  if( State::isOnline())
453    toList( OM_PLAYERS );
[8685]454
[9235]455  this->damageTicker = 0.0f;
[8685]456
[9235]457  Playable::respawn();
458}
459
460
461void FPSPlayer::destroy( WorldEntity* killer )
462{
463  Playable::destroy( killer );
464
465  toList( OM_DEAD );
466}
467
Note: See TracBrowser for help on using the repository browser.