-
Notifications
You must be signed in to change notification settings - Fork 755
/
StatInSetPredicate.java
95 lines (82 loc) · 3.42 KB
/
StatInSetPredicate.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
package slimeknights.tconstruct.library.json.predicate.tool;
import com.google.common.collect.ImmutableSet;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import net.minecraft.network.FriendlyByteBuf;
import slimeknights.mantle.data.loadable.record.RecordLoadable;
import slimeknights.mantle.util.JsonHelper;
import slimeknights.mantle.util.typed.TypedMap;
import slimeknights.tconstruct.library.tools.nbt.IToolStackView;
import slimeknights.tconstruct.library.tools.stat.IToolStat;
import slimeknights.tconstruct.library.tools.stat.ToolStats;
import java.util.Set;
/**
* Predicate which checks if a stat is in the given set of values
* @param <T> Stat type
* @param stat Stat to check
* @param values Set of values to match
* @see StatInRangePredicate
*/
public record StatInSetPredicate<T>(IToolStat<T> stat, Set<T> values) implements ToolStackPredicate {
public StatInSetPredicate(IToolStat<T> stat, T value) {
this(stat, Set.of(value));
}
@Override
public boolean matches(IToolStackView tool) {
return values.contains(tool.getStats().get(stat));
}
@Override
public RecordLoadable<StatInSetPredicate<?>> getLoader() {
return LOADER;
}
/** Loader instance, manually created as the value parsing another value is difficult with the builder */
public static final RecordLoadable<StatInSetPredicate<?>> LOADER = new RecordLoadable<>() {
@Override
public StatInSetPredicate<?> deserialize(JsonObject json, TypedMap context) {
return deserialize(json, ToolStats.LOADER.getIfPresent(json, "stat"));
}
/** Handles generics for the set parsing */
private static <T> StatInSetPredicate<T> deserialize(JsonObject json, IToolStat<T> stat) {
Set<T> values = ImmutableSet.copyOf(JsonHelper.parseList(json, "values", (element, key) -> stat.deserialize(element)));
return new StatInSetPredicate<>(stat, values);
}
@Override
public void serialize(StatInSetPredicate<?> object, JsonObject json) {
json.add("stat", ToolStats.LOADER.serialize(object.stat));
serializeSet(object, json);
}
/** Handles generics for the set serializing */
private static <T> void serializeSet(StatInSetPredicate<T> object, JsonObject json) {
JsonArray array = new JsonArray();
for (T value : object.values) {
array.add(object.stat.serialize(value));
}
json.add("values", array);
}
@Override
public StatInSetPredicate<?> decode(FriendlyByteBuf buffer, TypedMap context) {
return fromNetwork(buffer, ToolStats.LOADER.decode(buffer));
}
/** Handles generics for the set reading */
private static <T> StatInSetPredicate<T> fromNetwork(FriendlyByteBuf buffer, IToolStat<T> stat) {
ImmutableSet.Builder<T> builder = ImmutableSet.builder();
int max = buffer.readVarInt();
for (int i = 0; i < max; i++) {
builder.add(stat.fromNetwork(buffer));
}
return new StatInSetPredicate<>(stat, builder.build());
}
@Override
public void encode(FriendlyByteBuf buffer, StatInSetPredicate<?> object) {
ToolStats.LOADER.encode(buffer, object.stat);
setToNetwork(object, buffer);
}
/** Handles generics for the set writing */
private static <T> void setToNetwork(StatInSetPredicate<T> object, FriendlyByteBuf buffer) {
buffer.writeVarInt(object.values.size());
for (T value : object.values) {
object.stat.toNetwork(buffer, value);
}
}
};
}