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