diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/CoilWorkableElectricMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/CoilWorkableElectricMultiblockMachine.java index a4ea83d5a11..2206a2d182d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/CoilWorkableElectricMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/CoilWorkableElectricMultiblockMachine.java @@ -2,12 +2,29 @@ import com.gregtechceu.gtceu.api.block.ICoilType; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.mui.base.drawable.IDrawable; +import com.gregtechceu.gtceu.api.mui.drawable.*; +import com.gregtechceu.gtceu.api.mui.factory.PosGuiData; +import com.gregtechceu.gtceu.api.mui.value.sync.IntSyncValue; +import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; +import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; +import com.gregtechceu.gtceu.api.mui.widgets.SlotGroupWidget; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Column; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Row; +import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; +import com.gregtechceu.gtceu.client.mui.screen.UISettings; import com.gregtechceu.gtceu.common.block.CoilBlock; +import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; +import com.gregtechceu.gtceu.common.data.mui.GTMultiblockPanelUtil; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; +import com.gregtechceu.gtceu.common.mui.GTGuis; import net.minecraft.MethodsReturnNonnullByDefault; import lombok.Getter; +import java.util.function.Supplier; + import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @@ -36,4 +53,47 @@ public void onStructureFormed() { public int getCoilTier() { return coilType.getTier(); } + + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + var panel = GTGuis.createPanel(this, 176 + 32, 164 + 36); + + var panelUtil = new GTMultiblockPanelUtil(this); + + IntSyncValue coilTier = syncManager.getOrCreateSyncHandler("coilTier", IntSyncValue.class, + () -> new IntSyncValue(this::getCoilTier)); + + Supplier coilTexture = () -> new UITexture.Builder() + .location(CoilBlock.CoilType.values()[coilTier.getIntValue()].getTexture()) + .imageSize(16, 16).colorType(ColorType.DEFAULT).tiled().build(); + + var widget1 = new DynamicDrawable(coilTexture).asWidget().size(4, 16).heightRel(1.0f); + var widget2 = new DynamicDrawable(coilTexture).asWidget().size(4, 16).heightRel(1.0f); + + panel.child(GTMuiWidgets.createTitleBar(this.getDefinition(), 176 + 36)) + .child(new ParentWidget<>() + .widthRel(0.95f) + .heightRel(.45f) + .margin(4, 0) + .left(3).top(3) + .child(new Row() + .child(widget1) + .child(panelUtil.getMainTextPanel(syncManager, 208, 90)) + .child(widget2)) + + ) + .child(new Column() + .coverChildren() + .leftRel(1.0f) + .reverseLayout(true) + .bottom(16) + .padding(0, 8, 4, 4) + .childPadding(2) + .background(GTGuiTextures.BACKGROUND.getSubArea(0.25f, 0f, 1.0f, 1.0f)) + .child(GTMuiWidgets.createPowerButton(this, syncManager)) + .child(GTMuiWidgets.createVoidingButton(this, syncManager))) + .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)); + + return panel; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java index 283e37d8c62..ba5850fa37d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java @@ -3,46 +3,46 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IEnergyContainer; -import com.gregtechceu.gtceu.api.capability.IParallelHatch; import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; -import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.fancy.*; -import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; +import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; import com.gregtechceu.gtceu.api.machine.feature.IOverclockMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; -import com.gregtechceu.gtceu.api.machine.feature.IVoidable; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; -import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifierList; +import com.gregtechceu.gtceu.api.mui.factory.PosGuiData; +import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; +import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; +import com.gregtechceu.gtceu.api.mui.widgets.SlotGroupWidget; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Column; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Row; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; -import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; +import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; +import com.gregtechceu.gtceu.client.mui.screen.UISettings; +import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; +import com.gregtechceu.gtceu.common.data.mui.GTMultiblockPanelUtil; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; +import com.gregtechceu.gtceu.common.mui.GTGuis; import com.gregtechceu.gtceu.utils.GTUtil; -import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.widget.*; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.network.chat.Component; -import net.minecraft.world.entity.player.Player; import lombok.Getter; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import java.util.Objects; import java.util.function.Function; import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class WorkableElectricMultiblockMachine extends WorkableMultiblockMachine implements IFancyUIMachine, - IDisplayUIMachine, ITieredMachine, IOverclockMachine { +public class WorkableElectricMultiblockMachine extends WorkableMultiblockMachine + implements IMuiMachine, ITieredMachine, IOverclockMachine { // runtime protected EnergyContainerList energyContainer; @@ -93,92 +93,120 @@ public void setBatchEnabled(boolean batch) { ////////////////////////////////////// // ********** GUI ***********// ////////////////////////////////////// - @Override - public void addDisplayText(List textList) { - int numParallels; - int subtickParallels; - int batchParallels; - int totalRuns; - boolean exact = false; - if (recipeLogic.isActive() && recipeLogic.getLastRecipe() != null) { - numParallels = recipeLogic.getLastRecipe().parallels; - subtickParallels = recipeLogic.getLastRecipe().subtickParallels; - batchParallels = recipeLogic.getLastRecipe().batchParallels; - totalRuns = recipeLogic.getLastRecipe().getTotalRuns(); - exact = true; - } else { - numParallels = getParallelHatch() - .map(IParallelHatch::getCurrentParallel) - .orElse(0); - subtickParallels = 0; - batchParallels = 0; - totalRuns = 0; - } - - MultiblockDisplayText.builder(textList, isFormed()) - .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) - .addEnergyUsageLine(energyContainer) - .addEnergyTierLine(tier) - .addMachineModeLine(getRecipeType(), getRecipeTypes().length > 1) - .addTotalRunsLine(totalRuns) - .addParallelsLine(numParallels, exact) - .addSubtickParallelsLine(subtickParallels) - .addBatchModeLine(isBatchEnabled(), batchParallels) - .addWorkingStatusLine() - .addProgressLine(recipeLogic) - .addOutputLines(recipeLogic.getLastRecipe()); - getDefinition().getAdditionalDisplay().accept(this, textList); - IDisplayUIMachine.super.addDisplayText(textList); + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + var panel = GTGuis.createPanel(this, 176, 164); + + var panelUtil = new GTMultiblockPanelUtil(this); + + panel.child(GTMuiWidgets.createTitleBar(this.getDefinition(), 176)) + .child(new ParentWidget<>() + .widthRel(0.95f) + .heightRel(.45f) + .margin(4, 0) + .left(3).top(5) + .child(new Row() + .child(panelUtil.getMainTextPanel(syncManager, 170, 70)))) + .child(new Column() + .coverChildren() + .leftRel(1.0f) + .reverseLayout(true) + .bottom(16) + .padding(0, 8, 4, 4) + .childPadding(2) + .background(GTGuiTextures.BACKGROUND.getSubArea(0.25f, 0f, 1.0f, 1.0f)) + .child(GTMuiWidgets.createPowerButton(this, syncManager)) + .child(GTMuiWidgets.createVoidingButton(this, syncManager))) + .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)); + + return panel; } - @Override - public Widget createUIWidget() { - var group = new WidgetGroup(0, 0, 182 + 8, 117 + 8); - group.addWidget(new DraggableScrollableWidgetGroup(4, 4, 182, 117).setBackground(getScreenTexture()) - .addWidget(new LabelWidget(4, 5, self().getBlockState().getBlock().getDescriptionId())) - .addWidget(new ComponentPanelWidget(4, 17, this::addDisplayText) - .textSupplier(this.getLevel().isClientSide ? null : this::addDisplayText) - .setMaxWidthLimit(200) - .clickHandler(this::handleDisplayClick))); - group.setBackground(GuiTextures.BACKGROUND_INVERSE); - return group; - } - - @Override - public ModularUI createUI(Player entityPlayer) { - return new ModularUI(198, 208, this, entityPlayer).widget(new FancyMachineUIWidget(this, 198, 208)); - } - - @Override - public List getSubTabs() { - return getParts().stream().filter(Objects::nonNull).map(IFancyUIProvider.class::cast).toList(); - } - - @Override - public void attachConfigurators(ConfiguratorPanel configuratorPanel) { - IVoidable.attachConfigurators(configuratorPanel, this); - if (getDefinition().getRecipeModifier() instanceof RecipeModifierList list && Arrays.stream(list.getModifiers()) - .anyMatch(modifier -> modifier == GTRecipeModifiers.BATCH_MODE)) { - configuratorPanel.attachConfigurators(new IFancyConfiguratorButton.Toggle( - GuiTextures.BUTTON_BATCH.getSubTexture(0, 0, 1, 0.5), - GuiTextures.BUTTON_BATCH.getSubTexture(0, 0.5, 1, 0.5), - this::isBatchEnabled, - (cd, p) -> setBatchEnabled(p)) - .setTooltipsSupplier( - p -> List.of( - Component.translatable("gtceu.machine.batch_" + (p ? "enabled" : "disabled"))))); - } - - IFancyUIMachine.super.attachConfigurators(configuratorPanel); - } - - @Override - public void attachTooltips(TooltipsPanel tooltipsPanel) { - for (IMultiPart part : getParts()) { - part.attachFancyTooltipsToController(this, tooltipsPanel); - } - } + // @Override + // public void addDisplayText(List textList) { + // int numParallels; + // int subtickParallels; + // int batchParallels; + // int totalRuns; + // boolean exact = false; + // if (recipeLogic.isActive() && recipeLogic.getLastRecipe() != null) { + // numParallels = recipeLogic.getLastRecipe().parallels; + // subtickParallels = recipeLogic.getLastRecipe().subtickParallels; + // batchParallels = recipeLogic.getLastRecipe().batchParallels; + // totalRuns = recipeLogic.getLastRecipe().getTotalRuns(); + // exact = true; + // } else { + // numParallels = getParallelHatch() + // .map(IParallelHatch::getCurrentParallel) + // .orElse(0); + // subtickParallels = 0; + // batchParallels = 0; + // totalRuns = 0; + // } + // + // MultiblockDisplayText.builder(textList, isFormed()) + // .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) + // .addEnergyUsageLine(energyContainer) + // .addEnergyTierLine(tier) + // .addMachineModeLine(getRecipeType(), getRecipeTypes().length > 1) + // .addTotalRunsLine(totalRuns) + // .addParallelsLine(numParallels, exact) + // .addSubtickParallelsLine(subtickParallels) + // .addBatchModeLine(isBatchEnabled(), batchParallels) + // .addWorkingStatusLine() + // .addProgressLine(recipeLogic.getProgress(), recipeLogic.getMaxProgress(), + // recipeLogic.getProgressPercent()) + // .addOutputLines(recipeLogic.getLastRecipe()); + // getDefinition().getAdditionalDisplay().accept(this, textList); + // IDisplayUIMachine.super.addDisplayText(textList); + // } + + // @Override + // public Widget createUIWidget() { + // var group = new WidgetGroup(0, 0, 182 + 8, 117 + 8); + // group.addWidget(new DraggableScrollableWidgetGroup(4, 4, 182, 117).setBackground(getScreenTexture()) + // .addWidget(new LabelWidget(4, 5, self().getBlockState().getBlock().getDescriptionId())) + // .addWidget(new ComponentPanelWidget(4, 17, this::addDisplayText) + // .textSupplier(this.getLevel().isClientSide ? null : this::addDisplayText) + // .setMaxWidthLimit(200) + // .clickHandler(this::handleDisplayClick))); + // group.setBackground(GuiTextures.BACKGROUND_INVERSE); + // return group; + // } + // + // @Override + // public ModularUI createUI(Player entityPlayer) { + // return new ModularUI(198, 208, this, entityPlayer).widget(new FancyMachineUIWidget(this, 198, 208)); + // } + // + // @Override + // public List getSubTabs() { + // return getParts().stream().filter(Objects::nonNull).map(IFancyUIProvider.class::cast).toList(); + // } + // + // @Override + // public void attachConfigurators(ConfiguratorPanel configuratorPanel) { + // if (getDefinition().getRecipeModifier() instanceof RecipeModifierList list && Arrays.stream(list.getModifiers()) + // .anyMatch(modifier -> modifier == GTRecipeModifiers.BATCH_MODE)) { + // configuratorPanel.attachConfigurators(new IFancyConfiguratorButton.Toggle( + // GuiTextures.BUTTON_BATCH.getSubTexture(0, 0, 1, 0.5), + // GuiTextures.BUTTON_BATCH.getSubTexture(0, 0.5, 1, 0.5), + // this::isBatchEnabled, + // (cd, p) -> setBatchEnabled(p)) + // .setTooltipsSupplier( + // p -> List.of( + // Component.translatable("gtceu.machine.batch_" + (p ? "enabled" : "disabled"))))); + // } + // + // IFancyUIMachine.super.attachConfigurators(configuratorPanel); + // } + // + // @Override + // public void attachTooltips(TooltipsPanel tooltipsPanel) { + // for (IMultiPart part : getParts()) { + // part.attachFancyTooltipsToController(this, tooltipsPanel); + // } + // } ////////////////////////////////////// // ******** OVERCLOCK *********// diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java index fcb798019c6..487b9bd79ef 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java @@ -91,6 +91,7 @@ public enum Status implements StringRepresentable { @Nullable @SaveField @SyncToClient + @Getter private Component waitingReason = null; /** * unsafe, it may not be found from {@link RecipeManager}. Do not index it. diff --git a/src/main/java/com/gregtechceu/gtceu/client/mui/screen/ClientScreenHandler.java b/src/main/java/com/gregtechceu/gtceu/client/mui/screen/ClientScreenHandler.java index ea7aeb1c649..bd887e74de1 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/mui/screen/ClientScreenHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/client/mui/screen/ClientScreenHandler.java @@ -558,10 +558,10 @@ public static void drawDebugScreen(GuiGraphics graphics, @Nullable ModularScreen float scale = ConfigHolder.INSTANCE.dev.mui.scale; int shift = (int) (11 * scale + 0.5f); int lineY = screenH - shift - 2; - if (GTCEu.Mods.isJEILoaded() || GTCEu.Mods.isEMILoaded() || GTCEu.Mods.isREILoaded()) lineY -= 12; + if (GTCEu.Mods.isJEILoaded() || GTCEu.Mods.isEMILoaded() || GTCEu.Mods.isREILoaded()) lineY -= 20; GuiDraw.drawText(graphics, "Mouse Pos: " + mouseX + ", " + mouseY, 5, lineY, scale, outlineColor, true); - lineY -= shift + 2; - GuiDraw.drawText(graphics, "FPS: " + fpsCounter.getFps(), 5, screenH - 23, scale, outlineColor, true); + lineY -= shift; + GuiDraw.drawText(graphics, "FPS: " + fpsCounter.getFps(), 5, lineY, scale, outlineColor, true); lineY -= shift; GuiDraw.drawText(graphics, "Theme ID: " + context.getTheme().getId(), 5, lineY, scale, outlineColor, true); LocatedWidget locatedHovered = muiScreen.getPanelManager().getTopWidgetLocated(true); diff --git a/src/main/java/com/gregtechceu/gtceu/client/mui/screen/ModularScreen.java b/src/main/java/com/gregtechceu/gtceu/client/mui/screen/ModularScreen.java index 878b0e23b17..f25dca88891 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/mui/screen/ModularScreen.java +++ b/src/main/java/com/gregtechceu/gtceu/client/mui/screen/ModularScreen.java @@ -810,9 +810,11 @@ public int getHeight() { @Override public void visitWidgets(@NotNull Consumer consumer) { - for (WidgetWrapper wrapper : panelManager.getReverseOpenPanelsWrappers()) { - consumer.accept(wrapper); - } + /* + * for (WidgetWrapper wrapper : panelManager.getReverseOpenPanelsWrappers()) { + * consumer.accept(wrapper); + * } + */ } private static final Component USAGE_NARRATION = Component.translatable("narrator.screen.usage"); diff --git a/src/main/java/com/gregtechceu/gtceu/client/mui/screen/PanelManager.java b/src/main/java/com/gregtechceu/gtceu/client/mui/screen/PanelManager.java index 7285a8aa87a..2435acf50ed 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/mui/screen/PanelManager.java +++ b/src/main/java/com/gregtechceu/gtceu/client/mui/screen/PanelManager.java @@ -84,10 +84,12 @@ void checkDirty() { this.panelsClone.clear(); this.panelsClone.addAll(this.panels); - this.panelWrappers.clear(); - this.panelsClone.stream() - .map(WidgetWrapper::new) - .forEach(this.panelWrappers::add); + /* + * this.panelWrappers.clear(); + * this.panelsClone.stream() + * .map(WidgetWrapper::new) + * .forEach(this.panelWrappers::add); + */ this.dirty = false; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java index 35eaa52b3b6..3a7ece612c2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java @@ -6,6 +6,7 @@ import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; +import com.gregtechceu.gtceu.api.machine.feature.IVoidable; import com.gregtechceu.gtceu.api.mui.base.IPanelHandler; import com.gregtechceu.gtceu.api.mui.base.drawable.IDrawable; import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; @@ -133,6 +134,12 @@ public static ItemSlot createBatterySlot(IItemHandler itemHandler, int slot, Pan return new ItemSlot().syncHandler("battery").background(GTGuiTextures.SLOT, GTGuiTextures.CHARGER_OVERLAY); } + public static ToggleButton createVoidingButton(IVoidable machine, PanelSyncManager syncManager) { + // TODO pull in voiding mode pr + return new ToggleButton(); + // EnumSyncValue voidMode = new EnumSyncValue(IVoidable.VoidingMode.class, machine.) + } + public static ToggleButton createAutoOutputItemButton(IAutoOutputItem machine, PanelSyncManager syncManager) { BooleanSyncValue itemOutputs = new BooleanSyncValue(machine::isAutoOutputItems, machine::setAutoOutputItems); diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockPanelUtil.java b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockPanelUtil.java new file mode 100644 index 00000000000..5b1599d201e --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockPanelUtil.java @@ -0,0 +1,71 @@ +package com.gregtechceu.gtceu.common.data.mui; + +import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IWorkableMultiController; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.mui.base.widget.IWidget; +import com.gregtechceu.gtceu.api.mui.drawable.Icon; +import com.gregtechceu.gtceu.api.mui.utils.Alignment; +import com.gregtechceu.gtceu.api.mui.value.sync.*; +import com.gregtechceu.gtceu.api.mui.widget.EmptyWidget; +import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; +import com.gregtechceu.gtceu.api.mui.widget.Widget; +import com.gregtechceu.gtceu.api.mui.widgets.DynamicSyncedWidget; +import com.gregtechceu.gtceu.api.mui.widgets.ListWidget; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; + +public class GTMultiblockPanelUtil { + + private MultiblockControllerMachine controller; + + public GTMultiblockPanelUtil(MultiblockControllerMachine controller) { + this.controller = controller; + } + + public Widget getMainTextPanel(PanelSyncManager syncManager, int width, int height) { + boolean isFormed = controller.isFormed(); + + var parentWidget = new ParentWidget<>(); + var listWidget = new ListWidget<>() + .width(width - 6) + .height(height - 6) + .childSeparator(Icon.EMPTY_2PX) + .crossAxisAlignment(Alignment.CrossAxis.START) + .alignX(Alignment.CenterLeft); + parentWidget.size(width, height) + .background(GTGuiTextures.MUI_DISPLAY); + + if (controller instanceof IWorkableMultiController rlMachine) { + listWidget.child(GTMultiblockTextUtil.addProgressLine(rlMachine, syncManager)); + + if (rlMachine instanceof WorkableElectricMultiblockMachine workableElectricMachine) { + listWidget.child(GTMultiblockTextUtil.addEnergyTierLine(workableElectricMachine, syncManager)); + listWidget.child(GTMultiblockTextUtil.addEnergyUsageLine(workableElectricMachine, syncManager)); + } + + listWidget.child(GTMultiblockTextUtil.addParallelLine(rlMachine, syncManager)); + listWidget.child(GTMultiblockTextUtil.addBatchModeLine(rlMachine, syncManager)); + listWidget.child(GTMultiblockTextUtil.addSubtickParallelsLine(rlMachine, syncManager)); + listWidget.child(GTMultiblockTextUtil.addTotalRunsLine(rlMachine, syncManager)); + listWidget.child(GTMultiblockTextUtil.addOutputLines(rlMachine, syncManager)); + } + parentWidget.child(listWidget.left(3).top(3)); + return parentWidget; + } + + public IWidget getRecipeActionWidget() { + if (controller instanceof IRecipeLogicMachine recipeLogicMachine) { + RecipeLogic rl = recipeLogicMachine.getRecipeLogic(); + DynamicSyncedWidget recipeActionResultWidget = new DynamicSyncedWidget<>(); + + if (rl.isWaiting()) { + var reason = rl.getWaitingReason(); + // recipeActionResultWidget. + // recipeActionResultWidget = rl + } + } + return new EmptyWidget(); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockTextUtil.java b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockTextUtil.java new file mode 100644 index 00000000000..061d68cb08e --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockTextUtil.java @@ -0,0 +1,380 @@ +package com.gregtechceu.gtceu.common.data.mui; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IWorkableMultiController; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; +import com.gregtechceu.gtceu.api.mui.drawable.FluidDrawable; +import com.gregtechceu.gtceu.api.mui.drawable.ItemDrawable; +import com.gregtechceu.gtceu.api.mui.utils.Alignment; +import com.gregtechceu.gtceu.api.mui.utils.Color; +import com.gregtechceu.gtceu.api.mui.value.sync.*; +import com.gregtechceu.gtceu.api.mui.widget.Widget; +import com.gregtechceu.gtceu.api.mui.widgets.DynamicSyncedWidget; +import com.gregtechceu.gtceu.api.mui.widgets.TextWidget; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.RecipeHelper; +import com.gregtechceu.gtceu.api.recipe.content.Content; +import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderFluidIngredient; +import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderIngredient; +import com.gregtechceu.gtceu.client.mui.screen.RichTooltip; +import com.gregtechceu.gtceu.utils.FormattingUtil; +import com.gregtechceu.gtceu.utils.GTUtil; +import com.gregtechceu.gtceu.utils.serialization.network.ByteBufAdapters; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.HoverEvent; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +import java.util.Optional; + +public class GTMultiblockTextUtil { + + public static TextWidget addEnergyUsageLine(WorkableElectricMultiblockMachine weMachine, + PanelSyncManager syncManager) { + LongSyncValue energyUsage = syncManager.getOrCreateSyncHandler("energyUsage", LongSyncValue.class, + () -> new LongSyncValue(() -> { + var energyList = weMachine.getEnergyContainer(); + return Math.max(energyList.getInputVoltage(), energyList.getOutputVoltage()); + })); + BooleanSyncValue isFormed = syncManager.getOrCreateSyncHandler("isFormed", BooleanSyncValue.class, + () -> new BooleanSyncValue(weMachine::isFormed)); + BooleanSyncValue isActive = syncManager.getOrCreateSyncHandler("isActive", BooleanSyncValue.class, + () -> new BooleanSyncValue(() -> weMachine.getRecipeLogic().isActive())); + + return IKey.dynamic(() -> { + String energyFormatted = FormattingUtil.formatNumbers(energyUsage.getLongValue()); + + byte voltageTier = GTUtil.getFloorTierByVoltage(energyUsage.getLongValue()); + Component voltageName = Component.literal( + GTValues.VNF[voltageTier]); + + MutableComponent bodyText = Component.translatable("gtceu.multiblock.max_energy_per_tick", + energyFormatted, voltageName).withStyle(ChatFormatting.GRAY); + Component hoverText = Component.translatable("gtceu.multiblock.max_energy_per_tick_hover") + .withStyle(ChatFormatting.GRAY); + return bodyText + .withStyle(style -> style.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, hoverText))); + }) + .color(Color.WHITE.main) + .asWidget() + .setEnabledIf(widget -> isFormed.getBoolValue() && isActive.getBoolValue()); + } + + public static IKey addEnergyTierLine(boolean formed, int tier) { + if (!formed || tier < GTValues.ULV || tier > GTValues.MAX) + return IKey.EMPTY; + + Component voltageName = Component.literal(GTValues.VNF[tier]); + MutableComponent bodyText = Component.translatable( + "gtceu.multiblock.max_recipe_tier", + voltageName).withStyle(ChatFormatting.GRAY); + Component hoverText = Component.translatable("gtceu.multiblock.max_recipe_tier_hover") + .withStyle(ChatFormatting.GRAY); + return IKey.dynamic(() -> bodyText + .withStyle(style -> style.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, hoverText)))); + } + + public static TextWidget addProgressLine(IWorkableMultiController rlMachine, PanelSyncManager syncManager) { + BooleanSyncValue isFormed = syncManager.getOrCreateSyncHandler("isFormed", BooleanSyncValue.class, + () -> new BooleanSyncValue(rlMachine::isFormed)); + + BooleanSyncValue isActive = syncManager.getOrCreateSyncHandler("isActive", BooleanSyncValue.class, + () -> new BooleanSyncValue(() -> rlMachine.getRecipeLogic().isActive())); + IntSyncValue currentProgress = syncManager.getOrCreateSyncHandler("currentProgress", IntSyncValue.class, + () -> new IntSyncValue(() -> rlMachine.getRecipeLogic().getProgress())); + IntSyncValue maxProgress = syncManager.getOrCreateSyncHandler("maxProgress", IntSyncValue.class, + () -> new IntSyncValue(() -> rlMachine.getRecipeLogic().getMaxProgress())); + DoubleSyncValue progressPercent = syncManager.getOrCreateSyncHandler("progressPercent", DoubleSyncValue.class, + () -> new DoubleSyncValue(() -> rlMachine.getRecipeLogic().getProgressPercent())); + + return IKey.dynamic(() -> { + int progress = (int) (progressPercent.getDoubleValue() * 100.f); + float current = (float) currentProgress.getDoubleValue() / 20.f; + float max = (float) maxProgress.getDoubleValue() / 20.f; + return Component.translatable("gtceu.multiblock.progress", + String.format("%.2f", current), String.format("%.2f", max), progress); + }) + .color(Color.WHITE.main) + .asWidget() + .setEnabledIf(widget -> isFormed.getBoolValue() && isActive.getBoolValue()); + } + + public static TextWidget addEnergyTierLine(WorkableElectricMultiblockMachine rlMachine, + PanelSyncManager syncManager) { + BooleanSyncValue isFormed = syncManager.getOrCreateSyncHandler("isFormed", BooleanSyncValue.class, + () -> new BooleanSyncValue(rlMachine::isFormed)); + + IntSyncValue tier = syncManager.getOrCreateSyncHandler("energyTier", IntSyncValue.class, + () -> new IntSyncValue(rlMachine::getTier)); + + return IKey.dynamic(() -> { + Component voltageName = Component.literal(GTValues.VNF[tier.getIntValue()]); + return Component.translatable( + "gtceu.multiblock.max_recipe_tier", + voltageName).withStyle(ChatFormatting.GRAY); + }) + .asWidget() + .tooltip(new RichTooltip().add(Component.translatable("gtceu.multiblock.max_recipe_tier_hover") + .withStyle(ChatFormatting.GRAY))) + .setEnabledIf(widget -> isFormed.getBoolValue()); + } + + public static TextWidget addParallelLine(IWorkableMultiController rlMachine, PanelSyncManager syncManager) { + IntSyncValue parallelAmount = syncManager.getOrCreateSyncHandler("parallelAmount", IntSyncValue.class, + () -> new IntSyncValue(() -> { + if (rlMachine.getRecipeLogic().getLastRecipe() == null) return 0; + return rlMachine.getRecipeLogic().getLastRecipe().parallels; + })); + + return IKey.dynamic(() -> { + Component runs = Component.literal(FormattingUtil.formatNumbers(parallelAmount.getIntValue())) + .withStyle(ChatFormatting.DARK_PURPLE); + String key = "gtceu.multiblock.parallel"; + return Component.translatable(key, runs) + .withStyle(ChatFormatting.GRAY); + }).asWidget() + .setEnabledIf(widget -> parallelAmount.getIntValue() != 0); + } + + public static TextWidget addBatchModeLine(IWorkableMultiController rlMachine, PanelSyncManager syncManager) { + BooleanSyncValue batchEnabled = syncManager.getOrCreateSyncHandler("batchEnabled", BooleanSyncValue.class, + () -> new BooleanSyncValue(rlMachine::isBatchEnabled)); + IntSyncValue batchAmount = syncManager.getOrCreateSyncHandler("batchAmount", IntSyncValue.class, + () -> new IntSyncValue(() -> { + if (rlMachine.getRecipeLogic().getLastRecipe() == null) return 0; + return rlMachine.getRecipeLogic().getLastRecipe().batchParallels; + })); + + return IKey.dynamic(() -> { + Component runs = Component.literal(FormattingUtil.formatNumbers(batchAmount.getIntValue())) + .withStyle(ChatFormatting.DARK_PURPLE); + String key = "gtceu.multiblock.batch_enabled"; + return Component.translatable(key, runs) + .withStyle(ChatFormatting.GRAY); + }).asWidget() + .setEnabledIf(widget -> batchEnabled.getBoolValue() && batchAmount.getIntValue() != 0); + } + + public static TextWidget addSubtickParallelsLine(IWorkableMultiController rlMachine, + PanelSyncManager syncManager) { + IntSyncValue subtickAmount = syncManager.getOrCreateSyncHandler("subtickAmount", IntSyncValue.class, + () -> new IntSyncValue(() -> { + if (rlMachine.getRecipeLogic().getLastRecipe() == null) return 0; + return rlMachine.getRecipeLogic().getLastRecipe().subtickParallels; + })); + + return IKey.dynamic(() -> { + Component runs = Component.literal(FormattingUtil.formatNumbers(subtickAmount.getIntValue())) + .withStyle(ChatFormatting.DARK_PURPLE); + String key = "gtceu.multiblock.subtick_parallels"; + return Component.translatable(key, runs) + .withStyle(ChatFormatting.GRAY); + }).asWidget() + .setEnabledIf(widget -> subtickAmount.getIntValue() != 0); + } + + public static TextWidget addTotalRunsLine(IWorkableMultiController rlMachine, PanelSyncManager syncManager) { + IntSyncValue totalRunAmount = syncManager.getOrCreateSyncHandler("totalRunAmount", IntSyncValue.class, + () -> new IntSyncValue(() -> { + if (rlMachine.getRecipeLogic().getLastRecipe() == null) return 0; + return rlMachine.getRecipeLogic().getLastRecipe().getTotalRuns(); + })); + + return IKey.dynamic(() -> { + Component runs = Component.literal(FormattingUtil.formatNumbers(totalRunAmount.getIntValue())) + .withStyle(ChatFormatting.DARK_PURPLE); + String key = "gtceu.multiblock.total_runs"; + return Component.translatable(key, runs) + .withStyle(ChatFormatting.GRAY); + }).asWidget() + .setEnabledIf(widget -> totalRunAmount.getIntValue() != 0); + } + + public static DynamicSyncedWidget addOutputLines(IWorkableMultiController rlmachine, + PanelSyncManager syncManager) { + GenericSyncValue recipeSyncValue = syncManager.getOrCreateSyncHandler("GTRecipe", + GenericSyncValue.class, + () -> new GenericSyncValue.Builder<>(GTRecipe.class) + .getter(() -> rlmachine.getRecipeLogic().getLastRecipe()) + .setter((newRecipe) -> {}) + .adapter(ByteBufAdapters.GTRECIPE) + .copy((toCopy) -> { + if (toCopy == null) return null; + return toCopy.copy(); + }) + .build()); + + DynamicLinkedSyncHandler> dynamicLinkedSyncHandler = new DynamicLinkedSyncHandler<>( + recipeSyncValue) + .widgetProvider((syncManager1, recipeSyncHandler) -> { + var list = Flow.column() + .widthRel(1) + .coverChildrenHeight() + .crossAxisAlignment(Alignment.CrossAxis.START); + GTRecipe recipe = recipeSyncHandler.getValue(); + if (recipe == null) return list; + + for (var output : recipe.getOutputContents(ItemRecipeCapability.CAP)) { + var widget = createItemLineForOutput(output, recipe); + if (widget.isEmpty()) continue; + list.child(widget.get().width(187 - 3 - 3 - 2 - 2)); + } + + for (var output : recipe.getOutputContents(FluidRecipeCapability.CAP)) { + var widget = createFluidLineForOutput(output, recipe); + if (widget.isEmpty()) continue; + list.child(widget.get().width(187 - 3 - 3 - 2 - 2)); + } + + return list; + }); + + return new DynamicSyncedWidget<>() + .widthRel(1) + .coverChildrenHeight() + .syncHandler(dynamicLinkedSyncHandler); + } + + public static Optional> createItemLineForOutput(Content itemOutput, GTRecipe recipe) { + int runs = recipe.getTotalRuns(); + var function = recipe.getType().getChanceFunction(); + + int recipeTier = RecipeHelper.getPreOCRecipeEuTier(recipe); + int chanceTier = recipeTier + recipe.ocLevel; + double maxDurationSec = (double) recipe.duration / 20.0; + + boolean rounded = false; + ItemStack stack; + // number of items output by a non-ranged ingredient + int count = 0; + // number of items output, but stored as a double. Used for accurate items/second display. + double countD = 1; + // number of items output which is actually displayed. Can be either a number, or a range. + Component displaycount; + if (itemOutput.content instanceof IntProviderIngredient provider) { + rounded = true; + stack = provider.getMaxSizeStack(); + displaycount = Component.translatable("gtceu.gui.content.range", + provider.getCountProvider().getMinValue(), + provider.getCountProvider().getMaxValue()); + if (itemOutput.chance < itemOutput.maxChance) { + countD = countD * runs * function.getBoostedChance(itemOutput, recipeTier, chanceTier) / + itemOutput.maxChance; + } + countD = countD * provider.getMidRoll(); + } else { + var stacks = ItemRecipeCapability.CAP.of(itemOutput.content).getItems(); + if (stacks.length == 0) return Optional.empty(); + stack = stacks[0]; + count = stack.getCount(); + countD *= count; + if (itemOutput.chance < itemOutput.maxChance) { + rounded = true; + countD = countD * runs * function.getBoostedChance(itemOutput, recipeTier, chanceTier) / + itemOutput.maxChance; + } + count = Math.max(1, (int) Math.round(countD)); + displaycount = Component.literal(String.valueOf(count)); + } + if (countD < maxDurationSec) { + String key = "gtceu.multiblock.output_line." + (rounded ? "2" : "0"); + return Optional.of( + Flow.row() + .coverChildren() + .childPadding(2) + .child(new ItemDrawable(stack).asWidget()) + .child( + IKey.lang( + Component.translatable(key, stack.getHoverName(), displaycount, + FormattingUtil.formatNumber2Places(maxDurationSec / countD))) + .asWidget())); + } else { + String key = "gtceu.multiblock.output_line." + (rounded ? "3" : "1"); + return Optional.of( + Flow.row() + .coverChildren() + .childPadding(2) + .child(new ItemDrawable(stack).asWidget()) + .child( + IKey.lang( + Component.translatable(key, stack.getHoverName(), displaycount, + FormattingUtil.formatNumber2Places(countD / maxDurationSec))) + .asWidget())); + } + } + + public static Optional> createFluidLineForOutput(Content fluidOutput, GTRecipe recipe) { + int runs = recipe.getTotalRuns(); + var function = recipe.getType().getChanceFunction(); + + int recipeTier = RecipeHelper.getPreOCRecipeEuTier(recipe); + int chanceTier = recipeTier + recipe.ocLevel; + double maxDurationSec = (double) recipe.duration / 20.0; + + boolean rounded = false; + FluidStack stack; + // amount of fluid output by a non-ranged ingredient + int amount = 0; + // amount of fluid output, but stored as a double. Used for accurate fluid/second display. + double amountD = 1; + // amount of fluid output which is actually displayed. Can be either a number, or a range. + Component displaycount; + if (fluidOutput.content instanceof IntProviderFluidIngredient provider) { + rounded = true; + stack = provider.getMaxSizeStack(); + displaycount = Component.translatable("gtceu.gui.content.range", + provider.getCountProvider().getMinValue(), + provider.getCountProvider().getMaxValue()); + if (fluidOutput.chance < fluidOutput.maxChance) { + amountD = amountD * runs * function.getBoostedChance(fluidOutput, recipeTier, chanceTier) / + fluidOutput.maxChance; + } + amountD = amountD * provider.getMidRoll(); + } else { + var stacks = FluidRecipeCapability.CAP.of(fluidOutput.content).getStacks(); + if (stacks.length == 0) return Optional.empty(); + stack = stacks[0]; + amount = stack.getAmount(); + amountD *= amount; + if (fluidOutput.chance < fluidOutput.maxChance) { + rounded = true; + amountD = amountD * runs * function.getBoostedChance(fluidOutput, recipeTier, chanceTier) / + fluidOutput.maxChance; + } + amount = Math.max(1, (int) Math.round(amountD)); + displaycount = Component.literal(String.valueOf(amount)); + } + if (amountD < maxDurationSec) { + String key = "gtceu.multiblock.output_line." + (rounded ? "2" : "0"); + return Optional.of( + Flow.row() + .coverChildren() + .childPadding(2) + .child(new FluidDrawable(stack).asWidget()) + .child( + IKey.lang( + Component.translatable(key, stack.getDisplayName(), displaycount, + FormattingUtil.formatNumber2Places(maxDurationSec / amountD))) + .asWidget())); + } else { + String key = "gtceu.multiblock.output_line." + (rounded ? "3" : "1"); + return Optional.of( + Flow.row() + .coverChildren() + .childPadding(2) + .child(new FluidDrawable(stack).asWidget()) + .child( + IKey.lang( + Component.translatable(key, stack.getDisplayName(), displaycount, + FormattingUtil.formatNumber2Places(amountD / maxDurationSec))) + .asWidget())); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/ActiveTransformerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/ActiveTransformerMachine.java index 0eb894dac70..a0331512396 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/ActiveTransformerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/ActiveTransformerMachine.java @@ -5,13 +5,9 @@ import com.gregtechceu.gtceu.api.capability.IEnergyContainer; import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; import com.gregtechceu.gtceu.api.machine.ConditionalSubscriptionHandler; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine; -import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; @@ -19,14 +15,10 @@ import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.utils.FormattingUtil; -import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.widget.*; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.network.chat.Component; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.Block; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; @@ -44,7 +36,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class ActiveTransformerMachine extends WorkableElectricMultiblockMachine - implements IControllable, IExplosionMachine, IFancyUIMachine, IDisplayUIMachine { + implements IControllable, IExplosionMachine { private IEnergyContainer powerOutput; private IEnergyContainer powerInput; @@ -168,54 +160,54 @@ public static TraceabilityPredicate getHatchPredicates() { .or(abilities(PartAbility.OUTPUT_LASER).setPreviewCount(1)); } - @Override - public void addDisplayText(List textList) { - // super.addDisplayText(textList); idek what it does stop doing what you do for a minute pls - // Assume That the Structure is ALWAYS formed, and has at least 1 In and 1 Out, there is never a case where this - // does not occur. - if (isFormed()) { - if (!isWorkingEnabled()) { - textList.add(Component.translatable("gtceu.multiblock.work_paused")); - } else if (isActive()) { - textList.add(Component.translatable("gtceu.multiblock.running")); - textList.add(Component - .translatable("gtceu.multiblock.active_transformer.max_input", - FormattingUtil.formatNumbers( - Math.abs(powerInput.getInputVoltage() * powerInput.getInputAmperage())))); - textList.add(Component - .translatable("gtceu.multiblock.active_transformer.max_output", - FormattingUtil.formatNumbers( - Math.abs(powerOutput.getOutputVoltage() * powerOutput.getOutputAmperage())))); - textList.add(Component - .translatable("gtceu.multiblock.active_transformer.average_in", - FormattingUtil.formatNumbers(Math.abs(powerInput.getInputPerSec() / 20)))); - textList.add(Component - .translatable("gtceu.multiblock.active_transformer.average_out", - FormattingUtil.formatNumbers(Math.abs(powerOutput.getOutputPerSec() / 20)))); - if (!ConfigHolder.INSTANCE.machines.harmlessActiveTransformers) { - textList.add(Component - .translatable("gtceu.multiblock.active_transformer.danger_enabled")); - } - } else { - textList.add(Component.translatable("gtceu.multiblock.idling")); - } - } - } - - @Override - public @NotNull Widget createUIWidget() { - var group = new WidgetGroup(0, 0, 182 + 8, 117 + 8); - group.addWidget(new DraggableScrollableWidgetGroup(4, 4, 182, 117).setBackground(getScreenTexture()) - .addWidget(new LabelWidget(4, 5, self().getBlockState().getBlock().getDescriptionId())) - .addWidget(new ComponentPanelWidget(4, 17, this::addDisplayText) - .setMaxWidthLimit(150) - .clickHandler(this::handleDisplayClick))); - group.setBackground(GuiTextures.BACKGROUND_INVERSE); - return group; - } - - @Override - public @NotNull ModularUI createUI(@NotNull Player entityPlayer) { - return new ModularUI(198, 208, this, entityPlayer).widget(new FancyMachineUIWidget(this, 198, 208)); - } + // @Override + // public void addDisplayText(List textList) { + // // super.addDisplayText(textList); idek what it does stop doing what you do for a minute pls + // // Assume That the Structure is ALWAYS formed, and has at least 1 In and 1 Out, there is never a case where this + // // does not occur. + // if (isFormed()) { + // if (!isWorkingEnabled()) { + // textList.add(Component.translatable("gtceu.multiblock.work_paused")); + // } else if (isActive()) { + // textList.add(Component.translatable("gtceu.multiblock.running")); + // textList.add(Component + // .translatable("gtceu.multiblock.active_transformer.max_input", + // FormattingUtil.formatNumbers( + // Math.abs(powerInput.getInputVoltage() * powerInput.getInputAmperage())))); + // textList.add(Component + // .translatable("gtceu.multiblock.active_transformer.max_output", + // FormattingUtil.formatNumbers( + // Math.abs(powerOutput.getOutputVoltage() * powerOutput.getOutputAmperage())))); + // textList.add(Component + // .translatable("gtceu.multiblock.active_transformer.average_in", + // FormattingUtil.formatNumbers(Math.abs(powerInput.getInputPerSec() / 20)))); + // textList.add(Component + // .translatable("gtceu.multiblock.active_transformer.average_out", + // FormattingUtil.formatNumbers(Math.abs(powerOutput.getOutputPerSec() / 20)))); + // if (!ConfigHolder.INSTANCE.machines.harmlessActiveTransformers) { + // textList.add(Component + // .translatable("gtceu.multiblock.active_transformer.danger_enabled")); + // } + // } else { + // textList.add(Component.translatable("gtceu.multiblock.idling")); + // } + // } + // } + // + // @Override + // public @NotNull Widget createUIWidget() { + // var group = new WidgetGroup(0, 0, 182 + 8, 117 + 8); + // group.addWidget(new DraggableScrollableWidgetGroup(4, 4, 182, 117).setBackground(getScreenTexture()) + // .addWidget(new LabelWidget(4, 5, self().getBlockState().getBlock().getDescriptionId())) + // .addWidget(new ComponentPanelWidget(4, 17, this::addDisplayText) + // .setMaxWidthLimit(150) + // .clickHandler(this::handleDisplayClick))); + // group.setBackground(GuiTextures.BACKGROUND_INVERSE); + // return group; + // } + + // @Override + // public @NotNull ModularUI createUI(@NotNull Player entityPlayer) { + // return new ModularUI(198, 208, this, entityPlayer).widget(new FancyMachineUIWidget(this, 198, 208)); + // } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/BedrockOreMinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/BedrockOreMinerMachine.java index 5933ae2b079..f9deb48aff3 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/BedrockOreMinerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/BedrockOreMinerMachine.java @@ -7,7 +7,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; -import com.gregtechceu.gtceu.api.data.worldgen.bedrockore.WeightedMaterial; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; @@ -15,21 +14,14 @@ import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.common.machine.trait.BedrockOreMinerLogic; -import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTUtil; -import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.HoverEvent; -import net.minecraft.network.chat.Style; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; import lombok.Getter; -import java.util.List; - import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @@ -56,47 +48,47 @@ public int getEnergyTier() { return Math.min(this.tier + 1, Math.max(this.tier, GTUtil.getFloorTierByVoltage(energyCont.getInputVoltage()))); } - @Override - public void addDisplayText(List textList) { - if (isFormed()) { - int energyContainer = getEnergyTier(); - long maxVoltage = GTValues.V[energyContainer]; - String voltageName = GTValues.VNF[energyContainer]; - textList.add(Component.translatable("gtceu.multiblock.max_energy_per_tick", maxVoltage, voltageName)); - - if (getRecipeLogic().getVeinMaterials() != null) { - // Ore names - textList.add(Component.translatable("gtceu.multiblock.ore_rig.drilled_ores_list") - .withStyle(ChatFormatting.GREEN)); - List drilledOres = getRecipeLogic().getVeinMaterials(); - for (var entry : drilledOres) { - Component fluidInfo = entry.material().getLocalizedName().withStyle(ChatFormatting.GREEN); - textList.add(Component.translatable("gtceu.multiblock.ore_rig.drilled_ore_entry", fluidInfo) - .withStyle(ChatFormatting.GRAY)); - } - - // Ore amount - Component amountInfo = Component.literal(FormattingUtil.formatNumbers( - getRecipeLogic().getOreToProduce() * 20L / BedrockOreMinerLogic.MAX_PROGRESS) + - "/s").withStyle(ChatFormatting.BLUE); - textList.add(Component.translatable("gtceu.multiblock.ore_rig.ore_amount", amountInfo) - .withStyle(ChatFormatting.GRAY)); - } else { - Component noOre = Component.translatable("gtceu.multiblock.fluid_rig.no_fluid_in_area") - .withStyle(ChatFormatting.RED); - textList.add(Component.translatable("gtceu.multiblock.ore_rig.drilled_ores_list") - .withStyle(ChatFormatting.GREEN)); - textList.add(Component.translatable("gtceu.multiblock.ore_rig.drilled_ore_entry", noOre) - .withStyle(ChatFormatting.GRAY)); - } - } else { - Component tooltip = Component.translatable("gtceu.multiblock.invalid_structure.tooltip") - .withStyle(ChatFormatting.GRAY); - textList.add(Component.translatable("gtceu.multiblock.invalid_structure") - .withStyle(Style.EMPTY.withColor(ChatFormatting.RED) - .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, tooltip)))); - } - } + // @Override + // public void addDisplayText(List textList) { + // if (isFormed()) { + // int energyContainer = getEnergyTier(); + // long maxVoltage = GTValues.V[energyContainer]; + // String voltageName = GTValues.VNF[energyContainer]; + // textList.add(Component.translatable("gtceu.multiblock.max_energy_per_tick", maxVoltage, voltageName)); + // + // if (getRecipeLogic().getVeinMaterials() != null) { + // // Ore names + // textList.add(Component.translatable("gtceu.multiblock.ore_rig.drilled_ores_list") + // .withStyle(ChatFormatting.GREEN)); + // List drilledOres = getRecipeLogic().getVeinMaterials(); + // for (var entry : drilledOres) { + // Component fluidInfo = entry.material().getLocalizedName().withStyle(ChatFormatting.GREEN); + // textList.add(Component.translatable("gtceu.multiblock.ore_rig.drilled_ore_entry", fluidInfo) + // .withStyle(ChatFormatting.GRAY)); + // } + // + // // Ore amount + // Component amountInfo = Component.literal(FormattingUtil.formatNumbers( + // getRecipeLogic().getOreToProduce() * 20L / BedrockOreMinerLogic.MAX_PROGRESS) + + // "/s").withStyle(ChatFormatting.BLUE); + // textList.add(Component.translatable("gtceu.multiblock.ore_rig.ore_amount", amountInfo) + // .withStyle(ChatFormatting.GRAY)); + // } else { + // Component noOre = Component.translatable("gtceu.multiblock.fluid_rig.no_fluid_in_area") + // .withStyle(ChatFormatting.RED); + // textList.add(Component.translatable("gtceu.multiblock.ore_rig.drilled_ores_list") + // .withStyle(ChatFormatting.GREEN)); + // textList.add(Component.translatable("gtceu.multiblock.ore_rig.drilled_ore_entry", noOre) + // .withStyle(ChatFormatting.GRAY)); + // } + // } else { + // Component tooltip = Component.translatable("gtceu.multiblock.invalid_structure.tooltip") + // .withStyle(ChatFormatting.GRAY); + // textList.add(Component.translatable("gtceu.multiblock.invalid_structure") + // .withStyle(Style.EMPTY.withColor(ChatFormatting.RED) + // .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, tooltip)))); + // } + // } public static int getDepletionChance(int tier) { if (tier == GTValues.MV) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java index b0827e23796..9145c8133a0 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java @@ -7,14 +7,11 @@ import com.gregtechceu.gtceu.api.capability.IMonitorComponent; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; -import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.item.IComponentItem; import com.gregtechceu.gtceu.api.item.component.IItemComponent; import com.gregtechceu.gtceu.api.item.component.IMonitorModuleItem; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; -import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; @@ -30,9 +27,6 @@ import com.gregtechceu.gtceu.common.machine.trait.CentralMonitorLogic; import com.gregtechceu.gtceu.common.network.GTNetwork; import com.gregtechceu.gtceu.common.network.packets.SCPacketMonitorGroupNBTChange; -import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.utils.GTStringUtils; -import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.*; import com.lowdragmc.lowdraglib.gui.widget.*; @@ -41,11 +35,9 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; -import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraftforge.items.IItemHandler; import lombok.Getter; import org.jetbrains.annotations.NotNull; @@ -54,7 +46,6 @@ import java.awt.*; import java.util.*; import java.util.List; -import java.util.function.Consumer; import java.util.stream.Stream; import javax.annotation.ParametersAreNonnullByDefault; @@ -303,351 +294,351 @@ private boolean isInAnyGroup(IMonitorComponent component) { return monitorGroups.stream().anyMatch(group -> group.contains(component.getBlockPos())); } - @Override - public void addDisplayText(List textList) { - MultiblockDisplayText.builder(textList, isFormed()) - .addWorkingStatusLine(); - getDefinition().getAdditionalDisplay().accept(this, textList); - } - - @Override - public Widget createUIWidget() { - updateStructureDimensions(); - selectedComponents.clear(); - WidgetGroup builder = (WidgetGroup) super.createUIWidget(); - - WidgetGroup main = new WidgetGroup(); - DraggableScrollableWidgetGroup componentSelection = new DraggableScrollableWidgetGroup(0, 10, 200, 110); - main.addWidget(componentSelection); - WidgetGroup options = new WidgetGroup(-100, 20, 60, 20); - WidgetGroup groupConfig = new WidgetGroup(10, 30, 100, 100); - groupConfig.setVisible(false); - - ButtonWidget infoWidget = new ButtonWidget(200, 10, 20, 20, null); - infoWidget.setButtonTexture(GuiTextures.INFO_ICON); - infoWidget.setHoverTooltips( - GTStringUtils.toImmutable(LangHandler.getSingleOrMultiLang("gtceu.central_monitor.info_tooltip"))); - builder.addWidget(infoWidget); - List configGroup = new ArrayList<>(); - configGroup.add(null); - - Consumer openGroupConfig = (group) -> { - configGroup.set(0, group); - if (group == null) { - main.setVisible(true); - groupConfig.setVisible(false); - return; - } - groupConfig.clearAllWidgets(); - groupConfig.addWidget(new LabelWidget(0, 5, () -> { - String currentName = ""; - if (configGroup.get(0) != null) { - currentName = configGroup.get(0).getName(); - } - return Component.translatable("gtceu.central_monitor.gui.currently_editing", currentName).getString(); - })); - for (int i = 0; i < 8; i++) { - SlotWidget slot = new SlotWidget(group.getPlaceholderSlotsHandler(), i, -38, 16 * i + 46); - slot.setHoverTooltips(GTStringUtils - .toImmutable(LangHandler.getMultiLang("gtceu.gui.computer_monitor_cover.slot_tooltip", i + 1))); - groupConfig.addWidget(slot); - } - SlotWidget slot = new SlotWidget( - group.getItemStackHandler(), 0, - 0, 20); - WidgetGroup itemUI = new WidgetGroup(40, 20, 100, 100); - Runnable changeListener = () -> { - if (slot.getLastItem().is(slot.getItem().getItem())) return; - itemUI.clearAllWidgets(); - if (slot.getItem().getItem() instanceof IComponentItem item) { - for (IItemComponent component : item.getComponents()) { - if (component instanceof IMonitorModuleItem module) { - itemUI.addWidget(module.createUIWidget(slot.getItem(), this, group)); - } - } - } - }; - slot.setChangeListener(changeListener); - changeListener.run(); - groupConfig.addWidget(itemUI); - groupConfig.addWidget(slot); - main.setVisible(false); - groupConfig.setVisible(true); - }; - builder.addWidget(groupConfig); - DraggableScrollableWidgetGroup groupList = new DraggableScrollableWidgetGroup(-100, 50, 70, 80); - - List>>> imageButtons = new ArrayList<>(); - Map rightClickCallbacks = new HashMap<>(); - int[] dataSlot = new int[2]; // list to be able to modify it in lambdas - dataSlot[0] = 1; // the slot (index starts from 1) - dataSlot[1] = 9; // amount of slots - IntInputWidget dataSlotInput = new IntInputWidget(120, 20, 60, -20, () -> dataSlot[0], - n -> dataSlot[0] = Mth.clamp(n, 1, dataSlot[1])); - dataSlotInput.setVisible(false); - builder.addWidget(dataSlotInput); - - Consumer addGroupToList = group -> { - ButtonWidget label = new ButtonWidget(20, groupList.widgets.size() * 15 + 5, 60, 10, null); - TextTexture text = new TextTexture(group.getName()); - text.setType(TextTexture.TextType.LEFT); - label.setButtonTexture(text); - label.setOnPressCallback(click -> { - group.getRelativePositions().forEach(pos -> { - BlockPos rel = toRelative(pos); - if (imageButtons.size() - 1 < rel.getY()) return; - if (imageButtons.get(rel.getY()).size() - 1 < rel.getX()) return; - imageButtons.get(rel.getY()).get(rel.getX()).accept(null); - }); - if (group.getTargetRaw() != null) { - rightClickCallbacks.getOrDefault(group.getTargetRaw(), () -> {}).run(); - } - }); - groupList.addWidget(label); - - ButtonWidget configButton = new ButtonWidget( - 0, label.getSelfPositionY() - 3, - 16, 16, - GuiTextures.IO_CONFIG_COVER_SETTINGS, - click -> { - if (configGroup.get(0) == null) { - openGroupConfig.accept(group); - } else { - openGroupConfig.accept(null); - } - }); - groupList.addWidget(configButton); - }; - - monitorGroups.forEach(addGroupToList); - builder.addWidget(groupList); - main.addWidget(options); - ButtonWidget removeFromGroupButton = new ButtonWidget(0, 0, 60, 20, null); - removeFromGroupButton.setButtonTexture(new TextTexture("gtceu.central_monitor.gui.remove_from_group")); - removeFromGroupButton.setVisible(false); - ButtonWidget setTargetButton = new ButtonWidget(0, 15, 60, 20, null); - setTargetButton.setButtonTexture(new TextTexture("gtceu.central_monitor.gui.set_target")); - setTargetButton.setVisible(false); - ButtonWidget createGroupButton = new ButtonWidget(0, 0, 60, 20, null); - createGroupButton.setOnPressCallback(click -> { - MonitorGroup group = new MonitorGroup( - Component.translatable("gtceu.gui.central_monitor.group_default_name", monitorGroups.size() + 1) - .getString()); - for (IMonitorComponent component : selectedComponents) { - if (isInAnyGroup(component)) return; - group.add(component.getBlockPos()); - } - monitorGroups.add(group); - addGroupToList.accept(group); - - createGroupButton.setVisible(false); - removeFromGroupButton.setVisible(true); - Iterator it = selectedComponents.iterator(); - while (it.hasNext()) { - IMonitorComponent c = it.next(); - BlockPos rel = toRelative(c.getBlockPos()); - imageButtons.get(rel.getY()).get(rel.getX()).accept(it); - } - if (!selectedTargets.isEmpty()) { - rightClickCallbacks.getOrDefault(selectedTargets.get(0).getBlockPos(), () -> {}).run(); - } - }); - setTargetButton.setOnPressCallback(click -> { - MonitorGroup group = null; - for (MonitorGroup group2 : monitorGroups) { - for (IMonitorComponent component : selectedComponents) { - if (group2.contains(component.getBlockPos())) { - group = group2; - break; - } - } - if (group != null) break; - } - if (group == null) return; - if (selectedTargets.isEmpty()) group.setTarget(null); - else { - group.setTarget(selectedTargets.get(0).getBlockPos()); - group.setDataSlot(dataSlot[0] - 1); - } - }); - removeFromGroupButton.setOnPressCallback(click -> { - for (MonitorGroup group : monitorGroups) { - for (IMonitorComponent component : selectedComponents) group.remove(component.getBlockPos()); - } - Iterator itg = monitorGroups.iterator(); - while (itg.hasNext()) { - MonitorGroup group = itg.next(); - if (group.isEmpty()) { - clearInventory(group.getItemStackHandler()); - clearInventory(group.getPlaceholderSlotsHandler()); - itg.remove(); - } - } - groupList.clearAllWidgets(); - monitorGroups.forEach(addGroupToList); - - removeFromGroupButton.setVisible(false); - createGroupButton.setVisible(true); - Iterator it = selectedComponents.iterator(); - while (it.hasNext()) { - IMonitorComponent c = it.next(); - BlockPos rel = toRelative(c.getBlockPos()); - if (imageButtons.size() - 1 < rel.getY()) continue; - if (imageButtons.get(rel.getY()).size() - 1 < rel.getX()) continue; - imageButtons.get(rel.getY()).get(rel.getX()).accept(it); - } - if (!selectedTargets.isEmpty()) { - rightClickCallbacks.getOrDefault(selectedTargets.get(0).getBlockPos(), () -> {}).run(); - } - }); - createGroupButton.setButtonTexture(new TextTexture("gtceu.central_monitor.gui.create_group")); - createGroupButton.setVisible(false); - options.addWidget(removeFromGroupButton); - options.addWidget(createGroupButton); - options.addWidget(setTargetButton); - int startX = 20; - int startY = 30; - for (int row = 0; row <= downDist + upDist; row++) { - imageButtons.add(new ArrayList<>()); - for (int col = 0; col <= leftDist + rightDist; col++) { - IGuiTexture texture = getComponentTexture(row, col); - GuiTextureGroup textures = new GuiTextureGroup(texture, new ColorBorderTexture(2, 0xFFFFFF)); - IMonitorComponent component = getComponent(row, col); - if (component == null) { - GTUtil.getLast(imageButtons).add(it -> {}); - continue; - } - ButtonWidget img = new ButtonWidget(startX + (16 * col), startY + (16 * row), 16, 16, textures, null); - Consumer> callback = (it) -> { - if (!component.isMonitor()) return; - if (selectedComponents.contains(component)) { - if (it == null) { - selectedComponents.remove(component); - } else { - it.remove(); - } - - if (!selectedTargets.isEmpty() && selectedTargets.get(0) == component) { - ColorRectTexture rect = new ColorRectTexture(Color.BLUE); - textures.setTextures(rect, texture); - } else { - textures.setTextures(texture); - } - - createGroupButton.setVisible(selectedComponents.stream().noneMatch(this::isInAnyGroup)); - removeFromGroupButton.setVisible(selectedComponents.stream().allMatch(this::isInAnyGroup)); - setTargetButton.setVisible(removeFromGroupButton.isVisible()); - - if (selectedComponents.isEmpty()) { - createGroupButton.setVisible(false); - removeFromGroupButton.setVisible(false); - setTargetButton.setVisible(false); - } - } else { - boolean inAnyGroup = isInAnyGroup(component); - // yes I know this is terrible but if it works don't touch it :) - if (selectedComponents.isEmpty() && !inAnyGroup) createGroupButton.setVisible(true); - if (inAnyGroup) createGroupButton.setVisible(false); - if (selectedComponents.isEmpty() && inAnyGroup) { - removeFromGroupButton.setVisible(true); - setTargetButton.setVisible(true); - } - if (!inAnyGroup) { - removeFromGroupButton.setVisible(false); - setTargetButton.setVisible(false); - } - selectedComponents.add(component); - ColorRectTexture rect = new ColorRectTexture( - (selectedTargets.isEmpty() || selectedTargets.get(0) != component) ? Color.RED : - Color.PINK); - textures.setTextures(rect, texture); - } - if (isInAnyGroup(component)) { - monitorGroups.forEach(group -> { - if (group.contains(component.getBlockPos())) { - img.setHoverTooltips( - Component.translatable("gtceu.gui.central_monitor.group", group.getName())); - } - }); - } else { - img.setHoverTooltips(Component.translatable("gtceu.gui.central_monitor.group", - Component.translatable("gtceu.gui.central_monitor.none"))); - } - }; - Runnable rightClickCallback = () -> { - if (!selectedTargets.isEmpty()) { - if (selectedTargets.get(0).getBlockPos() == component.getBlockPos()) { - selectedTargets.clear(); - if (selectedComponents.contains(component)) { - ColorRectTexture rect = new ColorRectTexture(Color.RED); - textures.setTextures(rect, texture); - } else { - textures.setTextures(texture); - } - dataSlotInput.setVisible(false); - return; - } else { - try { - rightClickCallbacks.get(selectedTargets.get(0).getBlockPos()).run(); - } catch (StackOverflowError e) { - GTCEu.LOGGER.error( - "Stack overflow when right-clicking monitor component {} at {} (selectedTarget is {} at {})", - component, component.getBlockPos(), selectedTargets.get(0), - selectedTargets.get(0).getBlockPos()); - } - } - } - selectedTargets.add(component); - ColorRectTexture rect; - if (selectedComponents.contains(component)) { - rect = new ColorRectTexture(Color.PINK); - } else { - rect = new ColorRectTexture(Color.BLUE); - } - textures.setTextures(rect, texture); - if (component.getDataItems() != null) { - IItemHandler dataItems = component.getDataItems(); - MonitorGroup selectedGroup = null; - for (MonitorGroup group : monitorGroups) { - for (IMonitorComponent c : selectedComponents) { - if (group.contains(c.getBlockPos())) { - if (selectedGroup == null || selectedGroup == group) { - selectedGroup = group; - } else { - selectedGroup = null; - break; - } - } - } - } - if (selectedGroup != null) { - dataSlot[0] = selectedGroup.getDataSlot() + 1; - } - dataSlot[1] = dataItems.getSlots(); - dataSlotInput.setVisible(true); - } - }; - if (isInAnyGroup(component)) { - monitorGroups.forEach(group -> { - if (group.contains(component.getBlockPos())) img.setHoverTooltips( - Component.translatable("gtceu.gui.central_monitor.group", group.getName())); - }); - } else { - img.setHoverTooltips(Component.translatable("gtceu.gui.central_monitor.group", - Component.translatable("gtceu.gui.central_monitor.none"))); - } - img.setOnPressCallback(click -> { - if (click.button == 0) callback.accept(null); - else if (click.button == 1) rightClickCallback.run(); - }); - componentSelection.addWidget(img); - GTUtil.getLast(imageButtons).add(callback); - rightClickCallbacks.put(component.getBlockPos(), rightClickCallback); - } - } - builder.addWidget(main); - return builder; - } + // @Override + // public void addDisplayText(List textList) { + // MultiblockDisplayText.builder(textList, isFormed()) + // .addWorkingStatusLine(); + // getDefinition().getAdditionalDisplay().accept(this, textList); + // } + // + // @Override + // public Widget createUIWidget() { + // updateStructureDimensions(); + // selectedComponents.clear(); + // WidgetGroup builder = (WidgetGroup) super.createUIWidget(); + // + // WidgetGroup main = new WidgetGroup(); + // DraggableScrollableWidgetGroup componentSelection = new DraggableScrollableWidgetGroup(0, 10, 200, 110); + // main.addWidget(componentSelection); + // WidgetGroup options = new WidgetGroup(-100, 20, 60, 20); + // WidgetGroup groupConfig = new WidgetGroup(10, 30, 100, 100); + // groupConfig.setVisible(false); + // + // ButtonWidget infoWidget = new ButtonWidget(200, 10, 20, 20, null); + // infoWidget.setButtonTexture(GuiTextures.INFO_ICON); + // infoWidget.setHoverTooltips( + // GTStringUtils.toImmutable(LangHandler.getSingleOrMultiLang("gtceu.central_monitor.info_tooltip"))); + // builder.addWidget(infoWidget); + // List configGroup = new ArrayList<>(); + // configGroup.add(null); + // + // Consumer openGroupConfig = (group) -> { + // configGroup.set(0, group); + // if (group == null) { + // main.setVisible(true); + // groupConfig.setVisible(false); + // return; + // } + // groupConfig.clearAllWidgets(); + // groupConfig.addWidget(new LabelWidget(0, 5, () -> { + // String currentName = ""; + // if (configGroup.get(0) != null) { + // currentName = configGroup.get(0).getName(); + // } + // return Component.translatable("gtceu.central_monitor.gui.currently_editing", currentName).getString(); + // })); + // for (int i = 0; i < 8; i++) { + // SlotWidget slot = new SlotWidget(group.getPlaceholderSlotsHandler(), i, -38, 16 * i + 46); + // slot.setHoverTooltips(GTStringUtils + // .toImmutable(LangHandler.getMultiLang("gtceu.gui.computer_monitor_cover.slot_tooltip", i + 1))); + // groupConfig.addWidget(slot); + // } + // SlotWidget slot = new SlotWidget( + // group.getItemStackHandler(), 0, + // 0, 20); + // WidgetGroup itemUI = new WidgetGroup(40, 20, 100, 100); + // Runnable changeListener = () -> { + // if (slot.getLastItem().is(slot.getItem().getItem())) return; + // itemUI.clearAllWidgets(); + // if (slot.getItem().getItem() instanceof IComponentItem item) { + // for (IItemComponent component : item.getComponents()) { + // if (component instanceof IMonitorModuleItem module) { + // itemUI.addWidget(module.createUIWidget(slot.getItem(), this, group)); + // } + // } + // } + // }; + // slot.setChangeListener(changeListener); + // changeListener.run(); + // groupConfig.addWidget(itemUI); + // groupConfig.addWidget(slot); + // main.setVisible(false); + // groupConfig.setVisible(true); + // }; + // builder.addWidget(groupConfig); + // DraggableScrollableWidgetGroup groupList = new DraggableScrollableWidgetGroup(-100, 50, 70, 80); + // + // List>>> imageButtons = new ArrayList<>(); + // Map rightClickCallbacks = new HashMap<>(); + // int[] dataSlot = new int[2]; // list to be able to modify it in lambdas + // dataSlot[0] = 1; // the slot (index starts from 1) + // dataSlot[1] = 9; // amount of slots + // IntInputWidget dataSlotInput = new IntInputWidget(120, 20, 60, -20, () -> dataSlot[0], + // n -> dataSlot[0] = Mth.clamp(n, 1, dataSlot[1])); + // dataSlotInput.setVisible(false); + // builder.addWidget(dataSlotInput); + // + // Consumer addGroupToList = group -> { + // ButtonWidget label = new ButtonWidget(20, groupList.widgets.size() * 15 + 5, 60, 10, null); + // TextTexture text = new TextTexture(group.getName()); + // text.setType(TextTexture.TextType.LEFT); + // label.setButtonTexture(text); + // label.setOnPressCallback(click -> { + // group.getRelativePositions().forEach(pos -> { + // BlockPos rel = toRelative(pos); + // if (imageButtons.size() - 1 < rel.getY()) return; + // if (imageButtons.get(rel.getY()).size() - 1 < rel.getX()) return; + // imageButtons.get(rel.getY()).get(rel.getX()).accept(null); + // }); + // if (group.getTargetRaw() != null) { + // rightClickCallbacks.getOrDefault(group.getTargetRaw(), () -> {}).run(); + // } + // }); + // groupList.addWidget(label); + // + // ButtonWidget configButton = new ButtonWidget( + // 0, label.getSelfPositionY() - 3, + // 16, 16, + // GuiTextures.IO_CONFIG_COVER_SETTINGS, + // click -> { + // if (configGroup.get(0) == null) { + // openGroupConfig.accept(group); + // } else { + // openGroupConfig.accept(null); + // } + // }); + // groupList.addWidget(configButton); + // }; + // + // monitorGroups.forEach(addGroupToList); + // builder.addWidget(groupList); + // main.addWidget(options); + // ButtonWidget removeFromGroupButton = new ButtonWidget(0, 0, 60, 20, null); + // removeFromGroupButton.setButtonTexture(new TextTexture("gtceu.central_monitor.gui.remove_from_group")); + // removeFromGroupButton.setVisible(false); + // ButtonWidget setTargetButton = new ButtonWidget(0, 15, 60, 20, null); + // setTargetButton.setButtonTexture(new TextTexture("gtceu.central_monitor.gui.set_target")); + // setTargetButton.setVisible(false); + // ButtonWidget createGroupButton = new ButtonWidget(0, 0, 60, 20, null); + // createGroupButton.setOnPressCallback(click -> { + // MonitorGroup group = new MonitorGroup( + // Component.translatable("gtceu.gui.central_monitor.group_default_name", monitorGroups.size() + 1) + // .getString()); + // for (IMonitorComponent component : selectedComponents) { + // if (isInAnyGroup(component)) return; + // group.add(component.getPos()); + // } + // monitorGroups.add(group); + // addGroupToList.accept(group); + // + // createGroupButton.setVisible(false); + // removeFromGroupButton.setVisible(true); + // Iterator it = selectedComponents.iterator(); + // while (it.hasNext()) { + // IMonitorComponent c = it.next(); + // BlockPos rel = toRelative(c.getPos()); + // imageButtons.get(rel.getY()).get(rel.getX()).accept(it); + // } + // if (!selectedTargets.isEmpty()) { + // rightClickCallbacks.getOrDefault(selectedTargets.get(0).getPos(), () -> {}).run(); + // } + // }); + // setTargetButton.setOnPressCallback(click -> { + // MonitorGroup group = null; + // for (MonitorGroup group2 : monitorGroups) { + // for (IMonitorComponent component : selectedComponents) { + // if (group2.contains(component.getPos())) { + // group = group2; + // break; + // } + // } + // if (group != null) break; + // } + // if (group == null) return; + // if (selectedTargets.isEmpty()) group.setTarget(null); + // else { + // group.setTarget(selectedTargets.get(0).getPos()); + // group.setDataSlot(dataSlot[0] - 1); + // } + // }); + // removeFromGroupButton.setOnPressCallback(click -> { + // for (MonitorGroup group : monitorGroups) { + // for (IMonitorComponent component : selectedComponents) group.remove(component.getPos()); + // } + // Iterator itg = monitorGroups.iterator(); + // while (itg.hasNext()) { + // MonitorGroup group = itg.next(); + // if (group.isEmpty()) { + // clearInventory(group.getItemStackHandler()); + // clearInventory(group.getPlaceholderSlotsHandler()); + // itg.remove(); + // } + // } + // groupList.clearAllWidgets(); + // monitorGroups.forEach(addGroupToList); + // + // removeFromGroupButton.setVisible(false); + // createGroupButton.setVisible(true); + // Iterator it = selectedComponents.iterator(); + // while (it.hasNext()) { + // IMonitorComponent c = it.next(); + // BlockPos rel = toRelative(c.getPos()); + // if (imageButtons.size() - 1 < rel.getY()) continue; + // if (imageButtons.get(rel.getY()).size() - 1 < rel.getX()) continue; + // imageButtons.get(rel.getY()).get(rel.getX()).accept(it); + // } + // if (!selectedTargets.isEmpty()) { + // rightClickCallbacks.getOrDefault(selectedTargets.get(0).getPos(), () -> {}).run(); + // } + // }); + // createGroupButton.setButtonTexture(new TextTexture("gtceu.central_monitor.gui.create_group")); + // createGroupButton.setVisible(false); + // options.addWidget(removeFromGroupButton); + // options.addWidget(createGroupButton); + // options.addWidget(setTargetButton); + // int startX = 20; + // int startY = 30; + // for (int row = 0; row <= downDist + upDist; row++) { + // imageButtons.add(new ArrayList<>()); + // for (int col = 0; col <= leftDist + rightDist; col++) { + // IGuiTexture texture = getComponentTexture(row, col); + // GuiTextureGroup textures = new GuiTextureGroup(texture, new ColorBorderTexture(2, 0xFFFFFF)); + // IMonitorComponent component = getComponent(row, col); + // if (component == null) { + // GTUtil.getLast(imageButtons).add(it -> {}); + // continue; + // } + // ButtonWidget img = new ButtonWidget(startX + (16 * col), startY + (16 * row), 16, 16, textures, null); + // Consumer> callback = (it) -> { + // if (!component.isMonitor()) return; + // if (selectedComponents.contains(component)) { + // if (it == null) { + // selectedComponents.remove(component); + // } else { + // it.remove(); + // } + // + // if (!selectedTargets.isEmpty() && selectedTargets.get(0) == component) { + // ColorRectTexture rect = new ColorRectTexture(Color.BLUE); + // textures.setTextures(rect, texture); + // } else { + // textures.setTextures(texture); + // } + // + // createGroupButton.setVisible(selectedComponents.stream().noneMatch(this::isInAnyGroup)); + // removeFromGroupButton.setVisible(selectedComponents.stream().allMatch(this::isInAnyGroup)); + // setTargetButton.setVisible(removeFromGroupButton.isVisible()); + // + // if (selectedComponents.isEmpty()) { + // createGroupButton.setVisible(false); + // removeFromGroupButton.setVisible(false); + // setTargetButton.setVisible(false); + // } + // } else { + // boolean inAnyGroup = isInAnyGroup(component); + // // yes I know this is terrible but if it works don't touch it :) + // if (selectedComponents.isEmpty() && !inAnyGroup) createGroupButton.setVisible(true); + // if (inAnyGroup) createGroupButton.setVisible(false); + // if (selectedComponents.isEmpty() && inAnyGroup) { + // removeFromGroupButton.setVisible(true); + // setTargetButton.setVisible(true); + // } + // if (!inAnyGroup) { + // removeFromGroupButton.setVisible(false); + // setTargetButton.setVisible(false); + // } + // selectedComponents.add(component); + // ColorRectTexture rect = new ColorRectTexture( + // (selectedTargets.isEmpty() || selectedTargets.get(0) != component) ? Color.RED : + // Color.PINK); + // textures.setTextures(rect, texture); + // } + // if (isInAnyGroup(component)) { + // monitorGroups.forEach(group -> { + // if (group.contains(component.getPos())) { + // img.setHoverTooltips( + // Component.translatable("gtceu.gui.central_monitor.group", group.getName())); + // } + // }); + // } else { + // img.setHoverTooltips(Component.translatable("gtceu.gui.central_monitor.group", + // Component.translatable("gtceu.gui.central_monitor.none"))); + // } + // }; + // Runnable rightClickCallback = () -> { + // if (!selectedTargets.isEmpty()) { + // if (selectedTargets.get(0).getPos() == component.getPos()) { + // selectedTargets.clear(); + // if (selectedComponents.contains(component)) { + // ColorRectTexture rect = new ColorRectTexture(Color.RED); + // textures.setTextures(rect, texture); + // } else { + // textures.setTextures(texture); + // } + // dataSlotInput.setVisible(false); + // return; + // } else { + // try { + // rightClickCallbacks.get(selectedTargets.get(0).getPos()).run(); + // } catch (StackOverflowError e) { + // GTCEu.LOGGER.error( + // "Stack overflow when right-clicking monitor component {} at {} (selectedTarget is {} at {})", + // component, component.getPos(), selectedTargets.get(0), + // selectedTargets.get(0).getPos()); + // } + // } + // } + // selectedTargets.add(component); + // ColorRectTexture rect; + // if (selectedComponents.contains(component)) { + // rect = new ColorRectTexture(Color.PINK); + // } else { + // rect = new ColorRectTexture(Color.BLUE); + // } + // textures.setTextures(rect, texture); + // if (component.getDataItems() != null) { + // IItemHandler dataItems = component.getDataItems(); + // MonitorGroup selectedGroup = null; + // for (MonitorGroup group : monitorGroups) { + // for (IMonitorComponent c : selectedComponents) { + // if (group.contains(c.getPos())) { + // if (selectedGroup == null || selectedGroup == group) { + // selectedGroup = group; + // } else { + // selectedGroup = null; + // break; + // } + // } + // } + // } + // if (selectedGroup != null) { + // dataSlot[0] = selectedGroup.getDataSlot() + 1; + // } + // dataSlot[1] = dataItems.getSlots(); + // dataSlotInput.setVisible(true); + // } + // }; + // if (isInAnyGroup(component)) { + // monitorGroups.forEach(group -> { + // if (group.contains(component.getPos())) img.setHoverTooltips( + // Component.translatable("gtceu.gui.central_monitor.group", group.getName())); + // }); + // } else { + // img.setHoverTooltips(Component.translatable("gtceu.gui.central_monitor.group", + // Component.translatable("gtceu.gui.central_monitor.none"))); + // } + // img.setOnPressCallback(click -> { + // if (click.button == 0) callback.accept(null); + // else if (click.button == 1) rightClickCallback.run(); + // }); + // componentSelection.addWidget(img); + // GTUtil.getLast(imageButtons).add(callback); + // rightClickCallbacks.put(component.getPos(), rightClickCallback); + // } + // } + // builder.addWidget(main); + // return builder; + // } @Override public IGuiTexture getComponentIcon() { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java index c1ae2a8a6c2..ecf4beccd52 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java @@ -9,7 +9,6 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.SimpleGeneratorMachine; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMufflerMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; @@ -41,13 +40,10 @@ import com.lowdragmc.lowdraglib.utils.BlockInfo; -import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.HoverEvent; -import net.minecraft.network.chat.Style; import net.minecraft.util.Mth; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; @@ -74,7 +70,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class CleanroomMachine extends WorkableElectricMultiblockMachine - implements IDisplayUIMachine, IDataInfoProvider { + implements IDataInfoProvider { public static final int CLEAN_AMOUNT_THRESHOLD = 95; public static final int MIN_CLEAN_AMOUNT = 0; @@ -456,56 +452,58 @@ protected boolean isMachineBanned(MetaMachine machine) { return machine instanceof PrimitivePumpMachine; } - @Override - public void addDisplayText(List textList) { - if (isFormed()) { - var maxVoltage = getMaxVoltage(); - if (maxVoltage > 0) { - String voltageName = GTValues.VNF[GTUtil.getFloorTierByVoltage(maxVoltage)]; - textList.add(Component.translatable("gtceu.multiblock.max_energy_per_tick", maxVoltage, voltageName)); - } - - if (cleanroomType != null) { - textList.add(Component.translatable(cleanroomType.getTranslationKey())); - } - - if (!isWorkingEnabled()) { - textList.add(Component.translatable("gtceu.multiblock.work_paused")); - - } else if (isActive()) { - textList.add(Component.translatable("gtceu.multiblock.running")); - int currentProgress = (int) (recipeLogic.getProgressPercent() * 100); - double maxInSec = (float) recipeLogic.getDuration() / 20.0f; - double currentInSec = (float) recipeLogic.getProgress() / 20.0f; - textList.add( - Component.translatable("gtceu.multiblock.progress", String.format("%.2f", (float) currentInSec), - String.format("%.2f", (float) maxInSec), currentProgress)); - } else { - textList.add(Component.translatable("gtceu.multiblock.idling")); - } - - if (recipeLogic.isWaiting()) { - textList.add(Component.translatable("gtceu.multiblock.waiting") - .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); - } - - if (cleanroomProviderTrait.isActive()) { - textList.add(Component.translatable("gtceu.multiblock.cleanroom.clean_state")); - } else { - textList.add(Component.translatable("gtceu.multiblock.cleanroom.dirty_state")); - } - textList.add(Component.translatable("gtceu.multiblock.cleanroom.clean_amount", this.cleanAmount)); - textList.add(Component.translatable("gtceu.multiblock.dimensions.0")); - textList.add(Component.translatable("gtceu.multiblock.dimensions.1", lDist + rDist + 1, hDist + 1, - fDist + bDist + 1)); - } else { - Component tooltip = Component.translatable("gtceu.multiblock.invalid_structure.tooltip") - .withStyle(ChatFormatting.GRAY); - textList.add(Component.translatable("gtceu.multiblock.invalid_structure") - .withStyle(Style.EMPTY.withColor(ChatFormatting.RED) - .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, tooltip)))); - } - } + /* + * @Override + * public void addDisplayText(List textList) { + * if (isFormed()) { + * var maxVoltage = getMaxVoltage(); + * if (maxVoltage > 0) { + * String voltageName = GTValues.VNF[GTUtil.getFloorTierByVoltage(maxVoltage)]; + * textList.add(Component.translatable("gtceu.multiblock.max_energy_per_tick", maxVoltage, voltageName)); + * } + * + * if (cleanroomType != null) { + * textList.add(Component.translatable(cleanroomType.getTranslationKey())); + * } + * + * if (!isWorkingEnabled()) { + * textList.add(Component.translatable("gtceu.multiblock.work_paused")); + * + * } else if (isActive()) { + * textList.add(Component.translatable("gtceu.multiblock.running")); + * int currentProgress = (int) (recipeLogic.getProgressPercent() * 100); + * double maxInSec = (float) recipeLogic.getDuration() / 20.0f; + * double currentInSec = (float) recipeLogic.getProgress() / 20.0f; + * textList.add( + * Component.translatable("gtceu.multiblock.progress", String.format("%.2f", (float) currentInSec), + * String.format("%.2f", (float) maxInSec), currentProgress)); + * } else { + * textList.add(Component.translatable("gtceu.multiblock.idling")); + * } + * + * if (recipeLogic.isWaiting()) { + * textList.add(Component.translatable("gtceu.multiblock.waiting") + * .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); + * } + * + * if (cleanroomProviderTrait.isActive()) { + * textList.add(Component.translatable("gtceu.multiblock.cleanroom.clean_state")); + * } else { + * textList.add(Component.translatable("gtceu.multiblock.cleanroom.dirty_state")); + * } + * textList.add(Component.translatable("gtceu.multiblock.cleanroom.clean_amount", this.cleanAmount)); + * textList.add(Component.translatable("gtceu.multiblock.dimensions.0")); + * textList.add(Component.translatable("gtceu.multiblock.dimensions.1", lDist + rDist + 1, hDist + 1, + * fDist + bDist + 1)); + * } else { + * Component tooltip = Component.translatable("gtceu.multiblock.invalid_structure.tooltip") + * .withStyle(ChatFormatting.GRAY); + * textList.add(Component.translatable("gtceu.multiblock.invalid_structure") + * .withStyle(Style.EMPTY.withColor(ChatFormatting.RED) + * .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, tooltip)))); + * } + * } + */ /** * Adjust the cleanroom's clean amount diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FluidDrillMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FluidDrillMachine.java index cd114c360ee..9a26468df25 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FluidDrillMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FluidDrillMachine.java @@ -14,23 +14,15 @@ import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.common.machine.trait.FluidDrillLogic; -import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTUtil; -import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.HoverEvent; -import net.minecraft.network.chat.Style; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.material.Fluid; import lombok.Getter; import org.jetbrains.annotations.NotNull; -import java.util.List; - import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @@ -59,42 +51,42 @@ public int getEnergyTier() { return Math.min(this.tier + 1, Math.max(this.tier, GTUtil.getFloorTierByVoltage(energyCont.getInputVoltage()))); } - @Override - public void addDisplayText(List textList) { - if (isFormed()) { - int energyContainer = getEnergyTier(); - long maxVoltage = GTValues.V[energyContainer]; - String voltageName = GTValues.VNF[energyContainer]; - textList.add(Component.translatable("gtceu.multiblock.max_energy_per_tick", maxVoltage, voltageName)); - - if (getRecipeLogic().getVeinFluid() != null) { - // Fluid name - Fluid drilledFluid = getRecipeLogic().getVeinFluid(); - Component fluidInfo = drilledFluid.getFluidType().getDescription().copy() - .withStyle(ChatFormatting.GREEN); - textList.add(Component.translatable("gtceu.multiblock.fluid_rig.drilled_fluid", fluidInfo) - .withStyle(ChatFormatting.GRAY)); - - // Fluid amount - Component amountInfo = Component.literal(FormattingUtil.formatNumbers( - getRecipeLogic().getFluidToProduce() * 20L / FluidDrillLogic.MAX_PROGRESS) + - " mB/s").withStyle(ChatFormatting.BLUE); - textList.add(Component.translatable("gtceu.multiblock.fluid_rig.fluid_amount", amountInfo) - .withStyle(ChatFormatting.GRAY)); - } else { - Component noFluid = Component.translatable("gtceu.multiblock.fluid_rig.no_fluid_in_area") - .withStyle(ChatFormatting.RED); - textList.add(Component.translatable("gtceu.multiblock.fluid_rig.drilled_fluid", noFluid) - .withStyle(ChatFormatting.GRAY)); - } - } else { - Component tooltip = Component.translatable("gtceu.multiblock.invalid_structure.tooltip") - .withStyle(ChatFormatting.GRAY); - textList.add(Component.translatable("gtceu.multiblock.invalid_structure") - .withStyle(Style.EMPTY.withColor(ChatFormatting.RED) - .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, tooltip)))); - } - } + // @Override + // public void addDisplayText(List textList) { + // if (isFormed()) { + // int energyContainer = getEnergyTier(); + // long maxVoltage = GTValues.V[energyContainer]; + // String voltageName = GTValues.VNF[energyContainer]; + // textList.add(Component.translatable("gtceu.multiblock.max_energy_per_tick", maxVoltage, voltageName)); + // + // if (getRecipeLogic().getVeinFluid() != null) { + // // Fluid name + // Fluid drilledFluid = getRecipeLogic().getVeinFluid(); + // Component fluidInfo = drilledFluid.getFluidType().getDescription().copy() + // .withStyle(ChatFormatting.GREEN); + // textList.add(Component.translatable("gtceu.multiblock.fluid_rig.drilled_fluid", fluidInfo) + // .withStyle(ChatFormatting.GRAY)); + // + // // Fluid amount + // Component amountInfo = Component.literal(FormattingUtil.formatNumbers( + // getRecipeLogic().getFluidToProduce() * 20L / FluidDrillLogic.MAX_PROGRESS) + + // " mB/s").withStyle(ChatFormatting.BLUE); + // textList.add(Component.translatable("gtceu.multiblock.fluid_rig.fluid_amount", amountInfo) + // .withStyle(ChatFormatting.GRAY)); + // } else { + // Component noFluid = Component.translatable("gtceu.multiblock.fluid_rig.no_fluid_in_area") + // .withStyle(ChatFormatting.RED); + // textList.add(Component.translatable("gtceu.multiblock.fluid_rig.drilled_fluid", noFluid) + // .withStyle(ChatFormatting.GRAY)); + // } + // } else { + // Component tooltip = Component.translatable("gtceu.multiblock.invalid_structure.tooltip") + // .withStyle(ChatFormatting.GRAY); + // textList.add(Component.translatable("gtceu.multiblock.invalid_structure") + // .withStyle(Style.EMPTY.withColor(ChatFormatting.RED) + // .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, tooltip)))); + // } + // } public static int getDepletionChance(int tier) { if (tier == GTValues.MV) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java index 11331b040d7..f821ba2d02a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java @@ -272,15 +272,15 @@ public long getMaxVoltage() { ////////////////////////////////////// // ******** GUI *********// ////////////////////////////////////// - @Override - public void addDisplayText(List textList) { - super.addDisplayText(textList); - if (isFormed()) { - textList.add(Component.translatable("gtceu.multiblock.fusion_reactor.energy", - this.energyContainer.getEnergyStored(), this.energyContainer.getEnergyCapacity())); - textList.add(Component.translatable("gtceu.multiblock.fusion_reactor.heat", heat)); - } - } + // @Override + // public void addDisplayText(List textList) { + // super.addDisplayText(textList); + // if (isFormed()) { + // textList.add(Component.translatable("gtceu.multiblock.fusion_reactor.energy", + // this.energyContainer.getEnergyStored(), this.energyContainer.getEnergyCapacity())); + // textList.add(Component.translatable("gtceu.multiblock.fusion_reactor.heat", heat)); + // } + // } public static void addEUToStartLabel(GTRecipe recipe, WidgetGroup group) { long euToStart = recipe.data.getLong("eu_to_start"); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/LargeMinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/LargeMinerMachine.java index a2f4a715e9b..314247ee309 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/LargeMinerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/LargeMinerMachine.java @@ -21,14 +21,9 @@ import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.GTUtil; -import com.lowdragmc.lowdraglib.gui.util.ClickData; -import com.lowdragmc.lowdraglib.gui.widget.ComponentPanelWidget; - -import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.Style; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; @@ -184,54 +179,54 @@ public boolean drainInput(boolean simulate) { ////////////////////////////////////// // *********** GUI ***********// ////////////////////////////////////// - @Override - public void addDisplayText(List textList) { - super.addDisplayText(textList); - if (this.isFormed()) { - int workingAreaChunks = getRecipeLogic().getCurrentRadius() * 2 / CHUNK_LENGTH; - int workingArea = IMiner.getWorkingArea(getRecipeLogic().getCurrentRadius()); - textList.add(Component.translatable("gtceu.machine.miner.startx", - getRecipeLogic().getX() == Integer.MAX_VALUE ? 0 : getRecipeLogic().getX())); - textList.add(Component.translatable("gtceu.machine.miner.starty", - getRecipeLogic().getY() == Integer.MAX_VALUE ? 0 : getRecipeLogic().getY())); - textList.add(Component.translatable("gtceu.machine.miner.startz", - getRecipeLogic().getZ() == Integer.MAX_VALUE ? 0 : getRecipeLogic().getZ())); - textList.add(Component.translatable("gtceu.universal.tooltip.silk_touch") - .append(ComponentPanelWidget.withButton(Component.literal("[") - .append(getRecipeLogic().isSilkTouchMode() ? - Component.translatable("gtceu.creative.activity.on") : - Component.translatable("gtceu.creative.activity.off")) - .append(Component.literal("]")), "silk_touch"))); - textList.add(Component.translatable("gtceu.universal.tooltip.chunk_mode") - .append(ComponentPanelWidget.withButton(Component.literal("[") - .append(getRecipeLogic().isChunkMode() ? - Component.translatable("gtceu.creative.activity.on") : - Component.translatable("gtceu.creative.activity.off")) - .append(Component.literal("]")), "chunk_mode"))); - if (getRecipeLogic().isChunkMode()) { - textList.add(Component.translatable("gtceu.universal.tooltip.working_area_chunks", workingAreaChunks, - workingAreaChunks)); - } else { - textList.add(Component.translatable("gtceu.universal.tooltip.working_area", workingArea, workingArea)); - } - if (getRecipeLogic().isDone()) { - textList.add(Component.translatable("gtceu.multiblock.large_miner.done") - .setStyle(Style.EMPTY.withColor(ChatFormatting.GREEN))); - } - } - } - - @Override - public void handleDisplayClick(String componentData, ClickData clickData) { - if (!clickData.isRemote) { - if (componentData.equals("chunk_mode")) { - getRecipeLogic().setChunkMode(!getRecipeLogic().isChunkMode()); - } - if (componentData.equals("silk_touch")) { - getRecipeLogic().setSilkTouchMode(!getRecipeLogic().isSilkTouchMode()); - } - } - } + // @Override + // public void addDisplayText(List textList) { + // super.addDisplayText(textList); + // if (this.isFormed()) { + // int workingAreaChunks = getRecipeLogic().getCurrentRadius() * 2 / CHUNK_LENGTH; + // int workingArea = IMiner.getWorkingArea(getRecipeLogic().getCurrentRadius()); + // textList.add(Component.translatable("gtceu.machine.miner.startx", + // getRecipeLogic().getX() == Integer.MAX_VALUE ? 0 : getRecipeLogic().getX())); + // textList.add(Component.translatable("gtceu.machine.miner.starty", + // getRecipeLogic().getY() == Integer.MAX_VALUE ? 0 : getRecipeLogic().getY())); + // textList.add(Component.translatable("gtceu.machine.miner.startz", + // getRecipeLogic().getZ() == Integer.MAX_VALUE ? 0 : getRecipeLogic().getZ())); + // textList.add(Component.translatable("gtceu.universal.tooltip.silk_touch") + // .append(ComponentPanelWidget.withButton(Component.literal("[") + // .append(getRecipeLogic().isSilkTouchMode() ? + // Component.translatable("gtceu.creative.activity.on") : + // Component.translatable("gtceu.creative.activity.off")) + // .append(Component.literal("]")), "silk_touch"))); + // textList.add(Component.translatable("gtceu.universal.tooltip.chunk_mode") + // .append(ComponentPanelWidget.withButton(Component.literal("[") + // .append(getRecipeLogic().isChunkMode() ? + // Component.translatable("gtceu.creative.activity.on") : + // Component.translatable("gtceu.creative.activity.off")) + // .append(Component.literal("]")), "chunk_mode"))); + // if (getRecipeLogic().isChunkMode()) { + // textList.add(Component.translatable("gtceu.universal.tooltip.working_area_chunks", workingAreaChunks, + // workingAreaChunks)); + // } else { + // textList.add(Component.translatable("gtceu.universal.tooltip.working_area", workingArea, workingArea)); + // } + // if (getRecipeLogic().isDone()) { + // textList.add(Component.translatable("gtceu.multiblock.large_miner.done") + // .setStyle(Style.EMPTY.withColor(ChatFormatting.GREEN))); + // } + // } + // } + // + // @Override + // public void handleDisplayClick(String componentData, ClickData clickData) { + // if (!clickData.isRemote) { + // if (componentData.equals("chunk_mode")) { + // getRecipeLogic().setChunkMode(!getRecipeLogic().isChunkMode()); + // } + // if (componentData.equals("silk_touch")) { + // getRecipeLogic().setSilkTouchMode(!getRecipeLogic().isSilkTouchMode()); + // } + // } + // } ////////////////////////////////////// // ******* Interaction *******// diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/DataBankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/DataBankMachine.java index 00f643a92c3..39d188d78e4 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/DataBankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/DataBankMachine.java @@ -7,11 +7,8 @@ import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; -import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; @@ -37,7 +34,7 @@ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault public class DataBankMachine extends WorkableElectricMultiblockMachine - implements IFancyUIMachine, IDisplayUIMachine, IControllable { + implements IControllable { public static final int EUT_PER_HATCH = GTValues.VA[GTValues.EV]; public static final int EUT_PER_HATCH_CHAINED = GTValues.VA[GTValues.LuV]; @@ -175,17 +172,17 @@ public void tick() { updateTickSubscription(); } - @Override - public void addDisplayText(List textList) { - MultiblockDisplayText.builder(textList, isFormed()) - .setWorkingStatus(true, isActive() && isWorkingEnabled()) // transform into two-state system for display - .setWorkingStatusKeys( - "gtceu.multiblock.idling", - "gtceu.multiblock.idling", - "gtceu.multiblock.data_bank.providing") - .addEnergyUsageExactLine(getEnergyUsage()) - .addWorkingStatusLine(); - } + // @Override + // public void addDisplayText(List textList) { + // MultiblockDisplayText.builder(textList, isFormed()) + // .setWorkingStatus(true, isActive() && isWorkingEnabled()) // transform into two-state system for display + // .setWorkingStatusKeys( + // "gtceu.multiblock.idling", + // "gtceu.multiblock.idling", + // "gtceu.multiblock.data_bank.providing") + // .addEnergyUsageExactLine(getEnergyUsage()) + // .addWorkingStatusLine(); + // } /* * @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/HPCAMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/HPCAMachine.java index 32d0561fcba..bcaf0ee32e5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/HPCAMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/HPCAMachine.java @@ -8,11 +8,9 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.util.TimedProgressSupplier; -import com.gregtechceu.gtceu.api.gui.widget.ExtendedProgressWidget; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; -import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; @@ -23,16 +21,9 @@ import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.FluidHandlerList; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; -import com.gregtechceu.gtceu.utils.GTUtil; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.ProgressTexture; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; -import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; @@ -57,7 +48,6 @@ import org.jetbrains.annotations.Nullable; import java.util.*; -import java.util.function.Supplier; import javax.annotation.ParametersAreNonnullByDefault; @@ -248,67 +238,67 @@ private void consumeEnergy() { } } - @Override - public Widget createUIWidget() { - WidgetGroup builder = (WidgetGroup) super.createUIWidget(); - // Create the hover grid - builder.addWidget(new ExtendedProgressWidget( - () -> hpcaHandler.getAllocatedCWUt() > 0 ? progressSupplier.getAsDouble() : 0, - 74, 57, 47, 47, GuiTextures.HPCA_COMPONENT_OUTLINE) - .setServerTooltipSupplier(hpcaHandler::addInfo) - .setFillDirection(ProgressTexture.FillDirection.LEFT_TO_RIGHT)); - int startX = 76; - int startY = 59; - - // we need to know what components we have on the client - if (getLevel().isClientSide) { - if (isFormed) { - hpcaHandler.tryGatherClientComponents(this.getLevel(), this.getBlockPos(), this.getFrontFacing(), - this.getUpwardsFacing(), this.isFlipped); - } else { - hpcaHandler.clearClientComponents(); - } - } - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) { - final int index = i * 3 + j; - Supplier textureSupplier = () -> hpcaHandler.getComponentTexture(index); - builder.addWidget(new ImageWidget(startX + (15 * j), startY + (15 * i), 13, 13, textureSupplier)); - } - } - return builder; - } - - @Override - public void addDisplayText(List textList) { - MultiblockDisplayText.builder(textList, isFormed()) - .setWorkingStatus(true, hpcaHandler.getAllocatedCWUt() > 0) // transform into two-state system for - // display - .setWorkingStatusKeys( - "gtceu.multiblock.idling", - "gtceu.multiblock.idling", - "gtceu.multiblock.data_bank.providing") - .addCustom(tl -> { - if (isFormed()) { - // Energy Usage - tl.add(Component.translatable( - "gtceu.multiblock.hpca.energy", - FormattingUtil.formatNumbers(hpcaHandler.cachedEUt), - FormattingUtil.formatNumbers(hpcaHandler.getMaxEUt()), - GTValues.VNF[GTUtil.getTierByVoltage(hpcaHandler.getMaxEUt())]) - .withStyle(ChatFormatting.GRAY)); - - // Provided Computation - Component cwutInfo = Component.literal( - hpcaHandler.cachedCWUt + " / " + hpcaHandler.getMaxCWUt() + " CWU/t") - .withStyle(ChatFormatting.AQUA); - tl.add(Component.translatable( - "gtceu.multiblock.hpca.computation", - cwutInfo).withStyle(ChatFormatting.GRAY)); - } - }) - .addWorkingStatusLine(); - } + // @Override + // public Widget createUIWidget() { + // WidgetGroup builder = (WidgetGroup) super.createUIWidget(); + // // Create the hover grid + // builder.addWidget(new ExtendedProgressWidget( + // () -> hpcaHandler.getAllocatedCWUt() > 0 ? progressSupplier.getAsDouble() : 0, + // 74, 57, 47, 47, GuiTextures.HPCA_COMPONENT_OUTLINE) + // .setServerTooltipSupplier(hpcaHandler::addInfo) + // .setFillDirection(ProgressTexture.FillDirection.LEFT_TO_RIGHT)); + // int startX = 76; + // int startY = 59; + // + // // we need to know what components we have on the client + // if (getLevel().isClientSide) { + // if (isFormed) { + // hpcaHandler.tryGatherClientComponents(this.getLevel(), this.getPos(), this.getFrontFacing(), + // this.getUpwardsFacing(), this.isFlipped); + // } else { + // hpcaHandler.clearClientComponents(); + // } + // } + // for (int i = 0; i < 3; i++) { + // for (int j = 0; j < 3; j++) { + // final int index = i * 3 + j; + // Supplier textureSupplier = () -> hpcaHandler.getComponentTexture(index); + // builder.addWidget(new ImageWidget(startX + (15 * j), startY + (15 * i), 13, 13, textureSupplier)); + // } + // } + // return builder; + // } + // + // @Override + // public void addDisplayText(List textList) { + // MultiblockDisplayText.builder(textList, isFormed()) + // .setWorkingStatus(true, hpcaHandler.getAllocatedCWUt() > 0) // transform into two-state system for + // // display + // .setWorkingStatusKeys( + // "gtceu.multiblock.idling", + // "gtceu.multiblock.idling", + // "gtceu.multiblock.data_bank.providing") + // .addCustom(tl -> { + // if (isFormed()) { + // // Energy Usage + // tl.add(Component.translatable( + // "gtceu.multiblock.hpca.energy", + // FormattingUtil.formatNumbers(hpcaHandler.cachedEUt), + // FormattingUtil.formatNumbers(hpcaHandler.getMaxEUt()), + // GTValues.VNF[GTUtil.getTierByVoltage(hpcaHandler.getMaxEUt())]) + // .withStyle(ChatFormatting.GRAY)); + // + // // Provided Computation + // Component cwutInfo = Component.literal( + // hpcaHandler.cachedCWUt + " / " + hpcaHandler.getMaxCWUt() + " CWU/t") + // .withStyle(ChatFormatting.AQUA); + // tl.add(Component.translatable( + // "gtceu.multiblock.hpca.computation", + // cwutInfo).withStyle(ChatFormatting.GRAY)); + // } + // }) + // .addWorkingStatusLine(); + // } private ChatFormatting getDisplayTemperatureColor() { if (temperature < 500) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/NetworkSwitchMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/NetworkSwitchMachine.java index d7b119c7492..01fe43a3ee9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/NetworkSwitchMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/NetworkSwitchMachine.java @@ -7,12 +7,10 @@ import com.gregtechceu.gtceu.api.capability.recipe.CWURecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.trait.NotifiableComputationContainer; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.network.chat.Component; import net.minecraft.world.level.block.Block; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; @@ -116,18 +114,18 @@ public boolean canBridge(@NotNull Collection seen) return true; } - @Override - public void addDisplayText(List textList) { - MultiblockDisplayText.builder(textList, isFormed()) - .setWorkingStatus(true, isActive() && isWorkingEnabled()) // transform into two-state system for display - .setWorkingStatusKeys( - "gtceu.multiblock.idling", - "gtceu.multiblock.idling", - "gtceu.multiblock.data_bank.providing") - .addEnergyUsageExactLine(getEnergyUsage()) - .addComputationUsageLine(computationHandler.getMaxCWUtForDisplay()) - .addWorkingStatusLine(); - } + // @Override + // public void addDisplayText(List textList) { + // MultiblockDisplayText.builder(textList, isFormed()) + // .setWorkingStatus(true, isActive() && isWorkingEnabled()) // transform into two-state system for display + // .setWorkingStatusKeys( + // "gtceu.multiblock.idling", + // "gtceu.multiblock.idling", + // "gtceu.multiblock.data_bank.providing") + // .addEnergyUsageExactLine(getEnergyUsage()) + // .addComputationUsageLine(computationHandler.getMaxCWUtForDisplay()) + // .addWorkingStatusLine(); + // } /* * @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/ResearchStationMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/ResearchStationMachine.java index ba746372013..a2184f44fa0 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/ResearchStationMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/ResearchStationMachine.java @@ -8,9 +8,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.CWURecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; -import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.ActionResult; @@ -18,21 +16,19 @@ import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; import lombok.Getter; import org.jetbrains.annotations.NotNull; import java.util.Collections; -import java.util.List; import javax.annotation.ParametersAreNonnullByDefault; @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault public class ResearchStationMachine extends WorkableElectricMultiblockMachine - implements IOpticalComputationReceiver, IDisplayUIMachine { + implements IOpticalComputationReceiver { @Getter private IOpticalComputationProvider computationProvider; @@ -100,18 +96,18 @@ public boolean regressWhenWaiting() { return false; } - @Override - public void addDisplayText(List textList) { - MultiblockDisplayText.builder(textList, isFormed()) - .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) - .setWorkingStatusKeys("gtceu.multiblock.idling", "gtceu.multiblock.work_paused", - "gtceu.multiblock.research_station.researching") - .addEnergyUsageLine(energyContainer) - .addEnergyTierLine(tier) - .addWorkingStatusLine() - // .addComputationUsageExactLine(computationProvider.getMaxCWUt()) // TODO: (Onion) - .addProgressLineOnlyPercent(recipeLogic.getProgressPercent()); - } + // @Override + // public void addDisplayText(List textList) { + // MultiblockDisplayText.builder(textList, isFormed()) + // .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) + // .setWorkingStatusKeys("gtceu.multiblock.idling", "gtceu.multiblock.work_paused", + // "gtceu.multiblock.research_station.researching") + // .addEnergyUsageLine(energyContainer) + // .addEnergyTierLine(tier) + // .addWorkingStatusLine() + // // .addComputationUsageExactLine(computationProvider.getMaxCWUt()) // TODO: (Onion) + // .addProgressLineOnlyPercent(recipeLogic.getProgressPercent()); + // } public static class ResearchStationRecipeLogic extends RecipeLogic { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeCombustionEngineMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeCombustionEngineMachine.java index 0d181339977..fcd37f5ce67 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeCombustionEngineMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeCombustionEngineMachine.java @@ -4,12 +4,8 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.fluids.store.FluidStorageKeys; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.fancy.IFancyTooltip; -import com.gregtechceu.gtceu.api.gui.fancy.TooltipsPanel; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; -import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; import com.gregtechceu.gtceu.api.recipe.GTRecipe; @@ -27,8 +23,6 @@ import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.Style; import net.minecraftforge.fluids.FluidStack; import lombok.Getter; @@ -36,7 +30,6 @@ import org.jetbrains.annotations.Nullable; import java.util.Iterator; -import java.util.List; import javax.annotation.ParametersAreNonnullByDefault; @@ -180,33 +173,33 @@ public boolean regressWhenWaiting() { // ******* GUI ********// ////////////////////////////////////// - @Override - public void addDisplayText(List textList) { - MultiblockDisplayText.Builder builder = MultiblockDisplayText.builder(textList, isFormed()) - .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()); - - long lastEUt = recipeLogic.getLastRecipe() != null ? - recipeLogic.getLastRecipe().getOutputEUt().getTotalEU() : 0; - if (isExtreme()) { - builder.addEnergyProductionLine(GTValues.V[tier + 1], lastEUt); - } else { - builder.addEnergyProductionAmpsLine(GTValues.V[tier] * 3, 3); - } - - if (isActive() && isWorkingEnabled()) { - builder.addCurrentEnergyProductionLine(lastEUt); - } - - builder.addFuelNeededLine(getRecipeFluidInputInfo(), recipeLogic.getDuration()); - - if (isFormed && isOxygenBoosted) { - final var key = isExtreme() ? "gtceu.multiblock.large_combustion_engine.liquid_oxygen_boosted" : - "gtceu.multiblock.large_combustion_engine.oxygen_boosted"; - builder.addCustom(tl -> tl.add(Component.translatable(key).withStyle(ChatFormatting.AQUA))); - } - - builder.addWorkingStatusLine(); - } + // @Override + // public void addDisplayText(List textList) { + // MultiblockDisplayText.Builder builder = MultiblockDisplayText.builder(textList, isFormed()) + // .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()); + // + // long lastEUt = recipeLogic.getLastRecipe() != null ? + // recipeLogic.getLastRecipe().getOutputEUt().getTotalEU() : 0; + // if (isExtreme()) { + // builder.addEnergyProductionLine(GTValues.V[tier + 1], lastEUt); + // } else { + // builder.addEnergyProductionAmpsLine(GTValues.V[tier] * 3, 3); + // } + // + // if (isActive() && isWorkingEnabled()) { + // builder.addCurrentEnergyProductionLine(lastEUt); + // } + // + // builder.addFuelNeededLine(getRecipeFluidInputInfo(), recipeLogic.getDuration()); + // + // if (isFormed && isOxygenBoosted) { + // final var key = isExtreme() ? "gtceu.multiblock.large_combustion_engine.liquid_oxygen_boosted" : + // "gtceu.multiblock.large_combustion_engine.oxygen_boosted"; + // builder.addCustom(tl -> tl.add(Component.translatable(key).withStyle(ChatFormatting.AQUA))); + // } + // + // builder.addWorkingStatusLine(); + // } @Nullable public String getRecipeFluidInputInfo() { @@ -224,14 +217,14 @@ public String getRecipeFluidInputInfo() { return ChatFormatting.RED + FormattingUtil.formatNumbers(neededAmount) + "mB"; } - @Override - public void attachTooltips(TooltipsPanel tooltipsPanel) { - super.attachTooltips(tooltipsPanel); - tooltipsPanel.attachTooltips(new IFancyTooltip.Basic( - () -> GuiTextures.INDICATOR_NO_STEAM.get(false), - () -> List.of(Component.translatable("gtceu.multiblock.large_combustion_engine.obstructed") - .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))), - this::isIntakesObstructed, - () -> null)); - } + // @Override + // public void attachTooltips(TooltipsPanel tooltipsPanel) { + // super.attachTooltips(tooltipsPanel); + // tooltipsPanel.attachTooltips(new IFancyTooltip.Basic( + // () -> GuiTextures.INDICATOR_NO_STEAM.get(false), + // () -> List.of(Component.translatable("gtceu.multiblock.large_combustion_engine.obstructed") + // .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))), + // this::isIntakesObstructed, + // () -> null)); + // } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeTurbineMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeTurbineMachine.java index 93f3c41bc5f..83018db0095 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeTurbineMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeTurbineMachine.java @@ -14,19 +14,13 @@ import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; -import com.gregtechceu.gtceu.utils.FormattingUtil; -import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.Style; import lombok.Getter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.List; - import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @@ -182,36 +176,36 @@ public boolean canVoidRecipeOutputs(RecipeCapability capability) { // ******* GUI ********// ////////////////////////////////////// - @Override - public void addDisplayText(List textList) { - super.addDisplayText(textList); - if (isFormed()) { - var rotorHolder = getRotorHolder(); - - if (rotorHolder != null && rotorHolder.getRotorEfficiency() > 0) { - textList.add(Component.translatable("gtceu.multiblock.turbine.rotor_speed", - FormattingUtil.formatNumbers(rotorHolder.getRotorSpeed()), - FormattingUtil.formatNumbers(rotorHolder.getMaxRotorHolderSpeed()))); - textList.add(Component.translatable("gtceu.multiblock.turbine.efficiency", - rotorHolder.getTotalEfficiency())); - - long maxProduction = getOverclockVoltage(); - long currentProduction = getCurrentProduction(); - - if (isActive()) { - textList.add(3, Component.translatable("gtceu.multiblock.turbine.energy_per_tick", - FormattingUtil.formatNumbers(currentProduction), - FormattingUtil.formatNumbers(maxProduction))); - } - - int rotorDurability = rotorHolder.getRotorDurabilityPercent(); - if (rotorDurability > MIN_DURABILITY_TO_WARN) { - textList.add(Component.translatable("gtceu.multiblock.turbine.rotor_durability", rotorDurability)); - } else { - textList.add(Component.translatable("gtceu.multiblock.turbine.rotor_durability", rotorDurability) - .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); - } - } - } - } + // @Override + // public void addDisplayText(List textList) { + // super.addDisplayText(textList); + // if (isFormed()) { + // var rotorHolder = getRotorHolder(); + // + // if (rotorHolder != null && rotorHolder.getRotorEfficiency() > 0) { + // textList.add(Component.translatable("gtceu.multiblock.turbine.rotor_speed", + // FormattingUtil.formatNumbers(rotorHolder.getRotorSpeed()), + // FormattingUtil.formatNumbers(rotorHolder.getMaxRotorHolderSpeed()))); + // textList.add(Component.translatable("gtceu.multiblock.turbine.efficiency", + // rotorHolder.getTotalEfficiency())); + // + // long maxProduction = getOverclockVoltage(); + // long currentProduction = getCurrentProduction(); + // + // if (isActive()) { + // textList.add(3, Component.translatable("gtceu.multiblock.turbine.energy_per_tick", + // FormattingUtil.formatNumbers(currentProduction), + // FormattingUtil.formatNumbers(maxProduction))); + // } + // + // int rotorDurability = rotorHolder.getRotorDurabilityPercent(); + // if (rotorDurability > MIN_DURABILITY_TO_WARN) { + // textList.add(Component.translatable("gtceu.multiblock.turbine.rotor_durability", rotorDurability)); + // } else { + // textList.add(Component.translatable("gtceu.multiblock.turbine.rotor_durability", rotorDurability) + // .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); + // } + // } + // } + // } } diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index 6afe27cc9b5..d02f0b1dfb1 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -25,6 +25,9 @@ public static void init() { } } + void myMethod() {} + + @Configurable.ValueUpdateCallback(method = "myMethod") @Configurable public RecipeConfigs recipes = new RecipeConfigs(); @Configurable diff --git a/src/main/java/com/gregtechceu/gtceu/utils/serialization/network/ByteBufAdapters.java b/src/main/java/com/gregtechceu/gtceu/utils/serialization/network/ByteBufAdapters.java index 74e14ce9bea..4e538697023 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/serialization/network/ByteBufAdapters.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/serialization/network/ByteBufAdapters.java @@ -1,10 +1,13 @@ package com.gregtechceu.gtceu.utils.serialization.network; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.GTRecipeSerializer; import com.gregtechceu.gtceu.utils.EqualityTest; import com.gregtechceu.gtceu.utils.NetworkUtils; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraftforge.fluids.FluidStack; @@ -108,6 +111,34 @@ public boolean areEqual(@NotNull BigDecimal t1, @NotNull BigDecimal t2) { } }; + public static final IByteBufAdapter GTRECIPE = new IByteBufAdapter<>() { + + @Override + public GTRecipe deserialize(FriendlyByteBuf buffer) { + if (!buffer.readBoolean()) { + return null; + } + ResourceLocation id = buffer.readResourceLocation(); + return GTRecipeSerializer.SERIALIZER.fromNetwork(id, buffer); + } + + @Override + public void serialize(FriendlyByteBuf buffer, GTRecipe u) { + if (u == null) { + buffer.writeBoolean(false); + return; + } + buffer.writeBoolean(true); + buffer.writeResourceLocation(u.getId()); + GTRecipeSerializer.SERIALIZER.toNetwork(buffer, u); + } + + @Override + public boolean areEqual(@NotNull GTRecipe t1, @NotNull GTRecipe t2) { + return EqualityTest.wrapNullSafe(GTRecipe::equals).areEqual(t1, t2); + } + }; + public static IByteBufAdapter makeAdapter(@NotNull IByteBufDeserializer deserializer, @NotNull IByteBufSerializer serializer, @Nullable EqualityTest tester) {