BVB Source Codes

CRYENGINE Show AIGroupProxy.cpp Source code

Return Download CRYENGINE: download AIGroupProxy.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 "AIGroupProxy.h"
  5.  
  6. #include <CryAISystem/IAIObjectManager.h>
  7.  
  8. CAIGroupProxy::CAIGroupProxy(int groupID)
  9. {
  10.         SmartScriptTable group;
  11.  
  12.         if (gEnv->pScriptSystem->GetGlobalValue("AIGroup", group))
  13.         {
  14.                 m_script.Create(gEnv->pScriptSystem, false);
  15.                 m_script->Delegate(group);
  16.  
  17.                 m_script->SetValue("id", groupID);
  18.  
  19.                 m_membersTable.Create(gEnv->pScriptSystem, false);
  20.                 m_script->SetValue("members", m_membersTable);
  21.         }
  22.  
  23.         gEnv->pScriptSystem->GetGlobalValue("AIGroupBehavior", m_behaviorsTable);
  24. }
  25.  
  26. CAIGroupProxy::~CAIGroupProxy()
  27. {
  28. }
  29.  
  30. void CAIGroupProxy::Reset(EObjectResetType type)
  31. {
  32.         if (type == AIOBJRESET_SHUTDOWN)
  33.         {
  34.                 m_behavior = 0;
  35.                 m_prevBehavior = 0;
  36.                 m_behaviorsTable = 0;
  37.         }
  38.         else
  39.         {
  40.                 gEnv->pScriptSystem->GetGlobalValue("AIGroupBehavior", m_behaviorsTable);
  41.  
  42.                 m_behavior = 0;
  43.                 m_prevBehavior = 0;
  44.         }
  45. }
  46.  
  47. void CAIGroupProxy::Serialize(TSerialize ser)
  48. {
  49.         if (m_script && m_script->HaveValue("OnSaveAI") && m_script->HaveValue("OnLoadAI"))
  50.         {
  51.                 SmartScriptTable saved(m_script->GetScriptSystem());
  52.                 if (ser.IsWriting())
  53.                         Script::CallMethod(m_script, "OnSaveAI", saved);
  54.                 ser.Value("ScriptData", saved.GetPtr());
  55.                 if (ser.IsReading())
  56.                         Script::CallMethod(m_script, "OnLoadAI", saved);
  57.         }
  58.  
  59.         string behaviorName = GetCurrentBehaviorName();
  60.         ser.Value("BehaviorName", behaviorName);
  61.  
  62.         if (ser.IsReading())
  63.                 SetBehaviour(behaviorName.c_str(), false);
  64. }
  65.  
  66. const char* CAIGroupProxy::GetCurrentBehaviorName() const
  67. {
  68.         // @Marcio: Maybe you wanted the name to be in the script?
  69.         // If you didn't, just remove this. /Jonas 2010-08-25
  70.  
  71.         //  const char* name = 0;
  72.         //  if (m_behavior)
  73.         //    m_behavior->GetValue("Name", name);
  74.         //
  75.         //  return name;
  76.  
  77.         return m_behaviorName.c_str();
  78. }
  79.  
  80. const char* CAIGroupProxy::GetPreviousBehaviorName() const
  81. {
  82.         //  const char* name = 0;
  83.         //  if (m_prevBehavior)
  84.         //    m_prevBehavior->GetValue("Name", name);
  85.         //
  86.         //  return name;
  87.  
  88.         return 0;
  89. }
  90.  
  91. void CAIGroupProxy::Notify(uint32 notificationID, tAIObjectID senderID, const char* notification)
  92. {
  93.         IScriptTable* senderScript = 0;
  94.         if (IAIObject* sender = senderID ? gEnv->pAISystem->GetAIObjectManager()->GetAIObject(senderID) : 0)
  95.                 if (IEntity* senderEntity = sender->GetEntity())
  96.                         senderScript = senderEntity->GetScriptTable();
  97.  
  98.         CallNotification(m_behavior, notification, notificationID, senderScript);
  99.  
  100.         Members::iterator it = m_members.begin();
  101.         Members::iterator end = m_members.end();
  102.  
  103.         for (uint32 k = 1; it != end; ++it)
  104.         {
  105.                 if (IAIObject* aiObject = gEnv->pAISystem->GetAIObjectManager()->GetAIObject(*it))
  106.                         gEnv->pAISystem->SendSignal(SIGNALFILTER_SENDER, 0, notification, aiObject);
  107.         }
  108. }
  109.  
  110. void CAIGroupProxy::SetBehaviour(const char* behaviour, bool callCDtors)
  111. {
  112.         if (m_behavior && callCDtors)
  113.                 CallScript(m_behavior, "Destructor");
  114.  
  115.         m_prevBehavior = m_behavior;
  116.         m_behavior = 0;
  117.         m_behaviorName.clear();
  118.  
  119.         if (m_behaviorsTable)
  120.         {
  121.                 if (!m_behaviorsTable->GetValue(behaviour, m_behavior))
  122.                         m_behaviorsTable->GetValue("DEFAULT", m_behavior);
  123.         }
  124.  
  125.         if (m_behavior)
  126.         {
  127.                 m_behaviorName = behaviour;
  128.                 m_script->SetValue("Behavior", m_behavior);
  129.  
  130.                 if (callCDtors)
  131.                         CallScript(m_behavior, "Constructor");
  132.         }
  133.         else
  134.                 m_script->SetToNull("Behavior");
  135. }
  136.  
  137. void CAIGroupProxy::MemberAdded(tAIObjectID memberID)
  138. {
  139.         stl::push_back_unique(m_members, memberID);
  140.  
  141.         PopulateMembersTable();
  142. }
  143.  
  144. void CAIGroupProxy::MemberRemoved(tAIObjectID memberID)
  145. {
  146.         stl::find_and_erase(m_members, memberID);
  147.  
  148.         PopulateMembersTable();
  149. }
  150.  
  151. bool CAIGroupProxy::CallScript(IScriptTable* table, const char* funcName)
  152. {
  153.         if (table)
  154.         {
  155.                 HSCRIPTFUNCTION functionToCall = 0;
  156.                 if (table->GetValue(funcName, functionToCall) && functionToCall)
  157.                 {
  158.                         gEnv->pScriptSystem->BeginCall(functionToCall);
  159.                         gEnv->pScriptSystem->PushFuncParam(table);
  160.                         gEnv->pScriptSystem->PushFuncParam(m_script);
  161.                         gEnv->pScriptSystem->EndCall();
  162.  
  163.                         gEnv->pScriptSystem->ReleaseFunc(functionToCall);
  164.  
  165.                         return true;
  166.                 }
  167.         }
  168.  
  169.         return false;
  170. }
  171.  
  172. bool CAIGroupProxy::CallNotification(IScriptTable* table, const char* notification, uint32 notificationID,
  173.                                      IScriptTable* sender)
  174. {
  175.         if (table)
  176.         {
  177.                 HSCRIPTFUNCTION functionToCall = 0;
  178.                 if (table->GetValue(notification, functionToCall) && functionToCall)
  179.                 {
  180.                         gEnv->pScriptSystem->BeginCall(functionToCall);
  181.                         gEnv->pScriptSystem->PushFuncParam(table);
  182.                         gEnv->pScriptSystem->PushFuncParam(m_script);
  183.                         gEnv->pScriptSystem->PushFuncParam(ScriptHandle(notificationID));
  184.                         gEnv->pScriptSystem->PushFuncParam(sender);
  185.                         gEnv->pScriptSystem->EndCall();
  186.  
  187.                         gEnv->pScriptSystem->ReleaseFunc(functionToCall);
  188.  
  189.                         return true;
  190.                 }
  191.         }
  192.  
  193.         return false;
  194. }
  195.  
  196. void CAIGroupProxy::PopulateMembersTable()
  197. {
  198.         if (m_membersTable.GetPtr())
  199.         {
  200.                 m_membersTable->Clear();
  201.  
  202.                 Members::iterator it = m_members.begin();
  203.                 Members::iterator end = m_members.end();
  204.  
  205.                 for (uint32 k = 1; it != end; ++it)
  206.                 {
  207.                         if (IAIObject* aiObject = gEnv->pAISystem->GetAIObjectManager()->GetAIObject(*it))
  208.                                 if (IEntity* entity = aiObject->GetEntity())
  209.                                         if (IScriptTable* scriptTable = entity->GetScriptTable())
  210.                                                 m_membersTable->SetAt(k++, scriptTable);
  211.                 }
  212.         }
  213. }
  214.  
  215. IScriptTable* CAIGroupProxy::GetScriptTable()
  216. {
  217.         return m_script;
  218. };
  219.  
downloadAIGroupProxy.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