/
StatBoostModule.java
119 lines (102 loc) · 4.57 KB
/
StatBoostModule.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
package slimeknights.tconstruct.library.modifiers.modules.build;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import slimeknights.mantle.data.loadable.primitive.EnumLoadable;
import slimeknights.mantle.data.loadable.record.RecordLoadable;
import slimeknights.mantle.data.registry.GenericLoaderRegistry.IGenericLoader;
import slimeknights.tconstruct.library.json.LevelingValue;
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.modifiers.modules.ModifierModuleCondition.ConditionalModifierModule;
import slimeknights.tconstruct.library.tools.context.ToolRebuildContext;
import slimeknights.tconstruct.library.tools.stat.INumericToolStat;
import slimeknights.tconstruct.library.tools.stat.ModifierStatsBuilder;
import slimeknights.tconstruct.library.tools.stat.ToolStats;
import java.util.List;
import java.util.Locale;
/** Module that boosts a tool stat */
public record StatBoostModule(INumericToolStat<?> stat, StatOperation operation, LevelingValue amount, ModifierModuleCondition condition) implements ToolStatsModifierHook, ModifierModule, ConditionalModifierModule {
private static final List<ModifierHook<?>> DEFAULT_HOOKS = List.of(TinkerHooks.TOOL_STATS);
public static RecordLoadable<StatBoostModule> LOADER = RecordLoadable.create(
ToolStats.NUMERIC_LOADER.field("stat", StatBoostModule::stat),
new EnumLoadable<>(StatOperation.class).field("operation", StatBoostModule::operation),
LevelingValue.LOADABLE.directField(StatBoostModule::amount),
ModifierModuleCondition.FIELD,
StatBoostModule::new);
@Override
public void addToolStats(ToolRebuildContext context, ModifierEntry modifier, ModifierStatsBuilder builder) {
if (condition.matches(context, modifier)) {
operation.apply(builder, stat, amount.compute(context, modifier));
}
}
@Override
public List<ModifierHook<?>> getDefaultHooks() {
return DEFAULT_HOOKS;
}
@Override
public IGenericLoader<? extends ModifierModule> getLoader() {
return LOADER;
}
/* Builder */
/** Creates a builder for adding stats */
public static Builder add(INumericToolStat<?> stat) {
return new Builder(stat, StatOperation.ADD);
}
/** Creates a builder for adding stats */
public static Builder multiplyBase(INumericToolStat<?> stat) {
return new Builder(stat, StatOperation.MULTIPLY_BASE);
}
/** Creates a builder for adding stats */
public static Builder multiplyConditional(INumericToolStat<?> stat) {
return new Builder(stat, StatOperation.MULTIPLY_CONDITIONAL);
}
/** Creates a builder for adding stats */
public static Builder multiplyAll(INumericToolStat<?> stat) {
return new Builder(stat, StatOperation.MULTIPLY_ALL);
}
/** enum representing a single stat boost */
public enum StatOperation {
ADD {
@Override
public void apply(ModifierStatsBuilder builder, INumericToolStat<?> stat, float value) {
stat.add(builder, value);
}
},
MULTIPLY_BASE {
@Override
public void apply(ModifierStatsBuilder builder, INumericToolStat<?> stat, float value) {
stat.multiply(builder, 1 + value);
}
},
MULTIPLY_CONDITIONAL {
@Override
public void apply(ModifierStatsBuilder builder, INumericToolStat<?> stat, float value) {
builder.multiplier(stat, 1 + value);
}
},
MULTIPLY_ALL {
@Override
public void apply(ModifierStatsBuilder builder, INumericToolStat<?> stat, float value) {
stat.multiplyAll(builder, 1 + value);
}
};
@Getter
private final String name = name().toLowerCase(Locale.ROOT);
/** Applies this boost type for the given values. */
public abstract void apply(ModifierStatsBuilder builder, INumericToolStat<?> stat, float value);
}
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public static class Builder extends ModifierModuleCondition.Builder<Builder> implements LevelingValue.Builder<StatBoostModule> {
private final INumericToolStat<?> stat;
private final StatOperation operation;
@Override
public StatBoostModule amount(float flat, float eachLevel) {
return new StatBoostModule(stat, operation, new LevelingValue(flat, eachLevel), condition);
}
}
}