Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/presentationHS15/src/orxonox/items/ShipPart.cc @ 11043

Last change on this file since 11043 was 10962, checked in by maxima, 9 years ago

Merged presentation and exlposionChunks branches. Works fine. Added explosion parts to hovership.

  • Property svn:eol-style set to native
File size: 8.8 KB
RevLine 
[10019]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 *      Noe Pedrazzini
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#include "ShipPart.h"
30
31#include <algorithm>
32
33#include "core/CoreIncludes.h"
34#include "core/GameMode.h"
35#include "core/XMLPort.h"
36#include "network/NetworkFunction.h"
37#include "Item.h"
38#include "worldentities/pawns/Pawn.h"
[10023]39#include "worldentities/pawns/ModularSpaceShip.h"
[10019]40#include "gametypes/Gametype.h"
41#include "worldentities/StaticEntity.h"
[10052]42#include "items/PartDestructionEvent.h"
[10067]43#include "chat/ChatManager.h"
[10019]44
45
46namespace orxonox
47{
48    RegisterClass(ShipPart);
49
50    ShipPart::ShipPart(Context* context)
[10624]51        : Item(context), parent_(NULL)
[10019]52    {
53        RegisterObject(ShipPart);
[10624]54        this->eventExecution_ = true;
[10071]55        this->healthMem_ = 100;
[10019]56    }
57
58    ShipPart::~ShipPart()
59    {
[10624]60        if (this->parent_)
61        {
62            // Remove this ShipPart from the parent.
63            this->parent_->removeShipPart(this);
64        }
[10019]65    }
66
[10023]67    void ShipPart::XMLPort(Element& xmlelement, XMLPort::Mode mode)
68    {
69        SUPER(ShipPart, XMLPort, xmlelement, mode);
[10019]70
[10023]71        XMLPortParam(ShipPart, "health", setHealth, getHealth, xmlelement, mode).defaultValues(100);
72        XMLPortParam(ShipPart, "maxhealth", setMaxHealth, getMaxHealth, xmlelement, mode).defaultValues(200);
73        XMLPortParam(ShipPart, "initialhealth", setInitialHealth, getInitialHealth, xmlelement, mode).defaultValues(100);
74
75        XMLPortParam(ShipPart, "damageabsorption", setDamageAbsorption, getDamageAbsorption, xmlelement, mode).defaultValues(0.5);
76
[10067]77        XMLPortParamTemplate(ShipPart, "explosionposition", setExplosionPosition, getExplosionPosition, xmlelement, mode, Vector3);
78
[10052]79        XMLPortObject(ShipPart, PartDestructionEvent, "destructionevents", addDestructionEvent, getDestructionEvent, xmlelement, mode);
[10023]80    }
81
[10055]82    /**
83    @brief
84        Is called when the ShipPart dies.
85        Executes PartDestructionEvents.
86        Tells the ModularSpaceShip to remove this ShipPart.
87    */
[10023]88    void ShipPart::death()
89    {
[10067]90        this->explode();
[10053]91
[10058]92        if(eventExecution_)
[10053]93        {
[10058]94            // Execute all destruction events
95            for (unsigned int i = 0; i < this->eventList_.size(); i++)
96            {
97                this->getDestructionEvent(i)->execute();
98            }
[10053]99        }
100
[10624]101        this->destroyLater();
[10023]102    }
103
[10067]104    void ShipPart::explode()
105    {
[10962]106        // BigExplosion* chunk = new BigExplosion(this->getContext());
107        // chunk->setPosition(this->parent_->getPosition() + this->parent_->getOrientation() * (this->explosionPosition_));
108        // //chunk->setPosition(this->parent_->getPosition() + this->parent_->getOrientation() * Vector3(this->entityList_[0]->getLocalInertia()));
109        // chunk->setVelocity(this->parent_->getVelocity());
[10067]110
111        // this->explosionSound_->setPosition(this->parent_->getPosition());
112        // this->explosionSound_->play();
113    }
114
[10019]115    /**
116    @brief
117        Add a StaticEntity to the ShipPart.
118    @param engine
119        A pointer to the StaticEntity to be added.
120    */
121    void ShipPart::addEntity(StaticEntity* entity)
122    {
123        OrxAssert(entity != NULL, "The Entity cannot be NULL.");
124        this->entityList_.push_back(entity);
125    }
126
127    /**
128    @brief
129        Get the i-th StaticEntity of the ShipPart.
130    @return
131        Returns a pointer to the i-the StaticEntity. NULL if there is no StaticEntity with that index.
132    */
133    StaticEntity* ShipPart::getEntity(unsigned int index)
134    {
135        if(this->entityList_.size() >= index)
136            return NULL;
137        else
138            return this->entityList_[index];
139    }
140
141    /**
142    @brief
143        Check whether the ShipPart has a particular Entity.
144    @param engine
145        A pointer to the Entity to be checked.
146    */
147    bool ShipPart::hasEntity(StaticEntity* entity) const
148    {
149        for(unsigned int i = 0; i < this->entityList_.size(); i++)
150        {
151            if(this->entityList_[i] == entity)
152                return true;
153        }
154        return false;
155    }
156
[10052]157    /**
158    @brief
159        Add a PartDestructionEvent to the ShipPart.
160    @param engine
161        A pointer to the PartDestructionEvent to be added.
162    */
[10053]163    void ShipPart::addDestructionEvent(PartDestructionEvent* event)
[10052]164    {
[10053]165        OrxAssert(event != NULL, "The PartDestructionEvent cannot be NULL.");
166        event->setParent(this);
167        this->eventList_.push_back(event);
[10052]168    }
169
170    /**
171    @brief
172        Get the i-th PartDestructionEvent of the ShipPart.
173    @return
174        Returns a pointer to the i-the PartDestructionEvent. NULL if there is no PartDestructionEvent with that index.
175    */
176    PartDestructionEvent* ShipPart::getDestructionEvent(unsigned int index)
177    {
[10053]178        if(this->eventList_.size() <= index)
[10052]179            return NULL;
180        else
181            return this->eventList_[index];
182    }
183
[10019]184    void ShipPart::setDamageAbsorption(float value)
185    {
186        this->damageAbsorption_ = value;
187    }
188
[10023]189    void ShipPart::setParent(ModularSpaceShip* ship)
190    {
191        this->parent_ = ship;
192    }
193
[10019]194    /**
195    @brief
196        Sets the health of the ShipPart.
197    */
198    void ShipPart::setHealth(float health)
199    {
200        this->health_ = health;
201    }
202
203    /**
204    @brief
205        Handles a received hit.
206    */
207    void ShipPart::handleHit(float damage, float healthdamage, float shielddamage, Pawn* originator)
208    {
209        if (parent_->getGametype() && parent_->getGametype()->allowPawnDamage(parent_, originator))
210        {
211            if (shielddamage >= parent_->getShieldHealth())
212            {
213                parent_->setShieldHealth(0);
214                this->setHealth(this->health_ - (healthdamage + damage) * this->damageAbsorption_);
215                parent_->setHealth(parent_->getHealth() - (healthdamage + damage) * (1 - this->damageAbsorption_));
216            }
217            else
218            {
219                parent_->setShieldHealth(parent_->getShieldHealth() - shielddamage);
220
221                // remove remaining shieldAbsorpton-Part of damage from shield
222                shielddamage = damage * parent_->getShieldAbsorption();
223                shielddamage = std::min(parent_->getShieldHealth(),shielddamage);
224                parent_->setShieldHealth(parent_->getShieldHealth() - shielddamage);
225
226                // set remaining damage to health
227                this->setHealth(this->health_ - ((damage - shielddamage) - healthdamage) * this->damageAbsorption_);
228                parent_->setHealth(parent_->getHealth() - ((damage - shielddamage) - healthdamage) * (1- this->damageAbsorption_));
229            }
230        }
[10023]231        if (this->health_ < 0)
[10624]232            this->death();
[10067]233
234        // (Ugly) Chatoutput of health, until a GUI for modularspaceships-shipparts is implemented.
[10071]235        if ((this->health_ < 0.2 * this->maxHealth_) && (this->healthMem_ == 40))
[10067]236        {
[10071]237            this->healthMem_ = 20;
[10067]238            ChatManager::message("ShipPart " + this->getName() + " remaining health is 20%!");
239            return;
240        }
[10071]241        if ((this->health_ < 0.4 * this->maxHealth_) && (this->healthMem_ == 60))
[10067]242        {
[10071]243            this->healthMem_ = 40;
[10067]244            ChatManager::message("ShipPart " + this->getName() + " remaining health is 40%!");
245            return;
246        }
[10071]247        if ((this->health_ < 0.6 * this->maxHealth_) && (this->healthMem_ == 80))
[10067]248        {
[10071]249            this->healthMem_ = 60;
[10067]250            ChatManager::message("ShipPart " + this->getName() + " remaining health is 60%!");
251            return;
252        }
[10071]253        if ((this->health_ < 0.8 * this->maxHealth_) && (this->healthMem_ == 100))
[10067]254        {
[10071]255            this->healthMem_ = 80;
[10067]256            ChatManager::message("ShipPart " + this->getName() + " remaining health is 80%!");
257            return;
258        }
[10019]259    }
260
261
262    /**
263    @brief
264        Adds the ShipPart to the input SpaceShip.
265    @param ship
266        A pointer to the SpaceShip to which the ShipPart is added.
267    */
268    /*void ShipPart::addToSpaceShip(ModularSpaceShip* ship)
269    {
270        this->parent_ = ship;
271
272        if (ship)
273        {
274            this->parentID_ = ship->getObjectID();
275            if (!ship->hasShipPart(this))
276                ship->addShipPart(this);
277        }
278    }*/
279
280}
Note: See TracBrowser for help on using the repository browser.