Skip to content

Commit c0826f8

Browse files
committed
Use split configs
1 parent cb28bf4 commit c0826f8

File tree

10 files changed

+161
-78
lines changed

10 files changed

+161
-78
lines changed

src/main/java/de/mschae23/grindenchantments/GrindEnchantmentsMod.java

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,13 @@
2828
import net.minecraft.registry.RegistryOps;
2929
import net.minecraft.registry.RegistryWrapper;
3030
import net.minecraft.util.Identifier;
31-
import net.fabricmc.api.EnvType;
32-
import net.fabricmc.api.Environment;
3331
import net.fabricmc.api.ModInitializer;
3432
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
35-
import net.fabricmc.fabric.api.client.networking.v1.ClientConfigurationConnectionEvents;
3633
import net.fabricmc.fabric.api.client.networking.v1.ClientConfigurationNetworking;
37-
import net.fabricmc.fabric.api.client.networking.v1.ClientLoginConnectionEvents;
3834
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
3935
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
36+
import net.fabricmc.fabric.api.networking.v1.ServerConfigurationConnectionEvents;
37+
import net.fabricmc.fabric.api.networking.v1.ServerConfigurationNetworking;
4038
import net.fabricmc.loader.api.FabricLoader;
4139
import com.google.gson.JsonElement;
4240
import com.mojang.serialization.Codec;
@@ -56,7 +54,7 @@
5654
import de.mschae23.grindenchantments.impl.DisenchantOperation;
5755
import de.mschae23.grindenchantments.impl.MoveOperation;
5856
import de.mschae23.grindenchantments.impl.ResetRepairCostOperation;
59-
import de.mschae23.grindenchantments.network.s2c.ServerConfigS2CPayload;
57+
import de.mschae23.grindenchantments.config.sync.ServerConfigS2CPayload;
6058
import de.mschae23.grindenchantments.registry.GrindEnchantmentsRegistries;
6159
import io.github.fourmisain.taxfreelevels.TaxFreeLevels;
6260
import org.apache.logging.log4j.Level;
@@ -68,6 +66,7 @@ public class GrindEnchantmentsMod implements ModInitializer {
6866
public static final String MODID = "grindenchantments";
6967
public static final Logger LOGGER = LogManager.getLogger("Grind Enchantments");
7068

69+
@Deprecated
7170
private static GrindEnchantmentsConfigV3 LEGACY_CONFIG = GrindEnchantmentsConfigV3.DEFAULT;
7271
@Nullable
7372
private static ServerConfig SERVER_CONFIG = null;
@@ -76,9 +75,11 @@ public class GrindEnchantmentsMod implements ModInitializer {
7675

7776
@Override
7877
public void onInitialize() {
79-
// Singleplayer
80-
ServerLifecycleEvents.SERVER_STARTING.register(server -> readServerConfig(server.getRegistryManager())
81-
.ifPresent(config -> SERVER_CONFIG = config));
78+
// Singleplayer or on server
79+
ServerLifecycleEvents.SERVER_STARTING.register(server -> {
80+
SERVER_CONFIG = readServerConfig(server.getRegistryManager()).orElse(ServerConfig.DEFAULT);
81+
SERVER_CONFIG.validateRegistryEntries(server.getRegistryManager());
82+
});
8283
ServerLifecycleEvents.SERVER_STOPPING.register(server -> SERVER_CONFIG = null);
8384

8485
// Multiplayer
@@ -90,11 +91,19 @@ public void onInitialize() {
9091
ClientConfigurationNetworking.registerGlobalReceiver(ServerConfigS2CPayload.ID, (payload, context) -> {
9192
//noinspection resource
9293
context.client().execute(() -> {
94+
log(Level.INFO, "Received server config");
9395
// TODO
9496
});
9597
});
9698
});
99+
ServerConfigurationConnectionEvents.CONFIGURE.register((handler, server) -> {
100+
if (ServerConfigurationNetworking.canSend(handler, ServerConfigS2CPayload.ID)) {
101+
log(Level.INFO, "Sent server config");
102+
ServerConfigurationNetworking.send(handler, new ServerConfigS2CPayload());
103+
}
104+
});
97105

106+
//noinspection deprecation
98107
LEGACY_CONFIG = readLegacyConfig().orElse(GrindEnchantmentsConfigV3.DEFAULT);
99108

100109
GrindEnchantmentsRegistries.init();

src/main/java/de/mschae23/grindenchantments/config/FilterConfig.java

Lines changed: 79 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,24 @@
1919

2020
package de.mschae23.grindenchantments.config;
2121

22+
import java.util.List;
23+
import java.util.Optional;
24+
import java.util.stream.Stream;
2225
import net.minecraft.component.type.ItemEnchantmentsComponent;
2326
import net.minecraft.enchantment.Enchantment;
2427
import net.minecraft.item.Item;
25-
import net.minecraft.registry.RegistryCodecs;
28+
import net.minecraft.registry.RegistryKey;
2629
import net.minecraft.registry.RegistryKeys;
30+
import net.minecraft.registry.RegistryWrapper;
2731
import net.minecraft.registry.entry.RegistryEntry;
28-
import net.minecraft.registry.entry.RegistryEntryList;
2932
import net.minecraft.registry.tag.EnchantmentTags;
33+
import net.minecraft.util.Identifier;
34+
import net.minecraft.util.dynamic.Codecs;
35+
import com.mojang.datafixers.util.Pair;
3036
import com.mojang.serialization.Codec;
3137
import com.mojang.serialization.codecs.RecordCodecBuilder;
38+
import de.mschae23.grindenchantments.GrindEnchantmentsMod;
39+
import org.apache.logging.log4j.Level;
3240

3341
public record FilterConfig(boolean enabled, ItemConfig item, EnchantmentConfig enchantment, FilterAction curses) {
3442
public static final Codec<FilterConfig> CODEC = RecordCodecBuilder.create(instance -> instance.group(
@@ -40,32 +48,41 @@ public record FilterConfig(boolean enabled, ItemConfig item, EnchantmentConfig e
4048

4149
public static final FilterConfig DEFAULT = new FilterConfig(true, ItemConfig.DEFAULT, EnchantmentConfig.DEFAULT, FilterAction.IGNORE);
4250

43-
public ItemEnchantmentsComponent filter(ItemEnchantmentsComponent enchantments) {
44-
if (!this.enabled) {
45-
return enchantments;
46-
}
47-
48-
ItemEnchantmentsComponent.Builder builder = new ItemEnchantmentsComponent.Builder(enchantments);
49-
51+
private boolean shouldDeny(ItemEnchantmentsComponent.Builder builder) {
5052
if (this.curses == FilterAction.DENY) {
5153
for (RegistryEntry<Enchantment> entry : builder.getEnchantments()) {
5254
if (entry.isIn(EnchantmentTags.CURSE)) {
53-
return ItemEnchantmentsComponent.DEFAULT;
55+
return true;
5456
}
5557
}
5658
}
5759

5860
if (this.enchantment.action == FilterAction.DENY) {
5961
for (RegistryEntry<Enchantment> entry : builder.getEnchantments()) {
60-
if (this.enchantment.enchantments.contains(entry)) {
61-
return ItemEnchantmentsComponent.DEFAULT;
62+
if (entry.getKey().map(key -> this.enchantment.enchantments.contains(key.getValue())).orElse(false)) {
63+
return true;
6264
}
6365
}
6466
}
6567

68+
return false;
69+
}
70+
71+
public ItemEnchantmentsComponent filter(ItemEnchantmentsComponent enchantments) {
72+
if (!this.enabled) {
73+
return enchantments;
74+
}
75+
76+
ItemEnchantmentsComponent.Builder builder = new ItemEnchantmentsComponent.Builder(enchantments);
77+
78+
if (this.shouldDeny(builder)) {
79+
return ItemEnchantmentsComponent.DEFAULT;
80+
}
81+
6682
builder.remove(enchantment ->
6783
((this.curses == FilterAction.IGNORE) && enchantment.isIn(EnchantmentTags.CURSE))
68-
|| ((this.enchantment.action == FilterAction.IGNORE) == this.enchantment.enchantments.contains(enchantment)));
84+
|| ((this.enchantment.action == FilterAction.IGNORE) == enchantment.getKey().map(key ->
85+
this.enchantment.enchantments.contains(key.getValue())).orElse(false)));
6986

7087
return builder.build();
7188
}
@@ -77,44 +94,72 @@ public ItemEnchantmentsComponent filterReversed(ItemEnchantmentsComponent enchan
7794

7895
ItemEnchantmentsComponent.Builder builder = new ItemEnchantmentsComponent.Builder(enchantments);
7996

80-
if (this.curses == FilterAction.DENY) {
81-
for (RegistryEntry<Enchantment> entry : builder.getEnchantments()) {
82-
if (entry.isIn(EnchantmentTags.CURSE)) {
83-
return ItemEnchantmentsComponent.DEFAULT;
84-
}
85-
}
86-
}
87-
88-
if (this.enchantment.action == FilterAction.DENY) {
89-
for (RegistryEntry<Enchantment> entry : builder.getEnchantments()) {
90-
if (this.enchantment.enchantments.contains(entry)) {
91-
return ItemEnchantmentsComponent.DEFAULT;
92-
}
93-
}
97+
if (this.shouldDeny(builder)) {
98+
return ItemEnchantmentsComponent.DEFAULT;
9499
}
95100

96101
builder.remove(enchantment ->
97102
((this.curses == FilterAction.ALLOW) || !enchantment.isIn(EnchantmentTags.CURSE))
98-
&& ((this.enchantment.action == FilterAction.ALLOW) == this.enchantment.enchantments.contains(enchantment)));
103+
&& ((this.enchantment.action == FilterAction.ALLOW) == enchantment.getKey().map(key ->
104+
this.enchantment.enchantments.contains(key.getValue())).orElse(false)));
99105

100106
return builder.build();
101107
}
102108

103-
public record ItemConfig(RegistryEntryList<Item> items, FilterAction action) {
109+
public void validateRegistryEntries(RegistryWrapper.WrapperLookup wrapperLookup) {
110+
this.item.validateRegistryEntries(wrapperLookup);
111+
this.enchantment.validateRegistryEntries(wrapperLookup);
112+
}
113+
114+
public record ItemConfig(List<Identifier> items, FilterAction action) {
104115
public static final Codec<ItemConfig> CODEC = RecordCodecBuilder.create(instance -> instance.group(
105-
RegistryCodecs.entryList(RegistryKeys.ITEM).fieldOf("enchantments").forGetter(ItemConfig::items),
116+
Codecs.listOrSingle(Identifier.CODEC).fieldOf("enchantments").forGetter(ItemConfig::items),
106117
FilterAction.NON_IGNORE_CODEC.fieldOf("action").forGetter(ItemConfig::action)
107118
).apply(instance, instance.stable(ItemConfig::new)));
108119

109-
public static final ItemConfig DEFAULT = new ItemConfig(RegistryEntryList.empty(), FilterAction.DENY);
120+
public static final ItemConfig DEFAULT = new ItemConfig(List.of(), FilterAction.DENY);
121+
122+
public void validateRegistryEntries(RegistryWrapper.WrapperLookup wrapperLookup) {
123+
Optional<? extends RegistryWrapper.Impl<Item>> registryWrapperOpt = wrapperLookup.getOptional(RegistryKeys.ITEM);
124+
125+
if (registryWrapperOpt.isEmpty()) {
126+
GrindEnchantmentsMod.log(Level.WARN, "Item registry is not present");
127+
return;
128+
}
129+
130+
RegistryWrapper.Impl<Item> registryWrapper = registryWrapperOpt.get();
131+
132+
this.items.stream()
133+
.map(item -> Pair.of(item, registryWrapper.getOptional(RegistryKey.of(RegistryKeys.ITEM, item))))
134+
.flatMap(result -> result.getSecond().isEmpty() ? Stream.of(result.getFirst()) : Stream.empty())
135+
.map(Identifier::toString)
136+
.forEach(item -> GrindEnchantmentsMod.log(Level.WARN, "Filter config contains unknown item: " + item));
137+
}
110138
}
111139

112-
public record EnchantmentConfig(RegistryEntryList<Enchantment> enchantments, FilterAction action) {
140+
public record EnchantmentConfig(List<Identifier> enchantments, FilterAction action) {
113141
public static final Codec<EnchantmentConfig> CODEC = RecordCodecBuilder.create(instance -> instance.group(
114-
RegistryCodecs.entryList(RegistryKeys.ENCHANTMENT).fieldOf("enchantments").forGetter(EnchantmentConfig::enchantments),
142+
Codecs.listOrSingle(Identifier.CODEC).fieldOf("enchantments").forGetter(EnchantmentConfig::enchantments),
115143
FilterAction.CODEC.fieldOf("action").forGetter(EnchantmentConfig::action)
116144
).apply(instance, instance.stable(EnchantmentConfig::new)));
117145

118-
public static final EnchantmentConfig DEFAULT = new EnchantmentConfig(RegistryEntryList.empty(), FilterAction.IGNORE);
146+
public static final EnchantmentConfig DEFAULT = new EnchantmentConfig(List.of(), FilterAction.IGNORE);
147+
148+
public void validateRegistryEntries(RegistryWrapper.WrapperLookup wrapperLookup) {
149+
Optional<? extends RegistryWrapper.Impl<Enchantment>> registryWrapperOpt = wrapperLookup.getOptional(RegistryKeys.ENCHANTMENT);
150+
151+
if (registryWrapperOpt.isEmpty()) {
152+
GrindEnchantmentsMod.log(Level.WARN, "Enchantment registry is not present");
153+
return;
154+
}
155+
156+
RegistryWrapper.Impl<Enchantment> registryWrapper = registryWrapperOpt.get();
157+
158+
this.enchantments.stream()
159+
.map(enchantment -> Pair.of(enchantment, registryWrapper.getOptional(RegistryKey.of(RegistryKeys.ENCHANTMENT, enchantment))))
160+
.flatMap(result -> result.getSecond().isEmpty() ? Stream.of(result.getFirst()) : Stream.empty())
161+
.map(Identifier::toString)
162+
.forEach(item -> GrindEnchantmentsMod.log(Level.WARN, "Filter config contains unknown enchantment: " + item));
163+
}
119164
}
120165
}

src/main/java/de/mschae23/grindenchantments/config/ResetRepairCostConfig.java

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,29 +19,52 @@
1919

2020
package de.mschae23.grindenchantments.config;
2121

22+
import java.util.List;
23+
import java.util.Optional;
24+
import java.util.stream.Stream;
2225
import net.minecraft.item.Item;
23-
import net.minecraft.item.Items;
24-
import net.minecraft.registry.RegistryCodecs;
26+
import net.minecraft.registry.RegistryKey;
2527
import net.minecraft.registry.RegistryKeys;
26-
import net.minecraft.registry.entry.RegistryEntryList;
28+
import net.minecraft.registry.RegistryWrapper;
29+
import net.minecraft.util.Identifier;
30+
import net.minecraft.util.dynamic.Codecs;
31+
import com.mojang.datafixers.util.Pair;
2732
import com.mojang.serialization.Codec;
2833
import com.mojang.serialization.codecs.RecordCodecBuilder;
34+
import de.mschae23.grindenchantments.GrindEnchantmentsMod;
2935
import de.mschae23.grindenchantments.cost.AverageCountCostFunction;
3036
import de.mschae23.grindenchantments.cost.CostFunction;
3137
import de.mschae23.grindenchantments.cost.CountLevelsCostFunction;
3238
import de.mschae23.grindenchantments.cost.TransformCostFunction;
39+
import org.apache.logging.log4j.Level;
3340

34-
public record ResetRepairCostConfig(boolean enabled, RegistryEntryList<Item> catalystItems, boolean requiresEnchantment, CostFunction costFunction) {
41+
public record ResetRepairCostConfig(boolean enabled, List<Identifier> catalystItems, boolean requiresEnchantment, CostFunction costFunction) {
3542
public static final Codec<ResetRepairCostConfig> CODEC = RecordCodecBuilder.create(instance -> instance.group(
3643
Codec.BOOL.fieldOf("enabled").forGetter(ResetRepairCostConfig::enabled),
37-
RegistryCodecs.entryList(RegistryKeys.ITEM).fieldOf("catalyst_items").forGetter(ResetRepairCostConfig::catalystItems),
44+
Codecs.listOrSingle(Identifier.CODEC).fieldOf("catalyst_items").forGetter(ResetRepairCostConfig::catalystItems),
3845
Codec.BOOL.fieldOf("requires_enchantment").forGetter(ResetRepairCostConfig::requiresEnchantment),
3946
CostFunction.TYPE_CODEC.fieldOf("cost_function").forGetter(ResetRepairCostConfig::costFunction)
4047
).apply(instance, instance.stable(ResetRepairCostConfig::new)));
4148

42-
@SuppressWarnings("deprecation")
4349
public static final ResetRepairCostConfig DEFAULT = new ResetRepairCostConfig(false,
44-
RegistryEntryList.of(Items.DIAMOND.getRegistryEntry()), true,
50+
List.of(Identifier.ofVanilla("diamond")), true,
4551
// Intentionally no filter function
4652
new TransformCostFunction(new AverageCountCostFunction(new CountLevelsCostFunction(1.0, 4.0)), 1.5, 4.0));
53+
54+
public void validateRegistryEntries(RegistryWrapper.WrapperLookup wrapperLookup) {
55+
Optional<? extends RegistryWrapper.Impl<Item>> registryWrapperOpt = wrapperLookup.getOptional(RegistryKeys.ITEM);
56+
57+
if (registryWrapperOpt.isEmpty()) {
58+
GrindEnchantmentsMod.log(Level.WARN, "Item registry is not present");
59+
return;
60+
}
61+
62+
RegistryWrapper.Impl<Item> registryWrapper = registryWrapperOpt.get();
63+
64+
this.catalystItems.stream()
65+
.map(item -> Pair.of(item, registryWrapper.getOptional(RegistryKey.of(RegistryKeys.ITEM, item))))
66+
.flatMap(result -> result.getSecond().isEmpty() ? Stream.of(result.getFirst()) : Stream.empty())
67+
.map(Identifier::toString)
68+
.forEach(item -> GrindEnchantmentsMod.log(Level.WARN, "Reset repair cost config contains unknown catalyst item: " + item));
69+
}
4770
}

src/main/java/de/mschae23/grindenchantments/config/ServerConfig.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package de.mschae23.grindenchantments.config;
2121

22+
import net.minecraft.registry.RegistryWrapper;
2223
import com.mojang.serialization.MapCodec;
2324
import com.mojang.serialization.codecs.RecordCodecBuilder;
2425
import de.mschae23.config.api.ModConfig;
@@ -55,4 +56,9 @@ public ServerConfig latest() {
5556
public boolean shouldUpdate() {
5657
return true;
5758
}
59+
60+
public void validateRegistryEntries(RegistryWrapper.WrapperLookup wrapperLookup) {
61+
this.filter.validateRegistryEntries(wrapperLookup);
62+
this.resetRepairCost.validateRegistryEntries(wrapperLookup);
63+
}
5864
}

src/main/java/de/mschae23/grindenchantments/network/s2c/ServerConfigS2CPayload.java renamed to src/main/java/de/mschae23/grindenchantments/config/sync/ServerConfigS2CPayload.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
* along with this program. If not, see <https://www.gnu.org/licenses/>.
1818
*/
1919

20-
package de.mschae23.grindenchantments.network.s2c;
20+
package de.mschae23.grindenchantments.config.sync;
2121

2222
import net.minecraft.network.PacketByteBuf;
2323
import net.minecraft.network.codec.PacketCodec;

src/main/java/de/mschae23/grindenchantments/impl/DisenchantOperation.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import de.mschae23.grindenchantments.GrindEnchantmentsMod;
3434
import de.mschae23.grindenchantments.config.FilterAction;
3535
import de.mschae23.grindenchantments.config.FilterConfig;
36-
import de.mschae23.grindenchantments.config.legacy.v3.GrindEnchantmentsConfigV3;
36+
import de.mschae23.grindenchantments.config.ServerConfig;
3737
import de.mschae23.grindenchantments.event.ApplyLevelCostEvent;
3838
import de.mschae23.grindenchantments.event.GrindstoneEvents;
3939
import org.jetbrains.annotations.NotNull;
@@ -52,14 +52,14 @@ public boolean canInsert(ItemStack stack, ItemStack other, int slotId) {
5252

5353
ItemStack enchantedItemStack = input1.hasEnchantments() ? input1 : input2;
5454

55-
GrindEnchantmentsConfigV3 config = GrindEnchantmentsMod.getConfig();
55+
ServerConfig config = GrindEnchantmentsMod.getServerConfig();
5656
return transferEnchantmentsToBook(enchantedItemStack, config.filter());
5757
}
5858

5959
@Override
6060
public boolean canTakeResult(ItemStack input1, ItemStack input2, PlayerEntity player, RegistryWrapper.WrapperLookup wrapperLookup) {
6161
if (isDisenchantOperation(input1, input2)) {
62-
GrindEnchantmentsConfigV3 config = GrindEnchantmentsMod.getConfig();
62+
ServerConfig config = GrindEnchantmentsMod.getServerConfig();
6363

6464
boolean stack1Book = input1.getItem() == Items.BOOK;
6565
ItemStack enchantedItemStack = stack1Book ? input2 : input1;
@@ -77,7 +77,7 @@ public boolean onTakeResult(ItemStack input1, ItemStack input2, ItemStack result
7777
return false;
7878
}
7979

80-
GrindEnchantmentsConfigV3 config = GrindEnchantmentsMod.getConfig();
80+
ServerConfig config = GrindEnchantmentsMod.getServerConfig();
8181

8282
boolean stack1Book = input1.getItem() == Items.BOOK;
8383
ItemStack enchantedItemStack = stack1Book ? input2 : input1;
@@ -105,7 +105,7 @@ public boolean onTakeResult(ItemStack input1, ItemStack input2, ItemStack result
105105
@Override
106106
public int getLevelCost(ItemStack input1, ItemStack input2, PlayerEntity player, RegistryWrapper.WrapperLookup wrapperLookup) {
107107
if (isDisenchantOperation(input1, input2)) {
108-
GrindEnchantmentsConfigV3 config = GrindEnchantmentsMod.getConfig();
108+
ServerConfig config = GrindEnchantmentsMod.getServerConfig();
109109
boolean stack1Book = input1.getItem() == Items.BOOK;
110110
ItemStack enchantedItemStack = stack1Book ? input2 : input1;
111111

@@ -121,7 +121,7 @@ private static int debugLevelCost(@SuppressWarnings("unused") String location, i
121121
}
122122

123123
public static boolean isDisenchantOperation(ItemStack input1, ItemStack input2) {
124-
if (!GrindEnchantmentsMod.getConfig().disenchant().enabled())
124+
if (!GrindEnchantmentsMod.getServerConfig().disenchant().enabled())
125125
return false;
126126

127127
return input1.hasEnchantments() && input2.getItem() == Items.BOOK
@@ -135,7 +135,7 @@ public static boolean canTakeResult(@SuppressWarnings("unused") ItemStack input1
135135

136136
public static ItemStack transferEnchantmentsToBook(ItemStack source, FilterConfig filter) {
137137
if (filter.enabled() && filter.item().action() != FilterAction.IGNORE
138-
&& (filter.item().action() == FilterAction.DENY) == filter.item().items().contains(source.getRegistryEntry())) {
138+
&& (filter.item().action() == FilterAction.DENY) == source.getRegistryEntry().getKey().map(key -> filter.item().items().contains(key.getValue())).orElse(false)) {
139139
return ItemStack.EMPTY;
140140
}
141141

0 commit comments

Comments
 (0)