-
Notifications
You must be signed in to change notification settings - Fork 754
/
SetStatModule.java
115 lines (96 loc) · 4.37 KB
/
SetStatModule.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
package slimeknights.tconstruct.library.modifiers.modules.build;
import com.google.gson.JsonObject;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
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.modifiers.ModifierEntry;
import slimeknights.tconstruct.library.modifiers.ModifierHook;
import slimeknights.tconstruct.library.modifiers.TinkerHooks;
import slimeknights.tconstruct.library.modifiers.hook.build.ToolStatsModifierHook;
import slimeknights.tconstruct.library.modifiers.modules.ModifierModule;
import slimeknights.tconstruct.library.modifiers.modules.ModifierModuleCondition;
import slimeknights.tconstruct.library.tools.context.ToolRebuildContext;
import slimeknights.tconstruct.library.tools.stat.IToolStat;
import slimeknights.tconstruct.library.tools.stat.ModifierStatsBuilder;
import slimeknights.tconstruct.library.tools.stat.ToolStats;
import java.util.List;
/**
* Module that sets a stat to a particular value
* @param <T> Stat type
*/
public record SetStatModule<T>(IToolStat<T> stat, T value, ModifierModuleCondition condition) implements ModifierModule, ToolStatsModifierHook {
private static final List<ModifierHook<?>> DEFAULT_HOOKS = List.of(TinkerHooks.TOOL_STATS);
@Override
public void addToolStats(ToolRebuildContext context, ModifierEntry modifier, ModifierStatsBuilder builder) {
if (condition.matches(context, modifier)) {
stat.update(builder, value);
}
}
@Override
public List<ModifierHook<?>> getDefaultHooks() {
return DEFAULT_HOOKS;
}
@Override
public RecordLoadable<SetStatModule<?>> getLoader() {
return LOADER;
}
/** Loader instance, manually created as the value parsing another value is difficult with the builder */
public static final RecordLoadable<SetStatModule<?>> LOADER = new RecordLoadable<>() {
@Override
public SetStatModule<?> deserialize(JsonObject json, TypedMap<Object> context) {
return deserialize(json, ToolStats.LOADER.getIfPresent(json, "stat"));
}
/** Handles generics for deserializing the value */
private static <T> SetStatModule<T> deserialize(JsonObject json, IToolStat<T> stat) {
ModifierModuleCondition condition = ModifierModuleCondition.deserializeFrom(json);
T value = stat.deserialize(JsonHelper.getElement(json, "value"));
return new SetStatModule<>(stat, value, condition);
}
@Override
public void serialize(SetStatModule<?> object, JsonObject json) {
object.condition.serializeInto(json);
json.add("stat", ToolStats.LOADER.serialize(object.stat));
serializeValue(object, json);
}
/** Handles generics for serializing the value */
private static <T> void serializeValue(SetStatModule<T> module, JsonObject json) {
json.add("value", module.stat.serialize(module.value));
}
@Override
public SetStatModule<?> decode(FriendlyByteBuf buffer, TypedMap<Object> context) {
return decode(buffer, ToolStats.LOADER.decode(buffer));
}
/** Handles generics for reading the value from network */
private static <T> SetStatModule<T> decode(FriendlyByteBuf buffer, IToolStat<T> stat) {
T value = stat.fromNetwork(buffer);
ModifierModuleCondition condition = ModifierModuleCondition.fromNetwork(buffer);
return new SetStatModule<>(stat, value, condition);
}
@Override
public void encode(FriendlyByteBuf buffer, SetStatModule<?> object) {
ToolStats.LOADER.encode(buffer, object.stat);
writeValue(object, buffer);
object.condition.toNetwork(buffer);
}
/** Handles generics for writing the value to network */
private static <T> void writeValue(SetStatModule<T> object, FriendlyByteBuf buffer) {
object.stat.toNetwork(buffer, object.value);
}
};
/* Builder */
/** Creates a builder for the given stat */
public static <T> Builder<T> set(IToolStat<T> stat) {
return new Builder<>(stat);
}
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public static class Builder<T> extends ModifierModuleCondition.Builder<Builder<T>> {
private final IToolStat<T> stat;
/** Creates the instance with the passed value */
public SetStatModule<T> value(T value) {
return new SetStatModule<>(stat, value, condition);
}
}
}