From d3dc81cbf6a0def9a1094ac92a55ff0c5c150081 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 4 Oct 2024 15:38:49 -0400 Subject: [PATCH] Display the maximum input and output rates, and average I/O in ATs. (#2595) --- .../MetaTileEntityActiveTransformer.java | 59 ++++++++++++++-- .../integration/hwyla/HWYLAModule.java | 1 + .../ActiveTransformerDataProvider.java | 70 +++++++++++++++++++ .../theoneprobe/TheOneProbeModule.java | 1 + .../ActiveTransformerInfoProvider.java | 53 ++++++++++++++ .../resources/assets/gregtech/lang/en_us.lang | 4 ++ 6 files changed, 183 insertions(+), 5 deletions(-) create mode 100644 src/main/java/gregtech/integration/hwyla/provider/ActiveTransformerDataProvider.java create mode 100644 src/main/java/gregtech/integration/theoneprobe/provider/ActiveTransformerInfoProvider.java diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java index 059ec0264a7..d22e681fad3 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java @@ -15,6 +15,8 @@ import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; import gregtech.api.pattern.TraceabilityPredicate; +import gregtech.api.util.TextComponentUtil; +import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; import gregtech.client.utils.TooltipHelper; @@ -30,6 +32,7 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fml.relauncher.Side; @@ -50,6 +53,8 @@ public class MetaTileEntityActiveTransformer extends MultiblockWithDisplayBase i private IEnergyContainer powerOutput; private IEnergyContainer powerInput; private boolean isActive = false; + private long averageIOLastSec; + private long netIOLastSec; public MetaTileEntityActiveTransformer(ResourceLocation metaTileEntityId) { super(metaTileEntityId); @@ -64,10 +69,18 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) { @Override protected void updateFormedValid() { - if (isWorkingEnabled()) { - long canDrain = powerInput.getEnergyStored(); - long totalDrained = powerOutput.changeEnergy(canDrain); - powerInput.removeEnergy(totalDrained); + if (!getWorld().isRemote) { + if ((getOffsetTimer() % 20) == 0) { + averageIOLastSec = netIOLastSec / 20; + netIOLastSec = 0; + } + + if (isWorkingEnabled()) { + long canDrain = powerInput.getEnergyStored(); + long totalDrained = powerOutput.changeEnergy(canDrain); + powerInput.removeEnergy(totalDrained); + netIOLastSec += totalDrained; + } } } @@ -159,7 +172,39 @@ protected void addDisplayText(List textList) { "gregtech.multiblock.idling", "gregtech.multiblock.idling", "gregtech.machine.active_transformer.routing") - .addWorkingStatusLine(); + .addWorkingStatusLine() + .addCustom(tl -> { + if (isStructureFormed()) { + // Max input line + ITextComponent maxInputFormatted = TextComponentUtil.stringWithColor( + TextFormatting.WHITE, + TextFormattingUtil.formatNumbers( + powerInput.getInputVoltage() * powerInput.getInputAmperage()) + " EU/t"); + tl.add(TextComponentUtil.translationWithColor( + TextFormatting.GREEN, + "gregtech.multiblock.active_transformer.max_in", + maxInputFormatted)); + + // Max output line + ITextComponent maxOutputFormatted = TextComponentUtil.stringWithColor( + TextFormatting.WHITE, + TextFormattingUtil.formatNumbers( + powerOutput.getOutputVoltage() * powerOutput.getOutputAmperage()) + " EU/t"); + tl.add(TextComponentUtil.translationWithColor( + TextFormatting.RED, + "gregtech.multiblock.active_transformer.max_out", + maxOutputFormatted)); + + // Average I/O line + ITextComponent avgInputFormatted = TextComponentUtil.stringWithColor( + TextFormatting.WHITE, + TextFormattingUtil.formatNumbers(averageIOLastSec) + " EU/t"); + tl.add(TextComponentUtil.translationWithColor( + TextFormatting.AQUA, + "gregtech.multiblock.active_transformer.average_io", + avgInputFormatted)); + } + }); } @Override @@ -255,4 +300,8 @@ public void addInformation(ItemStack stack, @Nullable World world, @NotNull List tooltip.add(I18n.format("gregtech.machine.active_transformer.tooltip3") + TooltipHelper.RAINBOW_SLOW + I18n.format("gregtech.machine.active_transformer.tooltip3.5")); } + + public long getAverageIOLastSec() { + return this.averageIOLastSec; + } } diff --git a/src/main/java/gregtech/integration/hwyla/HWYLAModule.java b/src/main/java/gregtech/integration/hwyla/HWYLAModule.java index d26defcbde3..6b0a71618fa 100644 --- a/src/main/java/gregtech/integration/hwyla/HWYLAModule.java +++ b/src/main/java/gregtech/integration/hwyla/HWYLAModule.java @@ -40,6 +40,7 @@ public void register(IWailaRegistrar registrar) { // one day, if cover provider is ported to waila, register it right here BlockOreDataProvider.INSTANCE.register(registrar); LampDataProvider.INSTANCE.register(registrar); + ActiveTransformerDataProvider.INSTANCE.register(registrar); } /** Render an ItemStack. */ diff --git a/src/main/java/gregtech/integration/hwyla/provider/ActiveTransformerDataProvider.java b/src/main/java/gregtech/integration/hwyla/provider/ActiveTransformerDataProvider.java new file mode 100644 index 00000000000..d1b20e6ddfd --- /dev/null +++ b/src/main/java/gregtech/integration/hwyla/provider/ActiveTransformerDataProvider.java @@ -0,0 +1,70 @@ +package gregtech.integration.hwyla.provider; + +import gregtech.api.GTValues; +import gregtech.api.capability.GregtechCapabilities; +import gregtech.api.capability.IMultiblockController; +import gregtech.api.util.TextFormattingUtil; +import gregtech.common.metatileentities.multi.electric.MetaTileEntityActiveTransformer; + +import net.minecraft.client.resources.I18n; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.capabilities.Capability; + +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; +import mcp.mobius.waila.api.IWailaRegistrar; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class ActiveTransformerDataProvider extends CapabilityDataProvider { + + public static final ActiveTransformerDataProvider INSTANCE = new ActiveTransformerDataProvider(); + + @Override + public void register(@NotNull IWailaRegistrar registrar) { + registrar.registerBodyProvider(this, TileEntity.class); + registrar.registerNBTProvider(this, TileEntity.class); + registrar.addConfig(GTValues.MOD_NAME, "gregtech.multiblock.activetransformer"); + } + + @Override + protected @NotNull Capability getCapability() { + return GregtechCapabilities.CAPABILITY_MULTIBLOCK_CONTROLLER; + } + + @Override + protected NBTTagCompound getNBTData(IMultiblockController capability, NBTTagCompound tag) { + if (capability instanceof MetaTileEntityActiveTransformer activeTransformer) { + if (activeTransformer.isStructureFormed() && activeTransformer.isActive()) { + NBTTagCompound subTag = new NBTTagCompound(); + + subTag.setLong("AverageIO", activeTransformer.getAverageIOLastSec()); + + tag.setTag("gregtech.IMultiblockController.ActiveTransformer", subTag); + } + } + return tag; + } + + @Override + @NotNull + public List getWailaBody(ItemStack itemStack, List tooltip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + if (!config.getConfig("gregtech.multiblock") || accessor.getTileEntity() == null) { + return tooltip; + } + + if (accessor.getNBTData().hasKey("gregtech.IMultiblockController.ActiveTransformer")) { + NBTTagCompound tag = accessor.getNBTData() + .getCompoundTag("gregtech.IMultiblockController.ActiveTransformer"); + + tooltip.add(I18n.format("gregtech.waila.active_transformer.average_io", + TextFormattingUtil.formatNumbers(tag.getLong("AverageIO")))); + } + + return tooltip; + } +} diff --git a/src/main/java/gregtech/integration/theoneprobe/TheOneProbeModule.java b/src/main/java/gregtech/integration/theoneprobe/TheOneProbeModule.java index 8b64c066cc9..879e7221002 100644 --- a/src/main/java/gregtech/integration/theoneprobe/TheOneProbeModule.java +++ b/src/main/java/gregtech/integration/theoneprobe/TheOneProbeModule.java @@ -43,6 +43,7 @@ public void init(FMLInitializationEvent event) { oneProbe.registerProvider(new LampInfoProvider()); oneProbe.registerProvider(new LDPipeProvider()); oneProbe.registerProvider(new LaserContainerInfoProvider()); + oneProbe.registerProvider(new ActiveTransformerInfoProvider()); // Dev environment debug providers oneProbe.registerProvider(new DebugPipeNetInfoProvider()); diff --git a/src/main/java/gregtech/integration/theoneprobe/provider/ActiveTransformerInfoProvider.java b/src/main/java/gregtech/integration/theoneprobe/provider/ActiveTransformerInfoProvider.java new file mode 100644 index 00000000000..a96607dc2e1 --- /dev/null +++ b/src/main/java/gregtech/integration/theoneprobe/provider/ActiveTransformerInfoProvider.java @@ -0,0 +1,53 @@ +package gregtech.integration.theoneprobe.provider; + +import gregtech.api.GTValues; +import gregtech.api.capability.GregtechCapabilities; +import gregtech.api.capability.IMultiblockController; +import gregtech.api.util.TextComponentUtil; +import gregtech.api.util.TextFormattingUtil; +import gregtech.common.metatileentities.multi.electric.MetaTileEntityActiveTransformer; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.common.capabilities.Capability; + +import mcjty.theoneprobe.api.IProbeHitData; +import mcjty.theoneprobe.api.IProbeInfo; +import mcjty.theoneprobe.api.NumberFormat; +import mcjty.theoneprobe.apiimpl.elements.ElementProgress; +import org.jetbrains.annotations.NotNull; + +public class ActiveTransformerInfoProvider extends CapabilityInfoProvider { + + @Override + public String getID() { + return GTValues.MODID + ":active_transformer_info_provider"; + } + + @Override + protected boolean allowDisplaying(@NotNull IMultiblockController capability) { + return capability instanceof MetaTileEntityActiveTransformer activeTransformer && activeTransformer.isActive(); + } + + @Override + protected @NotNull Capability getCapability() { + return GregtechCapabilities.CAPABILITY_MULTIBLOCK_CONTROLLER; + } + + @Override + protected void addProbeInfo(IMultiblockController capability, IProbeInfo probeInfo, EntityPlayer player, + TileEntity tileEntity, IProbeHitData data) { + long averageIO = ((MetaTileEntityActiveTransformer) capability).getAverageIOLastSec(); + ITextComponent text = TextComponentUtil.translationWithColor( + TextFormatting.AQUA, + "gregtech.multiblock.active_transformer.average_io", + TextComponentUtil.stringWithColor(TextFormatting.WHITE, + player.isSneaking() || averageIO < 10_000 ? + TextFormattingUtil.formatNumbers(averageIO) + " EU/t" : + ElementProgress.format(averageIO, NumberFormat.COMPACT, "EU/t"))); + + probeInfo.text(text.getFormattedText()); + } +} diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index e9fc2678ba0..04bc3d45717 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -124,6 +124,7 @@ gregtech.waila.progress_idle=Idle gregtech.waila.progress_tick=Progress: %d t / %d t gregtech.waila.progress_sec=Progress: %d s / %d s gregtech.waila.progress_computation=Computation: %s / %s +gregtech.waila.active_transformer.average_io=Average I/O: %s EU/t gregtech.multiblock.title=Multiblock Pattern gregtech.multiblock.primitive_blast_furnace.bronze.description=The Primitive Blast Furnace (PBF) is a multiblock structure used for cooking steel in the early game. Although not very fast, it will provide you with steel for your first setups. @@ -4890,6 +4891,9 @@ gregtech.machine.active_transformer.tooltip3=Can transmit power at incredible di gregtech.machine.active_transformer.tooltip3.5= LasersĀ§7. gregtech.multiblock.active_transformer.description=The Active Transformer is a multiblock structure that can accept any number or tier of Energy Hatches, and transform them into any number or tier of Dynamo Hatches. They can be chained with Laser Source and Target Hatches, allowing long distance power transportation without any losses. Lasers must be in a straight line, otherwise they will not send energy. gregtech.machine.active_transformer.routing=Routing. +gregtech.multiblock.active_transformer.max_in=Max Input: %s +gregtech.multiblock.active_transformer.max_out=Max Output: %s +gregtech.multiblock.active_transformer.average_io=Average I/O: %s gregtech.machine.research_station.name=Research Station gregtech.machine.research_station.tooltip.1=More than just a Multiblock Scanner