diff options
author | Glease <4586901+Glease@users.noreply.github.com> | 2023-11-17 17:33:02 +0800 |
---|---|---|
committer | Martin Robertz <dream-master@gmx.net> | 2023-11-25 16:40:07 +0100 |
commit | b069b284b779c10e94907f15ea92a09d500477ac (patch) | |
tree | e59dbc011f3a2e7799afbb56ab08122e6c9f9c2c /src/main | |
parent | 5d58bb671cf7c69117f2f823fdd60a792497065e (diff) | |
download | GT5-Unofficial-b069b284b779c10e94907f15ea92a09d500477ac.tar.gz GT5-Unofficial-b069b284b779c10e94907f15ea92a09d500477ac.tar.bz2 GT5-Unofficial-b069b284b779c10e94907f15ea92a09d500477ac.zip |
adv assline ui enhancements
Diffstat (limited to 'src/main')
-rw-r--r-- | src/main/java/net/glease/ggfab/mte/MTE_AdvAssLine.java | 68 | ||||
-rw-r--r-- | src/main/java/net/glease/ggfab/mui/ClickableTextWidget.java | 53 | ||||
-rw-r--r-- | src/main/resources/assets/ggfab/lang/en_US.lang | 9 |
3 files changed, 117 insertions, 13 deletions
diff --git a/src/main/java/net/glease/ggfab/mte/MTE_AdvAssLine.java b/src/main/java/net/glease/ggfab/mte/MTE_AdvAssLine.java index 3ed4363176..74d0c034c3 100644 --- a/src/main/java/net/glease/ggfab/mte/MTE_AdvAssLine.java +++ b/src/main/java/net/glease/ggfab/mte/MTE_AdvAssLine.java @@ -30,8 +30,13 @@ import java.util.Set; import java.util.UUID; import java.util.stream.IntStream; +import com.gtnewhorizons.modularui.api.math.Alignment; +import com.gtnewhorizons.modularui.api.widget.Widget; +import gregtech.api.gui.modularui.GT_UITextures; +import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_Input_ME; import net.glease.ggfab.ConfigurationHandler; import net.glease.ggfab.GGConstants; +import net.glease.ggfab.mui.ClickableTextWidget; import net.glease.ggfab.util.OverclockHelper; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayerMP; @@ -44,6 +49,7 @@ import net.minecraft.network.PacketBuffer; import net.minecraft.server.MinecraftServer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.StringUtils; import net.minecraft.world.World; import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.ForgeDirection; @@ -176,6 +182,7 @@ public class MTE_AdvAssLine extends GT_MetaTileEntity_ExtendedPowerMultiBlockBas private final List<GT_MetaTileEntity_Hatch_DataAccess> mDataAccessHatches = new ArrayList<>(); private final ItemStack[] itemInputsCurTick = new ItemStack[16]; private int currentInputLength; + private String lastStopReason = ""; public MTE_AdvAssLine(int aID, String aName, String aNameRegional) { super(aID, aName, aNameRegional); @@ -207,6 +214,8 @@ public class MTE_AdvAssLine extends GT_MetaTileEntity_ExtendedPowerMultiBlockBas } private boolean checkMachine(boolean leftToRight) { + clearHatches(); + if (!checkPiece(STRUCTURE_PIECE_FIRST, 0, 1, 0)) return false; for (int i = 1; i < 16; i++) { if (!checkPiece(STRUCTURE_PIECE_LATER, leftToRight ? -i : i, 1, 0)) return false; if (!mOutputBusses.isEmpty()) @@ -345,6 +354,7 @@ public class MTE_AdvAssLine extends GT_MetaTileEntity_ExtendedPowerMultiBlockBas @Override public void saveNBTData(NBTTagCompound aNBT) { super.saveNBTData(aNBT); + aNBT.setString("lastStop", lastStopReason); // we need to check for active here. // if machine was turned off via soft mallet it will not call checkRecipe() on recipe end // in that case we don't have a current recipe, so this should be ignored @@ -364,6 +374,7 @@ public class MTE_AdvAssLine extends GT_MetaTileEntity_ExtendedPowerMultiBlockBas @Override public void loadNBTData(NBTTagCompound aNBT) { super.loadNBTData(aNBT); + lastStopReason = aNBT.getString("lastStop"); ItemStack loadedStack = null; GT_Recipe.GT_Recipe_AssemblyLine recipe = null; if (aNBT.hasKey(TAG_KEY_PROGRESS_TIMES, Constants.NBT.TAG_INT_ARRAY)) { @@ -389,7 +400,7 @@ public class MTE_AdvAssLine extends GT_MetaTileEntity_ExtendedPowerMultiBlockBas inputEUt = aNBT.getLong("inputEU"); baseEUt = aNBT.getLong("baseEU"); if (inputVoltage <= 0 || inputEUt <= 0 || baseEUt >= 0) { - criticalStopMachine(); + criticalStopMachine("ggfab.gui.advassline.shutdown.load.energy"); loadedStack = null; recipe = null; } @@ -399,7 +410,7 @@ public class MTE_AdvAssLine extends GT_MetaTileEntity_ExtendedPowerMultiBlockBas // TODO finish the last recipe instead of aborting default: // recipe is gone. to prevent issues, abort the current recipe - criticalStopMachine(); + criticalStopMachine("ggfab.gui.advassline.shutdown.load.recipe"); loadedStack = null; break; } @@ -408,6 +419,22 @@ public class MTE_AdvAssLine extends GT_MetaTileEntity_ExtendedPowerMultiBlockBas else setCurrentRecipe(loadedStack, recipe); } + /** + * roughly the same as {@link #criticalStopMachine()}, but does not attempt to send a halting sound if world is not loaded. + * also supports setting a stop reason + */ + private void criticalStopMachine(String reason) { + int oMaxProgresstime = mMaxProgresstime; + stopMachine(); + // don't do these at all if the machine wasn't working before anyway + if (oMaxProgresstime > 0) { + if (getBaseMetaTileEntity().getWorld() != null) + sendSound(INTERRUPT_SOUND_INDEX); + getBaseMetaTileEntity().setShutdownStatus(true); + lastStopReason = reason; + } + } + @Override public IStructureDefinition<MTE_AdvAssLine> getStructureDefinition() { return STRUCTURE_DEFINITION; @@ -429,7 +456,7 @@ public class MTE_AdvAssLine extends GT_MetaTileEntity_ExtendedPowerMultiBlockBas mEnergyHatches.forEach(this::recordEnergySupplier); mExoticEnergyHatches.forEach(this::recordEnergySupplier); if (mMaxProgresstime > 0 && (oV != inputVoltage || oEut != inputEUt)) { - criticalStopMachine(); + criticalStopMachine("ggfab.gui.advassline.shutdown.structure"); } return true; } else { @@ -483,6 +510,18 @@ public class MTE_AdvAssLine extends GT_MetaTileEntity_ExtendedPowerMultiBlockBas w.updateText(); } })); + screenElements.widget(new TextWidget(Text.localised("ggfab.gui.advassline.shutdown")).setEnabled(this::hasAbnormalStopReason)); + screenElements.widget( + TextWidget.dynamicText(() -> Text.localised(lastStopReason)) + .setSynced(false) + .attachSyncer(new FakeSyncWidget.StringSyncer(() -> lastStopReason, + r -> this.lastStopReason = r), screenElements) + .setEnabled(this::hasAbnormalStopReason)); + screenElements.widget(new ClickableTextWidget(Text.localised("ggfab.gui.advassline.shutdown_clear").alignment(Alignment.CenterLeft)).setMarginInLines(0).setOnClick((d, w) -> lastStopReason = "").setSize(36, 20).setEnabled(this::hasAbnormalStopReason)); + } + + private Boolean hasAbnormalStopReason(Widget w) { + return !StringUtils.isNullOrEmpty(lastStopReason); } @Override @@ -494,7 +533,7 @@ public class MTE_AdvAssLine extends GT_MetaTileEntity_ExtendedPowerMultiBlockBas @Override public boolean onRunningTick(ItemStack aStack) { if (currentRecipe == null) { - criticalStopMachine(); + criticalStopMachine("ggfab.gui.advassline.shutdown.recipe_null"); return false; } for (GT_MetaTileEntity_Hatch_DataAccess hatch_dataAccess : mDataAccessHatches) { @@ -502,7 +541,7 @@ public class MTE_AdvAssLine extends GT_MetaTileEntity_ExtendedPowerMultiBlockBas } if (mInputBusses.size() < currentInputLength) { - criticalStopMachine(); + criticalStopMachine("ggfab.gui.advassline.shutdown.input_busses"); return false; } boolean oStuck = stuck; @@ -534,7 +573,7 @@ public class MTE_AdvAssLine extends GT_MetaTileEntity_ExtendedPowerMultiBlockBas lEUt = Long.MIN_VALUE; for (int i = 0; i < working; i++) { if (!drainEnergyInput(-baseEUt)) { - criticalStopMachine(); + criticalStopMachine("ggfab.gui.advassline.shutdown.energy"); return false; } } @@ -627,8 +666,15 @@ public class MTE_AdvAssLine extends GT_MetaTileEntity_ExtendedPowerMultiBlockBas if (!tInputHatch.isValid()) { return false; } - FluidStack drained = tInputHatch.drain(ForgeDirection.UNKNOWN, tRecipe.mFluidInputs[i], false); - if (drained == null || drained.amount < tRecipe.mFluidInputs[i].amount) { + FluidStack tFluidRequired = tRecipe.mFluidInputs[i]; + FluidStack drained; + if (tInputHatch instanceof GT_MetaTileEntity_Hatch_Input_ME) { + GT_MetaTileEntity_Hatch_Input_ME me = (GT_MetaTileEntity_Hatch_Input_ME) tInputHatch; + drained = me.getMatchingFluidStack(tFluidRequired); + } else { + drained = tInputHatch.drain(ForgeDirection.UNKNOWN, tFluidRequired, false); + } + if (drained == null || drained.amount < tFluidRequired.amount) { return false; } if (GT_Values.D1) { @@ -873,11 +919,7 @@ public class MTE_AdvAssLine extends GT_MetaTileEntity_ExtendedPowerMultiBlockBas private SliceStatusWidget(Slice slice) { this.slice = slice; updateText(); - } - - @Override - public boolean isEnabled() { - return super.isEnabled() && slice.progress <= 0 && currentInputLength > slice.id; + setEnabled(w -> slice.progress == 0 && currentInputLength > slice.id); } @Override diff --git a/src/main/java/net/glease/ggfab/mui/ClickableTextWidget.java b/src/main/java/net/glease/ggfab/mui/ClickableTextWidget.java new file mode 100644 index 0000000000..bfe39c525c --- /dev/null +++ b/src/main/java/net/glease/ggfab/mui/ClickableTextWidget.java @@ -0,0 +1,53 @@ +package net.glease.ggfab.mui; + +import java.util.Arrays; + +import com.gtnewhorizons.modularui.api.drawable.IDrawable; +import com.gtnewhorizons.modularui.api.drawable.Text; +import com.gtnewhorizons.modularui.api.drawable.TextRenderer; +import com.gtnewhorizons.modularui.api.math.Size; +import com.gtnewhorizons.modularui.api.widget.Widget; +import com.gtnewhorizons.modularui.common.widget.ButtonWidget; +import org.jetbrains.annotations.NotNull; + +public class ClickableTextWidget extends ButtonWidget { + + private Text caption; + private int maxLines = 1; + private int marginInLines = 1; + + public ClickableTextWidget(Text caption) { + super(); + this.caption = caption; + super.setBackground(caption); + } + + public ClickableTextWidget setText(Text caption) { + this.caption = caption; + return this; + } + + public ClickableTextWidget setMaxLines(int maxLines) { + this.maxLines = maxLines; + return this; + } + + public ClickableTextWidget setMarginInLines(int margin) { + this.marginInLines = margin; + return this; + } + + @Override + public Widget setBackground(IDrawable... drawables) { + IDrawable[] all = Arrays.copyOf(drawables, drawables.length + 1); + all[drawables.length] = caption; + return super.setBackground(all); + } + + @Override + protected @NotNull Size determineSize(int maxWidth, int maxHeight) { + if (caption == null) + return super.determineSize(maxWidth, maxHeight); + return new Size(Math.min(maxWidth, TextRenderer.getFontRenderer().getStringWidth(caption.getFormatted())), (maxLines + marginInLines) * TextRenderer.getFontRenderer().FONT_HEIGHT); + } +} diff --git a/src/main/resources/assets/ggfab/lang/en_US.lang b/src/main/resources/assets/ggfab/lang/en_US.lang index 4de8e8a2f5..2606a71e26 100644 --- a/src/main/resources/assets/ggfab/lang/en_US.lang +++ b/src/main/resources/assets/ggfab/lang/en_US.lang @@ -14,6 +14,15 @@ ggfab.waila.advassline.slice.stuck=Slice #%s: §4STUCK ggfab.gui.advassline.slice.idle=Slice #%s: Idle ggfab.gui.advassline.slice.stuck=Slice #%s: §4STUCK ggfab.gui.advassline.slice.unknown=Slice #%s: ? +ggfab.gui.advassline.shutdown=§4Last abnormal shutdown reason: +ggfab.gui.advassline.shutdown_clear=§6Clear +ggfab.gui.advassline.shutdown.input_busses=§4Too few input busses to support current recipe +ggfab.gui.advassline.shutdown.recipe_null=§4Recipe is null (report to author) +ggfab.gui.advassline.shutdown.fluid_null=§4Fluid drained failed (check your ME fluid storage) +ggfab.gui.advassline.shutdown.structure=§4Incompatible structural change +ggfab.gui.advassline.shutdown.energy=§4Insufficient power +ggfab.gui.advassline.shutdown.load.energy=§4Loaded invalid electric stat +ggfab.gui.advassline.shutdown.load.recipe=§4Incompatible recipe change ggfab.info.linked_input_bus.not_owned=§6The settings were copied from a different owner! ggfab.info.linked_input_bus.no_data=§6Configuration data not found! |