Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/presentation3/src/orxonox/controllers/NewHumanController.cc @ 7107

Last change on this file since 7107 was 7079, checked in by landauf, 14 years ago

fixed a bug in NewHumanController - Ogre::any_cast can fail after raytracing (occurred in fps levels when looking at the floor - maybe someone can check why this happens)

  • Property svn:eol-style set to native
File size: 23.6 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 *      Michael Wirth
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#include "NewHumanController.h"
30
31#include <cmath>
32#include <OgreRay.h>
33#include <OgreSceneQuery.h>
34#include <OgreCamera.h>
35#include <OgreSceneManager.h>
36#include <bullet/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h>
37
38#include "core/CoreIncludes.h"
39#include "core/ConsoleCommand.h"
40#include "worldentities/ControllableEntity.h"
41#include "worldentities/pawns/Pawn.h"
42#include "infos/PlayerInfo.h"
43#include "overlays/OrxonoxOverlay.h"
44#include "graphics/Camera.h"
45#include "sound/SoundManager.h"
46#include "tools/BulletConversions.h"
47#include "Scene.h"
48
49namespace orxonox
50{
51    SetConsoleCommand(NewHumanController, changeMode, false).keybindMode(KeybindMode::OnPress);
52    SetConsoleCommand(NewHumanController, accelerate, false).keybindMode(KeybindMode::OnPress);
53    SetConsoleCommand(NewHumanController, decelerate, false).keybindMode(KeybindMode::OnPress);
54    SetConsoleCommand(NewHumanController, unfire,      true).keybindMode(KeybindMode::OnRelease);
55
56    CreateUnloadableFactory(NewHumanController);
57
58    NewHumanController* NewHumanController::localController_s = 0;
59
60    NewHumanController::NewHumanController(BaseObject* creator)
61        : HumanController(creator)
62        , crossHairOverlay_(NULL)
63        , centerOverlay_(NULL)
64        , damageOverlayTop_(NULL)
65        , damageOverlayRight_(NULL)
66        , damageOverlayBottom_(NULL)
67        , damageOverlayLeft_(NULL)
68        , damageOverlayTT_(0)
69        , arrowsOverlay1_(NULL)
70        , arrowsOverlay2_(NULL)
71        , arrowsOverlay3_(NULL)
72        , arrowsOverlay4_(NULL)
73    {
74        RegisterObject(NewHumanController);
75
76        overlaySize_ = 0.08f;
77        arrowsSize_ = 0.4f;
78
79        damageOverlayTime_ = 0.6f;
80
81        controlMode_ = 0;
82        acceleration_ = 0;
83        accelerating_ = false;
84        firemode_ = -1;
85
86        showArrows_ = true;
87        showOverlays_ = false;
88        showDamageOverlay_ = true;
89
90        //currentPitch_ = 1;
91        //currentYaw_ = 1;
92
93        if (GameMode::showsGraphics())
94        {
95            crossHairOverlay_ = new OrxonoxOverlay(this);
96            crossHairOverlay_->setBackgroundMaterial("Orxonox/Crosshair3");
97            crossHairOverlay_->setSize(Vector2(overlaySize_, overlaySize_));
98            crossHairOverlay_->hide();
99            //crossHairOverlay_->setAspectCorrection(true); not working
100
101            centerOverlay_ = new OrxonoxOverlay(this);
102            centerOverlay_->setBackgroundMaterial("Orxonox/CenterOverlay");
103            centerOverlay_->setSize(Vector2(overlaySize_ * 2.5f, overlaySize_ * 2.5f));
104            centerOverlay_->setPosition(Vector2(0.5f - overlaySize_*2.5f/2.0f, 0.5f - overlaySize_*2.5f/2.0f));
105            centerOverlay_->hide();
106
107            if (showDamageOverlay_)
108            {
109                damageOverlayTop_ = new OrxonoxOverlay(this);
110                damageOverlayTop_->setBackgroundMaterial("Orxonox/DamageOverlayTop");
111                damageOverlayTop_->setSize(Vector2(overlaySize_ * 2.5f, overlaySize_ * 2.5f));
112                damageOverlayTop_->setPosition(Vector2(0.5f - overlaySize_*2.5f/2.0f, 0.5f - overlaySize_*2.5f/2.0f));
113                damageOverlayTop_->hide();
114
115                damageOverlayRight_ = new OrxonoxOverlay(this);
116                damageOverlayRight_->setBackgroundMaterial("Orxonox/DamageOverlayRight");
117                damageOverlayRight_->setSize(Vector2(overlaySize_ * 2.5f, overlaySize_ * 2.5f));
118                damageOverlayRight_->setPosition(Vector2(0.5f - overlaySize_*2.5f/2.0f, 0.5f - overlaySize_*2.5f/2.0f));
119                damageOverlayRight_->hide();
120
121                damageOverlayBottom_ = new OrxonoxOverlay(this);
122                damageOverlayBottom_->setBackgroundMaterial("Orxonox/DamageOverlayBottom");
123                damageOverlayBottom_->setSize(Vector2(overlaySize_ * 2.5f, overlaySize_ * 2.5f));
124                damageOverlayBottom_->setPosition(Vector2(0.5f - overlaySize_*2.5f/2.0f, 0.5f - overlaySize_*2.5f/2.0f));
125                damageOverlayBottom_->hide();
126
127                damageOverlayLeft_ = new OrxonoxOverlay(this);
128                damageOverlayLeft_->setBackgroundMaterial("Orxonox/DamageOverlayLeft");
129                damageOverlayLeft_->setSize(Vector2(overlaySize_ * 2.5f, overlaySize_ * 2.5f));
130                damageOverlayLeft_->setPosition(Vector2(0.5f - overlaySize_*2.5f/2.0f, 0.5f - overlaySize_*2.5f/2.0f));
131                damageOverlayLeft_->hide();
132            }
133
134            if (showArrows_)
135            {
136                arrowsOverlay1_ = new OrxonoxOverlay(this);
137                arrowsOverlay1_->setBackgroundMaterial("Orxonox/DirectionArrows1");
138                arrowsOverlay1_->setSize(Vector2(0.02727f, 0.36f * arrowsSize_));
139                arrowsOverlay1_->setPickPoint(Vector2(0.5f, 0.5f));
140                arrowsOverlay1_->setPosition(Vector2(0.5f, 0.5f));
141                arrowsOverlay1_->hide();
142
143                arrowsOverlay2_ = new OrxonoxOverlay(this);
144                arrowsOverlay2_->setBackgroundMaterial("Orxonox/DirectionArrows2");
145                arrowsOverlay2_->setSize(Vector2(0.02727f, 0.59f * arrowsSize_));
146                arrowsOverlay2_->setPickPoint(Vector2(0.5f, 0.5f));
147                arrowsOverlay2_->setPosition(Vector2(0.5f, 0.5f));
148                arrowsOverlay2_->hide();
149
150                arrowsOverlay3_ = new OrxonoxOverlay(this);
151                arrowsOverlay3_->setBackgroundMaterial("Orxonox/DirectionArrows3");
152                arrowsOverlay3_->setSize(Vector2(0.02727f, 0.77f * arrowsSize_));
153                arrowsOverlay3_->setPickPoint(Vector2(0.5f, 0.5f));
154                arrowsOverlay3_->setPosition(Vector2(0.5f, 0.5f));
155                arrowsOverlay3_->hide();
156
157                arrowsOverlay4_ = new OrxonoxOverlay(this);
158                arrowsOverlay4_->setBackgroundMaterial("Orxonox/DirectionArrows4");
159                arrowsOverlay4_->setSize(Vector2(0.02727f, arrowsSize_));
160                arrowsOverlay4_->setPickPoint(Vector2(0.5f, 0.5f));
161                arrowsOverlay4_->setPosition(Vector2(0.5f, 0.5f));
162                arrowsOverlay4_->hide();
163            }
164        }
165
166        // HACK: Define which objects are targetable when considering the creator of an orxonox::Model
167        this->targetMask_.exclude(ClassByString("BaseObject"));
168        this->targetMask_.include(ClassByString("WorldEntity"));
169        this->targetMask_.exclude(ClassByString("Projectile"));
170
171        NewHumanController::localController_s = this;
172
173        controlPaused_ = false;
174
175        //HumanController::localController_s->getControllableEntity()->getCamera()->setDrag(true);
176    }
177
178    NewHumanController::~NewHumanController()
179    {
180        if (this->isInitialized())
181        {
182            if (this->crossHairOverlay_)
183                this->crossHairOverlay_->destroy();
184            if (this->centerOverlay_)
185                this->centerOverlay_->destroy();
186
187            if (this->arrowsOverlay1_)
188                this->arrowsOverlay1_->destroy();
189            if (this->arrowsOverlay2_)
190                this->arrowsOverlay2_->destroy();
191            if (this->arrowsOverlay3_)
192                this->arrowsOverlay3_->destroy();
193            if (this->arrowsOverlay4_)
194                this->arrowsOverlay4_->destroy();
195            if (this->damageOverlayTop_)
196                this->damageOverlayTop_->destroy();
197            if (this->damageOverlayLeft_)
198                this->damageOverlayLeft_->destroy();
199            if (this->damageOverlayRight_)
200                this->damageOverlayRight_->destroy();
201            if (this->damageOverlayBottom_)
202                this->damageOverlayBottom_->destroy();
203        }
204    }
205
206    void NewHumanController::tick(float dt)
207    {
208        if (GameMode::showsGraphics())
209        {
210
211            if (this->controllableEntity_ && !this->controllableEntity_->isInMouseLook())
212            {
213                this->updateTarget();
214
215                if (!controlPaused_ )
216                {
217                    if (this->getControllableEntity() && (this->getControllableEntity()->isExactlyA(ClassByString("SpaceShip")) || this->getControllableEntity()->isExactlyA(ClassByString("Rocket"))))
218                        this->showOverlays();
219                    else if (this->getControllableEntity() &&  this->getControllableEntity()->isExactlyA(ClassByString("FpsPlayer")))
220                    {
221                        this->showOverlays();
222                        this->hideArrows();
223                    }
224
225                    this->crossHairOverlay_->setPosition(Vector2(static_cast<float>(this->currentYaw_)/2*-1+.5f-overlaySize_/2, static_cast<float>(this->currentPitch_)/2*-1+.5f-overlaySize_/2));
226
227                    if (this->controlMode_ == 0 || (this->controlMode_ == 1 && this->firemode_ == 1))
228                    {
229                        if (this->showOverlays_ && this->showArrows_)
230                            alignArrows();
231                    }
232                    else
233                        hideArrows();
234
235                    if (this->showDamageOverlay_ && (this->damageOverlayTT_ > 0 || this->damageOverlayTR_ > 0 || this->damageOverlayTB_ > 0 || this->damageOverlayTL_ > 0))
236                    {
237                        this->damageOverlayTT_ -= dt;
238                        this->damageOverlayTR_ -= dt;
239                        this->damageOverlayTB_ -= dt;
240                        this->damageOverlayTL_ -= dt;
241                        if (this->damageOverlayTT_ <= 0)
242                            this->damageOverlayTop_->hide();
243                        if (this->damageOverlayTR_ <= 0)
244                            this->damageOverlayRight_->hide();
245                        if (this->damageOverlayTB_ <= 0)
246                            this->damageOverlayBottom_->hide();
247                        if (this->damageOverlayTL_ <= 0)
248                            this->damageOverlayLeft_->hide();
249                    }
250                }
251            }
252            else
253                this->hideOverlays();
254
255            if (this->acceleration_ > 0)
256            {
257                if (this->accelerating_)
258                    HumanController::moveFrontBack(Vector2(1, 0));
259                else
260                    HumanController::moveFrontBack(Vector2(this->acceleration_, 0));
261                this->accelerating_ = false;
262                //HumanController::moveFrontBack(Vector2(clamp(this->acceleration_ + this->currentAcceleration_, 0.0f, 1.0f), 0));
263            }
264        }
265
266        // Reset pitch and yaw rates
267        // TODO: Reactivate this to fix the game pad problem with 0 input
268        //this->currentPitch_ = 0;
269        //this->currentYaw_ = 0;
270
271        HumanController::tick(dt);
272    }
273
274    void NewHumanController::doFire(unsigned int firemode)
275    {
276        if (!this->controllableEntity_)
277            return;
278
279        this->firemode_ = firemode;
280
281        if (firemode == 1 && this->controlMode_ == 1)
282        {
283            //unlocked steering, steer on right mouse click
284            HumanController::yaw(Vector2(this->currentYaw_, 0));
285            HumanController::pitch(Vector2(this->currentPitch_, 0));
286        }
287        else
288            HumanController::localController_s->getControllableEntity()->fire(firemode);
289
290    }
291
292    void NewHumanController::hit(Pawn* originator, btManifoldPoint& contactpoint, float damage)
293    {
294        if (this->showDamageOverlay_ && !this->controlPaused_ && this->controllableEntity_ && !this->controllableEntity_->isInMouseLook())
295        {
296            Vector3 posA;
297            if (originator)
298                posA = originator->getWorldPosition();
299            else
300                posA = multi_cast<Vector3>(contactpoint.getPositionWorldOnA());
301            //Vector3 posB = multi_cast<Vector3>(contactpoint.getPositionWorldOnB());
302            //posA and posB are almost identical
303
304            Vector3 relativeHit = this->getControllableEntity()->getWorldOrientation().UnitInverse() * (this->getControllableEntity()->getWorldPosition() - posA);
305
306            //back is z positive
307            //x is left positive
308            //y is down positive
309            relativeHit.normalise();
310
311            float threshold = 0.3f;
312            if (relativeHit.x > threshold) // Left
313            {
314                this->damageOverlayLeft_->show();
315                this->damageOverlayTL_ = this->damageOverlayTime_;
316                //this->damageOverlayLeft_->setBackgroundAlpha(0.3);
317            }
318            if (relativeHit.x < -threshold) //Right
319            {
320                this->damageOverlayRight_->show();
321                this->damageOverlayTR_ = this->damageOverlayTime_;
322                //this->damageOverlayRight_->setBackgroundAlpha(0.3);
323            }
324            if (relativeHit.y > threshold) //Top
325            {
326                this->damageOverlayBottom_->show();
327                this->damageOverlayTB_ = this->damageOverlayTime_;
328                //this->damageOverlayTop_->setBackgroundAlpha(0.3);
329            }
330            if (relativeHit.y < -threshold) //Bottom
331            {
332                this->damageOverlayTop_->show();
333                this->damageOverlayTT_ = this->damageOverlayTime_;
334                //this->damageOverlayBottom_->setBackgroundAlpha(0.3);
335            }
336        }
337    }
338
339    void NewHumanController::unfire()
340    {
341        if (NewHumanController::localController_s)
342            NewHumanController::localController_s->doUnfire();
343    }
344
345    void NewHumanController::doUnfire()
346    {
347        this->firemode_ = -1;
348        hideArrows();
349    }
350
351    void NewHumanController::updateTarget()
352    {
353        Ogre::RaySceneQuery * rsq = HumanController::localController_s->getControllableEntity()->getScene()->getSceneManager()->createRayQuery(Ogre::Ray());
354
355        Ogre::Ray mouseRay = HumanController::localController_s->getControllableEntity()->getCamera()->getOgreCamera()->getCameraToViewportRay(static_cast<float>(this->currentYaw_)/2*-1+.5f, static_cast<float>(this->currentPitch_)/2*-1+.5f);
356
357        rsq->setRay(mouseRay);
358        rsq->setSortByDistance(true);
359
360        /*
361        Distance of objects:
362        ignore everything under 200 maybe even take 1000 as min distance to shoot at
363
364        shots are regularly traced and are entities!!!!!!!!! this is the biggest problem
365        they vanish only after a distance of 10'000
366        */
367
368
369        Ogre::RaySceneQueryResult& result = rsq->execute();
370        Pawn* pawn = orxonox_cast<Pawn*>(this->getControllableEntity());
371        WorldEntity* myWe = static_cast<WorldEntity*>(this->getControllableEntity());
372
373        Ogre::RaySceneQueryResult::iterator itr;
374        for (itr = result.begin(); itr != result.end(); ++itr)
375        {
376//             CCOUT(0) << "testing object as target" << endl;
377            if (itr->movable->isInScene() && itr->movable->getMovableType() == "Entity" /*&& itr->distance > 500*/)
378            {
379                // Try to cast the user pointer
380                WorldEntity* wePtr;
381                try
382                {
383                    wePtr = dynamic_cast<WorldEntity*>(Ogre::any_cast<OrxonoxClass*>(itr->movable->getUserAny()));
384                }
385                catch (...)
386                {
387                    continue;
388                }
389
390                // make sure we don't shoot ourselves
391                if( wePtr==myWe )
392                    continue;
393
394                if (wePtr)
395                {
396                    // go through all parents of object and look whether they are sightable or not
397                    bool isSightable = false;
398                    WorldEntity* parent = wePtr->getParent();
399                    while (parent)
400                    {
401                        if (this->targetMask_.isExcluded(parent->getIdentifier()) || parent==myWe)
402                        {
403                            parent = parent->getParent();
404                            continue;
405                        }
406                        else
407                        {
408                            isSightable = true;
409                            break;
410                        }
411                    }
412                    if (!isSightable)
413                        continue;
414                }
415
416                if (this->getControllableEntity() && this->getControllableEntity()->getTarget() != wePtr)
417                    this->getControllableEntity()->setTarget(wePtr);
418
419                if (pawn)
420                    pawn->setAimPosition( mouseRay.getOrigin() + mouseRay.getDirection() * itr->distance );
421
422                //itr->movable->getParentSceneNode()->showBoundingBox(true);
423                //return mouseRay.getOrigin() + mouseRay.getDirection() * itr->distance; //or itr->movable->getParentSceneNode()->_getDerivedPosition()
424                return;
425            }
426        }
427
428        if (pawn)
429            pawn->setAimPosition( mouseRay.getOrigin() + mouseRay.getDirection() * 1200 );
430
431        if( this->getControllableEntity() && this->getControllableEntity()->getTarget() != 0 )
432            this->getControllableEntity()->setTarget( 0 );
433
434        //return this->controllableEntity_->getWorldPosition() + (this->controllableEntity_->getWorldOrientation() * Vector3::NEGATIVE_UNIT_Z * 2000);
435        //return this->controllableEntity_->getWorldPosition() + (this->controllableEntity_->getCamera()->getOgreCamera()->getOrientation() * Vector3::NEGATIVE_UNIT_Z);
436    }
437
438    void NewHumanController::frontback(const Vector2& value)
439    {
440        this->accelerating_ = true;
441
442        //if (this->acceleration_ == 0)
443        HumanController::frontback(value);
444    }
445
446    void NewHumanController::yaw(const Vector2& value)
447    {
448        //SUPER(NewHumanController, yaw, value);
449        if (this->controlMode_ == 0 || (this->controllableEntity_ && this->controllableEntity_->isInMouseLook()))
450            HumanController::yaw(value);
451
452        if (this->getControllableEntity() && !this->getControllableEntity()->isExactlyA(ClassByString("FpsPlayer")))
453            this->currentYaw_ = value.x;
454    }
455
456    void NewHumanController::pitch(const Vector2& value)
457    {
458        //SUPER(NewHumanController, pitch, value);
459        if (this->controlMode_ == 0 || (this->controllableEntity_ && this->controllableEntity_->isInMouseLook()))
460            HumanController::pitch(value);
461
462        if (this->getControllableEntity() && !this->getControllableEntity()->isExactlyA(ClassByString("FpsPlayer")))
463            this->currentPitch_ = value.x;
464    }
465
466    void NewHumanController::changeMode()
467    {
468        if (NewHumanController::localController_s)
469        {
470            if (NewHumanController::localController_s->controlMode_ == 0)
471            {
472                NewHumanController::localController_s->controlMode_ = 1;
473                NewHumanController::localController_s->hideArrows();
474            }
475            else
476                NewHumanController::localController_s->controlMode_ = 0;
477        }
478    }
479
480    void NewHumanController::changedControllableEntity()
481    {
482        this->controlMode_ = 0;
483        this->currentYaw_ = 0;
484        this->currentPitch_ = 0;
485        if (this->getControllableEntity() && (this->getControllableEntity()->isExactlyA(ClassByString("SpaceShip")) || this->getControllableEntity()->isExactlyA(ClassByString("Rocket"))))
486        {
487            this->showOverlays_ = true;
488            if (!this->controlPaused_)
489            {
490                this->showOverlays();
491                this->alignArrows();
492            }
493        }
494        else
495        {
496            this->showOverlays_ = false;
497            this->hideOverlays();
498        }
499    }
500
501    void NewHumanController::accelerate()
502    {
503        if (NewHumanController::localController_s)
504            NewHumanController::localController_s->acceleration_ = clamp(NewHumanController::localController_s->acceleration_ + 0.2f, 0.00f, 1.0f);
505    }
506
507    void NewHumanController::decelerate()
508    {
509        if (NewHumanController::localController_s)
510            NewHumanController::localController_s->acceleration_ = clamp(NewHumanController::localController_s->acceleration_ - 0.1f, 0.0f, 1.0f);
511    }
512
513    void NewHumanController::doResumeControl()
514    {
515        this->controlPaused_ = false;
516        if (this->showOverlays_)
517            this->showOverlays();
518    }
519
520    void NewHumanController::doPauseControl()
521    {
522        this->controlPaused_ = true;
523        this->hideOverlays();
524    }
525
526    void NewHumanController::alignArrows()
527    {
528        if (showArrows_)
529        {
530            hideArrows();
531
532            float distance = sqrt(pow(static_cast<float>(this->currentYaw_)/2*-1,2) + pow(static_cast<float>(this->currentPitch_)/2*-1,2));
533
534            if (distance > 0.04f && distance <= 0.59f * arrowsSize_ / 2.0f )
535            {
536                this->arrowsOverlay1_->setRotation(Degree(-90 + -1.0f * atan2(static_cast<float>(this->currentPitch_)/2*-1, static_cast<float>(this->currentYaw_)/2*-1) / (2.0f * Ogre::Math::PI) * 360.0f));
537                this->arrowsOverlay1_->show();
538            }
539            else if (distance > 0.59f * arrowsSize_ / 2.0f && distance <= 0.77f * arrowsSize_ / 2.0f )
540            {
541                this->arrowsOverlay2_->setRotation(Degree(-90 + -1.0f * atan2(static_cast<float>(this->currentPitch_)/2*-1, static_cast<float>(this->currentYaw_)/2*-1) / (2.0f * Ogre::Math::PI) * 360.0f));
542                this->arrowsOverlay2_->show();
543            }
544            else if (distance > 0.77f * arrowsSize_ / 2.0f && distance <= arrowsSize_ / 2.0f)
545            {
546                this->arrowsOverlay3_->setRotation(Degree(-90 + -1.0f * atan2(static_cast<float>(this->currentPitch_)/2*-1, static_cast<float>(this->currentYaw_)/2*-1) / (2.0f * Ogre::Math::PI) * 360.0f));
547                this->arrowsOverlay3_->show();
548            }
549            else if (distance > arrowsSize_ / 2.0f)
550            {
551                this->arrowsOverlay4_->setRotation(Degree(-90 + -1.0f * atan2(static_cast<float>(this->currentPitch_)/2*-1, static_cast<float>(this->currentYaw_)/2*-1) / (2.0f * Ogre::Math::PI) * 360.0f));
552                this->arrowsOverlay4_->show();
553            }
554        }
555    }
556
557    void NewHumanController::showOverlays()
558    {
559        if (!GameMode::showsGraphics())
560            return;
561        this->crossHairOverlay_->show();
562        this->centerOverlay_->show();
563
564        if (showArrows_)
565        {
566            this->arrowsOverlay1_->show();
567            this->arrowsOverlay2_->show();
568            this->arrowsOverlay3_->show();
569            this->arrowsOverlay4_->show();
570        }
571    }
572
573    void NewHumanController::hideOverlays()
574    {
575        if (!GameMode::showsGraphics())
576            return;
577        this->crossHairOverlay_->hide();
578        this->centerOverlay_->hide();
579
580        if (showDamageOverlay_)
581        {
582            this->damageOverlayTop_->hide();
583            this->damageOverlayRight_->hide();
584            this->damageOverlayBottom_->hide();
585            this->damageOverlayLeft_->hide();
586        }
587
588        this->hideArrows();
589    }
590
591    void NewHumanController::hideArrows()
592    {
593        if(!GameMode::showsGraphics())
594            return;
595        if (showArrows_)
596        {
597            this->arrowsOverlay1_->hide();
598            this->arrowsOverlay2_->hide();
599            this->arrowsOverlay3_->hide();
600            this->arrowsOverlay4_->hide();
601        }
602    }
603
604
605
606
607
608}
Note: See TracBrowser for help on using the repository browser.