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(); }
// 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); }
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); }