Example #1
0
    public void ServerPlayerDropWeapon(Server server, PlayerObjectComponent playerObjectComponent, int weaponIndex)
    {
        var playerWeapons       = playerObjectComponent.State.Weapons;
        var equippedWeaponState = playerWeapons[weaponIndex];

        if ((equippedWeaponState == null))
        {
            return;
        }

        var weaponObjectState = new WeaponObjectState
        {
            Id   = server.GenerateNetworkId(),
            Type = equippedWeaponState.Type,
            BulletsLeftInMagazine    = equippedWeaponState.BulletsLeftInMagazine,
            BulletsLeftOutOfMagazine = equippedWeaponState.BulletsLeftOutOfMagazine,
            RigidBodyState           = new RigidBodyState
            {
                Position        = playerObjectComponent.HandsPointObject.transform.position,
                EulerAngles     = Vector3.zero,
                Velocity        = Vector3.zero,
                AngularVelocity = Vector3.zero
            }
        };

        WeaponSpawnerSystem.Instance.SpawnLocalWeaponObject(weaponObjectState);

        playerObjectComponent.State.Weapons[weaponIndex] = null;
    }
Example #2
0
 public Ray GetShotRay(PlayerObjectComponent playerObjectComponent)
 {
     return(new Ray(
                playerObjectComponent.CameraPointObject.transform.position,
                playerObjectComponent.CameraPointObject.transform.forward
                ));
 }
Example #3
0
    public void ServerPlayerDropGrenades(Server server, PlayerObjectComponent playerObjectComponent, int grenadeSlotIndex)
    {
        var playerGrenadeSlots = playerObjectComponent.State.GrenadeSlots;
        var grenadeSlot        = playerGrenadeSlots[grenadeSlotIndex];

        if ((grenadeSlot == null) || (grenadeSlot.GrenadeCount == 0))
        {
            return;
        }

        for (var i = 0; i < grenadeSlot.GrenadeCount; i++)
        {
            var grenadeState = new GrenadeState
            {
                Id             = server.GenerateNetworkId(),
                Type           = grenadeSlot.GrenadeType,
                RigidBodyState = new RigidBodyState
                {
                    Position        = playerObjectComponent.HandsPointObject.transform.position,
                    EulerAngles     = Vector3.zero,
                    Velocity        = Vector3.zero,
                    AngularVelocity = Vector3.zero
                },
                IsActive            = false,
                TimeUntilDetonation = null
            };

            GrenadeSpawnerSystem.Instance.SpawnLocalGrenadeObject(grenadeState);
        }

        playerGrenadeSlots[grenadeSlotIndex] = null;
    }
Example #4
0
    public void ShowWeaponFireEffects(PlayerObjectComponent playerObjectComponent, Ray aimRay)
    {
        ShowMuzzleFlash(playerObjectComponent);

        var weapon = playerObjectComponent.State.CurrentWeapon;

        if (weapon != null)
        {
            if (weapon.Type == WeaponType.SniperRifle)
            {
                CreateSniperBulletTrail(aimRay);
            }

            var equippedWeaponComponent = PlayerObjectSystem.Instance.GetEquippedWeaponComponent(playerObjectComponent);
            if (equippedWeaponComponent != null)
            {
                var weaponAudioSource = equippedWeaponComponent.GetComponent <AudioSource>();
                weaponAudioSource?.PlayOneShot(weapon.Definition.ShotSound, 0.5f);

                equippedWeaponComponent.Animator.Play("Recoil");
            }

            if (weapon.Definition.IsHitScan)
            {
                foreach (var shotRay in WeaponSystem.Instance.ShotRays(weapon.Definition, aimRay))
                {
                    CreateBulletHole(playerObjectComponent, shotRay);
                }
            }
        }
    }
Example #5
0
    public void ClientPlayerTryToShoot(Client client, PlayerObjectComponent playerObjectComponent)
    {
        if (playerObjectComponent.State.CanShoot)
        {
            client.ClientPeer.CallRpcOnServer("ServerOnPlayerTriggerPulled", client.ClientPeer.reliableChannelId, new
            {
                playerId = playerObjectComponent.State.Id,
                shotRay  = GetShotRay(playerObjectComponent)
            });

            // predict the shot
            var shotRay = GetShotRay(playerObjectComponent);
            WeaponSystem.Instance.ShowWeaponFireEffects(playerObjectComponent, shotRay);

            playerObjectComponent.State.RecoilTimeLeft = playerObjectComponent.State.CurrentWeapon.Definition.RecoilTime;
        }
        else
        {
            var equippedWeaponComponent = GetEquippedWeaponComponent(playerObjectComponent);
            var weaponAudioSource       = equippedWeaponComponent.GetComponent <AudioSource>();
            weaponAudioSource?.PlayOneShot(OsFps.Instance.GunDryFireSound, 0.7f);
        }

        playerObjectComponent.State.CurrentWeapon.TimeSinceLastShot = 0;
    }
Example #6
0
 public Vector2 GetPlayerLookDirAngles(PlayerObjectComponent playerObjectComponent)
 {
     return(new Vector2(
                playerObjectComponent.CameraPointObject.transform.localEulerAngles.x,
                playerObjectComponent.transform.eulerAngles.y
                ));
 }
Example #7
0
 private PlayerLagCompensationSnapshot GetLagCompensationSnapshot(PlayerObjectComponent playerObjectComponent, float currentTime)
 {
     return(new PlayerLagCompensationSnapshot
     {
         Time = currentTime,
         Position = playerObjectComponent.transform.position,
         LookDirAngles = GetPlayerLookDirAngles(playerObjectComponent)
     });
 }
Example #8
0
    public void Jump(PlayerObjectComponent playerObjectComponent)
    {
        Assert.IsNotNull(playerObjectComponent);

        var playerVelocity    = playerObjectComponent.Rigidbody.velocity;
        var newPlayerVelocity = new Vector3(playerVelocity.x, OsFps.PlayerInitialJumpSpeed, playerVelocity.z);

        playerObjectComponent.Rigidbody.velocity = newPlayerVelocity;
    }
Example #9
0
    private void DrawPlayerInput(PlayerObjectComponent playerObjectComponent)
    {
        var relativeMoveDirection   = GetRelativeMoveDirection(playerObjectComponent.State.Input);
        var playerYAngle            = playerObjectComponent.transform.eulerAngles.y;
        var horizontalMoveDirection = Quaternion.Euler(new Vector3(0, playerYAngle, 0)) * relativeMoveDirection;
        var moveRay = new Ray(playerObjectComponent.transform.position + Vector3.up, horizontalMoveDirection);

        Debug.DrawLine(moveRay.origin, moveRay.origin + moveRay.direction);
    }
Example #10
0
    public void ServerDamagePlayer(Server server, PlayerObjectComponent playerObjectComponent, float damage, PlayerObjectComponent attackingPlayerObjectComponent)
    {
        if (!playerObjectComponent.State.IsAlive || (damage <= 0))
        {
            return;
        }

        var playerObjectState = playerObjectComponent.State;

        var damageToShield = Mathf.Min(damage, playerObjectState.Shield);

        playerObjectState.Shield -= damageToShield;

        var damageToHealth = damage - damageToShield;

        playerObjectState.Health -= damageToHealth;

        playerObjectState.TimeUntilShieldCanRegen = OsFps.TimeAfterDamageUntilShieldRegen;

        var playerComponent = FindPlayerComponent(playerObjectState.Id);
        var playerState     = playerComponent.State;

        if (!playerObjectState.IsAlive)
        {
            for (var i = 0; i < playerObjectComponent.State.Weapons.Length; i++)
            {
                ServerPlayerDropWeapon(server, playerObjectComponent, i);
            }

            for (var i = 0; i < playerObjectComponent.State.GrenadeSlots.Length; i++)
            {
                ServerPlayerDropGrenades(server, playerObjectComponent, i);
            }

            // The player object will be destroyed later by the RemoveDeadPlayerSystem.
            playerState.RespawnTimeLeft = OsFps.RespawnTime;

            // Update scores
            playerState.Deaths++;

            if (attackingPlayerObjectComponent != null)
            {
                var attackingPlayerId        = attackingPlayerObjectComponent.State.Id;
                var attackingPlayerComponent = FindPlayerComponent(attackingPlayerId);
                attackingPlayerComponent.State.Kills++;
            }

            // Send message.
            server.ServerPeer.CallRpcOnAllClients("ClientOnReceiveChatMessage", server.ServerPeer.reliableSequencedChannelId, new
            {
                playerId = (uint?)null,
                message  = GetKillMessage(playerObjectComponent, attackingPlayerObjectComponent)
            });
        }
    }
Example #11
0
    public void ShowMuzzleFlash(PlayerObjectComponent playerObjectComponent)
    {
        GameObject muzzleFlashObject = Object.Instantiate(
            OsFps.Instance.MuzzleFlashPrefab, Vector3.zero, Quaternion.identity
            );
        var barrelExitObject = playerObjectComponent.HandsPointObject.FindDescendant("BarrelExit");

        muzzleFlashObject.transform.SetParent(barrelExitObject.transform, false);

        Object.Destroy(muzzleFlashObject, OsFps.MuzzleFlashDuration);
    }
Example #12
0
    private string GetKillMessage(PlayerObjectComponent killedPlayerObjectComponent, PlayerObjectComponent attackerPlayerObjectComponent)
    {
        var killedPlayerComponent   = FindPlayerComponent(killedPlayerObjectComponent.State.Id);
        var attackerPlayerComponent = (attackerPlayerObjectComponent != null)
            ? FindPlayerComponent(attackerPlayerObjectComponent.State.Id)
            : null;

        return((attackerPlayerObjectComponent != null)
            ? string.Format("{0} killed {1}.", attackerPlayerComponent.State.Name, killedPlayerComponent.State.Name)
            : string.Format("{0} died.", killedPlayerComponent.State.Name));
    }
Example #13
0
 public void SetShieldAlpha(PlayerObjectComponent playerObjectComponent, float alpha)
 {
     foreach (var meshRenderer in playerObjectComponent.GetComponentsInChildren <MeshRenderer>())
     {
         var shieldDownMaterial = meshRenderer.materials
                                  .FirstOrDefault(m => m.name.Contains(OsFps.Instance.ShieldDownMaterial.name));
         if (shieldDownMaterial != null)
         {
             shieldDownMaterial.SetFloat(OsFps.ShieldDownMaterialAlphaParameterName, alpha);
         }
     }
 }
Example #14
0
    public EquippedWeaponComponent GetEquippedWeaponComponent(PlayerObjectComponent playerObjectComponent)
    {
        foreach (Transform weaponTransform in playerObjectComponent.HandsPointObject.transform)
        {
            var equippedWeaponComponent = weaponTransform.gameObject.GetComponent <EquippedWeaponComponent>();
            if (equippedWeaponComponent != null)
            {
                return(equippedWeaponComponent);
            }
        }

        return(null);
    }
Example #15
0
    public RaycastHit?GetClosestValidRaycastHitForGunShot(Ray shotRay, PlayerObjectComponent shootingPlayerObjectComponent)
    {
        var raycastHits            = Physics.RaycastAll(shotRay);
        var closestValidRaycastHit = raycastHits
                                     .OrderBy(raycastHit => raycastHit.distance)
                                     .Select(raycastHit => (RaycastHit?)raycastHit)
                                     .FirstOrDefault(raycastHit =>
        {
            var hitPlayerObject = raycastHit.Value.collider.gameObject.FindObjectOrAncestorWithTag(OsFps.PlayerTag);
            return((hitPlayerObject == null) || (hitPlayerObject != shootingPlayerObjectComponent.gameObject));
        });

        return(closestValidRaycastHit);
    }
Example #16
0
    public void OnDestroy(PlayerObjectComponent playerObjectComponent)
    {
        var client = OsFps.Instance.Client;

        if (client != null)
        {
            if (playerObjectComponent.State.Id == client.PlayerId)
            {
                client.DetachCameraFromPlayer();
            }

            PlayerObjectSystem.Instance.ShowPlayerDeathEffects(playerObjectComponent.transform.position + Vector3.up);
        }
    }
Example #17
0
    public void ServerPlayerFinishReload(PlayerObjectComponent playerObjectComponent)
    {
        var weapon = playerObjectComponent.State.CurrentWeapon;

        if (weapon == null)
        {
            return;
        }

        var bulletsUsedInMagazine  = weapon.Definition.BulletsPerMagazine - weapon.BulletsLeftInMagazine;
        var bulletsToAddToMagazine = (ushort)Mathf.Min(bulletsUsedInMagazine, weapon.BulletsLeftOutOfMagazine);

        weapon.BulletsLeftInMagazine    += bulletsToAddToMagazine;
        weapon.BulletsLeftOutOfMagazine -= bulletsToAddToMagazine;
    }
Example #18
0
    public void CreateBulletHole(PlayerObjectComponent playerObjectComponent, Ray shotRay)
    {
        var possibleHit = WeaponSystem.Instance.GetClosestValidRaycastHitForGunShot(shotRay, playerObjectComponent);

        if (possibleHit != null)
        {
            var raycastHit            = possibleHit.Value;
            var bulletHolePosition    = raycastHit.point + (0.01f * raycastHit.normal);
            var bulletHoleOrientation = Quaternion.LookRotation(-raycastHit.normal);
            var bulletHole            = Object.Instantiate(
                OsFps.Instance.BulletHolePrefab, bulletHolePosition, bulletHoleOrientation, raycastHit.transform
                );
            Object.Destroy(bulletHole, 5);
        }
    }
Example #19
0
    public void ServerFireHitscanWeapon(
        Server server, PlayerObjectComponent shootingPlayerObjectComponent,
        WeaponDefinition weaponDefinition, Ray aimRay, float secondsToRewind
        )
    {
        var shootingPlayerObjectState = shootingPlayerObjectComponent.State;

        ServerRewindPlayers(secondsToRewind);

        foreach (var shotRay in WeaponSystem.Instance.ShotRays(weaponDefinition, aimRay))
        {
            ServerApplyHitscanShot(server, shootingPlayerObjectComponent, weaponDefinition, shotRay);
        }

        ServerUnRewindPlayers();
    }
Example #20
0
    public bool IsPlayerGrounded(PlayerObjectComponent playerObjectComponent)
    {
        var sphereRadius   = 0.4f;
        var spherePosition = playerObjectComponent.transform.position + new Vector3(0, 0.3f, 0);

        var intersectingColliders = Physics.OverlapSphere(spherePosition, sphereRadius);

        return(intersectingColliders.Any(collider =>
        {
            var otherPlayerObjectComponent = collider.gameObject.FindComponentInObjectOrAncestor <PlayerObjectComponent>();
            return (
                (otherPlayerObjectComponent == null) ||
                (otherPlayerObjectComponent.State.Id != playerObjectComponent.State.Id)
                );
        }));
    }
Example #21
0
    public void ServerPlayerTryToPickupWeapon(
        Server server, PlayerObjectComponent playerObjectComponent, WeaponComponent weaponComponent
        )
    {
        var playerState = playerObjectComponent.State;

        if (!playerState.IsAlive)
        {
            return;
        }

        var weaponObjectState     = weaponComponent.State;
        var playersMatchingWeapon = playerState.Weapons.FirstOrDefault(
            w => (w != null) && (w.Type == weaponComponent.State.Type)
            );

        if (playerState.HasEmptyWeapon)
        {
            var emptyWeaponIndex = System.Array.FindIndex(playerState.Weapons, w => w == null);
            playerState.Weapons[emptyWeaponIndex] = ToEquippedWeaponState(weaponObjectState);
            playerState.CurrentWeaponIndex        = (byte)emptyWeaponIndex;

            Object.Destroy(weaponComponent.gameObject);
        }
        else if (playersMatchingWeapon != null)
        {
            var numBulletsPickedUp = WeaponSystem.Instance.ServerAddBullets(
                playersMatchingWeapon, weaponObjectState.BulletsLeft
                );
            WeaponSystem.Instance.ServerRemoveBullets(weaponObjectState, numBulletsPickedUp);

            if (weaponObjectState.BulletsLeft == 0)
            {
                Object.Destroy(weaponComponent.gameObject);
            }
        }
        else
        {
            // drop current weapon
            ServerPlayerDropWeapon(server, playerObjectComponent, playerState.CurrentWeaponIndex);

            // pick up other weapon
            playerState.Weapons[playerState.CurrentWeaponIndex] = ToEquippedWeaponState(weaponObjectState);
            Object.Destroy(weaponComponent.gameObject);
        }
    }
Example #22
0
    public void ApplyLagCompensationSnapshot(
        PlayerObjectComponent playerObjectComponent, PlayerLagCompensationSnapshot snapshot
        )
    {
        playerObjectComponent.transform.position = snapshot.Position;
        ApplyLookDirAnglesToPlayer(playerObjectComponent, snapshot.LookDirAngles);

        if (OsFps.ShowLagCompensationOnServer)
        {
            var tmpCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
            tmpCube.transform.position    = snapshot.Position + (2 * new float3(0, 1, 0));
            tmpCube.transform.localScale  = 0.25f * Vector3.one;
            tmpCube.transform.eulerAngles = new Vector3(snapshot.LookDirAngles.x, snapshot.LookDirAngles.y);

            Object.DestroyImmediate(tmpCube.GetComponent <BoxCollider>());
            Object.Destroy(tmpCube, 2);
        }
    }
Example #23
0
    public void Reload(PlayerObjectComponent playerObjectComponent)
    {
        ClientPeer.CallRpcOnServer("ServerOnPlayerReloadPressed", ClientPeer.reliableChannelId, new
        {
            playerId = playerObjectComponent.State.Id
        });

        playerObjectComponent.State.ReloadTimeLeft = playerObjectComponent.State.CurrentWeapon.Definition.ReloadTime;
        playerObjectComponent.State.RecoilTimeLeft = -1;

        var equippedWeaponComponent = PlayerObjectSystem.Instance.GetEquippedWeaponComponent(playerObjectComponent);

        var audioSource = equippedWeaponComponent?.GetComponent <AudioSource>();

        audioSource?.PlayOneShot(OsFps.Instance.ReloadSound, 0.5f);

        equippedWeaponComponent.Animator.Play("Reload");
    }
Example #24
0
    public void ServerPlayerStartReload(PlayerObjectComponent playerObjectComponent)
    {
        var playerObjectState = playerObjectComponent.State;

        if (!playerObjectState.IsAlive)
        {
            return;
        }

        var weapon = playerObjectState.CurrentWeapon;

        if (weapon == null)
        {
            return;
        }

        playerObjectState.ReloadTimeLeft           = weapon.Definition.ReloadTime;
        playerObjectComponent.State.RecoilTimeLeft = -1;
    }
Example #25
0
    private void ClientUpdateThisPlayer(Client client, PlayerObjectComponent playerObjectComponent)
    {
        var playerObjectState = playerObjectComponent.State;

        playerObjectState.Input = GetCurrentPlayersInput();

        var unscaledDeltaMouse = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
        var deltaMouse         = client.GetMouseSensitivityForZoomLevel() * unscaledDeltaMouse;

        playerObjectState.LookDirAngles = new Vector2(
            Mathf.Clamp(MathfExtensions.ToSignedAngleDegrees(playerObjectState.LookDirAngles.x - deltaMouse.y), -90, 90),
            Mathf.Repeat(playerObjectState.LookDirAngles.y + deltaMouse.x, 360)
            );

        if (Input.GetButtonDown("Reload") && playerObjectState.CanReload)
        {
            client.Reload(playerObjectComponent);
        }

        if (playerObjectState.Input.IsFirePressed)
        {
            var wasTriggerJustPulled = Input.GetButtonDown("Fire");

            if (
                playerObjectState.CanTryToFireWeapon &&
                (wasTriggerJustPulled || playerObjectState.CurrentWeapon.Definition.IsAutomatic)
                )
            {
                ClientPlayerTryToShoot(client, playerObjectComponent);
            }
        }

        if (Input.GetButtonDown("Throw Grenade") && playerObjectState.CanThrowGrenade)
        {
            ClientThrowGrenade(client, playerObjectState);
        }

        if (Input.GetButtonDown("Switch Grenade"))
        {
            ClientSwitchGrenadeType(client, playerObjectState);
        }
    }
Example #26
0
    public void RequestSwitchWeapons(PlayerObjectComponent playerObjectComponent, int weaponIndex)
    {
        Assert.IsNotNull(playerObjectComponent);

        var playerObjectState = playerObjectComponent.State;

        if (weaponIndex == playerObjectState.CurrentWeaponIndex)
        {
            return;
        }

        // Send message to server.
        ClientPeer.CallRpcOnServer("ServerOnChangeWeapon", ClientPeer.reliableSequencedChannelId, new
        {
            playerId    = playerObjectState.Id,
            weaponIndex = (byte)weaponIndex
        });

        ZoomLevel = 0;
    }
Example #27
0
    public void ServerFireRocketLauncher(
        Server server, PlayerObjectComponent shootingPlayerObjectComponent, Ray shotRay
        )
    {
        var rocketState = new RocketState
        {
            Id             = server.GenerateNetworkId(),
            RigidBodyState = new RigidBodyState
            {
                Position        = shotRay.origin + shotRay.direction,
                EulerAngles     = Quaternion.LookRotation(shotRay.direction, Vector3.up).eulerAngles,
                Velocity        = OsFps.RocketSpeed * shotRay.direction,
                AngularVelocity = Vector3.zero
            },
            ShooterPlayerId = shootingPlayerObjectComponent.State.Id
        };
        var rocket = RocketSystem.Instance.SpawnLocalRocketObject(rocketState);

        // Make grenade ignore collisions with thrower.
        GameObjectExtensions.IgnoreCollisionsRecursive(rocket, shootingPlayerObjectComponent.gameObject);
    }
Example #28
0
    public void ServerShoot(
        Server server, PlayerObjectComponent shootingPlayerObjectComponent, Ray shotRay, float secondsToRewind
        )
    {
        var shootingPlayerObjectState = shootingPlayerObjectComponent.State;

        if (!shootingPlayerObjectState.CanShoot)
        {
            return;
        }

        var playerObjectComponent = FindPlayerObjectComponent(shootingPlayerObjectState.Id);

        if (playerObjectComponent == null)
        {
            return;
        }

        var weaponState = shootingPlayerObjectState.CurrentWeapon;

        var weaponDefinition = weaponState.Definition;

        if (weaponState.Definition.IsHitScan)
        {
            ServerFireHitscanWeapon(server, shootingPlayerObjectComponent, weaponDefinition, shotRay, secondsToRewind);
        }
        else
        {
            if (weaponDefinition.Type == WeaponType.RocketLauncher)
            {
                ServerFireRocketLauncher(server, shootingPlayerObjectComponent, shotRay);
            }
        }

        weaponState.BulletsLeftInMagazine--;
        weaponState.TimeSinceLastShot            = 0;
        shootingPlayerObjectState.RecoilTimeLeft = weaponDefinition.RecoilTime;
    }
Example #29
0
    public void ServerPlayerThrowGrenade(Server server, PlayerObjectComponent playerObjectComponent)
    {
        var playerObjectState = playerObjectComponent.State;

        if (!playerObjectState.CanThrowGrenade)
        {
            return;
        }

        var throwRay = GetShotRay(playerObjectComponent);

        throwRay.origin += (0.5f * throwRay.direction);
        var currentGrenadeSlot = playerObjectState.GrenadeSlots[playerObjectState.CurrentGrenadeSlotIndex];

        var grenadeState = new GrenadeState
        {
            Id                  = server.GenerateNetworkId(),
            Type                = currentGrenadeSlot.GrenadeType,
            IsActive            = true,
            TimeUntilDetonation = null,
            RigidBodyState      = new RigidBodyState
            {
                Position        = throwRay.origin,
                EulerAngles     = Quaternion.LookRotation(throwRay.direction, Vector3.up).eulerAngles,
                Velocity        = OsFps.GrenadeThrowSpeed * throwRay.direction,
                AngularVelocity = Vector3.zero
            },
            ThrowerPlayerId = playerObjectState.Id
        };
        var grenadeObject = GrenadeSpawnerSystem.Instance.SpawnLocalGrenadeObject(grenadeState);

        // Make grenade ignore collisions with thrower.
        GameObjectExtensions.IgnoreCollisionsRecursive(grenadeObject, playerObjectComponent.gameObject);

        currentGrenadeSlot.GrenadeCount--;
        playerObjectState.TimeUntilCanThrowGrenade = OsFps.GrenadeThrowInterval;
    }
Example #30
0
    public void ServerApplyHitscanShot(
        Server server, PlayerObjectComponent shootingPlayerObjectComponent,
        WeaponDefinition weaponDefinition, Ray shotRay
        )
    {
        var possibleHit = WeaponSystem.Instance.GetClosestValidRaycastHitForGunShot(shotRay, shootingPlayerObjectComponent);

        if (possibleHit != null)
        {
            var hit             = possibleHit.Value;
            var hitPlayerObject = hit.collider.gameObject.FindObjectOrAncestorWithTag(OsFps.PlayerTag);

            if ((hitPlayerObject != null) && (hitPlayerObject != shootingPlayerObjectComponent.gameObject))
            {
                var hitPlayerObjectComponent = hitPlayerObject.GetComponent <PlayerObjectComponent>();

                var isHeadShot = hit.collider.gameObject.name == OsFps.PlayerHeadColliderName;
                var damage     = !isHeadShot
                    ? weaponDefinition.DamagePerBullet
                    : weaponDefinition.HeadShotDamagePerBullet;
                ServerDamagePlayer(
                    server, hitPlayerObjectComponent, damage, shootingPlayerObjectComponent
                    );
            }

            if (hit.rigidbody != null)
            {
                hit.rigidbody.AddForceAtPosition(5 * shotRay.direction, hit.point, ForceMode.Impulse);
            }
        }

        if (OsFps.ShowHitScanShotsOnServer)
        {
            WeaponSystem.Instance.CreateHitScanShotDebugLine(shotRay, OsFps.Instance.ServerShotRayMaterial);
        }
    }