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 @@ -3,37 +3,18 @@
import com.gregtechceu.gtceu.api.GTValues;
import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo;
import com.gregtechceu.gtceu.api.capability.recipe.*;
import com.gregtechceu.gtceu.api.gui.editor.EditableMachineUI;
import com.gregtechceu.gtceu.api.machine.feature.IEnvironmentalHazardEmitter;
import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine;
import com.gregtechceu.gtceu.api.recipe.GTRecipe;
import com.gregtechceu.gtceu.api.recipe.GTRecipeType;
import com.gregtechceu.gtceu.api.recipe.content.ContentModifier;
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.api.recipe.ui.GTRecipeTypeUI;

import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup;
import com.lowdragmc.lowdraglib.utils.Position;
import com.lowdragmc.lowdraglib.utils.Size;

import net.minecraft.Util;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceLocation;

import com.google.common.collect.Tables;
import it.unimi.dsi.fastutil.ints.Int2IntFunction;
import lombok.Getter;
import org.jetbrains.annotations.NotNull;

import java.util.Collections;
import java.util.EnumMap;
import java.util.LinkedHashMap;
import java.util.function.BiFunction;

public class SimpleGeneratorMachine extends WorkableTieredMachine
implements IFancyUIMachine, IEnvironmentalHazardEmitter {
implements IEnvironmentalHazardEmitter {

@Getter
private final float hazardStrengthPerOperation;
Expand Down Expand Up @@ -81,7 +62,7 @@ public int tintColor(int index) {
* @param recipe recipe
* @return A {@link ModifierFunction} for the given Simple Generator
*/
public static ModifierFunction recipeModifier(@NotNull MetaMachine machine, @NotNull GTRecipe recipe) {
public static ModifierFunction recipeModifier(MetaMachine machine, GTRecipe recipe) {
if (!(machine instanceof SimpleGeneratorMachine generator)) {
return RecipeModifier.nullWrongType(SimpleGeneratorMachine.class, machine);
}
Expand Down Expand Up @@ -119,40 +100,4 @@ public void afterWorking() {
public long getDisplayRecipeVoltage() {
return GTValues.V[this.tier];
}

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

@SuppressWarnings("UnstableApiUsage")
public static BiFunction<ResourceLocation, GTRecipeType, EditableMachineUI> EDITABLE_UI_CREATOR = Util
.memoize((path, recipeType) -> new EditableMachineUI("generator", path, () -> {
WidgetGroup template = recipeType.getRecipeUI().createEditableUITemplate(false, false).createDefault();
WidgetGroup group = new WidgetGroup(0, 0, template.getSize().width + 4 + 8,
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);
return group;
}, (template, machine) -> {
if (machine instanceof SimpleGeneratorMachine generatorMachine) {
var storages = Tables.newCustomTable(new EnumMap<>(IO.class),
LinkedHashMap<RecipeCapability<?>, Object>::new);
storages.put(IO.IN, ItemRecipeCapability.CAP, generatorMachine.importItems.storage);
storages.put(IO.OUT, ItemRecipeCapability.CAP, generatorMachine.exportItems.storage);
storages.put(IO.IN, FluidRecipeCapability.CAP, generatorMachine.importFluids);
storages.put(IO.OUT, FluidRecipeCapability.CAP, generatorMachine.exportFluids);

generatorMachine.getRecipeType().getRecipeUI().createEditableUITemplate(false, false).setupUI(
template,
new GTRecipeTypeUI.RecipeHolder(generatorMachine.recipeLogic::getProgressPercent,
storages,
new CompoundTag(),
Collections.emptyList(),
false, false));
createEnergyBar().setupUI(template, generatorMachine);
}
}));
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,42 +4,16 @@
import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo;
import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper;
import com.gregtechceu.gtceu.api.capability.recipe.*;
import com.gregtechceu.gtceu.api.gui.GuiTextures;
import com.gregtechceu.gtceu.api.gui.editor.EditableMachineUI;
import com.gregtechceu.gtceu.api.gui.editor.EditableUI;
import com.gregtechceu.gtceu.api.gui.fancy.ConfiguratorPanel;
import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfigurator;
import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfiguratorButton;
import com.gregtechceu.gtceu.api.gui.widget.GhostCircuitSlotWidget;
import com.gregtechceu.gtceu.api.gui.widget.SlotWidget;
import com.gregtechceu.gtceu.api.machine.fancyconfigurator.CircuitFancyConfigurator;
import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine;
import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot;
import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait;
import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler;
import com.gregtechceu.gtceu.api.recipe.GTRecipeType;
import com.gregtechceu.gtceu.api.recipe.ui.GTRecipeTypeUI;
import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField;
import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient;
import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler;
import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour;
import com.gregtechceu.gtceu.config.ConfigHolder;
import com.gregtechceu.gtceu.data.lang.LangHandler;
import com.gregtechceu.gtceu.utils.ISubscription;

import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup;
import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture;
import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture;
import com.lowdragmc.lowdraglib.gui.util.ClickData;
import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup;
import com.lowdragmc.lowdraglib.utils.Position;

import net.minecraft.Util;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;

import com.google.common.collect.Tables;
import it.unimi.dsi.fastutil.ints.Int2IntFunction;
import lombok.Getter;
import org.jetbrains.annotations.Nullable;
Expand All @@ -51,7 +25,7 @@
* All simple single machines are implemented here.
*/
public class SimpleTieredMachine extends WorkableTieredMachine
implements IFancyUIMachine, IHasCircuitSlot {
implements IHasCircuitSlot {

@Getter
@SaveField
Expand Down Expand Up @@ -144,143 +118,4 @@ public void onMachineDestroyed() {
public long getDisplayRecipeVoltage() {
return GTValues.V[this.tier];
}

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

@Override
public void attachConfigurators(ConfiguratorPanel configuratorPanel) {
IFancyUIMachine.super.attachConfigurators(configuratorPanel);

if (autoOutput.supportsAutoOutputFluids()) {
configuratorPanel.attachConfigurators(createAutoOutputFluidConfigurator());
}
if (autoOutput.supportsAutoOutputItems()) {
configuratorPanel.attachConfigurators(createAutoOutputItemConfigurator());
}

if (isCircuitSlotEnabled()) {
configuratorPanel.attachConfigurators(new CircuitFancyConfigurator(circuitInventory.storage));
}
}

private IFancyConfigurator createAutoOutputFluidConfigurator() {
return createAutoOutputConfigurator(
GuiTextures.IO_CONFIG_FLUID_MODES_BUTTON,
"gtceu.gui.fluid_auto_output",
this.autoOutput::isAutoOutputFluids,
(cd, nextState) -> this.autoOutput.setAllowAutoOutputFluids(nextState));
}

private IFancyConfigurator createAutoOutputItemConfigurator() {
return createAutoOutputConfigurator(
GuiTextures.IO_CONFIG_ITEM_MODES_BUTTON,
"gtceu.gui.item_auto_output",
this.autoOutput::isAutoOutputItems,
(cd, nextState) -> this.autoOutput.setAllowAutoOutputItems(nextState));
}

private IFancyConfigurator createAutoOutputConfigurator(ResourceTexture modesButtonTexture,
String tooltipBaseLangKey,
BooleanSupplier stateSupplier,
BiConsumer<ClickData, Boolean> onToggle) {
var toggle = new IFancyConfiguratorButton.Toggle(
new GuiTextureGroup(
GuiTextures.TOGGLE_BUTTON_BACK.getSubTexture(0, 0, 1, 0.5),
modesButtonTexture.getSubTexture(0, 1 / 3f, 1, 1 / 3f)),
new GuiTextureGroup(
GuiTextures.TOGGLE_BUTTON_BACK.getSubTexture(0, 0.5, 1, 0.5),
modesButtonTexture.getSubTexture(0, 2 / 3f, 1, 1 / 3f)),
stateSupplier,
onToggle);

toggle.setTooltipsSupplier(enabled -> {
var key = tooltipBaseLangKey + '.' + (enabled ? "enabled" : "disabled");
return List.of(Component.translatable(key));
});

return toggle;
}

@SuppressWarnings("UnstableApiUsage")
public static BiFunction<ResourceLocation, GTRecipeType, EditableMachineUI> EDITABLE_UI_CREATOR = Util
.memoize((path, recipeType) -> new EditableMachineUI("simple", path, () -> {
WidgetGroup template = recipeType.getRecipeUI().createEditableUITemplate(false, false).createDefault();
SlotWidget batterySlot = createBatterySlot().createDefault();
WidgetGroup group = new WidgetGroup(0, 0, template.getSize().width,
Math.max(template.getSize().height, 78));
template.setSelfPosition(new Position(0, (group.getSize().height - template.getSize().height) / 2));
batterySlot.setSelfPosition(new Position(group.getSize().width / 2 - 9, group.getSize().height - 18));
group.addWidget(batterySlot);
group.addWidget(template);

// TODO fix this.
// if (ConfigHolder.INSTANCE.machines.ghostCircuit) {
// SlotWidget circuitSlot = createCircuitConfigurator().createDefault();
// circuitSlot.setSelfPosition(new Position(120, 62));
// group.addWidget(circuitSlot);
// }

return group;
}, (template, machine) -> {
if (machine instanceof SimpleTieredMachine tieredMachine) {
var storages = Tables.newCustomTable(new EnumMap<>(IO.class),
LinkedHashMap<RecipeCapability<?>, Object>::new);
storages.put(IO.IN, ItemRecipeCapability.CAP, tieredMachine.importItems.storage);
storages.put(IO.OUT, ItemRecipeCapability.CAP, tieredMachine.exportItems.storage);
storages.put(IO.IN, FluidRecipeCapability.CAP, tieredMachine.importFluids);
storages.put(IO.OUT, FluidRecipeCapability.CAP, tieredMachine.exportFluids);
storages.put(IO.IN, CWURecipeCapability.CAP, tieredMachine.importComputation);
storages.put(IO.OUT, CWURecipeCapability.CAP, tieredMachine.exportComputation);

tieredMachine.getRecipeType().getRecipeUI().createEditableUITemplate(false, false).setupUI(template,
new GTRecipeTypeUI.RecipeHolder(tieredMachine.recipeLogic::getProgressPercent,
storages,
new CompoundTag(),
Collections.emptyList(),
false, false));
createBatterySlot().setupUI(template, tieredMachine);
// createCircuitConfigurator().setupUI(template, tieredMachine);
}
}));

/**
* Create a battery slot widget.
*/
protected static EditableUI<SlotWidget, SimpleTieredMachine> 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(Component[]::new));
});
}

/**
* Create a ghost circuit slot widget.
*/
protected static EditableUI<GhostCircuitSlotWidget, SimpleTieredMachine> createCircuitConfigurator() {
return new EditableUI<>("circuit_configurator", GhostCircuitSlotWidget.class, () -> {
var slotWidget = new GhostCircuitSlotWidget();
slotWidget.setBackground(GuiTextures.SLOT, GuiTextures.INT_CIRCUIT_OVERLAY);
return slotWidget;
}, (slotWidget, machine) -> {
slotWidget.setCircuitInventory(machine.circuitInventory);
slotWidget.setCanPutItems(false);
slotWidget.setCanTakeItems(false);
slotWidget.setHoverTooltips(
LangHandler.getMultiLang("gtceu.gui.configurator_slot.tooltip").toArray(Component[]::new));
});
}

// Method provided to override
protected IGuiTexture getCircuitSlotOverlay() {
return GuiTextures.INT_CIRCUIT_OVERLAY;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,8 @@
import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo;
import com.gregtechceu.gtceu.api.capability.recipe.IO;
import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability;
import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability;
import com.gregtechceu.gtceu.api.gui.GuiTextures;
import com.gregtechceu.gtceu.api.gui.UITemplate;
import com.gregtechceu.gtceu.api.gui.widget.PredicatedImageWidget;
import com.gregtechceu.gtceu.api.machine.MetaMachine;
import com.gregtechceu.gtceu.api.machine.feature.IExhaustVentMachine;
import com.gregtechceu.gtceu.api.machine.feature.IUIMachine;
import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties;
import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler;
import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList;
Expand All @@ -23,27 +18,19 @@
import com.gregtechceu.gtceu.client.model.machine.MachineRenderState;
import com.gregtechceu.gtceu.common.recipe.condition.VentCondition;

import com.lowdragmc.lowdraglib.gui.modular.ModularUI;
import com.lowdragmc.lowdraglib.gui.widget.LabelWidget;
import com.lowdragmc.lowdraglib.utils.Position;

import net.minecraft.MethodsReturnNonnullByDefault;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.entity.player.Player;

import com.google.common.collect.Tables;
import lombok.Getter;
import lombok.Setter;
import org.jetbrains.annotations.NotNull;

import java.util.*;

import javax.annotation.ParametersAreNonnullByDefault;

@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
public class SimpleSteamMachine extends SteamWorkableMachine implements IExhaustVentMachine, IUIMachine {
public class SimpleSteamMachine extends SteamWorkableMachine implements IExhaustVentMachine {

@SaveField
public final NotifiableItemStackHandler importItems;
Expand Down Expand Up @@ -103,7 +90,7 @@ public float getVentingDamage() {

@SuppressWarnings("DataFlowIssue")
@Override
public @NotNull Direction getVentingDirection() {
public Direction getVentingDirection() {
return getOutputFacing();
}

Expand All @@ -121,7 +108,7 @@ public void updateModelVentDirection() {
}

@Override
public void setOutputFacing(@NotNull Direction outputFacing) {
public void setOutputFacing(Direction outputFacing) {
var oldFacing = getOutputFacing();
super.setOutputFacing(outputFacing);
if (getOutputFacing() != oldFacing) {
Expand All @@ -139,7 +126,7 @@ public void setFrontFacing(Direction facing) {
}

@Override
public void setUpwardsFacing(@NotNull Direction upwardsFacing) {
public void setUpwardsFacing(Direction upwardsFacing) {
var oldFacing = getUpwardsFacing();
super.setUpwardsFacing(upwardsFacing);
if (getUpwardsFacing() != oldFacing) {
Expand Down Expand Up @@ -171,7 +158,7 @@ public double getConversionRate() {
* @param recipe recipe
* @return A {@link ModifierFunction} for the given Steam Machine
*/
public static ModifierFunction recipeModifier(@NotNull MetaMachine machine, @NotNull GTRecipe recipe) {
public static ModifierFunction recipeModifier(MetaMachine machine, GTRecipe recipe) {
if (!(machine instanceof SimpleSteamMachine steamMachine)) {
return RecipeModifier.nullWrongType(SimpleSteamMachine.class, machine);
}
Expand All @@ -190,35 +177,4 @@ public void afterWorking() {
needsVenting = true;
checkVenting();
}

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

@Override
public ModularUI createUI(Player entityPlayer) {
var storages = Tables.newCustomTable(new EnumMap<>(IO.class), LinkedHashMap<RecipeCapability<?>, Object>::new);
storages.put(IO.IN, ItemRecipeCapability.CAP, importItems.storage);
storages.put(IO.OUT, ItemRecipeCapability.CAP, exportItems.storage);

var group = getRecipeType().getRecipeUI().createUITemplate(recipeLogic::getProgressPercent,
storages,
new CompoundTag(),
Collections.emptyList(),
true,
isHighPressure);
Position pos = new Position((Math.max(group.getSize().width + 4 + 8, 176) - 4 - group.getSize().width) / 2 + 4,
32);
group.setSelfPosition(pos);
return new ModularUI(176, 166, this, entityPlayer)
.background(GuiTextures.BACKGROUND_STEAM.get(isHighPressure))
.widget(group)
.widget(new LabelWidget(5, 5, getBlockState().getBlock().getDescriptionId()))
.widget(new PredicatedImageWidget(pos.x + group.getSize().width / 2 - 9,
pos.y + group.getSize().height / 2 - 9, 18, 18,
GuiTextures.INDICATOR_NO_STEAM.get(isHighPressure))
.setPredicate(recipeLogic::isWaiting))
.widget(UITemplate.bindPlayerInventory(entityPlayer.getInventory(),
GuiTextures.SLOT_STEAM.get(isHighPressure), 7, 84, true));
}
}
Loading