Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/world_entities/npcs/network_turret.cc @ 10244

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

merged network back to trunk

File size: 4.3 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: Manuel Leuenberger
13   co-programmer: ...
14*/
15
16#include "network_turret.h"
17#include "model.h"
18#include "world_entities/weapons/turret.h"
19
20#include "state.h"
21#include "playable.h"
22#include "player.h"
23
24
25#include "util/loading/factory.h"
26#include "network_game_manager.h"
27#include "util/loading/load_param.h"
28
29#include "effects/explosion.h"
30
31#include "weapons/aiming_turret.h"
32#include "debug.h"
33
34
35ObjectListDefinition(NetworkTurret);
36CREATE_FACTORY(NetworkTurret);
37
38
39/**
40 * constructs and loads a NetworkTurret from a XML-element
41 * @param root the XML-element to load from
42 */
43NetworkTurret::NetworkTurret(const TiXmlElement* root)
44    : NPC(root)
45{
46  this->init();
47  if (root != NULL)
48    this->loadParams(root);
49}
50
51
52/**
53 * standard deconstructor
54 */
55NetworkTurret::~NetworkTurret ()
56{}
57
58
59/**
60 * initializes the NetworkTurret
61 * @todo change this to what you wish
62 */
63void NetworkTurret::init()
64{
65  this->registerObject(this, NetworkTurret::_objectList);
66  this->loadModel("models/ground_turret_#.obj", 5);
67
68  this->weapon = new AimingTurret();
69  this->weapon->loadModel("models/guns/turret2.obj", 10);
70  this->weapon->setParent(this);
71  this->weapon->toList(this->getOMListNumber());
72  this->weapon->setRelCoor(0,10,-5);
73  this->weapon->requestAction( WA_ACTIVATE);
74  this->weapon->setParent(&this->weaponHolder);
75
76  this->setHealthMax(300);
77  this->setHealth(300);
78
79  this->weaponHolder.addNodeFlags(PNODE_PROHIBIT_DELETE_WITH_PARENT);
80
81  this->weaponHolder.setRelCoor(0,25,0);
82  this->weaponHolder.setParent(this);
83
84
85  this->targetGroup = OM_GROUP_01;
86  this->targetGroup_write = OM_GROUP_01;
87  this->targetGroup_handle = this->registerVarId( new SynchronizeableInt ( &targetGroup, &targetGroup_write, "targetgroup", PERMISSION_MASTER_SERVER ) );
88
89  this->setSynchronized( true );
90}
91
92
93/**
94 * @brief loads a NetworkTurret from a XML-element
95 * @param root the XML-element to load from
96 * @todo make the class Loadable
97 */
98void NetworkTurret::loadParams(const TiXmlElement* root)
99{
100  // all the clases this Entity is directly derived from must be called in this way, to load all settings.
101  NPC::loadParams(root);
102
103  LoadParam(root, "target-group", this, NetworkTurret, setTargetGroupS);
104}
105
106/**
107 * advances the NetworkTurret about time seconds
108 * @param time the Time to step
109 */
110void NetworkTurret::tick(float dt)
111{
112  ObjectManager::EntityList::iterator entity;
113  Vector diffVec;
114  for (entity = State::getObjectManager()->getEntityList((OM_LIST)this->targetGroup).begin();
115       entity != State::getObjectManager()->getEntityList((OM_LIST)this->targetGroup).end();
116       entity ++)
117  {
118    diffVec = ( (*entity)->getAbsCoor() - this->getAbsCoor() );
119
120    if ( diffVec.len() < 400.0 )//&&  acos( (this->source->getAbsDirX()).dot(diffVec)/(diffVec.len() * (this->source->getAbsDirX()).len() ) )  < angle)
121    {
122      //if (this->getParent() != (*entity))
123      {
124        this->weapon->requestAction(WA_SHOOT);
125        return;
126      }
127    }
128  }
129}
130
131/**
132 * draws this worldEntity
133 */
134void NetworkTurret::draw () const
135{
136  WorldEntity::draw();
137
138  if (this->weapon != NULL)
139    this->weapon->draw();
140}
141
142void NetworkTurret::setTargetGroup(int targetGroup)
143{
144  this->targetGroup = targetGroup;
145  this->weapon->setTargetGroup((OM_LIST)targetGroup);
146}
147
148
149void NetworkTurret::setTargetGroupS(const std::string& groupName)
150{
151  OM_LIST id = ObjectManager::StringToOMList(groupName);
152  if (id != OM_NULL)
153    this->setTargetGroup(id);
154  else
155    PRINTF(2)("List %s not found for targetting\n", groupName.c_str());
156}
157
158void NetworkTurret::varChangeHandler( std::list< int > & id )
159{
160  WorldEntity::varChangeHandler( id );
161
162  if ( std::find( id.begin(), id.end(), targetGroup_handle) != id.end() )
163  {
164    setTargetGroup( targetGroup_write );
165  }
166}
167
168/**
169 *
170 *
171 */
172void NetworkTurret::postSpawn ()
173{}
174
175/**
176 *
177 *
178 */
179void NetworkTurret::leftWorld ()
180{}
181
182void NetworkTurret::destroy(WorldEntity* killer)
183{
184  this->setAbsDirSoft(Quaternion(-90, Vector(0,0,1)), 90);
185  Explosion::explode(this, Vector(10,10,10));
186
187  this->toList(OM_DEAD);
188}
Note: See TracBrowser for help on using the repository browser.