BVB Source Codes

CRYENGINE Show ScriptBind_Action.cpp Source code

Return Download CRYENGINE: download ScriptBind_Action.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 "GameObjects/GameObject.h"
  5. #include "ScriptBind_Action.h"
  6. #include "Serialization/XMLScriptLoader.h"
  7. #include "CryAction.h"
  8. #include "Network/GameServerChannel.h"
  9. #include "Network/GameServerNub.h"
  10. #include "Network/GameContext.h"
  11. #include "SignalTimers/SignalTimers.h"
  12. #include "RangeSignalingSystem/RangeSignaling.h"
  13. #include <CryEntitySystem/IEntitySystem.h>
  14. #include "AIProxy.h"
  15. #include <CryGame/IGameTokens.h>
  16. #include <IEffectSystem.h>
  17. #include <IGameplayRecorder.h>
  18. #include "PersistantDebug.h"
  19. #include <CryAISystem/IAIObject.h>
  20.  
  21. //------------------------------------------------------------------------
  22. CScriptBind_Action::CScriptBind_Action(CCryAction* pCryAction)
  23.         : m_pCryAction(pCryAction)
  24. {
  25.         Init(gEnv->pScriptSystem, GetISystem());
  26.         SetGlobalName("CryAction");
  27.  
  28.         RegisterGlobals();
  29.         RegisterMethods();
  30.  
  31.         m_pPreviousView = NULL;
  32. }
  33.  
  34. //------------------------------------------------------------------------
  35. CScriptBind_Action::~CScriptBind_Action()
  36. {
  37. }
  38.  
  39. //------------------------------------------------------------------------
  40. void CScriptBind_Action::RegisterGlobals()
  41. {
  42.         SCRIPT_REG_GLOBAL(eGE_DiscreetSample);
  43.         SCRIPT_REG_GLOBAL(eGE_GameReset);
  44.         SCRIPT_REG_GLOBAL(eGE_GameStarted);
  45.         SCRIPT_REG_GLOBAL(eGE_SuddenDeath);
  46.         SCRIPT_REG_GLOBAL(eGE_RoundEnd);
  47.         SCRIPT_REG_GLOBAL(eGE_GameEnd);
  48.         SCRIPT_REG_GLOBAL(eGE_Connected);
  49.         SCRIPT_REG_GLOBAL(eGE_Disconnected);
  50.         SCRIPT_REG_GLOBAL(eGE_Renamed);
  51.         SCRIPT_REG_GLOBAL(eGE_ChangedTeam);
  52.         SCRIPT_REG_GLOBAL(eGE_Death);
  53.         SCRIPT_REG_GLOBAL(eGE_Scored);
  54.         SCRIPT_REG_GLOBAL(eGE_Currency);
  55.         SCRIPT_REG_GLOBAL(eGE_Rank);
  56.         SCRIPT_REG_GLOBAL(eGE_Spectator);
  57.         SCRIPT_REG_GLOBAL(eGE_ScoreReset);
  58.         SCRIPT_REG_GLOBAL(eGE_Damage);
  59.         SCRIPT_REG_GLOBAL(eGE_WeaponHit);
  60.  
  61.         gEnv->pScriptSystem->SetGlobalValue("QueryAimFromMovementController", CAIProxy::QueryAimFromMovementController);
  62.         gEnv->pScriptSystem->SetGlobalValue("OverriddenAndAiming", CAIProxy::OverriddenAndAiming);
  63.         gEnv->pScriptSystem->SetGlobalValue("OverriddenAndNotAiming", CAIProxy::OverriddenAndNotAiming);
  64. }
  65.  
  66. //------------------------------------------------------------------------
  67. void CScriptBind_Action::RegisterMethods()
  68. {
  69. #undef SCRIPT_REG_CLASSNAME
  70. #define SCRIPT_REG_CLASSNAME &CScriptBind_Action::
  71.  
  72.         SCRIPT_REG_TEMPLFUNC(LoadXML, "definitionFile, dataFile");
  73.         SCRIPT_REG_TEMPLFUNC(SaveXML, "definitionFile, dataFile, dataTable");
  74.         SCRIPT_REG_TEMPLFUNC(IsServer, "");
  75.         SCRIPT_REG_TEMPLFUNC(IsClient, "");
  76.         SCRIPT_REG_TEMPLFUNC(IsGameStarted, "");
  77.         SCRIPT_REG_TEMPLFUNC(IsRMIServer, "");
  78.         SCRIPT_REG_TEMPLFUNC(IsGameObjectProbablyVisible, "entityId");
  79.         SCRIPT_REG_TEMPLFUNC(GetPlayerList, "");
  80.         SCRIPT_REG_TEMPLFUNC(ActivateEffect, "name");
  81.         SCRIPT_REG_TEMPLFUNC(GetWaterInfo, "pos");
  82.         SCRIPT_REG_TEMPLFUNC(GetServer, "number");
  83.         SCRIPT_REG_TEMPLFUNC(ConnectToServer, "server");
  84.         SCRIPT_REG_TEMPLFUNC(RefreshPings, "");
  85.         SCRIPT_REG_TEMPLFUNC(GetServerTime, "");
  86.         SCRIPT_REG_TEMPLFUNC(PauseGame, "pause");
  87.         SCRIPT_REG_TEMPLFUNC(IsImmersivenessEnabled, "");
  88.         SCRIPT_REG_TEMPLFUNC(IsChannelSpecial, "entityId/channelId");
  89.  
  90.         SCRIPT_REG_TEMPLFUNC(ForceGameObjectUpdate, "entityId, force");
  91.         SCRIPT_REG_TEMPLFUNC(CreateGameObjectForEntity, "entityId");
  92.         SCRIPT_REG_TEMPLFUNC(BindGameObjectToNetwork, "entityId");
  93.         SCRIPT_REG_TEMPLFUNC(ActivateExtensionForGameObject, "entityId, extension, activate");
  94.         SCRIPT_REG_TEMPLFUNC(SetNetworkParent, "entityId, parentId");
  95.         SCRIPT_REG_TEMPLFUNC(IsChannelOnHold, "channelId");
  96.         SCRIPT_REG_TEMPLFUNC(BanPlayer, "playerId, message");
  97.  
  98.         SCRIPT_REG_TEMPLFUNC(PersistantSphere, "pos, radius, color, name, timeout");
  99.         SCRIPT_REG_TEMPLFUNC(PersistantLine, "start, end, color, name, timeout");
  100.         SCRIPT_REG_TEMPLFUNC(PersistantArrow, "pos, radius, color, dir, name, timeout");
  101.         SCRIPT_REG_TEMPLFUNC(Persistant2DText, "text, size, color, name, timeout");
  102.         SCRIPT_REG_TEMPLFUNC(PersistantEntityTag, "entityId, text");
  103.         SCRIPT_REG_TEMPLFUNC(ClearEntityTags, "entityId");
  104.         SCRIPT_REG_TEMPLFUNC(ClearStaticTag, "entityId, staticId");
  105.  
  106.         SCRIPT_REG_TEMPLFUNC(SendGameplayEvent, "entityId, event, [desc], [value], [ID|ptr], [str]");
  107.  
  108.         SCRIPT_REG_TEMPLFUNC(CacheItemSound, "itemName");
  109.         SCRIPT_REG_TEMPLFUNC(CacheItemGeometry, "itemName");
  110.  
  111.         SCRIPT_REG_TEMPLFUNC(DontSyncPhysics, "entityId");
  112.  
  113.         SCRIPT_REG_TEMPLFUNC(EnableSignalTimer, "entityId, text");
  114.         SCRIPT_REG_TEMPLFUNC(DisableSignalTimer, "entityId, text");
  115.         SCRIPT_REG_TEMPLFUNC(SetSignalTimerRate, "entityId, text, float, float");
  116.         SCRIPT_REG_TEMPLFUNC(ResetSignalTimer, "entityId, text");
  117.  
  118.         SCRIPT_REG_TEMPLFUNC(EnableRangeSignaling, "entityId, bEnable");
  119.         SCRIPT_REG_TEMPLFUNC(DestroyRangeSignaling, "entityId");
  120.         SCRIPT_REG_TEMPLFUNC(ResetRangeSignaling, "entityId");
  121.  
  122.         SCRIPT_REG_TEMPLFUNC(AddRangeSignal, "entityId, float, float, text");
  123.         SCRIPT_REG_TEMPLFUNC(AddTargetRangeSignal, "entityId, targetId, float, float, text");
  124.         SCRIPT_REG_TEMPLFUNC(AddAngleSignal, "entityId, float, float, text");
  125.  
  126.         SCRIPT_REG_FUNC(SetViewCamera);
  127.         SCRIPT_REG_FUNC(ResetToNormalCamera);
  128.  
  129.         SCRIPT_REG_FUNC(RegisterWithAI);
  130.         SCRIPT_REG_TEMPLFUNC(HasAI, "entityId");
  131.  
  132.         SCRIPT_REG_TEMPLFUNC(GetClassName, "classId");
  133.         SCRIPT_REG_TEMPLFUNC(SetAimQueryMode, "entityId, mode");
  134.  
  135.         SCRIPT_REG_TEMPLFUNC(PreLoadADB, "adbFileName");
  136. }
  137.  
  138. int CScriptBind_Action::LoadXML(IFunctionHandler* pH, const char* definitionFile, const char* dataFile)
  139. {
  140.         return pH->EndFunction(XmlScriptLoad(definitionFile, dataFile));
  141. }
  142.  
  143. int CScriptBind_Action::SaveXML(IFunctionHandler* pH, const char* definitionFile, const char* dataFile, SmartScriptTable dataTable)
  144. {
  145.         return pH->EndFunction(XmlScriptSave(definitionFile, dataFile, dataTable));
  146. }
  147.  
  148. int CScriptBind_Action::IsGameStarted(IFunctionHandler* pH)
  149. {
  150.         return pH->EndFunction(m_pCryAction->IsGameStarted());
  151. }
  152.  
  153. int CScriptBind_Action::IsRMIServer(IFunctionHandler* pH)
  154. {
  155.         return pH->EndFunction(m_pCryAction->GetGameServerNub() != 0);
  156. }
  157.  
  158. int CScriptBind_Action::IsImmersivenessEnabled(IFunctionHandler* pH)
  159. {
  160.         int out = 0;
  161.         if (!gEnv->bMultiplayer)
  162.                 out = 1;
  163.         else if (CGameContext* pGC = CCryAction::GetCryAction()->GetGameContext())
  164.                 if (pGC->HasContextFlag(eGSF_ImmersiveMultiplayer))
  165.                         out = 1;
  166.         return pH->EndFunction(out);
  167. }
  168.  
  169. int CScriptBind_Action::IsChannelSpecial(IFunctionHandler* pH)
  170. {
  171.         INetChannel* pChannel = 0;
  172.  
  173.         if (pH->GetParamCount() > 0)
  174.         {
  175.                 if (pH->GetParamType(1) == svtNumber)
  176.                 {
  177.                         int channelId = 0;
  178.                         if (pH->GetParam(1, channelId))
  179.                         {
  180.                                 if (CGameServerChannel* pGameChannel = CCryAction::GetCryAction()->GetGameServerNub()->GetChannel(channelId))
  181.                                         pChannel = pGameChannel->GetNetChannel();
  182.                         }
  183.                 }
  184.                 else if (pH->GetParamType(1) == svtPointer)
  185.                 {
  186.                         ScriptHandle entityId;
  187.                         if (pH->GetParam(1, entityId))
  188.                         {
  189.                                 if (IActor* pActor = CCryAction::GetCryAction()->GetIActorSystem()->GetActor((EntityId)entityId.n))
  190.                                 {
  191.                                         int channelId = pActor->GetChannelId();
  192.                                         if (CGameServerChannel* pGameChannel = CCryAction::GetCryAction()->GetGameServerNub()->GetChannel(channelId))
  193.                                                 pChannel = pGameChannel->GetNetChannel();
  194.                                 }
  195.                         }
  196.                 }
  197.  
  198.                 if (pChannel && pChannel->IsPreordered())
  199.                         return pH->EndFunction(true);
  200.         }
  201.  
  202.         return pH->EndFunction();
  203. }
  204.  
  205. int CScriptBind_Action::IsClient(IFunctionHandler* pH)
  206. {
  207.         return pH->EndFunction(gEnv->IsClient());
  208. }
  209.  
  210. int CScriptBind_Action::IsServer(IFunctionHandler* pH)
  211. {
  212.         return pH->EndFunction(gEnv->bServer);
  213. }
  214.  
  215. int CScriptBind_Action::GetPlayerList(IFunctionHandler* pH)
  216. {
  217.         CGameServerNub* pNub = m_pCryAction->GetGameServerNub();
  218.         if (!pNub)
  219.         {
  220.                 GameWarning("No game server nub");
  221.                 return pH->EndFunction();
  222.         }
  223.         TServerChannelMap* playerMap = m_pCryAction->GetGameServerNub()->GetServerChannelMap();
  224.         if (!playerMap)
  225.                 return pH->EndFunction();
  226.  
  227.         IEntitySystem* pES = gEnv->pEntitySystem;
  228.  
  229.         int k = 1;
  230.         SmartScriptTable playerList(m_pSS);
  231.  
  232.         for (TServerChannelMap::iterator it = playerMap->begin(); it != playerMap->end(); ++it)
  233.         {
  234.                 EntityId playerId = it->second->GetPlayerId();
  235.  
  236.                 if (!playerId)
  237.                         continue;
  238.  
  239.                 IEntity* pPlayer = pES->GetEntity(playerId);
  240.                 if (!pPlayer)
  241.                         continue;
  242.                 if (pPlayer->GetScriptTable())
  243.                         playerList->SetAt(k++, pPlayer->GetScriptTable());
  244.         }
  245.  
  246.         return pH->EndFunction(*playerList);
  247. }
  248.  
  249. int CScriptBind_Action::IsGameObjectProbablyVisible(IFunctionHandler* pH, ScriptHandle gameObject)
  250. {
  251.         IEntity* pEntity = gEnv->pEntitySystem->GetEntity((EntityId)gameObject.n);
  252.         if (pEntity)
  253.         {
  254.                 CGameObject* pGameObject = static_cast<CGameObject*>(pEntity->GetProxy(ENTITY_PROXY_USER));
  255.                 if (pGameObject && pGameObject->IsProbablyVisible())
  256.                         return pH->EndFunction(1);
  257.         }
  258.         return pH->EndFunction();
  259. }
  260.  
  261. int CScriptBind_Action::ActivateEffect(IFunctionHandler* pH, const char* name)
  262. {
  263.         int i = CCryAction::GetCryAction()->GetIEffectSystem()->GetEffectId(name);
  264.         CCryAction::GetCryAction()->GetIEffectSystem()->Activate(i);
  265.         return pH->EndFunction();
  266. }
  267.  
  268. int CScriptBind_Action::GetWaterInfo(IFunctionHandler* pH, Vec3 pos)
  269. {
  270.         const int mb = 8;
  271.         pe_params_buoyancy buoyancy[mb];
  272.         Vec3 gravity;
  273.  
  274.         if (int n = gEnv->pPhysicalWorld->CheckAreas(pos, gravity, buoyancy, mb))
  275.         {
  276.                 for (int i = 0; i < n; i++)
  277.                 {
  278.                         if (buoyancy[i].iMedium == 0) // 0==water
  279.                         {
  280.                                 return pH->EndFunction(buoyancy[i].waterPlane.origin.z,
  281.                                                        Script::SetCachedVector(buoyancy[i].waterPlane.n, pH, 2), Script::SetCachedVector(buoyancy[i].waterFlow, pH, 2));
  282.                         }
  283.                 }
  284.         }
  285.  
  286.         return pH->EndFunction();
  287. }
  288.  
  289. //------------------------------------------------------------------------
  290. int CScriptBind_Action::GetServer(IFunctionHandler* pFH, int number)
  291. {
  292.         char* server = 0;
  293.         int ping = 9999;
  294.         char* data = 0;
  295.  
  296.         ILanQueryListener* pLanQueryListener = m_pCryAction->GetILanQueryListener();
  297.         IGameQueryListener* pGameQueryListener = NULL;
  298.         if (pLanQueryListener)
  299.                 pGameQueryListener = pLanQueryListener->GetGameQueryListener();
  300.         if (pGameQueryListener)
  301.                 pGameQueryListener->GetServer(number, &server, &data, ping);
  302.  
  303.         return pFH->EndFunction(server, data, ping);
  304. }
  305.  
  306. //------------------------------------------------------------------------
  307. int CScriptBind_Action::RefreshPings(IFunctionHandler* pFH)
  308. {
  309.         ILanQueryListener* pLanQueryListener = m_pCryAction->GetILanQueryListener();
  310.         IGameQueryListener* pGameQueryListener = NULL;
  311.         if (pLanQueryListener)
  312.                 pGameQueryListener = pLanQueryListener->GetGameQueryListener();
  313.         if (pGameQueryListener)
  314.                 pGameQueryListener->RefreshPings();
  315.         return pFH->EndFunction();
  316. }
  317.  
  318. //------------------------------------------------------------------------
  319. int CScriptBind_Action::ConnectToServer(IFunctionHandler* pFH, char* server)
  320. {
  321.         ILanQueryListener* pLanQueryListener = m_pCryAction->GetILanQueryListener();
  322.         if (pLanQueryListener)
  323.                 pLanQueryListener->GetGameQueryListener()->ConnectToServer(server);
  324.         return pFH->EndFunction();
  325. }
  326.  
  327. //------------------------------------------------------------------------
  328. int CScriptBind_Action::GetServerTime(IFunctionHandler* pFH)
  329. {
  330.         return pFH->EndFunction(m_pCryAction->GetServerTime().GetSeconds());
  331. }
  332.  
  333. //------------------------------------------------------------------------
  334. int CScriptBind_Action::ForceGameObjectUpdate(IFunctionHandler* pH, ScriptHandle entityId, bool force)
  335. {
  336.         if (IGameObject* pGameObject = CCryAction::GetCryAction()->GetGameObject((EntityId)entityId.n))
  337.                 pGameObject->ForceUpdate(force);
  338.  
  339.         return pH->EndFunction();
  340. }
  341.  
  342. //------------------------------------------------------------------------
  343. int CScriptBind_Action::CreateGameObjectForEntity(IFunctionHandler* pH, ScriptHandle entityId)
  344. {
  345.         CCryAction::GetCryAction()->GetIGameObjectSystem()->CreateGameObjectForEntity((EntityId)entityId.n);
  346.  
  347.         return pH->EndFunction();
  348. }
  349.  
  350. //------------------------------------------------------------------------
  351. int CScriptBind_Action::BindGameObjectToNetwork(IFunctionHandler* pH, ScriptHandle entityId)
  352. {
  353.         if (IGameObject* pGameObject = CCryAction::GetCryAction()->GetGameObject((EntityId)entityId.n))
  354.                 pGameObject->BindToNetwork();
  355.  
  356.         return pH->EndFunction();
  357. }
  358.  
  359. //------------------------------------------------------------------------
  360. int CScriptBind_Action::ActivateExtensionForGameObject(IFunctionHandler* pH, ScriptHandle entityId, const char* extension, bool activate)
  361. {
  362.         if (IGameObject* pGameObject = CCryAction::GetCryAction()->GetGameObject((EntityId)entityId.n))
  363.         {
  364.                 if (activate)
  365.                         pGameObject->ActivateExtension(extension);
  366.                 else
  367.                         pGameObject->DeactivateExtension(extension);
  368.         }
  369.  
  370.         return pH->EndFunction();
  371.  
  372. }
  373.  
  374. //------------------------------------------------------------------------
  375. int CScriptBind_Action::SetNetworkParent(IFunctionHandler* pH, ScriptHandle entityId, ScriptHandle parentId)
  376. {
  377.         if (IGameObject* pGameObject = CCryAction::GetCryAction()->GetGameObject((EntityId)entityId.n))
  378.                 pGameObject->SetNetworkParent((EntityId)parentId.n);
  379.  
  380.         return pH->EndFunction();
  381. }
  382.  
  383. //------------------------------------------------------------------------
  384. int CScriptBind_Action::IsChannelOnHold(IFunctionHandler* pH, int channelId)
  385. {
  386.         if (CGameServerChannel* pServerChannel = CCryAction::GetCryAction()->GetGameServerNub()->GetChannel(channelId))
  387.                 return pH->EndFunction(pServerChannel->IsOnHold());
  388.         return pH->EndFunction();
  389. }
  390.  
  391. int CScriptBind_Action::BanPlayer(IFunctionHandler* pH, ScriptHandle entityId, const char* message)
  392. {
  393.         if (IActor* pAct = CCryAction::GetCryAction()->GetIActorSystem()->GetActor((EntityId)entityId.n))
  394.         {
  395.                 CCryAction::GetCryAction()->GetGameServerNub()->BanPlayer(pAct->GetChannelId(), message);
  396.         }
  397.         return pH->EndFunction();
  398. }
  399.  
  400. //------------------------------------------------------------------------
  401. int CScriptBind_Action::PauseGame(IFunctionHandler* pH, bool pause)
  402. {
  403.         bool forced = false;
  404.  
  405.         if (pH->GetParamCount() > 1)
  406.         {
  407.                 pH->GetParam(2, forced);
  408.         }
  409.         CCryAction::GetCryAction()->PauseGame(pause, forced);
  410.  
  411.         return pH->EndFunction();
  412. }
  413.  
  414. /////////////////////////////////////////////////////////////////////////
  415. int CScriptBind_Action::SetViewCamera(IFunctionHandler* pH)
  416. {
  417.  
  418.         // save previous valid view
  419.         IView* pView = m_pCryAction->GetIViewSystem()->GetActiveView();
  420.         if (pView && !m_pPreviousView)
  421.                 m_pPreviousView = pView;
  422.  
  423.         // override view with our camera settings.
  424.         pView = NULL;
  425.         m_pCryAction->GetIViewSystem()->SetActiveView(pView);
  426.  
  427.         Vec3 vPos(0, 0, 0);
  428.         Vec3 vDir(0, 0, 0);
  429.  
  430.         pH->GetParam(1, vPos);
  431.         pH->GetParam(2, vDir);
  432.  
  433.         CCamera camera(GetISystem()->GetViewCamera());
  434.         float fRoll(camera.GetAngles().z);
  435.  
  436.         camera.SetMatrix(CCamera::CreateOrientationYPR(CCamera::CreateAnglesYPR(vDir, fRoll)));
  437.         camera.SetPosition(vPos);
  438.         GetISystem()->SetViewCamera(camera);
  439.  
  440.         return pH->EndFunction();
  441. }
  442.  
  443. /////////////////////////////////////////////////////////////////////////
  444. int CScriptBind_Action::ResetToNormalCamera(IFunctionHandler* pH)
  445. {
  446.         if (m_pPreviousView)
  447.         {
  448.                 m_pCryAction->GetIViewSystem()->SetActiveView(m_pPreviousView);
  449.                 m_pPreviousView = nullptr;
  450.         }
  451.         return pH->EndFunction();
  452. }
  453.  
  454. //-------------------------------------------------------------------------
  455. int CScriptBind_Action::PersistantSphere(IFunctionHandler* pH, Vec3 pos, float radius, Vec3 color, const char* name, float timeout)
  456. {
  457.         IPersistantDebug* pPD = CCryAction::GetCryAction()->GetIPersistantDebug();
  458.  
  459.         pPD->Begin(name, false);
  460.         pPD->AddSphere(pos, radius, ColorF(color, 1.f), timeout);
  461.  
  462.         return pH->EndFunction();
  463. }
  464.  
  465. //-------------------------------------------------------------------------
  466. int CScriptBind_Action::PersistantLine(IFunctionHandler* pH, Vec3 start, Vec3 end, Vec3 color, const char* name, float timeout)
  467. {
  468.         IPersistantDebug* pPD = CCryAction::GetCryAction()->GetIPersistantDebug();
  469.  
  470.         pPD->Begin(name, false);
  471.         pPD->AddLine(start, end, ColorF(color, 1.f), timeout);
  472.  
  473.         return pH->EndFunction();
  474. }
  475.  
  476. //-------------------------------------------------------------------------
  477. int CScriptBind_Action::PersistantArrow(IFunctionHandler* pH, Vec3 pos, float radius, Vec3 dir, Vec3 color, const char* name, float timeout)
  478. {
  479.         IPersistantDebug* pPD = CCryAction::GetCryAction()->GetIPersistantDebug();
  480.  
  481.         pPD->Begin(name, false);
  482.         pPD->AddDirection(pos, radius, dir, ColorF(color, 1.f), timeout);
  483.  
  484.         return pH->EndFunction();
  485. }
  486.  
  487. //-------------------------------------------------------------------------
  488. int CScriptBind_Action::Persistant2DText(IFunctionHandler* pH, const char* text, float size, Vec3 color, const char* name, float timeout)
  489. {
  490.         IPersistantDebug* pPD = CCryAction::GetCryAction()->GetIPersistantDebug();
  491.  
  492.         pPD->Begin(name, false);
  493.         pPD->Add2DText(text, size, ColorF(color, 1.f), timeout);
  494.  
  495.         return pH->EndFunction();
  496. }
  497.  
  498. //-------------------------------------------------------------------------
  499. // Required Params: entityId, const char *text
  500. // Optional Params: float size, Vec3 color, float visibleTime, float fadeTime, float viewDistance, const char* staticId, int columnNum, const char* contextTag
  501. int CScriptBind_Action::PersistantEntityTag(IFunctionHandler* pH, ScriptHandle entityId, const char* text)
  502. {
  503.         IPersistantDebug* pPD = CCryAction::GetCryAction()->GetIPersistantDebug();
  504.  
  505.         SEntityTagParams params;
  506.         params.entity = (EntityId)entityId.n;
  507.         params.text = text;
  508.         params.tagContext = "scriptbind";
  509.  
  510.         // Optional params
  511.         if (pH->GetParamType(3) != svtNull) // Size
  512.                 pH->GetParam(3, params.size);
  513.         if (pH->GetParamType(4) != svtNull) // Color
  514.         {
  515.                 Vec3 color;
  516.                 pH->GetParam(4, color);
  517.                 params.color = ColorF(color, 1.f);
  518.         }
  519.         if (pH->GetParamType(5) != svtNull) // Visible Time
  520.                 pH->GetParam(5, params.visibleTime);
  521.         if (pH->GetParamType(6) != svtNull) // Fade Time
  522.                 pH->GetParam(6, params.fadeTime);
  523.         if (pH->GetParamType(7) != svtNull) // View Distance
  524.                 pH->GetParam(7, params.viewDistance);
  525.         if (pH->GetParamType(8) != svtNull) // Static ID
  526.         {
  527.                 const char* staticId;
  528.                 pH->GetParam(8, staticId);
  529.                 params.staticId = staticId;
  530.         }
  531.         if (pH->GetParamType(9) != svtNull) // Column Num
  532.                 pH->GetParam(9, params.column);
  533.         if (pH->GetParamType(10) != svtNull) // Context Tag
  534.         {
  535.                 const char* tagContext;
  536.                 pH->GetParam(10, tagContext);
  537.                 params.tagContext = tagContext; // overrides default one set above
  538.         }
  539.  
  540.         pPD->AddEntityTag(params);
  541.  
  542.         return pH->EndFunction();
  543. }
  544.  
  545. //-------------------------------------------------------------------------
  546. int CScriptBind_Action::ClearEntityTags(IFunctionHandler* pH, ScriptHandle entityId)
  547. {
  548.         IPersistantDebug* pPD = CCryAction::GetCryAction()->GetIPersistantDebug();
  549.         pPD->ClearEntityTags((EntityId)entityId.n);
  550.  
  551.         return pH->EndFunction();
  552. }
  553.  
  554. //-------------------------------------------------------------------------
  555. int CScriptBind_Action::ClearStaticTag(IFunctionHandler* pH, ScriptHandle entityId, const char* staticId)
  556. {
  557.         IPersistantDebug* pPD = CCryAction::GetCryAction()->GetIPersistantDebug();
  558.         pPD->ClearStaticTag((EntityId)entityId.n, staticId);
  559.  
  560.         return pH->EndFunction();
  561. }
  562.  
  563. //-------------------------------------------------------------------------
  564. int CScriptBind_Action::EnableSignalTimer(IFunctionHandler* pH, ScriptHandle entityId, const char* sText)
  565. {
  566.         bool bRet = CSignalTimer::ref().EnablePersonalManager((EntityId)entityId.n, sText);
  567.         return pH->EndFunction(bRet);
  568. }
  569.  
  570. //-------------------------------------------------------------------------
  571. int CScriptBind_Action::DisableSignalTimer(IFunctionHandler* pH, ScriptHandle entityId, const char* sText)
  572. {
  573.         bool bRet = CSignalTimer::ref().DisablePersonalSignalTimer((EntityId)entityId.n, sText);
  574.         return pH->EndFunction(bRet);
  575. }
  576.  
  577. //-------------------------------------------------------------------------
  578. int CScriptBind_Action::SetSignalTimerRate(IFunctionHandler* pH, ScriptHandle entityId, const char* sText, float fRateMin, float fRateMax)
  579. {
  580.         bool bRet = CSignalTimer::ref().SetTurnRate((EntityId)entityId.n, sText, fRateMin, fRateMax);
  581.         return pH->EndFunction(bRet);
  582. }
  583.  
  584. //-------------------------------------------------------------------------
  585. int CScriptBind_Action::ResetSignalTimer(IFunctionHandler* pH, ScriptHandle entityId, const char* sText)
  586. {
  587.         bool bRet = CSignalTimer::ref().ResetPersonalTimer((EntityId)entityId.n, sText);
  588.         return pH->EndFunction(bRet);
  589. }
  590.  
  591. //------------------------------------------------------------------------
  592. int CScriptBind_Action::SendGameplayEvent(IFunctionHandler* pH, ScriptHandle entityId, int event)
  593. {
  594.         const char* desc = 0;
  595.         float value = 0.0f;
  596.         ScriptHandle hdl;
  597.  
  598.         const char* str_data = 0;
  599.  
  600.         if (pH->GetParamCount() > 2 && pH->GetParamType(3) == svtString)
  601.                 pH->GetParam(3, desc);
  602.         if (pH->GetParamCount() > 3 && pH->GetParamType(4) == svtNumber)
  603.                 pH->GetParam(4, value);
  604.         if (pH->GetParamCount() > 4 && pH->GetParamType(5) == svtPointer)
  605.                 pH->GetParam(5, hdl);
  606.         if (pH->GetParamCount() > 5 && pH->GetParamType(6) == svtString)
  607.                 pH->GetParam(6, str_data);
  608.  
  609.         IEntity* pEntity = gEnv->pEntitySystem->GetEntity((EntityId)entityId.n);
  610.         CCryAction::GetCryAction()->GetIGameplayRecorder()->Event(pEntity, GameplayEvent(event, desc, value, hdl.ptr, str_data));
  611.  
  612.         return pH->EndFunction();
  613. }
  614.  
  615. //------------------------------------------------------------------------
  616. int CScriptBind_Action::CacheItemSound(IFunctionHandler* pH, const char* itemName)
  617. {
  618.         CCryAction::GetCryAction()->GetIItemSystem()->CacheItemSound(itemName);
  619.  
  620.         return pH->EndFunction();
  621. }
  622.  
  623. //------------------------------------------------------------------------
  624. int CScriptBind_Action::CacheItemGeometry(IFunctionHandler* pH, const char* itemName)
  625. {
  626.         CCryAction::GetCryAction()->GetIItemSystem()->CacheItemGeometry(itemName);
  627.  
  628.         return pH->EndFunction();
  629. }
  630.  
  631. //------------------------------------------------------------------------
  632. int CScriptBind_Action::EnableRangeSignaling(IFunctionHandler* pH, ScriptHandle entityId, bool bEnable)
  633. {
  634.         CCryAction::GetCryAction()->GetRangeSignaling()->EnablePersonalRangeSignaling((EntityId)entityId.n, bEnable);
  635.  
  636.         return pH->EndFunction();
  637. }
  638.  
  639. //------------------------------------------------------------------------
  640. int CScriptBind_Action::DestroyRangeSignaling(IFunctionHandler* pH, ScriptHandle entityId)
  641. {
  642.         CCryAction::GetCryAction()->GetRangeSignaling()->DestroyPersonalRangeSignaling((EntityId)entityId.n);
  643.  
  644.         return pH->EndFunction();
  645. }
  646.  
  647. //------------------------------------------------------------------------
  648. int CScriptBind_Action::ResetRangeSignaling(IFunctionHandler* pH, ScriptHandle entityId)
  649. {
  650.         CCryAction::GetCryAction()->GetRangeSignaling()->ResetPersonalRangeSignaling((EntityId)entityId.n);
  651.  
  652.         return pH->EndFunction();
  653. }
  654.  
  655. //------------------------------------------------------------------------
  656. int CScriptBind_Action::AddRangeSignal(IFunctionHandler* pH, ScriptHandle entityId, float fRadius, float fFlexibleBoundary, const char* sSignal)
  657. {
  658.         if (gEnv->pAISystem)
  659.         {
  660.                 // Get optional signal data
  661.                 IAISignalExtraData* pData = NULL;
  662.                 if (pH->GetParamCount() > 4)
  663.                 {
  664.                         SmartScriptTable dataTable;
  665.                         if (pH->GetParam(5, dataTable))
  666.                         {
  667.                                 pData = gEnv->pAISystem->CreateSignalExtraData();
  668.                                 CRY_ASSERT(pData);
  669.                                 pData->FromScriptTable(dataTable);
  670.                         }
  671.                 }
  672.  
  673.                 CCryAction::GetCryAction()->GetRangeSignaling()->AddRangeSignal((EntityId)entityId.n, fRadius, fFlexibleBoundary, sSignal, pData);
  674.                 gEnv->pAISystem->FreeSignalExtraData(pData);
  675.         }
  676.  
  677.         return pH->EndFunction();
  678. }
  679.  
  680. //------------------------------------------------------------------------
  681. int CScriptBind_Action::AddTargetRangeSignal(IFunctionHandler* pH, ScriptHandle entityId, ScriptHandle targetId, float fRadius, float fFlexibleBoundary, const char* sSignal)
  682. {
  683.         if (gEnv->pAISystem)
  684.         {
  685.                 // Get optional signal data
  686.                 IAISignalExtraData* pData = NULL;
  687.                 if (pH->GetParamCount() > 5)
  688.                 {
  689.                         SmartScriptTable dataTable;
  690.                         if (pH->GetParam(6, dataTable))
  691.                         {
  692.                                 pData = gEnv->pAISystem->CreateSignalExtraData();
  693.                                 CRY_ASSERT(pData);
  694.                                 pData->FromScriptTable(dataTable);
  695.                         }
  696.                 }
  697.  
  698.                 CCryAction::GetCryAction()->GetRangeSignaling()->AddTargetRangeSignal((EntityId)entityId.n, (EntityId)targetId.n, fRadius, fFlexibleBoundary, sSignal, pData);
  699.                 gEnv->pAISystem->FreeSignalExtraData(pData);
  700.         }
  701.  
  702.         return pH->EndFunction();
  703. }
  704.  
  705. //------------------------------------------------------------------------
  706. int CScriptBind_Action::AddAngleSignal(IFunctionHandler* pH, ScriptHandle entityId, float fAngle, float fFlexibleBoundary, const char* sSignal)
  707. {
  708.         if (gEnv->pAISystem)
  709.         {
  710.                 // Get optional signal data
  711.                 IAISignalExtraData* pData = NULL;
  712.                 if (pH->GetParamCount() > 4)
  713.                 {
  714.                         SmartScriptTable dataTable;
  715.                         if (pH->GetParam(5, dataTable))
  716.                         {
  717.                                 pData = gEnv->pAISystem->CreateSignalExtraData();
  718.                                 CRY_ASSERT(pData);
  719.                                 pData->FromScriptTable(dataTable);
  720.                         }
  721.                 }
  722.  
  723.                 CCryAction::GetCryAction()->GetRangeSignaling()->AddAngleSignal((EntityId)entityId.n, fAngle, fFlexibleBoundary, sSignal, pData);
  724.                 gEnv->pAISystem->FreeSignalExtraData(pData);
  725.         }
  726.  
  727.         return pH->EndFunction();
  728. }
  729.  
  730. //------------------------------------------------------------------------
  731. int CScriptBind_Action::DontSyncPhysics(IFunctionHandler* pH, ScriptHandle entityId)
  732. {
  733.         if (CGameObject* pGO = static_cast<CGameObject*>(CCryAction::GetCryAction()->GetIGameObjectSystem()->CreateGameObjectForEntity((EntityId)entityId.n)))
  734.                 pGO->DontSyncPhysics();
  735.         else
  736.                 GameWarning("DontSyncPhysics: Unable to find entity %" PRISIZE_T, entityId.n);
  737.         return pH->EndFunction();
  738. }
  739.  
  740. //
  741. //-----------------------------------------------------------------------------------------------------------
  742. // (MATT) Moved here from Scriptbind_AI when that was moved to the AI system {2008/02/15:15:23:16}
  743. int CScriptBind_Action::RegisterWithAI(IFunctionHandler* pH)
  744. {
  745.         if (gEnv->bMultiplayer && !gEnv->bServer)
  746.                 return pH->EndFunction();
  747.  
  748.         int type;
  749.         ScriptHandle hdl;
  750.  
  751.         if (!pH->GetParams(hdl, type))
  752.                 return pH->EndFunction();
  753.  
  754.         EntityId entityID = (EntityId)hdl.n;
  755.         IEntity* pEntity = gEnv->pEntitySystem->GetEntity(entityID);
  756.  
  757.         if (!pEntity)
  758.         {
  759.                 GameWarning("RegisterWithAI: Tried to set register with AI nonExisting entity with id [%d]. ", entityID);
  760.                 return pH->EndFunction();
  761.         }
  762.  
  763.         // Apparently we can't assume that there is just one IGameObject to an entity, because we choose between (at least) Actor and Vehicle objects.
  764.         // (MATT) Do we really need to check on the actor system here? {2008/02/15:18:38:34}
  765.         IGameFramework* pGameFramework = gEnv->pGameFramework;
  766.         IVehicleSystem* pVSystem = pGameFramework->GetIVehicleSystem();
  767.         IActorSystem* pASystem = pGameFramework->GetIActorSystem();
  768.         if (!pASystem)
  769.         {
  770.                 GameWarning("RegisterWithAI: no ActorSystem for %s.", pEntity->GetName());
  771.                 return pH->EndFunction();
  772.         }
  773.  
  774.         AIObjectParams params(type, 0, entityID);
  775.         bool autoDisable(true);
  776.  
  777.         // For most types, we need to parse the tables
  778.         // For others we leave them blank
  779.         switch (type)
  780.         {
  781.         case AIOBJECT_ACTOR:
  782.         case AIOBJECT_2D_FLY:
  783.         case AIOBJECT_BOAT:
  784.         case AIOBJECT_CAR:
  785.         case AIOBJECT_HELICOPTER:
  786.  
  787.         case AIOBJECT_INFECTED:
  788.         case AIOBJECT_ALIENTICK:
  789.  
  790.         case AIOBJECT_HELICOPTERCRYSIS2:
  791.                 if (gEnv->pAISystem && !gEnv->pAISystem->ParseTables(3, true, pH, params, autoDisable))
  792.                         return pH->EndFunction();
  793.         default:
  794.                 ;
  795.         }
  796.  
  797.         // Most types check these, so just get them in advance
  798.         IActor* pActor = pASystem->GetActor(pEntity->GetId());
  799.  
  800.         IVehicle* pVehicle = NULL;
  801.         if (pVSystem)
  802.                 pVehicle = pVSystem->GetVehicle(pEntity->GetId());
  803.  
  804.         // Set this if we've found something to create a proxy from
  805.         IGameObject* pGameObject = NULL;
  806.  
  807.         switch (type)
  808.         {
  809.         case AIOBJECT_ACTOR:
  810.         case AIOBJECT_2D_FLY:
  811.  
  812.         case AIOBJECT_INFECTED:
  813.         case AIOBJECT_ALIENTICK:
  814.                 {
  815.                         // (MATT) The pActor/pVehicle test below - is it basically trying to distiguish between the two cases above? If so, separate them! {2008/02/15:19:38:08}
  816.                         if (!pActor)
  817.                         {
  818.                                 GameWarning("RegisterWithAI: no Actor for %s.", pEntity->GetName());
  819.                                 return pH->EndFunction();
  820.                         }
  821.                         pGameObject = pActor->GetGameObject();
  822.                 }
  823.                 break;
  824.         case AIOBJECT_BOAT:
  825.         case AIOBJECT_CAR:
  826.                 {
  827.                         if (!pVehicle)
  828.                         {
  829.                                 GameWarning("RegisterWithAI: no Vehicle for %s (Id %i).", pEntity->GetName(), pEntity->GetId());
  830.                                 return pH->EndFunction();
  831.                         }
  832.                         pGameObject = pVehicle->GetGameObject();
  833.                 }
  834.                 break;
  835.  
  836.         case AIOBJECT_HELICOPTER:
  837.         case AIOBJECT_HELICOPTERCRYSIS2:
  838.                 {
  839.                         if (!pVehicle)
  840.                         {
  841.                                 GameWarning("RegisterWithAI: no Vehicle for %s (Id %i).", pEntity->GetName(), pEntity->GetId());
  842.                                 return pH->EndFunction();
  843.                         }
  844.                         pGameObject = pVehicle->GetGameObject();
  845.                         params.m_moveAbility.b3DMove = true;
  846.                 }
  847.                 break;
  848.         case AIOBJECT_PLAYER:
  849.                 {
  850.                         if (IsDemoPlayback())
  851.                                 return pH->EndFunction();
  852.  
  853.                         SmartScriptTable pTable;
  854.  
  855.                         if (pH->GetParamCount() > 2)
  856.                                 pH->GetParam(3, pTable);
  857.                         else
  858.                                 return pH->EndFunction();
  859.  
  860.                         pGameObject = pActor->GetGameObject();
  861.  
  862.                         pTable->GetValue("groupid", params.m_sParamStruct.m_nGroup);
  863.  
  864.                         const char* faction = 0;
  865.                         if (pTable->GetValue("esFaction", faction) && gEnv->pAISystem)
  866.                         {
  867.                                 params.m_sParamStruct.factionID = gEnv->pAISystem->GetFactionMap().GetFactionID(faction);
  868.                                 if (faction && *faction && (params.m_sParamStruct.factionID == IFactionMap::InvalidFactionID))
  869.                                 {
  870.                                         GameWarning("Unknown faction '%s' being set...", faction);
  871.                                 }
  872.                         }
  873.                         else
  874.                         {
  875.                                 // M谩rcio: backwards compatibility
  876.                                 int species = -1;
  877.                                 if (!pTable->GetValue("eiSpecies", species))
  878.                                         pTable->GetValue("species", species);
  879.  
  880.                                 if (species > -1)
  881.                                         params.m_sParamStruct.factionID = species;
  882.                         }
  883.  
  884.                         pTable->GetValue("commrange", params.m_sParamStruct.m_fCommRange); //Luciano - added to use GROUPONLY signals
  885.  
  886.                         SmartScriptTable pPerceptionTable;
  887.                         if (pTable->GetValue("Perception", pPerceptionTable))
  888.                         {
  889.                                 pPerceptionTable->GetValue("sightrange", params.m_sParamStruct.m_PerceptionParams.sightRange);
  890.                         }
  891.                 }
  892.                 break;
  893.         case AIOBJECT_SNDSUPRESSOR:
  894.                 {
  895.                         // (MATT) This doesn't need a proxy? {2008/02/15:19:45:58}
  896.                         SmartScriptTable pTable;
  897.                         // Properties table
  898.                         if (pH->GetParamCount() > 2)
  899.                                 pH->GetParam(3, pTable);
  900.                         else
  901.                                 return pH->EndFunction();
  902.                         if (!pTable->GetValue("radius", params.m_moveAbility.pathRadius))
  903.                                 params.m_moveAbility.pathRadius = 10.f;
  904.                         break;
  905.                 }
  906.         case AIOBJECT_WAYPOINT:
  907.                 break;
  908.                 /*
  909.                    // this block is commented out since params.m_sParamStruct is currently ignored in pEntity->RegisterInAISystem()
  910.                    // instead of setting the group id here, it will be set from the script right after registering
  911.                    default:
  912.                    // try to get groupid settings for anchors
  913.                    params.m_sParamStruct.m_nGroup = -1;
  914.                    params.m_sParamStruct.m_nSpecies = -1;
  915.                    {
  916.                    SmartScriptTable pTable;
  917.                    if ( pH->GetParamCount() > 2 )
  918.                    pH->GetParam( 3, pTable );
  919.                    if ( *pTable )
  920.                    pTable->GetValue( "groupid", params.m_sParamStruct.m_nGroup );
  921.                    }
  922.                    break;
  923.                  */
  924.         }
  925.  
  926.         // Remove any existing AI object
  927.         pEntity->RegisterInAISystem(AIObjectParams(0));
  928.  
  929.         // Register in AI to get a new AI object, deregistering the old one in the process
  930.         pEntity->RegisterInAISystem(params);
  931.  
  932.         // (MATT) ? {2008/02/15:19:46:29}
  933.         // AI object was not created (possibly AI System is disabled)
  934.         if (IAIObject* aiObject = pEntity->GetAI())
  935.         {
  936.                 if (type == AIOBJECT_SNDSUPRESSOR)
  937.                         aiObject->SetRadius(params.m_moveAbility.pathRadius);
  938.                 else if (type >= AIANCHOR_FIRST) // if anchor - set radius
  939.                 {
  940.                         SmartScriptTable pTable;
  941.                         // Properties table
  942.                         if (pH->GetParamCount() > 2)
  943.                                 pH->GetParam(3, pTable);
  944.                         else
  945.                                 return pH->EndFunction();
  946.                         float radius(0.f);
  947.                         pTable->GetValue("radius", radius);
  948.                         int groupId = -1;
  949.                         pTable->GetValue("groupid", groupId);
  950.                         aiObject->SetGroupId(groupId);
  951.                         aiObject->SetRadius(radius);
  952.                 }
  953.  
  954.                 if (IAIActorProxy* proxy = aiObject->GetProxy())
  955.                         proxy->UpdateMeAlways(!autoDisable);
  956.         }
  957.  
  958.         return pH->EndFunction();
  959. }
  960.  
  961. //------------------------------------------------------------------------
  962. int CScriptBind_Action::HasAI(IFunctionHandler* pH, ScriptHandle entityId)
  963. {
  964.         bool bResult = false;
  965.  
  966.         const EntityId id = (EntityId)entityId.n;
  967.         IEntity* pEntity = gEnv->pEntitySystem->GetEntity(id);
  968.         if (pEntity)
  969.         {
  970.                 bResult = (pEntity->GetAI() != 0);
  971.         }
  972.  
  973.         return pH->EndFunction(bResult);
  974. }
  975.  
  976. //------------------------------------------------------------------------
  977. int CScriptBind_Action::GetClassName(IFunctionHandler* pH, int classId)
  978. {
  979.         char className[128];
  980.         bool retrieved = CCryAction::GetCryAction()->GetNetworkSafeClassName(className, sizeof(className), classId);
  981.  
  982.         if (retrieved)
  983.         {
  984.                 return pH->EndFunction(className);
  985.         }
  986.  
  987.         return pH->EndFunction();
  988. }
  989.  
  990. //------------------------------------------------------------------------
  991. int CScriptBind_Action::SetAimQueryMode(IFunctionHandler* pH, ScriptHandle entityId, int mode)
  992. {
  993.         IEntity* entity = gEnv->pEntitySystem->GetEntity(static_cast<EntityId>(entityId.n));
  994.         IAIObject* ai = entity ? entity->GetAI() : NULL;
  995.         CAIProxy* proxy = ai ? static_cast<CAIProxy*>(ai->GetProxy()) : NULL;
  996.  
  997.         if (proxy)
  998.                 proxy->SetAimQueryMode(static_cast<CAIProxy::AimQueryMode>(mode));
  999.  
  1000.         return pH->EndFunction();
  1001. }
  1002.  
  1003. // ============================================================================
  1004. //      Pre-load a mannequin ADB file.
  1005. //
  1006. //      In:             The function handler (NULL is invalid!)
  1007. //      In:             The name of the ADB file.
  1008. //
  1009. //      Returns:        A default result code (in Lua: void).
  1010. //
  1011. int CScriptBind_Action::PreLoadADB(IFunctionHandler* pH, const char* adbFileName)
  1012. {
  1013.         IF_LIKELY (adbFileName != NULL)
  1014.         {
  1015.                 IMannequin& mannequinInterface = gEnv->pGameFramework->GetMannequinInterface();
  1016.                 if (mannequinInterface.GetAnimationDatabaseManager().Load(adbFileName) == NULL)
  1017.                 {
  1018.                         GameWarning("PreLoadADB(): Failed to pre-load '%s'!", adbFileName);
  1019.                 }
  1020.         }
  1021.  
  1022.         return pH->EndFunction();
  1023. }
  1024.  
downloadScriptBind_Action.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