From cf77649ccd6107c9048fcad0ab9985429112731e Mon Sep 17 00:00:00 2001 From: SuperSoupr <26164930+SuperSoupr@users.noreply.github.com> Date: Sat, 11 Jul 2026 13:17:13 +0300 Subject: [PATCH 01/17] organize BlockColored & sided textures support --- .../common/blocks/BlockColored.java | 202 +++++++++++------- .../render/BlockColoredTexture.java | 14 +- 2 files changed, 128 insertions(+), 88 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java index 3e65ca24f..e52b8414d 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import javax.annotation.Nullable; @@ -16,6 +17,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.StatCollector; import net.minecraft.world.IBlockAccess; @@ -45,12 +47,17 @@ public class BlockColored extends Block { protected Block base; - private final float colorMultiplier; + private String baseModID; + private String baseName; + private boolean initialized = true; + public String textureOverrideDomain; + public String textureOverrideName; + private IIcon[] icons; + private int baseMeta; + private final float colorMultiplier; public static final float DEFAULT_BRIGHTNESS = 1.5f; - public static final ArrayList COLORED_BLOCKS = new ArrayList<>(); - private static final HashMap BASES_TO_COLORED = new HashMap<>(); public BlockColored(Block base) { @@ -58,9 +65,13 @@ public BlockColored(Block base) { } public BlockColored(Block base, float colorMultiplier) { + this(base, colorMultiplier, 0); + } + public BlockColored(Block base, float colorMultiplier, int baseMeta) { super(base.getMaterial()); this.base = base; this.colorMultiplier = colorMultiplier; + this.baseMeta = baseMeta; setHardness(base.getBlockHardness(null, 0, 0, 0)); // This dumb ratio is due to the random scalars present in both get and set resistance. @@ -72,15 +83,6 @@ public BlockColored(Block base, float colorMultiplier) { BASES_TO_COLORED.put(base, this); } - private String baseModID; - - private String baseName; - - private boolean initialized = true; - - public String textureOverrideDomain; - - public String textureOverrideName; public BlockColored(String baseModID, String baseName, float colorMultiplier, @Nullable String textureDomain, @Nullable String textureName) { @@ -124,29 +126,6 @@ public void initFromString() { BASES_TO_COLORED.put(base, this); } - @Override - public int damageDropped(int meta) { - // TODO revert if https://github.com/GTMEGA/EndlessIDs/issues/291 is solved - return meta & 0b0_11111_11111_11111; - // return meta; - } - - @SideOnly(Side.CLIENT) - @Override - public void registerBlockIcons(IIconRegister reg) { - String textureName; - if (base != null) { - textureName = ((AccessorBlock_Client) base).uie$getTextureName() + "_colored_grayscale"; - } else { - textureName = baseModID + "_" + baseName + "_colored_grayscale"; - } - blockIcon = new BlockColoredTexture(textureName, this, colorMultiplier); - - if (!(reg instanceof TextureMap tm)) return; - - tm.setTextureEntry(textureName, (TextureAtlasSprite) blockIcon); - } - // Util methods public static boolean allowDyingBlocks() { return Mods.EndlessIDs.isLoaded() && ColoredBlocksConfig.INSTANCE.enablePaintRoller @@ -201,54 +180,7 @@ public static BlockColored getColoredVersion(Block block) { } // - @Override - @SideOnly(Side.CLIENT) - public void getSubBlocks(Item itemIn, CreativeTabs tab, List list) { - if (allowDyingBlocks()) { - list.add(new ItemStack(itemIn, 1, 0b0_11111_11111_11111)); - } else { - for (int i = 0; i < 16; ++i) { - list.add(new ItemStack(itemIn, 1, i)); - } - } - } - - @Override - @SideOnly(Side.CLIENT) - public int colorMultiplier(IBlockAccess worldIn, int x, int y, int z) { - if (allowDyingBlocks()) { - return getRGBFromEIDMeta(worldIn.getBlockMetadata(x, y, z)); - } - - int meta = worldIn.getBlockMetadata(x, y, z); - return ColorUtils.getHexColorFromWoolMeta(meta); - } - - @Override - @SideOnly(Side.CLIENT) - public int getRenderColor(int meta) { - return allowDyingBlocks() ? getRGBFromEIDMeta(meta) : ColorUtils.getHexColorFromWoolMeta(meta); - } - - @Override - public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z, EntityPlayer player) { - ItemStack held = player.getHeldItem(); - if (held != null && held.getItem() instanceof ItemPaintRoller) { - PacketHandler.INSTANCE.sendToServer( - new PaintRollerColorSelect( - usesExtraBit() ? getRGBFromEIDMetaWithExtraBit(world.getBlockMetadata(x, y, z)) - : getRGBFromEIDMeta(world.getBlockMetadata(x, y, z)))); - return null; - } - - // TODO revert if https://github.com/GTMEGA/EndlessIDs/issues/291 is solved - ItemStack result = super.getPickBlock(target, world, x, y, z, player); - result.setItemDamage(result.getItemDamage() & 0b0_11111_11111_11111); - - return result; - // return super.getPickBlock(target, world, x, y, z, player); - } - + // BlockColored-specific methods public Block getBase() { return base; } @@ -265,6 +197,7 @@ public boolean useNEIPage() { return true; } + // Item public static class ItemBlockColored extends ItemBlock { public ItemBlockColored(Block block) { @@ -303,6 +236,7 @@ public void addInformation(ItemStack stack, EntityPlayer player, List to } } + // Config colored blocks handling public static final ArrayList CONFIG_COLORED_BLOCKS = new ArrayList<>(); public static void registerConfigBlocks() { @@ -350,6 +284,108 @@ public static void initColoredBlocks() { RecipeLoader.loadColoredBlockRecipes(); } + // Implementations of Block methods + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister reg) { + if (!(reg instanceof TextureMap tm)) return; + + if (base != null) { + IIcon[] icons = new IIcon[6]; + HashSet names = new HashSet<>(); + + for (int i = 0; i < 6; i++) { + icons[i] = base.getIcon(i, this.baseMeta); + names.add(icons[i].getIconName()); + } + + HashMap iconMap = new HashMap<>(); + for (String name : names) { + String textureName = UtilitiesInExcess.MODID + ":" + name.replace(':', '_') + "_colored_grayscale"; + BlockColoredTexture icon = new BlockColoredTexture(textureName, name, this, colorMultiplier); + tm.setTextureEntry(textureName, icon); + iconMap.put(name, icon); + } + + for (int i = 0; i < 6; i++) { + icons[i] = iconMap.get(icons[i].getIconName()); + } + + this.icons = icons; + this.blockIcon = icons[0]; + } else { + String textureName = UtilitiesInExcess.MODID + ":" + baseModID + "_" + baseName + "_colored_grayscale"; + blockIcon = new BlockColoredTexture(textureName, this, colorMultiplier); + + tm.setTextureEntry(textureName, (TextureAtlasSprite) blockIcon); + } + } + + @Override + @SideOnly(Side.CLIENT) + public int colorMultiplier(IBlockAccess worldIn, int x, int y, int z) { + if (allowDyingBlocks()) { + return getRGBFromEIDMeta(worldIn.getBlockMetadata(x, y, z)); + } + + int meta = worldIn.getBlockMetadata(x, y, z); + return ColorUtils.getHexColorFromWoolMeta(meta); + } + + @Override + @SideOnly(Side.CLIENT) + public int getRenderColor(int meta) { + return allowDyingBlocks() ? getRGBFromEIDMeta(meta) : ColorUtils.getHexColorFromWoolMeta(meta); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + if (icons != null) { + return icons[side]; + } + + return this.blockIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item itemIn, CreativeTabs tab, List list) { + if (allowDyingBlocks()) { + list.add(new ItemStack(itemIn, 1, 0b0_11111_11111_11111)); + } else { + for (int i = 0; i < 16; ++i) { + list.add(new ItemStack(itemIn, 1, i)); + } + } + } + + @Override + public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z, EntityPlayer player) { + ItemStack held = player.getHeldItem(); + if (held != null && held.getItem() instanceof ItemPaintRoller) { + PacketHandler.INSTANCE.sendToServer( + new PaintRollerColorSelect( + usesExtraBit() ? getRGBFromEIDMetaWithExtraBit(world.getBlockMetadata(x, y, z)) + : getRGBFromEIDMeta(world.getBlockMetadata(x, y, z)))); + return null; + } + + // TODO revert if https://github.com/GTMEGA/EndlessIDs/issues/291 is solved + ItemStack result = super.getPickBlock(target, world, x, y, z, player); + result.setItemDamage(result.getItemDamage() & 0b0_11111_11111_11111); + + return result; + // return super.getPickBlock(target, world, x, y, z, player); + } + + @Override + public int damageDropped(int meta) { + // TODO revert if https://github.com/GTMEGA/EndlessIDs/issues/291 is solved + return meta & 0b0_11111_11111_11111; + // return meta; + } + // Redirects of Block methods @Override public int getFlammability(IBlockAccess world, int x, int y, int z, ForgeDirection face) { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/render/BlockColoredTexture.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/BlockColoredTexture.java index 748376d4d..098864f10 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/render/BlockColoredTexture.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/BlockColoredTexture.java @@ -19,6 +19,13 @@ public class BlockColoredTexture extends TextureAtlasSprite { private final BlockColored block; private final float colorMultiplier; + private String baseName; + + public BlockColoredTexture(String name, String baseName, BlockColored block, float colorMultiplier) { + this.baseName = baseName; + this(name, block, colorMultiplier); + } + public BlockColoredTexture(String name, BlockColored block, float colorMultiplier) { super(name); this.block = block; @@ -37,11 +44,8 @@ public boolean load(IResourceManager manager, ResourceLocation location) { if (block.textureOverrideName != null) { baseLocation = new ResourceLocation(block.textureOverrideDomain, block.textureOverrideName); } else { - String textureName = ((AccessorBlock_Client) block.getBase()).uie$getTextureName(); - textureName = textureName.equals("planks") ? textureName + "_oak" : textureName; - textureName = textureName.equals("quartz_block") ? textureName + "_top" : textureName; - textureName = textureName.equals("redstone_lamp_off") ? "redstone_lamp_on" : textureName; - baseLocation = new ResourceLocation("textures/blocks/" + textureName + ".png"); + ResourceLocation temp = new ResourceLocation(baseName); + baseLocation = new ResourceLocation(temp.getResourceDomain(), "textures/blocks/" + temp.getResourcePath() + ".png"); } BufferedImage img = ImageIO.read( From e2ee8a81bceadcb8db9c1a4e6e97c5f0e24030ee Mon Sep 17 00:00:00 2001 From: SuperSoupr <26164930+SuperSoupr@users.noreply.github.com> Date: Sun, 12 Jul 2026 18:02:25 +0300 Subject: [PATCH 02/17] angelica CTM support & base block meta support --- dependencies.gradle | 4 +- .../utilitiesinexcess/ClientProxy.java | 4 + .../utilitiesinexcess/ModBlocks.java | 5 + .../utilitiesinexcess/ModItems.java | 5 + .../utilitiesinexcess/UtilitiesInExcess.java | 2 +- .../utilitiesinexcess/client/IMCForNEI.java | 16 +- .../common/IUIERegistered.java | 11 ++ .../common/blocks/BlockColored.java | 164 +++++++++++++----- .../common/blocks/BlockColoredCTM.java | 43 +++++ .../common/blocks/BlockColoredWithUse.java | 49 ++++++ .../common/blocks/BlockDecorative.java | 1 + .../common/blocks/BlockDecorativeGlass.java | 1 + .../blocks/BlockLapisAetheriusDyable.java | 36 ++-- .../common/items/ItemPaintRoller.java | 45 +++-- .../common/recipe/RecipeLoader.java | 25 ++- .../recipe/RecipePaintRollerToPaint.java | 7 +- .../utilitiesinexcess/compat/Mods.java | 3 +- .../coloredblocks/CTMForColoredBlocks.java | 48 +++++ .../coloredblocks/PropertiesFileColored.java | 51 ++++++ .../coloredblocks/TileLoaderColored.java | 56 ++++++ .../waila/ColoredBlocksDataProvider.java | 10 +- .../render/BlockColoredTexture.java | 76 ++++---- .../assets/utilitiesinexcess/lang/en_US.lang | 1 + 23 files changed, 514 insertions(+), 149 deletions(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/IUIERegistered.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredCTM.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredWithUse.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/angelica/coloredblocks/CTMForColoredBlocks.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/angelica/coloredblocks/PropertiesFileColored.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/angelica/coloredblocks/TileLoaderColored.java diff --git a/dependencies.gradle b/dependencies.gradle index c93eaaaaa..c27ee6446 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -41,7 +41,7 @@ dependencies { implementation('curse.maven:cofh-lib-220333:2388748') compileOnly("com.github.GTNewHorizons:CraftTweaker:3.4.7:dev") compileOnly('thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev') - compileOnly('com.github.GTNewHorizons:Angelica:2.1.49:dev') + compileOnly('com.github.GTNewHorizons:Angelica:2.1.53:dev') compileOnly("com.github.GTNewHorizons:FindIt:1.4.3:dev") compileOnly('com.github.GTNewHorizons:TinkersConstruct:1.14.93-GTNH:dev') compileOnly('com.github.GTNewHorizons:ForgeMultipart:1.7.10:dev') {transitive = false} @@ -55,7 +55,7 @@ dependencies { devOnlyNonPublishable("com.github.GTNewHorizons:NotEnoughItems:2.8.110-GTNH:dev") devOnlyNonPublishable("com.github.GTNewHorizons:Baubles-Expanded:2.2.21-GTNH:dev") devOnlyNonPublishable("io.github.legacymoddingmc:unimixins:0.1.23:dev") - runtimeOnlyNonPublishable('com.github.GTNewHorizons:Angelica:2.1.49:dev') + runtimeOnlyNonPublishable('com.github.GTNewHorizons:Angelica:2.1.53:dev') // Deobf Extra Utilities, allows hodgepodge mixins to not crash. For testing feature parity and postea only. runtimeOnlyNonPublishable("curse.maven:extrautilities-225561:2264384") diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java index 96fc89062..e4c7a2dfb 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java @@ -18,6 +18,7 @@ import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.FMPItems; import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.item.ItemUEMultiPartRenderer; import com.fouristhenumber.utilitiesinexcess.compat.Mods; +import com.fouristhenumber.utilitiesinexcess.compat.angelica.coloredblocks.CTMForColoredBlocks; import com.fouristhenumber.utilitiesinexcess.compat.findit.FindItHelper; import com.fouristhenumber.utilitiesinexcess.compat.simpleskinbackport.SsbCompat; import com.fouristhenumber.utilitiesinexcess.compat.waila.TTRenderColoredBlock; @@ -41,6 +42,9 @@ public class ClientProxy extends CommonProxy { public void preInit(FMLPreInitializationEvent event) { super.preInit(event); ModelRegistry.registerModid(MODID); + if (Mods.Angelica.isLoaded()) { + CTMForColoredBlocks.init(); + } } @Override diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java index d2f4702a2..50e3f6d67 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java @@ -6,6 +6,7 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; +import com.fouristhenumber.utilitiesinexcess.common.IUIERegistered; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockAdvancedUpdateDetector; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockBedrockium; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockBlackoutCurtains; @@ -230,6 +231,10 @@ public static void init() { itemBlock = iblock; hasItemBlock = iblock != null; this.name = name; + + if (block instanceof IUIERegistered iUIERegistered) { + iUIERegistered.setRegistryName(name); + } } /** diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModItems.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModItems.java index e08efe908..630fe0d99 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModItems.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModItems.java @@ -4,6 +4,7 @@ import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; +import com.fouristhenumber.utilitiesinexcess.common.IUIERegistered; import com.fouristhenumber.utilitiesinexcess.common.items.ItemAnalyzer; import com.fouristhenumber.utilitiesinexcess.common.items.ItemArchitectsWand; import com.fouristhenumber.utilitiesinexcess.common.items.ItemBedrockiumIngot; @@ -93,6 +94,10 @@ public static void init() { if (item.isEnabled()) { item.theItem.setCreativeTab(UtilitiesInExcess.uieTab); GameRegistry.registerItem(item.get(), item.name); + + if (item.theItem instanceof IUIERegistered iUIERegistered) { + iUIERegistered.setRegistryName(item.name); + } } } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java index c20cca069..bb0cd4835 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java @@ -37,7 +37,7 @@ version = Tags.VERSION, name = "UtilitiesInExcess", acceptedMinecraftVersions = "[1.7.10]", - dependencies = "required-after:gtnhlib@[0.9.9,);after:ForgeMicroblock;after:Waila;after:NotEnoughItems@[2.8.108-GTNH,);") + dependencies = "required-after:gtnhlib@[0.9.9,);after:ForgeMicroblock;after:Waila;after:NotEnoughItems@[2.8.108-GTNH,);after:angelica@[2.1.53,);") public class UtilitiesInExcess { public static final String MODID = "utilitiesinexcess"; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java index ee1cebd0b..3f485b073 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java @@ -2,12 +2,10 @@ import net.minecraft.nbt.NBTTagCompound; -import com.fouristhenumber.utilitiesinexcess.ModBlocks; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockColored; import com.fouristhenumber.utilitiesinexcess.compat.Mods; import com.fouristhenumber.utilitiesinexcess.config.blocks.ColoredBlocksConfig; import com.fouristhenumber.utilitiesinexcess.config.items.InversionConfig; -import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorBlock; import cpw.mods.fml.common.event.FMLInterModComms; @@ -280,18 +278,8 @@ public static void IMCSender() { if (ColoredBlocksConfig.INSTANCE.enableColoredBlocks && BlockColored.allowDyingBlocks()) { sendInfoPage("", "uie.nei.infopage.paint_roller"); - for (ModBlocks modBlock : ModBlocks.VALUES) { - if (modBlock.get() instanceof BlockColored bc && bc.useNEIPage() - && !modBlock.name() - .equals("COLORED_STONE_BRICKS")) { - sendInfoPage("utilitiesinexcess:" + modBlock.name(), "uie.nei.infopage.colored_blocks.dyeable"); - } - } - - for (BlockColored block : BlockColored.CONFIG_COLORED_BLOCKS) { - sendInfoPage( - "utilitiesinexcess:" + ((AccessorBlock) block).uie$getUnlocalizedNameRaw(), - "uie.nei.infopage.colored_blocks.dyeable"); + for (BlockColored block : BlockColored.COLORED_BLOCKS) { + sendInfoPage("utilitiesinexcess:" + block.getRegistryName(), "uie.nei.infopage.colored_blocks.dyeable"); } } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/IUIERegistered.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/IUIERegistered.java new file mode 100644 index 000000000..c4f841984 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/IUIERegistered.java @@ -0,0 +1,11 @@ +package com.fouristhenumber.utilitiesinexcess.common; + +/** + * A simple interface for making sure block and item instances can access their registry names. + */ +public interface IUIERegistered { + + void setRegistryName(String name); + + String getRegistryName(); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java index e52b8414d..6e838c3bd 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java @@ -26,13 +26,13 @@ import com.cleanroommc.modularui.utils.Color; import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.common.IUIERegistered; import com.fouristhenumber.utilitiesinexcess.common.items.ItemPaintRoller; import com.fouristhenumber.utilitiesinexcess.common.recipe.RecipeLoader; import com.fouristhenumber.utilitiesinexcess.compat.Mods; import com.fouristhenumber.utilitiesinexcess.compat.endlessids.EIDsHelper; import com.fouristhenumber.utilitiesinexcess.config.blocks.ColoredBlocksConfig; import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorBlock; -import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorBlock_Client; import com.fouristhenumber.utilitiesinexcess.network.PacketHandler; import com.fouristhenumber.utilitiesinexcess.network.client.PaintRollerColorSelect; import com.fouristhenumber.utilitiesinexcess.render.BlockColoredTexture; @@ -44,33 +44,34 @@ // These are intentionally not ore dictionary'd to their originals // to avoid flooding nei crafting recipes with them. -public class BlockColored extends Block { +public class BlockColored extends Block implements IUIERegistered { - protected Block base; + protected BaseBlock base; private String baseModID; private String baseName; private boolean initialized = true; public String textureOverrideDomain; public String textureOverrideName; private IIcon[] icons; - private int baseMeta; + private int baseMeta = 0; - private final float colorMultiplier; + private final float brightnessMultiplier; public static final float DEFAULT_BRIGHTNESS = 1.5f; public static final ArrayList COLORED_BLOCKS = new ArrayList<>(); - private static final HashMap BASES_TO_COLORED = new HashMap<>(); + private static final HashMap BASES_TO_COLORED = new HashMap<>(); public BlockColored(Block base) { this(base, DEFAULT_BRIGHTNESS); } - public BlockColored(Block base, float colorMultiplier) { - this(base, colorMultiplier, 0); + public BlockColored(Block base, float brightnessMultiplier) { + this(base, brightnessMultiplier, 0); } - public BlockColored(Block base, float colorMultiplier, int baseMeta) { + + public BlockColored(Block base, float brightnessMultiplier, int baseMeta) { super(base.getMaterial()); - this.base = base; - this.colorMultiplier = colorMultiplier; + this.base = baseOf(base, baseMeta); + this.brightnessMultiplier = brightnessMultiplier; this.baseMeta = baseMeta; setHardness(base.getBlockHardness(null, 0, 0, 0)); @@ -80,14 +81,13 @@ public BlockColored(Block base, float colorMultiplier, int baseMeta) { setBlockName(((AccessorBlock) base).uie$getUnlocalizedNameRaw() + "_colored"); COLORED_BLOCKS.add(this); - BASES_TO_COLORED.put(base, this); + BASES_TO_COLORED.put(baseOf(base, baseMeta), this); } - - public BlockColored(String baseModID, String baseName, float colorMultiplier, @Nullable String textureDomain, + public BlockColored(String baseModID, String baseName, float brightnessMultiplier, @Nullable String textureDomain, @Nullable String textureName) { super(Material.rock); - this.colorMultiplier = colorMultiplier; + this.brightnessMultiplier = brightnessMultiplier; this.baseModID = baseModID; this.baseName = baseName; this.initialized = false; @@ -99,7 +99,7 @@ public BlockColored(String baseModID, String baseName, float colorMultiplier, @N public void initFromString() { if (base == null) { - base = GameRegistry.findBlock(baseModID, baseName); + base = baseOf(GameRegistry.findBlock(baseModID, baseName), 0); } if (base == null) { @@ -110,14 +110,21 @@ public void initFromString() { + "\" not found. Please check the \"extraColoredBlocks\" option in your Utilities in Excess config."); } - ((AccessorBlock) this).uie$setBlockMaterial(base.getMaterial()); - this.canBlockGrass = !base.getMaterial() + ((AccessorBlock) this).uie$setBlockMaterial( + base.getBlock() + .getMaterial()); + this.canBlockGrass = !base.getBlock() + .getMaterial() .getCanBlockGrass(); - setHardness(base.getBlockHardness(null, 0, 0, 0)); + setHardness( + base.getBlock() + .getBlockHardness(null, 0, 0, 0)); // This dumb ratio is due to the random scalars present in both get and set resistance. - setResistance(base.getExplosionResistance(null) * (5f / 3f)); - setStepSound(base.stepSound); + setResistance( + base.getBlock() + .getExplosionResistance(null) * (5f / 3f)); + setStepSound(base.getBlock().stepSound); opaque = isOpaqueCube(); @@ -166,25 +173,23 @@ public static int getExtraMetaBit(int meta) { public static void setExtraMetaBit(World world, int x, int y, int z, int curMeta, boolean value) { EIDsHelper.setBlockMeta(world, x, y, z, ((value ? 1 : 0) << 15) | (curMeta & 0b0_11111_11111_11111)); - if (!world.isRemote) { - world.markBlockForUpdate(x, y, z); - } + world.markBlockForUpdate(x, y, z); } - public static boolean hasColoredVersion(Block block) { - return BASES_TO_COLORED.containsKey(block); - } - - public static BlockColored getColoredVersion(Block block) { - return BASES_TO_COLORED.get(block); + public static BlockColored getColoredVersion(Block block, int meta) { + return BASES_TO_COLORED.get(baseOf(block, meta)); } // // BlockColored-specific methods - public Block getBase() { + public BaseBlock getBase() { return base; } + public float getBrightnessMultiplier() { + return brightnessMultiplier; + } + public boolean ignoreBaseMeta() { return false; } @@ -197,6 +202,19 @@ public boolean useNEIPage() { return true; } + // IUIEModBLock + private String registryName; + + @Override + public void setRegistryName(String name) { + registryName = name; + } + + @Override + public String getRegistryName() { + return registryName; + } + // Item public static class ItemBlockColored extends ItemBlock { @@ -214,8 +232,13 @@ public int getMetadata(int damage) { @Override public String getItemStackDisplayName(ItemStack stack) { int dmg = stack.getItemDamage(); - stack.setItemDamage(0); - String name = Item.getItemFromBlock(((BlockColored) field_150939_a).getBase()) + BlockColored bc = (BlockColored) field_150939_a; + stack.setItemDamage( + bc.getBase() + .getMeta()); + String name = Item.getItemFromBlock( + bc.getBase() + .getBlock()) .getItemStackDisplayName(stack); stack.setItemDamage(dmg); @@ -269,10 +292,8 @@ public static void registerConfigBlocks() { newBlock.setCreativeTab(UtilitiesInExcess.uieTab); CONFIG_COLORED_BLOCKS.add(newBlock); COLORED_BLOCKS.add(newBlock); - GameRegistry.registerBlock( - newBlock, - ItemBlockColored.class, - ((AccessorBlock) newBlock).uie$getUnlocalizedNameRaw()); + newBlock.setRegistryName(((AccessorBlock) newBlock).uie$getUnlocalizedNameRaw()); + GameRegistry.registerBlock(newBlock, ItemBlockColored.class, newBlock.getRegistryName()); } } @@ -295,14 +316,15 @@ public void registerBlockIcons(IIconRegister reg) { HashSet names = new HashSet<>(); for (int i = 0; i < 6; i++) { - icons[i] = base.getIcon(i, this.baseMeta); + icons[i] = base.getBlock() + .getIcon(i, this.baseMeta); names.add(icons[i].getIconName()); } HashMap iconMap = new HashMap<>(); for (String name : names) { String textureName = UtilitiesInExcess.MODID + ":" + name.replace(':', '_') + "_colored_grayscale"; - BlockColoredTexture icon = new BlockColoredTexture(textureName, name, this, colorMultiplier); + BlockColoredTexture icon = new BlockColoredTexture(textureName, name, this, brightnessMultiplier); tm.setTextureEntry(textureName, icon); iconMap.put(name, icon); } @@ -315,7 +337,7 @@ public void registerBlockIcons(IIconRegister reg) { this.blockIcon = icons[0]; } else { String textureName = UtilitiesInExcess.MODID + ":" + baseModID + "_" + baseName + "_colored_grayscale"; - blockIcon = new BlockColoredTexture(textureName, this, colorMultiplier); + blockIcon = new BlockColoredTexture(textureName, this, brightnessMultiplier); tm.setTextureEntry(textureName, (TextureAtlasSprite) blockIcon); } @@ -389,44 +411,90 @@ public int damageDropped(int meta) { // Redirects of Block methods @Override public int getFlammability(IBlockAccess world, int x, int y, int z, ForgeDirection face) { - return getBase().getFlammability(world, x, y, z, face); + return getBase().getBlock() + .getFlammability(world, x, y, z, face); } @Override public int getFireSpreadSpeed(IBlockAccess world, int x, int y, int z, ForgeDirection face) { - return getBase().getFireSpreadSpeed(world, x, y, z, face); + return getBase().getBlock() + .getFireSpreadSpeed(world, x, y, z, face); } @SideOnly(Side.CLIENT) @Override public int getRenderBlockPass() { - return getBase().getRenderBlockPass(); + return getBase().getBlock() + .getRenderBlockPass(); } @Override public boolean renderAsNormalBlock() { - return getBase().renderAsNormalBlock(); + return getBase().getBlock() + .renderAsNormalBlock(); } @Override public boolean isOpaqueCube() { - return getBase() == null ? super.isOpaqueCube() : getBase().isOpaqueCube(); + return getBase() == null ? super.isOpaqueCube() + : getBase().getBlock() + .isOpaqueCube(); } @Override public boolean shouldSideBeRendered(IBlockAccess worldIn, int x, int y, int z, int side) { Block block = worldIn.getBlock(x, y, z); - return getBase().shouldSideBeRendered(worldIn, x, y, z, side) && block != this; + return getBase().getBlock() + .shouldSideBeRendered(worldIn, x, y, z, side) && block != this; } @Override public int getLightOpacity() { - return getBase().getLightOpacity(); + return getBase().getBlock() + .getLightOpacity(); } @Override public int getLightOpacity(IBlockAccess world, int x, int y, int z) { - return getBase().getLightOpacity(world, x, y, z); + return getBase().getBlock() + .getLightOpacity(world, x, y, z); } // + + public static BaseBlock baseOf(Block block, int meta) { + return new BaseBlock(block, meta); + } + + public static class BaseBlock { + + private final Block block; + private final int meta; + + public BaseBlock(Block block, int meta) { + this.block = block; + this.meta = meta; + } + + public Block getBlock() { + return block; + } + + public int getMeta() { + return meta; + } + + @Override + public boolean equals(Object o) { + if (o instanceof BaseBlock bb) { + return bb.getBlock() == block && bb.getMeta() == meta; + } else { + return false; + } + } + + @Override + public int hashCode() { + return getBlock().hashCode() + getMeta(); + } + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredCTM.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredCTM.java new file mode 100644 index 000000000..1ab647502 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredCTM.java @@ -0,0 +1,43 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import java.util.ArrayList; + +import net.minecraft.block.Block; + +import com.prupe.mcpatcher.ctm.ICTMBlock; +import com.prupe.mcpatcher.ctm.RenderBlockState; + +public class BlockColoredCTM extends BlockColoredWithUse implements ICTMBlock { + + public static final ArrayList CTM_COLORED_BLOCKS = new ArrayList<>(); + + public BlockColoredCTM(Block base) { + super(base); + CTM_COLORED_BLOCKS.add(this); + } + + public BlockColoredCTM(Block base, float brightnessMultiplier) { + super(base, brightnessMultiplier); + CTM_COLORED_BLOCKS.add(this); + } + + public BlockColoredCTM(Block base, float brightnessMultiplier, int baseMeta) { + super(base, brightnessMultiplier, baseMeta); + CTM_COLORED_BLOCKS.add(this); + } + + @Override + public boolean shouldConnectByBlock(RenderBlockState renderBlockState, Block neighbor, int neighborX, int neighborY, + int neighborZ) { + if (renderBlockState.getBlock() != neighbor) { + return false; + } + + int neighborMeta = renderBlockState.getBlockAccess() + .getBlockMetadata(neighborX, neighborY, neighborZ); + boolean extraBit1 = BlockColored.getExtraMetaBit(renderBlockState.getMetadata()) != 0; + boolean extraBit2 = BlockColored.getExtraMetaBit(neighborMeta) != 0; + return (renderBlockState.getMetadata() & 0b0_11111_11111_11111) == (neighborMeta & 0b0_11111_11111_11111) + || (extraBit1 && extraBit2); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredWithUse.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredWithUse.java new file mode 100644 index 000000000..fe35fe2ec --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredWithUse.java @@ -0,0 +1,49 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; + +public class BlockColoredWithUse extends BlockColored { + + public BlockColoredWithUse(Block base) { + super(base); + } + + public BlockColoredWithUse(Block base, float brightnessMultiplier) { + super(base, brightnessMultiplier); + } + + public BlockColoredWithUse(Block base, float brightnessMultiplier, int baseMeta) { + super(base, brightnessMultiplier, baseMeta); + } + + @Override + public boolean usesExtraBit() { + return true; + } + + @Override + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, + float subY, float subZ) { + if (player.getHeldItem() != null) return false; + + int curMeta = worldIn.getBlockMetadata(x, y, z); + boolean newExtraBit = !(getExtraMetaBit(curMeta) > 0); + setExtraMetaBit(worldIn, x, y, z, curMeta, newExtraBit); + if (!worldIn.isRemote) { + playSoundEffect(worldIn, x, y, z, newExtraBit); + } + return true; + } + + protected void playSoundEffect(World worldIn, int x, int y, int z, boolean newExtraBit) { + worldIn.playSoundEffect( + (double) x + 0.5D, + (double) y + 0.5D, + (double) z + 0.5D, + "random.click", + 0.3F, + newExtraBit ? 0.8F : 0.3F); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDecorative.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDecorative.java index 35a20cbca..356e00c2b 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDecorative.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDecorative.java @@ -30,6 +30,7 @@ public BlockDecorative() { @Override public float getBlockHardness(World worldIn, int x, int y, int z) { + if (worldIn == null) return 1f; int meta = worldIn.getBlockMetadata(x, y, z); return switch (meta) { // Obsidian diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDecorativeGlass.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDecorativeGlass.java index 4afded743..45d8f29ed 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDecorativeGlass.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDecorativeGlass.java @@ -32,6 +32,7 @@ public BlockDecorativeGlass() { @Override public float getBlockHardness(World worldIn, int x, int y, int z) { + if (worldIn == null) return 0.3f; int meta = worldIn.getBlockMetadata(x, y, z); return switch (meta) { case 5, 11 -> 4F; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockLapisAetheriusDyable.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockLapisAetheriusDyable.java index b12f17022..a5f6a17c4 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockLapisAetheriusDyable.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockLapisAetheriusDyable.java @@ -19,7 +19,7 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class BlockLapisAetheriusDyable extends BlockColored { +public class BlockLapisAetheriusDyable extends BlockColoredWithUse { public BlockLapisAetheriusDyable() { super(ModBlocks.LAPIS_AETHERIUS.get()); @@ -29,39 +29,25 @@ public BlockLapisAetheriusDyable() { setResistance(10F); } - @Override - public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, - float subY, float subZ) { - if (player.getHeldItem() != null) return false; - - int curMeta = worldIn.getBlockMetadata(x, y, z); - boolean newExtraBit = !(getExtraMetaBit(curMeta) > 0); - setExtraMetaBit(worldIn, x, y, z, curMeta, newExtraBit); - if (!worldIn.isRemote) { - worldIn.playSoundEffect( - (double) x + 0.5D, - (double) y + 0.5D, - (double) z + 0.5D, - "random.click", - 0.3F, - newExtraBit ? 0.3F : 0.8F); - } - return true; - } - @Override public boolean ignoreBaseMeta() { return true; } @Override - public boolean usesExtraBit() { - return true; + public boolean useNEIPage() { + return false; } @Override - public boolean useNEIPage() { - return false; + protected void playSoundEffect(World worldIn, int x, int y, int z, boolean newExtraBit) { + worldIn.playSoundEffect( + (double) x + 0.5D, + (double) y + 0.5D, + (double) z + 0.5D, + "random.click", + 0.3F, + newExtraBit ? 0.3F : 0.8F); } @Override diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemPaintRoller.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemPaintRoller.java index da84e9338..ceb9e09d4 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemPaintRoller.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemPaintRoller.java @@ -73,37 +73,44 @@ public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int boolean paintStripper = getPaintStripperFromStack(stack); Block block = world.getBlock(x, y, z); - Block newBlock = getNewBlock(paintStripper, block); - if (newBlock == null) return false; - BlockColored blockColored = newBlock instanceof BlockColored ? (BlockColored) newBlock - : BlockColored.getColoredVersion(newBlock); + int currentMeta = world.getBlockMetadata(x, y, z); + BlockColored.BaseBlock newBlock = getNewBlock(paintStripper, block, currentMeta); + if (newBlock == null || newBlock.getBlock() == null) return false; + BlockColored blockColored = newBlock.getBlock() instanceof BlockColored ? (BlockColored) newBlock.getBlock() + : BlockColored.getColoredVersion(newBlock.getBlock(), newBlock.getMeta()); if (blockColored == null) return false; - boolean needsIDChange = newBlock != block; + boolean needsIDChange = newBlock.getBlock() != block; int color = blockColored.usesExtraBit() ? BlockColored.getEIDMetaFromRGBWithExtraBit(getColorFromStack(stack)) : BlockColored.getEIDMetaFromRGB(getColorFromStack(stack)); if (player.isSneaking()) { - paintLine(player, world, block, x, y, z, side, paintStripper, color); + paintLine(player, world, block, currentMeta, x, y, z, paintStripper, color); } else { - paintBlock(world, needsIDChange ? Block.getIdFromBlock(newBlock) : -1, x, y, z, paintStripper ? 0 : color); + paintBlock( + world, + needsIDChange ? Block.getIdFromBlock(newBlock.getBlock()) : -1, + x, + y, + z, + paintStripper ? newBlock.getMeta() : color); } return true; } - private Block getNewBlock(boolean paintStripper, Block currentBlock) { + private BlockColored.BaseBlock getNewBlock(boolean paintStripper, Block currentBlock, int currentMeta) { if (paintStripper) { if (currentBlock instanceof BlockColored cbc) { return cbc.getBase(); } else { - return currentBlock; + return BlockColored.baseOf(currentBlock, currentMeta); } } else { if (currentBlock instanceof BlockColored) { - return currentBlock; + return BlockColored.baseOf(currentBlock, currentMeta); } else { - return BlockColored.getColoredVersion(currentBlock); + return BlockColored.baseOf(BlockColored.getColoredVersion(currentBlock, currentMeta), currentMeta); } } } @@ -120,7 +127,7 @@ private void paintBlock(World world, int setBlockID, int x, int y, int z, int co world.markBlockForUpdate(x, y, z); } - private void paintLine(EntityPlayer player, World world, Block startBlock, int x, int y, int z, int side, + private void paintLine(EntityPlayer player, World world, Block startBlock, int startMeta, int x, int y, int z, boolean paintStripper, int color) { ForgeDirection lookSide; Vec3 look = player.getLookVec(); @@ -136,20 +143,22 @@ private void paintLine(EntityPlayer player, World world, Block startBlock, int x } int blockID = -1; - Block newBlock = getNewBlock(paintStripper, startBlock); + BlockColored.BaseBlock newBlock = getNewBlock(paintStripper, startBlock, startMeta); for (int i = 0; i < 100; i++) { Block block = world .getBlock(x + (lookSide.offsetX * i), y + (lookSide.offsetY * i), z + (lookSide.offsetZ * i)); - if (block != startBlock && !(block instanceof BlockColored bc && bc.getBase() == startBlock) - && !(startBlock instanceof BlockColored bc2 && bc2.getBase() == block)) { + if (block != startBlock && !(block instanceof BlockColored bc && bc.getBase() + .getBlock() == startBlock) + && !(startBlock instanceof BlockColored bc2 && bc2.getBase() + .getBlock() == block)) { return; } int blockIDTemp = -1; - if (block != newBlock) { + if (block != newBlock.getBlock()) { if (blockID == -1) { - blockID = Block.getIdFromBlock(newBlock); + blockID = Block.getIdFromBlock(newBlock.getBlock()); } blockIDTemp = blockID; } @@ -159,7 +168,7 @@ private void paintLine(EntityPlayer player, World world, Block startBlock, int x x + (lookSide.offsetX * i), y + (lookSide.offsetY * i), z + (lookSide.offsetZ * i), - paintStripper ? 0 : color); + paintStripper ? newBlock.getMeta() : color); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java index 96ab98542..e90d82e37 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java @@ -1266,7 +1266,12 @@ private static void loadDyeableColoredBlockRecipe(BlockColored block) { ItemStack any8 = new ItemStack(block, 8, OreDictionary.WILDCARD_VALUE); // To base using water GameRegistry.addShapedRecipe( - new ItemStack(block.getBase(), 8, block.ignoreBaseMeta() ? OreDictionary.WILDCARD_VALUE : 0), + new ItemStack( + block.getBase() + .getBlock(), + 8, + block.getBase() + .getMeta()), "bbb", "bdb", "bbb", @@ -1277,9 +1282,13 @@ private static void loadDyeableColoredBlockRecipe(BlockColored block) { ItemStack anyDyed = new ItemStack(block, 1, OreDictionary.WILDCARD_VALUE); ItemStack baseItem = new ItemStack( - Item.getItemFromBlock(block.getBase()), + Item.getItemFromBlock( + block.getBase() + .getBlock()), 1, - block.ignoreBaseMeta() ? OreDictionary.WILDCARD_VALUE : 0); + block.ignoreBaseMeta() ? OreDictionary.WILDCARD_VALUE + : block.getBase() + .getMeta()); // From base to dyed using roller GameRegistry.addRecipe( new RecipePaintRollerToPaint( @@ -1309,7 +1318,8 @@ private static void loadColoredBlockRecipe(BlockColored block, ItemStack[] dyes) "bdb", "bpb", 'b', - block.getBase(), + block.getBase() + .getBlock(), 'd', dyes[15 - i], 'p', @@ -1317,7 +1327,12 @@ private static void loadColoredBlockRecipe(BlockColored block, ItemStack[] dyes) } addShapedRecipe( - new ItemStack(block.getBase(), 8), + new ItemStack( + block.getBase() + .getBlock(), + 8, + block.getBase() + .getMeta()), "bbb", "bdb", "bbb", diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipePaintRollerToPaint.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipePaintRollerToPaint.java index e870563f7..6042c3b5a 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipePaintRollerToPaint.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipePaintRollerToPaint.java @@ -21,10 +21,13 @@ public ItemStack getCraftingResult(InventoryCrafting crafting) { boolean paintStripper = ItemPaintRoller.getPaintStripperFromStack(roller); if (paintStripper) { + BlockColored bc = ((BlockColored) ((ItemBlock) out.getItem()).field_150939_a); out = new ItemStack( - ((BlockColored) ((ItemBlock) out.getItem()).field_150939_a).getBase(), + bc.getBase() + .getBlock(), out.stackSize, - 0); + bc.getBase() + .getMeta()); } else { // TODO revert if https://github.com/GTMEGA/EndlessIDs/issues/291 is solved out.setItemDamage(BlockColored.getEIDMetaFromRGB(ItemPaintRoller.getColorFromStack(roller))); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java index f840746df..d0d4826ee 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java @@ -21,7 +21,8 @@ public enum Mods { Backhand("backhand"), GT("gregtech_nh"), SimpleSkinBackport("simpleskinbackport"), - EndlessIDs("endlessids") + EndlessIDs("endlessids"), + Angelica("angelica") ; // spotless:on diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/angelica/coloredblocks/CTMForColoredBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/angelica/coloredblocks/CTMForColoredBlocks.java new file mode 100644 index 000000000..0cdf7b5d9 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/angelica/coloredblocks/CTMForColoredBlocks.java @@ -0,0 +1,48 @@ +package com.fouristhenumber.utilitiesinexcess.compat.angelica.coloredblocks; + +import java.util.ArrayList; +import java.util.HashMap; + +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockColored; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockColoredCTM; +import com.prupe.mcpatcher.ctm.CTMUtils; +import com.prupe.mcpatcher.ctm.TileOverride; +import com.prupe.mcpatcher.mal.block.BlockStateMatcher; + +public class CTMForColoredBlocks { + + public static void init() { + CTMUtils.addCtmRegistrationCallback(overrides -> { + ArrayList toRegister = new ArrayList<>(); + overrides.getBlock() + .forEach((block, blockStateMatchers) -> { + for (BlockStateMatcher stateMatcher : blockStateMatchers) { + for (BlockColored bc : BlockColoredCTM.CTM_COLORED_BLOCKS) { + if (stateMatcher.match( + bc.getBase() + .getBlock(), + bc.getBase() + .getMeta())) { + toRegister.add( + PropertiesFileColored.from(((TileOverride) stateMatcher.getData()).properties, bc)); + } + } + } + }); + + HashMap tileLoaders = new HashMap<>(); + for (PropertiesFileColored propertiesFileColored : toRegister) { + TileLoaderColored loader; + float bm = propertiesFileColored.getBlockColored() + .getBrightnessMultiplier(); + if (tileLoaders.containsKey(bm)) { + loader = tileLoaders.get(bm); + } else { + loader = new TileLoaderColored("textures/blocks", CTMUtils.logger, bm); + tileLoaders.put(bm, loader); + } + CTMUtils.registerOverrideWithoutLock(overrides, TileOverride.create(propertiesFileColored, loader)); + } + }); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/angelica/coloredblocks/PropertiesFileColored.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/angelica/coloredblocks/PropertiesFileColored.java new file mode 100644 index 000000000..8709bfcd9 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/angelica/coloredblocks/PropertiesFileColored.java @@ -0,0 +1,51 @@ +package com.fouristhenumber.utilitiesinexcess.compat.angelica.coloredblocks; + +import java.util.Properties; + +import net.minecraft.util.ResourceLocation; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockColored; +import com.prupe.mcpatcher.MCLogger; +import com.prupe.mcpatcher.mal.resource.PropertiesFile; +import com.prupe.mcpatcher.mal.resource.ResourceLocationWithSource; + +public class PropertiesFileColored extends PropertiesFile { + + public PropertiesFileColored(MCLogger logger, ResourceLocation resource, Properties properties) { + super(logger, resource, properties); + } + + private BlockColored blockColored; + + static PropertiesFileColored from(PropertiesFile propertiesFile, BlockColored bc) { + Properties properties = propertiesFile.getProperties(); + properties.setProperty("matchBlocks", UtilitiesInExcess.MODID + ":" + bc.getRegistryName()); + properties.setProperty("metadata", ""); + + ResourceLocation resource = propertiesFile.getResource(); + String location = resource.getResourcePath(); + int i = location.lastIndexOf('/'); + location = location.substring(0, i) + "/___UIE_COLORED___" + location.substring(i); + + if (resource instanceof ResourceLocationWithSource old) { + resource = new ResourceLocationWithSource( + old.getSource(), + new ResourceLocation(resource.getResourceDomain(), location)); + } else { + resource = new ResourceLocation(resource.getResourceDomain(), location); + } + + PropertiesFileColored pfc = new PropertiesFileColored(propertiesFile.getLogger(), resource, properties); + pfc.setBlockColored(bc); + return pfc; + } + + public BlockColored getBlockColored() { + return blockColored; + } + + private void setBlockColored(BlockColored blockColored) { + this.blockColored = blockColored; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/angelica/coloredblocks/TileLoaderColored.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/angelica/coloredblocks/TileLoaderColored.java new file mode 100644 index 000000000..df87e1d1d --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/angelica/coloredblocks/TileLoaderColored.java @@ -0,0 +1,56 @@ +package com.fouristhenumber.utilitiesinexcess.compat.angelica.coloredblocks; + +import java.awt.image.BufferedImage; + +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.util.ResourceLocation; + +import com.fouristhenumber.utilitiesinexcess.render.BlockColoredTexture; +import com.prupe.mcpatcher.MCLogger; +import com.prupe.mcpatcher.mal.tile.TileLoader; + +import jss.notfine.config.MCPatcherForgeConfig; + +public class TileLoaderColored extends TileLoader { + + private final float brightnessMultiplier; + + public TileLoaderColored(String mapName, MCLogger logger, float brightnessMultiplier) { + super(mapName, logger); + this.brightnessMultiplier = brightnessMultiplier; + } + + @Override + public BufferedImage loadResourceImage(ResourceLocation resource, boolean alternate) { + BufferedImage image = null; + if (!MCPatcherForgeConfig.ConnectedTextures.debugTextures) { + image = BlockColoredTexture.generateGrayscaleImage( + new ResourceLocation( + resource.getResourceDomain(), + resource.getResourcePath() + .replace("/___UIE_COLORED___", "")), + brightnessMultiplier); + if (image == null) { + subLogger.warning("missing %s", resource); + } + } + if (image == null) { + image = generateDebugTexture(resource.getResourcePath(), 64, 64, alternate); + } + return image; + } + + @Override + protected TextureAtlasSprite registerIconToMap(TextureMap textureMap, ResourceLocation resource, String name) { + TextureAtlasSprite icon = new BlockColoredTexture(name, brightnessMultiplier); + textureMap.setTextureEntry(name, icon); + return icon; + } + + @Override + public boolean ignoreMissingTextures() { + return true; + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/ColoredBlocksDataProvider.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/ColoredBlocksDataProvider.java index fde83efb2..e30f07afc 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/ColoredBlocksDataProvider.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/ColoredBlocksDataProvider.java @@ -10,6 +10,7 @@ import net.minecraft.world.World; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockColored; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockColoredCTM; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockLapisAetheriusDyable; import mcp.mobius.waila.api.IWailaConfigHandler; @@ -26,9 +27,12 @@ public List getWailaBody(ItemStack itemStack, List currentTip, I IWailaConfigHandler config) { currentTip.add(SpecialChars.getRenderString("waila.uie.coloredblock")); - if (accessor.getBlock() instanceof BlockLapisAetheriusDyable - && BlockColored.getExtraMetaBit(accessor.getMetadata()) > 0) { - currentTip.add(StatCollector.translateToLocal("uie.desc.lapis_aetherius_dyeable")); + if (BlockColored.getExtraMetaBit(accessor.getMetadata()) > 0) { + if (accessor.getBlock() instanceof BlockLapisAetheriusDyable) { + currentTip.add(StatCollector.translateToLocal("uie.desc.lapis_aetherius_dyeable")); + } else if (accessor.getBlock() instanceof BlockColoredCTM) { + currentTip.add(StatCollector.translateToLocal("uie.desc.block_colored_ctm")); + } } return currentTip; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/render/BlockColoredTexture.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/BlockColoredTexture.java index 098864f10..5d3853e62 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/render/BlockColoredTexture.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/BlockColoredTexture.java @@ -12,24 +12,27 @@ import net.minecraft.util.ResourceLocation; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockColored; -import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorBlock_Client; public class BlockColoredTexture extends TextureAtlasSprite { private final BlockColored block; - private final float colorMultiplier; + private final float brightnessMultiplier; private String baseName; - public BlockColoredTexture(String name, String baseName, BlockColored block, float colorMultiplier) { + public BlockColoredTexture(String name, float brightnessMultiplier) { + this(name, null, brightnessMultiplier); + } + + public BlockColoredTexture(String name, String baseName, BlockColored block, float brightnessMultiplier) { this.baseName = baseName; - this(name, block, colorMultiplier); + this(name, block, brightnessMultiplier); } - public BlockColoredTexture(String name, BlockColored block, float colorMultiplier) { + public BlockColoredTexture(String name, BlockColored block, float brightnessMultiplier) { super(name); this.block = block; - this.colorMultiplier = colorMultiplier; + this.brightnessMultiplier = brightnessMultiplier; } @Override @@ -39,19 +42,44 @@ public boolean hasCustomLoader(IResourceManager manager, ResourceLocation locati @Override public boolean load(IResourceManager manager, ResourceLocation location) { - try { - ResourceLocation baseLocation; - if (block.textureOverrideName != null) { - baseLocation = new ResourceLocation(block.textureOverrideDomain, block.textureOverrideName); - } else { - ResourceLocation temp = new ResourceLocation(baseName); - baseLocation = new ResourceLocation(temp.getResourceDomain(), "textures/blocks/" + temp.getResourcePath() + ".png"); - } + ResourceLocation baseLocation; + if (block != null && block.textureOverrideName != null) { + baseLocation = new ResourceLocation(block.textureOverrideDomain, block.textureOverrideName); + } else if (baseName == null) { + baseLocation = new ResourceLocation(getIconName().replace("/___UIE_COLORED___", "")); + } else { + ResourceLocation temp = new ResourceLocation(baseName); + baseLocation = new ResourceLocation( + temp.getResourceDomain(), + "textures/blocks/" + temp.getResourcePath() + ".png"); + } + + BufferedImage img = generateGrayscaleImage(baseLocation, brightnessMultiplier); + + if (img == null) { + return true; + } + + this.height = img.getHeight(); + this.width = img.getWidth(); + int mipmapLevels = Minecraft.getMinecraft().gameSettings.mipmapLevels; + int[][] imageData = new int[1 + mipmapLevels][]; + + int[] rgbaData = new int[this.height * this.width]; + img.getRGB(0, 0, width, height, rgbaData, 0, width); + imageData[0] = rgbaData; + + framesTextureData.add(imageData); + return false; + } + + public static BufferedImage generateGrayscaleImage(ResourceLocation location, float brightnessMultiplier) { + try { BufferedImage img = ImageIO.read( Minecraft.getMinecraft() .getResourceManager() - .getResource(baseLocation) + .getResource(location) .getInputStream()); for (int x = 0; x < img.getWidth(); x++) { for (int y = 0; y < img.getHeight(); y++) { @@ -62,27 +90,15 @@ public boolean load(IResourceManager manager, ResourceLocation location) { // Something about the receptor concentration in our eyes ¯\_(ツ)_/¯ // int grey = (int) ((c.getGreen() + c.getRed() + c.getBlue()) * 0.333f); int grey = (int) (c.getGreen() * 0.587 + c.getRed() * 0.299 + c.getBlue() * 0.114); - grey = (int) Math.min(grey * colorMultiplier, 255); + grey = (int) Math.min(grey * brightnessMultiplier, 255); Color newColor = new Color(grey, grey, grey, c.getAlpha()); img.setRGB(x, y, newColor.getRGB()); } } - - this.height = img.getHeight(); - this.width = img.getWidth(); - - int mipmapLevels = Minecraft.getMinecraft().gameSettings.mipmapLevels; - int[][] imageData = new int[1 + mipmapLevels][]; - - int[] rgbaData = new int[this.height * this.width]; - img.getRGB(0, 0, width, height, rgbaData, 0, width); - imageData[0] = rgbaData; - - framesTextureData.add(imageData); - return false; + return img; } catch (IOException e) { - return true; + return null; } } } diff --git a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang index ecefbd173..24f8c6b5a 100644 --- a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang +++ b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang @@ -439,6 +439,7 @@ uie.desc.filing_cabinet.advanced=Stores unstackable items. uie.desc.filing_cabinet.elite=Stores any items. uie.desc.lapis_aetherius_dyeable=Lighting turned off +uie.desc.block_colored_ctm=Connects to any color #### Items item.block_analyzer.name=Block Analyzer From 52c93ca2e9c2a5778eaecbb5bf19be7556276fd0 Mon Sep 17 00:00:00 2001 From: SuperSoupr <26164930+SuperSoupr@users.noreply.github.com> Date: Sun, 12 Jul 2026 19:31:26 +0300 Subject: [PATCH 03/17] GUI improvements --- .../PaintRollerColorPickerDialog.java | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/paintroller/PaintRollerColorPickerDialog.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/paintroller/PaintRollerColorPickerDialog.java index 5fbf8b002..f6c7cbcc8 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/paintroller/PaintRollerColorPickerDialog.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/paintroller/PaintRollerColorPickerDialog.java @@ -13,6 +13,9 @@ import com.cleanroommc.modularui.drawable.HueBar; import com.cleanroommc.modularui.drawable.Rectangle; import com.cleanroommc.modularui.screen.RichTooltip; +import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; +import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.theme.WidgetThemeEntry; import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.utils.Color; import com.cleanroommc.modularui.value.BoolValue; @@ -222,6 +225,10 @@ private IWidget createRGBPage() { } private IWidget createHSVPage() { + double[] stoppers = new double[32]; + for (int i = 0; i < 32; i++) { + stoppers[i] = ((float) i) / 31f * 0.9725490212440491f; + } return Flow.col() .sizeRel(1f, 1f) .child( @@ -246,8 +253,9 @@ private IWidget createHSVPage() { .heightRel(1f)) .child( createSlider(this.sliderBackgroundS).name("saturation") - .bounds(0, 1) - .value(new DoubleValue.Dynamic(() -> this.saturation, this::updateSaturation)))) + .bounds(0, 0.9725490212440491f) // magic number for how high this goes for 0xF8F8F8 + .value(new DoubleValue.Dynamic(() -> this.saturation, this::updateSaturation)) + .stopper(stoppers))) .child( Flow.row() .widthRel(1f) @@ -258,18 +266,31 @@ private IWidget createHSVPage() { .heightRel(1f)) .child( createSlider(this.sliderBackgroundV).name("value") - .bounds(0, 1) - .value(new DoubleValue.Dynamic(() -> this.value, this::updateValue)))); + .bounds(0, 0.9725490212440491f) // magic number for how high this goes for 0xF8F8F8 + .value(new DoubleValue.Dynamic(() -> this.value, this::updateValue)) + .stopper(stoppers))); } private static SliderWidget createSlider(IDrawable background) { - return new SliderWidget().expanded() + SliderWidget sliderWidget = new SliderWidget() { + + @Override // Don't draw stopper points + public void drawBackground(ModularGuiContext context, WidgetThemeEntry widgetTheme) { + WidgetTheme theme = getActiveWidgetTheme(widgetTheme, isHovering()); + IDrawable bg = getCurrentBackground(widgetTheme); + if (bg != null) { + bg.drawAtZero(context, getArea(), theme); + } + } + }; + sliderWidget.expanded() .heightRel(1f) .background( background.asIcon() .size(0, 4)) .sliderTexture(handleBackground) .sliderSize(2, 8); + return sliderWidget; } private String validateRawColor(String raw) { @@ -313,7 +334,7 @@ private void updateValue(double v) { } private void updateFromRGB() { - this.color = Color.rgb(this.red, this.green, this.blue); + this.color = Color.rgb(this.red, this.green, this.blue) & 0b00000000_11111000_11111000_11111000; this.saturation = Color.getHSVSaturation(this.color); this.value = Color.getValue(this.color); this.hue = Color.getHue(this.color); From 5252a2c392cf8ba8fa82eb8292898c39a490f2d2 Mon Sep 17 00:00:00 2001 From: SuperSoupr <26164930+SuperSoupr@users.noreply.github.com> Date: Mon, 13 Jul 2026 16:41:38 +0300 Subject: [PATCH 04/17] Redesign config colored blocks --- .../utilitiesinexcess/CommonProxy.java | 16 +- .../utilitiesinexcess/UtilitiesInExcess.java | 6 - .../utilitiesinexcess/client/IMCForNEI.java | 6 +- .../common/blocks/BlockColored.java | 195 +++++++++++------- .../common/blocks/BlockColoredCTM.java | 24 +++ .../common/blocks/BlockColoredWithUse.java | 4 + .../coloredblocks/CTMForColoredBlocks.java | 8 + .../config/blocks/ColoredBlocksConfig.java | 31 ++- .../utilitiesinexcess/mixins/Mixins.java | 4 + .../MixinTextureMap_ColoredBlocks.java | 41 ++++ .../render/BlockColoredTexture.java | 4 +- 11 files changed, 234 insertions(+), 105 deletions(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinTextureMap_ColoredBlocks.java diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java index 513034cc5..eaca38386 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java @@ -24,7 +24,6 @@ import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLInterModComms; -import cpw.mods.fml.common.event.FMLLoadCompleteEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.event.FMLServerStartingEvent; @@ -49,9 +48,6 @@ public void preInit(FMLPreInitializationEvent event) { ModDimensions.init(); ModBiomes.init(); - if (Mods.NEI.isLoaded()) { - IMCForNEI.IMCSender(); - } if (Mods.Waila.isLoaded()) { FMLInterModComms.sendMessage( "Waila", @@ -67,6 +63,10 @@ public void preInit(FMLPreInitializationEvent event) { if (ColoredBlocksConfig.INSTANCE.enableColoredBlocks) { BlockColored.registerConfigBlocks(); } + + if (Mods.NEI.isLoaded()) { + IMCForNEI.IMCSender(); + } } public void init(FMLInitializationEvent event) { @@ -91,13 +91,5 @@ public void postInit(FMLPostInitializationEvent event) { } } - public void loadComplete(FMLLoadCompleteEvent event) { - - if (ColoredBlocksConfig.INSTANCE.enableColoredBlocks) { - BlockColored.initColoredBlocks(); - } - - } - public void serverStarting(FMLServerStartingEvent event) {} } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java index bb0cd4835..67b001156 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java @@ -25,7 +25,6 @@ import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.SidedProxy; import cpw.mods.fml.common.event.FMLInitializationEvent; -import cpw.mods.fml.common.event.FMLLoadCompleteEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.event.FMLServerStartingEvent; @@ -116,11 +115,6 @@ public void postInit(FMLPostInitializationEvent event) { proxy.postInit(event); } - @Mod.EventHandler - public void loadComplete(FMLLoadCompleteEvent event) { - proxy.loadComplete(event); - } - @Mod.EventHandler public void serverStarting(FMLServerStartingEvent event) { proxy.serverStarting(event); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java index 3f485b073..2fd6d7c03 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java @@ -279,7 +279,11 @@ public static void IMCSender() { sendInfoPage("", "uie.nei.infopage.paint_roller"); for (BlockColored block : BlockColored.COLORED_BLOCKS) { - sendInfoPage("utilitiesinexcess:" + block.getRegistryName(), "uie.nei.infopage.colored_blocks.dyeable"); + if (block.useNEIPage()) { + sendInfoPage( + "utilitiesinexcess:" + block.getRegistryName(), + "uie.nei.infopage.colored_blocks.dyeable"); + } } } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java index 6e838c3bd..d4e916c47 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java @@ -4,14 +4,12 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; - -import javax.annotation.Nullable; +import java.util.Map; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; @@ -50,10 +48,9 @@ public class BlockColored extends Block implements IUIERegistered { private String baseModID; private String baseName; private boolean initialized = true; - public String textureOverrideDomain; - public String textureOverrideName; private IIcon[] icons; private int baseMeta = 0; + private String displayNameOverride = null; private final float brightnessMultiplier; public static final float DEFAULT_BRIGHTNESS = 1.5f; @@ -78,31 +75,39 @@ public BlockColored(Block base, float brightnessMultiplier, int baseMeta) { // This dumb ratio is due to the random scalars present in both get and set resistance. setResistance(base.getExplosionResistance(null) * (5f / 3f)); setStepSound(base.stepSound); - setBlockName(((AccessorBlock) base).uie$getUnlocalizedNameRaw() + "_colored"); + setBlockName("colored_" + ((AccessorBlock) base).uie$getUnlocalizedNameRaw()); COLORED_BLOCKS.add(this); BASES_TO_COLORED.put(baseOf(base, baseMeta), this); } - public BlockColored(String baseModID, String baseName, float brightnessMultiplier, @Nullable String textureDomain, - @Nullable String textureName) { + // Config colored blocks initialization: + // Pre-Init: registerConfigBlocks() parses the config, then constructs and registers instances + // MixinTextureMap_ColoredBlocks (loader state is available, after post init events): initColoredBlocks() finds base + // blocks, register their recipes, and registers them with the atlas + // If angelica is present: initColoredBlocks() finds base blocks during CTM registration, mixin only registers with + // atlas + public BlockColored(String baseModID, String baseName, int baseMeta, float brightnessMultiplier) { super(Material.rock); this.brightnessMultiplier = brightnessMultiplier; this.baseModID = baseModID; this.baseName = baseName; + this.baseMeta = baseMeta; this.initialized = false; - this.textureOverrideDomain = textureDomain; - this.textureOverrideName = textureName; - setBlockName(baseModID + "_" + baseName + "_colored"); + setBlockName("colored_" + baseModID + "_" + baseName + "_" + baseMeta); } public void initFromString() { - if (base == null) { - base = baseOf(GameRegistry.findBlock(baseModID, baseName), 0); + if (initialized) { + return; } if (base == null) { + base = baseOf(GameRegistry.findBlock(baseModID, baseName), baseMeta); + } + + if (base.getBlock() == null) { throw new IllegalArgumentException( "Utilities in Excess - Colored Blocks: Block \"" + baseName + "\" from mod ID \"" @@ -202,6 +207,14 @@ public boolean useNEIPage() { return true; } + public void setDisplayNameOverride(String displayName) { + this.displayNameOverride = displayName; + } + + public String getDisplayNameOverride() { + return displayNameOverride; + } + // IUIEModBLock private String registryName; @@ -233,14 +246,17 @@ public int getMetadata(int damage) { public String getItemStackDisplayName(ItemStack stack) { int dmg = stack.getItemDamage(); BlockColored bc = (BlockColored) field_150939_a; - stack.setItemDamage( - bc.getBase() - .getMeta()); - String name = Item.getItemFromBlock( - bc.getBase() - .getBlock()) - .getItemStackDisplayName(stack); - stack.setItemDamage(dmg); + String name = bc.getDisplayNameOverride(); + if (name == null) { + stack.setItemDamage( + bc.getBase() + .getMeta()); + name = Item.getItemFromBlock( + bc.getBase() + .getBlock()) + .getItemStackDisplayName(stack); + stack.setItemDamage(dmg); + } if (allowDyingBlocks()) { name = StatCollector.translateToLocalFormatted("uie.colored_blocks.color.dyeable", name); @@ -275,9 +291,9 @@ public static void registerConfigBlocks() { String blockDomain = args[0]; String blockName = args[1]; - float brightness; + int blockMeta; try { - brightness = Float.parseFloat(args[2]); + blockMeta = Integer.parseInt(args[2]); } catch (NumberFormatException e) { throw new IllegalArgumentException( "Utilities in Excess - Colored Blocks: Couldn't parse brightness value \"" + args[2] @@ -285,64 +301,91 @@ public static void registerConfigBlocks() { + configString + "\". Please check the \"extraColoredBlocks\" option in your Utilities in Excess config."); } - String textureDomain = args[3]; - String textureName = args[4]; + float brightness; + try { + brightness = Float.parseFloat(args[3]); + } catch (NumberFormatException e) { + throw new IllegalArgumentException( + "Utilities in Excess - Colored Blocks: Couldn't parse brightness value \"" + args[3] + + "\" for extra colored blocks entry \"" + + configString + + "\". Please check the \"extraColoredBlocks\" option in your Utilities in Excess config."); + } + BlockColored newBlock = switch (args[4].toLowerCase()) { + case "default" -> new BlockColored(blockDomain, blockName, blockMeta, brightness); + case "ctm" -> new BlockColoredCTM(blockDomain, blockName, blockMeta, brightness); + case "rotatable" -> new BlockColored(blockDomain, blockName, blockMeta, brightness); + default -> throw new IllegalArgumentException( + "Utilities in Excess - Colored Blocks: Couldn't parse type value \"" + args[4] + + "\" for extra colored blocks entry \"" + + configString + + "\". Please check the \"extraColoredBlocks\" option in your Utilities in Excess config."); + }; + Class itemClass = switch (args[4].toLowerCase()) { + case "ctm" -> BlockColoredCTM.ItemBlockColoredCTM.class; + case "light" -> BlockColoredWithLight.ItemBlockColoredWithLight.class; + default -> BlockColored.ItemBlockColored.class; + }; + + if (args.length >= 6) { + newBlock.setDisplayNameOverride(args[5]); + } - BlockColored newBlock = new BlockColored(blockDomain, blockName, brightness, textureDomain, textureName); newBlock.setCreativeTab(UtilitiesInExcess.uieTab); CONFIG_COLORED_BLOCKS.add(newBlock); COLORED_BLOCKS.add(newBlock); newBlock.setRegistryName(((AccessorBlock) newBlock).uie$getUnlocalizedNameRaw()); - GameRegistry.registerBlock(newBlock, ItemBlockColored.class, newBlock.getRegistryName()); - + GameRegistry.registerBlock(newBlock, itemClass, newBlock.getRegistryName()); } } - public static void initColoredBlocks() { - for (BlockColored blockColored : CONFIG_COLORED_BLOCKS) { + private static boolean recipesLoaded = false; + + public static void initColoredBlocks(Map mapRegisteredSprites) { + for (BlockColored blockColored : COLORED_BLOCKS) { blockColored.initFromString(); + if (mapRegisteredSprites != null) { + blockColored.actuallyRegisterBlockIcons(mapRegisteredSprites); + } + } + if (!recipesLoaded) { + RecipeLoader.loadColoredBlockRecipes(); + recipesLoaded = true; } - RecipeLoader.loadColoredBlockRecipes(); } - // Implementations of Block methods - @SideOnly(Side.CLIENT) - @Override - public void registerBlockIcons(IIconRegister reg) { - if (!(reg instanceof TextureMap tm)) return; - - if (base != null) { - IIcon[] icons = new IIcon[6]; - HashSet names = new HashSet<>(); + protected void actuallyRegisterBlockIcons(Map mapRegisteredSprites) { - for (int i = 0; i < 6; i++) { - icons[i] = base.getBlock() - .getIcon(i, this.baseMeta); - names.add(icons[i].getIconName()); - } - - HashMap iconMap = new HashMap<>(); - for (String name : names) { - String textureName = UtilitiesInExcess.MODID + ":" + name.replace(':', '_') + "_colored_grayscale"; - BlockColoredTexture icon = new BlockColoredTexture(textureName, name, this, brightnessMultiplier); - tm.setTextureEntry(textureName, icon); - iconMap.put(name, icon); - } + IIcon[] icons = new IIcon[6]; + HashSet names = new HashSet<>(); - for (int i = 0; i < 6; i++) { - icons[i] = iconMap.get(icons[i].getIconName()); - } + for (int i = 0; i < 6; i++) { + icons[i] = base.getBlock() + .getIcon(i, this.baseMeta); + names.add(icons[i].getIconName()); + } - this.icons = icons; - this.blockIcon = icons[0]; - } else { - String textureName = UtilitiesInExcess.MODID + ":" + baseModID + "_" + baseName + "_colored_grayscale"; - blockIcon = new BlockColoredTexture(textureName, this, brightnessMultiplier); + HashMap iconMap = new HashMap<>(); + for (String name : names) { + String textureName = UtilitiesInExcess.MODID + ":" + name.replace(':', '_') + "_colored_grayscale"; + BlockColoredTexture icon = new BlockColoredTexture(textureName, name, this, brightnessMultiplier); + mapRegisteredSprites.put(textureName, icon); + iconMap.put(name, icon); + } - tm.setTextureEntry(textureName, (TextureAtlasSprite) blockIcon); + for (int i = 0; i < 6; i++) { + icons[i] = iconMap.get(icons[i].getIconName()); } + + this.icons = icons; + this.blockIcon = icons[0]; } + // Implementations of Block methods + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister reg) {} + @Override @SideOnly(Side.CLIENT) public int colorMultiplier(IBlockAccess worldIn, int x, int y, int z) { @@ -424,40 +467,44 @@ public int getFireSpreadSpeed(IBlockAccess world, int x, int y, int z, ForgeDire @SideOnly(Side.CLIENT) @Override public int getRenderBlockPass() { - return getBase().getBlock() - .getRenderBlockPass(); + return (getBase() == null || getBase().getBlock() == null) ? super.getRenderBlockPass() + : getBase().getBlock() + .getRenderBlockPass(); } @Override public boolean renderAsNormalBlock() { - return getBase().getBlock() - .renderAsNormalBlock(); + return (getBase() == null || getBase().getBlock() == null) ? super.renderAsNormalBlock() + : getBase().getBlock() + .renderAsNormalBlock(); } @Override public boolean isOpaqueCube() { - return getBase() == null ? super.isOpaqueCube() + return (getBase() == null || getBase().getBlock() == null) ? super.isOpaqueCube() : getBase().getBlock() .isOpaqueCube(); } @Override public boolean shouldSideBeRendered(IBlockAccess worldIn, int x, int y, int z, int side) { - Block block = worldIn.getBlock(x, y, z); - return getBase().getBlock() - .shouldSideBeRendered(worldIn, x, y, z, side) && block != this; + return (getBase() == null || getBase().getBlock() == null) ? super.shouldSideBeRendered(worldIn, x, y, z, side) + : getBase().getBlock() + .shouldSideBeRendered(worldIn, x, y, z, side) && worldIn.getBlock(x, y, z) != this; } @Override public int getLightOpacity() { - return getBase().getBlock() - .getLightOpacity(); + return (getBase() == null || getBase().getBlock() == null) ? super.getLightOpacity() + : getBase().getBlock() + .getLightOpacity(); } @Override public int getLightOpacity(IBlockAccess world, int x, int y, int z) { - return getBase().getBlock() - .getLightOpacity(world, x, y, z); + return (getBase() == null || getBase().getBlock() == null) ? super.getLightOpacity(world, x, y, z) + : getBase().getBlock() + .getLightOpacity(world, x, y, z); } // diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredCTM.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredCTM.java index 1ab647502..c147d958d 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredCTM.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredCTM.java @@ -1,8 +1,12 @@ package com.fouristhenumber.utilitiesinexcess.common.blocks; import java.util.ArrayList; +import java.util.List; import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; import com.prupe.mcpatcher.ctm.ICTMBlock; import com.prupe.mcpatcher.ctm.RenderBlockState; @@ -26,6 +30,11 @@ public BlockColoredCTM(Block base, float brightnessMultiplier, int baseMeta) { CTM_COLORED_BLOCKS.add(this); } + public BlockColoredCTM(String baseModID, String baseName, int baseMeta, float brightnessMultiplier) { + super(baseModID, baseName, baseMeta, brightnessMultiplier); + CTM_COLORED_BLOCKS.add(this); + } + @Override public boolean shouldConnectByBlock(RenderBlockState renderBlockState, Block neighbor, int neighborX, int neighborY, int neighborZ) { @@ -40,4 +49,19 @@ public boolean shouldConnectByBlock(RenderBlockState renderBlockState, Block nei return (renderBlockState.getMetadata() & 0b0_11111_11111_11111) == (neighborMeta & 0b0_11111_11111_11111) || (extraBit1 && extraBit2); } + + public static class ItemBlockColoredCTM extends ItemBlockColored { + + public ItemBlockColoredCTM(Block block) { + super(block); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean p_77624_4_) { + super.addInformation(stack, player, tooltip, p_77624_4_); + if (BlockColored.getExtraMetaBit(stack.getItemDamage()) > 0) { + tooltip.add(StatCollector.translateToLocal("uie.desc.block_colored_ctm")); + } + } + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredWithUse.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredWithUse.java index fe35fe2ec..2fee4f070 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredWithUse.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredWithUse.java @@ -18,6 +18,10 @@ public BlockColoredWithUse(Block base, float brightnessMultiplier, int baseMeta) super(base, brightnessMultiplier, baseMeta); } + public BlockColoredWithUse(String baseModID, String baseName, int baseMeta, float brightnessMultiplier) { + super(baseModID, baseName, baseMeta, brightnessMultiplier); + } + @Override public boolean usesExtraBit() { return true; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/angelica/coloredblocks/CTMForColoredBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/angelica/coloredblocks/CTMForColoredBlocks.java index 0cdf7b5d9..659ed5c84 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/angelica/coloredblocks/CTMForColoredBlocks.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/angelica/coloredblocks/CTMForColoredBlocks.java @@ -9,10 +9,18 @@ import com.prupe.mcpatcher.ctm.TileOverride; import com.prupe.mcpatcher.mal.block.BlockStateMatcher; +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.LoaderState; + public class CTMForColoredBlocks { public static void init() { CTMUtils.addCtmRegistrationCallback(overrides -> { + if (Loader.instance() + .getLoaderState() == LoaderState.AVAILABLE) { + BlockColored.initColoredBlocks(null); + } + ArrayList toRegister = new ArrayList<>(); overrides.getBlock() .forEach((block, blockStateMatchers) -> { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/ColoredBlocksConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/ColoredBlocksConfig.java index eadd7a286..c2ed82240 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/ColoredBlocksConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/ColoredBlocksConfig.java @@ -34,18 +34,31 @@ public class ColoredBlocksConfig { @Config.RequiresMcRestart public boolean enableDying; + // spotless:off @Config.Order(300) - @Config.Comment({ "WARNING! THIS IS AN ADVANCED CONFIG OPTION!", - "If you don't know what you're doing do not touch.", "", "Add extra blocks to be turned into colored blocks", - "", "Format: MODID;BLOCKNAME;BRIGHTNESS;TEXTUREDOMAIN;TEXTURENAME", + @Config.Comment({ + "Add extra blocks to be turned into colored blocks", + "Each of these will be registered as a new block with a new ID.", + "", + "Format: MODID;BLOCKNAME;BLOCKMETA;BRIGHTNESS;TYPE;DISPLAYNAME", " MODID: Mod ID of the mod that adds the block. NOT DOMAIN. (example: \"minecraft\")", - " BLOCKNAME: Name of the block (example: \"wool\")", + " BLOCKNAME: Name of the block (example: \"stained_glass\")", + " BLOCKMETA: Block's meta/damage (example: \"0\")", " BRIGHTNESS: Brightness multiplier (example: \"1.5\")", - " TEXTUREDOMAIN: Domain for texture (example: \"utilitiesinexcess\")", - " TEXTURENAME: Texture location (example: \"textures/blocks/block_update_detector_active.png\")", "", - "Example: minecraft;double_stone_slab;1;minecraft;textures/blocks/stone_slab_top.png", - "Example: utilitiesinexcess;block_update_detector;1.5;utilitiesinexcess;textures/blocks/block_update_detector_active.png", - "" }) + " TYPE: Colored block type selection (example: \"DEFAULT\")", + " DISPLAYNAME: (optional) a new display name (example: \"Stained Glass\")", + "", + "Available Types:", + " DEFAULT: A regular block, no special features", + " CTM: Block with connected textures, right click to toggle connecting to different colors (requires angelica)", + " ROTATABLE: Block that can be rotated (once) 90 degrees with a right click", + " LIGHT: Block that emits light, right click to toggle light", + "", + "Example: minecraft;stained_glass;0;1.5;CTM;Stained Glass", + "Example: minecraft;double_stone_slab;8;1.5;DEFAULT", + "" + }) + // spotless:on @Config.DefaultStringList({}) @Config.RequiresMcRestart public String[] extraColoredBlocks; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/Mixins.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/Mixins.java index aef3ce458..0d84dd31d 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/Mixins.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/Mixins.java @@ -35,6 +35,10 @@ public enum Mixins implements IMixins { "minecraft.MixinGuiIngame_TrueGreenscreen") .setPhase(Phase.EARLY) .setApplyIf(() -> BlockConfig.enableTrueGreenscreen)), + COLORED_BLOCKS_TEXTURES(new MixinBuilder("Registers textures for colored blocks") + .addClientMixins("minecraft.MixinTextureMap_ColoredBlocks") + .setPhase(Phase.EARLY) + .setApplyIf(() -> BlockConfig.coloredBlocks.enableColoredBlocks)), ACCESSORS(new MixinBuilder("Accessors for the mod to use") .setPhase(Phase.EARLY) .addCommonMixins( diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinTextureMap_ColoredBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinTextureMap_ColoredBlocks.java new file mode 100644 index 000000000..4bbe35c54 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinTextureMap_ColoredBlocks.java @@ -0,0 +1,41 @@ +package com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft; + +import java.util.Map; + +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.client.resources.IResourceManager; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockColored; + +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.LoaderState; + +@Mixin(TextureMap.class) +public class MixinTextureMap_ColoredBlocks { + + @Shadow + @Final + private Map mapRegisteredSprites; + + @Shadow + @Final + private String basePath; + + @Inject( + method = "loadTextureAtlas(Lnet/minecraft/client/resources/IResourceManager;)V", + at = @At(value = "INVOKE", target = "Ljava/util/List;clear()V", remap = false, shift = At.Shift.AFTER)) + private void uie$loadColoredBlockTextures(IResourceManager manager, CallbackInfo ci) { + if (basePath.equals("textures/blocks") && Loader.instance() + .getLoaderState() == LoaderState.AVAILABLE) { + BlockColored.initColoredBlocks(mapRegisteredSprites); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/render/BlockColoredTexture.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/BlockColoredTexture.java index 5d3853e62..93199d0f0 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/render/BlockColoredTexture.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/BlockColoredTexture.java @@ -43,9 +43,7 @@ public boolean hasCustomLoader(IResourceManager manager, ResourceLocation locati @Override public boolean load(IResourceManager manager, ResourceLocation location) { ResourceLocation baseLocation; - if (block != null && block.textureOverrideName != null) { - baseLocation = new ResourceLocation(block.textureOverrideDomain, block.textureOverrideName); - } else if (baseName == null) { + if (baseName == null) { baseLocation = new ResourceLocation(getIconName().replace("/___UIE_COLORED___", "")); } else { ResourceLocation temp = new ResourceLocation(baseName); From 4be3333d65985cf5618d3d86c6ff919ffb28c415 Mon Sep 17 00:00:00 2001 From: SuperSoupr <26164930+SuperSoupr@users.noreply.github.com> Date: Mon, 13 Jul 2026 17:23:59 +0300 Subject: [PATCH 05/17] Separate BlockLapisAetheriusDyable to BlockColoredWithLight & write nei pages --- .../utilitiesinexcess/client/IMCForNEI.java | 5 +- .../common/blocks/BlockColored.java | 7 +- .../common/blocks/BlockColoredCTM.java | 5 ++ .../common/blocks/BlockColoredWithLight.java | 70 +++++++++++++++++++ .../blocks/BlockLapisAetheriusDyable.java | 63 +---------------- .../waila/ColoredBlocksDataProvider.java | 6 +- .../assets/utilitiesinexcess/lang/en_US.lang | 5 +- 7 files changed, 95 insertions(+), 66 deletions(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredWithLight.java diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java index 2fd6d7c03..169c18014 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java @@ -279,11 +279,14 @@ public static void IMCSender() { sendInfoPage("", "uie.nei.infopage.paint_roller"); for (BlockColored block : BlockColored.COLORED_BLOCKS) { - if (block.useNEIPage()) { + if (block.useDefaultNEIPage()) { sendInfoPage( "utilitiesinexcess:" + block.getRegistryName(), "uie.nei.infopage.colored_blocks.dyeable"); } + if (block.getCustomNEIPage() != null) { + sendInfoPage("utilitiesinexcess:" + block.getRegistryName(), block.getCustomNEIPage()); + } } } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java index d4e916c47..d41aa8f9d 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java @@ -203,7 +203,7 @@ public boolean usesExtraBit() { return false; } - public boolean useNEIPage() { + public boolean useDefaultNEIPage() { return true; } @@ -215,6 +215,10 @@ public String getDisplayNameOverride() { return displayNameOverride; } + public String getCustomNEIPage() { + return null; + } + // IUIEModBLock private String registryName; @@ -315,6 +319,7 @@ public static void registerConfigBlocks() { case "default" -> new BlockColored(blockDomain, blockName, blockMeta, brightness); case "ctm" -> new BlockColoredCTM(blockDomain, blockName, blockMeta, brightness); case "rotatable" -> new BlockColored(blockDomain, blockName, blockMeta, brightness); + case "light" -> new BlockColoredWithLight(blockDomain, blockName, blockMeta, brightness); default -> throw new IllegalArgumentException( "Utilities in Excess - Colored Blocks: Couldn't parse type value \"" + args[4] + "\" for extra colored blocks entry \"" diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredCTM.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredCTM.java index c147d958d..71b45e69a 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredCTM.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredCTM.java @@ -35,6 +35,11 @@ public BlockColoredCTM(String baseModID, String baseName, int baseMeta, float br CTM_COLORED_BLOCKS.add(this); } + @Override + public String getCustomNEIPage() { + return "uie.nei.infopage.colored_blocks.ctm"; + } + @Override public boolean shouldConnectByBlock(RenderBlockState renderBlockState, Block neighbor, int neighborX, int neighborY, int neighborZ) { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredWithLight.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredWithLight.java new file mode 100644 index 000000000..056e01ae5 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredWithLight.java @@ -0,0 +1,70 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +public class BlockColoredWithLight extends BlockColoredWithUse { + + public BlockColoredWithLight(Block base) { + super(base); + } + + public BlockColoredWithLight(Block base, float brightnessMultiplier) { + super(base, brightnessMultiplier); + } + + public BlockColoredWithLight(Block base, float brightnessMultiplier, int baseMeta) { + super(base, brightnessMultiplier, baseMeta); + } + + public BlockColoredWithLight(String baseModID, String baseName, int baseMeta, float brightnessMultiplier) { + super(baseModID, baseName, baseMeta, brightnessMultiplier); + } + + @Override + protected void playSoundEffect(World worldIn, int x, int y, int z, boolean newExtraBit) { + worldIn.playSoundEffect( + (double) x + 0.5D, + (double) y + 0.5D, + (double) z + 0.5D, + "random.click", + 0.3F, + newExtraBit ? 0.3F : 0.8F); + } + + @Override + public String getCustomNEIPage() { + return "uie.nei.infopage.colored_blocks.light"; + } + + @Override + public int getLightValue(IBlockAccess world, int x, int y, int z) { + return BlockColored.getExtraMetaBit(world.getBlockMetadata(x, y, z)) != 0 ? 0 : 10; + } + + @Override + public int getLightValue() { + return 10; + } + + public static class ItemBlockColoredWithLight extends ItemBlockColored { + + public ItemBlockColoredWithLight(Block block) { + super(block); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean p_77624_4_) { + super.addInformation(stack, player, tooltip, p_77624_4_); + if (BlockColored.getExtraMetaBit(stack.getItemDamage()) > 0) { + tooltip.add(StatCollector.translateToLocal("uie.desc.block_colored_light")); + } + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockLapisAetheriusDyable.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockLapisAetheriusDyable.java index a5f6a17c4..8ae5cbf8b 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockLapisAetheriusDyable.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockLapisAetheriusDyable.java @@ -1,25 +1,14 @@ package com.fouristhenumber.utilitiesinexcess.common.blocks; -import java.util.List; - import net.minecraft.block.Block; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; import net.minecraft.util.StatCollector; import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; import com.fouristhenumber.utilitiesinexcess.ModBlocks; import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class BlockLapisAetheriusDyable extends BlockColoredWithUse { +public class BlockLapisAetheriusDyable extends BlockColoredWithLight { public BlockLapisAetheriusDyable() { super(ModBlocks.LAPIS_AETHERIUS.get()); @@ -35,21 +24,10 @@ public boolean ignoreBaseMeta() { } @Override - public boolean useNEIPage() { + public boolean useDefaultNEIPage() { return false; } - @Override - protected void playSoundEffect(World worldIn, int x, int y, int z, boolean newExtraBit) { - worldIn.playSoundEffect( - (double) x + 0.5D, - (double) y + 0.5D, - (double) z + 0.5D, - "random.click", - 0.3F, - newExtraBit ? 0.3F : 0.8F); - } - @Override public int getRenderType() { return UtilitiesInExcess.lapisAetheriusRenderID; @@ -60,34 +38,7 @@ public boolean isNormalCube(IBlockAccess world, int x, int y, int z) { return true; } - @Override - public int getLightValue(IBlockAccess world, int x, int y, int z) { - return BlockColored.getExtraMetaBit(world.getBlockMetadata(x, y, z)) != 0 ? 0 : 10; - } - - @Override - public int getLightValue() { - return 10; - } - - @SideOnly(Side.CLIENT) - public void getSubBlocks(Item itemIn, CreativeTabs tab, List list) { - list.add(new ItemStack(itemIn, 1, 0b0_11111_11111_11111)); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister iconRegister) { - this.blockIcon = ((BlockLapisAetherius) ModBlocks.LAPIS_AETHERIUS.get()).icons[0]; - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) { - return blockIcon; - } - - public static class ItemLapisAetherius extends BlockColored.ItemBlockColored { + public static class ItemLapisAetherius extends ItemBlockColoredWithLight { public ItemLapisAetherius(Block block) { super(block); @@ -97,13 +48,5 @@ public ItemLapisAetherius(Block block) { public String getItemStackDisplayName(ItemStack p_77653_1_) { return StatCollector.translateToLocal("tile.lapis_aetherius_dyeable.name"); } - - @Override - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean p_77624_4_) { - super.addInformation(stack, player, tooltip, p_77624_4_); - if (BlockColored.getExtraMetaBit(stack.getItemDamage()) > 0) { - tooltip.add(StatCollector.translateToLocal("uie.desc.lapis_aetherius_dyeable")); - } - } } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/ColoredBlocksDataProvider.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/ColoredBlocksDataProvider.java index e30f07afc..ae314485f 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/ColoredBlocksDataProvider.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/ColoredBlocksDataProvider.java @@ -11,7 +11,7 @@ import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockColored; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockColoredCTM; -import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockLapisAetheriusDyable; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockColoredWithLight; import mcp.mobius.waila.api.IWailaConfigHandler; import mcp.mobius.waila.api.IWailaDataAccessor; @@ -28,8 +28,8 @@ public List getWailaBody(ItemStack itemStack, List currentTip, I currentTip.add(SpecialChars.getRenderString("waila.uie.coloredblock")); if (BlockColored.getExtraMetaBit(accessor.getMetadata()) > 0) { - if (accessor.getBlock() instanceof BlockLapisAetheriusDyable) { - currentTip.add(StatCollector.translateToLocal("uie.desc.lapis_aetherius_dyeable")); + if (accessor.getBlock() instanceof BlockColoredWithLight) { + currentTip.add(StatCollector.translateToLocal("uie.desc.block_colored_light")); } else if (accessor.getBlock() instanceof BlockColoredCTM) { currentTip.add(StatCollector.translateToLocal("uie.desc.block_colored_ctm")); } diff --git a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang index 24f8c6b5a..f626786ba 100644 --- a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang +++ b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang @@ -139,6 +139,9 @@ uie.nei.infopage.filing_cabinet.2=The Advanced Filing Cabinet can only hold item uie.nei.infopage.filing_cabinet.3=The Elite Filing Cabinet has no restrictions whatsoever, but has the lowest number of unique item slots. uie.nei.infopage.filing_cabinet.4=Filing Cabinet Capacity Upgrades will add additional maximum storage to any cabinet. uie.nei.infopage.colored_blocks.dyeable=Dyed blocks can be dyed any color you want using a paint roller. Now with a new and improved tile entity-free recipe! +uie.nei.infopage.colored_blocks.ctm=This block supports connected textures! Click on it with an empty hand to allow it to connect regardless of color. +uie.nei.infopage.colored_blocks.light=This block emits light! Click on it with an empty hand to toggle its light emission. +uie.nei.infopage.colored_blocks.rotatable=This block can be (very slightly) rotated (once)! Click on it with an empty hand to rotate it 90 degrees. uie.nei.infopage.paint_roller=This super advanced paint roller can be used to dye any Utilities in Excess dyed block any color you want. Now with a new and improved tile entity-free recipe! #### Blocks @@ -438,7 +441,7 @@ uie.desc.filing_cabinet.basic=Stores variants of one type of item. uie.desc.filing_cabinet.advanced=Stores unstackable items. uie.desc.filing_cabinet.elite=Stores any items. -uie.desc.lapis_aetherius_dyeable=Lighting turned off +uie.desc.block_colored_light=Lighting turned off uie.desc.block_colored_ctm=Connects to any color #### Items From fcbaf1ab15cb6e86c5ed6ab7147b6fbdd25c1c74 Mon Sep 17 00:00:00 2001 From: SuperSoupr <26164930+SuperSoupr@users.noreply.github.com> Date: Mon, 13 Jul 2026 18:00:02 +0300 Subject: [PATCH 06/17] Implement rotatable blocks --- .../common/blocks/BlockColored.java | 10 ++++- .../common/blocks/BlockColoredRotatable.java | 43 +++++++++++++++++++ .../config/blocks/ColoredBlocksConfig.java | 1 + 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredRotatable.java diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java index d41aa8f9d..a56a9e2aa 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java @@ -318,7 +318,7 @@ public static void registerConfigBlocks() { BlockColored newBlock = switch (args[4].toLowerCase()) { case "default" -> new BlockColored(blockDomain, blockName, blockMeta, brightness); case "ctm" -> new BlockColoredCTM(blockDomain, blockName, blockMeta, brightness); - case "rotatable" -> new BlockColored(blockDomain, blockName, blockMeta, brightness); + case "rotatable" -> new BlockColoredRotatable(blockDomain, blockName, blockMeta, brightness); case "light" -> new BlockColoredWithLight(blockDomain, blockName, blockMeta, brightness); default -> throw new IllegalArgumentException( "Utilities in Excess - Colored Blocks: Couldn't parse type value \"" + args[4] @@ -382,6 +382,14 @@ protected void actuallyRegisterBlockIcons(Map mapReg icons[i] = iconMap.get(icons[i].getIconName()); } + if (this instanceof BlockColoredRotatable rotatable) { + for (int i = 0; i < 6; i++) { + rotatable.iconsRotated[i] = base.getBlock() + .getIcon(i, baseMeta + 1 < 16 ? baseMeta + 1 : baseMeta - 1); + rotatable.iconsRotated[i] = iconMap.get(rotatable.iconsRotated[i].getIconName()); + } + } + this.icons = icons; this.blockIcon = icons[0]; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredRotatable.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredRotatable.java new file mode 100644 index 000000000..87940e382 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredRotatable.java @@ -0,0 +1,43 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import net.minecraft.block.Block; +import net.minecraft.util.IIcon; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockColoredRotatable extends BlockColoredWithUse { + + public BlockColoredRotatable(Block base) { + super(base); + } + + public BlockColoredRotatable(Block base, float brightnessMultiplier) { + super(base, brightnessMultiplier); + } + + public BlockColoredRotatable(Block base, float brightnessMultiplier, int baseMeta) { + super(base, brightnessMultiplier, baseMeta); + } + + public BlockColoredRotatable(String baseModID, String baseName, int baseMeta, float brightnessMultiplier) { + super(baseModID, baseName, baseMeta, brightnessMultiplier); + } + + @Override + public String getCustomNEIPage() { + return "uie.nei.infopage.colored_blocks.rotatable"; + } + + public IIcon[] iconsRotated = new IIcon[6]; + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + if (iconsRotated != null && BlockColored.getExtraMetaBit(meta) != 0) { + return iconsRotated[side]; + } + + return super.getIcon(side, meta); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/ColoredBlocksConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/ColoredBlocksConfig.java index c2ed82240..346ce859e 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/ColoredBlocksConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/ColoredBlocksConfig.java @@ -56,6 +56,7 @@ public class ColoredBlocksConfig { "", "Example: minecraft;stained_glass;0;1.5;CTM;Stained Glass", "Example: minecraft;double_stone_slab;8;1.5;DEFAULT", + "Example: minecraft;pumpkin;0;1.5;ROTATABLE", "" }) // spotless:on From b0bf12f084b4b01d1aa2662197a1c7c3584273fe Mon Sep 17 00:00:00 2001 From: SuperSoupr <26164930+SuperSoupr@users.noreply.github.com> Date: Mon, 13 Jul 2026 19:08:39 +0300 Subject: [PATCH 07/17] Add toggle explanation to color picker --- .../tileentities/TileEntityTradingPost.java | 11 +++++++-- .../PaintRollerColorPickerDialog.java | 24 +++++++++++++++++-- .../render/BlockColoredTexture.java | 2 +- .../assets/utilitiesinexcess/lang/en_US.lang | 12 ++++++++++ 4 files changed, 44 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTradingPost.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTradingPost.java index 28ec93ef1..05ac368c9 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTradingPost.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTradingPost.java @@ -109,7 +109,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager, .coverChildrenWidth() .height(10); topRow.child( - new HelpWidget().top(2) + new HelpWidget(Color.BLUE.main).top(2) .left(1) .size(12) .paddingRight(2) @@ -209,10 +209,17 @@ public ModularScreen createScreen(PosGuiData data, ModularPanel mainPanel) { public static class HelpWidget extends Widget { + private final int color; + + public HelpWidget(int color) { + super(); + this.color = color; + } + @Override public void draw(ModularGuiContext context, WidgetThemeEntry widgetTheme) { super.draw(context, widgetTheme); - Color.setGlColorOpaque(Color.BLUE.main); + Color.setGlColorOpaque(color); GuiTextures.HELP.draw(0, 0, 12, 12); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/paintroller/PaintRollerColorPickerDialog.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/paintroller/PaintRollerColorPickerDialog.java index f6c7cbcc8..d34506b15 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/paintroller/PaintRollerColorPickerDialog.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/paintroller/PaintRollerColorPickerDialog.java @@ -67,11 +67,17 @@ public PaintRollerColorPickerDialog(String name, BiConsumer re size(140, 116).background(GuiTextures.MC_BACKGROUND); PagedWidget.Controller controller = new PagedWidget.Controller(); child( - new TileEntityTradingPost.HelpWidget().top(2) + new TileEntityTradingPost.HelpWidget(Color.BLUE.main).top(2) .left(1) .size(12) - .paddingRight(2) .tooltipBuilder(PaintRollerColorPickerDialog::buildHelpToolTip)); + if (Color.getAlpha(startColor) != 0) { + child( + new TileEntityTradingPost.HelpWidget(0xFFBA68C8).top(2) + .right(2) + .size(12) + .tooltipBuilder(PaintRollerColorPickerDialog::buildHelpToolTip2)); + } child( Flow.col() .left(5) @@ -381,4 +387,18 @@ public static void buildHelpToolTip(RichTooltip tooltip) { tooltip.addLine(StatCollector.translateToLocal("uie.gui.tooltip.paint_roller.help.2")); tooltip.addLine(StatCollector.translateToLocal("uie.gui.tooltip.paint_roller.help.3")); } + + public static void buildHelpToolTip2(RichTooltip tooltip) { + tooltip.addLine(StatCollector.translateToLocal("uie.gui.tooltip.paint_roller.help2.0")); + tooltip.addLine(StatCollector.translateToLocal("uie.gui.tooltip.paint_roller.help2.1")); + tooltip.addLine(StatCollector.translateToLocal("uie.gui.tooltip.paint_roller.help2.2")); + tooltip.addLine(StatCollector.translateToLocal("uie.gui.tooltip.paint_roller.help2.3")); + tooltip.addLine(StatCollector.translateToLocal("uie.gui.tooltip.paint_roller.help2.4")); + tooltip.addLine(StatCollector.translateToLocal("uie.gui.tooltip.paint_roller.help2.5")); + tooltip.addLine(StatCollector.translateToLocal("uie.gui.tooltip.paint_roller.help2.6")); + tooltip.addLine(StatCollector.translateToLocal("uie.gui.tooltip.paint_roller.help2.7")); + tooltip.addLine(StatCollector.translateToLocal("uie.gui.tooltip.paint_roller.help2.8")); + tooltip.addLine(StatCollector.translateToLocal("uie.gui.tooltip.paint_roller.help2.9")); + tooltip.addLine(StatCollector.translateToLocal("uie.gui.tooltip.paint_roller.help2.10")); + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/render/BlockColoredTexture.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/BlockColoredTexture.java index 93199d0f0..360396562 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/render/BlockColoredTexture.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/BlockColoredTexture.java @@ -25,8 +25,8 @@ public BlockColoredTexture(String name, float brightnessMultiplier) { } public BlockColoredTexture(String name, String baseName, BlockColored block, float brightnessMultiplier) { - this.baseName = baseName; this(name, block, brightnessMultiplier); + this.baseName = baseName; } public BlockColoredTexture(String name, BlockColored block, float brightnessMultiplier) { diff --git a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang index f626786ba..6c68f6c7c 100644 --- a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang +++ b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang @@ -699,6 +699,18 @@ uie.gui.tooltip.paint_roller.help.1=meaning that hex values will have uie.gui.tooltip.paint_roller.help.2=each of their RGB values rounded down uie.gui.tooltip.paint_roller.help.3=to the nearest number divisible by 8 +uie.gui.tooltip.paint_roller.help2.0=When your paint roller has a star next to it +uie.gui.tooltip.paint_roller.help2.1=like it does now, that means you copied from +uie.gui.tooltip.paint_roller.help2.2=a block that has extra functionality, for example +uie.gui.tooltip.paint_roller.help2.3=toggling its light. +uie.gui.tooltip.paint_roller.help2.4=Any dyeable block you paint that also has extra +uie.gui.tooltip.paint_roller.help2.5=functionality will have its toggle changed too. +uie.gui.tooltip.paint_roller.help2.6=§7 +uie.gui.tooltip.paint_roller.help2.7=Fun fact: The reason why dyeable blocks with +uie.gui.tooltip.paint_roller.help2.8=toggles can only have 2 options is because after +uie.gui.tooltip.paint_roller.help2.9=they store their color, they literally only have +uie.gui.tooltip.paint_roller.help2.10=one bit left to store extra data in. + # These are the prefixes used in the search bar of the trading post # For example: searching "sell:emerald" will find all trades that sell emeralds # If you are translating this, please make sure it's something short From 0f48d72c6608b42d5ad24fbf54b328b82f4f99e6 Mon Sep 17 00:00:00 2001 From: SuperSoupr <26164930+SuperSoupr@users.noreply.github.com> Date: Mon, 13 Jul 2026 22:02:30 +0300 Subject: [PATCH 08/17] Chromatic tooltips compat --- dependencies.gradle | 1 + .../common/blocks/BlockColored.java | 7 ++- .../common/items/ItemPaintRoller.java | 10 +++- .../utilitiesinexcess/compat/Mods.java | 3 +- .../ColorChromaticTooltip.java | 57 +++++++++++++++++++ .../compat/waila/TTRenderColoredBlock.java | 26 ++------- .../utils/ColorTooltipDrawHelper.java | 34 +++++++++++ 7 files changed, 112 insertions(+), 26 deletions(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/chromatictooltips/ColorChromaticTooltip.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ColorTooltipDrawHelper.java diff --git a/dependencies.gradle b/dependencies.gradle index c27ee6446..beafa7385 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -51,6 +51,7 @@ dependencies { compileOnly("com.github.GTNewHorizons:Postea:1.2.5:dev") {transitive = false} compileOnly("com.github.GTNewHorizons:SimpleSkinBackport:1.0.2-GTNH:dev") {transitive = false} compileOnly('com.falsepattern:endlessids-mc1.7.10:1.7.4:dev') {transitive = false} + compileOnly("com.github.slprime:ChromaticTooltips:1.0.29-GTNH:dev") {transitive = false} devOnlyNonPublishable("com.github.GTNewHorizons:NotEnoughItems:2.8.110-GTNH:dev") devOnlyNonPublishable("com.github.GTNewHorizons:Baubles-Expanded:2.2.21-GTNH:dev") diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java index a56a9e2aa..77c98ed86 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java @@ -28,6 +28,7 @@ import com.fouristhenumber.utilitiesinexcess.common.items.ItemPaintRoller; import com.fouristhenumber.utilitiesinexcess.common.recipe.RecipeLoader; import com.fouristhenumber.utilitiesinexcess.compat.Mods; +import com.fouristhenumber.utilitiesinexcess.compat.chromatictooltips.ColorChromaticTooltip; import com.fouristhenumber.utilitiesinexcess.compat.endlessids.EIDsHelper; import com.fouristhenumber.utilitiesinexcess.config.blocks.ColoredBlocksConfig; import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorBlock; @@ -274,7 +275,11 @@ public String getItemStackDisplayName(ItemStack stack) { public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean p_77624_4_) { super.addInformation(stack, player, tooltip, p_77624_4_); if (allowDyingBlocks()) { - tooltip.add("#" + Color.rgbToFullHexString(getRGBFromEIDMeta(stack.getItemDamage()))); + if (Mods.ChromaticTooltips.isLoaded()) { + tooltip.add(ColorChromaticTooltip.makeTooltip(getRGBFromEIDMeta(stack.getItemDamage()))); + } else { + tooltip.add("#" + Color.rgbToFullHexString(getRGBFromEIDMeta(stack.getItemDamage()))); + } } } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemPaintRoller.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemPaintRoller.java index ceb9e09d4..5a22735dd 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemPaintRoller.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemPaintRoller.java @@ -26,6 +26,8 @@ import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockColored; +import com.fouristhenumber.utilitiesinexcess.compat.Mods; +import com.fouristhenumber.utilitiesinexcess.compat.chromatictooltips.ColorChromaticTooltip; import com.fouristhenumber.utilitiesinexcess.compat.endlessids.EIDsHelper; import com.fouristhenumber.utilitiesinexcess.compat.mui.paintroller.PaintRollerColorPickerDialog; import com.fouristhenumber.utilitiesinexcess.network.PacketHandler; @@ -242,8 +244,12 @@ public void addInformation(ItemStack stack, EntityPlayer player, List to tooltip.add(StatCollector.translateToLocal("uie.gui.text.paint_roller.paintstripper")); } else { int color = getColorFromStack(stack); - if (color != 0xFFFFFF) { - tooltip.add("#" + Color.rgbToFullHexString(color)); + if (color != 0xF8F8F8) { + if (Mods.ChromaticTooltips.isLoaded()) { + tooltip.add(ColorChromaticTooltip.makeTooltip(color)); + } else { + tooltip.add("#" + Color.rgbToFullHexString(color)); + } } } String rightClickName = KeybindUtils diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java index d0d4826ee..abfdbd51d 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java @@ -22,7 +22,8 @@ public enum Mods { GT("gregtech_nh"), SimpleSkinBackport("simpleskinbackport"), EndlessIDs("endlessids"), - Angelica("angelica") + Angelica("angelica"), + ChromaticTooltips("chromatictooltips") ; // spotless:on diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/chromatictooltips/ColorChromaticTooltip.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/chromatictooltips/ColorChromaticTooltip.java new file mode 100644 index 000000000..f72b8423c --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/chromatictooltips/ColorChromaticTooltip.java @@ -0,0 +1,57 @@ +package com.fouristhenumber.utilitiesinexcess.compat.chromatictooltips; + +import org.lwjgl.opengl.GL11; + +import com.cleanroommc.modularui.utils.Color; +import com.fouristhenumber.utilitiesinexcess.utils.ColorTooltipDrawHelper; +import com.slprime.chromatictooltips.TooltipHandler; +import com.slprime.chromatictooltips.api.ITooltipComponent; +import com.slprime.chromatictooltips.api.TooltipContext; +import com.slprime.chromatictooltips.util.TooltipFontContext; + +public class ColorChromaticTooltip implements ITooltipComponent { + + private final int color; + private final String string; + + public ColorChromaticTooltip(int color) { + this.color = color; + this.string = " #" + Color.rgbToFullHexString(color); + } + + @Override + public int getWidth() { + return getHeight() + TooltipFontContext.getStringWidth(string); + } + + @Override + public int getHeight() { + return TooltipFontContext.getFontHeight() - getSpacing(); + } + + @Override + public int getSpacing() { + return TooltipFontContext.DEFAULT_SPACING; + } + + @Override + public void draw(int x, int y, int availableWidth, TooltipContext context) { + GL11.glTranslated(x, y, 0); + ColorTooltipDrawHelper.draw(getHeight(), string, color, TooltipFontContext.getColor(7)); + GL11.glTranslated(-x, -y, 0); + } + + public static String makeTooltip(int color) { + return TooltipHandler.getComponentId(new ColorChromaticTooltip(color)); + } + + @Override + public int hashCode() { + return color; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof ColorChromaticTooltip && ((ColorChromaticTooltip) obj).color == color; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/TTRenderColoredBlock.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/TTRenderColoredBlock.java index 1fa94cd05..790ff3ccd 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/TTRenderColoredBlock.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/TTRenderColoredBlock.java @@ -2,13 +2,9 @@ import java.awt.Dimension; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.Tessellator; - -import org.lwjgl.opengl.GL11; - import com.cleanroommc.modularui.utils.Color; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockColored; +import com.fouristhenumber.utilitiesinexcess.utils.ColorTooltipDrawHelper; import mcp.mobius.waila.api.IWailaCommonAccessor; import mcp.mobius.waila.api.IWailaTooltipRenderer; @@ -30,26 +26,12 @@ public static void register() { @Override public Dimension getSize(String[] params, IWailaCommonAccessor accessor) { string = " #" + Color.rgbToFullHexString(BlockColored.getRGBFromEIDMeta(accessor.getMetadata())); - return new Dimension(DisplayUtil.getDisplayWidth(string), 8); + return new Dimension(8 + DisplayUtil.getDisplayWidth(string), 8); } @Override public void draw(String[] params, IWailaCommonAccessor accessor) { - int previousTex = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); - - GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0); - int size = 8; - Tessellator t = Tessellator.instance; - t.startDrawingQuads(); - int color = BlockColored.getRGBFromEIDMeta(accessor.getMetadata()); - t.setColorRGBA(Color.getRed(color), Color.getGreen(color), Color.getBlue(color), 255); - t.addVertex(0, size, 0); - t.addVertex(size, size, 0); - t.addVertex(size, 0, 0); - t.addVertex(0, 0, 0); - t.draw(); - Minecraft.getMinecraft().fontRenderer.drawStringWithShadow(string, 8, 0, OverlayConfig.fontcolor); - - GL11.glBindTexture(GL11.GL_TEXTURE_2D, previousTex); + ColorTooltipDrawHelper + .draw(8, string, BlockColored.getRGBFromEIDMeta(accessor.getMetadata()), OverlayConfig.fontcolor); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ColorTooltipDrawHelper.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ColorTooltipDrawHelper.java new file mode 100644 index 000000000..d0be09e63 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ColorTooltipDrawHelper.java @@ -0,0 +1,34 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.Tessellator; + +import org.lwjgl.opengl.GL11; + +import com.cleanroommc.modularui.utils.Color; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ColorTooltipDrawHelper { + + // Moved to a helper class with minimal imports + // Used by both waila and chromatic tooltips compat + public static void draw(int size, String string, int color, int textColor) { + int previousTex = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); + + GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0); + Tessellator t = Tessellator.instance; + t.startDrawingQuads(); + t.setColorRGBA(Color.getRed(color), Color.getGreen(color), Color.getBlue(color), 255); + t.addVertex(0, size, 0); + t.addVertex(size, size, 0); + t.addVertex(size, 0, 0); + t.addVertex(0, 0, 0); + t.draw(); + Minecraft.getMinecraft().fontRenderer.drawStringWithShadow(string, 8, 0, textColor); + + GL11.glBindTexture(GL11.GL_TEXTURE_2D, previousTex); + } +} From 6392df65dcd620307c5e7bf17376b3802e94e21e Mon Sep 17 00:00:00 2001 From: SuperSoupr <26164930+SuperSoupr@users.noreply.github.com> Date: Tue, 14 Jul 2026 01:18:04 +0300 Subject: [PATCH 09/17] add @Optional --- .../utilitiesinexcess/common/blocks/BlockColoredCTM.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredCTM.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredCTM.java index 71b45e69a..da6ab4c40 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredCTM.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredCTM.java @@ -11,6 +11,9 @@ import com.prupe.mcpatcher.ctm.ICTMBlock; import com.prupe.mcpatcher.ctm.RenderBlockState; +import cpw.mods.fml.common.Optional; + +@Optional.Interface(iface = "com.prupe.mcpatcher.ctm.ICTMBlock", modid = "angelica") public class BlockColoredCTM extends BlockColoredWithUse implements ICTMBlock { public static final ArrayList CTM_COLORED_BLOCKS = new ArrayList<>(); @@ -40,6 +43,7 @@ public String getCustomNEIPage() { return "uie.nei.infopage.colored_blocks.ctm"; } + @Optional.Method(modid = "angelica") @Override public boolean shouldConnectByBlock(RenderBlockState renderBlockState, Block neighbor, int neighborX, int neighborY, int neighborZ) { From fbcbc03f64979e076fa4725253888ba773c25d44 Mon Sep 17 00:00:00 2001 From: SuperSoupr <26164930+SuperSoupr@users.noreply.github.com> Date: Tue, 14 Jul 2026 11:03:12 +0300 Subject: [PATCH 10/17] initColoredBlocks in FMLLoadCompleteEvent too --- .../fouristhenumber/utilitiesinexcess/CommonProxy.java | 9 +++++++++ .../utilitiesinexcess/UtilitiesInExcess.java | 6 ++++++ .../utilitiesinexcess/common/blocks/BlockColored.java | 1 + 3 files changed, 16 insertions(+) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java index eaca38386..271acb0a2 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java @@ -24,6 +24,7 @@ import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLInterModComms; +import cpw.mods.fml.common.event.FMLLoadCompleteEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.event.FMLServerStartingEvent; @@ -91,5 +92,13 @@ public void postInit(FMLPostInitializationEvent event) { } } + public void loadComplete(FMLLoadCompleteEvent event) { + + if (ColoredBlocksConfig.INSTANCE.enableColoredBlocks) { + BlockColored.initColoredBlocks(null); + } + + } + public void serverStarting(FMLServerStartingEvent event) {} } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java index 67b001156..bb0cd4835 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java @@ -25,6 +25,7 @@ import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.SidedProxy; import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLLoadCompleteEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.event.FMLServerStartingEvent; @@ -115,6 +116,11 @@ public void postInit(FMLPostInitializationEvent event) { proxy.postInit(event); } + @Mod.EventHandler + public void loadComplete(FMLLoadCompleteEvent event) { + proxy.loadComplete(event); + } + @Mod.EventHandler public void serverStarting(FMLServerStartingEvent event) { proxy.serverStarting(event); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java index 77c98ed86..40b7f3c64 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java @@ -88,6 +88,7 @@ public BlockColored(Block base, float brightnessMultiplier, int baseMeta) { // blocks, register their recipes, and registers them with the atlas // If angelica is present: initColoredBlocks() finds base blocks during CTM registration, mixin only registers with // atlas + // On load complete: try finding base blocks again, for dedicated servers public BlockColored(String baseModID, String baseName, int baseMeta, float brightnessMultiplier) { super(Material.rock); this.brightnessMultiplier = brightnessMultiplier; From 32cee51ca364b0f2203beba3ff8b8e4d57637636 Mon Sep 17 00:00:00 2001 From: SuperSoupr <26164930+SuperSoupr@users.noreply.github.com> Date: Tue, 14 Jul 2026 11:10:21 +0300 Subject: [PATCH 11/17] Colorable -> Dyeable --- src/main/resources/assets/utilitiesinexcess/lang/en_US.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang index 6c68f6c7c..660dd620a 100644 --- a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang +++ b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang @@ -574,10 +574,10 @@ uie.desc.item.unbreakable=Unbreakable uie.desc.item.architects_wand.1=Can place up to %s blocks at once -uie.desc.item.paint_roller.0=[§a%s§7] Colorable blocks to dye them +uie.desc.item.paint_roller.0=[§a%s§7] Dyeable blocks to dye them uie.desc.item.paint_roller.1=[§a%s§7] The air to select hex color uie.desc.item.paint_roller.2=[§aCrouch §7+ §a%s§7] Use line-mode -uie.desc.item.paint_roller.3=[§a%s§7] Colorable blocks to copy color +uie.desc.item.paint_roller.3=[§a%s§7] Dyeable blocks to copy color ### Item aliases item.heavenly_ring_magic.aliases=Angel Ring From 01988ad7f3792f3bf8c4c01c66fe2b8ba1298382 Mon Sep 17 00:00:00 2001 From: SuperSoupr <26164930+SuperSoupr@users.noreply.github.com> Date: Tue, 14 Jul 2026 11:18:57 +0300 Subject: [PATCH 12/17] paint roller issue --- .../utilitiesinexcess/common/items/ItemPaintRoller.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemPaintRoller.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemPaintRoller.java index 5a22735dd..40e739ac4 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemPaintRoller.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemPaintRoller.java @@ -5,7 +5,6 @@ import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -45,11 +44,6 @@ public ItemPaintRoller() { setContainerItem(this); } - @SideOnly(Side.CLIENT) - public void getSubBlocks(Item itemIn, CreativeTabs tab, List list) { - list.add(new ItemStack(itemIn, 1, 0b0_11111_11111_11111)); - } - public IIcon handleIcon; public IIcon featherIcon; public IIcon starIcon; @@ -189,7 +183,7 @@ public static int getColorFromStack(ItemStack stack) { int color; NBTTagCompound tag = stack.getTagCompound(); if (tag == null || !tag.hasKey("SelectedColor")) { - color = 0xFFFFFF; + color = 0xF8F8F8; } else { color = tag.getInteger("SelectedColor"); } From 15aca22b27f1228f2998387eed6cdb5e8a2c7545 Mon Sep 17 00:00:00 2001 From: SuperSoupr <26164930+SuperSoupr@users.noreply.github.com> Date: Tue, 14 Jul 2026 20:15:15 +0300 Subject: [PATCH 13/17] add glblend back to paint roller render --- .../common/renderers/PaintRollerRenderer.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/PaintRollerRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/PaintRollerRenderer.java index 466cd1130..8574a333a 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/PaintRollerRenderer.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/PaintRollerRenderer.java @@ -35,6 +35,10 @@ public void renderItem(ItemRenderType type, ItemStack stack, Object... data) { int color = ItemPaintRoller.getColorFromStack(stack); boolean paintStripper = ItemPaintRoller.getPaintStripperFromStack(stack); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glEnable(GL11.GL_BLEND); + ItemRenderUtil.applyStandardItemTransform(type); if (paintStripper) { @@ -53,5 +57,8 @@ public void renderItem(ItemRenderType type, ItemStack stack, Object... data) { if (Color.getAlpha(color) != 0) { ItemRenderUtil.renderItem(type, paintRoller.starIcon); } + + GL11.glDisable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_ALPHA_TEST); } } From 853bbf6db714093869e819d321a5ba7fcd2a2804 Mon Sep 17 00:00:00 2001 From: SuperSoupr <26164930+SuperSoupr@users.noreply.github.com> Date: Tue, 14 Jul 2026 20:38:54 +0300 Subject: [PATCH 14/17] fix paint roller crash with backhand --- .../network/client/PaintRollerColorSelect.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/network/client/PaintRollerColorSelect.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/network/client/PaintRollerColorSelect.java index 3de61e83c..e30fdeb85 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/network/client/PaintRollerColorSelect.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/network/client/PaintRollerColorSelect.java @@ -3,12 +3,14 @@ import net.minecraft.item.ItemStack; import com.fouristhenumber.utilitiesinexcess.common.items.ItemPaintRoller; +import com.fouristhenumber.utilitiesinexcess.compat.Mods; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; import cpw.mods.fml.relauncher.Side; import io.netty.buffer.ByteBuf; +import xonin.backhand.api.core.BackhandUtils; public class PaintRollerColorSelect implements IMessage { @@ -54,7 +56,12 @@ public IMessage onMessage(PaintRollerColorSelect message, MessageContext ctx) { if (ctx.side == Side.CLIENT) return null; ItemStack stack = ctx.getServerHandler().playerEntity.getHeldItem(); - if (!(stack.getItem() instanceof ItemPaintRoller)) return null; + if (stack == null || !(stack.getItem() instanceof ItemPaintRoller)) { + if (Mods.Backhand.isLoaded()) { + stack = BackhandUtils.getOffhandItem(ctx.getServerHandler().playerEntity); + } + } + if (stack == null || !(stack.getItem() instanceof ItemPaintRoller)) return null; ItemPaintRoller.setStackColor(stack, message.getColor(), message.getPaintStripper()); From 995df7ee4339b12cefcd0ad26e758f548341e1ff Mon Sep 17 00:00:00 2001 From: SuperSoupr <26164930+SuperSoupr@users.noreply.github.com> Date: Tue, 14 Jul 2026 20:45:23 +0300 Subject: [PATCH 15/17] don't disable alpha test in item renderers --- .../utilitiesinexcess/common/renderers/GloveRenderer.java | 1 - .../utilitiesinexcess/common/renderers/PaintRollerRenderer.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/GloveRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/GloveRenderer.java index eac93cd95..c4bc1bcd9 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/GloveRenderer.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/GloveRenderer.java @@ -63,7 +63,6 @@ public void renderItem(ItemRenderType type, ItemStack stack, Object... data) { ItemRenderUtil.renderItem(type, glove.bottomIcon); GL11.glDisable(GL11.GL_BLEND); - GL11.glDisable(GL11.GL_ALPHA_TEST); } public static float[] woolMetaToRGB(int dyeMeta) { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/PaintRollerRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/PaintRollerRenderer.java index 8574a333a..70ea78155 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/PaintRollerRenderer.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/PaintRollerRenderer.java @@ -59,6 +59,5 @@ public void renderItem(ItemRenderType type, ItemStack stack, Object... data) { } GL11.glDisable(GL11.GL_BLEND); - GL11.glDisable(GL11.GL_ALPHA_TEST); } } From 618d54a15e70d7c1a50514faf3046a37ad317200 Mon Sep 17 00:00:00 2001 From: SuperSoupr <26164930+SuperSoupr@users.noreply.github.com> Date: Tue, 14 Jul 2026 20:50:04 +0300 Subject: [PATCH 16/17] specify tooltip color in lang --- .../assets/utilitiesinexcess/lang/en_US.lang | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang index 660dd620a..b5692d154 100644 --- a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang +++ b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang @@ -674,7 +674,7 @@ uie.gui.text.paint_roller.confirm=Confirm ## Gui Tooltips uie.gui.tooltip.generator.energy-max=RF: %s / %s -uie.gui.tooltip.trading_post.help.0=Trade Controls: +uie.gui.tooltip.trading_post.help.0=§7Trade Controls: uie.gui.tooltip.trading_post.help.1=§6Left-Click§7 to Trade uie.gui.tooltip.trading_post.help.2=§6Shift + Left-Click§7 to Trade Stack uie.gui.tooltip.trading_post.help.3=§6Alt + Left-Click§7 to Favorite Trade @@ -694,22 +694,22 @@ uie.gui.tooltip.cabinet.slot=Slot: %s / %s uie.gui.tooltip.cabinet.upgrades=Upgrades: %d / %d uie.gui.tooltip.cabinet.search=Search -uie.gui.tooltip.paint_roller.help.0=Block colors are limited to 16-bit, -uie.gui.tooltip.paint_roller.help.1=meaning that hex values will have -uie.gui.tooltip.paint_roller.help.2=each of their RGB values rounded down -uie.gui.tooltip.paint_roller.help.3=to the nearest number divisible by 8 - -uie.gui.tooltip.paint_roller.help2.0=When your paint roller has a star next to it -uie.gui.tooltip.paint_roller.help2.1=like it does now, that means you copied from -uie.gui.tooltip.paint_roller.help2.2=a block that has extra functionality, for example -uie.gui.tooltip.paint_roller.help2.3=toggling its light. -uie.gui.tooltip.paint_roller.help2.4=Any dyeable block you paint that also has extra -uie.gui.tooltip.paint_roller.help2.5=functionality will have its toggle changed too. +uie.gui.tooltip.paint_roller.help.0=§7Block colors are limited to 16-bit, +uie.gui.tooltip.paint_roller.help.1=§7meaning that hex values will have +uie.gui.tooltip.paint_roller.help.2=§7each of their RGB values rounded down +uie.gui.tooltip.paint_roller.help.3=§7to the nearest number divisible by 8 + +uie.gui.tooltip.paint_roller.help2.0=§7When your paint roller has a star next to it +uie.gui.tooltip.paint_roller.help2.1=§7like it does now, that means you copied from +uie.gui.tooltip.paint_roller.help2.2=§7a block that has extra functionality, for example +uie.gui.tooltip.paint_roller.help2.3=§7toggling its light. +uie.gui.tooltip.paint_roller.help2.4=§7Any dyeable block you paint that also has extra +uie.gui.tooltip.paint_roller.help2.5=§7functionality will have its toggle changed too. uie.gui.tooltip.paint_roller.help2.6=§7 -uie.gui.tooltip.paint_roller.help2.7=Fun fact: The reason why dyeable blocks with -uie.gui.tooltip.paint_roller.help2.8=toggles can only have 2 options is because after -uie.gui.tooltip.paint_roller.help2.9=they store their color, they literally only have -uie.gui.tooltip.paint_roller.help2.10=one bit left to store extra data in. +uie.gui.tooltip.paint_roller.help2.7=§7Fun fact: The reason why dyeable blocks with +uie.gui.tooltip.paint_roller.help2.8=§7toggles can only have 2 options is because after +uie.gui.tooltip.paint_roller.help2.9=§7they store their color, they literally only have +uie.gui.tooltip.paint_roller.help2.10=§7one bit left to store extra data in. # These are the prefixes used in the search bar of the trading post # For example: searching "sell:emerald" will find all trades that sell emeralds From 065ddf0e86566923209c0fc52e86811911db746a Mon Sep 17 00:00:00 2001 From: SuperSoupr <26164930+SuperSoupr@users.noreply.github.com> Date: Tue, 14 Jul 2026 21:11:22 +0300 Subject: [PATCH 17/17] oops --- .../common/blocks/BlockLapisAetheriusDyable.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockLapisAetheriusDyable.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockLapisAetheriusDyable.java index 8ae5cbf8b..f6e179376 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockLapisAetheriusDyable.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockLapisAetheriusDyable.java @@ -28,6 +28,11 @@ public boolean useDefaultNEIPage() { return false; } + @Override + public String getCustomNEIPage() { + return null; + } + @Override public int getRenderType() { return UtilitiesInExcess.lapisAetheriusRenderID;