Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/orxonox/controllers/NewHumanController.cc @ 8328

Last change on this file since 8328 was 8316, checked in by scheusso, 14 years ago

fix for dedicated Client

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