aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/recipe/maps/FluidCannerBackend.java
blob: e5681f59aa865468641fdcf48dcba1de0b6230c3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package gregtech.api.recipe.maps;

import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;

import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.IFluidContainerItem;

import gregtech.api.enums.GT_Values;
import gregtech.api.recipe.RecipeMapBackend;
import gregtech.api.recipe.RecipeMapBackendPropertiesBuilder;
import gregtech.api.util.GT_Recipe;
import gregtech.api.util.GT_Utility;
import gregtech.api.util.MethodsReturnNonnullByDefault;

@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
public class FluidCannerBackend extends RecipeMapBackend {

    public FluidCannerBackend(RecipeMapBackendPropertiesBuilder propertiesBuilder) {
        super(propertiesBuilder);
    }

    @Override
    protected GT_Recipe findFallback(ItemStack[] items, FluidStack[] fluids, @Nullable ItemStack specialSlot) {
        if (items.length == 0 || items[0] == null) {
            return null;
        }

        if (fluids.length > 0 && fluids[0] != null) {
            ItemStack filledItem = GT_Utility.fillFluidContainer(fluids[0], items[0], false, true);
            FluidStack fluidToTake = GT_Utility.getFluidForFilledItem(filledItem, true);
            if (fluidToTake != null) {
                return GT_Values.RA.stdBuilder()
                    .itemInputs(GT_Utility.copyAmount(1, items[0]))
                    .itemOutputs(filledItem)
                    .fluidInputs(fluidToTake)
                    .duration(Math.max(fluidToTake.amount / 64, 16))
                    .eut(1)
                    .noOptimize()
                    .noBuffer()
                    .build()
                    .orElse(null);
            }
        }
        FluidStack drainedFluid = GT_Utility.getFluidForFilledItem(items[0], true);
        if (drainedFluid != null) {
            return GT_Values.RA.stdBuilder()
                .itemInputs(GT_Utility.copyAmount(1, items[0]))
                .itemOutputs(GT_Utility.getContainerItem(items[0], true))
                .fluidOutputs(drainedFluid)
                .duration(Math.max(drainedFluid.amount / 64, 16))
                .eut(1)
                .noBuffer()
                .build()
                .orElse(null);
        }
        return null;
    }

    @Override
    public boolean containsInput(ItemStack item) {
        return super.containsInput(item) || (item.getItem() instanceof IFluidContainerItem
            && ((IFluidContainerItem) item.getItem()).getCapacity(item) > 0);
    }

    @Override
    public boolean containsInput(Fluid fluid) {
        return true;
    }
}