Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/questsystem5/src/orxonox/objects/worldentities/pawns/Pawn.cc @ 2908

Last change on this file since 2908 was 2908, checked in by dafrick, 16 years ago

Reverted to revision 2906 (because I'm too stupid to merge correctly, 2nd try will follow shortly. ;))

  • Property svn:eol-style set to native
File size: 9.1 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 *      ...
26 *
27 */
28
29#include "OrxonoxStableHeaders.h"
30#include "Pawn.h"
31
32#include "core/Core.h"
33#include "core/CoreIncludes.h"
34#include "core/XMLPort.h"
35#include "util/Math.h"
36#include "PawnManager.h"
37#include "objects/infos/PlayerInfo.h"
38#include "objects/gametypes/Gametype.h"
39#include "objects/worldentities/ParticleSpawner.h"
40#include "objects/worldentities/ExplosionChunk.h"
41
42namespace orxonox
43{
44    CreateFactory(Pawn);
45
46    Pawn::Pawn(BaseObject* creator) : ControllableEntity(creator)
47    {
48        RegisterObject(Pawn);
49
50        PawnManager::touch();
51        this->bAlive_ = true;
52        this->fire_ = 0x0;
53        this->firehack_ = 0x0;
54
55        this->health_ = 0;
56        this->maxHealth_ = 0;
57        this->initialHealth_ = 0;
58
59        this->lastHitOriginator_ = 0;
60
61        this->spawnparticleduration_ = 3.0f;
62
63        this->getPickUp().setPlayer(this);
64
65        if (Core::isMaster())
66        {
67            this->weaponSystem_ = new WeaponSystem(this);
68            this->weaponSystem_->setParentPawn(this);
69        }
70        else
71            this->weaponSystem_ = 0;
72
73        this->setRadarObjectColour(ColourValue::Red);
74        this->setRadarObjectShape(RadarViewable::Dot);
75
76        this->registerVariables();
77    }
78
79    Pawn::~Pawn()
80    {
81        if (this->isInitialized())
82        {
83            for (ObjectList<PawnListener>::iterator it = ObjectList<PawnListener>::begin(); it != ObjectList<PawnListener>::end(); ++it)
84                it->destroyedPawn(this);
85
86            if (this->weaponSystem_)
87                delete this->weaponSystem_;
88        }
89    }
90
91    void Pawn::XMLPort(Element& xmlelement, XMLPort::Mode mode)
92    {
93        SUPER(Pawn, XMLPort, xmlelement, mode);
94
95        XMLPortParam(Pawn, "health", setHealth, getHealth, xmlelement, mode).defaultValues(100);
96        XMLPortParam(Pawn, "maxhealth", setMaxHealth, getMaxHealth, xmlelement, mode).defaultValues(200);
97        XMLPortParam(Pawn, "initialhealth", setInitialHealth, getInitialHealth, xmlelement, mode).defaultValues(100);
98        XMLPortParam(Pawn, "spawnparticlesource", setSpawnParticleSource, getSpawnParticleSource, xmlelement, mode);
99        XMLPortParam(Pawn, "spawnparticleduration", setSpawnParticleDuration, getSpawnParticleDuration, xmlelement, mode).defaultValues(3.0f);
100        XMLPortParam(Pawn, "explosionchunks", setExplosionChunks, getExplosionChunks, xmlelement, mode).defaultValues(7);
101
102        XMLPortObject(Pawn, WeaponSlot, "weaponslots", setWeaponSlot, getWeaponSlot, xmlelement, mode);
103        XMLPortObject(Pawn, WeaponSet, "weaponsets", setWeaponSet, getWeaponSet, xmlelement, mode);
104        XMLPortObject(Pawn, WeaponPack, "weapons", setWeaponPack, getWeaponPack, xmlelement, mode);
105    }
106
107    void Pawn::registerVariables()
108    {
109        registerVariable(this->bAlive_,        variableDirection::toclient);
110        registerVariable(this->health_,        variableDirection::toclient);
111        registerVariable(this->initialHealth_, variableDirection::toclient);
112        registerVariable(this->fire_,          variableDirection::toserver);
113    }
114
115    void Pawn::tick(float dt)
116    {
117        SUPER(Pawn, tick, dt);
118
119        if (this->weaponSystem_)
120        {
121            if (this->fire_ & WeaponMode::fire)
122                this->weaponSystem_->fire(WeaponMode::fire);
123            if (this->fire_ & WeaponMode::altFire)
124                this->weaponSystem_->fire(WeaponMode::altFire);
125            if (this->fire_ & WeaponMode::altFire2)
126                this->weaponSystem_->fire(WeaponMode::altFire2);
127        }
128        this->fire_ = this->firehack_;
129        this->firehack_ = 0x0;
130
131        if (this->health_ <= 0)
132            this->death();
133    }
134
135    void Pawn::setHealth(float health)
136    {
137        this->health_ = min(health, this->maxHealth_);
138    }
139
140    void Pawn::damage(float damage, Pawn* originator)
141    {
142        this->setHealth(this->health_ - damage);
143        this->lastHitOriginator_ = originator;
144
145        // play damage effect
146    }
147
148    void Pawn::hit(Pawn* originator, const Vector3& force, float damage)
149    {
150        this->damage(damage, originator);
151        this->setVelocity(this->getVelocity() + force);
152
153        // play hit effect
154    }
155
156    void Pawn::kill()
157    {
158        this->damage(this->health_);
159        this->death();
160    }
161
162    void Pawn::spawneffect()
163    {
164        // play spawn effect
165        if (this->spawnparticlesource_ != "")
166        {
167            ParticleSpawner* effect = new ParticleSpawner(this->getCreator());
168            effect->setPosition(this->getPosition());
169            effect->setOrientation(this->getOrientation());
170            effect->setDestroyAfterLife(true);
171            effect->setSource(this->spawnparticlesource_);
172            effect->setLifetime(this->spawnparticleduration_);
173        }
174    }
175
176    void Pawn::death()
177    {
178        // Set bAlive_ to false and wait for PawnManager to do the destruction
179        this->bAlive_ = false;
180
181        this->setDestroyWhenPlayerLeft(false);
182
183        if (this->getGametype())
184            this->getGametype()->pawnKilled(this, this->lastHitOriginator_);
185
186        if (this->getPlayer())
187            this->getPlayer()->stopControl(this);
188
189        if (Core::isMaster())
190            this->deatheffect();
191    }
192
193    void Pawn::deatheffect()
194    {
195        // play death effect
196        {
197            ParticleSpawner* effect = new ParticleSpawner(this->getCreator());
198            effect->setPosition(this->getPosition());
199            effect->setOrientation(this->getOrientation());
200            effect->setDestroyAfterLife(true);
201            effect->setSource("Orxonox/explosion2b");
202            effect->setLifetime(4.0f);
203        }
204        {
205            ParticleSpawner* effect = new ParticleSpawner(this->getCreator());
206            effect->setPosition(this->getPosition());
207            effect->setOrientation(this->getOrientation());
208            effect->setDestroyAfterLife(true);
209            effect->setSource("Orxonox/smoke6");
210            effect->setLifetime(4.0f);
211        }
212        {
213            ParticleSpawner* effect = new ParticleSpawner(this->getCreator());
214            effect->setPosition(this->getPosition());
215            effect->setOrientation(this->getOrientation());
216            effect->setDestroyAfterLife(true);
217            effect->setSource("Orxonox/sparks");
218            effect->setLifetime(4.0f);
219        }
220        for (unsigned int i = 0; i < this->numexplosionchunks_; ++i)
221        {
222            ExplosionChunk* chunk = new ExplosionChunk(this->getCreator());
223            chunk->setPosition(this->getPosition());
224
225        }
226    }
227
228    void Pawn::fire(WeaponMode::Enum fireMode)
229    {
230        this->firehack_ |= fireMode;
231    }
232
233    void Pawn::postSpawn()
234    {
235        this->setHealth(this->initialHealth_);
236        if (Core::isMaster())
237            this->spawneffect();
238    }
239
240    void Pawn::dropItems()
241    {
242        pickUp.eraseAll();
243    }
244
245    void Pawn::setWeaponSlot(WeaponSlot * wSlot)
246    {
247        this->attach(wSlot);
248        if (this->weaponSystem_)
249            this->weaponSystem_->attachWeaponSlot(wSlot);
250    }
251
252    WeaponSlot * Pawn::getWeaponSlot(unsigned int index) const
253    {
254        if (this->weaponSystem_)
255            return this->weaponSystem_->getWeaponSlotPointer(index);
256        else
257            return 0;
258    }
259
260    void Pawn::setWeaponPack(WeaponPack * wPack)
261    {
262        if (this->weaponSystem_)
263        {
264            wPack->setParentWeaponSystem(this->weaponSystem_);
265            wPack->setParentWeaponSystemToAllWeapons(this->weaponSystem_);
266            this->weaponSystem_->attachWeaponPack( wPack,wPack->getFireMode() );
267            wPack->attachNeededMunitionToAllWeapons();
268        }
269    }
270
271    WeaponPack * Pawn::getWeaponPack(unsigned int firemode) const
272    {
273        if (this->weaponSystem_)
274            return this->weaponSystem_->getWeaponPackPointer(firemode);
275        else
276            return 0;
277    }
278
279    void Pawn::setWeaponSet(WeaponSet * wSet)
280    {
281        if (this->weaponSystem_)
282            this->weaponSystem_->attachWeaponSet(wSet);
283    }
284
285    WeaponSet * Pawn::getWeaponSet(unsigned int index) const
286    {
287        if (this->weaponSystem_)
288            return this->weaponSystem_->getWeaponSetPointer(index);
289        else
290            return 0;
291    }
292
293
294    ///////////////////
295    // Pawn Listener //
296    ///////////////////
297    PawnListener::PawnListener()
298    {
299        RegisterRootObject(PawnListener);
300    }
301}
Note: See TracBrowser for help on using the repository browser.