Skip to content
Closed
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 @@ -4,6 +4,7 @@

import net.minecraft.world.level.block.state.BlockState;

/*
public class BlockStateRecipeCapability extends RecipeCapability<BlockState> {

public final static BlockStateRecipeCapability CAP = new BlockStateRecipeCapability();
Expand All @@ -17,3 +18,4 @@ public BlockState copyInner(BlockState content) {
return content;
}
}
*/
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.gregtechceu.gtceu.api.capability.recipe;

import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType;
import com.gregtechceu.gtceu.api.machine.trait.NotifiableComputationContainer;
import com.gregtechceu.gtceu.api.recipe.GTRecipe;
import com.gregtechceu.gtceu.api.recipe.content.Content;
import com.gregtechceu.gtceu.api.recipe.content.ContentModifier;
Expand All @@ -22,6 +24,11 @@ protected CWURecipeCapability() {
super("cwu", 0xFFEEEE00, false, 3, SerializerInteger.INSTANCE);
}

@Override
public MachineTraitType<?> getNotifiableHandlerTraitType() {
return NotifiableComputationContainer.TYPE;
}

@Override
public Integer copyInner(Integer content) {
return content;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import com.gregtechceu.gtceu.api.machine.feature.IOverclockMachine;
import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine;
import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType;
import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer;
import com.gregtechceu.gtceu.api.recipe.GTRecipe;
import com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic;
import com.gregtechceu.gtceu.api.recipe.content.Content;
Expand All @@ -24,6 +26,11 @@ protected EURecipeCapability() {
super("eu", 0xFFFFFF00, false, 2, SerializerEnergyStack.INSTANCE);
}

@Override
public MachineTraitType<?> getNotifiableHandlerTraitType() {
return NotifiableEnergyContainer.TYPE;
}

@Override
public EnergyStack copyInner(EnergyStack content) {
return content;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,22 @@
package com.gregtechceu.gtceu.api.capability.recipe;

import brachy.modularui.api.drawable.IDrawable;
import brachy.modularui.api.widget.IWidget;
import brachy.modularui.theme.ThemeAPI;
import brachy.modularui.value.sync.PanelSyncManager;
import brachy.modularui.value.sync.SyncHandlers;
import brachy.modularui.widgets.SlotGroupWidget;
import brachy.modularui.widgets.slot.FluidSlot;
import com.gregtechceu.gtceu.api.gui.widget.TankWidget;
import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerGroup;
import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerGroupDistinctness;
import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList;
import com.gregtechceu.gtceu.api.machine.MetaMachine;
import com.gregtechceu.gtceu.api.machine.TieredMachine;
import com.gregtechceu.gtceu.api.machine.trait.*;
import com.gregtechceu.gtceu.api.recipe.GTRecipe;
import com.gregtechceu.gtceu.api.recipe.GTRecipeType;
import com.gregtechceu.gtceu.api.recipe.content.Content;
import com.gregtechceu.gtceu.api.recipe.content.ContentModifier;
import com.gregtechceu.gtceu.api.recipe.content.SerializerFluidIngredient;
import com.gregtechceu.gtceu.api.recipe.gui.GTRecipeTypeUILayout;
import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient;
import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderFluidIngredient;
import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.AbstractMapIngredient;
Expand All @@ -28,6 +36,7 @@
import com.lowdragmc.lowdraglib.gui.widget.Widget;
import com.lowdragmc.lowdraglib.jei.IngredientIO;

import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import net.minecraft.ChatFormatting;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
Expand Down Expand Up @@ -55,6 +64,11 @@ protected FluidRecipeCapability() {
super("fluid", 0xFF3C70EE, true, 1, SerializerFluidIngredient.INSTANCE);
}

@Override
public MachineTraitType<?> getNotifiableHandlerTraitType() {
return NotifiableFluidTank.TYPE;
}

@Override
public FluidIngredient copyInner(FluidIngredient content) {
return content.copy();
Expand Down Expand Up @@ -456,4 +470,50 @@ public interface ICustomParallel {
public boolean shouldBypassDistinct() {
return false;
}

@Override
public boolean shouldCreateCapabilityUI() {
return true;
}

@Override
public @Nullable IWidget createCapabilityUI(@NotNull MetaMachine machine,
PanelSyncManager syncManager,
NotifiableRecipeHandlerTrait<?> handler,
GTRecipeTypeUILayout layout,
int maxRecipeTypeSlots,
IO io) {
if (maxRecipeTypeSlots == 0) return null;

var tier = ((TieredMachine)machine).getTier();

var fluidTank = (NotifiableFluidTank)handler;
var overlays = layout.getOverlays().computeIfAbsent(io, $ -> new Object2ObjectOpenHashMap<>()).computeIfAbsent(CAP, $ -> new Int2ObjectOpenHashMap<>());

int maxMachineSlots = fluidTank.getTanks();

var grid = layout.createGrid(io, CAP, 's', tier, maxMachineSlots);

IDrawable defaultSlotBackground = ThemeAPI.INSTANCE.getTheme(machine.getDefinition().getThemeId()).getFluidSlotTheme().theme().getBackground();

SlotGroupWidget.Builder slotWidgetBuilder = SlotGroupWidget.builder()
.matrix(grid);

String syncHandlerName = "fluid_" + io.name();
for (int i = 0; i < maxMachineSlots; i++) {
syncManager.syncValue(syncHandlerName, i, SyncHandlers.fluidSlot(fluidTank.getStorages()[i]));
}
slotWidgetBuilder.key('s', i -> {
var overlay = overlays.get(i) != null ? overlays.get(i) : IDrawable.EMPTY;

return new FluidSlot()
.syncHandler(syncHandlerName, i)
.background(defaultSlotBackground, overlay);
});

return slotWidgetBuilder.build()
.coverChildren()
.name(CAP.name + "_" + io.name());

}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,24 @@
package com.gregtechceu.gtceu.api.capability.recipe;

import brachy.modularui.api.drawable.IDrawable;
import brachy.modularui.api.widget.IWidget;
import brachy.modularui.theme.ThemeAPI;
import brachy.modularui.value.sync.PanelSyncManager;
import brachy.modularui.widgets.SlotGroupWidget;
import brachy.modularui.widgets.slot.ItemSlot;
import brachy.modularui.widgets.slot.ModularSlot;
import brachy.modularui.widgets.slot.SlotGroup;
import com.gregtechceu.gtceu.api.gui.widget.SlotWidget;
import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerGroup;
import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerGroupDistinctness;
import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList;
import com.gregtechceu.gtceu.api.machine.MetaMachine;
import com.gregtechceu.gtceu.api.machine.TieredMachine;
import com.gregtechceu.gtceu.api.machine.trait.*;
import com.gregtechceu.gtceu.api.recipe.GTRecipe;
import com.gregtechceu.gtceu.api.recipe.GTRecipeType;
import com.gregtechceu.gtceu.api.recipe.ResearchData;
import com.gregtechceu.gtceu.api.recipe.content.Content;
import com.gregtechceu.gtceu.api.recipe.content.ContentModifier;
import com.gregtechceu.gtceu.api.recipe.content.SerializerIngredient;
import com.gregtechceu.gtceu.api.recipe.gui.GTRecipeTypeUILayout;
import com.gregtechceu.gtceu.api.recipe.ingredient.IntCircuitIngredient;
import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderIngredient;
import com.gregtechceu.gtceu.api.recipe.ingredient.SizedIngredient;
Expand All @@ -33,6 +42,7 @@
import com.lowdragmc.lowdraglib.gui.widget.Widget;
import com.lowdragmc.lowdraglib.jei.IngredientIO;

import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.Component;
import net.minecraft.util.valueproviders.IntProvider;
Expand Down Expand Up @@ -60,6 +70,11 @@ protected ItemRecipeCapability() {
super("item", 0xFFD96106, true, 0, SerializerIngredient.INSTANCE);
}

@Override
public MachineTraitType<?> getNotifiableHandlerTraitType() {
return NotifiableItemStackHandler.TYPE;
}

@Override
public Ingredient copyInner(Ingredient content) {
return SizedIngredient.copy(content);
Expand Down Expand Up @@ -586,4 +601,46 @@ public interface ICustomParallel {
public boolean shouldBypassDistinct() {
return false;
}

@Override
public boolean shouldCreateCapabilityUI() {
return true;
}

@Override
public @Nullable IWidget createCapabilityUI(@NotNull MetaMachine machine,
PanelSyncManager syncManager,
NotifiableRecipeHandlerTrait<?> handler,
GTRecipeTypeUILayout layout,
int maxRecipeTypeSlots,
IO io) {

if (maxRecipeTypeSlots == 0) return null;

var tier = ((TieredMachine)machine).getTier();

var itemHandler = (NotifiableItemStackHandler)handler;
var overlays = layout.getOverlays().computeIfAbsent(io, $ -> new Object2ObjectOpenHashMap<>()).computeIfAbsent(CAP, $ -> new Int2ObjectOpenHashMap<>());

var grid = layout.createGrid(io, CAP, 's', tier, itemHandler.getSlots());

IDrawable defaultSlotBackground = ThemeAPI.INSTANCE.getTheme(machine.getDefinition().getThemeId()).getItemSlotTheme().theme().getBackground();

SlotGroupWidget.Builder slotWidgetBuilder = SlotGroupWidget.builder()
.matrix(grid);

SlotGroup group = new SlotGroup("item_" + io.name(), grid[0].length());
slotWidgetBuilder.key('s', i -> {
var overlay = overlays.get(i) != null ?
overlays.get(i) : IDrawable.EMPTY;

return new ItemSlot().slot(new ModularSlot(itemHandler, i)
.slotGroup(group))
.background(defaultSlotBackground, overlay);
});

return slotWidgetBuilder.build()
.coverChildren()
.name(CAP.name + "_" + io.name());
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
package com.gregtechceu.gtceu.api.capability.recipe;

import brachy.modularui.api.widget.IWidget;
import brachy.modularui.value.sync.PanelSyncManager;
import com.gregtechceu.gtceu.api.machine.MetaMachine;
import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType;
import com.gregtechceu.gtceu.api.machine.trait.NotifiableRecipeHandlerTrait;
import com.gregtechceu.gtceu.api.recipe.GTRecipe;
import com.gregtechceu.gtceu.api.recipe.GTRecipeType;
import com.gregtechceu.gtceu.api.recipe.content.Content;
import com.gregtechceu.gtceu.api.recipe.content.ContentModifier;
import com.gregtechceu.gtceu.api.recipe.content.IContentSerializer;
import com.gregtechceu.gtceu.api.recipe.gui.GTRecipeTypeUILayout;
import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.AbstractMapIngredient;
import com.gregtechceu.gtceu.api.recipe.ui.GTRecipeTypeUI;
import com.gregtechceu.gtceu.api.registry.GTRegistries;
Expand Down Expand Up @@ -162,10 +168,6 @@ public int getMaxParallelByInput(IRecipeCapabilityHolder holder, GTRecipe recipe
return Integer.MAX_VALUE;
}

public boolean doAddGuiSlots() {
return isRecipeSearchFilter();
}

public void addXEIInfo(WidgetGroup group, int xOffset, GTRecipe recipe, List<Content> contents, boolean perTick,
boolean isInput, MutableInt yOffset) {}

Expand Down Expand Up @@ -223,4 +225,40 @@ public boolean isTickSlot(int index, IO io, GTRecipe recipe) {
public boolean shouldBypassDistinct() {
return true;
}

/**
* Gets the trait type of the {@link NotifiableRecipeHandlerTrait} which can handle this capability
* @return The recipe handler trait type
*/
public abstract MachineTraitType<?> getNotifiableHandlerTraitType();

/// Capability UI

/**
* If this capability should be rendered in IO slot columns
* @return If this capability has UI components
*/
public boolean shouldCreateCapabilityUI() {
return false;
}

/**
* Creates the capability UI to be rendered for singleblock machines
*
* @param machine Machine
* @param syncManager
* @param layout the {@link GTRecipeTypeUILayout} for this recipe type
* @param capabilityAmount The capability amount (only relevant for fluids/items, where it represents the slot count)
* @param io IO mode (IN/OUT)
* @return Capability UI widget
*/
public @Nullable IWidget createCapabilityUI(@NotNull MetaMachine machine,
PanelSyncManager syncManager,
NotifiableRecipeHandlerTrait<?> handler,
GTRecipeTypeUILayout layout,
int capabilityAmount,
IO io) {
return null;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ public class MachineUIPanelBuilder {
* Should the GregTech logo be drawn in the bottom right corner of the panel.
*/
private boolean drawGTLogo = false;
/**
* The texture to use for the GregTech logo.
*/
private UITexture gtLogoTexture = GTGuiTextures.GREGTECH_LOGO;
/**
* Should the player inventory be attached to the bottom of the panel.
Expand Down
Loading
Loading