refactor to the goggle overlay system

added interface IHaveGoggleInformation to be implemented by TileEntities that want to display stuff on screen
This commit is contained in:
Zelophed 2020-03-23 01:13:37 +01:00
parent cbc5eaebf9
commit 1dd68bf427
12 changed files with 315 additions and 286 deletions

View file

@ -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 + ")";

View file

@ -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<String> 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();
}
}

View file

@ -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);

View file

@ -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<String> 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;
}

View file

@ -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<String> 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();
}
}

View file

@ -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<String> tooltip, boolean isPlayerSneaking){
return false;
}
static String format(double d) {
return decimalFormat.format(d);
}
}

View file

@ -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<String> tooltip, boolean isPlayerSneaking) {
tooltip.add(spacing + Lang.translate("tooltip.analogStrength", this.state));
return true;
}
public int getState() {
return state;
}

View file

@ -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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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);
}
}

View file

@ -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<String> tooltip, boolean isPlayerSneaking) {
tooltip.add(spacing + Lang.translate("gui.gauge.info_header"));
return true;
}
}

View file

@ -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<String> 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;
}
}

View file

@ -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<String> 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;
}

View file

@ -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",