BVB Source Codes

CRYENGINE Show AIObject.cpp Source code

Return Download CRYENGINE: download AIObject.cpp Source code - Download CRYENGINE Source code - Type:.cpp
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. #include "StdAfx.h"
  4. #include "AIObject.h"
  5. #include "CAISystem.h"
  6. #include "AILog.h"
  7. #include "Graph.h"
  8. #include "Leader.h"
  9. #include "GoalOp.h"
  10.  
  11. #include <float.h>
  12. #include <CrySystem/ISystem.h>
  13. #include <CrySystem/ILog.h>
  14. #include <CryNetwork/ISerialize.h>
  15. #include <CryAISystem/VisionMapTypes.h>
  16. #include "Navigation/NavigationSystem/NavigationSystem.h"
  17.  
  18. //////////////////////////////////////////////////////////////////////
  19. // Construction/Destruction
  20. //////////////////////////////////////////////////////////////////////
  21.  
  22. #define _ser_value_(val) ser.Value( # val, val)
  23.  
  24. CAIObject::CAIObject() :
  25.         m_vPosition(ZERO),
  26.         m_entityID(0),
  27.         m_bEnabled(true),
  28.         m_lastNavNodeIndex(0),
  29.         m_fRadius(.0f),
  30.         m_pFormation(0),
  31.         m_nObjectType(0),
  32.         m_objectSubType(CAIObject::STP_NONE),
  33.         m_bUpdatedOnce(false),
  34.         m_vFirePosition(ZERO),
  35.         m_vFireDir(ZERO),
  36.         m_expectedPhysicsPosFrameId(-1),
  37.         m_vExpectedPhysicsPos(ZERO),
  38.         m_vBodyDir(ZERO),
  39.         m_vEntityDir(ZERO),
  40.         m_vMoveDir(ZERO),
  41.         m_vView(ZERO),
  42.         m_vLastPosition(ZERO),
  43.         m_groupId(-1),
  44.         m_factionID(IFactionMap::InvalidFactionID),
  45.         m_isThreateningForHostileFactions(true),
  46.         m_bTouched(false),
  47.         m_observable(false),
  48.         m_serialize(true)
  49. {
  50.         AILogComment("CAIObject (%p)", this);
  51. }
  52.  
  53. CAIObject::~CAIObject()
  54. {
  55.         AILogComment("~CAIObject  %s (%p)", GetName(), this);
  56.  
  57.         SetObservable(false);
  58.  
  59.         ReleaseFormation();
  60. }
  61.  
  62. void CAIObject::SetPos(const Vec3& pos, const Vec3& dirForw)
  63. {
  64.         CCCPOINT(CAIObject_SetPos);
  65.  
  66. #ifdef CRYAISYSTEM_DEBUG
  67.         if (_isnan(pos.x) || _isnan(pos.y) || _isnan(pos.z))
  68.         {
  69.                 AIWarning("NotANumber tried to be set for position of AI entity %s", GetName());
  70.                 return;
  71.         }
  72. #endif
  73.  
  74.         assert(pos.IsValid());
  75.         assert(dirForw.IsValid());
  76.  
  77.         if (!IsEquivalent(m_vLastPosition, pos, VEC_EPSILON))
  78.         {
  79.                 m_vLastPosition = m_vPosition;
  80.  
  81.                 if (IEntity* pEntity = GetEntity())
  82.                         GetAISystem()->NotifyAIObjectMoved(pEntity, SEntityEvent(ENTITY_EVENT_XFORM));
  83.  
  84.                 m_lastNavNodeIndex = 0;
  85.         }
  86.  
  87.         if (!GetProxy())
  88.         {
  89.                 Vec3 forward = dirForw.GetNormalizedSafe(Vec3Constants<float>::fVec3_Zero);
  90.                 m_vMoveDir = forward;
  91.                 m_vBodyDir = forward;
  92.                 m_vEntityDir = forward;
  93.                 m_vView = forward;
  94.         }
  95.  
  96.         m_vPosition = pos;
  97.  
  98.         if (m_observable)
  99.         {
  100.                 ObservableParams observableParams;
  101.                 GetObservablePositions(observableParams);
  102.                 gAIEnv.pVisionMap->ObservableChanged(m_visionID, observableParams, eChangedPosition);
  103.         }
  104. }
  105.  
  106. Vec3 CAIObject::GetPhysicsPos() const
  107. {
  108.         IEntity* pEntity = GetEntity();
  109.  
  110.         if (pEntity)
  111.         {
  112.                 if ((m_expectedPhysicsPosFrameId == gEnv->nMainFrameID))
  113.                 {
  114.                         return m_vExpectedPhysicsPos;
  115.                 }
  116.                 else
  117.                 {
  118.                         return pEntity->GetWorldPos();
  119.                 }
  120.         }
  121.         else
  122.         {
  123.                 return GetPos();
  124.         }
  125. }
  126.  
  127. void CAIObject::SetExpectedPhysicsPos(const Vec3& pos)
  128. {
  129.         CCCPOINT(CAIObject_SetExpectedPhysicsPos);
  130.  
  131. #ifdef CRYAISYSTEM_DEBUG
  132.         if (_isnan(pos.x) || _isnan(pos.y) || _isnan(pos.z))
  133.         {
  134.                 AIWarning("NotANumber tried to be set for expected position of AI entity %s", GetName());
  135.                 return;
  136.         }
  137. #endif
  138.  
  139.         assert(pos.IsValid());
  140.  
  141.         m_expectedPhysicsPosFrameId = gEnv->nMainFrameID;
  142.         m_vExpectedPhysicsPos = pos;
  143. }
  144.  
  145. void CAIObject::SetType(unsigned short type)
  146. {
  147.         m_nObjectType = type;
  148. }
  149.  
  150. void CAIObject::SetSubType(CAIObject::ESubType subType)
  151. {
  152.         m_objectSubType = subType;
  153. }
  154.  
  155. void CAIObject::SetAssociation(CWeakRef<CAIObject> refAssociation)
  156. {
  157.         m_refAssociation = refAssociation;
  158. }
  159.  
  160. const char* CAIObject::GetName() const
  161. {
  162.         return m_name.c_str();
  163. }
  164.  
  165. void CAIObject::SetName(const char* pName)
  166. {
  167.         m_name = pName;
  168.  
  169. #ifdef CRYAISYSTEM_DEBUG
  170.         if (m_pMyRecord)
  171.         {
  172.                 m_pMyRecord->SetName(pName);
  173.         }
  174. #endif //CRYAISYSTEM_DEBUG
  175. }
  176.  
  177. void CAIObject::SetBodyDir(const Vec3& dir)
  178. {
  179.         m_vBodyDir = dir;
  180. }
  181.  
  182. void CAIObject::SetEntityDir(const Vec3& dir)
  183. {
  184.         m_vEntityDir = dir;
  185. }
  186.  
  187. void CAIObject::SetMoveDir(const Vec3& dir)
  188. {
  189.         m_vMoveDir = dir;
  190. }
  191.  
  192. //
  193. //------------------------------------------------------------------------------------------------------------------------
  194. void CAIObject::SetViewDir(const Vec3& dir)
  195. {
  196.         m_vView = dir;
  197. }
  198.  
  199. //
  200. //------------------------------------------------------------------------------------------------------------------------
  201. void CAIObject::Reset(EObjectResetType type)
  202. {
  203.         ReleaseFormation();
  204.  
  205.         m_bEnabled = true;
  206.         m_bUpdatedOnce = false;
  207.         m_bTouched = false;
  208.  
  209.         m_lastNavNodeIndex = 0;
  210.  
  211.         switch (type)
  212.         {
  213.         case AIOBJRESET_INIT:
  214.                 // grenades and rockets are always observable
  215.                 if ((m_nObjectType == AIOBJECT_RPG) || (m_nObjectType == AIOBJECT_GRENADE))
  216.                         SetObservable(true);
  217.                 break;
  218.  
  219.         case AIOBJRESET_SHUTDOWN:
  220.                 SetObservable(false);
  221.                 break;
  222.         }
  223. }
  224.  
  225. size_t CAIObject::GetNavNodeIndex() const
  226. {
  227.         if (m_lastNavNodeIndex)
  228.                 return (m_lastNavNodeIndex < ~0ul) ? m_lastNavNodeIndex : 0;
  229.  
  230.         m_lastNavNodeIndex = ~0ul;
  231.  
  232.         return 0;
  233. }
  234.  
  235. //
  236. //
  237. //------------------------------------------------------------------------------------------------------------------------
  238. void CAIObject::SetRadius(float fRadius)
  239. {
  240.         m_fRadius = fRadius;
  241. }
  242.  
  243. //
  244. //------------------------------------------------------------------------------------------------------------------------
  245. bool CAIObject::ShouldSerialize() const
  246. {
  247.         if (!m_serialize)
  248.                 return false;
  249.  
  250.         if (gAIEnv.CVars.ForceSerializeAllObjects == 0)
  251.         {
  252.                 IEntity* pEntity = GetEntity();
  253.                 return pEntity ? ((pEntity->GetFlags() & ENTITY_FLAG_NO_SAVE) == 0) : true;
  254.         }
  255.  
  256.         return true;
  257. }
  258.  
  259. //
  260. //------------------------------------------------------------------------------------------------------------------------
  261. void CAIObject::Serialize(TSerialize ser)
  262. {
  263.         ser.Value("m_refThis", m_refThis);
  264.  
  265.         ser.Value("m_bEnabled", m_bEnabled);
  266.         ser.Value("m_bTouched", m_bTouched);
  267.  
  268.         // Do not cache the result of GetNavNodeIndex across serialisation
  269.         if (ser.IsReading())
  270.                 m_lastNavNodeIndex = 0;
  271.         ser.Value("m_vLastPosition", m_vLastPosition);
  272.  
  273.         int formationIndex = CFormation::INVALID_FORMATION_ID;
  274.         if (m_pFormation && ser.IsWriting())
  275.         {
  276.                 formationIndex = m_pFormation->GetId();
  277.         }
  278.         ser.Value("formationIndex", formationIndex);
  279.         if (formationIndex != CFormation::INVALID_FORMATION_ID && ser.IsReading())
  280.         {
  281.                 m_pFormation = GetAISystem()->GetFormation(formationIndex);
  282.         }
  283.  
  284.         // m_movementAbility.Serialize(ser); // not needed as ability is constant
  285.         ser.Value("m_bUpdatedOnce", m_bUpdatedOnce);
  286.         // todo m_listWaitGoalOps
  287.         ser.Value("m_nObjectType", m_nObjectType);
  288.         ser.EnumValue("m_objectSubType", m_objectSubType, STP_NONE, STP_MAXVALUE);
  289.         ser.Value("m_vPosition", m_vPosition);
  290.         ser.Value("m_vFirePosition", m_vFirePosition);
  291.         ser.Value("m_vFireDir", m_vFireDir);
  292.         ser.Value("m_vBodyDir", m_vBodyDir);
  293.         ser.Value("m_vEntityDir", m_vEntityDir);
  294.         ser.Value("m_vMoveDir", m_vMoveDir);
  295.         ser.Value("m_vView", m_vView);
  296.         // todo m_pAssociation
  297.         ser.Value("m_fRadius", m_fRadius);
  298.         ser.Value("m_groupId", m_groupId);
  299.         m_refAssociation.Serialize(ser, "m_refAssociation");
  300.         // m_listWaitGoalOps is not serialized but recreated after serializing goal pipe, when reading, in CPipeUser::Serialize()
  301.         ser.Value("m_name", m_name);
  302.  
  303.         ser.Value("m_entityID", m_entityID);
  304.  
  305.         ser.Value("m_factionID", m_factionID);
  306.         ser.Value("m_isThreateningForHostileFactions", m_isThreateningForHostileFactions);
  307.  
  308.         bool observable = m_observable;
  309.         ser.Value("m_observable", observable);
  310.         if (ser.IsReading())
  311.         {
  312.                 SetObservable(observable);
  313.  
  314. #ifdef CRYAISYSTEM_DEBUG
  315.                 ResetRecorderUnit();
  316. #endif //CRYAISYSTEM_DEBUG
  317.         }
  318. }
  319.  
  320. //
  321. //------------------------------------------------------------------------------------------------------------------------
  322. bool CAIObject::CreateFormation(const unsigned int nCrc32ForFormationName, Vec3 vTargetPos /* = ZERO */)
  323. {
  324.         string sFormationName(GetAISystem()->GetFormationNameFromCRC32(nCrc32ForFormationName));
  325.         return CreateFormation(sFormationName.c_str(), vTargetPos);
  326. }
  327.  
  328. bool CAIObject::CreateFormation(const char* szName, Vec3 vTargetPos)
  329. {
  330.         if (m_pFormation)
  331.         {
  332.                 GetAISystem()->ReleaseFormation(GetWeakRef(this), true);
  333.         }
  334.  
  335.         m_pFormation = 0;
  336.  
  337.         if (!szName)
  338.                 return false;
  339.  
  340.         CCCPOINT(CAIObject_CreateFormation);
  341.  
  342.         m_pFormation = GetAISystem()->CreateFormation(GetWeakRef(this), szName, vTargetPos);
  343.         return (m_pFormation != NULL);
  344. }
  345.  
  346. //
  347. //------------------------------------------------------------------------------------------------------------------------
  348. bool CAIObject::ReleaseFormation(void)
  349. {
  350.         if (m_pFormation)
  351.         {
  352.                 CCCPOINT(CAIObject_ReleaseFormation);
  353.                 GetAISystem()->ReleaseFormation(GetWeakRef(this), true);
  354.                 m_pFormation = 0;
  355.                 return true;
  356.         }
  357.         return false;
  358. }
  359.  
  360. //
  361. //------------------------------------------------------------------------------------------------------------------------
  362. Vec3 CAIObject::GetVelocity() const
  363. {
  364.         IAIActorProxy* pProxy = GetProxy();
  365.         if (!pProxy)
  366.                 return ZERO;
  367.  
  368.         IPhysicalEntity* pPhysicalEntity = pProxy->GetPhysics();
  369.         if (!pPhysicalEntity)
  370.                 return ZERO;
  371.  
  372.         CCCPOINT(CAIObject_GetVelocity);
  373.  
  374.         // if living entity return that vel since that is actualy the rate of
  375.         // change of position
  376.         pe_status_living status;
  377.         if (pPhysicalEntity->GetStatus(&status))
  378.                 return status.vel;
  379.  
  380.         pe_status_dynamics dSt;
  381.         pPhysicalEntity->GetStatus(&dSt);
  382.  
  383.         return dSt.v;
  384.  
  385. }
  386.  
  387. //
  388. //------------------------------------------------------------------------------------------------------------------------
  389. const char* CAIObject::GetEventName(unsigned short eType) const
  390. {
  391.         switch (eType)
  392.         {
  393.         case AIEVENT_ONVISUALSTIMULUS:
  394.                 return "OnVisualStimulus";
  395.         case AIEVENT_ONSOUNDEVENT:
  396.                 return "OnSoundEvent";
  397.         case AIEVENT_AGENTDIED:
  398.                 return "AgentDied";
  399.         case AIEVENT_SLEEP:
  400.                 return "Sleep";
  401.         case AIEVENT_WAKEUP:
  402.                 return "Wakeup";
  403.         case AIEVENT_ENABLE:
  404.                 return "Enable";
  405.         case AIEVENT_DISABLE:
  406.                 return "Disable";
  407.         case AIEVENT_PATHFINDON:
  408.                 return "PathfindOn";
  409.         case AIEVENT_PATHFINDOFF:
  410.                 return "PathfindOff";
  411.         case AIEVENT_CLEAR:
  412.                 return "Clear";
  413.         case AIEVENT_DROPBEACON:
  414.                 return "DropBeacon";
  415.         case AIEVENT_USE:
  416.                 return "Use";
  417.         default:
  418.                 return "undefined";
  419.         }
  420. }
  421.  
  422. //
  423. //------------------------------------------------------------------------------------------------------------------------
  424. void CAIObject::Event(unsigned short eType, SAIEVENT* pEvent)
  425. {
  426.         switch (eType)
  427.         {
  428.         case AIEVENT_DISABLE:
  429.                 {
  430.                         SetObservable(false);
  431.                         m_bEnabled = false;
  432.                 }
  433.                 break;
  434.         case AIEVENT_ENABLE:
  435.                 m_bEnabled = true;
  436.                 break;
  437.         case AIEVENT_SLEEP:
  438.                 m_bEnabled = false;
  439.                 break;
  440.         case AIEVENT_WAKEUP:
  441.                 m_bEnabled = true;
  442.                 break;
  443.         default:
  444.                 break;
  445.         }
  446. }
  447.  
  448. void CAIObject::EntityEvent(const SEntityEvent& event)
  449. {
  450.         switch (event.event)
  451.         {
  452.         case ENTITY_EVENT_ATTACH_THIS:
  453.         case ENTITY_EVENT_DETACH_THIS:
  454.         case ENTITY_EVENT_ENABLE_PHYSICS:
  455.                 UpdateObservableSkipList();
  456.                 break;
  457.         default:
  458.                 break;
  459.         }
  460. }
  461.  
  462. IPhysicalEntity* CAIObject::GetPhysics(bool bWantCharacterPhysics) const
  463. {
  464.         IEntity* pEntity = GetEntity();
  465.         return pEntity ? pEntity->GetPhysics() : 0;
  466. }
  467.  
  468. //====================================================================
  469. // GetEntityID
  470. //====================================================================
  471. unsigned CAIObject::GetEntityID() const
  472. {
  473.         return m_entityID;
  474. }
  475.  
  476. //====================================================================
  477. // SetEntityID
  478. //====================================================================
  479. void CAIObject::SetEntityID(unsigned ID)
  480. {
  481.         AIAssert((ID == 0) || (gEnv->pEntitySystem->GetEntity(ID) != NULL));
  482.  
  483.         m_entityID = ID;
  484. }
  485.  
  486. //====================================================================
  487. // GetEntity
  488. //
  489. // just a little helper
  490. //====================================================================
  491.  
  492. IEntity* CAIObject::GetEntity() const
  493. {
  494.         IEntitySystem* pEntitySystem = gEnv->pEntitySystem;
  495.         return pEntitySystem ? pEntitySystem->GetEntity(m_entityID) : 0;
  496. }
  497.  
  498. //====================================================================
  499. // SetFormationUpdateSight
  500. //====================================================================
  501. void CAIObject::SetFormationUpdateSight(float range, float minTime, float maxTime)
  502. {
  503.         if (m_pFormation)
  504.                 m_pFormation->SetUpdateSight(range, minTime, maxTime);
  505. }
  506.  
  507. //====================================================================
  508. // IsHostile
  509. //====================================================================
  510. bool CAIObject::IsHostile(const IAIObject* pOther, bool /*bUsingAIIgnorePlayer*/) const
  511. {
  512.         if (!pOther)
  513.                 return false;
  514.  
  515.         if (!IsThreateningForHostileFactions())
  516.                 return false;
  517.  
  518.         if (gAIEnv.pFactionMap->GetReaction(this->GetFactionID(), pOther->GetFactionID()) == IFactionMap::Hostile)
  519.                 return true;
  520.  
  521.         unsigned short nType = ((CAIObject*)pOther)->GetType();
  522.         return (nType == AIOBJECT_GRENADE || nType == AIOBJECT_RPG);
  523. }
  524.  
  525. //====================================================================
  526. // IsThreateningForHostileFactions
  527. //====================================================================
  528. bool CAIObject::IsThreateningForHostileFactions() const
  529. {
  530.         return m_isThreateningForHostileFactions;
  531. }
  532.  
  533. //====================================================================
  534. // SetThreateningForHostileFactions
  535. //====================================================================
  536. void CAIObject::SetThreateningForHostileFactions(const bool threatening)
  537. {
  538.         m_isThreateningForHostileFactions = threatening;
  539. }
  540.  
  541. //====================================================================
  542. // SetGroupId
  543. //====================================================================
  544. void CAIObject::SetGroupId(int id)
  545. {
  546.         m_groupId = id;
  547. }
  548.  
  549. //====================================================================
  550. // GetGroupId
  551. //====================================================================
  552. int CAIObject::GetGroupId() const
  553. {
  554.         return m_groupId;
  555. }
  556.  
  557. uint8 CAIObject::GetFactionID() const
  558. {
  559.         return m_factionID;
  560. }
  561.  
  562. void CAIObject::SetFactionID(uint8 factionID)
  563. {
  564.         if (m_factionID != factionID)
  565.         {
  566.                 m_factionID = factionID;
  567.                 if (IsObservable())
  568.                 {
  569.                         ObservableParams params;
  570.                         params.faction = GetFactionID();
  571.  
  572.                         gAIEnv.pVisionMap->ObservableChanged(GetVisionID(), params, eChangedFaction);
  573.                 }
  574.         }
  575. }
  576.  
  577. //===================================================================
  578. // GetAIDebugRecord
  579. //===================================================================
  580. IAIDebugRecord* CAIObject::GetAIDebugRecord()
  581. {
  582. #ifdef CRYAISYSTEM_DEBUG
  583.         return GetOrCreateRecorderUnit(this);
  584. #else
  585.         return NULL;
  586. #endif //CRYAISYSTEM_DEBUG
  587. }
  588.  
  589. #ifdef CRYAISYSTEM_DEBUG
  590. CRecorderUnit* CAIObject::CreateAIDebugRecord()
  591. {
  592.         return GetOrCreateRecorderUnit(this, true);
  593. }
  594. #endif //CRYAISYSTEM_DEBUG
  595.  
  596. tAIObjectID CAIObject::GetAIObjectID() const
  597. {
  598.         tAIObjectID nID = m_refThis.GetObjectID();
  599.         assert(nID);
  600.         return nID;
  601. }
  602.  
  603. bool CAIObject::IsEnabled() const
  604. {
  605.         return m_bEnabled;
  606. }
  607.  
  608. bool CAIObject::IsTargetable() const
  609. {
  610.         return IsEnabled();
  611. }
  612.  
  613. EntityId CAIObject::GetPerceivedEntityID() const
  614. {
  615.         return GetEntityID();
  616. }
  617.  
  618. bool CAIObject::HasFormation()
  619. {
  620.         return m_pFormation != NULL;
  621. }
  622.  
  623. const Vec3 CAIObject::GetFormationVelocity()
  624. {
  625.         CAISystem* pAISystem = GetAISystem();
  626.  
  627.         if (CLeader* pLeader = pAISystem->GetLeader(GetGroupId()))
  628.         {
  629.                 CAIObject* pAIObject = pLeader->GetFormationOwner().GetAIObject();
  630.                 if (pAIObject)
  631.                 {
  632.                         return pAIObject->GetVelocity();
  633.                 }
  634.         }
  635.  
  636.         IAIObject* pBoss = pAISystem->GetNearestObjectOfTypeInRange(this, AIOBJECT_ACTOR, 0, 20.0f, AIFAF_HAS_FORMATION | AIFAF_SAME_GROUP_ID);
  637.         if (pBoss)
  638.         {
  639.                 const Vec3 bossVelocity = pBoss->GetVelocity();
  640.                 return bossVelocity;
  641.         }
  642.  
  643.         return Vec3Constants<float>::fVec3_Zero;
  644. }
  645.  
  646. void CAIObject::SetProxy(IAIActorProxy* proxy)
  647. {
  648.         assert((m_nObjectType != AIOBJECT_WAYPOINT) &&
  649.                (m_nObjectType != AIANCHOR_COMBAT_HIDESPOT));
  650. }
  651.  
  652. IAIActorProxy* CAIObject::GetProxy() const
  653. {
  654.         return NULL;
  655. }
  656.  
  657. bool CAIObject::IsUpdatedOnce() const
  658. {
  659.         return m_bUpdatedOnce;
  660. }
  661.  
  662. void CAIObject::Release()
  663. {
  664.         delete this;
  665. }
  666.  
  667. const Vec3& CAIObject::GetViewDir() const
  668. {
  669.         return m_vView;
  670. }
  671.  
  672. const Vec3& CAIObject::GetMoveDir() const
  673. {
  674.         return m_vMoveDir;
  675. }
  676.  
  677. void CAIObject::SetFireDir(const Vec3& dir)
  678. {
  679.         m_vFireDir = dir;
  680. }
  681.  
  682. const Vec3& CAIObject::GetFireDir() const
  683. {
  684.         return m_vFireDir;
  685. }
  686.  
  687. void CAIObject::SetFirePos(const Vec3& pos)
  688. {
  689.         m_vFirePosition = pos;
  690. }
  691.  
  692. const Vec3& CAIObject::GetFirePos() const
  693. {
  694.         return m_vFirePosition;
  695. }
  696.  
  697. const Vec3& CAIObject::GetBodyDir() const
  698. {
  699.         return m_vBodyDir;
  700. }
  701.  
  702. const Vec3& CAIObject::GetEntityDir() const
  703. {
  704.         return m_vEntityDir;
  705. }
  706.  
  707. float CAIObject::GetRadius() const
  708. {
  709.         return m_fRadius;
  710. }
  711.  
  712. unsigned short CAIObject::GetAIType() const
  713. {
  714.         return m_nObjectType;
  715. }
  716.  
  717. IAIObject::ESubType CAIObject::GetSubType() const
  718. {
  719.         return m_objectSubType;
  720. }
  721.  
  722. const Vec3& CAIObject::GetPos() const
  723. {
  724.         m_bTouched = true;
  725.         return m_vPosition;
  726. }
  727.  
  728. const Vec3 CAIObject::GetPosInNavigationMesh(const uint32 agentTypeID) const
  729. {
  730.         Vec3 outputLocation = GetPos();
  731.         NavigationMeshID meshID = gAIEnv.pNavigationSystem->GetEnclosingMeshID(static_cast<NavigationAgentTypeID>(agentTypeID), outputLocation);
  732.         if (meshID)
  733.         {
  734.                 const NavigationMesh& mesh = gAIEnv.pNavigationSystem->GetMesh(meshID);
  735.                 const MNM::real_t strictVerticalRange = MNM::real_t(1.0f);
  736.                 const float fPushUp = 0.2f;
  737.                 const MNM::real_t pushUp = MNM::real_t(fPushUp);
  738.                 MNM::TriangleID triangleID(0);
  739.                 const MNM::vector3_t location_t(MNM::real_t(outputLocation.x), MNM::real_t(outputLocation.y), MNM::real_t(outputLocation.z) + pushUp);
  740.                 if (!(triangleID = mesh.navMesh.GetTriangleAt(location_t, strictVerticalRange, strictVerticalRange)))
  741.                 {
  742.                         const MNM::real_t largeVerticalRange = MNM::real_t(6.0f);
  743.                         const MNM::real_t largeHorizontalRange = MNM::real_t(3.0f);
  744.                         MNM::vector3_t closestLocation;
  745.                         if (triangleID = mesh.navMesh.GetClosestTriangle(location_t, largeVerticalRange, largeHorizontalRange, nullptr, &closestLocation))
  746.                         {
  747.                                 outputLocation = closestLocation.GetVec3();
  748.                                 outputLocation.z += fPushUp;
  749.                         }
  750.                 }
  751.         }
  752.         return outputLocation;
  753. }
  754.  
  755. IAIObject::EFieldOfViewResult CAIObject::IsPointInFOV(const Vec3& pos, float distanceScale /*= 1.0f*/) const
  756. {
  757.         return eFOV_Outside;
  758. }
  759.  
  760. const VisionID& CAIObject::GetVisionID() const
  761. {
  762.         return m_visionID;
  763. }
  764.  
  765. void CAIObject::SetVisionID(const VisionID& visionID)
  766. {
  767.         m_visionID = visionID;
  768. }
  769.  
  770. void CAIObject::SetObservable(bool observable)
  771. {
  772.         if (m_observable != observable)
  773.         {
  774.                 if (observable)
  775.                 {
  776.                         ObservableParams observableParams;
  777.                         observableParams.entityId = GetEntityID();
  778.                         observableParams.faction = GetFactionID();
  779.                         observableParams.typeMask = GetObservableTypeMask();
  780.  
  781.                         GetObservablePositions(observableParams);
  782.  
  783.                         PhysSkipList skipList;
  784.                         GetPhysicalSkipEntities(skipList);
  785.  
  786.                         observableParams.skipListSize = std::min<size_t>(skipList.size(), ObservableParams::MaxSkipListSize);
  787.                         for (size_t i = 0; i < static_cast<size_t>(observableParams.skipListSize); ++i)
  788.                                 observableParams.skipList[i] = skipList[i];
  789.  
  790.                         // M谩rcio: Should check for associated objects and add them here too?
  791.                         if (!m_visionID)
  792.                                 m_visionID = gAIEnv.pVisionMap->CreateVisionID(GetName());
  793.  
  794.                         gAIEnv.pVisionMap->RegisterObservable(m_visionID, observableParams);
  795.                 }
  796.                 else
  797.                 {
  798.                         if (m_visionID)
  799.                                 gAIEnv.pVisionMap->UnregisterObservable(m_visionID);
  800.                 }
  801.  
  802.                 m_observable = observable;
  803.         }
  804. }
  805.  
  806. bool CAIObject::IsObservable() const
  807. {
  808.         return m_observable;
  809. }
  810.  
  811. void CAIObject::GetObservablePositions(ObservableParams& observableParams) const
  812. {
  813.         observableParams.observablePositionsCount = 1;
  814.         observableParams.observablePositions[0] = GetPos();
  815. }
  816.  
  817. uint32 CAIObject::GetObservableTypeMask() const
  818. {
  819.         return General;
  820. }
  821.  
  822. void CAIObject::GetPhysicalSkipEntities(PhysSkipList& skipList) const
  823. {
  824.         if (IPhysicalEntity* physics = GetPhysics())
  825.                 stl::push_back_unique(skipList, physics);
  826.  
  827.         if (IPhysicalEntity* charPhysics = GetPhysics(true))
  828.                 stl::push_back_unique(skipList, charPhysics);
  829. }
  830.  
  831. void CAIObject::UpdateObservableSkipList() const
  832. {
  833.         if (m_observable)
  834.         {
  835.                 PhysSkipList skipList;
  836.                 GetPhysicalSkipEntities(skipList);
  837.  
  838.                 ObservableParams observableParams;
  839.                 observableParams.skipListSize = std::min<uint32>(skipList.size(), ObservableParams::MaxSkipListSize);
  840.                 for (size_t i = 0; i < static_cast<size_t>(observableParams.skipListSize); ++i)
  841.                         observableParams.skipList[i] = skipList[i];
  842.  
  843.                 gAIEnv.pVisionMap->ObservableChanged(GetVisionID(), observableParams, eChangedSkipList);
  844.         }
  845. }
  846.  
  847. //====================================================================
  848. // SAIActorTargetRequest Serialize
  849. //====================================================================
  850. void SAIActorTargetRequest::Serialize(TSerialize ser)
  851. {
  852.         ser.BeginGroup("SAIActorTargetRequest");
  853.         {
  854.                 _ser_value_(id);
  855.                 if (id != 0)
  856.                 {
  857.                         _ser_value_(approachLocation);
  858.                         _ser_value_(approachDirection);
  859.                         _ser_value_(animLocation);
  860.                         _ser_value_(animDirection);
  861.                         _ser_value_(vehicleName);
  862.                         _ser_value_(vehicleSeat);
  863.                         _ser_value_(speed);
  864.                         _ser_value_(directionTolerance);
  865.                         _ser_value_(startArcAngle);
  866.                         _ser_value_(startWidth);
  867.                         _ser_value_(signalAnimation);
  868.                         _ser_value_(projectEndPoint);
  869.                         _ser_value_(lowerPrecision);
  870.                         _ser_value_(useAssetAlignment);
  871.                         _ser_value_(animation);
  872.                         ser.EnumValue("stance", stance, STANCE_NULL, STANCE_LAST);
  873.                         // TODO: Pointers!
  874.                         //              TAnimationGraphQueryID * pQueryStart;
  875.                         //              TAnimationGraphQueryID * pQueryEnd;
  876.                 }
  877.         }
  878.         ser.EndGroup();
  879. }
  880.  
  881. //====================================================================
  882. // SAIPredictedCharacterState Serialize
  883. //====================================================================
  884. void SAIPredictedCharacterState::Serialize(TSerialize ser)
  885. {
  886.         ser.Value("position", position);
  887.         ser.Value("velocity", velocity);
  888.         ser.Value("predictionTime", predictionTime);
  889. }
  890.  
  891. //====================================================================
  892. // SAIPredictedCharacterStates Serialize
  893. //====================================================================
  894. void SAIPredictedCharacterStates::Serialize(TSerialize ser)
  895. {
  896.         ser.BeginGroup("SAIPredictedCharacterStates");
  897.         {
  898.                 ser.Value("nStates", nStates);
  899.                 int counter(0);
  900.                 char stateGroupName[32];
  901.                 for (int i(0); i < maxStates; ++i, ++counter)
  902.                 {
  903.                         cry_sprintf(stateGroupName, "State_%d", counter);
  904.                         ser.BeginGroup(stateGroupName);
  905.                         {
  906.                                 states[i].Serialize(ser);
  907.                         } ser.EndGroup();
  908.                 }
  909.         } ser.EndGroup();
  910. }
  911. //====================================================================
  912. // SOBJECTSTATE Serialize
  913. //====================================================================
  914. void SOBJECTSTATE::Serialize(TSerialize ser)
  915. {
  916.         ser.BeginGroup("SOBJECTSTATE");
  917.         {
  918.                 ser.Value("jump", jump);
  919.                 ser.Value("bCloseContact", bCloseContact);
  920.                 ser.ValueWithDefault("fDesiredSpeed", fDesiredSpeed, 1.f);
  921.                 ser.Value("fMovementUrgency", fMovementUrgency);
  922.                 ser.Value("bodystate", bodystate);
  923.                 ser.Value("vForcedNavigation", vForcedNavigation);
  924.                 ser.Value("vBodyTargetDir", vBodyTargetDir);
  925.                 ser.Value("vLookTargetPos", vLookTargetPos);
  926.                 ser.Value("vDesiredBodyDirectionAtTarget", vDesiredBodyDirectionAtTarget);
  927.                 ser.Value("movementContext", movementContext);
  928.                 ser.EnumValue("eTargetType", eTargetType, AITARGET_NONE, AITARGET_LAST);
  929.                 ser.EnumValue("eTargetThreat", eTargetThreat, AITHREAT_NONE, AITHREAT_LAST);
  930.                 ser.EnumValue("ePeakTargetThreat", ePeakTargetThreat, AITHREAT_NONE, AITHREAT_LAST);
  931.                 ser.EnumValue("ePeakTargetType", ePeakTargetType, AITARGET_NONE, AITARGET_LAST);
  932.                 ser.Value("ePeakTargetID", ePeakTargetID);
  933.                 ser.Value("eTargetID", eTargetID);
  934.                 ser.Value("vTargetPos", vTargetPos);
  935.                 ser.EnumValue("ePreviousPeakTargetThreat", ePreviousPeakTargetThreat, AITHREAT_NONE, AITHREAT_LAST);
  936.                 ser.EnumValue("ePreviousPeakTargetType", ePreviousPeakTargetType, AITARGET_NONE, AITARGET_LAST);
  937.                 ser.Value("ePreviousPeakTargetID", ePreviousPeakTargetID);
  938.                 ser.Value("bTargetEnabled", bTargetEnabled);
  939.                 ser.Value("nTargetType", nTargetType);
  940.                 ser.Value("lean", lean);
  941.                 ser.Value("peekOver", peekOver);
  942.                 ser.Value("aimTargetIsValid", aimTargetIsValid);
  943.                 ser.Value("weaponAccessories", weaponAccessories);
  944.  
  945.                 if (ser.IsReading())
  946.                 {
  947.                         fire = eAIFS_Off;
  948.                         fireSecondary = eAIFS_Off;
  949.                         fireMelee = eAIFS_Off;
  950.                 }
  951.                 ser.Value("aimObstructed", aimObstructed);
  952.                 ser.Value("forceWeaponAlertness", forceWeaponAlertness);
  953.                 ser.Value("fProjectileSpeedScale", projectileInfo.fSpeedScale);
  954.                 ser.Value("projectileTrackingId", projectileInfo.trackingId);
  955.                 ser.Value("vShootTargetPos", vShootTargetPos);
  956.                 ser.Value("vAimTargetPos", vAimTargetPos);
  957.                 ser.Value("allowStrafing", allowStrafing);
  958.                 ser.Value("allowEntityClampingByAnimation", allowEntityClampingByAnimation);
  959.                 ser.Value("fDistanceToPathEnd", fDistanceToPathEnd);
  960.                 ser.Value("curActorTargetFinishPos", curActorTargetFinishPos);
  961.                 //              ser.Value("remainingPath", remainingPath);
  962.                 ser.Value("fDistanceFromTarget", fDistanceFromTarget);
  963.                 ser.EnumValue("eTargetStuntReaction", eTargetStuntReaction, AITSR_NONE, AITSR_LAST);
  964.                 ser.EnumValue("curActorTargetPhase", curActorTargetPhase, eATP_None, eATP_Error);
  965.                 actorTargetReq.Serialize(ser);
  966.                 // serialize signals
  967.                 ser.BeginGroup("SIGNALS");
  968.                 {
  969.                         int signalsCount = vSignals.size();
  970.                         ser.Value("signalsCount", signalsCount);
  971.                         if (ser.IsReading())
  972.                         {
  973.                                 vSignals.resize(signalsCount);
  974.                         }
  975.                         for (DynArray<AISIGNAL>::iterator ai(vSignals.begin()); ai != vSignals.end(); ++ai)
  976.                         {
  977.                                 ser.BeginGroup("Signal");
  978.                                 {
  979.                                         AISIGNAL& signal = *ai;
  980.                                         signal.Serialize(ser);
  981.                                 }
  982.                                 ser.EndGroup();
  983.                         }
  984.                 }
  985.                 ser.EndGroup();
  986.  
  987.                 ser.Value("secondaryIndex", secondaryIndex);
  988.                 //this is not used in C2, don't waste space..
  989.                 //ser.Value("predictedCharacterStates", predictedCharacterStates);
  990.         }
  991.         ser.EndGroup();
  992. }
  993.  
  994. //====================================================================
  995. // AgentPerceptionParameters Serialize
  996. //====================================================================
  997. void AgentPerceptionParameters::Serialize(TSerialize ser)
  998. {
  999.         ser.BeginGroup("AgentPerceptionParameters");
  1000.         {
  1001.                 _ser_value_(sightRange);
  1002.                 _ser_value_(sightRangeVehicle);
  1003.                 _ser_value_(sightNearRange);
  1004.                 _ser_value_(sightDelay);
  1005.                 _ser_value_(FOVPrimary);
  1006.                 _ser_value_(FOVSecondary);
  1007.                 _ser_value_(stanceScale);
  1008.                 _ser_value_(audioScale);
  1009.                 _ser_value_(targetPersistence);
  1010.                 _ser_value_(reactionTime);
  1011.                 _ser_value_(collisionReactionScale);
  1012.                 _ser_value_(stuntReactionTimeOut);
  1013.                 _ser_value_(forgetfulness);
  1014.                 _ser_value_(forgetfulnessTarget);
  1015.                 _ser_value_(forgetfulnessSeek);
  1016.                 _ser_value_(forgetfulnessMemory);
  1017.                 _ser_value_(isAffectedByLight);
  1018.                 _ser_value_(minAlarmLevel);
  1019.                 _ser_value_(bulletHitRadius);
  1020.                 _ser_value_(cloakMaxDistStill);
  1021.                 _ser_value_(cloakMaxDistMoving);
  1022.                 _ser_value_(cloakMaxDistCrouchedAndStill);
  1023.                 _ser_value_(cloakMaxDistCrouchedAndMoving);
  1024.                 _ser_value_(perceptionScale.audio);
  1025.                 _ser_value_(perceptionScale.visual);
  1026.         }
  1027.         ser.EndGroup();
  1028. }
  1029.  
  1030. //====================================================================
  1031. // AgentPerceptionParameters Serialize
  1032. //====================================================================
  1033. void AgentParameters::Serialize(TSerialize ser)
  1034. {
  1035.         ser.BeginGroup("AgentParameters");
  1036.         {
  1037.                 m_PerceptionParams.Serialize(ser);
  1038.  
  1039.                 _ser_value_(m_nGroup);
  1040.                 _ser_value_(m_CombatClass);
  1041.                 _ser_value_(m_fAccuracy);
  1042.                 _ser_value_(m_fPassRadius);
  1043.                 _ser_value_(m_fStrafingPitch);    //if this > 0, will do a strafing draw line firing. 04/12/05 Tetsuji
  1044.                 _ser_value_(m_fAttackRange);
  1045.                 _ser_value_(m_fCommRange);
  1046.                 _ser_value_(m_fAttackZoneHeight);
  1047.                 _ser_value_(m_weaponAccessories);
  1048.                 _ser_value_(m_fMeleeRange);
  1049.                 _ser_value_(m_fMeleeRangeShort);
  1050.                 _ser_value_(m_fMeleeHitRange);
  1051.                 _ser_value_(m_fMeleeAngleCosineThreshold);
  1052.                 _ser_value_(factionID);
  1053.                 _ser_value_(factionHostility);
  1054.                 _ser_value_(m_bPerceivePlayer);
  1055.                 _ser_value_(m_fAwarenessOfPlayer);
  1056.                 _ser_value_(m_bInvisible);
  1057.                 _ser_value_(m_fCloakScale);
  1058.                 _ser_value_(m_fCloakScaleTarget);
  1059.                 _ser_value_(m_lookIdleTurnSpeed);
  1060.                 _ser_value_(m_lookCombatTurnSpeed);
  1061.                 _ser_value_(m_aimTurnSpeed);
  1062.                 _ser_value_(m_fireTurnSpeed);
  1063.                 _ser_value_(m_bAiIgnoreFgNode);
  1064.                 _ser_value_(m_fProjectileLaunchDistScale);
  1065.         }
  1066.         ser.EndGroup();
  1067. }
  1068.  
  1069. //--------------------------------------------------------------------
  1070.  
downloadAIObject.cpp 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