Пример #1
0
        protected override void ClientSetupExplosionBlueprint(Tile tile, IClientBlueprint blueprint)
        {
            ProcessExplosionDirection(-1, 0);  // left
            ProcessExplosionDirection(0, 1);   // top
            ProcessExplosionDirection(1, 0);   // right
            ProcessExplosionDirection(0, -1);  // bottom

            void ProcessExplosionDirection(int xOffset, int yOffset)
            {
                foreach (var(_, offsetIndex) in
                         WeaponExplosionSystem.SharedEnumerateExplosionBombermanDirectionTilesWithTargets(
                             positionEpicenter: tile.Position.ToVector2D(),
                             damageDistanceFullDamage: DamageRadiusFullDamage,
                             damageDistanceMax: DamageRadiusMax,
                             Api.Client.World,
                             xOffset,
                             yOffset))
                {
                    var rectangle = new Rectangle()
                    {
                        Width           = 1 * ScriptingConstants.TileSizeVirtualPixels - 10,
                        Height          = 1 * ScriptingConstants.TileSizeVirtualPixels - 10,
                        StrokeThickness = 4
                    };

                    if (offsetIndex <= DamageRadiusFullDamage)
                    {
                        rectangle.Stroke = ExplosionBlueprintBorderBrushRed.Value;
                        rectangle.Fill   = ExplosionBlueprintFillBrushRed.Value;
                    }
                    else
                    {
                        switch (offsetIndex)
                        {
                        case 5:
                        case 6:
                        case 7:
                            rectangle.Stroke = ExplosionBlueprintBorderBrushYellow.Value;
                            rectangle.Fill   = ExplosionBlueprintFillBrushYellow.Value;
                            break;

                        default:
                            throw new Exception("Should be impossible");
                        }
                    }

                    // workaround for NoesisGUI
                    rectangle.SetValue(Shape.StrokeDashArrayProperty, "2,1");

                    Api.Client.UI.AttachControl(
                        blueprint.SceneObject,
                        positionOffset: this.Layout.Center
                        + (offsetIndex * xOffset,
                           offsetIndex * yOffset),
                        uiElement: rectangle,
                        isFocusable: false,
                        isScaleWithCameraZoom: true);
                }
            }
        }
Пример #2
0
        public override void ClientSetupBlueprint(Tile tile, IClientBlueprint blueprint)
        {
            base.ClientSetupBlueprint(tile, blueprint);

            if (!ConstructionPlacementSystem.IsInObjectPlacementMode &&
                !ConstructionRelocationSystem.IsInObjectPlacementMode)
            {
                return;
            }

            var bounds = this.Layout.Bounds;
            var sizeX  = bounds.MaxX - bounds.MinX + 2 * this.WateringDistance;
            var sizeY  = bounds.MaxY - bounds.MinY + 2 * this.WateringDistance;

            Api.Client.UI.AttachControl(
                blueprint.SceneObject,
                positionOffset: this.Layout.Center,
                uiElement: new Rectangle()
            {
                Width           = sizeX * ScriptingConstants.TileSizeVirtualPixels,
                Height          = sizeY * ScriptingConstants.TileSizeVirtualPixels,
                Fill            = BlueprintFillBrush.Value,
                Stroke          = BlueprintBorderBrush.Value,
                StrokeThickness = 4,
            },
                isFocusable: false,
                isScaleWithCameraZoom: true);
        }
Пример #3
0
        public override void ClientSetupBlueprint(Tile tile, IClientBlueprint blueprint)
        {
            base.ClientSetupBlueprint(tile, blueprint);

            if (!ConstructionPlacementSystem.IsObjectPlacementComponentEnabled)
            {
                return;
            }

            // display area only when player placing a blueprint
            var areaSprite = Api.Client.Rendering.CreateSpriteRenderer(
                blueprint.SceneObject,
                null,
                DrawOrder.Overlay);

            ClientBlueprintAreaRenderingMaterial.EffectParameters.Set(
                "Color",
                blueprint.IsCanBuild
                    ? ColorGreen
                    : ColorRed);

            areaSprite.RenderingMaterial           = ClientBlueprintAreaRenderingMaterial;
            areaSprite.SortByWorldPosition         = false;
            areaSprite.IgnoreTextureQualityScaling = true;
            areaSprite.Scale = this.LandClaimSize;

            var offset = LandClaimSystem.SharedCalculateLandClaimObjectCenterTilePosition(Vector2Ushort.Zero, this);

            areaSprite.PositionOffset = (offset.X - this.LandClaimSize / 2,
                                         offset.Y - this.LandClaimSize / 2);
        }
Пример #4
0
        public override void ClientSetupBlueprint(Tile tile, IClientBlueprint blueprint)
        {
            base.ClientSetupBlueprint(tile, blueprint);

            if (ConstructionPlacementSystem.IsInObjectPlacementMode)
            {
                ProtoObjectLandClaimPlacementDisplayHelper.SetupBlueprint(tile, blueprint, this);
            }
        }
Пример #5
0
        public override void ClientSetupBlueprint(Tile tile, IClientBlueprint blueprint)
        {
            base.ClientSetupBlueprint(tile, blueprint);

            var rendererBase = Client.Rendering.CreateSpriteRenderer(blueprint.SceneObject,
                                                                     null);

            rendererBase.RenderingMaterial = blueprint.SpriteRenderer.RenderingMaterial;
            this.ClientSetupRendererBase(rendererBase);
        }
Пример #6
0
        public override void ClientSetupBlueprint(Tile tile, IClientBlueprint blueprint)
        {
            var renderer         = blueprint.SpriteRenderer;
            var isHorizontalDoor = DoorHelper.IsHorizontalDoorNeeded(tile, checkExistingDoor: true);

            renderer.PositionOffset = (0,
                                       isHorizontalDoor
                                           ? DrawWorldOffsetYHorizontalDoor
                                           : DrawWorldOffsetYVerticalDoor);

            renderer.TextureResource = isHorizontalDoor
                                           ? this.lazyHorizontalDoorBlueprintTexture.Value
                                           : this.lazyVerticalDoorBlueprintTexture.Value;
        }
Пример #7
0
        public override void ClientSetupBlueprint(Tile tile, IClientBlueprint blueprint)
        {
            var renderer = blueprint.SpriteRenderer;

            renderer.TextureResource = this.DefaultTexture;

            // setup drawing of the top left chunk of the texture
            renderer.CustomTextureSourceRectangle =
                new RectangleInt(0, 0, ScriptingConstants.TileSizeRealPixels, ScriptingConstants.TileSizeRealPixels);

            // change draw world position and origin to draw the top left chunk of the texture
            renderer.PositionOffset   = (0, 1);
            renderer.SpritePivotPoint = (0, 1);
            this.ClientSetupRenderer(renderer);
        }
Пример #8
0
        protected virtual void ClientSetupExplosionBlueprint(Tile tile, IClientBlueprint blueprint)
        {
            var bounds  = this.Layout.Bounds;
            var sizeX   = bounds.MaxX - bounds.MinX + 2 * this.DamageRadius - 1;
            var sizeY   = bounds.MaxY - bounds.MinY + 2 * this.DamageRadius - 1;
            var ellipse = new Ellipse()
            {
                Width           = sizeX * ScriptingConstants.TileSizeVirtualPixels,
                Height          = sizeY * ScriptingConstants.TileSizeVirtualPixels,
                Fill            = ExplosionBlueprintFillBrush.Value,
                Stroke          = ExplosionBlueprintBorderBrush.Value,
                StrokeThickness = 4
            };

            // workaround for NoesisGUI
            ellipse.SetValue(Shape.StrokeDashArrayProperty, "5,2.5");

            Api.Client.UI.AttachControl(
                blueprint.SceneObject,
                positionOffset: this.Layout.Center,
                uiElement: ellipse,
                isFocusable: false,
                isScaleWithCameraZoom: true);
        }
 public void ClientSetupBlueprint(Tile tile, IClientBlueprint blueprint)
 {
     blueprint.SpriteRenderer.TextureResource = TextureResource.NoTexture;
 }
Пример #10
0
 public override void ClientSetupBlueprint(
     Tile tile,
     IClientBlueprint blueprint)
 {
     ProtoObjectWallHelper.ClientSetupBlueprint(this, tile, blueprint);
 }
Пример #11
0
 public override void ClientSetupBlueprint(Tile tile, IClientBlueprint blueprint)
 {
     base.ClientSetupBlueprint(tile, blueprint);
     ClientAddPlantRenderingOffsetFromFarm(tile, blueprint.SpriteRenderer);
 }
Пример #12
0
 public override void ClientSetupBlueprint(
     Tile tile,
     IClientBlueprint blueprint)
 {
     blueprint.SpriteRenderer.TextureResource = this.Icon;
 }
Пример #13
0
        public static void ClientSetupBlueprint(IProtoObjectWall protoWall, Tile tile, IClientBlueprint blueprint)
        {
            var textureAtlas = ClientGetTextureAtlas(protoWall);
            var result       = SharedGetAtlasTextureChunkPosition(tile,
                                                                  protoWall,
                                                                  isConsiderDestroyed: false,
                                                                  isConsiderConstructionSites: true);

            blueprint.SpriteRenderer.TextureResource = textureAtlas.Chunk((byte)result.Primary.AtlasChunkPosition.X,
                                                                          (byte)result.Primary.AtlasChunkPosition.Y);
            result.Dispose();
        }
Пример #14
0
 public override void ClientSetupBlueprint(Tile tile, IClientBlueprint blueprint)
 {
     base.ClientSetupBlueprint(tile, blueprint);
     blueprint.SpriteRenderer.TextureResource = this.cachedTextureBlueprintAndIconResource;
 }
Пример #15
0
 public override void ClientSetupBlueprint(Tile tile, IClientBlueprint blueprint)
 {
     blueprint.SpriteRenderer.TextureResource = this.ClientGetTextureForTile(tile);
 }
Пример #16
0
        public override void ClientSetupBlueprint(Tile tile, IClientBlueprint blueprint)
        {
            base.ClientSetupBlueprint(tile, blueprint);

            if (!ConstructionPlacementSystem.IsObjectPlacementComponentEnabled)
            {
                return;
            }

            // display area only when player placing a blueprint
            Color color;
            var   sizeWithGraceArea = this.LandClaimWithGraceAreaSize;

            if (blueprint.IsCanBuild)
            {
                color = BlueprintAreaColorGreen;
                ClientBlueprintAreaRenderingMaterial.EffectParameters.Set("Color", color);
                CreateBlueprintAreaRenderer(ClientBlueprintAreaRenderingMaterial, this.LandClaimSize);
                CreateBlueprintAreaRenderer(ClientBlueprintGraceAreaRenderingMaterial, sizeWithGraceArea);

                // can build a land claim area, but highlight the restricted tiles
                var world             = Client.World;
                var startTilePosition = tile.Position;
                var halfSize          = sizeWithGraceArea / 2;
                for (var x = 1 - halfSize; x <= halfSize; x++)
                {
                    for (var y = 1 - halfSize; y <= halfSize; y++)
                    {
                        var checkTile = world.GetTile(startTilePosition.X + x,
                                                      startTilePosition.Y + y,
                                                      logOutOfBounds: false);
                        ProcessFutureLandClaimAreaTile(checkTile, x, y);
                    }
                }
            }
            else // cannot build a land claim there
            {
                color = BlueprintAreaColorRed;
                ClientBlueprintAreaRenderingMaterial.EffectParameters.Set("Color", color);
                CreateBlueprintAreaRenderer(ClientBlueprintAreaRenderingMaterial,
                                            size: sizeWithGraceArea);
            }

            void CreateBlueprintAreaRenderer(RenderingMaterial renderingMaterial, int size)
            {
                var offset        = LandClaimSystem.SharedCalculateLandClaimObjectCenterTilePosition(Vector2Ushort.Zero, this);
                var areaBlueprint = Api.Client.Rendering.CreateSpriteRenderer(
                    blueprint.SceneObject,
                    null,
                    DrawOrder.Overlay);

                areaBlueprint.RenderingMaterial           = renderingMaterial;
                areaBlueprint.SortByWorldPosition         = false;
                areaBlueprint.IgnoreTextureQualityScaling = true;
                areaBlueprint.Scale = size;

                areaBlueprint.PositionOffset = (offset.X - size / 2,
                                                offset.Y - size / 2);
            }

            void ProcessFutureLandClaimAreaTile(Tile checkTile, int offsetX, int offsetY)
            {
                if (!checkTile.IsValidTile)
                {
                    return;
                }

                var isRestrictedTile = IsRestrictedTile(checkTile);

                if (!isRestrictedTile)
                {
                    foreach (var neighborTile in checkTile.EightNeighborTiles)
                    {
                        if (IsRestrictedTile(neighborTile))
                        {
                            isRestrictedTile = true;
                            break;
                        }
                    }
                }

                if (!isRestrictedTile)
                {
                    return;
                }

                // display red tile as player cannot construct there
                var tileRenderer = Api.Client.Rendering.CreateSpriteRenderer(
                    blueprint.SceneObject,
                    ClientLandClaimGroupRenderer.TextureResourceLandClaimAreaCell,
                    DrawOrder.Overlay);

                tileRenderer.RenderingMaterial           = ClientBlueprintRestrictedTileRenderingMaterial;
                tileRenderer.SortByWorldPosition         = false;
                tileRenderer.IgnoreTextureQualityScaling = true;
                tileRenderer.Scale          = 1;
                tileRenderer.PositionOffset = (offsetX, offsetY);
            }

            bool IsRestrictedTile(Tile t)
            => t.IsCliffOrSlope ||
            t.ProtoTile.Kind != TileKind.Solid ||
            t.ProtoTile.IsRestrictingConstruction;
        }
        public static void SetupBlueprint(
            Tile tile,
            IClientBlueprint blueprint,
            IProtoObjectLandClaim protoObjectLandClaim)
        {
            if (!blueprint.IsEnabled)
            {
                return;
            }

            var sceneObject       = blueprint.SceneObject;
            var world             = Api.Client.World;
            var rendering         = Api.Client.Rendering;
            var character         = ClientCurrentCharacterHelper.Character;
            var startTilePosition = LandClaimSystem.SharedCalculateLandClaimObjectCenterTilePosition(
                tile.Position,
                protoObjectLandClaim);
            var sizeWithGraceArea   = protoObjectLandClaim.LandClaimWithGraceAreaSize;
            var blueprintAreaBounds = LandClaimSystem.SharedCalculateLandClaimAreaBounds(startTilePosition,
                                                                                         sizeWithGraceArea);

            SetupBoundsForLandClaimsInScope(sceneObject,
                                            sceneObjectPosition: tile.Position.ToVector2D(),
                                            startTilePosition,
                                            blueprintAreaBounds,
                                            protoObjectLandClaim);

            using var tempListExceptBounds = Api.Shared.GetTempList <RectangleInt>();
            CollectLabelExclusionBoundsForBlueprint(blueprintAreaBounds, tempListExceptBounds.AsList());

            ClientLandClaimAreaManager.AddBlueprintRenderer(startTilePosition,
                                                            protoObjectLandClaim);

            // additionally highlight the restricted tiles
            var halfSize = sizeWithGraceArea / 2;

            for (var x = 1 - halfSize; x <= halfSize; x++)
            {
                for (var y = 1 - halfSize; y <= halfSize; y++)
                {
                    var checkTile = world.GetTile(startTilePosition.X + x,
                                                  startTilePosition.Y + y,
                                                  logOutOfBounds: false);
                    ProcessFutureLandClaimAreaTile(checkTile, x, y);
                }
            }

            AddBoundSquares(sceneObject,
                            protoObjectLandClaim,
                            positionOffset: (0, 0));
            AddBoundLabels(sceneObject,
                           sceneObjectPosition: tile.Position.ToVector2D(),
                           exceptBounds: tempListExceptBounds.AsList(),
                           protoObjectLandClaim,
                           positionOffset: (0, 0));

            void ProcessFutureLandClaimAreaTile(Tile checkTile, int offsetX, int offsetY)
            {
                if (!checkTile.IsValidTile)
                {
                    return;
                }

                var isRestrictedTile = IsRestrictedTile(checkTile);

                if (!isRestrictedTile)
                {
                    foreach (var neighborTile in checkTile.EightNeighborTiles)
                    {
                        if (IsRestrictedTile(neighborTile))
                        {
                            isRestrictedTile = true;
                            break;
                        }
                    }
                }

                if (!isRestrictedTile)
                {
                    return;
                }

                // display red tile as player cannot construct there
                var tileRenderer = rendering.CreateSpriteRenderer(
                    sceneObject,
                    ClientLandClaimGroupRenderer.TextureResourceLandClaimAreaCell,
                    DrawOrder.Overlay);

                tileRenderer.RenderingMaterial   = ClientBlueprintRestrictedTileRenderingMaterial;
                tileRenderer.SortByWorldPosition = false;
                tileRenderer.Scale          = 1;
                tileRenderer.PositionOffset = (offsetX + 1, offsetY + 1);
            }

            bool IsRestrictedTile(Tile t)
            => t.IsCliffOrSlope ||
            t.ProtoTile.Kind != TileKind.Solid ||
            t.ProtoTile.IsRestrictingConstruction ||
            !LandClaimSystem.SharedIsPositionInsideOwnedOrFreeArea(
                t.Position,
                character,
                addGracePaddingWithoutBuffer: true);
        }
Пример #18
0
 /// <summary>
 /// Gets the texture used for construction place selection (blueprint). Usually the same texture is used for the object
 /// rendering as well.
 /// </summary>
 /// <param name="tile">World tile.</param>
 public virtual void ClientSetupBlueprint(Tile tile, IClientBlueprint blueprint)
 {
     blueprint.SpriteRenderer.TextureResource = this.DefaultTexture;
     this.ClientSetupRenderer(blueprint.SpriteRenderer);
 }
Пример #19
0
 public sealed override void ClientSetupBlueprint(Tile tile, IClientBlueprint blueprint)
 {
     base.ClientSetupBlueprint(tile, blueprint);
     this.ClientSetupExplosionBlueprint(tile, blueprint);
 }