-
Notifications
You must be signed in to change notification settings - Fork 497
/
ComplexRefineryRecipeManager.java
205 lines (166 loc) · 7.06 KB
/
ComplexRefineryRecipeManager.java
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
package buildcraft.factory.refining;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.google.common.base.Predicate;
import net.minecraftforge.fluids.FluidStack;
import buildcraft.api.recipes.IComplexRefineryRecipeManager;
public enum ComplexRefineryRecipeManager implements IComplexRefineryRecipeManager {
INSTANCE;
private final ComplexRefineryRegistry<IHeatableRecipe> heatableRegistry = new ComplexRefineryRegistry<>();
private final ComplexRefineryRegistry<ICoolableRecipe> coolantRegistry = new ComplexRefineryRegistry<>();
private final ComplexRefineryRegistry<IDistilationRecipe> distillationRegistry = new ComplexRefineryRegistry<>();
@Override
public IHeatableRecipe createHeatingRecipe(FluidStack in, FluidStack out, int heatFrom, int heatTo, int ticks) {
return new HeatableRecipe(ticks, in, out, heatFrom, heatTo);
}
@Override
public IHeatableRecipe addHeatableRecipe(FluidStack in, FluidStack out, int heatFrom, int heatTo, int ticks, boolean replaceExisting) {
return getHeatableRegistry().addRecipe(createHeatingRecipe(in, out, heatFrom, heatTo, ticks), replaceExisting);
}
@Override
public ICoolableRecipe createCoolableRecipe(FluidStack in, FluidStack out, int heatFrom, int heatTo, int ticks) {
return new CoolableRecipe(ticks, in, out, heatFrom, heatTo);
}
@Override
public ICoolableRecipe addCoolableRecipe(FluidStack in, FluidStack out, int heatFrom, int heatTo, int ticks, boolean replaceExisting) {
return getCoolableRegistry().addRecipe(createCoolableRecipe(in, out, heatFrom, heatTo, ticks), replaceExisting);
}
@Override
public IDistilationRecipe createDistilationRecipe(FluidStack in, FluidStack outGas, FluidStack outLiquid, int ticks) {
return new DistilationRecipe(in, ticks, outGas, outLiquid);
}
@Override
public IDistilationRecipe addDistilationRecipe(FluidStack in, FluidStack outGas, FluidStack outLiquid, int ticks, boolean replaceExisting) {
return getDistilationRegistry().addRecipe(createDistilationRecipe(in, outGas, outLiquid, ticks), replaceExisting);
}
@Override
public IComplexRefineryRegistry<IHeatableRecipe> getHeatableRegistry() {
return heatableRegistry;
}
@Override
public IComplexRefineryRegistry<ICoolableRecipe> getCoolableRegistry() {
return coolantRegistry;
}
@Override
public IComplexRefineryRegistry<IDistilationRecipe> getDistilationRegistry() {
return distillationRegistry;
}
private static class ComplexRefineryRegistry<R extends IComplexRefineryRecipe> implements IComplexRefineryRegistry<R> {
private final Set<R> recipeSet = new HashSet<>();
@Override
public R addRecipe(R recipe, boolean replaceExisting) {
if (recipe == null) throw new NullPointerException("recipe");
R existing = recipeSet.stream().filter(r -> r.equals(recipe)).findAny().orElse(null);
if (existing == null) {
recipeSet.add(recipe);
return recipe;
} else if (replaceExisting) {
recipeSet.remove(existing);
recipeSet.add(recipe);
return recipe;
} else {
return existing;
}
}
@Override
public Set<R> getAllRecipes() {
return getRecipes(o -> true);
}
@Override
public R getRecipeForInput(FluidStack fluid) {
return getRecipesAsStream(f -> f.in().isFluidEqual(fluid)).findAny().orElse(null);
}
@Override
public Set<R> getRecipes(Predicate<R> toReturn) {
return getRecipesAsStream(toReturn).collect(Collectors.toCollection(HashSet::new));
}
public Stream<R> getRecipesAsStream(Predicate<R> toReturn) {
return recipeSet.stream().filter(r -> toReturn.apply(r));
}
@Override
public Set<R> removeRecipes(Predicate<R> toRemove) {
Set<R> removeSet = getRecipes(toRemove);
recipeSet.removeAll(removeSet);
return removeSet;
}
}
private static abstract class ComplexRefineryRecipe implements IComplexRefineryRecipe {
private final int ticks;
private final FluidStack in;
public ComplexRefineryRecipe(FluidStack in, int ticks) {
this.in = in;
this.ticks = ticks;
}
@Override
public FluidStack in() {
return in;
}
@Override
public int ticks() {
return ticks;
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (obj == this) return true;
if (obj.getClass() != getClass()) return false;
return in().equals(((IComplexRefineryRecipe) obj).in());
}
@Override
public int hashCode() {
return in().hashCode();
}
}
public static abstract class HeatExchangerRecipe extends ComplexRefineryRecipe implements IHeatExchangerRecipe {
private final FluidStack out;
private final int heatFrom, heatTo;
public HeatExchangerRecipe(int ticks, FluidStack in, FluidStack out, int heatFrom, int heatTo) {
super(in, ticks);
this.out = out;
this.heatFrom = heatFrom;
this.heatTo = heatTo;
}
@Override
public FluidStack out() {
return out;
}
@Override
public int heatFrom() {
return heatFrom;
}
@Override
public int heatTo() {
return heatTo;
}
}
public static class HeatableRecipe extends HeatExchangerRecipe implements IHeatableRecipe {
public HeatableRecipe(int ticks, FluidStack in, FluidStack out, int heatFrom, int heatTo) {
super(ticks, in, out, heatFrom, heatTo);
if (heatFrom >= heatTo) throw new IllegalArgumentException("Tried to add a heatable recipe from a higher heat value to a lower one!");
}
}
public static class CoolableRecipe extends HeatExchangerRecipe implements ICoolableRecipe {
public CoolableRecipe(int ticks, FluidStack in, FluidStack out, int heatFrom, int heatTo) {
super(ticks, in, out, heatFrom, heatTo);
if (heatFrom <= heatTo) throw new IllegalArgumentException("Tried to add a coolant recipe from a lower heat value to a higher one!");
}
}
public static class DistilationRecipe extends ComplexRefineryRecipe implements IDistilationRecipe {
private final FluidStack outGas, outLiquid;
public DistilationRecipe(FluidStack in, int ticks, FluidStack outGas, FluidStack outLiquid) {
super(in, ticks);
this.outGas = outGas;
this.outLiquid = outLiquid;
}
@Override
public FluidStack outGas() {
return outGas;
}
@Override
public FluidStack outLiquid() {
return outLiquid;
}
}
}