private void ClientAddShakes(ClientComponentBombCountdown component)
        {
            const float shakesInterval    = 0.5f,
                        shakesDuration    = 1f,
                        shakesDistanceMin = 0.2f,
                        shakesDistanceMax = 0.25f;

            if (component.IsDestroyed)
            {
                return;
            }

            var intensity = 1 - component.SecondsRemains / this.ExplosionDelay.TotalSeconds;

            if (intensity < 0.3)
            {
                intensity = 0.3;
            }

            ClientComponentCameraScreenShakes.AddRandomShakes(duration: shakesDuration,
                                                              worldDistanceMin: (float)(intensity * -shakesDistanceMin),
                                                              worldDistanceMax: (float)(intensity * shakesDistanceMax));

            ClientTimersSystem.AddAction(shakesInterval, () => this.ClientAddShakes(component));
        }
        private static void ClientOnHit()
        {
            const float shakesDuration    = 0.1f,
                        shakesDistanceMin = 0.1f,
                        shakesDistanceMax = 0.125f;

            ClientComponentCameraScreenShakes.AddRandomShakes(duration: shakesDuration,
                                                              worldDistanceMin: -shakesDistanceMin,
                                                              worldDistanceMax: shakesDistanceMax);
        }
        public override void ClientInitialize()
        {
            if (!Api.IsEditor)
            {
                // force master server connection in non-game mode (in non-Editor only)
                Api.Client.MasterServer.Connect();
            }

            Api.Client.Scene
            .CreateSceneObject("Update helper")
            .AddComponent <ClientComponentUpdateHelper>();

            Client.Core.SetLoadingSplashScreenManager(LoadingSplashScreenManager.Instance);

            Client.CurrentGame.ConnectionStateChanged      += RefreshCurrentGameServerConnectionState;
            Client.CurrentGame.ConnectingFailed            += GameServerLoginFailedDialogHelper.ShowDialog;
            Client.CurrentGame.ConnectingFailedModsMissing += GameServerConnectingFailedModsMissingHandler;
            RefreshCurrentGameServerConnectionState();

            Client.Core.IsCompilingChanged         += RefreshCompilingState;
            Client.Core.IsCompilationFailedChanged += RefreshCompilationFailedState;
            RefreshCompilingState();
            RefreshCompilationFailedState();

            Client.MasterServer.LoggedInStateChanged   += RefreshLoggedInState;
            Client.MasterServer.LoginFailed            += MasterServerLoginFailedHandler;
            Client.MasterServer.ConnectingFailed       += MasterServerConnectingFailedHandler;
            Client.MasterServer.ConnectionStateChanged += RefreshMasterServerConnectionState;
            Client.SteamApi.StateChanged += SteamServiceStateChanged;

            RefreshLoggedInState();

            if (Client.MasterServer.LastLoginErrorCode.HasValue)
            {
                MasterServerLoginFailedHandler(Client.MasterServer.LastLoginErrorCode.Value);
            }

            RefreshMasterServerConnectionState();

            MainMenuMusicHelper.Init();
            GameplayMusicHelper.Init();
            ClientComponentCameraScreenShakes.Init();

            SoundConstants.ApplyConstants();
        }
Exemple #4
0
        // Screen shakes on boss steps!
        private static void SkeletonOnAnimationEventFootstep(
            ICharacter character,
            IComponentSkeleton skeleton,
            SkeletonEventData e)
        {
            if (e.EventName != "Footstep")
            {
                return;
            }

            const float shakesDuration    = 0.1f,
                        shakesDistanceMin = 0.1f,
                        shakesDistanceMax = 0.125f;

            ClientComponentCameraScreenShakes.AddRandomShakes(duration: shakesDuration,
                                                              worldDistanceMin: -shakesDistanceMin,
                                                              worldDistanceMax: shakesDistanceMax);
        }
Exemple #5
0
            private void ClientAddShakes()
            {
                if (!this.IsEnabled)
                {
                    return;
                }

                const float shakesDuration    = 1.0f,
                            shakesDistanceMin = 0.25f,
                            shakesDistanceMax = 0.25f;

                var intensity = 0.3;

                if (this.time <= 0)
                {
                    intensity = 0.05; // low intensity to ensure some shakes initially when the masts are moving
                }
                else
                {
                    var progress = this.time / ShakesTotalDuration;
                    progress   = Math.Min(progress, 1);
                    progress   = Math.Pow(progress, 1.5);
                    progress   = ApplySineEasyIn(progress);
                    intensity *= (1 - progress);
                }

                if (intensity > 0)
                {
                    ClientComponentCameraScreenShakes.AddRandomShakes(
                        duration: shakesDuration,
                        worldDistanceMin: (float)(intensity * -shakesDistanceMin),
                        worldDistanceMax: (float)(intensity * shakesDistanceMax));
                }

                ClientTimersSystem.AddAction(ShakesInterval, this.ClientAddShakes);
            }
        public static void ClientExplode(
            Vector2D position,
            ExplosionPreset explosionPreset,
            float volume = 1.0f)
        {
            // add screen shakes
            ClientComponentCameraScreenShakes.AddRandomShakes(
                duration: explosionPreset.ScreenShakesDuration,
                worldDistanceMin: explosionPreset.ScreenShakesWorldDistanceMin,
                worldDistanceMax: explosionPreset.ScreenShakesWorldDistanceMax);

            // play sound
            var explosionSoundEmitter = Client.Audio.PlayOneShot(explosionPreset.SoundSet.GetSound(),
                                                                 worldPosition: position,
                                                                 volume: volume,
                                                                 pitch: RandomHelper.Range(0.95f, 1.05f));

            // extend explosion sound distance
            explosionSoundEmitter.CustomMinDistance = (float)explosionPreset.LightWorldSize / 3;
            explosionSoundEmitter.CustomMaxDistance = (float)explosionPreset.LightWorldSize;

            // create explosion renderer
            var explosionSpriteAnimationDuration = explosionPreset.SpriteAnimationDuration;
            var explosionSceneObject             = Client.Scene.CreateSceneObject("Temp explosion",
                                                                                  position);

            explosionSceneObject.Destroy(delay: explosionSpriteAnimationDuration);

            var explosionSpriteRenderer = Client.Rendering.CreateSpriteRenderer(
                explosionSceneObject,
                TextureResource.NoTexture,
                drawOrder: DrawOrder.Explosion,
                spritePivotPoint: (0.5, 0.5));

            explosionSpriteRenderer.Color = explosionPreset.SpriteColorMultiplicative;
            explosionSpriteRenderer.Size  = explosionPreset.SpriteSize;
            if (explosionPreset.SpriteColorAdditive.HasValue
                // ReSharper disable once CompareOfFloatsByEqualityOperator
                || explosionPreset.SpriteBrightness != 1)
            {
                var renderingMaterial = RenderingMaterial.Create(EffectResourceAdditiveColorEffect);
                renderingMaterial.EffectParameters
                .Set("ColorAdditive", explosionPreset.SpriteColorAdditive ?? Colors.Black)
                .Set("Brightness", explosionPreset.SpriteBrightness);
                explosionSpriteRenderer.RenderingMaterial = renderingMaterial;
            }

            var isFlipped = 0
                            == PositionalRandom.Get(position.ToVector2Ushort(),
                                                    minInclusive: 0,
                                                    maxExclusive: 2,
                                                    seed: 893243289);

            if (isFlipped)
            {
                explosionSpriteRenderer.DrawMode = DrawMode.FlipHorizontally;
            }

            ClientComponentOneShotSpriteSheetAnimationHelper.Setup(
                explosionSpriteRenderer,
                explosionPreset.SpriteAtlasResources.TakeByRandom(),
                explosionSpriteAnimationDuration);

            // add light source for the explosion
            var explosionLight = ClientLighting.CreateLightSourceSpot(
                explosionSceneObject,
                explosionPreset.LightColor,
                size: explosionPreset.LightWorldSize,
                positionOffset: (0, 0),
                spritePivotPoint: (0.5, 0.5));

            ClientComponentOneShotLightAnimation.Setup(
                explosionLight,
                explosionPreset.LightDuration);

            // add blast wave
            var blastAnimationDuration = explosionPreset.BlastwaveAnimationDuration;

            if (blastAnimationDuration > 0)
            {
                ClientTimersSystem.AddAction(
                    explosionPreset.BlastwaveDelay,
                    () =>
                {
                    var blastSceneObject = Client.Scene.CreateSceneObject("Temp explosion",
                                                                          position);

                    blastSceneObject.Destroy(delay: blastAnimationDuration);

                    var blastSpriteRenderer = Client.Rendering.CreateSpriteRenderer(
                        blastSceneObject,
                        new TextureResource("FX/ExplosionBlast"),
                        drawOrder: DrawOrder.Explosion - 1,
                        spritePivotPoint: (0.5, 0.5));

                    // animate blast wave
                    ClientComponentGenericAnimationHelper.Setup(
                        blastSceneObject,
                        blastAnimationDuration,
                        updateCallback: alpha =>
                    {
                        var blastwaveAlpha        = (byte)(byte.MaxValue * (1 - alpha));
                        blastSpriteRenderer.Color = explosionPreset.BlastWaveColor
                                                    .WithAlpha(blastwaveAlpha);

                        var sizeX = MathHelper.Lerp(explosionPreset.BlastwaveSizeFrom.X,
                                                    explosionPreset.BlastwaveSizeTo.X,
                                                    alpha);
                        var sizeY = MathHelper.Lerp(explosionPreset.BlastwaveSizeFrom.Y,
                                                    explosionPreset.BlastwaveSizeTo.Y,
                                                    alpha);
                        blastSpriteRenderer.Size = new Size2F(sizeX, sizeY);
                    });
                });
            }

            ClientGroundExplosionAnimationHelper.OnExplode(
                delaySeconds: explosionSpriteAnimationDuration / 2,
                position: position);
        }