Пример #1
0
        public override int GetRandomColor(ICoreClientAPI capi, BlockPos pos, BlockFacing facing)
        {
            BakedCompositeTexture tex = Textures?.First().Value?.Baked;
            int color = capi.BlockTextureAtlas.GetRandomPixel(tex.TextureSubId);

            color = capi.ApplyColorTintOnRgba(1, color, pos.X, pos.Y, pos.Z);

            return(color);
        }
Пример #2
0
        public override int GetRandomColor(ICoreClientAPI capi, BlockPos pos, BlockFacing facing)
        {
            Dictionary <string, CompositeTexture> textures = this.Textures;
            BakedCompositeTexture compositeTexture         = textures != null?textures.First <KeyValuePair <string, CompositeTexture> >().Value?.Baked : (BakedCompositeTexture)null;

            int randomColor = capi.BlockTextureAtlas.GetRandomColor(compositeTexture.TextureSubId);

            return(this.FirstCodePart() == "palmfrond" ? capi.ApplyColorTintOnRgba(1, randomColor, pos.X, pos.Y, pos.Z, true) : randomColor);
        }
Пример #3
0
        public override int GetRandomColor(ICoreClientAPI capi, BlockPos pos, BlockFacing facing, int rndIndex = -1)
        {
            BakedCompositeTexture tex = Textures?.First().Value?.Baked;
            int color = capi.BlockTextureAtlas.GetRandomColor(tex.TextureSubId, rndIndex);

            color = capi.World.ApplyColorMapOnRgba(ClimateColorMap, SeasonColorMap, color, pos.X, pos.Y, pos.Z);

            return(color);
        }
Пример #4
0
        /// <summary>
        /// Should return a random pixel within the items/blocks texture
        /// </summary>
        /// <param name="world"></param>
        /// <param name="pos"></param>
        /// <param name="facing"></param>
        /// <param name="tintIndex"></param>
        /// <returns></returns>
        public override int GetRandomColor(ICoreClientAPI capi, ItemStack stack)
        {
            if (Textures == null || Textures.Count == 0)
            {
                return(0);
            }

            BakedCompositeTexture tex = Textures?.First().Value?.Baked;

            return(tex == null ? 0 : capi.ItemTextureAtlas.GetRandomColor(tex.TextureSubId));
        }
Пример #5
0
        public static MeshData CreateMesh(ICoreClientAPI coreClientAPI, List <uint> voxelCuboids, int[] materials, BlockPos posForRnd = null)
        {
            MeshData mesh = new MeshData(24, 36, false).WithColorMaps().WithRenderpasses().WithXyzFaces();

            if (voxelCuboids == null || materials == null)
            {
                return(mesh);
            }
            CuboidWithMaterial cwm = tmpCuboid;

            for (int i = 0; i < voxelCuboids.Count; i++)
            {
                FromUint(voxelCuboids[i], cwm);

                Block block = coreClientAPI.World.GetBlock(materials[cwm.Material]);

                float subPixelPaddingx = coreClientAPI.BlockTextureAtlas.SubPixelPaddingX;
                float subPixelPaddingy = coreClientAPI.BlockTextureAtlas.SubPixelPaddingY;

                int altNum = 0;

                if (block.HasAlternates && posForRnd != null)
                {
                    int altcount = 0;
                    foreach (var val in block.Textures)
                    {
                        BakedCompositeTexture bct = val.Value.Baked;
                        if (bct.BakedVariants == null)
                        {
                            continue;
                        }
                        altcount = Math.Max(altcount, bct.BakedVariants.Length);
                    }

                    altNum = block.RandomizeAxes == EnumRandomizeAxes.XYZ ? GameMath.MurmurHash3Mod(posForRnd.X, posForRnd.Y, posForRnd.Z, altcount) : GameMath.MurmurHash3Mod(posForRnd.X, 0, posForRnd.Z, altcount);
                }

                MeshData cuboidmesh = genCube(
                    cwm.X1, cwm.Y1, cwm.Z1,
                    cwm.X2 - cwm.X1, cwm.Y2 - cwm.Y1, cwm.Z2 - cwm.Z1,
                    coreClientAPI,
                    coreClientAPI.Tesselator.GetTexSource(block, altNum, true),
                    subPixelPaddingx,
                    subPixelPaddingy,
                    block
                    );

                mesh.AddMeshData(cuboidmesh);
            }

            return(mesh);
        }
        public override int GetRandomColor(ICoreClientAPI capi, BlockPos pos, BlockFacing facing, int rndIndex = -1)
        {
            if (Textures == null || Textures.Count == 0)
            {
                return(0);
            }
            BakedCompositeTexture tex = Textures?.First().Value?.Baked;

            if (tex == null)
            {
                return(0);
            }

            int color = capi.BlockTextureAtlas.GetRandomColor(tex.TextureSubId, rndIndex);

            color = capi.World.ApplyColorMapOnRgba("climatePlantTint", SeasonColorMap, color, pos.X, pos.Y, pos.Z);
            return(color);
        }
Пример #7
0
        public override void OnLoaded(ICoreAPI api)
        {
            paintableOnBlockMaterials = new EnumBlockMaterial[onmaterialsStrTmp.Length];
            for (int i = 0; i < onmaterialsStrTmp.Length; i++)
            {
                if (onmaterialsStrTmp[i] == null)
                {
                    continue;
                }
                try
                {
                    paintableOnBlockMaterials[i] = (EnumBlockMaterial)Enum.Parse(typeof(EnumBlockMaterial), onmaterialsStrTmp[i]);
                }
                catch (Exception)
                {
                    api.Logger.Warning("ArtPigment behavior for collectible {0}, paintable on material {1} is not a valid block material, will default to stone", collObj.Code, onmaterialsStrTmp[i]);
                    paintableOnBlockMaterials[i] = EnumBlockMaterial.Stone;
                }
            }
            onmaterialsStrTmp = null;

            var capi = api as ICoreClientAPI;

            foreach (var loc in decorCodesTmp)
            {
                if (loc.Path.Contains("*"))
                {
                    Block[] blocks = api.World.SearchBlocks(loc);
                    foreach (var block in blocks)
                    {
                        decorBlocks.Add(block);
                        //Console.WriteLine("\"/bir remapq " + block.Code.ToShortString() + " drawnart"+block.Variant["material"]+"-1-" + block.Variant["row"] +"-" + block.Variant["col"] + " force\",");
                    }
                    if (blocks.Length == 0)
                    {
                        api.Logger.Warning("ArtPigment behavior for collectible {0}, decor {1}, no such block using this wildcard found", collObj.Code, loc);
                    }
                }
                else
                {
                    Block block = api.World.GetBlock(loc);
                    if (block == null)
                    {
                        api.Logger.Warning("ArtPigment behavior for collectible {0}, decor {1} is not a loaded block", collObj.Code, loc);
                    }
                    else
                    {
                        decorBlocks.Add(block);
                    }
                }
            }

            if (api.Side == EnumAppSide.Client)
            {
                if (decorBlocks.Count > 0)
                {
                    BakedCompositeTexture tex = decorBlocks[0].Textures["up"].Baked;
                    texPos = capi.BlockTextureAtlas.Positions[tex.TextureSubId];
                }
                else
                {
                    texPos = capi.BlockTextureAtlas.UnknownTexturePosition;
                }
            }

            AssetLocation blockCode = collObj.Code;

            toolModes = new SkillItem[decorBlocks.Count];
            for (int i = 0; i < toolModes.Length; i++)
            {
                toolModes[i] = new SkillItem()
                {
                    Code          = blockCode.CopyWithPath("art" + i), // Unique code, it doesn't really matter what it is
                    Linebreak     = i % GlobalConstants.CaveArtColsPerRow == 0,
                    Name          = "",                                // No name - alternatively each icon could be given a name? But discussed in meeting on 6/6/21 and decided it is better for players to assign their own meanings to the icons
                    Data          = decorBlocks[i],
                    RenderHandler = (AssetLocation code, float dt, double atPosX, double atPosY) =>
                    {
                        float  wdt = (float)GuiElement.scaled(GuiElementPassiveItemSlot.unscaledSlotSize);
                        string id  = code.Path.Substring(3);
                        capi.Render.Render2DTexture(meshes[int.Parse(id)], texPos.atlasTextureId, (float)atPosX, (float)atPosY, wdt, wdt);
                    }
                };
            }


            if (capi != null)
            {
                meshes = new MeshRef[decorBlocks.Count];

                for (int i = 0; i < meshes.Length; i++)
                {
                    MeshData mesh = genMesh(i);
                    meshes[i] = capi.Render.UploadMesh(mesh);
                }
            }
        }