diff --git a/dependencies.gradle b/dependencies.gradle index c93eaaaaa..beafa7385 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} @@ -51,11 +51,12 @@ 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") 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/CommonProxy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java index 513034cc5..271acb0a2 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java @@ -49,9 +49,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 +64,10 @@ public void preInit(FMLPreInitializationEvent event) { if (ColoredBlocksConfig.INSTANCE.enableColoredBlocks) { BlockColored.registerConfigBlocks(); } + + if (Mods.NEI.isLoaded()) { + IMCForNEI.IMCSender(); + } } public void init(FMLInitializationEvent event) { @@ -94,7 +95,7 @@ public void postInit(FMLPostInitializationEvent event) { public void loadComplete(FMLLoadCompleteEvent event) { if (ColoredBlocksConfig.INSTANCE.enableColoredBlocks) { - BlockColored.initColoredBlocks(); + BlockColored.initColoredBlocks(null); } } 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..169c18014 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,15 @@ 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.COLORED_BLOCKS) { + if (block.useDefaultNEIPage()) { + sendInfoPage( + "utilitiesinexcess:" + block.getRegistryName(), + "uie.nei.infopage.colored_blocks.dyeable"); + } + if (block.getCustomNEIPage() != null) { + sendInfoPage("utilitiesinexcess:" + block.getRegistryName(), block.getCustomNEIPage()); } - } - - for (BlockColored block : BlockColored.CONFIG_COLORED_BLOCKS) { - sendInfoPage( - "utilitiesinexcess:" + ((AccessorBlock) block).uie$getUnlocalizedNameRaw(), - "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 3e65ca24f..40b7f3c64 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColored.java @@ -2,20 +2,20 @@ import java.util.ArrayList; 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; 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; @@ -24,13 +24,14 @@ 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.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; -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; @@ -42,65 +43,73 @@ // 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; - private final float colorMultiplier; + protected BaseBlock base; + private String baseModID; + private String baseName; + private boolean initialized = true; + private IIcon[] icons; + private int baseMeta = 0; + private String displayNameOverride = null; + 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) { + public BlockColored(Block base, float brightnessMultiplier) { + this(base, brightnessMultiplier, 0); + } + + 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)); // 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(base, this); + BASES_TO_COLORED.put(baseOf(base, baseMeta), 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) { + // 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 + // 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.colorMultiplier = colorMultiplier; + 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 = GameRegistry.findBlock(baseModID, baseName); + 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 \"" @@ -108,14 +117,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(); @@ -124,29 +140,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 @@ -187,84 +180,61 @@ 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); - } - } - - public static boolean hasColoredVersion(Block block) { - return BASES_TO_COLORED.containsKey(block); + world.markBlockForUpdate(x, y, z); } - 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)); } // - @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)); - } - } + // BlockColored-specific methods + public BaseBlock getBase() { + return base; } - @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); + public float getBrightnessMultiplier() { + return brightnessMultiplier; } - @Override - @SideOnly(Side.CLIENT) - public int getRenderColor(int meta) { - return allowDyingBlocks() ? getRGBFromEIDMeta(meta) : ColorUtils.getHexColorFromWoolMeta(meta); + public boolean ignoreBaseMeta() { + return false; } - @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; - } + public boolean usesExtraBit() { + return false; + } - // 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); + public boolean useDefaultNEIPage() { + return true; + } - return result; - // return super.getPickBlock(target, world, x, y, z, player); + public void setDisplayNameOverride(String displayName) { + this.displayNameOverride = displayName; } - public Block getBase() { - return base; + public String getDisplayNameOverride() { + return displayNameOverride; } - public boolean ignoreBaseMeta() { - return false; + public String getCustomNEIPage() { + return null; } - public boolean usesExtraBit() { - return false; + // IUIEModBLock + private String registryName; + + @Override + public void setRegistryName(String name) { + registryName = name; } - public boolean useNEIPage() { - return true; + @Override + public String getRegistryName() { + return registryName; } + // Item public static class ItemBlockColored extends ItemBlock { public ItemBlockColored(Block block) { @@ -281,10 +251,18 @@ 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()) - .getItemStackDisplayName(stack); - stack.setItemDamage(dmg); + BlockColored bc = (BlockColored) field_150939_a; + 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); @@ -298,11 +276,16 @@ 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()))); + } } } } + // Config colored blocks handling public static final ArrayList CONFIG_COLORED_BLOCKS = new ArrayList<>(); public static void registerConfigBlocks() { @@ -318,9 +301,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] @@ -328,69 +311,256 @@ 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 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] + + "\" 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); - GameRegistry.registerBlock( - newBlock, - ItemBlockColored.class, - ((AccessorBlock) newBlock).uie$getUnlocalizedNameRaw()); - + newBlock.setRegistryName(((AccessorBlock) newBlock).uie$getUnlocalizedNameRaw()); + 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(); + } + + protected void actuallyRegisterBlockIcons(Map mapRegisteredSprites) { + + IIcon[] icons = new IIcon[6]; + HashSet names = new HashSet<>(); + + 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); + mapRegisteredSprites.put(textureName, icon); + iconMap.put(name, icon); + } + + for (int i = 0; i < 6; i++) { + 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]; + } + + // 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) { + 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) { - 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() == null || getBase().getBlock() == null) ? super.getRenderBlockPass() + : getBase().getBlock() + .getRenderBlockPass(); } @Override public boolean renderAsNormalBlock() { - return getBase().renderAsNormalBlock(); + return (getBase() == null || getBase().getBlock() == null) ? super.renderAsNormalBlock() + : getBase().getBlock() + .renderAsNormalBlock(); } @Override public boolean isOpaqueCube() { - return getBase() == null ? super.isOpaqueCube() : getBase().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().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().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().getLightOpacity(world, x, y, z); + return (getBase() == null || getBase().getBlock() == null) ? super.getLightOpacity(world, x, y, z) + : 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..da6ab4c40 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredCTM.java @@ -0,0 +1,76 @@ +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; + +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<>(); + + 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); + } + + public BlockColoredCTM(String baseModID, String baseName, int baseMeta, float brightnessMultiplier) { + super(baseModID, baseName, baseMeta, brightnessMultiplier); + CTM_COLORED_BLOCKS.add(this); + } + + @Override + 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) { + 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); + } + + 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/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/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/BlockColoredWithUse.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredWithUse.java new file mode 100644 index 000000000..2fee4f070 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockColoredWithUse.java @@ -0,0 +1,53 @@ +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); + } + + public BlockColoredWithUse(String baseModID, String baseName, int baseMeta, float brightnessMultiplier) { + super(baseModID, baseName, baseMeta, brightnessMultiplier); + } + + @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..f6e179376 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 BlockColored { +public class BlockLapisAetheriusDyable extends BlockColoredWithLight { public BlockLapisAetheriusDyable() { super(ModBlocks.LAPIS_AETHERIUS.get()); @@ -29,39 +18,19 @@ 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 useDefaultNEIPage() { + return false; } @Override - public boolean useNEIPage() { - return false; + public String getCustomNEIPage() { + return null; } @Override @@ -74,34 +43,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); @@ -111,13 +53,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/common/items/ItemPaintRoller.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemPaintRoller.java index da84e9338..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; @@ -26,6 +25,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; @@ -43,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; @@ -73,37 +69,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 +123,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 +139,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 +164,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); } } @@ -178,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"); } @@ -233,8 +238,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/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/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 466cd1130..70ea78155 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,7 @@ public void renderItem(ItemRenderType type, ItemStack stack, Object... data) { if (Color.getAlpha(color) != 0) { ItemRenderUtil.renderItem(type, paintRoller.starIcon); } + + GL11.glDisable(GL11.GL_BLEND); } } 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/Mods.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java index f840746df..abfdbd51d 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java @@ -21,7 +21,9 @@ public enum Mods { Backhand("backhand"), GT("gregtech_nh"), SimpleSkinBackport("simpleskinbackport"), - EndlessIDs("endlessids") + EndlessIDs("endlessids"), + Angelica("angelica"), + ChromaticTooltips("chromatictooltips") ; // 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..659ed5c84 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/angelica/coloredblocks/CTMForColoredBlocks.java @@ -0,0 +1,56 @@ +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; + +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) -> { + 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/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/mui/paintroller/PaintRollerColorPickerDialog.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/paintroller/PaintRollerColorPickerDialog.java index 5fbf8b002..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 @@ -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; @@ -64,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) @@ -222,6 +231,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 +259,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 +272,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 +340,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); @@ -360,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/compat/waila/ColoredBlocksDataProvider.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/ColoredBlocksDataProvider.java index fde83efb2..ae314485f 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/ColoredBlocksDataProvider.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/ColoredBlocksDataProvider.java @@ -10,7 +10,8 @@ import net.minecraft.world.World; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockColored; -import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockLapisAetheriusDyable; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockColoredCTM; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockColoredWithLight; import mcp.mobius.waila.api.IWailaConfigHandler; import mcp.mobius.waila.api.IWailaDataAccessor; @@ -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 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")); + } } return currentTip; 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/config/blocks/ColoredBlocksConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/ColoredBlocksConfig.java index eadd7a286..346ce859e 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,32 @@ 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", + "Example: minecraft;pumpkin;0;1.5;ROTATABLE", + "" + }) + // 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/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()); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/render/BlockColoredTexture.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/BlockColoredTexture.java index 748376d4d..360396562 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/render/BlockColoredTexture.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/BlockColoredTexture.java @@ -12,17 +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; - public BlockColoredTexture(String name, BlockColored block, float colorMultiplier) { + private String baseName; + + public BlockColoredTexture(String name, float brightnessMultiplier) { + this(name, null, brightnessMultiplier); + } + + public BlockColoredTexture(String name, String baseName, BlockColored block, float brightnessMultiplier) { + this(name, block, brightnessMultiplier); + this.baseName = baseName; + } + + public BlockColoredTexture(String name, BlockColored block, float brightnessMultiplier) { super(name); this.block = block; - this.colorMultiplier = colorMultiplier; + this.brightnessMultiplier = brightnessMultiplier; } @Override @@ -32,22 +42,42 @@ 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 { - 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 baseLocation; + 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++) { @@ -58,27 +88,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/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); + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang index ecefbd173..b5692d154 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,8 @@ 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 item.block_analyzer.name=Block Analyzer @@ -570,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 @@ -670,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 @@ -690,10 +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.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=§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