Compare commits

...
20 Commits
Author SHA1 Message Date
SuperSoupr 93485e1525 Clarify IWailaVariableWidthTooltipRenderer.getSize's documentation (#53) 2025-11-14 06:29:41 +01:00
ceb94e3e2c fix loader check (#45)
Co-authored-by: Martin Robertz <[email protected]>
Co-authored-by: SuperSoupr <[email protected]>
2025-11-11 18:29:45 +00:00
SuperSouprandsisyphussy 8ea26bf073 Add gradient to fluid bar to improve visibility (#49)
Co-authored-by: sisyphussy <[email protected]>
2025-11-11 18:50:58 +01:00
Worive 2aabfdb64c Rename hasAdvancedBody to hasWailaAdvancedBody (#48) 2025-10-25 14:04:28 +02:00
Martin Robertz a34460c159 update 2025-10-24 22:59:20 +02:00
SuperSouprandSuper 1f3fd64a38 Use special comma for renderer formatting (#47)
Co-authored-by: Super <[email protected]>
2025-10-24 13:29:56 +02:00
Martin Robertz 191a916896 update 2025-10-22 21:39:31 +02:00
SuperSouprandSuper ee1ed27a3a Add fancy fluid tooltip renderer (#43)
Co-authored-by: Super <[email protected]>
2025-10-22 21:33:06 +02:00
SuperSoupr 07b9d1bf92 Add documentation for IWailaVariableWidthTooltipRenderer (#44) 2025-10-20 21:47:51 +00:00
SuperSouprandSuper e82729a113 Add variable width tooltip renderer support (#42)
Co-authored-by: Super <[email protected]>
2025-10-20 21:55:03 +02:00
Dream Master c938ccf542 update 2025-10-13 14:42:49 +02:00
c2e8b44f2b Draw thaumcraft aspect icons in tooltip (#41)
Co-authored-by: Super <[email protected]>
Co-authored-by: Martin Robertz <[email protected]>
2025-10-13 14:22:46 +02:00
Martin Robertz c4e3537957 update 2025-10-01 17:23:42 +02:00
EmperorSuper 9bc1e79f64 Add Gadomancy support (Thaumic Sight enchant) (#40) 2025-10-01 08:12:13 +02:00
Martin Robertz bdebd737d6 update 2025-09-21 17:20:45 +02:00
WoriveandMartin Robertz 9f04d3d029 feat(api): Add support for advanced tooltip body (#38)
Co-authored-by: Martin Robertz <[email protected]>
2025-09-21 17:19:57 +02:00
Martin Robertz ef3c4a9774 update 2025-09-17 13:52:33 +02:00
Alexdoru 3b64d21335 change log level of callbackRegistration (#39) 2025-09-16 11:26:17 +02:00
Alexdoru 72c91a3700 Fix FMLLoadCompleteEvent using wrong annotation (#37) 2025-07-14 00:22:10 +00:00
Alexdoru bf6d309038 Delete redundant registration via reflection (#36) 2025-07-13 21:58:24 +02:00
31 changed files with 492 additions and 36 deletions

No files matched your search

+3 -1
View File
@@ -1,7 +1,9 @@
// Add your dependencies here
dependencies {
implementation('com.github.GTNewHorizons:NotEnoughItems:2.7.59-GTNH:dev')
implementation('com.github.GTNewHorizons:NotEnoughItems:2.8.20-GTNH:dev')
shadowImplementation('au.com.bytecode:opencsv:2.4')
compileOnly("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.69:dev") { transitive = false }
}
+4 -2
View File
@@ -96,7 +96,9 @@ usesMixinDebug = false
# Specify the location of your implementation of IMixinConfigPlugin. Leave it empty otherwise.
mixinPlugin =
# Specify the package that contains all of your Mixins. You may only place Mixins in this package or the build will fail!
# Specify the package that contains all of your Mixins. The package must exist or
# the build will fail. If you have a package property defined in your mixins.<modid>.json,
# it must match with this or the build will fail.
mixinsPackage =
# Specify the core mod entry class if you use a core mod. This class must implement IFMLLoadingPlugin!
@@ -151,7 +153,7 @@ modrinthProjectId =
# type can be one of [project, version],
# and the name is the Modrinth project or version slug/id of the other mod.
# Example: required-project:fplib;optional-project:gasstation;incompatible-project:gregtech
# Note: GTNH Mixins is automatically set as a required dependency if usesMixins = true
# Note: UniMixins is automatically set as a required dependency if usesMixins = true.
modrinthRelations =
# Publishing to CurseForge requires you to set the CURSEFORGE_TOKEN environment variable to one of your CurseForge API tokens.
+1 -1
View File
@@ -17,7 +17,7 @@ pluginManagement {
}
plugins {
id 'com.gtnewhorizons.gtnhsettingsconvention' version '1.0.38'
id 'com.gtnewhorizons.gtnhsettingsconvention' version '1.0.46'
}
+1 -13
View File
@@ -1,6 +1,5 @@
package mcp.mobius.waila;
import java.lang.reflect.Field;
import java.util.Map;
import net.minecraftforge.common.MinecraftForge;
@@ -8,11 +7,7 @@ import net.minecraftforge.common.MinecraftForge;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.FMLModContainer;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.Mod.Instance;
@@ -69,13 +64,6 @@ public class Waila {
@EventHandler
public void initialize(FMLInitializationEvent event) {
try {
Field eBus = FMLModContainer.class.getDeclaredField("eventBus");
eBus.setAccessible(true);
EventBus FMLbus = (EventBus) eBus.get(FMLCommonHandler.instance().findContainerFor(this));
FMLbus.register(this);
} catch (Throwable ignored) {}
if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) {
MinecraftForge.EVENT_BUS.register(new DecoratorRenderer());
FMLCommonHandler.instance().bus().register(new KeyEvent());
@@ -90,7 +78,7 @@ public class Waila {
ModIdentification.init();
}
@Subscribe
@EventHandler
public void loadComplete(FMLLoadCompleteEvent event) {
proxy.registerMods();
proxy.registerIMCs();
@@ -20,6 +20,7 @@ import net.minecraft.world.World;
import mcp.mobius.waila.api.IWailaConfigHandler;
import mcp.mobius.waila.api.IWailaDataAccessor;
import mcp.mobius.waila.api.IWailaDataProvider;
import mcp.mobius.waila.api.SpecialChars;
import mcp.mobius.waila.cbcore.LangUtil;
public class HUDHandlerIAspectContainer implements IWailaDataProvider {
@@ -57,9 +58,10 @@ public class HUDHandlerIAspectContainer implements IWailaDataProvider {
total += value;
String amount = String.valueOf(value);
if (!aspect.equals("???"))
currenttip.add(String.format("%s" + TAB + ALIGNRIGHT + WHITE + "%s", aspect, amount));
else unknownAspects.add(String.format("%s" + TAB + ALIGNRIGHT + WHITE + "%s", aspect, amount));
if (!aspect.equals("???")) currenttip.add(
SpecialChars.getRenderString("waila.tcaspect", aspect) + TAB + ALIGNRIGHT + WHITE + amount);
else unknownAspects.add(
SpecialChars.getRenderString("waila.tcaspect", aspect) + TAB + ALIGNRIGHT + WHITE + amount);
}
String id = tag.getString("WailaID");
@@ -97,7 +99,7 @@ public class HUDHandlerIAspectContainer implements IWailaDataProvider {
ItemStack headSlot = player.inventory.armorInventory[3];
if (headSlot == null) return tag;
boolean hasReveal = ThaumcraftModule.IGoggles.isInstance(headSlot.getItem());
boolean hasReveal = ThaumcraftModule.isGoggles.apply(headSlot);
if (!hasReveal) return tag;
Map<String, ?> knownAspects = (Map<String, ?>) ThaumcraftModule.CommonProxy_getKnownAspects
@@ -118,7 +120,7 @@ public class HUDHandlerIAspectContainer implements IWailaDataProvider {
if (tileAspects.get(o) > 0) {
if (playerAspects.containsKey(o)) {
NBTTagCompound cmptag = new NBTTagCompound();
cmptag.setString("key", (String) ThaumcraftModule.Aspect_getName.invoke(o));
cmptag.setString("key", (String) ThaumcraftModule.Aspect_tag.get(o));
cmptag.setInteger("value", tileAspects.get(o));
aspects.appendTag(cmptag);
} else {
@@ -1,9 +1,13 @@
package mcp.mobius.waila.addons.thaumcraft;
import java.awt.Color;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.function.Function;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ResourceLocation;
import org.apache.logging.log4j.Level;
@@ -28,12 +32,19 @@ public class ThaumcraftModule {
public static Class<?> Aspect = null;
public static Field Aspect_tag = null;
public static Method Aspect_getName = null;
public static Method Aspect_getAspect = null;
public static Method Aspect_getImage = null;
public static Method Aspect_getColor = null;
public static Class<?> CommonProxy = null;
public static Method CommonProxy_getKnownAspects = null;
public static Class<?> IGoggles = null;
public static ResourceLocation unknownAspectTexture = null;
public static Color unknownAspectColor = null;
public static Function<ItemStack, Boolean> isGoggles = stack -> IGoggles.isInstance(stack.getItem());
public static void register() {
try {
Thaumcraft = Class.forName("thaumcraft.common.Thaumcraft");
@@ -53,12 +64,18 @@ public class ThaumcraftModule {
Aspect_tag = Aspect.getDeclaredField("tag");
Aspect_tag.setAccessible(true);
Aspect_getName = Aspect.getDeclaredMethod("getName");
Aspect_getAspect = Aspect.getMethod("getAspect", java.lang.String.class);
Aspect_getImage = Aspect.getDeclaredMethod("getImage");
Aspect_getColor = Aspect.getDeclaredMethod("getColor");
CommonProxy = Class.forName("thaumcraft.common.CommonProxy");
CommonProxy_getKnownAspects = CommonProxy.getDeclaredMethod("getKnownAspects");
IGoggles = Class.forName("thaumcraft.api.IGoggles");
unknownAspectTexture = new ResourceLocation("thaumcraft", "textures/aspects/_unknown.png");
unknownAspectColor = new Color(0x654242);
ModuleRegistrar.instance().addConfigRemote("Thaumcraft", "thaumcraft.aspects");
ModuleRegistrar.instance().registerBodyProvider(new HUDHandlerIAspectContainer(), IAspectContainer);
ModuleRegistrar.instance().registerBodyProvider(new HUDHandlerIAspectContainer(), TileAlchemyFurnace);
@@ -0,0 +1,41 @@
package mcp.mobius.waila.addons.thaumcraftGadomancy;
import java.lang.reflect.Field;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.EnchantmentHelper;
import org.apache.logging.log4j.Level;
import mcp.mobius.waila.Waila;
import mcp.mobius.waila.addons.thaumcraft.ThaumcraftModule;
public class GadomancyModule {
public static Class<?> RegisteredEnchantments = null;
public static Field RegisteredEnchantments_revealer = null;
public static int revealerEffectId;
public static void register() {
try {
RegisteredEnchantments = Class.forName("makeo.gadomancy.common.registration.RegisteredEnchantments");
RegisteredEnchantments_revealer = RegisteredEnchantments.getDeclaredField("revealer");
Object revealer = RegisteredEnchantments_revealer.get(null);
revealerEffectId = ((Enchantment) revealer).effectId;
ThaumcraftModule.isGoggles = stack -> ThaumcraftModule.IGoggles.isInstance(stack.getItem())
|| EnchantmentHelper.getEnchantmentLevel(revealerEffectId, stack) > 0;
} catch (ClassNotFoundException e) {
Waila.log.log(Level.INFO, "[Thaumcraft Gadomancy] Gadomancy mod not found.");
return;
} catch (Exception e) {
Waila.log.log(Level.WARN, "[Thaumcraft Gadomancy] Unhandled exception. {}", e);
return;
}
Waila.log.log(Level.INFO, "Gadomancy mod found.");
}
}
@@ -62,6 +62,35 @@ public interface IWailaDataProvider {
List<String> getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
IWailaConfigHandler config);
/**
* Callback used to determine if there is extended information to display for the Body section. If this returns
* true, Waila will either display the "Hold <KEY> for more info" prompt or call getWailaAdvancedBody if the key is
* being held.
*
* @param itemStack Current block scanned, in ItemStack form.
* @param accessor Contains most of the relevant information about the current environment.
* @param config Current configuration of Waila.
* @return True if advanced body information is available, false otherwise.
*/
default boolean hasWailaAdvancedBody(ItemStack itemStack, IWailaDataAccessor accessor, IWailaConfigHandler config) {
return false; // Default to false for backward compatibility
}
/**
* Callback used to add the extended lines to the Body section of the tooltip. This method is ONLY called if
* hasAdvancedBody returns true AND the player is holding the configured key for advanced tooltips.
*
* @param itemStack Current block scanned, in ItemStack form.
* @param currenttip The current list of tooltip lines, including the normal body.
* @param accessor Contains most of the relevant information about the current environment.
* @param config Current configuration of Waila.
* @return Modified input currenttip with advanced information appended.
*/
default List<String> getWailaAdvancedBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
IWailaConfigHandler config) {
return currenttip; // Default to returning the unmodified list
}
/**
* Callback used to add lines to one of the three sections of the tooltip (Head, Body, Tail).</br>
* Will be used if the implementing class is registered via {@link IWailaRegistrar}.{@link registerTailProvider}
@@ -0,0 +1,42 @@
package mcp.mobius.waila.api;
import java.awt.Dimension;
/**
* Interface for tooltip renderers that adjust their width depending on the width of the rest of the tooltip.
* setMaxLineWidth is called by {@link mcp.mobius.waila.overlay.Tooltip} before every tooltip render to inform the
* renderer of the width of the longest line in the tooltip.
*/
public interface IWailaVariableWidthTooltipRenderer extends IWailaTooltipRenderer {
/**
* Return the size of the tooltip. for variable width renderers it is recommended to return the minimum width needed
* for the line, then draw the actual width using getMaxLineWidth(). They do not need to actually match.
*
* @param params Array of string parameters as passed to the RENDER arg in the tooltip
* ({rendername,param1,param2,...})
* @param accessor A global accessor for TileEntities and Entities
* @return Dimension of the reserved area
*/
Dimension getSize(String[] params, IWailaCommonAccessor accessor);
/**
* Informs the renderer of what the length of the longest line is.</br>
* Called by {@link mcp.mobius.waila.overlay.Tooltip} before every tooltip render.</br>
*
* @param width The width of the longest line in the tooltip.
*
*/
void setMaxLineWidth(int width);
/**
* Returns the width of the longest line in the current tooltip.</br>
* With icons disabled the tooltip's background box is always 2 pixels wider to the right of the line than it is to
* the left.</br>
*
* @return The width of the longest line in the tooltip
*
*/
int getMaxLineWidth();
}
@@ -33,6 +33,7 @@ public class SpecialChars {
public static String WailaStyle = "\u00A4";
public static String WailaIcon = "\u00A5";
public static String WailaRenderer = "\u00A6";
public static String WailaRendererComma = "\u0082";
public static String TAB = WailaStyle + WailaStyle + "a";
public static String ALIGNRIGHT = WailaStyle + WailaStyle + "b";
public static String ALIGNCENTER = WailaStyle + WailaStyle + "c";
@@ -43,12 +44,19 @@ public class SpecialChars {
public static final Pattern patternMinecraft = Pattern.compile("(?i)" + MCStyle + "[0-9A-FK-OR]");
public static final Pattern patternWaila = Pattern.compile("(?i)(" + WailaStyle + "(?<type>..))");
public static final Pattern patternRender = Pattern
.compile("(?i)(" + RENDER + "\\{(?<name>[^,}]*),?(?<args>[^}]*)\\})");
// (?i)(¤¦a\{(?<name>[^U+0082}]*)U+0082?(?<args>[^}]*)\})
public static final Pattern patternRender = Pattern.compile(
"(?i)(" + RENDER
+ "\\{(?<name>[^"
+ WailaRendererComma
+ "}]*)"
+ WailaRendererComma
+ "?(?<args>[^}]*)\\})");
public static final Pattern patternTab = Pattern.compile("(?i)" + TAB);
public static final Pattern patternRight = Pattern.compile("(?i)" + ALIGNRIGHT);
public static final Pattern patternCenter = Pattern.compile("(?i)" + ALIGNCENTER);
public static final Pattern patternIcon = Pattern.compile("(?i)(" + WailaStyle + WailaIcon + "(?<type>[0-9a-z]))");
// (?i)(¤¤[^¤]+|¤¥[0-9A-Z]|¤¦a\{(?<name>[^U+0082}]*)U+0082?(?<args>[^}]*)\}|[^¤]+)
public static final Pattern patternLineSplit = Pattern.compile(
"(?i)(" + WailaStyle
+ WailaStyle
@@ -60,7 +68,11 @@ public class SpecialChars {
+ "[0-9A-Z]|"
+ WailaStyle
+ WailaRenderer
+ "a\\{([^,}]*),?([^}]*)\\}|[^"
+ "a\\{(?<name>[^"
+ WailaRendererComma
+ "}]*)"
+ WailaRendererComma
+ "?(?<args>[^}]*)\\}|[^"
+ WailaStyle
+ "]+)");
@@ -71,7 +83,7 @@ public class SpecialChars {
public static String getRenderString(String name, String... params) {
StringBuilder result = new StringBuilder(RENDER + "{" + name);
for (String s : params) {
result.append(",").append(s);
result.append(WailaRendererComma).append(s);
}
result.append("}");
return result.toString();
@@ -34,6 +34,8 @@ public class ConfigHandler implements IWailaConfigHandler {
public HashMap<String, Boolean> forcedConfigs = new HashMap<>();
public Configuration config = null;
public String fluidUnit;
public void addModule(String modName, HashMap<String, String> options) {
this.addModule(modName, new ConfigModule(modName, options));
}
@@ -150,6 +152,7 @@ public class ConfigHandler implements IWailaConfigHandler {
config.get(Configuration.CATEGORY_GENERAL, Constants.CFG_WAILA_KEYBIND, true);
config.get(Configuration.CATEGORY_GENERAL, Constants.CFG_WAILA_NEWFILTERS, true);
config.get(Configuration.CATEGORY_GENERAL, Constants.CFG_WAILA_SHOWICON, true);
fluidUnit = config.get(Configuration.CATEGORY_GENERAL, Constants.CFG_WAILA_FLUIDUNIT, "mB").getString();
OverlayConfig.posX = config.get(Configuration.CATEGORY_GENERAL, Constants.CFG_WAILA_POSX, 5000).getInt();
OverlayConfig.posY = config.get(Configuration.CATEGORY_GENERAL, Constants.CFG_WAILA_POSY, 100).getInt();
@@ -6,6 +6,7 @@ import java.util.Map;
import java.util.TreeMap;
import net.minecraft.block.Block;
import net.minecraft.client.settings.GameSettings;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
@@ -17,7 +18,9 @@ import mcp.mobius.waila.Waila;
import mcp.mobius.waila.api.IWailaBlock;
import mcp.mobius.waila.api.IWailaDataProvider;
import mcp.mobius.waila.api.IWailaEntityProvider;
import mcp.mobius.waila.cbcore.LangUtil;
import mcp.mobius.waila.cbcore.Layout;
import mcp.mobius.waila.client.KeyEvent;
import mcp.mobius.waila.network.Message0x01TERequest;
import mcp.mobius.waila.network.Message0x03EntRequest;
import mcp.mobius.waila.network.WailaPacketHandler;
@@ -146,11 +149,29 @@ public class MetaDataProvider {
}
if (layout == Layout.BODY) for (List<IWailaDataProvider> providersList : bodyBlockProviders.values()) {
boolean hasAdvancedBodyAvailable = false;
final boolean isAdvancedKeyDown = KeyEvent.key_show_advanced.getIsKeyPressed();
for (IWailaDataProvider dataProvider : providersList) try {
currenttip = dataProvider.getWailaBody(itemStack, currenttip, accessor, ConfigHandler.instance());
if (dataProvider.hasWailaAdvancedBody(itemStack, accessor, ConfigHandler.instance())) {
hasAdvancedBodyAvailable = true;
if (isAdvancedKeyDown) {
currenttip = dataProvider
.getWailaAdvancedBody(itemStack, currenttip, accessor, ConfigHandler.instance());
}
}
} catch (Throwable e) {
currenttip = WailaExceptionHandler.handleErr(e, dataProvider.getClass().toString(), currenttip);
}
if (hasAdvancedBodyAvailable && !isAdvancedKeyDown) {
String keyName = GameSettings.getKeyDisplayString(KeyEvent.key_show_advanced.getKeyCode());
currenttip.add(LangUtil.translateG("hud.msg.holdkeymoreinfo", keyName));
}
}
if (layout == Layout.FOOTER) for (List<IWailaDataProvider> providersList : tailBlockProviders.values()) {
for (IWailaDataProvider dataProvider : providersList) try {
@@ -23,6 +23,7 @@ public class KeyEvent {
public static KeyBinding key_liquid;
public static KeyBinding key_recipe;
public static KeyBinding key_usage;
public static KeyBinding key_show_advanced;
public KeyEvent() {
ClientRegistry
@@ -35,6 +36,8 @@ public class KeyEvent {
key_recipe = new KeyBinding(Constants.BIND_WAILA_RECIPE, Keyboard.KEY_NUMPAD3, "Waila"));
ClientRegistry.registerKeyBinding(
key_usage = new KeyBinding(Constants.BIND_WAILA_USAGE, Keyboard.KEY_NUMPAD4, "Waila"));
ClientRegistry.registerKeyBinding(
key_show_advanced = new KeyBinding(Constants.BIND_WAILA_SHOW_ADVANCED, Keyboard.KEY_LSHIFT, "Waila"));
}
@SubscribeEvent
@@ -17,6 +17,8 @@ import mcp.mobius.waila.handlers.HUDHandlerBlocks;
import mcp.mobius.waila.handlers.HUDHandlerEntities;
import mcp.mobius.waila.handlers.VanillaTooltipHandler;
import mcp.mobius.waila.handlers.nei.NEIHandler;
import mcp.mobius.waila.overlay.tooltiprenderers.TTRenderAspectString;
import mcp.mobius.waila.overlay.tooltiprenderers.TTRenderFluidBar;
import mcp.mobius.waila.overlay.tooltiprenderers.TTRenderHealth;
import mcp.mobius.waila.overlay.tooltiprenderers.TTRenderProgressBar;
import mcp.mobius.waila.overlay.tooltiprenderers.TTRenderStack;
@@ -53,6 +55,9 @@ public class ProxyClient extends ProxyServer {
ModuleRegistrar.instance().registerTooltipRenderer("waila.health", new TTRenderHealth());
ModuleRegistrar.instance().registerTooltipRenderer("waila.stack", new TTRenderStack());
ModuleRegistrar.instance().registerTooltipRenderer("waila.progress", new TTRenderProgressBar());
ModuleRegistrar.instance().registerTooltipRenderer("waila.fluid", new TTRenderFluidBar());
ModuleRegistrar.instance().registerTooltipRenderer("waila.tcaspect", new TTRenderAspectString());
MinecraftForge.EVENT_BUS.register(new WorldUnloadEventHandler());
}
@@ -2,7 +2,6 @@ package mcp.mobius.waila.handlers;
import static mcp.mobius.waila.api.SpecialChars.BLUE;
import static mcp.mobius.waila.api.SpecialChars.ITALIC;
import static mcp.mobius.waila.api.SpecialChars.RENDER;
import java.util.List;
@@ -72,7 +71,7 @@ public class HUDHandlerBlocks implements IWailaDataProvider {
@Override
public List<String> getWailaTail(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
IWailaConfigHandler config) {
currenttip.add(RENDER + "{Plip}" + RENDER + "{Plop,thisisatest,222,333}");
// currenttip.add(RENDER + "{Plip}" + RENDER + "{Plop,thisisatest,222,333}");
String modName = ModIdentification.nameFromStack(itemStack);
if (modName != null && !modName.isEmpty()) {
@@ -23,6 +23,7 @@ import net.minecraft.item.ItemStack;
import org.lwjgl.opengl.GL11;
import mcp.mobius.waila.api.IWailaTooltipRenderer;
import mcp.mobius.waila.api.SpecialChars;
import mcp.mobius.waila.api.impl.DataAccessorCommon;
import mcp.mobius.waila.api.impl.ModuleRegistrar;
import mcp.mobius.waila.utils.WailaExceptionHandler;
@@ -41,8 +42,9 @@ public class DisplayUtil {
Matcher renderMatcher = patternRender.matcher(s);
while (renderMatcher.find()) {
IWailaTooltipRenderer renderer = ModuleRegistrar.instance().getTooltipRenderer(renderMatcher.group("name"));
if (renderer != null)
width += renderer.getSize(renderMatcher.group("args").split(","), DataAccessorCommon.instance).width;
if (renderer != null) width += renderer.getSize(
renderMatcher.group("args").split(SpecialChars.WailaRendererComma),
DataAccessorCommon.instance).width;
}
Matcher iconMatcher = patternIcon.matcher(s);
@@ -21,6 +21,8 @@ import org.lwjgl.opengl.GL11;
import mcp.mobius.waila.api.IWailaCommonAccessor;
import mcp.mobius.waila.api.IWailaTooltipRenderer;
import mcp.mobius.waila.api.IWailaVariableWidthTooltipRenderer;
import mcp.mobius.waila.api.SpecialChars;
import mcp.mobius.waila.api.impl.ConfigHandler;
import mcp.mobius.waila.api.impl.DataAccessorCommon;
import mcp.mobius.waila.api.impl.ModuleRegistrar;
@@ -180,7 +182,10 @@ public class Tooltip {
renderable = new Renderable(
renderer,
new Point(offsetX, offsetY),
renderMatcher.group("args").split(","));
renderMatcher.group("args").split(SpecialChars.WailaRendererComma));
if (renderer instanceof IWailaVariableWidthTooltipRenderer variableWidthRenderer) {
variableWidthRenderer.setMaxLineWidth(maxStringW);
}
this.elements2nd.add(renderable);
}
} else if (iconMatcher.find()) {
@@ -0,0 +1,90 @@
package mcp.mobius.waila.overlay.tooltiprenderers;
import java.awt.Color;
import java.awt.Dimension;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.opengl.GL11;
import mcp.mobius.waila.addons.thaumcraft.ThaumcraftModule;
import mcp.mobius.waila.api.IWailaCommonAccessor;
import mcp.mobius.waila.api.IWailaTooltipRenderer;
import mcp.mobius.waila.overlay.DisplayUtil;
import mcp.mobius.waila.overlay.OverlayConfig;
public class TTRenderAspectString implements IWailaTooltipRenderer {
@Override
public Dimension getSize(String[] params, IWailaCommonAccessor accessor) {
int width;
if (params[0].equals("???")) {
width = DisplayUtil.getDisplayWidth(params[0]);
} else {
try {
Object aspect = ThaumcraftModule.Aspect_getAspect.invoke(null, params[0]);
if (aspect == null) {
width = DisplayUtil.getDisplayWidth(params[0]);
} else width = DisplayUtil.getDisplayWidth((String) ThaumcraftModule.Aspect_getName.invoke(aspect));
} catch (ReflectiveOperationException e) {
throw new RuntimeException(e);
}
}
return new Dimension(width + 10, params[0].isEmpty() ? 0 : 8);
}
@Override
public void draw(String[] params, IWailaCommonAccessor accessor) {
try {
if (params[0].equals("???")) {
drawTag(0, 0, ThaumcraftModule.unknownAspectTexture, ThaumcraftModule.unknownAspectColor, 200);
DisplayUtil.drawString(params[0], 10, 0, OverlayConfig.fontcolor, true);
return;
}
Object aspect = ThaumcraftModule.Aspect_getAspect.invoke(null, params[0]);
if (aspect == null) return;
drawTag(
0,
0,
(ResourceLocation) ThaumcraftModule.Aspect_getImage.invoke(aspect),
new Color((int) ThaumcraftModule.Aspect_getColor.invoke(aspect)),
200);
DisplayUtil.drawString(
(String) ThaumcraftModule.Aspect_getName.invoke(aspect),
10,
0,
OverlayConfig.fontcolor,
true);
} catch (ReflectiveOperationException e) {
DisplayUtil.drawString(params[0], 10, 0, OverlayConfig.fontcolor, true);
throw new RuntimeException(e);
}
}
public static void drawTag(double x, double y, ResourceLocation image, Color color, double z) {
Minecraft mc = Minecraft.getMinecraft();
mc.renderEngine.bindTexture(image);
GL11.glColor4f(
(float) color.getRed() / 255.0F,
(float) color.getGreen() / 255.0F,
(float) color.getBlue() / 255.0F,
1);
Tessellator var9 = Tessellator.instance;
var9.startDrawingQuads();
var9.setColorRGBA_F(
(float) color.getRed() / 255.0F,
(float) color.getGreen() / 255.0F,
(float) color.getBlue() / 255.0F,
1);
var9.addVertexWithUV(x + 0.0D, y + 8.0D, z, 0.0D, 1.0D);
var9.addVertexWithUV(x + 8.0D, y + 8.0D, z, 1.0D, 1.0D);
var9.addVertexWithUV(x + 8.0D, y + 0.0D, z, 1.0D, 0.0D);
var9.addVertexWithUV(x + 0.0D, y + 0.0D, z, 0.0D, 0.0D);
var9.draw();
}
}
@@ -0,0 +1,164 @@
package mcp.mobius.waila.overlay.tooltiprenderers;
import java.awt.Dimension;
import java.util.function.Consumer;
import java.util.function.Function;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.util.IIcon;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import org.lwjgl.opengl.GL11;
import cpw.mods.fml.common.Loader;
import gregtech.api.util.GTUtil;
import gregtech.api.util.GTUtility;
import gregtech.common.fluid.GTFluid;
import gtPlusPlus.api.objects.minecraft.FluidGT6;
import gtPlusPlus.core.util.minecraft.FluidUtils;
import mcp.mobius.waila.api.IWailaCommonAccessor;
import mcp.mobius.waila.api.IWailaVariableWidthTooltipRenderer;
import mcp.mobius.waila.api.impl.ConfigHandler;
import mcp.mobius.waila.overlay.DisplayUtil;
public class TTRenderFluidBar implements IWailaVariableWidthTooltipRenderer {
int maxStringW;
private final Consumer<String> bindColor;
private final Function<Integer, String> formatNumber;
private static final int height = 12;
public TTRenderFluidBar() {
if (Loader.isModLoaded("gregtech_nh")) {
bindColor = (fluidName) -> {
FluidStack aCheck = FluidUtils.getWildcardFluidStack(fluidName, 1000);
if (aCheck != null && (aCheck.getFluid() instanceof FluidGT6 || aCheck.getFluid() instanceof GTFluid)) {
short[] RGBa = GTUtil.getRGBaArray(aCheck.getFluid().getColor());
GL11.glColor4f(RGBa[0] / 255F, RGBa[1] / 255F, RGBa[2] / 255F, 1F);
} else {
GL11.glColor4f(1F, 1F, 1F, 1F);
}
};
formatNumber = GTUtility::formatNumbers;
} else {
bindColor = (fluidName) -> GL11.glColor4f(1F, 1F, 1F, 1F);
formatNumber = (number) -> String.format("%,d", number);
}
}
@Override
public Dimension getSize(String[] params, IWailaCommonAccessor accessor) {
int commaCount = (int) (Math.floor((params[2].length() - 1) / 3D) + Math.floor((params[3].length() - 1) / 3D));
// ",".repeat(commaCount) doesn't exist in java 8 so do this instead.
StringBuilder sb = new StringBuilder(commaCount);
for (int i = 0; i < commaCount; i++) {
sb.append(",");
}
return new Dimension(
DisplayUtil.getDisplayWidth(
params[2] + " / " + params[3] + ConfigHandler.instance().fluidUnit + params[1] + sb) + 4,
height);
}
public static final ResourceLocation gradient = new ResourceLocation("waila", "textures/gradient.png");
@Override
public void draw(String[] params, IWailaCommonAccessor accessor) {
String fluidName = params[0];
String localizedName = params[1];
double amount = Double.parseDouble(params[2]);
double capacity = Double.parseDouble(params[3]);
Tessellator tessellator = Tessellator.instance;
IIcon icon = FluidRegistry.getFluid(fluidName).getIcon();
Minecraft mc = Minecraft.getMinecraft();
mc.getTextureManager().bindTexture(TextureMap.locationBlocksTexture);
bindColor.accept(fluidName);
tessellator.startDrawingQuads();
// Intentionally draw 2 pixels taller than needed than cover with the border to make the texture more visible
int i = (int) ((double) (maxStringW - 2) * amount / capacity);
int j = 0;
for (; i > height; i = i - height) {
drawRectFromIcon(tessellator, 1 + (j * height), 0, 0, icon, height, height);
j++;
}
if (i > 0) drawRect(
tessellator,
1 + (j * height),
0,
0,
i,
height,
icon.getMinU(),
icon.getMinV(),
icon.getMinU() + ((icon.getMaxU() - icon.getMinU()) * ((double) i / height)),
icon.getMaxV());
tessellator.draw();
GL11.glEnable(GL11.GL_BLEND);
GL11.glColor4f(1F, 1F, 1F, 0.70F);
mc.getTextureManager().bindTexture(gradient);
tessellator.startDrawingQuads();
drawRect(tessellator, 1, 0, 0, maxStringW - 2, height - 1, 0, 0, 1, 1);
tessellator.draw();
drawThickBeveledBox(0, 0, maxStringW, height, 1, 0xFF505050, 0xFF505050, -1);
DisplayUtil.drawString(
formatNumber.apply((int) amount) + " / "
+ formatNumber.apply((int) capacity)
+ " "
+ ConfigHandler.instance().fluidUnit
+ " "
+ localizedName,
2,
2,
0xFFFFFFFF,
true);
}
public static void drawRectFromIcon(Tessellator tessellator, int x, int y, double z, IIcon icon, int width,
int height) {
drawRect(tessellator, x, y, z, width, height, icon.getMinU(), icon.getMinV(), icon.getMaxU(), icon.getMaxV());
}
public static void drawRect(Tessellator tessellator, int x, int y, double z, int width, int height, double minU,
double minV, double maxU, double maxV) {
tessellator.addVertexWithUV(x, y + height, z, minU, maxV);
tessellator.addVertexWithUV(x + width, y + height, z, maxU, maxV);
tessellator.addVertexWithUV(x + width, y, z, maxU, minV);
tessellator.addVertexWithUV(x, y, z, minU, minV);
}
public static void drawThickBeveledBox(int x1, int y1, int x2, int y2, int thickness, int topleftcolor,
int botrightcolor, int fillcolor) {
if (fillcolor != -1) {
Gui.drawRect(x1 + 1, y1 + 1, x2 - 1, y2 - 1, fillcolor);
}
Gui.drawRect(x1, y1, x2 - 1, y1 + thickness, topleftcolor);
Gui.drawRect(x1, y1, x1 + thickness, y2 - 1, topleftcolor);
Gui.drawRect(x2 - thickness, y1, x2, y2 - 1, botrightcolor);
Gui.drawRect(x1, y2 - thickness, x2, y2, botrightcolor);
}
@Override
public void setMaxLineWidth(int width) {
maxStringW = width + 2;
}
@Override
public int getMaxLineWidth() {
return maxStringW;
}
}
@@ -20,6 +20,7 @@ import mcp.mobius.waila.addons.railcraft.RailcraftModule;
import mcp.mobius.waila.addons.statues.StatuesModule;
import mcp.mobius.waila.addons.stevescarts.StevesCartsModule;
import mcp.mobius.waila.addons.thaumcraft.ThaumcraftModule;
import mcp.mobius.waila.addons.thaumcraftGadomancy.GadomancyModule;
import mcp.mobius.waila.addons.thermaldynamics.ThermalDynamicsModule;
import mcp.mobius.waila.addons.thermalexpansion.ThermalExpansionModule;
import mcp.mobius.waila.addons.twilightforest.TwilightForestModule;
@@ -50,6 +51,9 @@ public class ProxyServer {
/* Thaumcraft */
ThaumcraftModule.register();
/* Gadomancy */
GadomancyModule.register();
/* EnderStorage */
EnderStorageModule.register();
@@ -114,16 +118,12 @@ public class ProxyServer {
String[] splitName = method.split("\\.");
String methodName = splitName[splitName.length - 1];
String className = method.substring(0, method.length() - methodName.length() - 1);
Waila.log.info(String.format("Trying to reflect %s %s", className, methodName));
Waila.log.debug(String.format("Trying to reflect %s %s", className, methodName));
try {
Class<?> reflectClass = Class.forName(className);
Method reflectMethod = reflectClass.getDeclaredMethod(methodName, IWailaRegistrar.class);
reflectMethod.invoke(null, ModuleRegistrar.instance());
Waila.log.info(String.format("Success in registering %s", modname));
} catch (ClassNotFoundException e) {
Waila.log.warn(String.format("Could not find class %s", className));
} catch (NoSuchMethodException e) {
@@ -6,6 +6,7 @@ public final class Constants {
public static String BIND_WAILA_CFG = "waila.keybind.wailaconfig";
public static String BIND_WAILA_SHOW = "waila.keybind.wailadisplay";
public static String BIND_WAILA_SHOW_ADVANCED = "waila.keybind.showadvanced";
public static String BIND_WAILA_LIQUID = "waila.keybind.liquid";
public static String BIND_WAILA_RECIPE = "waila.keybind.recipe";
public static String BIND_WAILA_USAGE = "waila.keybind.usage";
@@ -28,6 +29,7 @@ public final class Constants {
public static String CFG_WAILA_NHEARTS = "waila.cfg.heartsperline";
public static String CFG_WAILA_MAXHP = "waila.cfg.maxhpbeforetext";
public static String CFG_WAILA_NEWFILTERS = "waila.cfg.newfilters";
public static String CFG_WAILA_FLUIDUNIT = "waila.cfg.fluid_unit";
public static String CFG_WAILA_ALPHA = "waila.cfg.alpha";
public static String CFG_WAILA_BGCOLOR = "waila.cfg.bgcolor";
@@ -30,6 +30,7 @@ enchant.label.enchantability=Oèarovatelnost
waila.keybind.wailaconfig=[Waila] Nastavení obrazu
waila.keybind.wailadisplay=[Waila] Zobrazit/Skrýt
waila.keybind.showadvanced=[Waila] Rozšířit popisek
waila.keybind.liquid=[Waila] Zobrazit tekutiny
waila.keybind.recipe=[Waila] Zobrazit recept
waila.keybind.usage=[Waila] Zobrazit použití
@@ -38,6 +39,8 @@ waila.keybind.testing=[Waila] Testování
client.msg.norecipe=Nenalezen žádný recept.
client.msg.nousage=Nenalezeno žádné využití.
hud.msg.holdkeymoreinfo=Držte %s pro více informací
hud.msg.none=<Nic>
hud.msg.empty=<Prázdný>
hud.msg.output=Výstup
@@ -30,6 +30,7 @@ enchant.label.enchantability=Verzauberbarkeit
waila.keybind.wailaconfig=[Waila] Config-Bildschirm
waila.keybind.wailadisplay=[Waila] Zeigen/Verstecken
waila.keybind.showadvanced=[Waila] Tooltip erweitern
waila.keybind.liquid=[Waila] Zeige Flüssigkeiten
waila.keybind.recipe=[Waila] Zeige Rezept
waila.keybind.usage=[Waila] Zeige Nutzung
@@ -38,6 +39,8 @@ waila.keybind.testing=[Waila] Testen
client.msg.norecipe=Kein Rezept gefunden.
client.msg.nousage=Keine Nutzung gefunden.
hud.msg.holdkeymoreinfo=Halte %s für mehr Infos
hud.msg.none=<Nichts>
hud.msg.empty=<Leer>
hud.msg.output=Output
@@ -31,6 +31,7 @@ enchant.label.enchantability=Enchantability
waila.keybind.wailaconfig=[Waila] Config screen
waila.keybind.wailadisplay=[Waila] Show/Hide
waila.keybind.showadvanced=[Waila] Expand Tooltip
waila.keybind.liquid=[Waila] Show liquids
waila.keybind.recipe=[Waila] Show recipe
waila.keybind.usage=[Waila] Show usage
@@ -39,6 +40,8 @@ waila.keybind.testing=[Waila] Testing
client.msg.norecipe=No recipe found.
client.msg.nousage=No usage found.
hud.msg.holdkeymoreinfo=Hold %s for more info
hud.msg.none=<None>
hud.msg.empty=<Empty>
hud.msg.output=Output
@@ -30,6 +30,7 @@ enchant.label.enchantability=Loitsitav
waila.keybind.wailaconfig=[Waila] Konfiguratsiooni ekraan
waila.keybind.wailadisplay=[Waila] Näita/Peida
waila.keybind.showadvanced=[Waila] Laienda kohtspikrit
waila.keybind.liquid=[Waila] Näita vedelikke
waila.keybind.recipe=[Waila] Näita retsepti
waila.keybind.usage=[Waila] Näita kasutamist
@@ -38,6 +39,8 @@ waila.keybind.testing=[Waila] Testimine
client.msg.norecipe=Ühtegi retsepti ei leitud.
client.msg.nousage=Ühtegi kasutust ei leitud.
hud.msg.holdkeymoreinfo=Hoia %s lisainfo saamiseks
hud.msg.none=<Mitte Ükski>
hud.msg.empty=<Tühi>
hud.msg.output=Väljund
@@ -28,6 +28,7 @@ enchant.label.enchantability=Enchantabilitée
waila.keybind.wailaconfig=[Waila] Ecran de config
waila.keybind.wailadisplay=[Waila] Afficher/Masquer
waila.keybind.showadvanced=[Waila] Développer l'info-bulle
waila.keybind.liquid=[Waila] Afficher les liquides
waila.keybind.recipe=[Waila] Afficher les recettes
waila.keybind.usage=[Waila] Afficher l'utilisation
@@ -36,6 +37,8 @@ waila.keybind.testing=[Waila] Test
client.msg.norecipe=Pas de recette trouvée.
client.msg.nousage=Pas d'utilisation trouvée.
hud.msg.holdkeymoreinfo=Maintenez %s pour plus d'infos
hud.msg.none=<Aucun>
hud.msg.empty=<Vide>
hud.msg.output=Sortie
@@ -30,6 +30,7 @@ enchant.label.enchantability=Incantabilità
waila.keybind.wailaconfig=[Waila] Config menù
waila.keybind.wailadisplay=[Waila] Mostra/Nascondi
waila.keybind.showadvanced=[Waila] Espandi tooltip
waila.keybind.liquid=[Waila] Mostra liquidi
waila.keybind.recipe=[Waila] Mostra ricetta
waila.keybind.usage=[Waila] Mostra uso
@@ -38,6 +39,8 @@ waila.keybind.testing=[Waila] Provare
client.msg.norecipe=Nessuna ricetta trovata.
client.msg.nousage=Nessun uso trovato.
hud.msg.holdkeymoreinfo=Tieni premuto %s per più info
hud.msg.none=<Niente>
hud.msg.empty=<Vuoto>
hud.msg.output=Uscita
@@ -28,6 +28,7 @@ enchant.label.enchantability=Enchantbaarheid
waila.keybind.wailaconfig=[Waila] Configuratiescherm
waila.keybind.wailadisplay=[Waila] Toon/Verberg
waila.keybind.showadvanced=[Waila] Tooltip uitvouwen
waila.keybind.liquid=[Waila] Toon vloeistoffen
waila.keybind.recipe=[Waila] Toon recepten
waila.keybind.usage=[Waila] Toon gebruik
@@ -36,6 +37,8 @@ waila.keybind.testing=[Waila] Testen
client.msg.norecipe=Geen recept gevonden.
client.msg.nousage=Geen gebruik gevonden.
hud.msg.holdkeymoreinfo=Houd %s ingedrukt voor meer info
hud.msg.none=<Geen>
hud.msg.empty=<Leeg>
hud.msg.output=Uitvoer
@@ -30,6 +30,7 @@ enchant.label.enchantability=Зачарование
waila.keybind.wailaconfig=[Waila] Меню настроек
waila.keybind.wailadisplay=[Waila] Показать/Скрыть
waila.keybind.showadvanced=[Waila] Развернуть подсказку
waila.keybind.liquid=[Waila] Показать жидкости
waila.keybind.recipe=[Waila] Показать рецепт
waila.keybind.usage=[Waila] Показать применение
@@ -38,6 +39,8 @@ waila.keybind.testing=[Waila] Тестировать
client.msg.norecipe=Рецептов не найдено.
client.msg.nousage=Применений не найдено.
hud.msg.holdkeymoreinfo=Удерживайте %s для подробностей
hud.msg.none=<Ничего>
hud.msg.empty=<Пусто>
hud.msg.output=Вывод
@@ -30,6 +30,7 @@ enchant.label.enchantability=附魔能力
waila.keybind.wailaconfig=[Waila]配置屏幕
waila.keybind.wailadisplay=[Waila]显示/隐藏
waila.keybind.showadvanced=[Waila]展开工具提示
waila.keybind.liquid=[Waila]显示流体
waila.keybind.recipe=[Waila]显示合成
waila.keybind.usage=[Waila]显示可参与合成
@@ -38,6 +39,8 @@ waila.keybind.testing=[Waila]测试中
client.msg.norecipe=未发现合成表.
client.msg.nousage=未发现可参与合成.
hud.msg.holdkeymoreinfo=按住 %s 查看更多信息
hud.msg.none=<无>
hud.msg.empty=<空>
hud.msg.output=输出
Binary file not shown.

After

Width:  |  Height:  |  Size: 145 B