Skip to content

Commit 731981f

Browse files
committed
Make it possible for legacy config to be read on the client
1 parent 600ba25 commit 731981f

13 files changed

+199
-75
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@
3131
import net.minecraft.text.MutableText;
3232
import net.minecraft.text.Text;
3333
import net.minecraft.util.Formatting;
34-
import de.mschae23.grindenchantments.config.legacy.DedicatedServerConfig;
3534
import de.mschae23.grindenchantments.config.FilterConfig;
35+
import de.mschae23.grindenchantments.config.legacy.v3.DedicatedServerConfigV3;
3636
import de.mschae23.grindenchantments.cost.CostFunction;
3737

3838
public class GrindEnchantments {
@@ -47,7 +47,7 @@ public static ItemEnchantmentsComponent getEnchantments(ItemStack stack, FilterC
4747
return filter.filter(EnchantmentHelper.getEnchantments(stack));
4848
}
4949

50-
public static ItemStack addLevelCostComponent(ItemStack stack, IntSupplier cost, boolean canTakeItem, DedicatedServerConfig config) {
50+
public static ItemStack addLevelCostComponent(ItemStack stack, IntSupplier cost, boolean canTakeItem, DedicatedServerConfigV3 config) {
5151
if (!config.alternativeCostDisplay())
5252
return stack;
5353

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

Lines changed: 44 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,24 @@
1919

2020
package de.mschae23.grindenchantments;
2121

22+
import java.io.IOException;
23+
import java.io.InputStream;
24+
import java.nio.file.Files;
2225
import java.nio.file.Path;
2326
import java.nio.file.Paths;
24-
import net.minecraft.registry.RegistryOps;
27+
import java.util.Optional;
2528
import net.minecraft.util.Identifier;
2629
import net.fabricmc.api.ModInitializer;
27-
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
2830
import net.fabricmc.loader.api.FabricLoader;
2931
import com.mojang.serialization.Codec;
3032
import com.mojang.serialization.JsonOps;
3133
import com.mojang.serialization.MapCodec;
32-
import de.mschae23.config.api.ConfigIo;
3334
import de.mschae23.config.api.ModConfig;
35+
import de.mschae23.config.api.exception.ConfigException;
36+
import de.mschae23.config.impl.ConfigUtil;
3437
import de.mschae23.grindenchantments.config.legacy.v1.GrindEnchantmentsConfigV1;
3538
import de.mschae23.grindenchantments.config.legacy.v2.GrindEnchantmentsConfigV2;
36-
import de.mschae23.grindenchantments.config.legacy.GrindEnchantmentsConfigV3;
39+
import de.mschae23.grindenchantments.config.legacy.v3.GrindEnchantmentsConfigV3;
3740
import de.mschae23.grindenchantments.cost.CostFunctionType;
3841
import de.mschae23.grindenchantments.event.ApplyLevelCostEvent;
3942
import de.mschae23.grindenchantments.event.GrindstoneEvents;
@@ -45,36 +48,17 @@
4548
import org.apache.logging.log4j.Level;
4649
import org.apache.logging.log4j.LogManager;
4750
import org.apache.logging.log4j.Logger;
51+
import org.jetbrains.annotations.Nullable;
4852

4953
public class GrindEnchantmentsMod implements ModInitializer {
5054
public static final String MODID = "grindenchantments";
5155
public static final Logger LOGGER = LogManager.getLogger("Grind Enchantments");
5256

53-
public static final Path CONFIG_PATH = Paths.get(MODID + ".json");
54-
5557
private static GrindEnchantmentsConfigV3 LEGACY_CONFIG = GrindEnchantmentsConfigV3.DEFAULT;
5658

5759
@Override
5860
public void onInitialize() {
59-
final GrindEnchantmentsConfigV3 legacyLatestConfigDefault = GrindEnchantmentsConfigV3.DEFAULT;
60-
final int legacyLatestConfigVersion = legacyLatestConfigDefault.version();
61-
@SuppressWarnings({"unchecked", "deprecation"})
62-
final MapCodec<? extends ModConfig<GrindEnchantmentsConfigV3>>[] legacyConfigCodecs = new MapCodec[] {
63-
GrindEnchantmentsConfigV1.TYPE_CODEC, GrindEnchantmentsConfigV2.TYPE_CODEC, GrindEnchantmentsConfigV3.TYPE_CODEC
64-
};
65-
66-
final Codec<ModConfig<GrindEnchantmentsConfigV3>> legacyConfigCodec = ModConfig.createCodec(legacyLatestConfigVersion, version ->
67-
getConfigType(0, legacyConfigCodecs, version));
68-
69-
// TODO Proper solution to client-side configs
70-
// ClientLifecycleEvents.CLIENT_STARTED.register(client ->
71-
// CONFIG = ConfigIo.initializeConfig(Paths.get(MODID + ".json"), LATEST_CONFIG_VERSION, LATEST_CONFIG_DEFAULT, CONFIG_CODEC,
72-
// JsonOps.INSTANCE, LOGGER::info, LOGGER::error)
73-
// );
74-
ServerLifecycleEvents.SERVER_STARTING.register(server ->
75-
LEGACY_CONFIG = ConfigIo.initializeConfig(Paths.get(MODID + ".json"), legacyLatestConfigVersion, legacyLatestConfigDefault, legacyConfigCodec,
76-
RegistryOps.of(JsonOps.INSTANCE, server.getRegistryManager()), LOGGER::info, LOGGER::error)
77-
);
61+
LEGACY_CONFIG = readLegacyConfig().orElse(GrindEnchantmentsConfigV3.DEFAULT);
7862

7963
GrindEnchantmentsRegistries.init();
8064
CostFunctionType.init();
@@ -111,6 +95,41 @@ public void onInitialize() {
11195
return new ModConfig.Type<>(codecs.length + versionOffset, codecs[codecs.length - 1]);
11296
}
11397

98+
@SuppressWarnings("deprecation")
99+
private static Optional<GrindEnchantmentsConfigV3> readLegacyConfig() {
100+
final GrindEnchantmentsConfigV3 legacyLatestConfigDefault = GrindEnchantmentsConfigV3.DEFAULT;
101+
final int legacyLatestConfigVersion = legacyLatestConfigDefault.version();
102+
@SuppressWarnings({"unchecked", "deprecation"})
103+
final MapCodec<? extends ModConfig<GrindEnchantmentsConfigV3>>[] legacyConfigCodecs = new MapCodec[] {
104+
GrindEnchantmentsConfigV1.TYPE_CODEC, GrindEnchantmentsConfigV2.TYPE_CODEC, GrindEnchantmentsConfigV3.TYPE_CODEC
105+
};
106+
107+
final Codec<ModConfig<GrindEnchantmentsConfigV3>> legacyConfigCodec = ModConfig.createCodec(legacyLatestConfigVersion, version ->
108+
getConfigType(0, legacyConfigCodecs, version));
109+
110+
// Unfortunately, this requires some manual work and usage of codec config API's internals
111+
112+
Path configPath = FabricLoader.getInstance().getConfigDir().resolve(Paths.get(MODID + ".json"));
113+
@Nullable
114+
GrindEnchantmentsConfigV3 config = null;
115+
116+
if (Files.exists(configPath) && Files.isRegularFile(configPath)) {
117+
try (InputStream input = Files.newInputStream(configPath)) {
118+
log(Level.INFO, "Reading legacy config.");
119+
120+
@SuppressWarnings("UnstableApiUsage")
121+
ModConfig<GrindEnchantmentsConfigV3> readConfig = ConfigUtil.decodeConfig(input, legacyConfigCodec, JsonOps.INSTANCE);
122+
config = readConfig.latest();
123+
} catch (IOException e) {
124+
log(Level.ERROR, "IO exception while trying to read config: " + e.getLocalizedMessage());
125+
} catch (ConfigException e) {
126+
log(Level.ERROR, e.getLocalizedMessage());
127+
}
128+
}
129+
130+
return Optional.ofNullable(config);
131+
}
132+
114133
public static GrindEnchantmentsConfigV3 getConfig() {
115134
return LEGACY_CONFIG;
116135
}

src/main/java/de/mschae23/grindenchantments/config/legacy/v1/GrindEnchantmentsConfigV1.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,21 @@
2323
import com.mojang.serialization.MapCodec;
2424
import com.mojang.serialization.codecs.RecordCodecBuilder;
2525
import de.mschae23.config.api.ModConfig;
26-
import de.mschae23.grindenchantments.config.legacy.ClientConfig;
27-
import de.mschae23.grindenchantments.config.legacy.DedicatedServerConfig;
2826
import de.mschae23.grindenchantments.config.legacy.v2.GrindEnchantmentsConfigV2;
29-
import de.mschae23.grindenchantments.config.legacy.GrindEnchantmentsConfigV3;
27+
import de.mschae23.grindenchantments.config.legacy.v3.ClientConfigV3;
28+
import de.mschae23.grindenchantments.config.legacy.v3.DedicatedServerConfigV3;
29+
import de.mschae23.grindenchantments.config.legacy.v3.GrindEnchantmentsConfigV3;
3030

3131
@Deprecated
3232
@SuppressWarnings("DeprecatedIsStillUsed")
33-
public record GrindEnchantmentsConfigV1(de.mschae23.grindenchantments.config.legacy.v1.DisenchantConfigV1 disenchant, MoveConfigV1 move, boolean allowCurses,
34-
DedicatedServerConfig dedicatedServerConfig, ClientConfig clientConfig) implements ModConfig<GrindEnchantmentsConfigV3> {
33+
public record GrindEnchantmentsConfigV1(DisenchantConfigV1 disenchant, MoveConfigV1 move, boolean allowCurses,
34+
DedicatedServerConfigV3 dedicatedServerConfig, ClientConfigV3 clientConfig) implements ModConfig<GrindEnchantmentsConfigV3> {
3535
public static final MapCodec<GrindEnchantmentsConfigV1> TYPE_CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group(
3636
DisenchantConfigV1.CODEC.fieldOf("disenchant_to_book").forGetter(GrindEnchantmentsConfigV1::disenchant),
3737
MoveConfigV1.CODEC.fieldOf("move_enchantments").forGetter(GrindEnchantmentsConfigV1::move),
3838
Codec.BOOL.orElse(Boolean.FALSE).fieldOf("allow_removing_curses").forGetter(GrindEnchantmentsConfigV1::allowCurses),
39-
DedicatedServerConfig.CODEC.orElse(DedicatedServerConfig.DEFAULT).fieldOf("dedicated_server_options").forGetter(GrindEnchantmentsConfigV1::dedicatedServerConfig),
40-
ClientConfig.CODEC.fieldOf("client_options").forGetter(GrindEnchantmentsConfigV1::clientConfig)
39+
DedicatedServerConfigV3.CODEC.orElse(DedicatedServerConfigV3.DEFAULT).fieldOf("dedicated_server_options").forGetter(GrindEnchantmentsConfigV1::dedicatedServerConfig),
40+
ClientConfigV3.CODEC.fieldOf("client_options").forGetter(GrindEnchantmentsConfigV1::clientConfig)
4141
).apply(instance, instance.stable(GrindEnchantmentsConfigV1::new)));
4242

4343
public static final Type<GrindEnchantmentsConfigV3, GrindEnchantmentsConfigV1> TYPE = new Type<>(1, TYPE_CODEC);

src/main/java/de/mschae23/grindenchantments/config/legacy/v2/GrindEnchantmentsConfigV2.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,32 +23,33 @@
2323
import com.mojang.serialization.MapCodec;
2424
import com.mojang.serialization.codecs.RecordCodecBuilder;
2525
import de.mschae23.config.api.ModConfig;
26-
import de.mschae23.grindenchantments.config.legacy.ClientConfig;
27-
import de.mschae23.grindenchantments.config.legacy.DedicatedServerConfig;
2826
import de.mschae23.grindenchantments.config.DisenchantConfig;
2927
import de.mschae23.grindenchantments.config.FilterAction;
30-
import de.mschae23.grindenchantments.config.FilterConfig;
31-
import de.mschae23.grindenchantments.config.legacy.GrindEnchantmentsConfigV3;
3228
import de.mschae23.grindenchantments.config.MoveConfig;
3329
import de.mschae23.grindenchantments.config.ResetRepairCostConfig;
30+
import de.mschae23.grindenchantments.config.legacy.v3.ClientConfigV3;
31+
import de.mschae23.grindenchantments.config.legacy.v3.DedicatedServerConfigV3;
32+
import de.mschae23.grindenchantments.config.legacy.v3.FilterConfigV3;
33+
import de.mschae23.grindenchantments.config.legacy.v3.GrindEnchantmentsConfigV3;
34+
import de.mschae23.grindenchantments.config.legacy.v3.ResetRepairCostConfigV3;
3435
import de.mschae23.grindenchantments.cost.FilterCostFunction;
3536

3637
@Deprecated
3738
@SuppressWarnings("DeprecatedIsStillUsed")
3839
public record GrindEnchantmentsConfigV2(DisenchantConfig disenchant, MoveConfig move, boolean allowCurses,
39-
DedicatedServerConfig dedicatedServerConfig, ClientConfig clientConfig) implements ModConfig<GrindEnchantmentsConfigV3> {
40+
DedicatedServerConfigV3 dedicatedServerConfig, ClientConfigV3 clientConfig) implements ModConfig<GrindEnchantmentsConfigV3> {
4041
public static final MapCodec<GrindEnchantmentsConfigV2> TYPE_CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group(
4142
DisenchantConfig.CODEC.fieldOf("disenchant_to_book").forGetter(GrindEnchantmentsConfigV2::disenchant),
4243
MoveConfig.CODEC.fieldOf("move_enchantments").forGetter(GrindEnchantmentsConfigV2::move),
4344
Codec.BOOL.orElse(Boolean.FALSE).fieldOf("allow_removing_curses").forGetter(GrindEnchantmentsConfigV2::allowCurses),
44-
DedicatedServerConfig.CODEC.orElse(DedicatedServerConfig.DEFAULT).fieldOf("dedicated_server_options").forGetter(GrindEnchantmentsConfigV2::dedicatedServerConfig),
45-
ClientConfig.CODEC.fieldOf("client_options").forGetter(GrindEnchantmentsConfigV2::clientConfig)
45+
DedicatedServerConfigV3.CODEC.orElse(DedicatedServerConfigV3.DEFAULT).fieldOf("dedicated_server_options").forGetter(GrindEnchantmentsConfigV2::dedicatedServerConfig),
46+
ClientConfigV3.CODEC.fieldOf("client_options").forGetter(GrindEnchantmentsConfigV2::clientConfig)
4647
).apply(instance, instance.stable(GrindEnchantmentsConfigV2::new)));
4748

4849
public static final Type<GrindEnchantmentsConfigV3, GrindEnchantmentsConfigV2> TYPE = new Type<>(2, TYPE_CODEC);
4950

5051
public static final GrindEnchantmentsConfigV2 DEFAULT =
51-
new GrindEnchantmentsConfigV2(DisenchantConfig.DEFAULT, MoveConfig.DEFAULT, false, DedicatedServerConfig.DEFAULT, ClientConfig.DEFAULT);
52+
new GrindEnchantmentsConfigV2(DisenchantConfig.DEFAULT, MoveConfig.DEFAULT, false, DedicatedServerConfigV3.DEFAULT, ClientConfigV3.DEFAULT);
5253

5354
@Override
5455
public Type<GrindEnchantmentsConfigV3, ?> type() {
@@ -62,8 +63,8 @@ public GrindEnchantmentsConfigV3 latest() {
6263
new FilterCostFunction(this.disenchant.costFunction())),
6364
new MoveConfig(this.move.enabled(),
6465
new FilterCostFunction(this.move.costFunction())),
65-
new ResetRepairCostConfig(false, ResetRepairCostConfig.DEFAULT.catalystItems(), ResetRepairCostConfig.DEFAULT.requiresEnchantment(), ResetRepairCostConfig.DEFAULT.costFunction()),
66-
new FilterConfig(true, FilterConfig.ItemConfig.DEFAULT, FilterConfig.EnchantmentConfig.DEFAULT,
66+
new ResetRepairCostConfigV3(false, ResetRepairCostConfigV3.DEFAULT.catalystItems(), ResetRepairCostConfig.DEFAULT.requiresEnchantment(), ResetRepairCostConfig.DEFAULT.costFunction()),
67+
new FilterConfigV3(true, FilterConfigV3.ItemConfig.DEFAULT, FilterConfigV3.EnchantmentConfig.DEFAULT,
6768
this.allowCurses ? FilterAction.ALLOW : FilterAction.IGNORE),
6869
this.dedicatedServerConfig, this.clientConfig);
6970
}

src/main/java/de/mschae23/grindenchantments/config/legacy/ClientConfig.java renamed to src/main/java/de/mschae23/grindenchantments/config/legacy/v3/ClientConfigV3.java

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

20-
package de.mschae23.grindenchantments.config.legacy;
20+
package de.mschae23.grindenchantments.config.legacy.v3;
2121

2222
import com.mojang.serialization.Codec;
2323
import com.mojang.serialization.codecs.RecordCodecBuilder;
2424

25-
public record ClientConfig(boolean showLevelCost) {
26-
public static final Codec<ClientConfig> CODEC = RecordCodecBuilder.create(instance -> instance.group(
27-
Codec.BOOL.fieldOf("show_enchantment_cost").forGetter(ClientConfig::showLevelCost)
28-
).apply(instance, instance.stable(ClientConfig::new)));
25+
@Deprecated
26+
public record ClientConfigV3(boolean showLevelCost) {
27+
public static final Codec<ClientConfigV3> CODEC = RecordCodecBuilder.create(instance -> instance.group(
28+
Codec.BOOL.fieldOf("show_enchantment_cost").forGetter(ClientConfigV3::showLevelCost)
29+
).apply(instance, instance.stable(ClientConfigV3::new)));
2930

30-
public static final ClientConfig DEFAULT = new ClientConfig(true);
31+
public static final ClientConfigV3 DEFAULT = new ClientConfigV3(true);
3132
}

src/main/java/de/mschae23/grindenchantments/config/legacy/DedicatedServerConfig.java renamed to src/main/java/de/mschae23/grindenchantments/config/legacy/v3/DedicatedServerConfigV3.java

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

20-
package de.mschae23.grindenchantments.config.legacy;
20+
package de.mschae23.grindenchantments.config.legacy.v3;
2121

2222
import com.mojang.serialization.Codec;
2323
import com.mojang.serialization.codecs.RecordCodecBuilder;
2424

25-
public record DedicatedServerConfig(boolean alternativeCostDisplay) {
26-
public static final Codec<DedicatedServerConfig> CODEC = RecordCodecBuilder.create(instance -> instance.group(
27-
Codec.BOOL.fieldOf("alternative_cost_display_enabled").forGetter(DedicatedServerConfig::alternativeCostDisplay)
28-
).apply(instance, instance.stable(DedicatedServerConfig::new)));
25+
@Deprecated
26+
public record DedicatedServerConfigV3(boolean alternativeCostDisplay) {
27+
public static final Codec<DedicatedServerConfigV3> CODEC = RecordCodecBuilder.create(instance -> instance.group(
28+
Codec.BOOL.fieldOf("alternative_cost_display_enabled").forGetter(DedicatedServerConfigV3::alternativeCostDisplay)
29+
).apply(instance, instance.stable(DedicatedServerConfigV3::new)));
2930

30-
public static final DedicatedServerConfig DEFAULT = new DedicatedServerConfig(false);
31+
public static final DedicatedServerConfigV3 DEFAULT = new DedicatedServerConfigV3(false);
3132
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
* Copyright (C) 2024 mschae23
3+
*
4+
* This file is part of Grind enchantments.
5+
*
6+
* Grind enchantments is free software: you can redistribute it and/or modify
7+
* it under the terms of the GNU Lesser General Public License as published by
8+
* the Free Software Foundation, either version 3 of the License, or
9+
* (at your option) any later version.
10+
*
11+
* This program is distributed in the hope that it will be useful,
12+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
* GNU Lesser General Public License for more details.
15+
*
16+
* You should have received a copy of the GNU Lesser General Public License
17+
* along with this program. If not, see <https://www.gnu.org/licenses/>.
18+
*/
19+
20+
package de.mschae23.grindenchantments.config.legacy.v3;
21+
22+
import java.util.List;
23+
import net.minecraft.util.Identifier;
24+
import net.minecraft.util.dynamic.Codecs;
25+
import com.mojang.serialization.Codec;
26+
import com.mojang.serialization.codecs.RecordCodecBuilder;
27+
import de.mschae23.grindenchantments.config.FilterAction;
28+
29+
@Deprecated
30+
public record FilterConfigV3(boolean enabled, ItemConfig item, EnchantmentConfig enchantment, FilterAction curses) {
31+
public static final Codec<FilterConfigV3> CODEC = RecordCodecBuilder.create(instance -> instance.group(
32+
Codec.BOOL.fieldOf("enabled").forGetter(FilterConfigV3::enabled),
33+
ItemConfig.CODEC.fieldOf("item").forGetter(FilterConfigV3::item),
34+
EnchantmentConfig.CODEC.fieldOf("enchantment").forGetter(FilterConfigV3::enchantment),
35+
FilterAction.CODEC.fieldOf("cursed_enchantments").forGetter(FilterConfigV3::curses)
36+
).apply(instance, instance.stable(FilterConfigV3::new)));
37+
38+
public static final FilterConfigV3 DEFAULT = new FilterConfigV3(true, ItemConfig.DEFAULT, EnchantmentConfig.DEFAULT, FilterAction.IGNORE);
39+
40+
public record ItemConfig(List<Identifier> items, FilterAction action) {
41+
public static final Codec<ItemConfig> CODEC = RecordCodecBuilder.create(instance -> instance.group(
42+
Codecs.listOrSingle(Identifier.CODEC).fieldOf("enchantments").forGetter(ItemConfig::items),
43+
FilterAction.NON_IGNORE_CODEC.fieldOf("action").forGetter(ItemConfig::action)
44+
).apply(instance, instance.stable(ItemConfig::new)));
45+
46+
public static final ItemConfig DEFAULT = new ItemConfig(List.of(), FilterAction.DENY);
47+
}
48+
49+
public record EnchantmentConfig(List<Identifier> enchantments, FilterAction action) {
50+
public static final Codec<EnchantmentConfig> CODEC = RecordCodecBuilder.create(instance -> instance.group(
51+
Codecs.listOrSingle(Identifier.CODEC).fieldOf("enchantments").forGetter(EnchantmentConfig::enchantments),
52+
FilterAction.CODEC.fieldOf("action").forGetter(EnchantmentConfig::action)
53+
).apply(instance, instance.stable(EnchantmentConfig::new)));
54+
55+
public static final EnchantmentConfig DEFAULT = new EnchantmentConfig(List.of(), FilterAction.IGNORE);
56+
}
57+
}

0 commit comments

Comments
 (0)