BVB Source Codes

CRYENGINE Show Group.cpp Source code

Return Download CRYENGINE: download Group.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 "Group.h"
  5. #include "GroupManager.h"
  6. #include "SelectionTree/SelectionTreeManager.h"
  7. #include "ObjectContainer.h"
  8. #include "PipeUser.h"
  9.  
  10. Group::TargetInfos Group::s_targetInfos;
  11.  
  12. Group::Group()
  13.         : m_targetThreat(AITHREAT_NONE)
  14.         , m_targetType(AITARGET_NONE)
  15.         , m_prevTargetType(AITARGET_NONE)
  16.         , m_targetLocation(ZERO)
  17.         , m_groupID(-1)
  18. {
  19. }
  20.  
  21. Group::Group(const GroupID& groupID)
  22.         : m_targetThreat(AITHREAT_NONE)
  23.         , m_targetType(AITARGET_NONE)
  24.         , m_prevTargetType(AITARGET_NONE)
  25.         , m_targetLocation(ZERO)
  26.         , m_groupID(groupID)
  27. {
  28.         m_proxy.reset(GetAISystem()->GetGroupProxyFactory()->CreateGroupProxy(groupID));
  29. }
  30.  
  31. Group::~Group()
  32. {
  33. }
  34.  
  35. const Group::Members& Group::GetMembers() const
  36. {
  37.         return m_members;
  38. }
  39.  
  40. uint32 Group::GetMemberCount() const
  41. {
  42.         return m_members.size();
  43. }
  44.  
  45. void Group::AddMember(tAIObjectID objectID)
  46. {
  47.         std::pair<Group::Members::iterator, bool> miresult = m_members.insert(objectID);
  48.         assert(miresult.second);
  49.  
  50.         m_proxy->MemberAdded(objectID);
  51. }
  52.  
  53. void Group::RemoveMember(tAIObjectID objectID)
  54. {
  55.         m_members.erase(objectID);
  56.  
  57.         m_proxy->MemberRemoved(objectID);
  58. }
  59.  
  60. void Group::Reset(EObjectResetType type)
  61. {
  62.         m_proxy->Reset(type);
  63.  
  64.         m_target.Release();
  65.         m_targetThreat = AITHREAT_NONE;
  66.         m_targetType = AITARGET_NONE;
  67.         m_prevTargetType = AITARGET_NONE;
  68.         m_targetLocation.zero();
  69. }
  70.  
  71. void Group::Update(float updateTime)
  72. {
  73.         while (!m_notifications.empty())
  74.         {
  75.                 QueuedNotification& notification = m_notifications.front();
  76.  
  77.                 m_proxy->Notify(notification.ID, notification.senderID, notification.notification);
  78.  
  79.                 m_notifications.pop_front();
  80.         }
  81.  
  82.         // This update call on the behavior is not needed for now /Mario
  83.         //m_proxy->Notify(0, 0, "Update");
  84.  
  85.         Group::Members::const_iterator mit = m_members.begin();
  86.         Group::Members::const_iterator mend = m_members.end();
  87.  
  88.         s_targetInfos.clear();
  89.         s_targetInfos.reserve(8);
  90.  
  91.         for (; mit != mend; ++mit)
  92.         {
  93.                 IAIObject* aiObject = gAIEnv.pObjectContainer->GetAIObject(*mit);
  94.                 CPipeUser* actor = aiObject ? aiObject->CastToCPipeUser() : 0;
  95.  
  96.                 if (!actor || !actor->IsEnabled() || actor->IsPaused())
  97.                         continue;
  98.  
  99.                 if (IAIObject* target = actor->GetAttentionTarget())
  100.                 {
  101.                         CAIObject* targetObject = static_cast<CAIObject*>(target);
  102.                         tAIObjectID targetID = 0;
  103.                         uint32 targetThreat = actor->GetAttentionTargetThreat();
  104.                         uint32 targetType = actor->GetAttentionTargetType();
  105.                         uint32 targetObjType = targetObject->GetType();
  106.  
  107.                         if (targetObjType != AIOBJECT_DUMMY)
  108.                                 targetID = target->GetAIObjectID();
  109.                         else if (CAIObject* association = targetObject->GetAssociation().GetAIObject())
  110.                                 targetID = association->GetAIObjectID();
  111.  
  112.                         if (actor->IsPersonallyHostile(targetID) &&
  113.                             (gAIEnv.pFactionMap->GetReaction(actor->GetFactionID(), target->GetFactionID()) > IFactionMap::Hostile))
  114.                                 continue;
  115.  
  116.                         if (actor->GetState().bTargetIsGroupTarget)
  117.                                 continue;
  118.  
  119.                         uint32 infoCount = s_targetInfos.size();
  120.  
  121.                         uint32 i = 0;
  122.                         for (; i < infoCount; ++i)
  123.                         {
  124.                                 TargetInfo& info = s_targetInfos[i];
  125.                                 if (info.targetID == targetID)
  126.                                 {
  127.                                         ++info.occurences;
  128.                                         info.position += targetObject->GetPos();
  129.  
  130.                                         if (info.threat < targetThreat)
  131.                                                 info.threat = targetThreat;
  132.  
  133.                                         if (info.type < targetType)
  134.                                                 info.type = targetType;
  135.  
  136.                                         break;
  137.                                 }
  138.                         }
  139.  
  140.                         if (i == infoCount)
  141.                                 s_targetInfos.push_back(TargetInfo(targetID, targetThreat, targetType, targetObject->GetPos()));
  142.                 }
  143.         }
  144.  
  145.         if (!s_targetInfos.empty())
  146.         {
  147.                 std::sort(s_targetInfos.begin(), s_targetInfos.end());
  148.  
  149.                 TargetInfo& info = s_targetInfos.back();
  150.  
  151.                 m_targetThreat = (EAITargetThreat)info.threat;
  152.                 m_targetType = (EAITargetType)info.type;
  153.                 m_targetLocation = info.position / (float)info.occurences;
  154.  
  155.                 if (m_target.IsNil() || !m_target.GetAIObject())
  156.                         gAIEnv.pAIObjectManager->CreateDummyObject(m_target, "");
  157.  
  158.                 CAIObject* targetObj = m_target.GetAIObject();
  159.                 CWeakRef<CAIObject> assocRef = targetObj->GetAssociation();
  160.                 tAIObjectID currentID = assocRef.GetObjectID();
  161.  
  162.                 if (currentID != info.targetID)
  163.                 {
  164.                         if (IAIObject* groupTarget = gAIEnv.pObjectContainer->GetAIObject(info.targetID))
  165.                         {
  166.                                 char targetName[256];
  167.                                 cry_sprintf(targetName, "Group Target [%s]", groupTarget->GetName());
  168.                                 m_target->SetName(targetName);
  169.                                 m_target->SetEntityID(groupTarget->GetEntityID());
  170.                         }
  171.                 }
  172.  
  173.                 m_target->SetAssociation(gAIEnv.pObjectContainer->GetWeakRef(info.targetID));
  174.                 m_target->SetPos(m_targetLocation);
  175.         }
  176.  
  177.         if (m_targetType != m_prevTargetType)
  178.         {
  179.                 switch (m_targetType)
  180.                 {
  181.                 case AITARGET_NONE:
  182.                         gAIEnv.pGroupManager->NotifyGroup(m_groupID, 0, "OnGroupTargetNone");
  183.                         break;
  184.                 case AITARGET_SOUND:
  185.                         gAIEnv.pGroupManager->NotifyGroup(m_groupID, 0, "OnGroupTargetSound");
  186.                         break;
  187.                 case AITARGET_MEMORY:
  188.                         gAIEnv.pGroupManager->NotifyGroup(m_groupID, 0, "OnGroupTargetMemory");
  189.                         break;
  190.                 case AITARGET_VISUAL:
  191.                         gAIEnv.pGroupManager->NotifyGroup(m_groupID, 0, "OnGroupTargetVisual");
  192.                         break;
  193.                 default:
  194.                         break;
  195.                 }
  196.  
  197.                 m_prevTargetType = m_targetType;
  198.         }
  199.  
  200.         m_targetType = std::min(AITARGET_MEMORY, m_targetType);
  201. }
  202.  
  203. bool Group::Empty() const
  204. {
  205.         return m_members.empty();
  206. }
  207.  
  208. void Group::Swap(Group& other)
  209. {
  210.         std::swap(m_target, other.m_target);
  211.         std::swap(m_targetThreat, other.m_targetThreat);
  212.         std::swap(m_targetType, other.m_targetType);
  213.         std::swap(m_targetLocation, other.m_targetLocation);
  214.         std::swap(m_groupID, other.m_groupID);
  215.  
  216.         m_proxy.swap(other.m_proxy);
  217.         m_members.swap(other.m_members);
  218. }
  219.  
  220. const CCountedRef<CAIObject>& Group::GetTarget() const
  221. {
  222.         return m_target;
  223. }
  224.  
  225. EAITargetThreat Group::GetTargetThreat() const
  226. {
  227.         return m_targetThreat;
  228. }
  229.  
  230. EAITargetType Group::GetTargetType() const
  231. {
  232.         return m_targetType;
  233. }
  234.  
  235. const Vec3& Group::GetTargetLocation() const
  236. {
  237.         return m_targetLocation;
  238. }
  239.  
  240. void Group::Notify(const NotificationID& notificationID, tAIObjectID recipientID, const char* name)
  241. {
  242.         m_notifications.push_back(QueuedNotification(notificationID, recipientID, name));
  243. }
  244.  
  245. void Group::Serialize(TSerialize ser)
  246. {
  247.         ser.Value("GroupID", m_groupID);
  248.  
  249.         if (ser.IsReading())
  250.                 Group(m_groupID).Swap(*this);
  251.  
  252.         ser.EnumValue("TargetThreat", m_targetThreat, AITHREAT_NONE, AITHREAT_LAST);
  253.         ser.EnumValue("TargetType", m_targetType, AITARGET_NONE, AITARGET_LAST);
  254.         ser.Value("TargetLocation", m_targetLocation);
  255.         ser.Value("Members", m_members);
  256.         ser.Value("Target", m_target);
  257.         ser.Value("Notifications", m_notifications);
  258.         m_proxy->Serialize(ser);
  259. }
  260.  
downloadGroup.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