From 1dd68bf4271462167bbf579e038d873526ad766f Mon Sep 17 00:00:00 2001 From: Zelophed Date: Mon, 23 Mar 2020 01:13:37 +0100 Subject: [PATCH] refactor to the goggle overlay system added interface IHaveGoggleInformation to be implemented by TileEntities that want to display stuff on screen --- .../foundation/item/ItemDescription.java | 6 +- .../base/GeneratingKineticTileEntity.java | 32 +- .../modules/contraptions/base/IRotate.java | 56 +++- .../contraptions/base/KineticTileEntity.java | 39 ++- .../goggle/GoggleOverlayRenderer.java | 82 ++++++ .../goggle/IHaveGoggleInformation.java | 28 ++ .../redstone/AnalogLeverTileEntity.java | 13 +- .../gauge/GaugeInformationRenderer.java | 274 ------------------ .../relays/gauge/GaugeTileEntity.java | 15 +- .../relays/gauge/SpeedGaugeTileEntity.java | 17 +- .../relays/gauge/StressGaugeTileEntity.java | 38 +++ .../resources/assets/create/lang/en_us.json | 1 + 12 files changed, 315 insertions(+), 286 deletions(-) create mode 100644 src/main/java/com/simibubi/create/modules/contraptions/goggle/GoggleOverlayRenderer.java create mode 100644 src/main/java/com/simibubi/create/modules/contraptions/goggle/IHaveGoggleInformation.java delete mode 100644 src/main/java/com/simibubi/create/modules/contraptions/relays/gauge/GaugeInformationRenderer.java diff --git a/src/main/java/com/simibubi/create/foundation/item/ItemDescription.java b/src/main/java/com/simibubi/create/foundation/item/ItemDescription.java index 7422a3933..554fd3a21 100644 --- a/src/main/java/com/simibubi/create/foundation/item/ItemDescription.java +++ b/src/main/java/com/simibubi/create/foundation/item/ItemDescription.java @@ -107,7 +107,7 @@ public class ItemDescription { StressImpact impactId = impact >= config.highStressImpact.get() ? StressImpact.HIGH : (impact >= config.mediumStressImpact.get() ? StressImpact.MEDIUM : StressImpact.LOW); int index = impactId.ordinal(); - String level = impactId.getColor() + makeProgressBar(3, index) + stressLevels.get(index); + String level = impactId.getAbsoluteColor() + makeProgressBar(3, index) + stressLevels.get(index); if (hasGlasses) level += " (" + impacts.get(id).get() + stressUnit + ")"; @@ -122,8 +122,8 @@ public class ItemDescription { double capacity = capacities.get(id).get(); StressImpact impactId = capacity >= config.highCapacity.get() ? StressImpact.LOW : (capacity >= config.mediumCapacity.get() ? StressImpact.MEDIUM : StressImpact.HIGH); - int index = StressImpact.values().length - 1 - impactId.ordinal(); - String level = impactId.getColor() + makeProgressBar(3, index) + stressCapacityLevels.get(index); + int index = StressImpact.values().length - 2 - impactId.ordinal(); + String level = impactId.getAbsoluteColor() + makeProgressBar(3, index) + stressCapacityLevels.get(index); if (hasGlasses) level += " (" + capacity + stressUnit + ")"; diff --git a/src/main/java/com/simibubi/create/modules/contraptions/base/GeneratingKineticTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/base/GeneratingKineticTileEntity.java index 64d937b9b..504240e4b 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/base/GeneratingKineticTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/base/GeneratingKineticTileEntity.java @@ -1,10 +1,15 @@ package com.simibubi.create.modules.contraptions.base; +import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.modules.contraptions.KineticNetwork; import com.simibubi.create.modules.contraptions.base.IRotate.SpeedLevel; +import com.simibubi.create.modules.contraptions.goggle.IHaveGoggleInformation; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextFormatting; + +import java.util.List; public abstract class GeneratingKineticTileEntity extends KineticTileEntity { @@ -42,6 +47,32 @@ public abstract class GeneratingKineticTileEntity extends KineticTileEntity { } } + @Override + public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { + boolean added = super.addToGoggleTooltip(tooltip, isPlayerSneaking); + + float stressBase = getAddedStressCapacity(); + if (stressBase != 0 && IRotate.StressImpact.isEnabled()) { + tooltip.add(spacing + Lang.translate("gui.goggles.generator_stats")); + tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("tooltip.capacityProvided")); + + float speed = getTheoreticalSpeed(); + if (speed != getGeneratedSpeed() && speed != 0) + stressBase *= getGeneratedSpeed() / speed; + + speed = Math.abs(speed); + float stressTotal = stressBase * speed; + + String stressString = spacing + "%s%s" + Lang.translate("generic.unit.stress") + " " + TextFormatting.DARK_GRAY + "%s"; + tooltip.add(String.format(stressString, TextFormatting.AQUA, IHaveGoggleInformation.format(stressBase), Lang.translate("gui.goggles.base_value"))); + tooltip.add(String.format(stressString, TextFormatting.GRAY, IHaveGoggleInformation.format(stressTotal), Lang.translate("gui.goggles.at_current_speed"))); + + added = true; + } + + return added; + } + public void updateGeneratedRotation() { float speed = getGeneratedSpeed(); float prevSpeed = this.speed; @@ -122,5 +153,4 @@ public abstract class GeneratingKineticTileEntity extends KineticTileEntity { public Long createNetworkId() { return pos.toLong(); } - } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/base/IRotate.java b/src/main/java/com/simibubi/create/modules/contraptions/base/IRotate.java index b9db4e91f..d28a0408c 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/base/IRotate.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/base/IRotate.java @@ -1,8 +1,11 @@ package com.simibubi.create.modules.contraptions.base; import com.simibubi.create.config.AllConfigs; +import com.simibubi.create.foundation.item.ItemDescription; +import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.modules.contraptions.IWrenchable; +import com.simibubi.create.modules.contraptions.goggle.IHaveGoggleInformation; import net.minecraft.block.BlockState; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; @@ -12,7 +15,7 @@ import net.minecraft.world.IWorldReader; public interface IRotate extends IWrenchable { - public enum SpeedLevel { + enum SpeedLevel { NONE, MEDIUM, FAST; @@ -53,20 +56,65 @@ public interface IRotate extends IWrenchable { } } + public static String getFormattedSpeedText(float speed, boolean overstressed){ + SpeedLevel speedLevel = of(speed); + + String color; + if (overstressed) + color = TextFormatting.DARK_GRAY + "" + TextFormatting.STRIKETHROUGH; + else + color = speedLevel.getTextColor() + ""; + + String level = color + ItemDescription.makeProgressBar(3, speedLevel.ordinal()); + + if (speedLevel == SpeedLevel.MEDIUM) + level += Lang.translate("tooltip.speedRequirements.medium"); + if (speedLevel == SpeedLevel.FAST) + level += Lang.translate("tooltip.speedRequirements.high"); + + level += String.format(" (%s%s) ", IHaveGoggleInformation.format(Math.abs(speed)), Lang.translate("generic.unit.rpm")); + + return level; + } + } - public enum StressImpact { + enum StressImpact { LOW, MEDIUM, - HIGH; + HIGH, + OVERSTRESSED; - public TextFormatting getColor() { + public TextFormatting getAbsoluteColor() { return this == LOW ? TextFormatting.YELLOW : this == MEDIUM ? TextFormatting.GOLD : TextFormatting.RED; } + + public TextFormatting getRelativeColor() { + return this == LOW ? TextFormatting.GREEN : this == MEDIUM ? TextFormatting.YELLOW : this == HIGH ? TextFormatting.GOLD : TextFormatting.RED; + } + + public static StressImpact of(double stressPercent){ + if (stressPercent > 1) return StressImpact.OVERSTRESSED; + else if (stressPercent > .75d) return StressImpact.HIGH; + else if (stressPercent > .5d) return StressImpact.MEDIUM; + else return StressImpact.LOW; + } public static boolean isEnabled() { return !AllConfigs.SERVER.kinetics.disableStress.get(); } + + public static String getFormattedStressText(double stressPercent){ + StressImpact stressLevel = of(stressPercent); + TextFormatting color = stressLevel.getRelativeColor(); + + String level = color + ItemDescription.makeProgressBar(3, stressLevel.ordinal()); + level += Lang.translate("tooltip.stressImpact."+Lang.asId(stressLevel.name())); + + level += String.format(" (%s%%) ", (int) (stressPercent * 100)); + + return level; + } } public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face); diff --git a/src/main/java/com/simibubi/create/modules/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/base/KineticTileEntity.java index 688a16419..c38248877 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/base/KineticTileEntity.java @@ -10,12 +10,16 @@ import com.simibubi.create.config.AllConfigs; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.behaviour.base.SmartTileEntity; import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour; +import com.simibubi.create.foundation.item.TooltipHelper; +import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.modules.contraptions.KineticNetwork; import com.simibubi.create.modules.contraptions.RotationPropagator; import com.simibubi.create.modules.contraptions.base.IRotate.SpeedLevel; import com.simibubi.create.modules.contraptions.base.IRotate.StressImpact; +import com.simibubi.create.modules.contraptions.goggle.IHaveGoggleInformation; import net.minecraft.block.BlockState; +import net.minecraft.client.resources.I18n; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.NBTUtil; import net.minecraft.tileentity.ITickableTileEntity; @@ -23,10 +27,13 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.common.ForgeConfigSpec.ConfigValue; -public abstract class KineticTileEntity extends SmartTileEntity implements ITickableTileEntity { +import static net.minecraft.util.text.TextFormatting.GRAY; + +public abstract class KineticTileEntity extends SmartTileEntity implements ITickableTileEntity, IHaveGoggleInformation { public @Nullable Long network; public @Nullable BlockPos source; @@ -346,6 +353,36 @@ public abstract class KineticTileEntity extends SmartTileEntity implements ITick return true; } + @Override + public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { + boolean added = false; + float stressAtBase = getStressApplied(); + + boolean notFastEnough = !isSpeedRequirementFulfilled() && getSpeed() != 0; + + if (notFastEnough) { + tooltip.addAll(TooltipHelper.cutString(spacing + Lang.translate("gui.contraptions.not_fast_enough", I18n.format(getBlockState().getBlock().getTranslationKey())), GRAY, TextFormatting.WHITE)); + added = true; + } + + if (getStressApplied() != 0 && StressImpact.isEnabled()){ + tooltip.add(spacing + Lang.translate("gui.goggles.kinetic_stats")); + tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("tooltip.stressImpact")); + + float stressTotal = stressAtBase * Math.abs(getSpeed()); + + String stressString = spacing + "%s%s" + Lang.translate("generic.unit.stress") + " " + TextFormatting.DARK_GRAY + "%s"; + + tooltip.add(String.format(stressString, TextFormatting.AQUA, IHaveGoggleInformation.format(stressAtBase), Lang.translate("gui.goggles.base_value"))); + tooltip.add(String.format(stressString, TextFormatting.GRAY, IHaveGoggleInformation.format(stressTotal), Lang.translate("gui.goggles.at_current_speed"))); + + added = true; + } + + return added; + + } + public int getFlickerScore() { return flickerTally; } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/goggle/GoggleOverlayRenderer.java b/src/main/java/com/simibubi/create/modules/contraptions/goggle/GoggleOverlayRenderer.java new file mode 100644 index 000000000..9a76cd34b --- /dev/null +++ b/src/main/java/com/simibubi/create/modules/contraptions/goggle/GoggleOverlayRenderer.java @@ -0,0 +1,82 @@ +package com.simibubi.create.modules.contraptions.goggle; + +import java.util.ArrayList; +import java.util.List; + +import com.mojang.blaze3d.platform.GlStateManager; +import com.simibubi.create.AllItems; +import com.simibubi.create.foundation.gui.ScreenElementRenderer; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.inventory.EquipmentSlotType; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.RayTraceResult; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; + +@EventBusSubscriber(value = Dist.CLIENT) +public class GoggleOverlayRenderer { + + @SubscribeEvent + public static void lookingAtBlocksThroughGogglesShowsTooltip(RenderGameOverlayEvent.Post event) { + if (event.getType() != ElementType.HOTBAR) + return; + + RayTraceResult objectMouseOver = Minecraft.getInstance().objectMouseOver; + if (!(objectMouseOver instanceof BlockRayTraceResult)) + return; + + BlockRayTraceResult result = (BlockRayTraceResult) objectMouseOver; + Minecraft mc = Minecraft.getInstance(); + ClientWorld world = mc.world; + BlockPos pos = result.getPos(); + ItemStack goggles = mc.player.getItemStackFromSlot(EquipmentSlotType.HEAD); + TileEntity te = world.getTileEntity(pos); + + if (!AllItems.GOGGLES.typeOf(goggles)) + return; + + if (!(te instanceof IHaveGoggleInformation)) + return; + + IHaveGoggleInformation gte = (IHaveGoggleInformation) te; + + List tooltip = new ArrayList<>(); + + if (!gte.addToGoggleTooltip(tooltip, mc.player.isSneaking())) + return; + + GlStateManager.pushMatrix(); + Screen tooltipScreen = new Screen(null) { + + @Override + public void init(Minecraft mc, int width, int height) { + this.minecraft = mc; + this.itemRenderer = mc.getItemRenderer(); + this.font = mc.fontRenderer; + this.width = width; + this.height = height; + } + + }; + + tooltipScreen.init(mc, mc.mainWindow.getScaledWidth(), mc.mainWindow.getScaledHeight()); + tooltipScreen.renderTooltip(tooltip, tooltipScreen.width / 2, tooltipScreen.height / 2); + ItemStack item = goggles; + ScreenElementRenderer.render3DItem(() -> { + GlStateManager.translated(tooltipScreen.width / 2 + 10, tooltipScreen.height / 2 - 16, 0); + return item; + }); + GlStateManager.popMatrix(); + + } + +} diff --git a/src/main/java/com/simibubi/create/modules/contraptions/goggle/IHaveGoggleInformation.java b/src/main/java/com/simibubi/create/modules/contraptions/goggle/IHaveGoggleInformation.java new file mode 100644 index 000000000..10b0810e7 --- /dev/null +++ b/src/main/java/com/simibubi/create/modules/contraptions/goggle/IHaveGoggleInformation.java @@ -0,0 +1,28 @@ +package com.simibubi.create.modules.contraptions.goggle; + +import java.text.DecimalFormat; +import java.util.List; + +/* +* Implement this Interface in the TileEntity class that wants to add info to the screen +* */ +public interface IHaveGoggleInformation { + + DecimalFormat decimalFormat = new DecimalFormat("#.##"); + String spacing = " "; + + /** + * this method will be called when looking at a TileEntity that implemented this interface + * + * @return {{@code true}} if the tooltip creation was successful and should be displayed, + * or {{@code false}} if the overlay should not be displayed + * */ + default boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking){ + return false; + } + + static String format(double d) { + return decimalFormat.format(d); + } + +} diff --git a/src/main/java/com/simibubi/create/modules/contraptions/redstone/AnalogLeverTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/redstone/AnalogLeverTileEntity.java index 63b0bd5c2..79c4a2926 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/redstone/AnalogLeverTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/redstone/AnalogLeverTileEntity.java @@ -7,10 +7,14 @@ import com.simibubi.create.foundation.behaviour.base.SmartTileEntity; import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.modules.contraptions.goggle.IHaveGoggleInformation; +import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.MathHelper; -public class AnalogLeverTileEntity extends SmartTileEntity { +public class AnalogLeverTileEntity extends SmartTileEntity implements IHaveGoggleInformation { int state = 0; int lastChange; @@ -69,6 +73,13 @@ public class AnalogLeverTileEntity extends SmartTileEntity { sendData(); } + @Override + public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { + tooltip.add(spacing + Lang.translate("tooltip.analogStrength", this.state)); + + return true; + } + public int getState() { return state; } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/gauge/GaugeInformationRenderer.java b/src/main/java/com/simibubi/create/modules/contraptions/relays/gauge/GaugeInformationRenderer.java deleted file mode 100644 index 3bbaf5bb5..000000000 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/gauge/GaugeInformationRenderer.java +++ /dev/null @@ -1,274 +0,0 @@ -package com.simibubi.create.modules.contraptions.relays.gauge; - -import static net.minecraft.util.text.TextFormatting.AQUA; -import static net.minecraft.util.text.TextFormatting.DARK_GRAY; -import static net.minecraft.util.text.TextFormatting.GRAY; - -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.List; - -import com.mojang.blaze3d.platform.GlStateManager; -import com.simibubi.create.AllBlocks; -import com.simibubi.create.AllItems; -import com.simibubi.create.foundation.gui.ScreenElementRenderer; -import com.simibubi.create.foundation.item.ItemDescription; -import com.simibubi.create.foundation.item.TooltipHelper; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.modules.contraptions.base.GeneratingKineticTileEntity; -import com.simibubi.create.modules.contraptions.base.IRotate.SpeedLevel; -import com.simibubi.create.modules.contraptions.base.IRotate.StressImpact; -import com.simibubi.create.modules.contraptions.base.KineticTileEntity; - -import com.simibubi.create.modules.contraptions.redstone.AnalogLeverTileEntity; -import net.minecraft.block.BlockState; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.resources.I18n; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockRayTraceResult; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.text.TextFormatting; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.RenderGameOverlayEvent; -import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod.EventBusSubscriber; - -@EventBusSubscriber(value = Dist.CLIENT) -public class GaugeInformationRenderer { - - private static DecimalFormat decimalFormat = new DecimalFormat("#.##"); - private static String spacing = " "; - - @SubscribeEvent - public static void lookingAtBlocksThroughGogglesShowsTooltip(RenderGameOverlayEvent.Post event) { - if (event.getType() != ElementType.HOTBAR) - return; - - RayTraceResult objectMouseOver = Minecraft.getInstance().objectMouseOver; - if (!(objectMouseOver instanceof BlockRayTraceResult)) - return; - - BlockRayTraceResult result = (BlockRayTraceResult) objectMouseOver; - Minecraft mc = Minecraft.getInstance(); - ClientWorld world = mc.world; - BlockPos pos = result.getPos(); - BlockState state = world.getBlockState(pos); - ItemStack goggles = mc.player.getItemStackFromSlot(EquipmentSlotType.HEAD); - TileEntity te = world.getTileEntity(pos); - boolean notFastEnough = (te instanceof KineticTileEntity) - && !((KineticTileEntity) te).isSpeedRequirementFulfilled() && ((KineticTileEntity) te).getSpeed() != 0; - - if (!AllItems.GOGGLES.typeOf(goggles) && !notFastEnough) - return; - if (mc.player.isSneaking() && !(te instanceof AnalogLeverTileEntity)) - return; - - List tooltip = new ArrayList<>(); - - if (notFastEnough) { - addSpeedRequirementMessage(state, tooltip, (KineticTileEntity) te); - goggles = AllItems.GOGGLES.asStack(); - } else if (state.getBlock() instanceof GaugeBlock) - addGaugeTooltip(state, tooltip, te); - else { - if (te instanceof GeneratingKineticTileEntity) - addGeneratorTooltip(state, tooltip, (GeneratingKineticTileEntity) te); - if (te instanceof KineticTileEntity) - addStressTooltip(state, tooltip, (KineticTileEntity) te); - if (te instanceof AnalogLeverTileEntity) - addLeverTooltip(state, tooltip, (AnalogLeverTileEntity) te); - } - - if (tooltip.isEmpty()) - return; - - GlStateManager.pushMatrix(); - Screen tooltipScreen = new Screen(null) { - - @Override - public void init(Minecraft mc, int width, int height) { - this.minecraft = mc; - this.itemRenderer = mc.getItemRenderer(); - this.font = mc.fontRenderer; - this.width = width; - this.height = height; - } - - }; - - tooltipScreen.init(mc, mc.mainWindow.getScaledWidth(), mc.mainWindow.getScaledHeight()); - tooltipScreen.renderTooltip(tooltip, tooltipScreen.width / 2, tooltipScreen.height / 2); - ItemStack item = goggles; - ScreenElementRenderer.render3DItem(() -> { - GlStateManager.translated(tooltipScreen.width / 2 + 10, tooltipScreen.height / 2 - 16, 0); - return item; - }); - GlStateManager.popMatrix(); - - } - - private static void addSpeedRequirementMessage(BlockState state, List tooltip, KineticTileEntity te) { - String spacing = " "; - tooltip.addAll(TooltipHelper.cutString(spacing - + Lang.translate("gui.contraptions.not_fast_enough", I18n.format(state.getBlock().getTranslationKey())), - GRAY, TextFormatting.WHITE)); - } - - private static void addStressTooltip(BlockState state, List tooltip, KineticTileEntity te) { - float stressApplied = te.getStressApplied(); - if (stressApplied == 0 || !StressImpact.isEnabled()) - return; - - String _kineticStatsTitle = Lang.translate("gui.goggles.kinetic_stats"); - String _stressImpact = Lang.translate("tooltip.stressImpact"); - String _atCurrentSpeed = Lang.translate("gui.goggles.at_current_speed"); - String _stressUnit = Lang.translate("generic.unit.stress"); - String _baseValue = Lang.translate("gui.goggles.base_value"); - - tooltip.add(spacing + _kineticStatsTitle); - tooltip.add(spacing + GRAY + _stressImpact); - - String addedStress = AQUA + "" + format(stressApplied) + _stressUnit + " " + DARK_GRAY + _baseValue; - String addedStressAtBase = - GRAY + "" + format(stressApplied * Math.abs(te.getSpeed())) + _stressUnit + " " + DARK_GRAY + _atCurrentSpeed; - tooltip.add(spacing + " " + addedStress); - tooltip.add(spacing + " " + addedStressAtBase); - } - - private static void addGeneratorTooltip(BlockState state, List tooltip, GeneratingKineticTileEntity te) { - float addedStressCapacity = te.getAddedStressCapacity(); - if (addedStressCapacity == 0 || !StressImpact.isEnabled()) - return; - - String _stressUnit = Lang.translate("generic.unit.stress"); - String _atCurrentSpeed = Lang.translate("gui.goggles.at_current_speed"); - String _baseValue = Lang.translate("gui.goggles.base_value"); - String _generatorStatsTitle = Lang.translate("gui.goggles.generator_stats"); - String _capacityProvided = Lang.translate("tooltip.capacityProvided"); - - float speed = te.getTheoreticalSpeed(); - if (speed != te.getGeneratedSpeed() && speed != 0) - addedStressCapacity *= (te.getGeneratedSpeed() / speed); - - tooltip.add(spacing + _generatorStatsTitle); - tooltip.add(spacing + GRAY + _capacityProvided); - - float actualSpeed = Math.abs(speed); - float relativeCap = 0; - if (actualSpeed != 0) - relativeCap = addedStressCapacity * actualSpeed; - - String addedCapacity = - AQUA + "" + format(addedStressCapacity) + _stressUnit + " " + DARK_GRAY + _baseValue; - String addedCapacityAtBase = GRAY + "" + format(relativeCap) + _stressUnit + " " + DARK_GRAY + _atCurrentSpeed; - tooltip.add(spacing + " " + addedCapacity); - tooltip.add(spacing + " " + addedCapacityAtBase); - } - - private static void addGaugeTooltip(BlockState state, List tooltip, TileEntity te) { - - String _rpmUnit = Lang.translate("generic.unit.rpm"); - String _speedGaugeTitle = Lang.translate("gui.speed_gauge.title"); - String _infoHeader = Lang.translate("gui.gauge.info_header"); - String _overStressed = Lang.translate("gui.stress_gauge.overstressed"); - String _noRotation = Lang.translate("gui.stress_gauge.no_rotation"); - String _capacity = Lang.translate("gui.stress_gauge.capacity"); - String _stressGaugeTitle = Lang.translate("gui.stress_gauge.title"); - String _stressUnit = Lang.translate("generic.unit.stress"); - String _atCurrentSpeed = Lang.translate("gui.goggles.at_current_speed"); - String _baseValue = Lang.translate("gui.goggles.base_value"); - - tooltip.add(spacing + _infoHeader); - - if (AllBlocks.STRESS_GAUGE.typeOf(state)) { - if (!(te instanceof StressGaugeTileEntity)) - return; - if (!StressImpact.isEnabled()) { - tooltip.clear(); - return; - } - StressGaugeTileEntity stressGauge = (StressGaugeTileEntity) te; - List stressLevels = Lang.translatedOptions("tooltip.stressImpact", "low", "medium", "high"); - double stress = stressGauge.getNetworkStress(); - double cap = stressGauge.getNetworkCapacity(); - double relStress = stress / (cap == 0 ? 1 : cap); - StressImpact impactId = relStress > 1 ? null - : (relStress > .75f) ? StressImpact.HIGH - : (relStress > .5f ? StressImpact.MEDIUM : StressImpact.LOW); - - TextFormatting color = TextFormatting.RED; - if (impactId == StressImpact.LOW) - color = TextFormatting.GREEN; - if (impactId == StressImpact.MEDIUM) - color = TextFormatting.YELLOW; - if (impactId == StressImpact.HIGH) - color = TextFormatting.GOLD; - - String level = TextFormatting.DARK_RED + ItemDescription.makeProgressBar(3, 2) + "" + _overStressed; - if (impactId != null) { - int index = impactId.ordinal(); - level = color + ItemDescription.makeProgressBar(3, index) + stressLevels.get(index); - } - - level += " (" + (int) (relStress * 100) + "%)"; - - float theoreticalSpeed = stressGauge.getTheoreticalSpeed(); - if (theoreticalSpeed == 0) - level = DARK_GRAY + ItemDescription.makeProgressBar(3, -1) + _noRotation; - - tooltip.add(spacing + GRAY + _stressGaugeTitle); - tooltip.add(spacing + level); - - if (theoreticalSpeed != 0) { - tooltip.add(spacing + GRAY + _capacity); - - String capacity = color + "" + format((cap - stress) / Math.abs(theoreticalSpeed)) + _stressUnit + " " - + DARK_GRAY + _baseValue; - String capacityAtBase = GRAY + "" + format(cap - stress) + _stressUnit + " " + DARK_GRAY + _atCurrentSpeed; - tooltip.add(spacing + " " + capacity); - tooltip.add(spacing + " " + capacityAtBase); - } - } - - if (AllBlocks.SPEED_GAUGE.typeOf(state)) { - if (!(te instanceof SpeedGaugeTileEntity)) - return; - SpeedGaugeTileEntity speedGauge = (SpeedGaugeTileEntity) te; - float speed = speedGauge.getTheoreticalSpeed(); - boolean overstressed = speedGauge.getSpeed() == 0 && speed != 0; - - SpeedLevel speedLevel = SpeedLevel.of(speed); - String color = speedLevel.getTextColor() + ""; - if (overstressed) - color = DARK_GRAY + "" + TextFormatting.STRIKETHROUGH; - - List speedLevels = Lang.translatedOptions("tooltip.speedRequirement", "none", "medium", "high"); - int index = speedLevel.ordinal(); - String level = color + ItemDescription.makeProgressBar(3, index) - + (speedLevel != SpeedLevel.NONE ? speedLevels.get(index) : ""); - level += " (" + format(Math.abs(speed)) + "" + _rpmUnit + ") "; - - tooltip.add(spacing + GRAY + _speedGaugeTitle); - tooltip.add(spacing + level); - - if (overstressed) - tooltip.add(spacing + TextFormatting.DARK_RED + _overStressed); - } - } - - private static void addLeverTooltip(BlockState state, List tooltip, AnalogLeverTileEntity te) { - int leverState = te.getState(); - tooltip.add(spacing + Lang.translate("tooltip.analogStrength", leverState)); - } - - private static String format(double d) { - return decimalFormat.format(d); - } - -} diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/gauge/GaugeTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/relays/gauge/GaugeTileEntity.java index 2bfb65ac1..aa54c501b 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/gauge/GaugeTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/relays/gauge/GaugeTileEntity.java @@ -1,11 +1,17 @@ package com.simibubi.create.modules.contraptions.relays.gauge; +import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.modules.contraptions.base.KineticTileEntity; +import com.simibubi.create.modules.contraptions.goggle.IHaveGoggleInformation; +import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; -public class GaugeTileEntity extends KineticTileEntity { +import java.util.List; + +public class GaugeTileEntity extends KineticTileEntity implements IHaveGoggleInformation { public float dialTarget; public float dialState; @@ -39,4 +45,11 @@ public class GaugeTileEntity extends KineticTileEntity { dialState -= (dialState - 1) * world.rand.nextFloat(); } + @Override + public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { + tooltip.add(spacing + Lang.translate("gui.gauge.info_header")); + + return true; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/gauge/SpeedGaugeTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/relays/gauge/SpeedGaugeTileEntity.java index c800acc04..5c7ff0ae4 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/gauge/SpeedGaugeTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/relays/gauge/SpeedGaugeTileEntity.java @@ -4,12 +4,16 @@ import com.simibubi.create.AllTileEntities; import com.simibubi.create.config.AllConfigs; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.utility.ColorHelper; +import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.modules.contraptions.GogglesItem; import com.simibubi.create.modules.contraptions.base.IRotate.SpeedLevel; import net.minecraft.util.math.MathHelper; +import net.minecraft.util.text.TextFormatting; -public class SpeedGaugeTileEntity extends GaugeTileEntity { +import java.util.List; + +public class SpeedGaugeTileEntity extends GaugeTileEntity{ public SpeedGaugeTileEntity() { super(AllTileEntities.SPEED_GAUGE.type); @@ -41,4 +45,15 @@ public class SpeedGaugeTileEntity extends GaugeTileEntity { markDirty(); } + @Override + public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { + super.addToGoggleTooltip(tooltip, isPlayerSneaking); + + tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.speed_gauge.title")); + tooltip.add(spacing + SpeedLevel.getFormattedSpeedText(speed, overStressed)); + if (overStressed) + tooltip.add(spacing + TextFormatting.DARK_RED + Lang.translate("gui.stress_gauge.overstressed")); + + return true; + } } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/gauge/StressGaugeTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/relays/gauge/StressGaugeTileEntity.java index d2855acf6..c819e6d23 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/gauge/StressGaugeTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/relays/gauge/StressGaugeTileEntity.java @@ -1,8 +1,14 @@ package com.simibubi.create.modules.contraptions.relays.gauge; import com.simibubi.create.AllTileEntities; +import com.simibubi.create.foundation.item.ItemDescription; import com.simibubi.create.foundation.utility.ColorHelper; +import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.modules.contraptions.base.IRotate.StressImpact; +import com.simibubi.create.modules.contraptions.goggle.IHaveGoggleInformation; +import net.minecraft.util.text.TextFormatting; + +import java.util.List; public class StressGaugeTileEntity extends GaugeTileEntity { @@ -47,6 +53,38 @@ public class StressGaugeTileEntity extends GaugeTileEntity { updateStressFromNetwork(capacity, stress); } + @Override + public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { + if (!StressImpact.isEnabled()) + return false; + + super.addToGoggleTooltip(tooltip, isPlayerSneaking); + + double capacity = getNetworkCapacity(); + double stressFraction = getNetworkStress() / (capacity == 0 ? 1 : capacity); + + tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.stress_gauge.title")); + + if (getTheoreticalSpeed() == 0) + tooltip.add(TextFormatting.DARK_GRAY + ItemDescription.makeProgressBar(3, -1) + Lang.translate("gui.stress_gauge.no_rotation")); + else { + tooltip.add(spacing + StressImpact.getFormattedStressText(stressFraction)); + + tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.stress_gauge.capacity")); + + double remainingCapacity = capacity - getNetworkStress(); + double remainingCapacityAtBase = remainingCapacity / Math.abs(getTheoreticalSpeed()); + + String capacityString = spacing + StressImpact.of(stressFraction).getRelativeColor() + "%s" + Lang.translate("generic.unit.stress") + " " + TextFormatting.DARK_GRAY + "%s"; + + tooltip.add(String.format(capacityString, IHaveGoggleInformation.format(remainingCapacityAtBase), Lang.translate("gui.goggles.base_value"))); + tooltip.add(String.format(capacityString, IHaveGoggleInformation.format(remainingCapacity), Lang.translate("gui.goggles.at_current_speed"))); + + } + + return true; + } + public float getNetworkStress() { return stress; } diff --git a/src/main/resources/assets/create/lang/en_us.json b/src/main/resources/assets/create/lang/en_us.json index 7a881dd14..d9ca6b452 100644 --- a/src/main/resources/assets/create/lang/en_us.json +++ b/src/main/resources/assets/create/lang/en_us.json @@ -601,6 +601,7 @@ "create.tooltip.stressImpact.low": "Low", "create.tooltip.stressImpact.medium": "Moderate", "create.tooltip.stressImpact.high": "High", + "create.tooltip.stressImpact.overstressed": "Overstressed", "create.tooltip.capacityProvided": "Stress Capacity: %1$s", "create.tooltip.capacityProvided.low": "Small",