-
Notifications
You must be signed in to change notification settings - Fork 755
/
ModifierLevelDisplay.java
100 lines (83 loc) · 3.88 KB
/
ModifierLevelDisplay.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
package slimeknights.tconstruct.library.modifiers.util;
import net.minecraft.network.chat.Component;
import slimeknights.mantle.data.loadable.primitive.BooleanLoadable;
import slimeknights.mantle.data.loadable.primitive.IntLoadable;
import slimeknights.mantle.data.loadable.record.RecordLoadable;
import slimeknights.mantle.data.registry.DefaultingLoaderRegistry;
import slimeknights.mantle.data.registry.GenericLoaderRegistry.IGenericLoader;
import slimeknights.mantle.data.registry.GenericLoaderRegistry.IHaveLoader;
import slimeknights.mantle.data.registry.GenericLoaderRegistry.SingletonLoader;
import slimeknights.tconstruct.library.modifiers.Modifier;
import slimeknights.tconstruct.library.utils.RomanNumeralHelper;
import java.util.function.BiFunction;
public interface ModifierLevelDisplay extends IHaveLoader {
/** Default display, listing name followed by a roman numeral for level */
ModifierLevelDisplay DEFAULT = simple((modifier, level) ->
modifier.applyStyle(Component.translatable(modifier.getTranslationKey())
.append(" ")
.append(RomanNumeralHelper.getNumeral(level))));
/** Loader instance */
DefaultingLoaderRegistry<ModifierLevelDisplay> LOADER = new DefaultingLoaderRegistry<>("Modifier Level Display", DEFAULT, true);
/** Gets the name for a modifier for the given level */
Component nameForLevel(Modifier modifier, int level);
@Override
IGenericLoader<? extends ModifierLevelDisplay> getLoader();
/* Non-default implementations */
/** Displays just the name, for modifiers where multiple levels has no effect */
ModifierLevelDisplay NO_LEVELS = simple((modifier, level) -> modifier.getDisplayName());
/** Displays just the name for the first level, for modifiers that can have multiple levels but don't by design */
ModifierLevelDisplay SINGLE_LEVEL = simple((modifier, level) -> {
if (level == 1) {
return modifier.getDisplayName();
}
return DEFAULT.nameForLevel(modifier, level);
});
/** Displays level with pluses instead of numbers */
ModifierLevelDisplay PLUSES = simple((modifier, level) -> {
if (level > 1) {
return modifier.applyStyle(Component.translatable(modifier.getTranslationKey()).append("+".repeat(level - 1)));
}
return modifier.getDisplayName();
});
/** Creates a simple level display singleton */
static ModifierLevelDisplay simple(BiFunction<Modifier,Integer,Component> name) {
return SingletonLoader.singleton(loader -> new ModifierLevelDisplay() {
@Override
public Component nameForLevel(Modifier modifier, int level) {
return name.apply(modifier, level);
}
@Override
public IGenericLoader<? extends ModifierLevelDisplay> getLoader() {
return loader;
}
});
}
/**
* Name that is unique for the first several levels
* @param unique Number of levels with unique names
* @param firstUnique If true, first level has a unique name. If false, first level uses the levelless modifier name
*/
record UniqueForLevels(int unique, boolean firstUnique) implements ModifierLevelDisplay {
public static final RecordLoadable<UniqueForLevels> LOADER = RecordLoadable.create(
IntLoadable.FROM_ONE.requiredField("unique_until", UniqueForLevels::unique),
BooleanLoadable.INSTANCE.defaultField("first_unique", false, UniqueForLevels::firstUnique),
UniqueForLevels::new);
public UniqueForLevels(int unique) {
this(unique, false);
}
@Override
public Component nameForLevel(Modifier modifier, int level) {
if (!firstUnique && level == 1) {
return modifier.getDisplayName();
}
if (level <= unique) {
return modifier.applyStyle(Component.translatable(modifier.getTranslationKey() + "." + level));
}
return DEFAULT.nameForLevel(modifier, level);
}
@Override
public IGenericLoader<? extends ModifierLevelDisplay> getLoader() {
return LOADER;
}
}
}