//------------------------------------------------------ void CWeapon::ForcePendingActions(uint8 blockedActions) { CItem::ForcePendingActions(blockedActions); CActor* pOwner = GetOwnerActor(); if(!pOwner || !pOwner->IsClient() || s_lockActionRequests) return; //--- Lock action requests to ensure that we don't recurse back into this function but also //--- block any recursive action requests to ensure we don't repeat the actions next frame s_lockActionRequests = true; //Force start firing, if needed and possible if(IsInputFlagSet(eWeaponAction_Fire) && !(blockedActions&eWeaponAction_Fire)) { ClearInputFlag(eWeaponAction_Fire); if(IsTargetOn() || (m_fm && !m_fm->AllowZoom())) { s_lockActionRequests = false; return; } OnAction(GetOwnerId(),CCryName("attack1"),eAAM_OnHold,0.0f); } //Force zoom in if needed if(IsInputFlagSet(eWeaponAction_Zoom) && !(blockedActions&eWeaponAction_Zoom)) { if(!IsZoomed() && !IsZoomingInOrOut()) OnActionZoom(GetOwnerId(), CCryName("zoom"), eAAM_OnPress, 0.0f); ClearInputFlag(eWeaponAction_Zoom); } if(IsInputFlagSet(eWeaponAction_Reload) && !(blockedActions&eWeaponAction_Reload)) { if (!IsBusy()) ReloadWeapon(); ClearInputFlag(eWeaponAction_Reload); } s_lockActionRequests = false; }
//------------------------------------------------------------------------ bool CActionFilter::SerializeXML(const XmlNodeRef& root, bool bLoading) { if (bLoading) { // loading const XmlNodeRef& child = root; if (strcmp(child->getTag(), "actionfilter") != 0) return false; EActionFilterType actionFilterType = eAFT_ActionFail; if (!strcmp(child->getAttr("type"), "actionFail")) actionFilterType = eAFT_ActionFail; if (!strcmp(child->getAttr("type"), "actionPass")) actionFilterType = eAFT_ActionPass; m_type = actionFilterType; int nFilters = child->getChildCount(); for (int f=0; f<nFilters; ++f) { XmlNodeRef filter = child->getChild(f); Filter(CCryName(filter->getAttr("name"))); } } else { // saving XmlNodeRef filterRoot = root->newChild("actionfilter"); filterRoot->setAttr("name", m_name); filterRoot->setAttr("type", m_type == eAFT_ActionPass ? "actionPass" : "actionFail"); filterRoot->setAttr("version", m_pActionMapManager->GetVersion()); TFilterActions::const_iterator iter = m_filterActions.begin(); while (iter != m_filterActions.end()) { XmlNodeRef filterChild = filterRoot->newChild("filter"); filterChild->setAttr("name", iter->c_str()); ++iter; } } return true; }
void CNetPlayerInput::DoSetState(const SSerializedPlayerInput& input ) { m_newInterpolation |= (input.position != m_curInput.position) || (input.deltaMovement != m_curInput.deltaMovement); const bool wasSprinting = m_curInput.sprint; m_curInput = input; CHANGED_NETWORK_STATE(m_pPlayer, CPlayer::ASPECT_INPUT_CLIENT ); if(wasSprinting != input.sprint) { SInputEventData inputEventData( SInputEventData::EInputEvent_Sprint, m_pPlayer->GetEntityId(), CCryName("sprint"), input.sprint ? eAAM_OnPress : eAAM_OnRelease, 0.f ); m_pPlayer->StateMachineHandleEventMovement( SStateEventPlayerInput( &inputEventData ) ); } // not having these set seems to stop a remote avatars rotation being reflected m_curInput.aiming = true; m_curInput.allowStrafing = true; m_curInput.usinglookik = true; IAIActor* pAIActor = CastToIAIActorSafe(m_pPlayer->GetEntity()->GetAI()); if (pAIActor) pAIActor->GetState().bodystate=input.bodystate; CMovementRequest moveRequest; moveRequest.SetStance( (EStance)m_curInput.stance ); if(IsDemoPlayback()) { Vec3 localVDir(m_pPlayer->GetViewQuatFinal().GetInverted() * m_curInput.lookDirection); Ang3 deltaAngles(asinf(localVDir.z),0,atan2_tpl(-localVDir.x,localVDir.y)); moveRequest.AddDeltaRotation(deltaAngles*gEnv->pTimer->GetFrameTime()); } moveRequest.SetPseudoSpeed(CalculatePseudoSpeed()); moveRequest.SetAllowStrafing(input.allowStrafing); m_pPlayer->GetMovementController()->RequestMovement(moveRequest); #if !defined(_RELEASE) // debug.. if (g_pGameCVars->g_debugNetPlayerInput & 1) { IPersistantDebug * pPD = gEnv->pGame->GetIGameFramework()->GetIPersistantDebug(); pPD->Begin( string("net_player_input_") + m_pPlayer->GetEntity()->GetName(), true ); pPD->AddSphere( moveRequest.GetLookTarget(), 0.5f, ColorF(1,0,1,1), 1.0f ); // pPD->AddSphere( moveRequest.GetMoveTarget(), 0.5f, ColorF(1,1,0,1), 1.0f ); Vec3 wp(m_pPlayer->GetEntity()->GetWorldPos() + Vec3(0,0,2)); pPD->AddDirection( wp, 1.5f, m_curInput.deltaMovement, ColorF(1,0,0,1), 1.0f ); pPD->AddDirection( wp, 1.5f, m_curInput.lookDirection, ColorF(0,1,0,1), 1.0f ); } #endif }