package com.jaquadro.minecraft.storagedrawers.integration; import com.jaquadro.minecraft.chameleon.integration.IntegrationModule; import com.jaquadro.minecraft.storagedrawers.StorageDrawers; import com.jaquadro.minecraft.storagedrawers.api.registry.IWailaTooltipHandler; import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawer; import com.jaquadro.minecraft.storagedrawers.api.storage.IFractionalDrawer; import com.jaquadro.minecraft.storagedrawers.api.storage.attribute.LockAttribute; import com.jaquadro.minecraft.storagedrawers.block.BlockDrawers; import com.jaquadro.minecraft.storagedrawers.block.tile.TileEntityDrawers; import com.jaquadro.minecraft.storagedrawers.security.SecurityManager; import mcp.mobius.waila.api.IWailaConfigHandler; import mcp.mobius.waila.api.IWailaDataAccessor; import mcp.mobius.waila.api.IWailaDataProvider; import mcp.mobius.waila.api.IWailaRegistrar; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.common.event.FMLInterModComms; import java.lang.reflect.Method; import java.util.List; public class Waila extends IntegrationModule { private static Class classConfigHandler; private static Method methInstance; private static Method methAddConfig; @Override public String getModID () { return "Waila"; } @Override public void init () throws Throwable { classConfigHandler = Class.forName("mcp.mobius.waila.api.impl.ConfigHandler"); methInstance = classConfigHandler.getMethod("instance"); methAddConfig = classConfigHandler.getMethod("addConfig", String.class, String.class, String.class); FMLInterModComms.sendMessage("Waila", "register", StorageDrawers.SOURCE_PATH + "integration.Waila.registerProvider"); } @Override public void postInit () { } @SuppressWarnings("unused") public static void registerProvider(IWailaRegistrar registrar) { registrar.registerBodyProvider(new WailaDrawer(), BlockDrawers.class); try { Object configHandler = methInstance.invoke(null); methAddConfig.invoke(configHandler, StorageDrawers.MOD_NAME, "display.content", I18n.format("storageDrawers.waila.config.displayContents"), true); methAddConfig.invoke(configHandler, StorageDrawers.MOD_NAME, "display.stacklimit", I18n.format("storageDrawers.waila.config.displayStackLimit"), true); methAddConfig.invoke(configHandler, StorageDrawers.MOD_NAME, "display.status", I18n.format("storageDrawers.waila.config.displayStatus"), true); } catch (Exception e) { // Oh well, we couldn't hook the waila config } } public static class WailaDrawer implements IWailaDataProvider { @Override public ItemStack getWailaStack (IWailaDataAccessor accessor, IWailaConfigHandler config) { return null; } @Override public List<String> getWailaHead (ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { return currenttip; } @Override public List<String> getWailaBody (ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { TileEntityDrawers tile = (TileEntityDrawers) accessor.getTileEntity(); if (SecurityManager.hasAccess(Minecraft.getMinecraft().player.getGameProfile(), tile)) { if (config.getConfig("display.content")) { for (int i = 0; i < tile.getDrawerCount(); i++) { IDrawer drawer = tile.getDrawerIfEnabled(i); if (drawer == null) continue; String name = I18n.format("storageDrawers.waila.empty"); ItemStack stack = drawer.getStoredItemPrototype(); if (stack != null && stack.getItem() != null) { String stackName = stack.getDisplayName(); List<IWailaTooltipHandler> handlers = StorageDrawers.wailaRegistry.getTooltipHandlers(); for (int j = 0, n = handlers.size(); j < n; j++) stackName = handlers.get(j).transformItemName(drawer, stackName); if (drawer.getStoredItemCount() == Integer.MAX_VALUE) name = stackName + " [\u221E]"; else if (drawer instanceof IFractionalDrawer && ((IFractionalDrawer) drawer).getConversionRate() > 1) name = stackName + ((i == 0) ? " [" : " [+") + ((IFractionalDrawer) drawer).getStoredItemRemainder() + "]"; else if (StorageDrawers.config.cache.stackRemainderWaila) { int stacks = drawer.getStoredItemCount() / drawer.getStoredItemStackSize(); int remainder = drawer.getStoredItemCount() - (stacks * drawer.getStoredItemStackSize()); if (stacks > 0 && remainder > 0) name = stackName + " [" + stacks + "x" + drawer.getStoredItemStackSize() + " + " + remainder + "]"; else if (stacks > 0) name = stackName + " [" + stacks + "x" + drawer.getStoredItemStackSize() + "]"; else name = stackName + " [" + remainder + "]"; } else name = stackName + " [" + drawer.getStoredItemCount() + "]"; } currenttip.add(I18n.format("storageDrawers.waila.drawer", i + 1, name)); } } if (config.getConfig("display.stacklimit")) { if (tile.isUnlimited() || tile.isVending()) currenttip.add(I18n.format("storageDrawers.waila.nolimit")); else { int limit = tile.getEffectiveDrawerCapacity() * tile.getEffectiveStorageMultiplier(); currenttip.add(I18n.format("storageDrawers.waila.limit", limit, tile.getEffectiveStorageMultiplier())); } } } if (config.getConfig("display.status")) { String attrib = ""; if (tile.isItemLocked(LockAttribute.LOCK_POPULATED)) attrib += (attrib.isEmpty() ? "" : ", ") + I18n.format("storageDrawers.waila.locked"); if (tile.isVoid()) attrib += (attrib.isEmpty() ? "" : ", ") + I18n.format("storageDrawers.waila.void"); if (tile.isSorting()) attrib += (attrib.isEmpty() ? "" : ", ") + I18n.format("storageDrawers.waila.sorting"); if (tile.getOwner() != null) attrib += (attrib.isEmpty() ? "" : ", ") + I18n.format("storageDrawers.waila.protected"); if (!attrib.isEmpty()) currenttip.add(attrib); } return currenttip; } @Override public List<String> getWailaTail (ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { return currenttip; } @Override public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { return null; } } }