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); } } }
// ---------------------------------------------------------------------------- const char* CMannequinAGState::GetCurrentStateName() { const char* result = "<unknown>"; // Figure out something which could pose as a 'state name' // Currently it's the name of the first fragmentID I can find on the scopes IActionController* pActionController = GetActionController(); if (!pActionController) return result; for(int scopeIndex = 0; scopeIndex < pActionController->GetTotalScopes(); ++scopeIndex) { IScope* pScope = pActionController->GetScope(scopeIndex); FragmentID fragmentID = pScope->GetLastFragmentID(); if (fragmentID != FRAGMENT_ID_INVALID) { result = pActionController->GetContext().controllerDef.m_fragmentIDs.GetTagName(fragmentID); break; } } return result ; }