EntityId CAICorpseManager::SpawnAICorpseFromEntity( IEntity& sourceEntity, const SCorpseParameters& corpseParams ) { assert(gEnv->IsEditor() == false); assert(gEnv->bMultiplayer == false); if(g_pGameCVars->g_aiCorpses_Enable == 0) return 0; if(m_corpsesArray.size() == m_maxCorpses) { RemoveSomeCorpses(); assert((uint32)m_corpsesArray.size() < m_maxCorpses); } MEMSTAT_CONTEXT(EMemStatContextTypes::MSC_Other, EMemStatContextFlags::MSF_None, "AICorpseManager::SpawnCorpse"); EntityId corpseId = 0; IPhysicalEntity* pSourcePhysics = sourceEntity.GetPhysics(); if ((pSourcePhysics != NULL) && (pSourcePhysics->GetType() == PE_ARTICULATED)) { ICharacterInstance *pSourceCharacterInstance = sourceEntity.GetCharacter(0); if (pSourceCharacterInstance != NULL) { IEntityClass *pCorpseClass = gEnv->pEntitySystem->GetClassRegistry()->FindClass("AICorpse"); assert(pCorpseClass); stack_string corpseName; corpseName.Format("%s_Corpse", sourceEntity.GetName()); SEntitySpawnParams params; params.pClass = pCorpseClass; params.sName = corpseName.c_str(); #if !AI_CORPSES_ENABLE_SERIALIZE params.nFlags |= ENTITY_FLAG_NO_SAVE; #endif params.vPosition = sourceEntity.GetWorldPos(); params.qRotation = sourceEntity.GetWorldRotation(); IEntity *pCorpseEntity = gEnv->pEntitySystem->SpawnEntity(params, true); if(pCorpseEntity != NULL) { corpseId = pCorpseEntity->GetId(); CorpseInfo* pCorpseInfo = FindCorpseInfo( corpseId ); assert(pCorpseInfo != NULL); CAICorpse* pCorpse = pCorpseInfo->GetCorpse(); assert(pCorpse != NULL); pCorpse->SetupFromSource( sourceEntity, *pSourceCharacterInstance, (uint32)corpseParams.priority); } } } return corpseId; }
void CAICorpseManager::RegisterAICorpse( const EntityId corpseId, const uint32 priority ) { assert(FindCorpseInfo(corpseId) == NULL); m_corpsesArray.push_back(CorpseInfo(corpseId, priority)); }