bool CCustomReactionFunctions::CallCustomExecutionFunction(ScriptTablePtr hitDeathReactionsTable, CActor& actor, const SReactionParams& reactionParams, const HitInfo& hitInfo) const { CRY_ASSERT(!reactionParams.sCustomExecutionFunc.empty()); bool bSuccess = false; // try LUA first. This is so overriding C++ functions can be easily done on LUA, without the need to recompile or to change // the name of the LUA methods in both reactionParams and script code HSCRIPTFUNCTION executionFunc = NULL; if (hitDeathReactionsTable->GetValue(reactionParams.sCustomExecutionFunc.c_str(), executionFunc)) { IScriptSystem* pScriptSystem = hitDeathReactionsTable->GetScriptSystem(); bSuccess = Script::Call(pScriptSystem, executionFunc, hitDeathReactionsTable, reactionParams.reactionScriptTable); pScriptSystem->ReleaseFunc(executionFunc); } // Try C++ now if (!bSuccess) { // C++ custom execution ExecutionFncContainer::const_iterator itFind = m_executionFunctors.find(reactionParams.sCustomExecutionFunc); if (itFind != m_executionFunctors.end()) { // [*DavidR | 21/Oct/2010] C++ custom functions have the advantage of receiving a reference to the hitinfo, LUA methods can get the "lastHit" so we // avoid the expensive construction of the hitInfo table itFind->second(actor, reactionParams, hitInfo); bSuccess = true; } else CHitDeathReactionsSystem::Warning("Couldn't find custom execution function (%s)", reactionParams.sCustomExecutionFunc.c_str()); } return bSuccess; }
void CCheckpointSystem::OnCheckpointLoaded(SCheckpointData metaData) { IEntity *pCheckpoint = gEnv->pEntitySystem->GetEntity(metaData.m_checkPointId); if(pCheckpoint) { //Trigger OnLoad IScriptTable *pScript = pCheckpoint->GetScriptTable(); if (pScript) { HSCRIPTFUNCTION hScriptFunc(NULL); pScript->GetValue("Event_OnLoadCheckpoint", hScriptFunc); if (hScriptFunc) //this will trigger the flowgraph output { IScriptSystem *pIScriptSystem = gEnv->pScriptSystem; Script::Call(pIScriptSystem,hScriptFunc,pScript); pIScriptSystem->ReleaseFunc(hScriptFunc); } } } }