Beispiel #1
0
        private static void ClientOnCharactersHitByExplosion(IReadOnlyList <WeaponHitData> hitCharacters)
        {
            foreach (var hitData in hitCharacters)
            {
                var protoWorldObject = hitData.FallbackProtoWorldObject;
                var objectMaterial   = hitData.FallbackObjectMaterial;
                var hitWorldObject   = hitData.WorldObject;
                if (hitWorldObject is not null &&
                    !hitWorldObject.IsInitialized)
                {
                    hitWorldObject = null;
                }

                var worldObjectPosition = CalculateWorldObjectPosition(hitWorldObject, hitData);

                // apply some volume variation
                var volume = SoundConstants.VolumeHit;
                volume *= RandomHelper.Range(0.8f, 1.0f);
                var pitch = RandomHelper.Range(0.95f, 1.05f);

                if (hitWorldObject is not null)
                {
                    SoundPresetHitExplosion.PlaySound(
                        objectMaterial,
                        hitWorldObject,
                        volume: volume,
                        pitch: pitch);
                }
                else
                {
                    SoundPresetHitExplosion.PlaySound(
                        objectMaterial,
                        protoWorldObject,
                        worldPosition: worldObjectPosition,
                        volume: volume,
                        pitch: pitch);
                }

                WeaponSystemClientDisplay.ClientAddHitSparks(
                    ExplosionHitSparksPreset,
                    hitData,
                    hitWorldObject,
                    protoWorldObject,
                    worldObjectPosition,
                    projectilesCount: 1,
                    objectMaterial: objectMaterial,
                    randomizeHitPointOffset: true,
                    rotationAngleRad: null,
                    randomRotation: true,
                    drawOrder: DrawOrder.Light);
            }
        private static void SkeletonOnAnimationEventFootstep(
            ICharacter character,
            IComponentSkeleton skeleton,
            SkeletonEventData e)
        {
            if (e.EventName != "Footstep")
            {
                return;
            }

            // play footstep sound
            GroundSoundMaterial groundSoundMaterial;

            var tile = character.Tile;

            // find the latest proto ground object with sound
            IProtoObjectWithGroundSoundMaterial protoGroundObject = null;

            foreach (var worldObject in tile.StaticObjects)
            {
                if (worldObject.ProtoStaticWorldObject is IProtoObjectWithGroundSoundMaterial proto)
                {
                    protoGroundObject = proto;
                }
            }

            if (protoGroundObject is not null)
            {
                // get sound material of proto ground object
                groundSoundMaterial = protoGroundObject.SharedGetGroundSoundMaterial();
            }
            else
            {
                // get sound material of proto tile
                var protoTile = (ProtoTile)tile.ProtoTile;
                groundSoundMaterial = protoTile.GroundSoundMaterial;
            }

            ReadOnlySoundPreset <GroundSoundMaterial> soundPresetMovement = null;
            var protoCharacter = character.ProtoCharacter;

            if (protoCharacter is PlayerCharacter &&
                PlayerCharacter.GetPublicState(character).CurrentVehicle is null)
            {
                // try get movement sound preset override
                foreach (var item in character.SharedGetPlayerContainerEquipment().Items)
                {
                    if (item.ProtoItem is IProtoItemEquipmentArmor protoItemEquipmentArmor)
                    {
                        soundPresetMovement = protoItemEquipmentArmor.SoundPresetFootstepsOverride;
                        break;
                    }
                }
            }

            var protoSkeleton = (ProtoCharacterSkeleton)protoCharacter.ClientGetCurrentProtoSkeleton(character);

            if (soundPresetMovement is null)
            {
                // movement sound preset is not overridden - use from this skeleton
                soundPresetMovement = protoSkeleton.SoundPresetFootsteps;
            }

            // use some pitch variation
            var pitch = RandomHelper.Range(protoSkeleton.FootstepsPitchVariationRange.From,
                                           protoSkeleton.FootstepsPitchVariationRange.To);

            var volume = protoSkeleton.VolumeFootsteps;

            // apply some volume variation
            volume *= RandomHelper.Range(protoSkeleton.FootstepsVolumeVariationRange.From,
                                         protoSkeleton.FootstepsVolumeVariationRange.To);
            // apply constant volume multiplier
            volume *= SoundConstants.VolumeFootstepsMultiplier;

            soundPresetMovement.PlaySound(
                groundSoundMaterial,
                character,
                volume: (float)volume,
                pitch: (float)pitch);
        }