//------------------------------------------------------------------------ void CParachute::Open() { // not used any more return; IEntity* pCanvas = m_pEntitySystem->GetEntity(m_canvasId); // enable canvas physics EnablePhysics(pCanvas, true); if (!pCanvas->GetPhysics()) { CryLog("[Parachute] Canvas physics enabling failed!"); return; } // set canvas to players pos IEntity* pOwner = GetOwner(); pCanvas->SetWorldTM(pOwner->GetWorldTM()); pCanvas->AttachChild(pOwner); m_actorId = pOwner->GetId(); // attach player to canvas GetOwnerActor()->LinkToVehicle(m_canvasId); m_isOpened = true; EnableUpdate(true, eIUS_General); pe_action_awake awake; awake.bAwake = true; pCanvas->GetPhysics()->Action(&awake); if (pOwner->GetPhysics()) { pe_status_dynamics dyn; if (pOwner->GetPhysics()->GetStatus(&dyn)) { // set parachute to player's speed pe_action_set_velocity vel; vel.v = 0.75f*dyn.v; pCanvas->GetPhysics()->Action(&vel); } } }
void CHeavyMountedWeapon::OnReset() { BaseClass::OnReset(); m_rippedOff = m_rippingOff = false; m_stats.mounted = true; m_rotatingSoundID = INVALID_SOUNDID; m_lastUsedFrame = -1; Physicalize(false, false); RequireUpdate(eIUS_General); if (m_linkedParentId != 0) { IEntity* pLinkedParent = gEnv->pEntitySystem->GetEntity(m_linkedParentId); if (pLinkedParent) { pLinkedParent->AttachChild(GetEntity()); } m_linkedParentId = 0; } }
void CLaserBeam::FixAttachment(IEntity* pLaserEntity) { m_usingEntityAttachment = false; IItemSystem* pItemSystem = g_pGame->GetIGameFramework()->GetIItemSystem(); CItem* pOwnerItem = static_cast<CItem*>(pItemSystem->GetItem(m_ownerEntityId)); if (pOwnerItem) { IEntity* pOwnerEntity = pOwnerItem->GetEntity(); IEntity* pAttachedEntity = pOwnerEntity; const char* attach_helper = "laser_term"; Vec3 offset = pOwnerItem->GetSlotHelperPos(m_geometrySlot, attach_helper, false); if(m_geometrySlot == eIGS_FirstPerson) { if(pOwnerItem->IsAccessory()) { EntityId parentId = pOwnerItem->GetParentId(); if(parentId) { if(CItem* pParentItem = static_cast<CItem*>(pItemSystem->GetItem(parentId))) { const SAccessoryParams* pParams = pParentItem->GetAccessoryParams(pAttachedEntity->GetClass()); attach_helper = pParams->attach_helper.c_str(); pAttachedEntity = pParentItem->GetEntity(); } } } if(pAttachedEntity) { ICharacterInstance *pCharacter = pAttachedEntity->GetCharacter(eIGS_FirstPerson); if (pCharacter) { IAttachmentManager *pAttachmentManager = pCharacter->GetIAttachmentManager(); IAttachment *pLaserAttachment = pAttachmentManager->GetInterfaceByName(LASER_ATTACH_NAME); if(!pLaserAttachment) { IAttachment *pAttachment = pAttachmentManager->GetInterfaceByName(attach_helper); if(pAttachment) { const char* pBone = pCharacter->GetICharacterModel()->GetICharacterModelSkeleton()->GetJointNameByID(pAttachment->GetJointID()); pLaserAttachment = pAttachmentManager->CreateAttachment(LASER_ATTACH_NAME, CA_BONE, pBone); if(pLaserAttachment) { QuatT relative = pAttachment->GetAttRelativeDefault(); if(pOwnerItem->GetEntity() != pAttachedEntity) { Matrix34 mtx(relative); relative.t = relative * offset; } pLaserAttachment->SetAttRelativeDefault(relative); } } } if(pLaserAttachment) { CEntityAttachment* pEntAttach = new CEntityAttachment; pEntAttach->SetEntityId(m_laserEntityId); pLaserAttachment->AddBinding(pEntAttach); pLaserAttachment->HideAttachment(0); m_usingEntityAttachment = true; } } } } if(!m_usingEntityAttachment && pOwnerEntity) { pOwnerEntity->AttachChild(pLaserEntity); pLaserEntity->SetLocalTM(Matrix34::CreateTranslationMat(offset)); } } }