diff --git a/src/main/java/forestry/api/apiculture/IHiveFrame.java b/src/main/java/forestry/api/apiculture/IHiveFrame.java index 4fde6a58a..6fb978158 100644 --- a/src/main/java/forestry/api/apiculture/IHiveFrame.java +++ b/src/main/java/forestry/api/apiculture/IHiveFrame.java @@ -5,7 +5,12 @@ ******************************************************************************/ package forestry.api.apiculture; +import java.util.List; + +import javax.annotation.Nullable; + import net.minecraft.item.ItemStack; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; public interface IHiveFrame { @@ -22,4 +27,15 @@ public interface IHiveFrame { ItemStack frameUsed(IBeeHousing housing, ItemStack frame, IBee queen, int wear); IBeeModifier getBeeModifier(); + + /** + * Provides an override for the "Hold Shift" tooltip info for a frame.
+ * Called by {@link forestry.apiculture.EventHandlerApiculture#addFrameTooltip(ItemTooltipEvent)}. + * + * @return The info to display for this frame, or null if default generated info. + */ + @Nullable + default List getFrameTooltip() { + return null; + } } diff --git a/src/main/java/forestry/apiculture/EventHandlerApiculture.java b/src/main/java/forestry/apiculture/EventHandlerApiculture.java new file mode 100644 index 000000000..60696863d --- /dev/null +++ b/src/main/java/forestry/apiculture/EventHandlerApiculture.java @@ -0,0 +1,103 @@ +package forestry.apiculture; + +import java.util.List; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import forestry.api.apiculture.IBeeModifier; +import forestry.api.apiculture.IHiveFrame; +import forestry.core.proxy.Proxies; +import forestry.core.utils.StringUtil; + +public class EventHandlerApiculture { + + @SubscribeEvent + public void addFrameTooltip(ItemTooltipEvent event) { + ItemStack itemStack = event.itemStack; + if (itemStack != null && itemStack.getItem() instanceof IHiveFrame) { + IHiveFrame frame = (IHiveFrame) itemStack.getItem(); + IBeeModifier modifier = frame.getBeeModifier(); + List tooltip = event.toolTip; + + if (!Proxies.common.isShiftDown()) { + tooltip.add(EnumChatFormatting.ITALIC + "<" + StringUtil.localize("gui.tooltip.tmi") + ">"); + } else { + if (frame.getFrameTooltip() != null) { + // use the override if it exists + tooltip.addAll(frame.getFrameTooltip()); + } else { + // otherwise use the auto-generated info + int durability = itemStack.getMaxDamage(); + tooltip.add(StringUtil.localize("frame.tooltip.durability") + getDurabilityFormatted(durability)); + + float territory = modifier.getTerritoryModifier(null, 1.0F); + tooltip.add(StringUtil.localize("frame.tooltip.territory") + getColorFormatted(territory)); + + float mutation = modifier.getMutationModifier(null, null, 1.0F); + tooltip.add(StringUtil.localize("frame.tooltip.mutationRate") + getColorFormatted(mutation)); + + float lifespan = modifier.getLifespanModifier(null, null, 1.0F); + tooltip.add(StringUtil.localize("frame.tooltip.lifespan") + getColorFormatted(lifespan)); + + float production = modifier.getProductionModifier(null, 1.0F); + tooltip.add(StringUtil.localize("frame.tooltip.production") + getColorFormatted(production, true)); + + float decay = modifier.getGeneticDecay(null, 1.0F); + tooltip.add(StringUtil.localize("frame.tooltip.geneticDecay") + getColorFormatted(decay)); + } + } + } + } + + private static String getDurabilityFormatted(int durability) { + EnumChatFormatting color; + if (durability < 100) { + color = EnumChatFormatting.DARK_RED; + } else if (durability < 200) { + color = EnumChatFormatting.RED; + } else if (durability < 250) { + color = EnumChatFormatting.GOLD; + } else if (durability < 750) { + color = EnumChatFormatting.GREEN; + } else { + color = EnumChatFormatting.AQUA; + } + return color + " " + durability; + } + + private static String getColorFormatted(float value, boolean additive) { + EnumChatFormatting color; + if (value <= 0.5F) { + color = EnumChatFormatting.DARK_RED; // "bad" stat + } else if (value < 1.0F) { + color = EnumChatFormatting.RED; // "below average" stat + } else if (value == 1.0F) { + color = EnumChatFormatting.GOLD; // "average" stat + } else if (value <= 2.0F) { + color = EnumChatFormatting.GREEN; // "above average" stat + } else { + color = EnumChatFormatting.AQUA; // "great" stat + } + String formatted = color.toString(); + + // Set symbol for if this value is additive or multiplicative + if (additive) { + formatted += " +"; + } else { + formatted += " x"; + } + + // trim trailing zeroes if no decimal-precision is needed + if (value == (long) value) { + return formatted + (long) value; + } + return formatted + value; + } + + private static String getColorFormatted(float value) { + return getColorFormatted(value, false); + } +} diff --git a/src/main/java/forestry/plugins/PluginApiculture.java b/src/main/java/forestry/plugins/PluginApiculture.java index d9c2640c4..5652ec846 100644 --- a/src/main/java/forestry/plugins/PluginApiculture.java +++ b/src/main/java/forestry/plugins/PluginApiculture.java @@ -60,6 +60,7 @@ import forestry.api.recipes.RecipeManagers; import forestry.api.storage.ICrateRegistry; import forestry.api.storage.StorageManager; import forestry.apiculture.ArmorApiaristHelper; +import forestry.apiculture.EventHandlerApiculture; import forestry.apiculture.SaveEventHandlerApiculture; import forestry.apiculture.VillageHandlerApiculture; import forestry.apiculture.blocks.BlockAlveary; @@ -185,6 +186,7 @@ public class PluginApiculture extends ForestryPlugin { super.preInit(); MinecraftForge.EVENT_BUS.register(this); + MinecraftForge.EVENT_BUS.register(new EventHandlerApiculture()); blocks.apiculture.addDefinitions( new MachineDefinition(BlockApicultureType.APIARY).setFaces(0, 1, 2, 2, 4, 4, 0, 7), diff --git a/src/main/resources/assets/forestry/lang/en_US.lang b/src/main/resources/assets/forestry/lang/en_US.lang index 7cb78b5ae..a7b9d299e 100644 --- a/src/main/resources/assets/forestry/lang/en_US.lang +++ b/src/main/resources/assets/forestry/lang/en_US.lang @@ -568,6 +568,13 @@ item.for.frameImpregnated.name=Impregnated Frame item.for.frameProven.name=Proven Frame item.for.frameUntreated.name=Untreated Frame +for.frame.tooltip.durability=Durability: +for.frame.tooltip.territory=Territory: +for.frame.tooltip.mutationRate=Mutation Rate: +for.frame.tooltip.lifespan=Lifespan: +for.frame.tooltip.production=Production: +for.frame.tooltip.geneticDecay=Genetic Decay: + item.for.fruits.cherry.name=Cherry item.for.fruits.chestnut.name=Chestnut item.for.fruits.dates.name=Date