Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions src/main/java/mcp/mobius/waila/api/IWailaDataProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,25 @@ default List<String> getWailaAdvancedBody(ItemStack itemStack, List<String> curr
List<String> getWailaTail(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
IWailaConfigHandler config);

/**
* Callback used to add icons to the bottom right of the tooltip.</br>
* Works exactly like the Head/Body/Tail callbacks but with {@link IWailaInfoIcon} objects instead of strings. Will
* be used if the implementing class is registered via {@link IWailaRegistrar}.{@link registerInfoIconProvider}
* client side.</br>
* You are supposed to always return the modified input currentIcons.</br>
*
* @param itemStack Current block scanned, in ItemStack form.
* @param currentIcons Current list of tooltip icons (might have been processed by other providers and might be
* processed by other providers).
* @param accessor Contains most of the relevant information about the current environment.
* @param config Current configuration of Waila.
* @return Modified input currentIcons
*/
default List<IWailaInfoIcon> getWailaInfoIcon(ItemStack itemStack, List<IWailaInfoIcon> currentIcons,
IWailaDataAccessor accessor, IWailaConfigHandler config) {
return currentIcons;
}

/**
* Callback used server side to return a custom synchronization NBTTagCompound.</br>
* Will be used if the implementing class is registered via {@link IWailaRegistrar}.{@link registerNBTProvider}
Expand Down
19 changes: 19 additions & 0 deletions src/main/java/mcp/mobius/waila/api/IWailaEntityProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,25 @@ List<String> getWailaBody(Entity entity, List<String> currenttip, IWailaEntityAc
List<String> getWailaTail(Entity entity, List<String> currenttip, IWailaEntityAccessor accessor,
IWailaConfigHandler config);

/**
* Callback used to add icons to the bottom right of the tooltip.</br>
* Works exactly like the Head/Body/Tail callbacks but with {@link IWailaInfoIcon} objects instead of strings. Will
* be used if the implementing class is registered via {@link IWailaRegistrar}.{@link registerInfoIconProvider}
* client side.</br>
* You are supposed to always return the modified input currentIcons.</br>
*
* @param itemStack Current block scanned, in ItemStack form.
* @param currentIcons Current list of tooltip icons (might have been processed by other providers and might be
* processed by other providers).
* @param accessor Contains most of the relevant information about the current environment.
* @param config Current configuration of Waila.
* @return Modified input currentIcons
*/
default List<IWailaInfoIcon> getWailaInfoIcon(Entity entity, List<IWailaInfoIcon> currentIcons,
IWailaDataAccessor accessor, IWailaConfigHandler config) {
return currentIcons;
}

/**
* Callback used server side to return a custom synchronization NBTTagCompound.</br>
* Will be used if the implementing class is registered via {@link IWailaRegistrar}.{@link registerNBTProvider}
Expand Down
31 changes: 31 additions & 0 deletions src/main/java/mcp/mobius/waila/api/IWailaInfoIcon.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package mcp.mobius.waila.api;

/**
* Represents a single icon in the bottom right of the waila tooltip and is the icon equivalent of the line strings
* returned by the getWailaBody/Head/Tail callbacks.</br>
*
* Info icons mirror line strings as much as possible and {@link IWailaDataProvider}s can provide them by overriding the
* getWailaInfoIcon method.
*
* @author SuperSouper
*
*/
public interface IWailaInfoIcon {

/**
* Returns the width of the icon.</br>
* No padding is added if returns 0.
*
* @param accessor A global accessor for TileEntities and Entities
* @return The width in pixels.
*/
int getWidth(IWailaCommonAccessor accessor);

/**
* Draws the icon onto the tooltip.</br>
* Position is already translated so that 0,0 is the top-left position of the icon.
*
* @param accessor A global accessor for TileEntities and Entities
*/
void draw(IWailaCommonAccessor accessor);
}
4 changes: 4 additions & 0 deletions src/main/java/mcp/mobius/waila/api/IWailaRegistrar.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ public interface IWailaRegistrar {

void addConfigRemote(String modname, String keyname, boolean defvalue);

void registerInfoIconProvider(IWailaDataProvider dataProvider, Class block);

/* Register a stack overrider for the given blockID */
void registerStackProvider(IWailaDataProvider dataProvider, Class block);

Expand All @@ -61,6 +63,8 @@ public interface IWailaRegistrar {

void registerOverrideEntityProvider(IWailaEntityProvider dataProvider, Class entity);

void registerInfoIconProvider(IWailaEntityProvider dataProvider, Class entity);

/* Registering an NBT Provider provides a way to override the default "writeToNBT" way of doing things. */
void registerNBTProvider(IWailaEntityProvider dataProvider, Class entity);

Expand Down
2 changes: 2 additions & 0 deletions src/main/java/mcp/mobius/waila/api/impl/ConfigHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ public static ConfigHandler instance() {

public String fluidUnit;

public static int infoIconHeight = 8;

public void addModule(String modName, HashMap<String, String> options) {
this.addModule(modName, new ConfigModule(modName, options));
}
Expand Down
52 changes: 52 additions & 0 deletions src/main/java/mcp/mobius/waila/api/impl/MetaDataProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,23 +18,27 @@
import mcp.mobius.waila.api.IWailaBlock;
import mcp.mobius.waila.api.IWailaDataProvider;
import mcp.mobius.waila.api.IWailaEntityProvider;
import mcp.mobius.waila.api.IWailaInfoIcon;
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;
import mcp.mobius.waila.overlay.infoicons.StringInfoIcon;
import mcp.mobius.waila.utils.WailaExceptionHandler;

public class MetaDataProvider {

private final Map<Integer, List<IWailaDataProvider>> headBlockProviders = new TreeMap<>();
private final Map<Integer, List<IWailaDataProvider>> bodyBlockProviders = new TreeMap<>();
private Map<Integer, List<IWailaDataProvider>> tailBlockProviders = new TreeMap<>();
private final Map<Integer, List<IWailaDataProvider>> infoIconBlockProviders = new TreeMap<>();

private final Map<Integer, List<IWailaEntityProvider>> headEntityProviders = new TreeMap<>();
private final Map<Integer, List<IWailaEntityProvider>> bodyEntityProviders = new TreeMap<>();
private final Map<Integer, List<IWailaEntityProvider>> tailEntityProviders = new TreeMap<>();
private final Map<Integer, List<IWailaEntityProvider>> infoIconEntityProviders = new TreeMap<>();

public ItemStack identifyBlockHighlight(World world, EntityPlayer player, MovingObjectPosition mop,
DataAccessorCommon accessor) {
Expand Down Expand Up @@ -248,4 +252,52 @@ else if (layout == Layout.FOOTER && ModuleRegistrar.instance().hasTailEntityProv

return currenttip;
}

public List<IWailaInfoIcon> handleBlockInfoIconData(ItemStack itemStack, World world, EntityPlayer player,
MovingObjectPosition mop, DataAccessorCommon accessor, List<IWailaInfoIcon> currentIcons) {
// NBT networking stuff already handled in handleBlockTextData

Block block = accessor.getBlock();
infoIconBlockProviders.clear();

if (ModuleRegistrar.instance().hasInfoIconProviders(block))
infoIconBlockProviders.putAll(ModuleRegistrar.instance().getInfoIconProviders(block));

if (ModuleRegistrar.instance().hasInfoIconProviders(accessor.getTileEntity()))
infoIconBlockProviders.putAll(ModuleRegistrar.instance().getInfoIconProviders(accessor.getTileEntity()));

for (List<IWailaDataProvider> providersList : infoIconBlockProviders.values()) {
for (IWailaDataProvider dataProvider : providersList) try {
currentIcons = dataProvider
.getWailaInfoIcon(itemStack, currentIcons, accessor, ConfigHandler.instance());
} catch (Throwable e) {
WailaExceptionHandler.handleErr(e, dataProvider.getClass().toString(), null);
currentIcons.add(new StringInfoIcon("<ERROR>"));
}
}
return currentIcons;
}

public List<IWailaInfoIcon> handleEntityInfoIconData(Entity entity, World world, EntityPlayer player,
MovingObjectPosition mop, DataAccessorCommon accessor, List<IWailaInfoIcon> currentIcons) {
// NBT networking stuff already handled in handleBlockTextData

infoIconEntityProviders.clear();

if (ModuleRegistrar.instance().hasInfoIconProviders(entity))
infoIconEntityProviders.putAll(ModuleRegistrar.instance().getInfoIconEntityProviders(entity));

if (ModuleRegistrar.instance().hasInfoIconProviders(accessor.getTileEntity())) infoIconEntityProviders
.putAll(ModuleRegistrar.instance().getInfoIconEntityProviders(accessor.getTileEntity()));

for (List<IWailaEntityProvider> providersList : infoIconEntityProviders.values()) {
for (IWailaEntityProvider dataProvider : providersList) try {
currentIcons = dataProvider.getWailaInfoIcon(entity, currentIcons, accessor, ConfigHandler.instance());
} catch (Throwable e) {
WailaExceptionHandler.handleErr(e, dataProvider.getClass().toString(), null);
currentIcons.add(new StringInfoIcon("<ERROR>"));
}
}
return currentIcons;
}
}
28 changes: 28 additions & 0 deletions src/main/java/mcp/mobius/waila/api/impl/ModuleRegistrar.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public class ModuleRegistrar implements IWailaRegistrar {
public LinkedHashMap<Class, ArrayList<IWailaDataProvider>> headBlockProviders = new LinkedHashMap<>();
public LinkedHashMap<Class, ArrayList<IWailaDataProvider>> bodyBlockProviders = new LinkedHashMap<>();
public LinkedHashMap<Class, ArrayList<IWailaDataProvider>> tailBlockProviders = new LinkedHashMap<>();
public LinkedHashMap<Class, ArrayList<IWailaDataProvider>> infoIconBlockProviders = new LinkedHashMap<>();
public LinkedHashMap<Class, ArrayList<IWailaDataProvider>> stackBlockProviders = new LinkedHashMap<>();
public LinkedHashMap<Class, ArrayList<IWailaDataProvider>> NBTDataProviders = new LinkedHashMap<>();

Expand All @@ -40,6 +41,7 @@ public class ModuleRegistrar implements IWailaRegistrar {
public LinkedHashMap<Class, ArrayList<IWailaEntityProvider>> headEntityProviders = new LinkedHashMap<>();
public LinkedHashMap<Class, ArrayList<IWailaEntityProvider>> bodyEntityProviders = new LinkedHashMap<>();
public LinkedHashMap<Class, ArrayList<IWailaEntityProvider>> tailEntityProviders = new LinkedHashMap<>();
public LinkedHashMap<Class, ArrayList<IWailaEntityProvider>> infoIconEntityProviders = new LinkedHashMap<>();
public LinkedHashMap<Class, ArrayList<IWailaEntityProvider>> overrideEntityProviders = new LinkedHashMap<>();
public LinkedHashMap<Class, ArrayList<IWailaEntityProvider>> NBTEntityProviders = new LinkedHashMap<>();

Expand Down Expand Up @@ -129,6 +131,11 @@ public void registerTailProvider(IWailaDataProvider dataProvider, Class block) {
this.registerProvider(dataProvider, block, this.tailBlockProviders);
}

@Override
public void registerInfoIconProvider(IWailaDataProvider dataProvider, Class block) {
this.registerProvider(dataProvider, block, this.infoIconBlockProviders);
}

@Override
public void registerStackProvider(IWailaDataProvider dataProvider, Class block) {
this.registerProvider(dataProvider, block, this.stackBlockProviders);
Expand All @@ -154,6 +161,11 @@ public void registerTailProvider(IWailaEntityProvider dataProvider, Class entity
this.registerProvider(dataProvider, entity, this.tailEntityProviders);
}

@Override
public void registerInfoIconProvider(IWailaEntityProvider dataProvider, Class entity) {
this.registerProvider(dataProvider, entity, this.infoIconEntityProviders);
}

@Override
public void registerNBTProvider(IWailaEntityProvider dataProvider, Class entity) {
this.registerProvider(dataProvider, entity, this.NBTEntityProviders);
Expand Down Expand Up @@ -241,6 +253,10 @@ public Map<Integer, List<IWailaDataProvider>> getTailProviders(Object block) {
return getProviders(block, this.tailBlockProviders);
}

public Map<Integer, List<IWailaDataProvider>> getInfoIconProviders(Object block) {
return getProviders(block, this.infoIconBlockProviders);
}

public Map<Integer, List<IWailaDataProvider>> getStackProviders(Object block) {
return getProviders(block, this.stackBlockProviders);
}
Expand All @@ -261,6 +277,10 @@ public Map<Integer, List<IWailaEntityProvider>> getTailEntityProviders(Object en
return getProviders(entity, this.tailEntityProviders);
}

public Map<Integer, List<IWailaEntityProvider>> getInfoIconEntityProviders(Object entity) {
return getProviders(entity, this.infoIconEntityProviders);
}

public Map<Integer, List<IWailaEntityProvider>> getOverrideEntityProviders(Object entity) {
return getProviders(entity, this.overrideEntityProviders);
}
Expand Down Expand Up @@ -343,6 +363,10 @@ public boolean hasTailProviders(Object block) {
return hasProviders(block, this.tailBlockProviders);
}

public boolean hasInfoIconProviders(Object block) {
return hasProviders(block, this.infoIconBlockProviders);
}

public boolean hasNBTProviders(Object block) {
return hasProviders(block, this.NBTDataProviders);
}
Expand All @@ -359,6 +383,10 @@ public boolean hasTailEntityProviders(Object entity) {
return hasProviders(entity, this.tailEntityProviders);
}

public boolean hasInfoIconEntityProviders(Object entity) {
return hasProviders(entity, this.infoIconEntityProviders);
}

public boolean hasOverrideEntityProviders(Object entity) {
return hasProviders(entity, this.overrideEntityProviders);
}
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/mcp/mobius/waila/client/ProxyClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,12 @@ public void registerHandlers() {

ModuleRegistrar.instance().registerHeadProvider(new HUDHandlerBlocks(), Block.class);
ModuleRegistrar.instance().registerTailProvider(new HUDHandlerBlocks(), Block.class);
ModuleRegistrar.instance().registerInfoIconProvider(new HUDHandlerBlocks(), Block.class);

ModuleRegistrar.instance().registerHeadProvider(new HUDHandlerEntities(), Entity.class);
ModuleRegistrar.instance().registerBodyProvider(new HUDHandlerEntities(), Entity.class);
ModuleRegistrar.instance().registerTailProvider(new HUDHandlerEntities(), Entity.class);
ModuleRegistrar.instance().registerInfoIconProvider(new HUDHandlerEntities(), Entity.class);

ModuleRegistrar.instance().addConfig("General", "general.showents");
ModuleRegistrar.instance().addConfig("General", "general.showhp");
Expand Down
12 changes: 7 additions & 5 deletions src/main/java/mcp/mobius/waila/overlay/OverlayRenderer.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ private static void doRenderOverlay(Tooltip tooltip) {

tooltip.draw2nd();

tooltip.drawInfoIcons();

if (tooltip.hasIcon) RenderHelper.enableGUIStandardItemLighting();

GL11.glEnable(GL12.GL_RESCALE_NORMAL);
Expand Down Expand Up @@ -92,11 +94,11 @@ private static void loadGLState() {
}

private static void drawTooltipBox(int x, int y, int w, int h, int bg, int grad1, int grad2) {
DisplayUtil.drawGradientRect(x + 1, y, w - 1, 1, bg, bg);
DisplayUtil.drawGradientRect(x + 1, y + h, w - 1, 1, bg, bg);
DisplayUtil.drawGradientRect(x + 1, y + 1, w - 1, h - 1, bg, bg);// center
DisplayUtil.drawGradientRect(x, y + 1, 1, h - 1, bg, bg);
DisplayUtil.drawGradientRect(x + w, y + 1, 1, h - 1, bg, bg);
DisplayUtil.drawGradientRect(x + 1, y, w - 1, 1, bg, bg); // top outer line
DisplayUtil.drawGradientRect(x + 1, y + h, w - 1, 1, bg, bg); // bottom outer line
DisplayUtil.drawGradientRect(x + 1, y + 1, w - 1, h - 1, bg, bg); // fill
DisplayUtil.drawGradientRect(x, y + 1, 1, h - 1, bg, bg); // left outer line
DisplayUtil.drawGradientRect(x + w, y + 1, 1, h - 1, bg, bg); // right outer line
DisplayUtil.drawGradientRect(x + 1, y + 2, 1, h - 3, grad1, grad2);
DisplayUtil.drawGradientRect(x + w - 1, y + 2, 1, h - 3, grad1, grad2);
DisplayUtil.drawGradientRect(x + 1, y + 1, w - 1, 1, grad1, grad1);
Expand Down
41 changes: 40 additions & 1 deletion src/main/java/mcp/mobius/waila/overlay/Tooltip.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import org.lwjgl.opengl.GL11;

import mcp.mobius.waila.api.IWailaCommonAccessor;
import mcp.mobius.waila.api.IWailaInfoIcon;
import mcp.mobius.waila.api.IWailaTooltipRenderer;
import mcp.mobius.waila.api.IWailaVariableWidthTooltipRenderer;
import mcp.mobius.waila.api.SpecialChars;
Expand All @@ -42,6 +43,7 @@ public class Tooltip {

ArrayList<Renderable> elements = new ArrayList<>();
ArrayList<Renderable> elements2nd = new ArrayList<>();
ArrayList<TooltipInfoIconRenderable> infoIcons = new ArrayList<>();

int w, h, x, y, ty;
int offsetX;
Expand Down Expand Up @@ -102,11 +104,19 @@ public String toString() {
////////////////////////////////////////////////////////////////////////////

public Tooltip(List<String> textData, ItemStack stack) {
this(textData, true);
this(textData, stack, null);
}

public Tooltip(List<String> textData, ItemStack stack, List<IWailaInfoIcon> infoIcons) {
this(textData, infoIcons, true);
this.stack = stack;
}

public Tooltip(List<String> textData, boolean hasIcon) {
this(textData, null, hasIcon);
}

public Tooltip(List<String> textData, List<IWailaInfoIcon> infoIcons, boolean hasIcon) {

if (hasIcon) hasIcon = ConfigHandler.instance().showIcon();

Expand Down Expand Up @@ -153,8 +163,33 @@ public Tooltip(List<String> textData, boolean hasIcon) {
tmp += TabSpacing * (columnsWidth.size() - 1);
maxStringW = Math.max(maxStringW, tmp);

if (infoIcons != null) {
tmp = 0;
for (IWailaInfoIcon icon : infoIcons) {
tmp += icon.getWidth(accessor);
}
maxStringW = Math.max(
maxStringW,
DisplayUtil.getDisplayWidth(textData.get(textData.size() - 1)) + tmp + infoIcons.size());
}

this.computeRenderables();
this.computePositionAndSize(hasIcon);
this.computeInfoIconRenderables(infoIcons);
}

private void computeInfoIconRenderables(List<IWailaInfoIcon> infoIcons) {
if (infoIcons == null) return;

int xOffset = -(hasIcon ? 26 : 8);
int yOffset = -(ConfigHandler.infoIconHeight + 8);
for (IWailaInfoIcon icon : infoIcons) {
int width = icon.getWidth(accessor);
if (width > 0) {
xOffset -= width + 1;
this.infoIcons.add(new TooltipInfoIconRenderable(icon, new Point(w + xOffset, h + yOffset)));
}
}
}

private void computeRenderables() {
Expand Down Expand Up @@ -250,4 +285,8 @@ public void draw() {
public void draw2nd() {
for (Renderable r : this.elements2nd) r.draw(accessor, x + offsetX, y + ty);
}

public void drawInfoIcons() {
for (TooltipInfoIconRenderable r : this.infoIcons) r.draw(accessor, x + offsetX, y + ty);
}
}
Loading
Loading