void execute(CItem *pItem)
	{
		_this->m_attacking = false;
		_this->m_slideKick = false;
		_this->m_netAttacking = false;

		_this->m_delayTimer = 0.0f;
		pItem->SetBusy(false);
		pItem->ForcePendingActions();
		MeleeDebugLog ("CMelee<%p> StopAttackingAction is being executed!", _this);

		CActor* pActor(NULL);
		if(!gEnv->bMultiplayer)
		{
			if (IEntity* owner = pItem->GetOwner())
				if (IAIObject* aiObject = owner->GetAI())
					if (IAIActor* aiActor = aiObject->CastToIAIActor())
						aiActor->SetSignal(0, "OnMeleePerformed");
		}
		else if( g_pGameCVars->pl_melee.mp_melee_system_camera_lock_and_turn && s_meleeSnapTargetId && (pActor = pItem->GetOwnerActor()) && pActor->IsClient() )
		{
			CActor* pOwnerActor = pItem->GetOwnerActor();
			pOwnerActor->GetActorParams().viewLimits.ClearViewLimit(SViewLimitParams::eVLS_Item);

			s_meleeSnapTargetId = 0;
			CHANGED_NETWORK_STATE(pOwnerActor, CPlayer::ASPECT_SNAP_TARGET);
		}

		if(_this->m_pMeleeAction)
		{
			SAFE_RELEASE(_this->m_pMeleeAction);
		}
	}
//------------------------------------------------------------------------
void CWeapon::RequestStartMeleeAttack(bool weaponMelee, bool boostedAttack, int8 attackIndex /*= -1*/)
{

    CActor *pActor=GetOwnerActor();

    if (!gEnv->bServer && pActor && pActor->IsClient())
    {
        GetGameObject()->InvokeRMI(CWeapon::SvRequestStartMeleeAttack(), MeleeRMIParams(boostedAttack,attackIndex), eRMI_ToServer);

#ifndef _RELEASE
        if(g_pGameCVars->pl_pickAndThrow.environmentalWeaponComboDebugEnabled)
        {
            CryLogAlways("COMBO - RequestStartMeleeAttack - called by NON SERVER client with attack index [%d]",attackIndex);
            CryLogAlways("COMBO - RequestStartMeleeAttack - calling SvRequestStartMeleeAttack");
        }
#endif //#ifndef _RELEASE

    }
    else if (IsServer())
    {
        m_attackIndex		= attackIndex;
        m_meleeCounter	= (m_meleeCounter + 1) % kMeleeCounterMax;
#ifndef _RELEASE
        if(g_pGameCVars->pl_pickAndThrow.environmentalWeaponComboDebugEnabled)
        {
            CryLogAlways("COMBO - RequestStartMeleeAttack - called by server, about to netserialising to clients w A.Index. [%d]", m_attackIndex);
        }
#endif //#ifndef _RELEASE
        CHANGED_NETWORK_STATE(this, ASPECT_MELEE);
    }
}
//---------------------------------------------------------------------
void CMelee::RequestAlignmentToNearestTarget()
{
	CActor* pOwner = m_pWeapon->GetOwnerActor();
	if(pOwner && pOwner->IsClient())
	{
		if (!s_meleeSnapTargetId)
		{
			// If we don't already have an auto-aim target, try and find one.
			if (s_meleeSnapTargetId = GetNearestTarget())
			{
				IActor* pTargetActor = g_pGame->GetIGameFramework()->GetIActorSystem()->GetActor(s_meleeSnapTargetId);
				s_bMeleeSnapTargetCrouched = pTargetActor && static_cast<CPlayer*>(pTargetActor)->GetStance() == STANCE_CROUCH;

				CHANGED_NETWORK_STATE(pOwner, CPlayer::ASPECT_SNAP_TARGET);
			}
		}

		if(!s_meleeSnapTargetId || m_netAttacking)
			return;

		if(pOwner && pOwner->IsClient() && m_pMeleeAction && g_pGameCVars->pl_melee.mp_melee_system_camera_lock_and_turn)
		{
			pOwner->GetActorParams().viewLimits.SetViewLimit(pOwner->GetViewRotation().GetColumn1(), 0.01f, 0.01f, 0.01f, 0.01f, SViewLimitParams::eVLS_Item);
		}

		g_pGame->GetAutoAimManager().SetCloseCombatSnapTarget(s_meleeSnapTargetId, 
			g_pGameCVars->pl_melee.melee_snap_end_position_range, 
			g_pGameCVars->pl_melee.melee_snap_move_speed_multiplier);
	}
}
示例#4
0
bool CNetworkBuilding::Building(int part)
{
	if(part>0)
	{
		if(part==1)
		{
			CryLog("CNetworkBuilding::Building part 1...");
			// Geometry
			GetEntity()->LoadGeometry(0, model_1);
			// Material
			IMaterial *pMat = gEnv->p3DEngine->GetMaterialManager()->LoadMaterial(Model_1_mat);
			GetEntity()->SetMaterial(pMat);
			// Physics
			Physicalize((pe_type)phys_type);
		}
		if(part==2)
		{
			CryLog("CNetworkBuilding::Building part 2...");
			GetEntity()->LoadGeometry(0, model_2);

			IMaterial *pMat = gEnv->p3DEngine->GetMaterialManager()->LoadMaterial(Model_2_mat);
			GetEntity()->SetMaterial(pMat);

			Physicalize((pe_type)phys_type);
		}

		if(part==3)
		{
			CryLog("CNetworkBuilding::Building part 3...");
			GetEntity()->LoadGeometry(0, model_3);

			IMaterial *pMat = gEnv->p3DEngine->GetMaterialManager()->LoadMaterial(Model_3_mat);
			GetEntity()->SetMaterial(pMat);

			Physicalize((pe_type)phys_type);
		}

		if(part==4)
		{
			CryLog("CNetworkBuilding::Building finish part...");
			GetEntity()->LoadGeometry(0, finish_model);

			IMaterial *pMat = gEnv->p3DEngine->GetMaterialManager()->LoadMaterial(finishMat);
			GetEntity()->SetMaterial(pMat);

			Physicalize((pe_type)phys_type);

			m_state = eState_Done;
			CryLog("CNetworkBuilding::Building finished !");
		}

		if (gEnv->bServer)
		{
			CHANGED_NETWORK_STATE(this, POSITION_ASPECT);	
		}
	}

	return true;
}
示例#5
0
void CMonoActor::SetAuthority( bool auth )
{
	// we've been given authority of this entity, mark the physics as changed
	// so that we send a current position, failure to do this can result in server/client
	// disagreeing on where the entity is. most likely to happen on restart
	if(auth)
		CHANGED_NETWORK_STATE(this, eEA_Physics);
}
//------------------------------------------------------------------------
IMPLEMENT_RMI(CWeapon, SvRequestWeaponRaised)
{
    CHECK_OWNER_REQUEST();

    CHANGED_NETWORK_STATE(this, ASPECT_STREAM);

    return true;
}
void CDangerousRigidBody::SetIsDangerous( bool isDangerous, EntityId triggerPlayerId )
{
	if(gEnv->bServer && isDangerous != m_dangerous)
	{
		m_dangerous = isDangerous;
		m_activatorTeam = g_pGame->GetGameRules()->GetTeam(triggerPlayerId);

		CHANGED_NETWORK_STATE(this, ASPECT_DAMAGE_STATUS);
	}
}
示例#8
0
bool CTornado::Reset()
{
	//Initialize default values before (in case ScriptTable fails)
	m_wanderSpeed = 10.0f;
	m_cloudHeight = 376.0f;
	m_radius = 300.0f;

	m_spinImpulse = 9.0f;
	m_attractionImpulse = 13.0f;
	m_upImpulse = 18.0f;

	const char* funnelEffect = 0;

	SmartScriptTable props;
	IScriptTable* pScriptTable = GetEntity()->GetScriptTable();
	if(!pScriptTable || !pScriptTable->GetValue("Properties", props))
		return false;

	props->GetValue("fWanderSpeed", m_wanderSpeed);
	props->GetValue("fCloudHeight", m_cloudHeight);
	props->GetValue("Radius", m_radius);
		
	props->GetValue("fSpinImpulse", m_spinImpulse);
	props->GetValue("fAttractionImpulse", m_attractionImpulse);
	props->GetValue("fUpImpulse", m_upImpulse);
  
	props->GetValue("FunnelEffect", funnelEffect);
	if (!UseFunnelEffect(funnelEffect))
		return false;

	Matrix34 m = GetEntity()->GetWorldTM();
	m_wanderDir = m.GetColumn(1)*0.414214f;

	m_isOnWater = false;
	m_isInAir = false;

	m_nextEntitiesCheck = 0;

	Vec3 pos = GetEntity()->GetWorldPos();
	gEnv->pLog->Log("TORNADO INIT POS: %f %f %f", pos.x, pos.y, pos.z);
	m_points[0] = pos;
	m_points[1] = pos + Vec3(0,0,m_cloudHeight/8.0f);
	m_points[2] = pos + Vec3(0,0,m_cloudHeight/2.0f);
	m_points[3] = pos + Vec3(0,0,m_cloudHeight);
	for (int i=0; i<4; ++i)
		m_oldPoints[i] = m_points[i];

	m_currentPos = GetEntity()->GetWorldPos();
	CHANGED_NETWORK_STATE(this, POSITION_ASPECT);
	
	UpdateTornadoSpline();

	return true;
}
示例#9
0
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
}
示例#10
0
void CNetPlayerInput::Update()
{
	if (gEnv->bServer && (g_pGameCVars->sv_input_timeout>0) && ((gEnv->pTimer->GetFrameStartTime()-m_lastUpdate).GetMilliSeconds()>=g_pGameCVars->sv_input_timeout))
	{
		m_curInput.deltaMovement.zero();
		m_curInput.sprint=false;
		m_curInput.stance=(uint8)STANCE_NULL;

		CHANGED_NETWORK_STATE(m_pPlayer,  CPlayer::ASPECT_INPUT_CLIENT );
	}
}
示例#11
0
void CNetworkBuilding::StartBuild()
{
	if(m_state==eState_NotUsed && gEnv->bServer)
	{
		CryLog("CNetworkBuilding::Building started...");
		m_state = eState_InUse;
		build_status = 0;
		fStartTime = gEnv->pTimer->GetAsyncTime().GetSeconds();

		CHANGED_NETWORK_STATE(this, POSITION_ASPECT);
	}
}
//------------------------------------------------------------------------
IMPLEMENT_RMI(CWeapon, SvRequestShoot)
{
    CHECK_OWNER_REQUEST();

    bool ok=true;
    CActor *pActor=GetActorByNetChannel(pNetChannel);
    if (!pActor || pActor->IsDead())
        ok=false;

    if (ok)
    {
        m_fireCounter++;
        m_expended_ammo++;

        IActor *pLocalActor=m_pGameFramework->GetClientActor();
        bool isLocal = pLocalActor && (pLocalActor->GetChannelId() == pActor->GetChannelId());

#ifdef SERVER_CHECKS
        const float fCurrentTime = gEnv->pTimer->GetAsyncCurTime();
        const int kOldShotId = m_lastShotId;
        if(ShouldEndVerificationSample(fCurrentTime, params.shotId))
        {
            EndVerificationSample(pActor, kOldShotId);
            StartVerificationSample(fCurrentTime);
        }

        m_fLastSampleTakenTime = fCurrentTime;
        m_fSampleNumShots += 1.0f;

        CPlayer * pPlayer = static_cast<CPlayer*>(pActor);
        pPlayer->GetShotCounter()->RecordShot();
#endif

        if (!isLocal)
        {
            NetShoot(params.hit, 0, params.fireModeId);
        }

        CHANGED_NETWORK_STATE(this, ASPECT_STREAM);
    }

#ifdef SERVER_CHECKS
    CGameRules * pGameRules = static_cast<CGameRules*>(g_pGame->GetGameRules());
    if(pGameRules)	//really we should assert here. I struggle to think of a situation where someone is requesting a shot but there are no GameRules...
    {
        IGameRulesDamageHandlingModule * pDamageHandler = pGameRules->GetDamageHandlingModule();
        assert(pDamageHandler);
        pDamageHandler->RegisterShotIdentification(pActor->GetEntityId(), this, params.shotId);
    }
#endif

    return true;
}
//------------------------------------------------------------------------
IMPLEMENT_RMI(CWeapon, SvRequestSetZoomState)
{
    CHECK_OWNER_REQUEST();

    if (params.zoomed)
        StartZoom(m_owner.GetId(), 1);
    else
        StopZoom(m_owner.GetId());

    CHANGED_NETWORK_STATE(this, ASPECT_STREAM);

    return true;
}
示例#14
0
IMPLEMENT_RMI(CHeavyMountedWeapon, SvRequestRipOff)
{
	CHECK_OWNER_REQUEST();

	if (!m_rippingOff && !m_rippedOff)
	{
		PerformRipOff(GetOwnerActor());

		CHANGED_NETWORK_STATE(this, ASPECT_RIPOFF);
	}

	return true;
}
//------------------------------------------------------------------------
IMPLEMENT_RMI(CWeapon, SvStartedCharging)
{
    CHECK_OWNER_REQUEST();

    if(CFireMode* pFireMode = static_cast<CFireMode*>(GetFireMode(GetCurrentFireMode())))
    {
        pFireMode->NetSetCharging(true);

        CHANGED_NETWORK_STATE(this, ASPECT_CHARGING);
    }

    return true;
}
示例#16
0
文件: Plant.cpp 项目: Xydrel/Infected
//========================================================================
void CPlant::SetProjectileId(EntityId id)
{
	if(id)
	{
		bool changed = m_projectiles.empty();

		stl::push_back_unique(m_projectiles,id);

		if(changed)
		{
			CHANGED_NETWORK_STATE(m_pWeapon, CC4::ASPECT_DETONATE);
		}
	}
}
//------------------------------------------------------------------------
void CWeapon::RequestWeaponRaised(bool raise)
{
    if(gEnv->bMultiplayer)
    {
        CActor* pActor = GetOwnerActor();
        if(pActor && pActor->IsClient())
        {
            if (gEnv->bServer)
                CHANGED_NETWORK_STATE(this, ASPECT_STREAM);
            else
                GetGameObject()->InvokeRMI(SvRequestWeaponRaised(), WeaponRaiseParams(raise), eRMI_ToServer);
        }
    }
}
//------------------------------------------------------------------------
void CWeapon::RequestSetZoomState(bool zoomed)
{
    if(gEnv->bMultiplayer)
    {
        CActor* pActor = GetOwnerActor();
        if(pActor && pActor->IsClient())
        {
            if (gEnv->bServer)
                CHANGED_NETWORK_STATE(this, ASPECT_STREAM);
            else
                GetGameObject()->InvokeRMI(SvRequestSetZoomState(), ZoomStateParams(zoomed), eRMI_ToServer);
        }
    }
}
示例#19
0
文件: Plant.cpp 项目: Xydrel/Infected
//=====================================================================
EntityId CPlant::RemoveProjectileId() 
{
	EntityId id = 0;
	if(!m_projectiles.empty())
	{
		id= m_projectiles.back();
		m_projectiles.pop_back();

		if(m_projectiles.empty())
		{
			CHANGED_NETWORK_STATE(m_pWeapon, CC4::ASPECT_DETONATE);
		}
	}
	return id;
}
示例#20
0
void CHeavyMountedWeapon::ForceRippingOff( bool ripOff )
{
	SetRippingOff(ripOff);

	if (ripOff)
	{
		// If we're forcing to ripped-off, make sure we're using the right firemode (firemode is server
		// controlled so may have lost during a host migration)
		SwitchToRippedOffFireMode();
	}

	if (gEnv->bServer)
	{
		CHANGED_NETWORK_STATE(this, ASPECT_RIPOFF);
	}
}
void CMelee::OnSuccesfulHit( const ray_hit& hitResult )
{
	CActor* pOwner = m_pWeapon->GetOwnerActor();
	if( IsMeleeWeapon() && m_hitStatus != EHitStatus_ReceivedAnimEvent && hitResult.pCollider )
	{
		// we defer the MeleeDamage until the MeleeHitEvent is received!
		m_lastCollisionTest = m_collisionHelper.GetCollisionTestParams();
		m_lastRayHit = hitResult;

		m_lastRayHit.pCollider->AddRef();
		m_hitStatus = EHitStatus_HaveHitResult;
	}
	else
	{
		const SCollisionTestParams& collisionParams = m_collisionHelper.GetCollisionTestParams();
		
		ApplyMeleeDamageHit( collisionParams, hitResult );

		m_hitStatus = EHitStatus_Invalid;

		if(m_pMeleeAction)
		{
			if(pOwner)
			{
				m_pMeleeAction->OnHitResult(pOwner, true);
			}
			else
			{
				//Owner has dropped weapon (Likely from being killed) so we can stop and release the action
				m_pMeleeAction->ForceFinish();
				SAFE_RELEASE(m_pMeleeAction);
			}
		}
	}

	if(pOwner && pOwner->IsClient())
	{
		s_meleeSnapTargetId = 0;
		CHANGED_NETWORK_STATE(pOwner, CPlayer::ASPECT_SNAP_TARGET);

		if(g_pGameCVars->pl_melee.mp_melee_system_camera_lock_and_turn)
		{
			pOwner->GetActorParams().viewLimits.ClearViewLimit(SViewLimitParams::eVLS_Item);
		}
	}
}
void CMelee::OnFailedHit()
{
	const SCollisionTestParams& collisionParams = m_collisionHelper.GetCollisionTestParams();

	bool collided = PerformCylinderTest(collisionParams.m_pos, collisionParams.m_dir, collisionParams.m_remote);

	CActor* pOwner = m_pWeapon->GetOwnerActor();

	if(pOwner && pOwner->IsClient())
	{
		if(!collided && s_meleeSnapTargetId)
		{
			Vec3 ownerpos = pOwner->GetEntity()->GetWorldPos();
			IEntity* pTarget = gEnv->pEntitySystem->GetEntity(s_meleeSnapTargetId);

			if(pTarget && ownerpos.GetSquaredDistance(pTarget->GetWorldPos()) < cry_sqr(GetRange() * m_pMeleeParams->meleeparams.target_range_mult))
			{
				collided = m_collisionHelper.PerformMeleeOnAutoTarget(s_meleeSnapTargetId);
			}
		}

		s_meleeSnapTargetId = 0;
		CHANGED_NETWORK_STATE(pOwner, CPlayer::ASPECT_SNAP_TARGET);

		if(g_pGameCVars->pl_melee.mp_melee_system_camera_lock_and_turn)
		{
			pOwner->GetActorParams().viewLimits.ClearViewLimit(SViewLimitParams::eVLS_Item);
		}
	}

	if(m_pMeleeAction)
	{
		if(pOwner)
		{
			m_pMeleeAction->OnHitResult(pOwner, collided);
		}
		else
		{
			//Owner has dropped weapon (Likely from being killed) so we can stop and release the action
			m_pMeleeAction->ForceFinish();
			SAFE_RELEASE(m_pMeleeAction);
		}
	}
	
	ApplyMeleeEffects(collided);
}
示例#23
0
void CHeavyMountedWeapon::TryRipOffGun()
{
	CActor *pActor = GetOwnerActor();
	if(!pActor)
		return;

	PerformRipOff(pActor);
	
	if(gEnv->bServer)
	{
		CHANGED_NETWORK_STATE(this, ASPECT_RIPOFF);
	}
	else
	{
		GetGameObject()->InvokeRMI(SvRequestRipOff(), EmptyParams(), eRMI_ToServer);
	}
}
示例#24
0
bool CNetworkBuilding::Reset()
{
	if(!GetSettings())
		return false;

	entity_name = GetEntity()->GetName();
	fStartTime = 0.f;
	build_status = -1;
	m_state = eState_NotUsed;

	GetEntity()->LoadGeometry(0,default_model);
	GetEntity()->SetMaterial(defMat);
	Physicalize(PE_NONE);

	CHANGED_NETWORK_STATE(this, POSITION_ASPECT);

	return true;
}
void CPlayerPlugin_CurrentlyTargetting::Update(float dt)
{
	m_currentTargetTime += dt;	//updated locally for all players (so doesn't have to be synced)

	assert (IsEntered());
	if (m_ownerPlayer->IsClient())
	{
		EntityId newTargetId = !m_ownerPlayer->IsDead() ? m_ownerPlayer->GetGameObject()->GetWorldQuery()->GetLookAtEntityId() : 0;

		if (newTargetId)
		{
			IActor * targettedActor = g_pGame->GetIGameFramework()->GetIActorSystem()->GetActor(newTargetId);
			if (targettedActor == NULL || targettedActor->IsDead())
			{
				newTargetId = 0;
			}
		}

		if (m_currentTarget != newTargetId)
		{
			m_currentTarget = newTargetId;










			CCCPOINT_IF(m_currentTarget, PlayerState_LocalPlayerNowTargettingSomebody);
			CCCPOINT_IF(!m_currentTarget, PlayerState_LocalPlayerNowTargettingNobody);

			m_currentTargetTime = 0.0f;
			CHANGED_NETWORK_STATE(m_ownerPlayer, CPlayer::ASPECT_CURRENTLYTARGETTING_CLIENT);
		}
	}

#if PLAYER_PLUGIN_DEBUGGING
	IEntity* pEntity = gEnv->pEntitySystem->GetEntity(m_currentTarget);
	PlayerPluginWatch ("Target e%05d (%s %s) - %.2f", m_currentTarget, pEntity ? pEntity->GetName() : "NULL", pEntity ? pEntity->GetClass()->GetName() : "entity", m_currentTargetTime);
#endif
}
//------------------------------------------------------------------------
IMPLEMENT_RMI(CWeapon, SvRequestStartMeleeAttack)
{
    CHECK_OWNER_REQUEST();

    CActor *pActor=GetActorByNetChannel(pNetChannel);
    IActor *pLocalActor=m_pGameFramework->GetClientActor();
    bool isLocal = pLocalActor && pActor && (pLocalActor->GetChannelId() == pActor->GetChannelId());

    if (!isLocal)
    {
        NetStartMeleeAttack(params.boostedAttack, params.attackIndex);
    }

    m_attackIndex		= params.attackIndex;
    m_meleeCounter	= (m_meleeCounter + 1) % kMeleeCounterMax;
    CHANGED_NETWORK_STATE(this, ASPECT_MELEE);

    return true;
}
//------------------------------------------------------------------------
void CGameRulesHoldObjectiveBase::InsideStateChanged(SHoldEntityDetails *pDetails)
{
	pDetails->m_insideCount[0] = pDetails->m_insideEntities[0].size();
	pDetails->m_insideCount[1] = pDetails->m_insideEntities[1].size();

	int team1Count = pDetails->m_insideCount[0];
	int team2Count = pDetails->m_insideCount[1];

	int oldControllingTeamId = pDetails->m_controllingTeamId;

	DetermineControllingTeamId(pDetails, team1Count, team2Count);

	if( oldControllingTeamId != pDetails->m_controllingTeamId )
	{
		OnControllingTeamChanged(pDetails, oldControllingTeamId);
	}

	CHANGED_NETWORK_STATE(g_pGame->GetGameRules(), HOLD_OBJECTIVE_STATE_ASPECT);
	OnInsideStateChanged(pDetails);
}
//------------------------------------------------------------------------
void CVehicleMovementHelicopter::Update(const float deltaTime)
{
  FUNCTION_PROFILER( GetISystem(), PROFILE_GAME );

	CVehicleMovementBase::Update(deltaTime);

	UpdateDamages(deltaTime);
	UpdateEngine(deltaTime);

	{
		CryAutoCriticalSection lk(m_lock);
		m_netActionSync.Read(this);
		if (gEnv->bServer)
		{
			m_sendTimer -= deltaTime;
			if (m_sendTimer<=0.f)
			{
				m_netActionSync.Write(this);
				CHANGED_NETWORK_STATE(m_pVehicle, m_updateAspects);
				m_sendTimer = m_sendTime;
			}
		}
	}
			
	SetSoundParam(eSID_Run, "rpm_scale", m_rpmScale);

	// update animation
	if(m_isEngineGoingOff)
	{
		if(m_enginePower > 0.0f)
		{
			UpdateEngine(deltaTime);
		}
		else
		{
			m_enginePower = 0.0f;
		}
	}

	SetAnimationSpeed(eVMA_Engine, (m_enginePower / m_enginePowerMax));
}
//------------------------------------------------------------------------
void CWeapon::RequestShoot(IEntityClass* pAmmoType, const Vec3 &pos, const Vec3 &dir, const Vec3 &vel, const Vec3 &hit, float extra, int predictionHandle, bool forceExtended)
{
    CActor *pActor=GetOwnerActor();

    if (!gEnv->bServer && pActor && pActor->IsClient())
    {
#if defined(ANTI_CHEAT)
        IncShotCount(static_cast<CFireMode*>(m_fm)->GetShotIncrementAmount());

        if (IsServerSpawn(pAmmoType) || forceExtended)
        {
            GetGameObject()->InvokeRMI(CWeapon::SvRequestShootEx(), SvRequestShootExParams(pos, dir, vel, hit, extra, predictionHandle, m_firemode), eRMI_ToServer);
        }
        else
        {
            uint32 shotId = ((((uint32)(TRUNCATE_PTR)this & 0x000fff00) << 12) + (GetShotCount() << GetShotIdCountOffset())) | pActor->GetChannelId() | (m_firemode << GetShotIdFireModeOffset());
            //use bits 16 to 19 to encode the fire mode.
            assert(m_firemode >= 0 && m_firemode < 16);
            m_lastShotId = shotId; //A bit of a waste, but we don't want to change the interface for compatibility reasons.
            //CryLog("Recording last shot ID as %u", m_lastShotId);
            GetGameObject()->InvokeRMI(CWeapon::SvRequestShoot(), SvRequestShootParams(hit, shotId, m_firemode), eRMI_ToServer);
        }
#else
        if (IsServerSpawn(pAmmoType) || forceExtended)
            GetGameObject()->InvokeRMI(CWeapon::SvRequestShootEx(), SvRequestShootExParams(pos, dir, vel, hit, extra, predictionHandle, m_firemode), eRMI_ToServer);
        else
            GetGameObject()->InvokeRMI(CWeapon::SvRequestShoot(), SvRequestShootParams(hit, m_firemode), eRMI_ToServer);
#endif

        m_expended_ammo++;
        m_fireCounter++;
    }
    else if (IsServer())
    {
        m_fireCounter++;
        CHANGED_NETWORK_STATE(this, ASPECT_STREAM);
    }
}
示例#30
0
void CNetPlayerInput::Update()
{
	if (gEnv->bServer && (g_pGameCVars->sv_input_timeout>0) && ((gEnv->pTimer->GetFrameStartTime()-m_lastUpdate).GetMilliSeconds()>=g_pGameCVars->sv_input_timeout))
	{
		m_curInput.deltaMovement.zero();
		// PLAYERPREDICTION
		m_curInput.sprint=false;
		m_curInput.stance=(uint8)STANCE_NULL;

		CHANGED_NETWORK_STATE(m_pPlayer,  IPlayerInput::INPUT_ASPECT );
		// ~PLAYERPREDICTION
	}

	// Disallow animation movement control for remotely controlled
	// characters.  We'll rely on the interpolation to server-controlled
	// location & rotation.
	if( m_pPlayer && m_pPlayer->GetAnimatedCharacter() )
	{
		IAnimatedCharacter* pAnimChar = m_pPlayer->GetAnimatedCharacter();
		pAnimChar->SetMovementControlMethods( eMCM_Entity, eMCM_Entity );
		pAnimChar->UseAnimationMovementForEntity( false, false, false );
	}
}