package gregtech.api.recipe; import java.awt.Rectangle; import java.util.List; import java.util.function.IntFunction; import java.util.function.Supplier; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; import org.apache.commons.lang3.tuple.Pair; import com.gtnewhorizons.modularui.api.drawable.FallbackableUITexture; import com.gtnewhorizons.modularui.api.drawable.IDrawable; import com.gtnewhorizons.modularui.api.math.Pos2d; import com.gtnewhorizons.modularui.api.math.Size; import com.gtnewhorizons.modularui.common.widget.ProgressBar; import gregtech.api.gui.modularui.FallbackableSteamTexture; import gregtech.api.gui.modularui.SteamTexture; import gregtech.api.util.FieldsAreNonnullByDefault; import gregtech.api.util.MethodsReturnNonnullByDefault; /** * Data object to store properties, used to draw both basic machine GUI and NEI recipe GUI, mainly GUI widgets. * Not all the info used to draw NEI are listed here, see also {@link NEIRecipeProperties}. *
* Use {@link #builder()} for creation.
*/
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
@FieldsAreNonnullByDefault
public final class BasicUIProperties {
/**
* Starts constructing BasicUIProperties.
*/
public static BasicUIPropertiesBuilder builder() {
return new BasicUIPropertiesBuilder();
}
/**
* Creates new builder from this instance.
*/
public BasicUIPropertiesBuilder toBuilder() {
return new BasicUIPropertiesBuilder().maxItemInputs(maxItemInputs)
.maxItemOutputs(maxItemOutputs)
.maxFluidInputs(maxFluidInputs)
.maxFluidOutputs(maxFluidOutputs)
.slotOverlays(slotOverlays)
.slotOverlaysSteam(slotOverlaysSteam)
.progressBarTexture(progressBarTexture)
.progressBarTextureSteam(progressBarTextureSteam)
.progressBarDirection(progressBarDirection)
.progressBarSize(progressBarSize)
.progressBarPos(progressBarPos)
.useProgressBar(useProgressBar)
.useSpecialSlot(useSpecialSlot)
.neiTransferRect(neiTransferRect)
.neiTransferRectId(neiTransferRectId)
.specialTextures(specialTextures)
.specialTexturesSteam(specialTexturesSteam)
.logo(logo)
.logoSize(logoSize)
.logoPos(logoPos)
.itemInputPositionsGetter(itemInputPositionsGetter)
.itemOutputPositionsGetter(itemOutputPositionsGetter)
.specialItemPositionGetter(specialItemPositionGetter)
.fluidInputPositionsGetter(fluidInputPositionsGetter)
.fluidOutputPositionsGetter(fluidOutputPositionsGetter)
.amperage(amperage);
}
/**
* How many item inputs does this recipemap usually has at most.
* It does not actually restrict number of items used in the recipe.
*/
public final int maxItemInputs;
/**
* How many item outputs does this recipemap usually has at most.
* It does not actually restrict number of items used in the recipe.
*/
public final int maxItemOutputs;
/**
* How many fluid inputs does this recipemap usually has at most.
* It does not actually restrict number of items used in the recipe.
*/
public final int maxFluidInputs;
/**
* How many fluid outputs does this recipemap usually has at most.
* It does not actually restrict number of items used in the recipe.
*/
public final int maxFluidOutputs;
private final SlotOverlayGetter> itemInputPositionsGetter;
public final IntFunction
> itemOutputPositionsGetter;
public final Supplier
> fluidInputPositionsGetter;
public final IntFunction
> fluidOutputPositionsGetter;
/**
* Amperage for the recipemap. Even though this is placed at frontend because backend logic doesn't need it,
* some machine logic also use this variable.
*/
public final int amperage;
BasicUIProperties(int maxItemInputs, int maxItemOutputs, int maxFluidInputs, int maxFluidOutputs,
SlotOverlayGetter
> itemInputPositionsGetter, IntFunction
> itemOutputPositionsGetter,
Supplier
> fluidInputPositionsGetter,
IntFunction
> fluidOutputPositionsGetter, int amperage) {
if (maxItemInputs < 0 || maxItemOutputs < 0 || maxFluidInputs < 0 || maxFluidOutputs < 0) {
throw new IllegalArgumentException(
"maxItemInputs, maxItemOutputs, maxFluidInputs and maxFluidOutputs cannot be negative");
}
if (amperage < 1) {
throw new IllegalArgumentException("Amperage cannot be lower than 1");
}
this.maxItemInputs = maxItemInputs;
this.maxItemOutputs = maxItemOutputs;
this.maxFluidInputs = maxFluidInputs;
this.maxFluidOutputs = maxFluidOutputs;
this.slotOverlays = slotOverlays;
this.slotOverlaysSteam = slotOverlaysSteam;
this.progressBarTexture = progressBarTexture;
this.progressBarTextureSteam = progressBarTextureSteam;
this.progressBarDirection = progressBarDirection;
this.progressBarSize = progressBarSize;
this.progressBarPos = progressBarPos;
this.useProgressBar = useProgressBar;
this.useSpecialSlot = useSpecialSlot;
this.neiTransferRect = neiTransferRect;
this.neiTransferRectId = neiTransferRectId;
this.specialTextures = specialTextures;
this.specialTexturesSteam = specialTexturesSteam;
this.logo = logo;
this.logoSize = logoSize;
this.logoPos = logoPos;
this.itemInputPositionsGetter = itemInputPositionsGetter;
this.itemOutputPositionsGetter = itemOutputPositionsGetter;
this.specialItemPositionGetter = specialItemPositionGetter;
this.fluidInputPositionsGetter = fluidInputPositionsGetter;
this.fluidOutputPositionsGetter = fluidOutputPositionsGetter;
this.amperage = amperage;
this.progressBarImageSize = switch (progressBarDirection) {
case UP, DOWN -> progressBarSize.height;
case CIRCULAR_CW -> Math.max(progressBarSize.width, progressBarSize.height);
default -> progressBarSize.width;
};
}
/**
* Retrieves overlay for slot, with given matching conditions.
*/
@Nullable
public IDrawable getOverlayForSlot(int index, boolean isFluid, boolean isOutput, boolean isSpecial) {
return slotOverlays.apply(index, isFluid, isOutput, isSpecial);
}
/**
* Retrieves overlay for slot of steam machines, with given matching conditions.
*/
@Nullable
public SteamTexture getOverlayForSlotSteam(int index, boolean isFluid, boolean isOutput, boolean isSpecial) {
return slotOverlaysSteam.apply(index, isFluid, isOutput, isSpecial);
}
public interface SlotOverlayGetter