Пример #1
0
        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>());
                }
            }
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
        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);
            }
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }
Пример #8
0
        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);
        }
Пример #10
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);
            }
        }
Пример #11
0
        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);
        }
Пример #12
0
        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);
        }
Пример #13
0
        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;
            }
        }
Пример #14
0
        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;
            }
        }
Пример #15
0
        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; });
        }
Пример #16
0
        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));
        }
Пример #18
0
        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);
            }
        }
Пример #19
0
        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;
            }
        }
Пример #20
0
        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;
        }
Пример #21
0
        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;
            }
        }
Пример #22
0
        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);
        }
Пример #23
0
        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);
            }
        }
Пример #24
0
        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;
        }
Пример #25
0
        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; });
        }
Пример #26
0
        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;
            }
        }
Пример #28
0
        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();
        }
Пример #29
0
        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();
        }
Пример #30
0
        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; });
        }