BVB Source Codes

CRYENGINE Show FireCommand.h Source code

Return Download CRYENGINE: download FireCommand.h Source code - Download CRYENGINE Source code - Type:.h
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. /********************************************************************
  4.    -------------------------------------------------------------------------
  5.    File name:   FireCommand.h
  6.    $Id$
  7.    Description:
  8.  
  9.    -------------------------------------------------------------------------
  10.    History:
  11.    - ?
  12.    - 2 Mar 2009                  : Evgeny Adamenkov: Removed IRenderer
  13.  
  14.  *********************************************************************/
  15. #ifndef __FireCommand_H__
  16. #define __FireCommand_H__
  17.  
  18. #include <CryAISystem/IAgent.h>
  19.  
  20. class CAIActor;
  21. class CPuppet;
  22.  
  23. //====================================================================
  24. // CFireCommandInstant
  25. // Fire command handler for assault rifles and alike.
  26. // When starting to fire the fire is drawn along a line towards the target.
  27. //====================================================================
  28. class CFireCommandInstant : public IFireCommandHandler
  29. {
  30.         friend class CAISystem; // need this for DebugDraw
  31. public:
  32.         CFireCommandInstant(IAIActor* pShooter);
  33.         virtual const char*  GetName() { return "instant"; }
  34.  
  35.         virtual void         Reset();
  36.         virtual EAIFireState Update(IAIObject* pITarget, bool canFire, EFireMode fireMode, const AIWeaponDescriptor& descriptor, Vec3& outShootTargetPos);
  37.         virtual void         Release()                                                   { delete this; }
  38.         virtual bool         ValidateFireDirection(const Vec3& fireVector, bool mustHit) { return true; }
  39.         virtual void         DebugDraw();
  40.         virtual bool         UseDefaultEffectFor(EFireMode fireMode) const               { return true; }
  41.         virtual void         OnReload()                                                  {}
  42.         virtual void         OnShoot()                                                   { ++m_ShotsCount; }
  43.         virtual int          GetShotCount() const                                        { return m_ShotsCount; }
  44.         virtual float        GetTimeToNextShot() const;
  45.  
  46. protected:
  47.         CPuppet* m_pShooter;
  48.  
  49.         // For new damage control
  50.         enum EBurstState
  51.         {
  52.                 BURST_NONE,
  53.                 BURST_FIRE,
  54.                 BURST_PAUSE,
  55.         };
  56.  
  57.         EBurstState m_weaponBurstState;
  58.         float       m_weaponBurstTime;
  59.         float       m_weaponBurstTimeScale;
  60.         float       m_weaponBurstTimeWithoutShot;
  61.         int         m_weaponBurstBulletCount;
  62.         int         m_curBurstBulletCount;
  63.         float       m_curBurstPauseTime;
  64.         float       m_weaponTriggerTime;
  65.         bool        m_weaponTriggerState;
  66.         float       m_coverFireTime;
  67.         int         m_ShotsCount;
  68.  
  69.         class DrawFireEffect
  70.         {
  71.         public:
  72.                 enum EState
  73.                 {
  74.                         Running = 0,
  75.                         Finished,
  76.                 };
  77.  
  78.                 EState GetState() const;
  79.                 bool   Update(float updateTime, CPuppet* pShooter, IAIObject* pTarget, const AIWeaponDescriptor& descriptor,
  80.                               Vec3& aimTarget, bool canFire);
  81.  
  82.                 void Reset();
  83.  
  84.         private:
  85.                 struct State
  86.                 {
  87.                         State()
  88.                                 : time(0.0f)
  89.                                 , idleTime(0.0f)
  90.                                 , startSeed(cry_random(0.0f, 1337.0f))
  91.                                 , state(Running)
  92.                         {
  93.                         }
  94.  
  95.                         float  time;
  96.                         float  idleTime;
  97.                         float  startSeed;
  98.                         EState state;
  99.  
  100.                 } m_state;
  101.         };
  102.  
  103.         DrawFireEffect m_drawFire;
  104. };
  105.  
  106. //====================================================================
  107. // CFireCommandInstantSinle
  108. // Fire command handler for pistols/shotguns/etc.
  109. // When starting to fire the fire is drawn along a line towards the target.
  110. //====================================================================
  111. class CFireCommandInstantSingle : public CFireCommandInstant
  112. {
  113. public:
  114.         CFireCommandInstantSingle(IAIActor* pShooter) :
  115.                 CFireCommandInstant(pShooter) {}
  116.  
  117.         virtual int  SelectBurstLength() { return 0; }
  118.         virtual void CheckIfNeedsToFade(CAIObject* pTarget, bool canFire, EFireMode fireMode, const AIWeaponDescriptor& descriptor, Vec3& outShootTargetPos)
  119.         { return; }
  120.         virtual bool IsStartingNow() const                         { return false; }
  121.         virtual bool UseDefaultEffectFor(EFireMode fireMode) const { return true; }
  122.  
  123. };
  124.  
  125. //====================================================================
  126. // CFireCommandLob
  127. // Fire command handler for lobbing projectiles (grenades, grenade launchers, etc.)
  128. // Calculates the lob trajectory - finds the best one; makes sure not to hit friends
  129. // Note: Cannot be directly used. Helper for other fire command handlers.
  130. //====================================================================
  131. class CFireCommandLob : public IFireCommandHandler
  132. {
  133. public:
  134.         CFireCommandLob(IAIActor* pShooter);
  135.         ~CFireCommandLob();
  136.         virtual void         Reset();
  137.         virtual EAIFireState Update(IAIObject* pTarget, bool canFire, EFireMode fireMode, const AIWeaponDescriptor& descriptor, Vec3& outShootTargetPos);
  138.         virtual void         DebugDraw();
  139.  
  140.         virtual bool         ValidateFireDirection(const Vec3& fireVector, bool mustHit) { return true; }
  141.         virtual void         Release()                                                   { delete this; }
  142.         virtual bool         UseDefaultEffectFor(EFireMode fireMode) const               { return true; }
  143.         virtual void         OnReload()                                                  {}
  144.         virtual void         OnShoot()                                                   { m_lastStep = 0; }
  145.         virtual int          GetShotCount() const                                        { return 0; }
  146.         virtual void         GetProjectileInfo(SFireCommandProjectileInfo& info) const   { info.fSpeedScale = m_projectileSpeedScale; }
  147.         virtual float        GetTimeToNextShot() const;
  148.  
  149.         // Must be declared in parent fire command handler
  150.         virtual bool IsUsingPrimaryWeapon() const = 0;
  151.         virtual bool CanHaveZeroTargetPos() const = 0;
  152.  
  153.         virtual bool GetOverrideAimingPosition(Vec3& overrideAimingPosition) const;
  154.  
  155. protected:
  156.         struct SDebugThrowEval
  157.         {
  158.                 bool  fake;
  159.                 bool  best;
  160.                 float score;
  161.                 Vec3  pos;
  162.  
  163.                 typedef std::vector<Vec3> TTrajectory;
  164.                 TTrajectory trajectory;
  165.  
  166.                 SDebugThrowEval() : fake(false), best(false), score(0.0f), pos(ZERO) {}
  167.         };
  168.  
  169.         EAIFireState GetBestLob(IAIObject* pTarget, const AIWeaponDescriptor& descriptor, Vec3& outShootTargetPos);
  170.  
  171.         struct Trajectory
  172.         {
  173.                 enum
  174.                 {
  175.                         MaxSamples = 64
  176.                 };
  177.  
  178.                 struct Sample
  179.                 {
  180.                         Vec3 position;
  181.                         Vec3 velocity;
  182.                 };
  183.  
  184.                 size_t GetSampleCount() const
  185.                 {
  186.                         return sampleCount;
  187.                 }
  188.  
  189.                 Sample GetSample(const size_t index) const
  190.                 {
  191.                         assert(index < sampleCount);
  192.                         assert(index < MaxSamples);
  193.  
  194.                         Sample s;
  195.  
  196.                         if (index < sampleCount && index < MaxSamples)
  197.                         {
  198.                                 s.position = positions[index];
  199.                                 s.velocity = velocities[index];
  200.                         }
  201.                         else
  202.                         {
  203.                                 s.position.zero();
  204.                                 s.velocity.zero();
  205.                         }
  206.  
  207.                         return s;
  208.                 }
  209.  
  210.                 Vec3   positions[MaxSamples];
  211.                 Vec3   velocities[MaxSamples];
  212.                 uint32 sampleCount;
  213.         };
  214.  
  215.         float EvaluateThrow(const Vec3& targetPos, const Vec3& targetViewDir, const Vec3& dir, float vel,
  216.                             Vec3& outThrowHitPos, Vec3& outThrowHitDir, float& outSpeed, Trajectory& trajectory,
  217.                             const float maxAllowedDistanceFromTarget, const float minimumDistanceToFriendsSq) const;
  218.         bool IsValidDestination(ERequestedGrenadeType eReqGrenadeType, const Vec3& throwHitPos,
  219.                                 const float minimumDistanceToFriendsSq) const;
  220.         void ClearDebugEvals();
  221.  
  222. protected:
  223.         Trajectory m_bestTrajectory;
  224.         CPuppet*   m_pShooter;
  225.         Vec3       m_targetPos;
  226.         Vec3       m_throwDir;
  227.         CTimeValue m_nextFireTime;
  228.         float      m_preferredHeight;
  229.         float      m_projectileSpeedScale;
  230.         float      m_bestScore;
  231.         int        m_lastStep;
  232.  
  233. #ifdef CRYAISYSTEM_DEBUG
  234.         typedef std::vector<SDebugThrowEval> TDebugEvals;
  235.         mutable TDebugEvals m_DEBUG_evals;
  236.         float               m_debugBest;
  237.         Vec3                m_Apex;
  238. #endif //CRYAISYSTEM_DEBUG
  239. };
  240.  
  241. //====================================================================
  242. // CFireCommandProjectileSlow
  243. // Fire command handler for slow projectiles such as hand grenades.
  244. //====================================================================
  245. class CFireCommandProjectileSlow : public CFireCommandLob
  246. {
  247. public:
  248.         CFireCommandProjectileSlow(IAIActor* pShooter);
  249.         virtual const char* GetName() { return "projectile_slow"; }
  250.  
  251.         // CFireCommandLob
  252.         virtual bool IsUsingPrimaryWeapon() const { return true; }
  253.         virtual bool CanHaveZeroTargetPos() const { return false; }
  254.         //~CFireCommandLob
  255. };
  256.  
  257. //====================================================================
  258. // CFireCommandProjectileFast
  259. // Fire command handler for fast projectiles such as RPG.
  260. //====================================================================
  261. class CFireCommandProjectileFast : public IFireCommandHandler
  262. {
  263. public:
  264.         CFireCommandProjectileFast(IAIActor* pShooter);
  265.         virtual const char*  GetName() { return "projectile_fast"; }
  266.         virtual void         Reset();
  267.         virtual EAIFireState Update(IAIObject* pTarget, bool canFire, EFireMode fireMode, const AIWeaponDescriptor& descriptor, Vec3& outShootTargetPos);
  268.         virtual bool         ValidateFireDirection(const Vec3& fireVector, bool mustHit) { return true; }
  269.         virtual void         Release()                                                   { delete this; }
  270.         virtual void         DebugDraw();
  271.         virtual bool         UseDefaultEffectFor(EFireMode fireMode) const               { return true; }
  272.         virtual void         OnReload();
  273.         virtual void         OnShoot()                                                   {}
  274.         virtual int          GetShotCount() const                                        { return 0; }
  275.         virtual void         GetProjectileInfo(SFireCommandProjectileInfo& info) const   { info.trackingId = m_trackingId; }
  276.         virtual float        GetTimeToNextShot() const;
  277.  
  278. private:
  279.         enum EAimMode
  280.         {
  281.                 AIM_INFRONT,
  282.                 AIM_SIDES,
  283.                 AIM_BACK,
  284.                 AIM_DIRECTHIT,
  285.         };
  286.  
  287.         bool ChooseShootPoint(Vec3& outShootPoint, IAIObject* pTarget, float explRadius, float missRatio, EAimMode aimMode);
  288.         bool IsValidShootPoint(const Vec3& firePos, const Vec3& shootPoint, float explRadius) const;
  289.         bool NoFriendNearAimTarget(float explRadius, const Vec3& shootPoint) const;
  290.  
  291.         CPuppet* m_pShooter;
  292.         Vec3     m_aimPos;
  293.         EntityId m_trackingId;
  294. };
  295.  
  296. //====================================================================
  297. // CFireCommandGrenade
  298. // Lobs the secondary weapon given the grenade type
  299. //====================================================================
  300. class CFireCommandGrenade : public CFireCommandLob
  301. {
  302. public:
  303.         CFireCommandGrenade(IAIActor* pShooter)
  304.                 : CFireCommandLob(pShooter)
  305.         {
  306.         }
  307.         virtual const char* GetName() { return "grenade"; }
  308.  
  309.         // CFireCommandLob
  310.         virtual bool IsUsingPrimaryWeapon() const { return false; }
  311.         virtual bool CanHaveZeroTargetPos() const { return true; }
  312.         //~CFireCommandLob
  313. };
  314.  
  315. #endif
  316.  
downloadFireCommand.h Source code - Download CRYENGINE Source code
Related Source Codes/Software:
postal - 2017-06-11
reactide - Reactide is the first dedicated IDE for React web ... 2017-06-11
rkt - rkt is a pod-native container engine for Linux. It... 2017-06-11
uWebSockets - Tiny WebSockets https://for... 2017-06-11
realworld - TodoMVC for the RealWorld - Exemplary fullstack Me... 2017-06-11
CRYENGINE - CRYENGINE is a powerful real-time game development... 2017-06-11
goreplay - GoReplay is an open-source tool for capturing and ... 2017-06-10
pyenv - Simple Python version management 2017-06-10
redux-saga - An alternative side effect model for Redux apps ... 2017-06-10
angular-starter - 2017-06-10

 Back to top