Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -462,7 +462,6 @@ public class GTMachines {
.rotationState(RotationState.NON_Y_AXIS)
.langValue("%s Miner %s".formatted(VLVH[tier], VLVT[tier]))
.recipeType(DUMMY_RECIPES)
.editableUI(MinerMachine.EDITABLE_UI_CREATOR.apply(GTCEu.id("miner"), (tier + 1) * (tier + 1)))
.workableTieredHullModel(GTCEu.id("block/machines/miner"))
.tooltipBuilder((stack, tooltip) -> {
int maxArea = IMiner.getWorkingArea(tier * 8);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.gregtechceu.gtceu.api.machine.MachineDefinition;
import com.gregtechceu.gtceu.api.machine.SimpleTieredMachine;
import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem;
import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine;
import com.gregtechceu.gtceu.api.mui.base.IPanelHandler;
import com.gregtechceu.gtceu.api.mui.base.drawable.IDrawable;
Expand Down Expand Up @@ -31,6 +32,7 @@
import net.minecraft.network.chat.Component;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraftforge.items.IItemHandler;

import com.mojang.blaze3d.platform.InputConstants;
import it.unimi.dsi.fastutil.booleans.BooleanConsumer;
Expand Down Expand Up @@ -111,7 +113,13 @@ public static ItemSlot createBatterySlot(SimpleTieredMachine tieredMachine, Pane
return new ItemSlot().syncHandler("battery").background(GTGuiTextures.SLOT, GTGuiTextures.CHARGER_OVERLAY);
}

public static ToggleButton createAutoOutputItemButton(SimpleTieredMachine machine, PanelSyncManager syncManager) {
public static ItemSlot createBatterySlot(IItemHandler itemHandler, int slot, PanelSyncManager syncManager) {
ItemSlotSH battery = new ItemSlotSH(new ModularSlot(itemHandler, slot));
syncManager.syncValue("battery", battery);
return new ItemSlot().syncHandler("battery").background(GTGuiTextures.SLOT, GTGuiTextures.CHARGER_OVERLAY);
}

public static ToggleButton createAutoOutputItemButton(IAutoOutputItem machine, PanelSyncManager syncManager) {
BooleanSyncValue itemOutputs = new BooleanSyncValue(machine::isAutoOutputItems,
machine::setAutoOutputItems);
syncManager.syncValue("auto_output_items", itemOutputs);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,46 +5,44 @@
import com.gregtechceu.gtceu.api.capability.IControllable;
import com.gregtechceu.gtceu.api.capability.IMiner;
import com.gregtechceu.gtceu.api.capability.recipe.IO;
import com.gregtechceu.gtceu.api.gui.GuiTextures;
import com.gregtechceu.gtceu.api.gui.WidgetUtils;
import com.gregtechceu.gtceu.api.gui.editor.EditableMachineUI;
import com.gregtechceu.gtceu.api.gui.editor.EditableUI;
import com.gregtechceu.gtceu.api.gui.widget.SlotWidget;
import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity;
import com.gregtechceu.gtceu.api.machine.TickableSubscription;
import com.gregtechceu.gtceu.api.machine.WorkableTieredMachine;
import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem;
import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider;
import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine;
import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine;
import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler;
import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic;
import com.gregtechceu.gtceu.api.mui.base.drawable.IKey;
import com.gregtechceu.gtceu.api.mui.factory.PosGuiData;
import com.gregtechceu.gtceu.api.mui.utils.Alignment;
import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager;
import com.gregtechceu.gtceu.api.mui.widgets.TextWidget;
import com.gregtechceu.gtceu.api.mui.widgets.layout.Column;
import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow;
import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler;
import com.gregtechceu.gtceu.client.mui.screen.ModularPanel;
import com.gregtechceu.gtceu.client.mui.screen.UISettings;
import com.gregtechceu.gtceu.common.data.machines.GTMachineUtils;
import com.gregtechceu.gtceu.common.data.mui.GTMuiMachineUtil;
import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets;
import com.gregtechceu.gtceu.common.item.PortableScannerBehavior;
import com.gregtechceu.gtceu.common.machine.trait.miner.MinerLogic;
import com.gregtechceu.gtceu.common.mui.GTGuiTextures;
import com.gregtechceu.gtceu.config.ConfigHolder;
import com.gregtechceu.gtceu.data.lang.LangHandler;
import com.gregtechceu.gtceu.utils.GTTransferUtils;

import com.lowdragmc.lowdraglib.gui.widget.ComponentPanelWidget;
import com.lowdragmc.lowdraglib.gui.widget.DraggableScrollableWidgetGroup;
import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup;
import com.lowdragmc.lowdraglib.syncdata.ISubscription;
import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced;
import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted;
import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender;
import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder;
import com.lowdragmc.lowdraglib.utils.Position;
import com.lowdragmc.lowdraglib.utils.Size;

import net.minecraft.ChatFormatting;
import net.minecraft.Util;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.network.chat.Style;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.TickTask;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.InteractionHand;
Expand All @@ -62,14 +60,13 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.BiFunction;

import javax.annotation.ParametersAreNonnullByDefault;

@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
public class MinerMachine extends WorkableTieredMachine
implements IMiner, IControllable, IFancyUIMachine, IDataInfoProvider, IAutoOutputItem {
implements IMiner, IControllable, IMuiMachine, IDataInfoProvider, IAutoOutputItem {

protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(MinerMachine.class,
WorkableTieredMachine.MANAGED_FIELD_HOLDER);
Expand Down Expand Up @@ -245,99 +242,6 @@ protected void chargeBattery() {
}
}

//////////////////////////////////////
// *********** GUI ***********//
//////////////////////////////////////

public static BiFunction<ResourceLocation, Integer, EditableMachineUI> EDITABLE_UI_CREATOR = Util
.memoize((path, inventorySize) -> new EditableMachineUI("misc", path, () -> {
WidgetGroup template = createTemplate(inventorySize).createDefault();
SlotWidget batterySlot = createBatterySlot().createDefault();
batterySlot.setSelfPosition(new Position(100, 10));
WidgetGroup group = new WidgetGroup(0, 0, Math.max(template.getSize().width + 12, 172),
template.getSize().height + 8);
Size size = group.getSize();

template.setSelfPosition(new Position(
(size.width - 4 - template.getSize().width) / 2 + 4,
(size.height - template.getSize().height) / 2));

group.addWidget(template);
group.addWidget(batterySlot);
return group;
}, (template, machine) -> {
if (machine instanceof MinerMachine minerMachine) {
createTemplate(inventorySize).setupUI(template, minerMachine);
createEnergyBar().setupUI(template, minerMachine);
createBatterySlot().setupUI(template, minerMachine);
}
}));

protected static EditableUI<WidgetGroup, MinerMachine> createTemplate(int inventorySize) {
return new EditableUI<>("miner", WidgetGroup.class, () -> {
int rowSize = (int) Math.sqrt(inventorySize);
int width = rowSize * 18 + 120;
int height = Math.max(rowSize * 18, 80);
WidgetGroup group = new WidgetGroup(0, 0, width, height);

WidgetGroup slots = new WidgetGroup(120, (height - rowSize * 18) / 2, rowSize * 18, rowSize * 18);
for (int y = 0; y < rowSize; y++) {
for (int x = 0; x < rowSize; x++) {
int index = y * rowSize + x;
var slot = new SlotWidget();
slot.initTemplate();
slot.setSelfPosition(new Position(x * 18, y * 18));
slot.setBackground(GuiTextures.SLOT);
slot.setId("slot_" + index);
slots.addWidget(slot);
}
}

var componentPanel = new ComponentPanelWidget(4, 5, list -> {});
componentPanel.setMaxWidthLimit(110);
componentPanel.setId("component_panel");

var container = new WidgetGroup(0, 0, 117, height);
container.addWidget(new DraggableScrollableWidgetGroup(4, 4, container.getSize().width - 8,
container.getSize().height - 8)
.setBackground(GuiTextures.DISPLAY)
.addWidget(componentPanel));
container.setBackground(GuiTextures.BACKGROUND_INVERSE);
group.addWidget(container);
group.addWidget(slots);
return group;
}, (group, machine) -> {
WidgetUtils.widgetByIdForEach(group, "^slot_[0-9]+$", SlotWidget.class, slot -> {
var index = WidgetUtils.widgetIdIndex(slot);
if (index >= 0 && index < machine.exportItems.getSlots()) {
slot.setHandlerSlot(machine.exportItems, index);
slot.setCanTakeItems(true);
slot.setCanPutItems(false);
}
});
WidgetUtils.widgetByIdForEach(group, "^component_panel$", ComponentPanelWidget.class, panel -> {
panel.textSupplier(machine::addDisplayText);
});
});
}

/**
* Create an energy bar widget.
*/
protected static EditableUI<SlotWidget, MinerMachine> createBatterySlot() {
return new EditableUI<>("battery_slot", SlotWidget.class, () -> {
var slotWidget = new SlotWidget();
slotWidget.setBackground(GuiTextures.SLOT, GuiTextures.CHARGER_OVERLAY);
return slotWidget;
}, (slotWidget, machine) -> {
slotWidget.setHandlerSlot(machine.chargerInventory, 0);
slotWidget.setCanPutItems(true);
slotWidget.setCanTakeItems(true);
slotWidget.setHoverTooltips(LangHandler.getMultiLang("gtceu.gui.charger_slot.tooltip",
GTValues.VNF[machine.getTier()], GTValues.VNF[machine.getTier()]).toArray(new MutableComponent[0]));
});
}

private void addDisplayText(@NotNull List<Component> textList) {
int workingArea = IMiner.getWorkingArea(getRecipeLogic().getCurrentRadius());
textList.add(Component.translatable("gtceu.machine.miner.startx", getRecipeLogic().getX()).append(" ")
Expand Down Expand Up @@ -413,4 +317,45 @@ public List<Component> getDataInfo(PortableScannerBehavior.DisplayMode mode) {
}
return new ArrayList<>();
}

@Override
public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) {
return new ModularPanel(getDefinition().getName())
.width(220)
.child(GTMuiWidgets.createTitleBar(getDefinition(), 220))
.bindPlayerInventory()
.child(Flow.row()
.coverChildrenHeight()
.margin(5)
.childPadding(5)
.widthRel(1f)
.child(Flow.column()
.crossAxisAlignment(Alignment.CrossAxis.START)
.padding(5)
.background(GTGuiTextures.DISPLAY)
.widthRel(.6f)
.child(new TextWidget<>(IKey.dynamic(() -> {
List<Component> text = new ArrayList<>();
addDisplayText(text);
return text.stream()
.map(Component::copy)
.reduce((a, b) -> a.append("\n").append(b))
.orElse(Component.empty());
}))))
.child(GTMuiMachineUtil.createSquareSlotGroupFromInventory(exportItems, "export_inv",
syncManager)))
.child(new Column()
.coverChildren()
.leftRel(1.0f)
.reverseLayout(true)
.bottom(16)
.padding(0, 8, 4, 4)
.childPadding(2)
.excludeAreaInXei()
.background(GTGuiTextures.BACKGROUND.getSubArea(0.25f, 0f, 1.0f, 1.0f))
.child(GTMuiWidgets.createPowerButton(this::isWorkingEnabled, this::setWorkingEnabled,
syncManager))
.child(GTMuiWidgets.createBatterySlot(getChargerInventory(), 0, syncManager))
.child(GTMuiWidgets.createAutoOutputItemButton(this, syncManager)));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import com.gregtechceu.gtceu.utils.GTTransferUtils;
import com.gregtechceu.gtceu.utils.GTUtil;

import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced;
import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted;
import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder;

Expand Down Expand Up @@ -70,12 +71,15 @@ public class MinerLogic extends RecipeLogic implements IRecipeCapabilityHolder {
private final LinkedList<BlockPos> blocksToMine = new LinkedList<>();
@Getter
@Persisted
@DescSynced
protected int x = Integer.MAX_VALUE;
@Getter
@Persisted
@DescSynced
protected int y = Integer.MAX_VALUE;
@Getter
@Persisted
@DescSynced
protected int z = Integer.MAX_VALUE;
@Getter
@Persisted
Expand All @@ -91,12 +95,15 @@ public class MinerLogic extends RecipeLogic implements IRecipeCapabilityHolder {
protected int pipeY = Integer.MAX_VALUE;
@Getter
@Persisted
@DescSynced
protected int mineX = Integer.MAX_VALUE;
@Getter
@Persisted
@DescSynced
protected int mineZ = Integer.MAX_VALUE;
@Getter
@Persisted
@DescSynced
protected int mineY = Integer.MAX_VALUE;
@Getter
private int minBuildHeight = Integer.MAX_VALUE;
Expand All @@ -111,8 +118,10 @@ public class MinerLogic extends RecipeLogic implements IRecipeCapabilityHolder {
private int currentRadius;
@Getter
@Persisted
@DescSynced
private boolean isDone;
@Getter
@DescSynced
private boolean isInventoryFull;
@Getter
private final Map<IO, List<RecipeHandlerList>> capabilitiesProxy;
Expand Down