void CHUD::IndicateHit(bool enemyIndicator,IEntity *pEntity, bool explosionFeedback) { CPlayer *pPlayer = static_cast<CPlayer *>(gEnv->pGame->GetIGameFramework()->GetClientActor()); if(!pPlayer) return; if(explosionFeedback) PlaySound(ESound_SpecialHitFeedback); if(!pPlayer->GetLinkedVehicle()) m_pHUDCrosshair->GetFlashAnim()->Invoke("indicateHit"); else { IVehicleSeat *pSeat = pPlayer->GetLinkedVehicle()->GetSeatForPassenger(pPlayer->GetEntityId()); if(pSeat && !pSeat->IsDriver()) m_pHUDCrosshair->GetFlashAnim()->Invoke("indicateHit"); else { m_pHUDVehicleInterface->m_animMainWindow.Invoke("indicateHit", enemyIndicator); if(pEntity && !gEnv->bMultiplayer) { float r = ((unsigned char) ((g_pGameCVars->hud_colorLine >> 16) & 0xFF)) / 255.0f; float g = ((unsigned char) ((g_pGameCVars->hud_colorLine >> 8) & 0xFF)) / 255.0f; float b = ((unsigned char) ((g_pGameCVars->hud_colorLine >> 0) & 0xFF)) / 255.0f; // It should be useless to test if pEntity is an enemy (it's already done by caller func) IActor *pActor = gEnv->pGame->GetIGameFramework()->GetIActorSystem()->GetActor(pEntity->GetId()); if(pActor) m_pHUDSilhouettes->SetSilhouette(pActor,r,g,b,1.0f,5.0f,true); else if(IVehicle *pVehicle = gEnv->pGame->GetIGameFramework()->GetIVehicleSystem()->GetVehicle(pEntity->GetId())) m_pHUDSilhouettes->SetSilhouette(pVehicle,r,g,b,1.0f,5.0f); } } }
//------------------------------------------------------------------------ void CVehicleClient::OnAction(IVehicle* pVehicle, EntityId actorId, const ActionId& actionId, int activationMode, float value) { assert(pVehicle); if (!pVehicle) return; TActionNameIdMap::const_iterator ite = m_actionNameIds.find(actionId); if (ite == m_actionNameIds.end()) return; IVehicleMovement *pMovement = pVehicle->GetMovement(); const bool isAir = pMovement && pMovement->GetMovementType()==IVehicleMovement::eVMT_Air; IVehicleSeat* pCurrentSeat = pVehicle->GetSeatForPassenger(actorId); const bool isThirdPerson = pCurrentSeat && pCurrentSeat->GetView(pCurrentSeat->GetCurrentView())->IsThirdPerson(); const bool isDriver = pCurrentSeat && pCurrentSeat->IsDriver(); switch (ite->second) { case (eVAI_XIMoveX): { if(pMovement && pMovement->GetMovementType() == IVehicleMovement::eVMT_Air) { //strafe instead of turning for air vehicles if(value>0.f) { pVehicle->OnAction(eVAI_StrafeRight, eAAM_OnPress, value, actorId); m_bMovementFlagRight = true; } else if(value==0.f) { if(m_bMovementFlagRight) { pVehicle->OnAction(eVAI_StrafeRight, eAAM_OnRelease, 0.f, actorId); m_bMovementFlagRight = false; } else if(m_bMovementFlagLeft) { pVehicle->OnAction(eVAI_StrafeLeft, eAAM_OnRelease, 0.f, actorId); m_bMovementFlagLeft = false; } } else//value<0 { pVehicle->OnAction(eVAI_StrafeLeft, eAAM_OnPress, -value, actorId); m_bMovementFlagLeft = true; } } else { if(value>0.f) { pVehicle->OnAction(eVAI_TurnRight, eAAM_OnPress, value, actorId); m_bMovementFlagRight = true; } else if(value==0.f) { if(m_bMovementFlagRight) { pVehicle->OnAction(eVAI_TurnRight, eAAM_OnRelease, 0.f, actorId); m_bMovementFlagRight = false; } else if(m_bMovementFlagLeft) { pVehicle->OnAction(eVAI_TurnLeft, eAAM_OnRelease, 0.f, actorId); m_bMovementFlagLeft = false; } } else//value<0 { pVehicle->OnAction(eVAI_TurnLeft, eAAM_OnPress, -value, actorId); m_bMovementFlagLeft = true; } } break; } case (eVAI_XIMoveY): { EVehicleActionIds eForward = eVAI_MoveForward; EVehicleActionIds eBack = eVAI_MoveBack; if(!strcmp("Asian_helicopter",pVehicle->GetEntity()->GetClass()->GetName())) { eForward = eVAI_MoveUp; eBack = eVAI_MoveDown; } if(value>0.f) { pVehicle->OnAction(eForward, eAAM_OnPress, value, actorId); m_bMovementFlagForward = true; } else if(value==0.f) { if(m_bMovementFlagForward) { pVehicle->OnAction(eForward, eAAM_OnRelease, 0.f, actorId); m_bMovementFlagForward = false; } else if(m_bMovementFlagBack) { pVehicle->OnAction(eBack, eAAM_OnRelease, 0.f, actorId); m_bMovementFlagBack = false; } } else//value<0.f { pVehicle->OnAction(eBack, eAAM_OnPress, -value, actorId); m_bMovementFlagBack = true; } break; } case (eVAI_XIRotateYaw): { if (isAir && (isDriver || isThirdPerson)) { pVehicle->OnAction(eVAI_RotateYaw, eAAM_OnPress, value / 5.f, actorId); } else { // action is sent to vehicle in PreUpdate, so it is repeated every frame. m_xiRotation.x = (value*value*value); } break; } case (eVAI_XIRotatePitch): { if (isAir && (isDriver || isThirdPerson)) { pVehicle->OnAction(eVAI_RotatePitch, eAAM_OnPress, value / 5.f, actorId); } else { // action is sent to vehicle in PreUpdate, so it is repeated every frame m_xiRotation.y = -(value*value*value); if(g_pGameCVars->cl_invertController) m_xiRotation.y*=-1; } break; } case (eVAI_RotateYaw): { // attempt to normalise the input somewhat (to bring it in line with controller input). const float scale = 0.75f, limit = 6.0f; value = clamp_tpl<float>(scale * value * gEnv->pTimer->GetFrameTime(), -limit, limit); if (isAir) { value *= 10.f; } pVehicle->OnAction(ite->second, activationMode, value, actorId); break; } case (eVAI_RotatePitch): { // attempt to normalise the input somewhat (to bring it in line with controller input). const float scale = 0.75f, limit = 6.0f; value = clamp_tpl<float>(scale * value * gEnv->pTimer->GetFrameTime(), -limit, limit); if (g_pGameCVars->cl_invertMouse) value *= -1.f; if (isAir) { value *= 10.f; } pVehicle->OnAction(ite->second, activationMode, value, actorId); break; } case (eVAI_TurnLeft): { if (activationMode == eAAM_OnPress || activationMode == eAAM_OnRelease) m_fLeftRight -= value*2.f - 1.f; m_fLeftRight = CLAMP(m_fLeftRight, -1.0f, 1.0f); pVehicle->OnAction(ite->second, activationMode, -m_fLeftRight, actorId); break; } case (eVAI_TurnRight): { if (activationMode == eAAM_OnPress || activationMode == eAAM_OnRelease) m_fLeftRight += value*2.f - 1.f; m_fLeftRight = CLAMP(m_fLeftRight, -1.0f, 1.0f); pVehicle->OnAction(ite->second, activationMode, m_fLeftRight, actorId); break; } case (eVAI_MoveForward): { if (activationMode == eAAM_OnPress || activationMode == eAAM_OnRelease) m_fForwardBackward += value*2.f - 1.f; if(activationMode == eAAM_OnRelease) m_fForwardBackward = CLAMP(m_fForwardBackward, 0.0f, 1.0f); else m_fForwardBackward = CLAMP(m_fForwardBackward, -1.0f, 1.0f); pVehicle->OnAction(ite->second, activationMode, m_fForwardBackward, actorId); break; } case (eVAI_MoveBack): { if (activationMode == eAAM_OnPress || activationMode == eAAM_OnRelease) m_fForwardBackward -= value*2.f - 1.f; if(activationMode == eAAM_OnRelease) m_fForwardBackward = CLAMP(m_fForwardBackward, -1.0f, 0.0f); else m_fForwardBackward = CLAMP(m_fForwardBackward, -1.0f, 1.0f); pVehicle->OnAction(ite->second, activationMode, -m_fForwardBackward, actorId); break; } case (eVAI_ZoomIn): case (eVAI_ZoomOut): break; default: pVehicle->OnAction(ite->second, activationMode, value, actorId); break; } }