void CMountedGunController::OnEnter(EntityId mountedGunId) { CRY_ASSERT_MESSAGE(m_pControlledPlayer, "Controlled player not initialized"); ICharacterInstance* pCharacter = m_pControlledPlayer->IsThirdPerson() ? m_pControlledPlayer->GetEntity()->GetCharacter(0) : m_pControlledPlayer->GetShadowCharacter(); if (pCharacter) { CItem* pWeapon = static_cast<CItem*>(g_pGame->GetIGameFramework()->GetIItemSystem()->GetItem(mountedGunId)); assert(pWeapon); IActionController* pActionController = m_pControlledPlayer->GetAnimatedCharacter()->GetActionController(); if (pActionController && m_pMannequinParams) { SAFE_RELEASE(m_pMovementAction); m_pMovementAction = new TPlayerAction(PP_PlayerAction, m_pMannequinParams->fragmentIDs.MotionMounted); m_pMovementAction->AddRef(); pActionController->Queue(m_pMovementAction); } ////////////////////////////////////////////////////////////////////////// // NOTE: This should go through mannequin CRecordingSystem* pRecordingSystem = g_pGame->GetRecordingSystem(); if (pRecordingSystem) { const SParams& pWeaponParams = pWeapon->GetParams(); IAnimationSet* pAnimationSet = pCharacter->GetIAnimationSet(); const int upAnimId = pAnimationSet->GetAnimIDByName(pWeaponParams.mountedTPAimAnims[MountedTPAimAnim::Up].c_str()); const int downAnimId = pAnimationSet->GetAnimIDByName(pWeaponParams.mountedTPAimAnims[MountedTPAimAnim::Down].c_str()); pRecordingSystem->OnMountedGunEnter(m_pControlledPlayer, upAnimId, downAnimId); } ////////////////////////////////////////////////////////////////////////// IAnimatedCharacter* pAnimatedCharacter = m_pControlledPlayer->GetAnimatedCharacter(); CRY_ASSERT(pAnimatedCharacter); pAnimatedCharacter->RequestPhysicalColliderMode(eColliderMode_Disabled, eColliderModeLayer_Game, "CMountedGunController::OnEnter"); pAnimatedCharacter->SetNoMovementOverride(true); if (gEnv->bMultiplayer) pAnimatedCharacter->EnableRigidCollider(0.5f); else if (m_pControlledPlayer->IsPlayer()) pAnimatedCharacter->EnableRigidCollider(1.5f); pAnimatedCharacter->GetGroundAlignmentParams().SetFlag(eGA_AllowWithNoCollision, true); BATTLECHATTER(BC_WatchMyBack, m_pControlledPlayer->GetEntityId()); } }
bool CPlayerInput::OnActionProne(EntityId entityId, const ActionId& actionId, int activationMode, float value) { //No prone if holding something COffHand* pOffHand = static_cast<COffHand*>(m_pPlayer->GetWeaponByClass(CItem::sOffHandClass)); if(pOffHand && pOffHand->IsHoldingEntity()) return false; if (!m_pPlayer->m_stats.spectatorMode) { if(!m_pPlayer->GetActorStats()->inZeroG) { if(activationMode == eAAM_OnPress) { CItem *curItem = static_cast<CItem*>(gEnv->pGame->GetIGameFramework()->GetIItemSystem()->GetItem(m_pPlayer->GetInventory()->GetCurrentItem())); if(curItem && curItem->GetParams().prone_not_usable) { // go crouched instead. // Nope, actually do nothing // if (!(m_actions & ACTION_CROUCH)) // m_actions |= ACTION_CROUCH; // else // m_actions &= ~ACTION_CROUCH; } else { if (!(m_actions & ACTION_PRONE)) { if(!m_pPlayer->GetActorStats()->inAir) m_actions |= ACTION_PRONE; } else m_actions &= ~ACTION_PRONE; } } } } return false; }
void CPlayerRotation::GetStanceAngleLimits(float &minAngle,float &maxAngle) { EStance stance = m_player.GetStance(); switch(stance) { default: case STANCE_CROUCH: case STANCE_STAND: minAngle = -80.0f; maxAngle = 80.0f; break; case STANCE_PRONE: minAngle = -35.0f; maxAngle = 45.0f; break; } //Limit camera rotation on ladders(to prevent clipping) if(m_player.m_stats.isOnLadder) { minAngle = -40.0f; maxAngle = 80.0f; } if(m_stats.grabbedHeavyEntity!=0) { minAngle = -35.0f; //Limit angle to prevent clipping, throw objects at feet, etc... } // SNH: additional restriction based on weapon type if prone. if(m_player.GetStance() == STANCE_PRONE && g_pGameCVars->g_proneAimAngleRestrict_Enable != 0) { float dist = 0.0f; CItem *pItem = (CItem *)(m_player.GetCurrentItem()); if(pItem) dist = pItem->GetParams().raise_distance; SMovementState movestate; m_player.m_pMovementController->GetMovementState(movestate); // try a cylinder intersection test IPhysicalEntity *pIgnore[2]; pIgnore[0] = m_player.GetEntity()->GetPhysics(); pIgnore[1] = pItem ? pItem->GetEntity()->GetPhysics() : NULL; primitives::cylinder cyl; cyl.r = 0.05f; cyl.axis = movestate.aimDirection; cyl.hh = dist; cyl.center = movestate.weaponPosition + movestate.aimDirection*cyl.hh; //gEnv->pRenderer->GetIRenderAuxGeom()->DrawCylinder(cyl.center, cyl.axis, cyl.r, cyl.hh, ColorF(0.4f,1.0f,0.6f, 0.2f)); float n = 0.0f; geom_contact *contacts; intersection_params params; WriteLockCond lockContacts; params.bStopAtFirstTri = false; params.bSweepTest = false; params.bNoBorder = true; params.bNoAreaContacts = true; n = gEnv->pPhysicalWorld->PrimitiveWorldIntersection(primitives::cylinder::type, &cyl, Vec3(0,0,2), ent_static|ent_terrain, &contacts, 0, geom_colltype_player, ¶ms, 0, 0, pIgnore, pIgnore[1]?2:1), lockContacts; int ret = (int)n; geom_contact *currentc = contacts; for(int i=0; i<ret; i++) { geom_contact *contact = currentc; if(contact && (fabs_tpl(contact->n.z)>0.2f)) { Vec3 dir = contact->pt - movestate.weaponPosition; dir.NormalizeSafe(); Vec3 horiz = dir; horiz.z = 0.0f; horiz.NormalizeSafe(); float cosangle = dir.Dot(horiz); Limit(cosangle, -1.0f, 1.0f); float newMin = acos_tpl(cosangle); newMin = -newMin * 180.0f / gf_PI; //float col[] = {1,1,1,1}; //gEnv->pRenderer->Draw2dLabel(100,100, 1.0f, col, false, "minangle: %.2f", newMin); //gEnv->pRenderer->GetIRenderAuxGeom()->DrawSphere(contact->pt, 0.03f, ColorF(1,0,0,1)); minAngle = MAX(newMin, minAngle); } ++currentc; } } minAngle *= gf_PI/180.0f; maxAngle *= gf_PI/180.0f; }
void CReplayActor::UpdateScopeContexts() { if (m_pActionController) { //--- Update variable scope contexts CItem *pItem = static_cast<CItem*>(g_pGame->GetIGameFramework()->GetIItemSystem()->GetItem(m_gunId)); ICharacterInstance *pICharInst = (m_flags & eRAF_FirstPerson) && pItem ? pItem->GetEntity()->GetCharacter(0) : NULL; IMannequin &mannequinSys = gEnv->pGame->GetIGameFramework()->GetMannequinInterface(); const int contextID = PlayerMannequin.contextIDs.Weapon; if (contextID >= 0) { const uint32 numScopes = m_pActionController->GetContext().controllerDef.m_scopeDef.size(); ICharacterInstance *scopeCharInst = NULL; for (uint32 s=0; s<numScopes; s++) { if (m_pActionController->GetContext().controllerDef.m_scopeDef[s].context == contextID) { scopeCharInst = m_pActionController->GetScope(s)->GetCharInst(); break; } } if (scopeCharInst != pICharInst) { if (pICharInst) { const SParams& weaponParams = pItem->GetParams(); const IAnimationDatabase *animDB = !weaponParams.adbFile.empty() ? mannequinSys.GetAnimationDatabaseManager().Load(weaponParams.adbFile.c_str()) : NULL; if (animDB) { m_pActionController->SetScopeContext(contextID, *pItem->GetEntity(), pICharInst, animDB); } else { m_pActionController->ClearScopeContext(contextID, false); } } else { m_pActionController->ClearScopeContext(contextID, false); } } } const uint32 NUM_ACCESSORY_SLOTS = 2; uint32 ACCESSORY_CONTEXT_IDS[NUM_ACCESSORY_SLOTS] = {PlayerMannequin.contextIDs.attachment_top, PlayerMannequin.contextIDs.attachment_bottom}; for (uint32 attachmentSlot=0; attachmentSlot<NUM_ACCESSORY_SLOTS; attachmentSlot++) { const int attachmentContextID = ACCESSORY_CONTEXT_IDS[attachmentSlot]; ICharacterInstance *scopeCharInst = NULL; ICharacterInstance *accessoryCharInst = NULL; CItem *accessory = NULL; const char *contextName = m_pActionController->GetContext().controllerDef.m_scopeContexts.GetTagName(attachmentContextID); const uint32 numScopes = m_pActionController->GetContext().controllerDef.m_scopeDef.size(); for (uint32 s=0; s<numScopes; s++) { if (m_pActionController->GetContext().controllerDef.m_scopeDef[s].context == attachmentContextID) { scopeCharInst = m_pActionController->GetScope(s)->GetCharInst(); break; } } if (pItem) { //--- Find attachments const CItem::TAccessoryArray &accessories = pItem->GetAccessories(); for (CItem::TAccessoryArray::const_iterator iter=accessories.begin(); iter != accessories.end(); ++iter) { const CItem::SAccessoryInfo &accessoryInfo = *iter; const SAccessoryParams *aparams = pItem->GetAccessoryParams(accessoryInfo.pClass); if (strcmp(aparams->attach_helper.c_str(), contextName) == 0) { //--- Found a match accessory = pItem->GetAccessory(accessoryInfo.pClass); accessoryCharInst = accessory->GetEntity()->GetCharacter(0); break; } } } if (scopeCharInst != accessoryCharInst) { if (accessoryCharInst && !accessory->GetParams().adbFile.empty()) { const IAnimationDatabase *animDB = mannequinSys.GetAnimationDatabaseManager().Load(accessory->GetParams().adbFile.c_str()); if (animDB) { m_pActionController->SetScopeContext(attachmentContextID, *pItem->GetEntity(), accessoryCharInst, animDB); } } else { m_pActionController->ClearScopeContext(attachmentContextID, false); } } } } }