public void UpdatePlayerMovement(PlayerObjectState playerObjectState) { var playerObjectComponent = FindPlayerObjectComponent(playerObjectState.Id); if (playerObjectComponent == null) { return; } ApplyLookDirAnglesToPlayer(playerObjectComponent, playerObjectState.LookDirAngles); var isGrounded = IsPlayerGrounded(playerObjectComponent); if (isGrounded) { var relativeMoveDirection = GetRelativeMoveDirection(playerObjectState.Input); var playerYAngle = playerObjectComponent.transform.eulerAngles.y; var horizontalMoveDirection = Quaternion.Euler(new Vector3(0, playerYAngle, 0)) * relativeMoveDirection; var desiredHorizontalVelocity = OsFps.MaxPlayerMovementSpeed * horizontalMoveDirection; var currentHorizontalVelocity = GameObjectExtensions.GetHorizontalVelocity(playerObjectComponent.Rigidbody); var horizontalVelocityError = desiredHorizontalVelocity - currentHorizontalVelocity; playerObjectComponent.Rigidbody.AddForce(3000 * horizontalVelocityError); } }
public void ClientSwitchGrenadeType(Client client, PlayerObjectState playerObjectState) { client.ClientPeer.CallRpcOnServer( "ServerOnPlayerSwitchGrenadeType", client.ClientPeer.reliableChannelId, new { playerId = playerObjectState.Id } ); }
public GameObject ClientSpawnPlayer(Client client, PlayerObjectState playerState) { var playerObject = SpawnLocalPlayer(playerState); if (playerState.Id == client.PlayerId) { client.AttachCameraToPlayer(playerState.Id); client.HidePlayerModelFromCamera(playerObject); } return(playerObject); }
public void ClientThrowGrenade(Client client, PlayerObjectState playerObjectState) { client.ClientPeer.CallRpcOnServer( "ServerOnPlayerThrowGrenade", client.ClientPeer.reliableChannelId, new { playerId = playerObjectState.Id } ); playerObjectState.TimeUntilCanThrowGrenade = OsFps.GrenadeThrowInterval; }
public void VisualEquipWeapon(PlayerObjectState playerObjectState) { var playerObjectComponent = FindPlayerObjectComponent(playerObjectState.Id); var equippedWeaponComponent = GetEquippedWeaponComponent(playerObjectComponent); var wasEQCNull = equippedWeaponComponent == null; if (equippedWeaponComponent != null) { Object.DestroyImmediate(equippedWeaponComponent.gameObject); } if (playerObjectState.CurrentWeapon != null) { var weaponPrefab = WeaponSystem.Instance.GetWeaponDefinitionByType(playerObjectState.CurrentWeapon.Type).Prefab; GameObject weaponObject = Object.Instantiate(weaponPrefab, Vector3.zero, Quaternion.identity); var animator = weaponObject.AddComponent <Animator>(); animator.runtimeAnimatorController = OsFps.Instance.RecoilAnimatorController; weaponObject.transform.SetParent(playerObjectComponent.HandsPointObject.transform, false); var weaponComponent = weaponObject.GetComponent <WeaponComponent>(); Object.DestroyImmediate(weaponComponent.Rigidbody); Object.DestroyImmediate(weaponComponent.Collider); Object.DestroyImmediate(weaponComponent); playerObjectState.EquipWeaponTimeLeft = OsFps.EquipWeaponTime; playerObjectState.ReloadTimeLeft = -1; playerObjectState.RecoilTimeLeft = -1; equippedWeaponComponent = weaponObject.AddComponent <EquippedWeaponComponent>(); equippedWeaponComponent.State = playerObjectState.CurrentWeapon; equippedWeaponComponent.State.TimeSinceLastShot = equippedWeaponComponent.State.Definition.ShotInterval; equippedWeaponComponent.Animator = animator; animator.Play("Equip"); } var weaponCount = 0; foreach (Transform weaponTransform in playerObjectComponent.HandsPointObject.transform) { weaponCount++; } }
public GameObject ServerSpawnPlayer(Server server, uint playerId, Vector3 position, float lookDirYAngle) { var playerObjectState = new PlayerObjectState { Id = playerId, Position = position, Velocity = Vector3.zero, LookDirAngles = new Vector2(0, lookDirYAngle), Input = new PlayerInput(), Health = OsFps.MaxPlayerHealth, Shield = OsFps.MaxPlayerShield, Weapons = new EquippedWeaponState[OsFps.MaxWeaponCount], CurrentWeaponIndex = 0, TimeUntilCanThrowGrenade = 0, CurrentGrenadeSlotIndex = 0, GrenadeSlots = new GrenadeSlot[OsFps.MaxGrenadeSlotCount], ReloadTimeLeft = -1, EquipWeaponTimeLeft = -1 }; var firstWeaponDefinition = WeaponSystem.Instance.GetWeaponDefinitionByType(WeaponType.Pistol); playerObjectState.Weapons[0] = new EquippedWeaponState { Type = firstWeaponDefinition.Type, BulletsLeftInMagazine = firstWeaponDefinition.BulletsPerMagazine, BulletsLeftOutOfMagazine = firstWeaponDefinition.MaxAmmoOutOfMagazine, TimeSinceLastShot = firstWeaponDefinition.ShotInterval }; playerObjectState.GrenadeSlots[0] = new GrenadeSlot { GrenadeType = GrenadeType.Fragmentation, GrenadeCount = 2 }; playerObjectState.GrenadeSlots[1] = new GrenadeSlot { GrenadeType = GrenadeType.Sticky, GrenadeCount = 2 }; var playerObject = SpawnLocalPlayer(playerObjectState); return(playerObject); }
public GameObject SpawnLocalPlayer(PlayerObjectState playerObjectState) { var orientation = Quaternion.Euler( playerObjectState.LookDirAngles.x, playerObjectState.LookDirAngles.y, 0 ); var playerObject = GameObject.Instantiate( OsFps.Instance.PlayerPrefab, playerObjectState.Position, orientation ); var playerObjectComponent = playerObject.GetComponent <PlayerObjectComponent>(); playerObjectComponent.State = playerObjectState; playerObjectComponent.Rigidbody.velocity = playerObjectState.Velocity; PlayerObjectSystem.Instance.SetShieldAlpha(playerObjectComponent, 0); return(playerObject); }
private void ApplyStateFromServer(object newState) { var updatedPlayerObjectState = (PlayerObjectState)newState; var client = OsFps.Instance.Client; var isPlayerMe = updatedPlayerObjectState.Id == client.PlayerId; var roundTripTime = client.ClientPeer.RoundTripTimeInSeconds.Value; var playerObjectComponent = this; // Update state. if (isPlayerMe) { if ((updatedPlayerObjectState.CurrentWeapon != null) && (State.CurrentWeapon != null)) { updatedPlayerObjectState.CurrentWeapon.TimeSinceLastShot = State.CurrentWeapon.TimeSinceLastShot; } updatedPlayerObjectState.ReloadTimeLeft = State.ReloadTimeLeft; updatedPlayerObjectState.EquipWeaponTimeLeft = State.EquipWeaponTimeLeft; updatedPlayerObjectState.RecoilTimeLeft = State.RecoilTimeLeft; updatedPlayerObjectState.TimeUntilCanThrowGrenade = State.TimeUntilCanThrowGrenade; updatedPlayerObjectState.Input = State.Input; } // Handle weapon pickup. var equippedWeaponType = PlayerObjectSystem.Instance.GetEquippedWeaponComponent(playerObjectComponent)?.State.Type; var newWeaponType = updatedPlayerObjectState.CurrentWeapon?.Type; if (newWeaponType != equippedWeaponType) { PlayerObjectSystem.Instance.VisualEquipWeapon(updatedPlayerObjectState); } // Update player object. // Correct position. var serverPosition = updatedPlayerObjectState.Position; var rewindTimeAmount = roundTripTime; var rewoundTime = Time.realtimeSinceStartup - rewindTimeAmount; var rewoundSnapshot = PlayerObjectSystem.Instance.GetInterpolatedLagCompensationSnapshot(this, rewoundTime); var rewoundPosToServerPosDelta = serverPosition - rewoundSnapshot.Position; var positionCorrectionFactor = 1f / 10; var positionCorrection = positionCorrectionFactor * rewoundPosToServerPosDelta; var correctedPosition = (float3)playerObjectComponent.transform.position + positionCorrection; playerObjectComponent.transform.position = correctedPosition; updatedPlayerObjectState.Position = correctedPosition; // Correct velocity. var correctedVelocity = Client.CorrectedVelocity( updatedPlayerObjectState.Velocity, roundTripTime, playerObjectComponent.Rigidbody.velocity ); playerObjectComponent.Rigidbody.velocity = correctedVelocity; updatedPlayerObjectState.Velocity = correctedVelocity; // Update look direction. if (isPlayerMe) { updatedPlayerObjectState.LookDirAngles = PlayerObjectSystem.Instance.GetPlayerLookDirAngles(playerObjectComponent); } PlayerObjectSystem.Instance.ApplyLookDirAnglesToPlayer(playerObjectComponent, updatedPlayerObjectState.LookDirAngles); // Update shields. var shieldAlpha = 1.0f - (playerObjectComponent.State.Shield / OsFps.MaxPlayerShield); PlayerObjectSystem.Instance.SetShieldAlpha(playerObjectComponent, shieldAlpha); State = updatedPlayerObjectState; }