void CInteractiveObjectRegistry::ApplyInteractionToObject(IEntity *pEntity, const TagID interactionTypeTag, const int interactionIndex) const { if (m_pDatabaseObject && m_pControllerDef) { IMannequin &mannequinSys = gEnv->pGame->GetIGameFramework()->GetMannequinInterface(); SAnimationContext animContext(*m_pControllerDef); IActionController *pActionController = mannequinSys.CreateActionController(pEntity, animContext); int scopeContextID = m_pControllerDef->m_scopeContexts.Find("SlaveObject"); pActionController->SetScopeContext(scopeContextID, *pEntity, pEntity->GetCharacter(0), m_pDatabaseObject); TagState fragTags = TAG_STATE_EMPTY; const CTagDefinition *pTagDef = m_pControllerDef->GetFragmentTagDef(m_interactFragID); if (pTagDef) { pTagDef->Set(fragTags, interactionTypeTag, true); } IAction *pAction = new TAction<SAnimationContext>(0, m_interactFragID, fragTags); pAction->SetOptionIdx(interactionIndex); pActionController->Queue(pAction); // Set the time increments to non-zero to force the ActionController::Update() to drive the animation to the end. // When time increment is zero, animation position will not update. This will be changed to a simpler process by Tom Berry at some point. const uint32 totalScopes = pActionController->GetTotalScopes(); for(uint32 s=0; s<totalScopes; ++s) { pActionController->GetScope(s)->IncrementTime(0.001f); } pActionController->Update(1000.0f); // "false" here leaves the anim on the transition queue in the animation system so it isn't cleared on pActionController->Release(). pActionController->ClearScopeContext(scopeContextID, false); pActionController->Release(); CRecordingSystem* pRecordingSystem = g_pGame->GetRecordingSystem(); if (pRecordingSystem) { pRecordingSystem->OnInteractiveObjectFinishedUse(pEntity->GetId(), interactionTypeTag, interactionIndex); } } }