protected override void ClientSetupRendering(ClientInitializeData data) { base.ClientSetupRendering(data); var publicState = data.PublicState; var skeletonRenderer = data.ClientState.SkeletonRenderer; if (skeletonRenderer is null) { return; } this.SharedGetSkeletonProto(data.GameObject, out var protoSkeleton, out _); SetupItem(publicState.ProtoItemLeftTurretSlot); SetupItem(publicState.ProtoItemRightTurretSlot); skeletonRenderer.SetAnimationFrame(0, "Offline", timePositionFraction: 1); void SetupItem(IProtoItem protoItem) { if (protoItem is IProtoItemWithCharacterAppearance protoItemWithCharacterAppearance) { protoItemWithCharacterAppearance.ClientSetupSkeleton( item: null, character: null, (ProtoCharacterSkeleton)protoSkeleton, skeletonRenderer, skeletonComponents: new List <IClientComponent>()); } } }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); data.ClientState.Renderer.DrawOrderOffsetY = 0.355; // add sprite sheet animation var sceneObject = data.GameObject.ClientSceneObject; sceneObject.AddComponent <ClientComponentSpriteSheetAnimator>() .Setup(data.ClientState.Renderer, ClientComponentSpriteSheetAnimator.CreateAnimationFrames(this.atlasTexture), isLooped: true, frameDurationSeconds: 3 / 60.0); // add light source at the firing fuse var lightSource = ClientLighting.CreateLightSourceSpot( sceneObject, LightColors.WoodFiring, size: (3, 3), logicalSize: 0, positionOffset: (0.7, 0.7)); // add light flickering sceneObject.AddComponent <ClientComponentLightSourceEffectFlickering>() .Setup(lightSource, flickeringPercents: 10, flickeringChangePercentsPerSecond: 70); }
protected override void ClientInitialize(ClientInitializeData data) { var worldObject = data.GameObject; var clientState = data.ClientState; this.ClientSetupSubstrateRenderer(data); clientState.Renderer = Client.Rendering.CreateSpriteRenderer( worldObject, this.DefaultTexture, drawOrder: DrawOrder.Floor); clientState.Renderer.SortByWorldPosition = false; this.ClientSetupRenderer(clientState.Renderer); if (data.GameObject.OccupiedTile.StaticObjects.Any( o => o.ProtoStaticWorldObject is IProtoObjectExtractor && !o.IsDestroyed)) { // there are other static objects so don't create structure points bar and hide the renderer clientState.Renderer.IsEnabled = false; } else { this.ClientAddAutoStructurePointsBar(data); } }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); var gameObject = data.GameObject; var clientState = data.ClientState; var publicState = data.PublicState; clientState.LastGrowthStage = publicState.GrowthStage; var spriteRenderer = clientState.Renderer; spriteRenderer.TextureResource = SystemVegetation.ClientGetTexture( this, gameObject, publicState); clientState.Renderer = spriteRenderer; // flip renderer with some deterministic randomization if (this.CanFlipSprite && PositionalRandom.Get(gameObject.TilePosition, 0, 3, seed: 721886451) == 0) { spriteRenderer.DrawMode = DrawMode.FlipHorizontally; } if (this.IsAutoAddShadow) { this.ClientAddShadowRenderer(data); } }
protected override void ClientInitialize(ClientInitializeData data) { var objectDrone = data.GameObject; var spriteRenderer = this.ClientSetupRendering(data); this.ClientCreateRendererShadow(data.GameObject, scaleMultiplier: 1.0); this.ClientSetupSoundEmitter(data); this.ClientSetupHealthbar(data); var sceneObject = objectDrone.ClientSceneObject; sceneObject.AddComponent <ComponentDroneVisualManager>() .Setup(objectDrone, spriteRenderer, this.StatMoveSpeed); sceneObject.AddComponent <ComponentDroneMiningBeam>() .Setup(data.PublicState, beamColor: this.BeamColor, beamOriginTexture: this.BeamOriginTexture, beamTexture: this.BeamTexture, beamOriginOffset: this.BeamOriginOffset, beamWidth: this.BeamWidth, primaryRenderer: spriteRenderer); }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); var worldObject = data.GameObject; var publicState = data.PublicState; var clientState = data.ClientState; data.ClientState.RendererLight = this.ClientCreateLightSource( Client.Scene.GetSceneObject(worldObject)); // subscribe to destruction timer publicState.ClientSubscribe( _ => _.ServerTimeForDestruction, _ => ClientRefreshSprite(), clientState); ClientRefreshSprite(); void ClientRefreshSprite() { clientState.Renderer.TextureResource = publicState.ServerTimeForDestruction.HasValue ? this.TextureResourceObjectBroken : this.DefaultTexture; } }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); var worldObject = data.GameObject; Client.Scene.GetSceneObject(worldObject) .AddComponent <ClientComponentBombCountdown>() .Setup(secondsRemains: this.ExplosionDelay.TotalSeconds, positionOffset: this.SharedGetObjectCenterWorldOffset(worldObject) + (0, 0.55)); // preload all the explosion spritesheets foreach (var textureAtlasResource in this.ExplosionPreset.SpriteAtlasResources) { Client.Rendering.PreloadTextureAsync(textureAtlasResource); } ClientGroundExplosionAnimationHelper.PreloadContent(); // preload all the explosion sounds foreach (var soundResource in this.ExplosionPreset.SoundSet) { Client.Audio.PreloadSoundAsync(soundResource, is3D: true); } Client.Rendering.PreloadEffectAsync(ExplosionHelper.EffectResourceAdditiveColorEffect); }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); var clientState = data.ClientState; var texture = SharedIsAlternativeVariant(data.GameObject.TilePosition) ? this.texture1 : this.texture2; clientState.Renderer.TextureResource = texture; if (!data.GameObject.OccupiedTile.StaticObjects.Any( o => o.ProtoStaticWorldObject is IProtoObjectExtractor)) { // create sound emitter as there is no extractor clientState.SoundEmitter = Client.Audio.CreateSoundEmitter( data.GameObject, SoundResourceActive, isLooped: true, volume: 0.5f, radius: 1.5f); clientState.SoundEmitter.CustomMaxDistance = 3; } }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); var sceneObject = Client.Scene.GetSceneObject(data.GameObject); var componentBombCountdown = sceneObject.FindComponent <ClientComponentBombCountdown>(); componentBombCountdown.IsRendering = false; this.ClientAddShakes(componentBombCountdown); var lightSource = ObjectMineralPragmiumHelper.ClientInitializeLightForSource(data.GameObject); sceneObject.AddComponent <ClientComponentLightSourceEffectPulsating>() .Setup(lightSource, fromPercents: 85, toPercents: 120, durationSeconds: 1); var soundEmitter = Api.Client.Audio.CreateSoundEmitter(data.GameObject, new SoundResource("Ambient/Earthquake"), true, radius: 7, isLooped: true); soundEmitter.Seek(0); }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); var tilePosition = data.GameObject.TilePosition; var renderer = data.ClientState.Renderer; if (ClientGroundExplosionAnimationHelper.IsGroundSpriteFlipped(tilePosition)) { renderer.DrawMode = DrawMode.FlipHorizontally; } if (ClientGroundExplosionAnimationHelper.HasActiveExplosion(tilePosition)) { // this is a fresh charred ground, animate the ground sprite var animationDuration = ClientGroundExplosionAnimationHelper.ExplosionGroundDuration; var framesTextureResources = ClientComponentSpriteSheetAnimator.CreateAnimationFrames( ClientGroundExplosionAnimationHelper.ExplosionGroundTextureAtlas); var componentAnimator = renderer.SceneObject.AddComponent <ClientComponentSpriteSheetAnimator>(); componentAnimator.Setup(renderer, framesTextureResources, frameDurationSeconds: animationDuration / framesTextureResources.Length); componentAnimator.IsLooped = false; componentAnimator.Destroy(1.5 * animationDuration); } }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); var renderer = data.ClientState.Renderer; renderer.DrawOrder = DrawOrder.Floor; var overlayRenderer = Client.Rendering.CreateSpriteRenderer( data.GameObject, TextureResource.NoTexture); this.ClientSetupRenderer(overlayRenderer); overlayRenderer.PositionOffset = renderer.PositionOffset + this.textureAltasAnimationDrawPositionWorldOffset; overlayRenderer.SpritePivotPoint = renderer.SpritePivotPoint; overlayRenderer.Scale = renderer.Scale; overlayRenderer.DrawOrder = renderer.DrawOrder + 1; Client.Scene .GetSceneObject(data.GameObject) .AddComponent <ClientComponentSpriteSheetBlendAnimator>() .Setup( overlayRenderer, ClientComponentSpriteSheetAnimator.CreateAnimationFrames(this.textureAtlasAnimation), frameDurationSeconds: this.textureAtlasAnimationFrameDurationSeconds); }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); var worldObject = data.GameObject; var publicState = data.PublicState; var clientState = data.ClientState; var tile = worldObject.OccupiedTile; ClientAddPlantRenderingOffsetFromFarm(tile, clientState.Renderer); var rendererShadow = clientState.RendererShadow; if (rendererShadow is not null) { ClientAddPlantRenderingOffsetFromFarm(tile, rendererShadow); } // force reinitialize the farm plot to ensure it correctly uses the watered state of the plant over it SharedGetFarmPlotWorldObject(worldObject.OccupiedTile)?.ClientInitialize(); publicState.ClientSubscribe(_ => _.IsWatered, _ => SharedGetFarmPlotWorldObject(worldObject.OccupiedTile) ?.ClientInitialize(), clientState); publicState.ClientSubscribe(_ => _.IsFertilized, _ => SharedGetFarmPlotWorldObject(worldObject.OccupiedTile) ?.ClientInitialize(), clientState); }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); var worldObject = data.GameObject; var publicState = data.PublicState; var soundEmitter = Client.Audio.CreateSoundEmitter( worldObject, soundResource: worldObject.ProtoStaticWorldObject .SharedGetObjectSoundPreset() .GetSound(ObjectSound.Active), is3D: true, radius: Client.Audio.CalculateObjectSoundRadius(worldObject), isLooped: true); soundEmitter.Volume = 0.4f; soundEmitter.Radius = 2f; soundEmitter.CustomMaxDistance = 6f; publicState.ClientSubscribe(_ => _.IsActive, _ => RefreshActiveState(), data.ClientState); RefreshActiveState(); void RefreshActiveState() { soundEmitter.IsEnabled = publicState.IsActive; } }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); var publicState = data.PublicState; var clientState = data.ClientState; var soundEmitter = this.ClientCreateActiveStateSoundEmitterComponent(data.GameObject); soundEmitter.CustomMaxDistance = 4; soundEmitter.Volume = 0.5f; publicState.ClientSubscribe(_ => _.IsActive, _ => RefreshActiveState(), data.ClientState); RefreshActiveState(); void RefreshActiveState() { clientState.Renderer.TextureResource = publicState.IsActive ? textureActive : this.DefaultTexture; soundEmitter.IsEnabled = publicState.IsActive; } }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); // setup light source var lightSource = ClientLighting.CreateLightSourceSpot( data.GameObject.ClientSceneObject, color: LightColors.WoodFiring, size: 1.25f, spritePivotPoint: (0.5, 0.5), positionOffset: (1, 1)); // add light flickering lightSource.SceneObject .AddComponent <ClientComponentLightSourceEffectFlickering>() .Setup(lightSource, flickeringPercents: 5, flickeringChangePercentsPerSecond: 50); var animatedSpritePositionOffset = (85 / 128.0, 111 / 128.0); this.ClientSetupManufacturerActiveAnimation( data.GameObject, data.PublicState, this.textureAtlasOvenActive, animatedSpritePositionOffset, frameDurationSeconds: 0.08, autoInverseAnimation: false, randomizeInitialFrame: true, onRefresh: isActive => { lightSource.IsEnabled = isActive; }); }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); var worldObject = data.GameObject; var publicState = data.PublicState; var animatedSpritePositionOffset = (84 / (double)ScriptingConstants.TileSizeRealPixels, 122 / (double)ScriptingConstants.TileSizeRealPixels); this.ClientSetupExtractorActiveAnimation( worldObject, publicState, this.textureAtlasOilPumpActive, animatedSpritePositionOffset, frameDurationSeconds: 0.08, autoInverseAnimation: false, playAnimationSounds: false); var soundEmitter = this.ClientCreateActiveStateSoundEmitterComponent(worldObject); publicState.ClientSubscribe(_ => _.IsActive, _ => RefreshActiveState(), data.ClientState); RefreshActiveState(); void RefreshActiveState() { soundEmitter.IsEnabled = publicState.IsActive; } }
protected override void ClientInitialize(ClientInitializeData data) { // do not call base implementation //base.ClientInitialize(data); var worldObject = data.GameObject; var publicState = data.SyncPublicState; var protoStructure = publicState.ConstructionProto; var blueprint = new ClientBlueprintRenderer(Client.Scene.GetSceneObject(worldObject)); protoStructure.ClientSetupBlueprint(worldObject.OccupiedTile, blueprint); blueprint.SpriteRenderer.DrawOrder = DrawOrder.Default; blueprint.SpriteRenderer.RenderingMaterial = BlueprintMaterial.Value; ClientConstructionSiteOutlineHelper.CreateOutlineRenderer(worldObject, protoStructure); if (protoStructure is IProtoObjectWall || protoStructure is IProtoObjectDoor) { SharedWallConstructionRefreshHelper.SharedRefreshNeighborObjects( data.GameObject.OccupiedTile, isDestroy: false); } var sceneObject = Client.Scene.GetSceneObject(worldObject); sceneObject.AddComponent <ClientComponentAutoDisplayConstructionSiteStructurePointsBar>() .Setup(worldObject, structurePointsMax: this.SharedGetStructurePointsMax(worldObject)); }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); var worldObject = data.GameObject; var publicState = data.PublicState; // reinitialize structure when a reactor is added publicState.ClientSubscribe( _ => _.ReactorStates, _ => { this.SoundPresetObject.PlaySound(ObjectSound.Place); worldObject.ClientInitialize(); }, data.ClientState); for (var index = 0; index < publicState.ReactorStates.Length; index++) { var reactorState = publicState.ReactorStates[index]; if (reactorState is null) { continue; } var reactorSpriteRenderer = Client.Rendering.CreateSpriteRenderer(worldObject); this.ClientSetupReactorSpriteRenderer(worldObject, reactorSpriteRenderer, reactorState, index); } }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); var publicState = data.PublicState; var sceneObject = data.GameObject.ClientSceneObject; var soundEmitter = this.ClientCreateActiveStateSoundEmitterComponent(data.GameObject); soundEmitter.Volume = 0.35f; soundEmitter.Radius = 2f; soundEmitter.CustomMaxDistance = 6f; var componentVibration = sceneObject .AddComponent <ClientComponentWorldObjectVibration>(); componentVibration.Setup(data.ClientState.Renderer, amplitude: 0.8 / 256.0, speed: 1.0, verticalStartOffsetRelative: 0.02); publicState.ClientSubscribe(_ => _.IsActive, _ => RefreshActiveState(), data.ClientState); RefreshActiveState(); void RefreshActiveState() { componentVibration.IsEnabled = publicState.IsActive; soundEmitter.IsEnabled = publicState.IsActive; } }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); // setup animation var animationFrameDurationSeconds = 1 / 8.0; Client.Scene .GetSceneObject(data.GameObject) .AddComponent <ClientComponentSpriteSheetAnimator>() .Setup( data.ClientState.Renderer, ClientComponentSpriteSheetAnimator.CreateAnimationFrames( (ITextureAtlasResource)this.DefaultTexture), frameDurationSeconds: animationFrameDurationSeconds); // create sound emitter data.ClientState.SoundEmitter = Client.Audio.CreateSoundEmitter( data.GameObject, SoundResourceActive, isLooped: true, volume: 0.5f, radius: 1.5f); data.ClientState.SoundEmitter.CustomMaxDistance = 5; }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); var publicState = data.PublicState; var sceneObject = Client.Scene.GetSceneObject(data.GameObject); var soundEmitter = this.ClientCreateActiveStateSoundEmitterComponent(data.GameObject); soundEmitter.Radius = 1f; soundEmitter.CustomMaxDistance = 5f; soundEmitter.Volume = 0.5f; publicState.ClientSubscribe(_ => _.IsActive, _ => RefreshActiveState(), data.ClientState); RefreshActiveState(); void RefreshActiveState() { soundEmitter.IsEnabled = publicState.IsActive; } }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); var character = data.GameObject; var clientState = data.ClientState; var publicState = data.PublicState; if (!character.IsCurrentClientCharacter) { this.ClientCreateOverlayControl(character); } publicState.ClientSubscribe(_ => _.IsDead, isDead => { if (isDead) { // reset the character position and movement on death character.PhysicsBody.Reset(); } }, clientState); // create loop sound emitters clientState.SoundEmitterLoopCharacter = Client.Audio.CreateSoundEmitter( character, SoundResource.NoSound, isLooped: true); clientState.SoundEmitterLoopMovemement = Client.Audio.CreateSoundEmitter( character, SoundResource.NoSound, isLooped: true); }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); var spriterRendererLiquidType = Client.Rendering.CreateSpriteRenderer( data.GameObject, TextureResource.NoTexture, spritePivotPoint: (0.5, 0.5)); spriterRendererLiquidType.Scale = 2; this.ClientSetupLiquidTypeSpriteRenderer(data.GameObject, spriterRendererLiquidType); var publicState = data.PublicState; publicState.ClientSubscribe( _ => _.LiquidType, _ => UpdatePublicLiquidState(), data.ClientState); UpdatePublicLiquidState(); // local method for updating public liquid state void UpdatePublicLiquidState() { var liquidType = publicState.LiquidType; spriterRendererLiquidType.IsEnabled = liquidType.HasValue; spriterRendererLiquidType.TextureResource = LiquidColorIconHelper.GetTexture(liquidType); } }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); var worldObject = data.GameObject; // setup light source var lightSource = ClientLighting.CreateLightSourceSpot( worldObject.ClientSceneObject, color: Color.FromArgb(0x99, 0xFF, 0xFF, 0xFF), size: 1, spritePivotPoint: (0.5, 0.5), positionOffset: (1.47, 0.78)); var animatedSpritePositionOffset = (277 / (double)ScriptingConstants.TileSizeRealPixels, 171 / (double)ScriptingConstants.TileSizeRealPixels); this.ClientSetupManufacturerActiveAnimation( worldObject, data.PublicState, this.textureAtlasOilPumpActive, animatedSpritePositionOffset, frameDurationSeconds: 0.3, autoInverseAnimation: true, randomizeInitialFrame: true, onRefresh: isActive => lightSource.IsEnabled = isActive); data.ClientState.SoundEmitter.CustomMaxDistance = 10f; data.ClientState.SoundEmitter.Volume = 0.5f; }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); var worldObject = data.GameObject; // setup light source var lightSource = ClientLighting.CreateLightSourceSpot( Client.Scene.GetSceneObject(worldObject), color: LightColors.WoodFiring, size: 1, spritePivotPoint: (0.5, 0.5), positionOffset: (2.3, 0.9)); var animatedSpritePositionOffset = (541 / 256.0, 171 / 256.0); this.ClientSetupManufacturerActiveAnimation( worldObject, data.SyncPublicState, this.textureAtlasActive, animatedSpritePositionOffset, frameDurationSeconds: 1 / 12f, autoInverseAnimation: false, onRefresh: isActive => { lightSource.IsEnabled = isActive; }); }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); // setup animation var animationFrameDurationSeconds = 1 / 8.0; var clientState = data.ClientState; var textureAtlas = SharedIsAlternativeVariant(data.GameObject.TilePosition) ? this.textureAtlas1 : this.textureAtlas2; data.GameObject .ClientSceneObject .AddComponent <ClientComponentSpriteSheetAnimator>() .Setup( clientState.Renderer, ClientComponentSpriteSheetAnimator.CreateAnimationFrames(textureAtlas), isLooped: true, frameDurationSeconds: animationFrameDurationSeconds, randomizeInitialFrame: true); if (!data.GameObject.OccupiedTile.StaticObjects.Any( o => o.ProtoStaticWorldObject is IProtoObjectExtractor)) { // create sound emitter as there is no extractor clientState.SoundEmitter = Client.Audio.CreateSoundEmitter( data.GameObject, SoundResourceActive, isLooped: true, volume: 0.5f, radius: 1.5f); clientState.SoundEmitter.CustomMaxDistance = 5; } }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); PowerGridSystem.ClientInitializeConsumerOrProducer(data.GameObject); // create sound emitter var soundEmitter = Client.Audio.CreateSoundEmitter( data.GameObject, new SoundResource("Objects/Structures/ObjectFridge/Active"), isLooped: true, volume: 0.35f, radius: 1f); soundEmitter.CustomMaxDistance = 3.5f; this.ClientSetupSoundEmitter(soundEmitter); var publicState = data.PublicState; publicState.ClientSubscribe(_ => _.ElectricityConsumerState, _ => RefreshSoundEmitterState(), data.ClientState); RefreshSoundEmitterState(); void RefreshSoundEmitterState() { soundEmitter.IsEnabled = publicState.ElectricityConsumerState == ElectricityConsumerState.PowerOnActive; } }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); var publicState = data.PublicState; var clientState = data.ClientState; var sceneObject = data.GameObject.ClientSceneObject; clientState.RendererLight = ClientLighting.CreateLightSourceSpot( sceneObject, color: LightColors.BioLuminescencePink, size: 12, logicalSize: 5.5, positionOffset: (0.5, 0.7)); void RefreshLightSourceSpot() { // display light only if the bush has fruit clientState.RendererLight.IsEnabled = publicState.HasHarvest; } publicState.ClientSubscribe( _ => _.HasHarvest, _ => RefreshLightSourceSpot(), data.ClientState); RefreshLightSourceSpot(); }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); var publicState = data.SyncPublicState; var clientState = data.ClientState; var sceneObject = Client.Scene.GetSceneObject(data.GameObject); clientState.RendererLight = ClientLighting.CreateLightSourceSpot( sceneObject, color: LightColors.BioLuminescencePink, size: 5, positionOffset: (0.5, 0.5)); void RefreshLightSourceSpot() { // display light only if the bush has fruit clientState.RendererLight.IsEnabled = publicState.IsFullGrown(this); } publicState.ClientSubscribe( _ => _.GrowthStage, _ => RefreshLightSourceSpot(), data.ClientState); RefreshLightSourceSpot(); }
protected override void ClientInitialize(ClientInitializeData data) { base.ClientInitialize(data); var worldObject = data.GameObject; // setup light source var lightSource = ClientLighting.CreateLightSourceSpot( Client.Scene.GetSceneObject(worldObject), color: LightColors.WoodFiring, size: 3, spritePivotPoint: (0.5, 0.5), positionOffset: (1, 0.35f + this.VerticalOffset)); // add light flickering lightSource.SceneObject .AddComponent <ClientComponentLightSourceEffectFlickering>() .Setup(lightSource, flickeringPercents: 5, flickeringChangePercentsPerSecond: 50); var animatedSpritePositionOffset = (81 / 128.0, this.VerticalOffset + 29 / 128.0); this.ClientSetupManufacturerActiveAnimation( worldObject, data.SyncPublicState, this.textureAtlasFurnaceActive, animatedSpritePositionOffset, frameDurationSeconds: 0.08, autoInverseAnimation: false, drawOrderOffsetY: this.VerticalOffset, onRefresh: isActive => { lightSource.IsEnabled = isActive; }); }