Example #1
0
 private void ClientRemote_OnWeaponHitOrTrace(
     ICharacter firingCharacter,
     IProtoItemWeapon protoWeapon,
     IProtoItemAmmo protoAmmo,
     IProtoCharacter protoCharacter,
     Vector2Ushort fallbackCharacterPosition,
     WeaponHitData[] hitObjects,
     Vector2D endPosition,
     bool endsWithHit)
 {
     WeaponSystemClientDisplay.ClientOnWeaponHitOrTrace(firingCharacter,
                                                        protoWeapon,
                                                        protoAmmo,
                                                        protoCharacter,
                                                        fallbackCharacterPosition,
                                                        hitObjects,
                                                        endPosition,
                                                        endsWithHit);
 }
Example #2
0
        private static void SharedCallOnWeaponHitOrTrace(
            ICharacter firingCharacter,
            IProtoItemWeapon protoWeapon,
            IProtoItemAmmo protoAmmo,
            Vector2D endPosition,
            List <WeaponHitData> hitObjects,
            bool endsWithHit)
        {
            if (IsClient)
            {
                // display weapon shot on Client-side
                WeaponSystemClientDisplay.ClientOnWeaponHitOrTrace(firingCharacter,
                                                                   protoWeapon,
                                                                   protoAmmo,
                                                                   firingCharacter.ProtoCharacter,
                                                                   firingCharacter.Position.ToVector2Ushort(),
                                                                   hitObjects,
                                                                   endPosition,
                                                                   endsWithHit);
            }
            else // if server
            {
                // display damages on clients in scope of every damaged object
                var observers = new HashSet <ICharacter>();
                using var tempList = Shared.GetTempList <ICharacter>();
                Server.World.GetScopedByPlayers(firingCharacter, tempList);
                observers.AddRange(tempList.AsList());

                foreach (var hitObject in hitObjects)
                {
                    if (hitObject.IsCliffsHit ||
                        hitObject.WorldObject.IsDestroyed)
                    {
                        continue;
                    }

                    if (hitObject.WorldObject is ICharacter damagedCharacter &&
                        !damagedCharacter.IsNpc)
                    {
                        // notify the damaged character
                        observers.Add(damagedCharacter);
                    }

                    Server.World.GetScopedByPlayers(hitObject.WorldObject, tempList);
                    tempList.Clear();
                    observers.AddRange(tempList.AsList());
                }

                // add all observers within the sound radius (so they can not only hear but also see the traces)
                var eventNetworkRadius = (byte)Math.Max(
                    15,
                    Math.Ceiling(protoWeapon.SoundPresetWeaponDistance.max));

                tempList.Clear();
                Server.World.GetCharactersInRadius(firingCharacter.TilePosition,
                                                   tempList,
                                                   radius: eventNetworkRadius,
                                                   onlyPlayers: true);
                observers.AddRange(tempList.AsList());

                // don't notify the attacking character
                observers.Remove(firingCharacter);

                if (observers.Count > 0)
                {
                    Instance.CallClient(observers,
                                        _ => _.ClientRemote_OnWeaponHitOrTrace(firingCharacter,
                                                                               protoWeapon,
                                                                               protoAmmo,
                                                                               firingCharacter.ProtoCharacter,
                                                                               firingCharacter
                                                                               .Position.ToVector2Ushort(),
                                                                               hitObjects.ToArray(),
                                                                               endPosition,
                                                                               endsWithHit));
                }
            }
        }