//------------------------------------------------------------------------ int CScriptBind_Actor::IsGhostPit(IFunctionHandler *pH) { CActor *pActor = GetActor(pH); if (!pActor) return pH->EndFunction(); bool hidden = false; if (IVehicle* pVehicle = pActor->GetLinkedVehicle()) { IVehicleSeat* pSeat = pVehicle->GetSeatForPassenger(pActor->GetEntityId()); if (pSeat) { if (IVehicleView* pView = pSeat->GetView(pSeat->GetCurrentView())) hidden = pView->IsPassengerHidden(); } } return pH->EndFunction(hidden); }
//----------------------------------------------------------------------- void CVehiclePartLight::UpdateLight(const float frameTime) { if (m_slot == -1) return; // move to vehicle event change view? if (m_diffuseMult[0] != m_diffuseMult[1]) { SEntitySlotInfo info; if (m_pVehicle->GetEntity()->GetSlotInfo(m_slot, info) && info.pLight) { CDLight& light = info.pLight->GetLightProperties(); IActor* pActor = CCryAction::GetCryAction()->GetClientActor(); bool localPlayer = (pActor != NULL) && (pActor->GetLinkedVehicle() == m_pVehicle); IVehicleSeat* pSeat = pActor ? m_pVehicle->GetSeatForPassenger(pActor->GetEntityId()) : NULL; IVehicleView* pView = pSeat? pSeat->GetView(pSeat->GetCurrentView()) : NULL; bool isThirdPersonView = pView? pView->IsThirdPerson() : true; if (localPlayer && !isThirdPersonView) light.SetLightColor(ColorF(m_diffuseCol * m_diffuseMult[0], 1.f)); else light.SetLightColor(ColorF(m_diffuseCol * m_diffuseMult[1], 1.f)); } } if (m_pHelper) { const static Matrix33 rot(Matrix33::CreateRotationXYZ(Ang3(0.f, 0.f, DEG2RAD(90.f)))); Matrix34 helperTM; m_pHelper->GetVehicleTM(helperTM); Matrix34 localTM = Matrix33(helperTM) * rot; localTM.SetTranslation(helperTM.GetTranslation()); GetEntity()->SetSlotLocalTM(m_slot, localTM); } }
//------------------------------------------------------------------------ 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; } }