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);
    }
Beispiel #8
0
    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;
    }