From 4593ba53103f1026c51c888e5faec60665011b8b Mon Sep 17 00:00:00 2001 From: mschae23 <46165762+mschae23@users.noreply.github.com> Date: Sat, 30 Nov 2024 16:09:25 +0100 Subject: [PATCH] Implement config sync --- .../GrindEnchantmentsMod.java | 36 +++++++++--- .../config/ClientConfig.java | 12 +++- .../config/DedicatedServerConfig.java | 14 +++++ .../config/DisenchantConfig.java | 27 ++++++++- .../config/FilterAction.java | 5 ++ .../config/FilterConfig.java | 56 +++++++++++++++++++ .../grindenchantments/config/MoveConfig.java | 30 ++++++++-- .../config/ResetRepairCostConfig.java | 29 +++++++++- .../config/ServerConfig.java | 33 ++++++++++- .../config/legacy/v1/DisenchantConfigV1.java | 2 +- .../config/legacy/v1/MoveConfigV1.java | 2 +- .../legacy/v3/ResetRepairCostConfigV3.java | 2 +- .../config/sync/ServerConfigS2CPayload.java | 10 +++- .../cost/AverageCountCostFunction.java | 18 +++++- .../grindenchantments/cost/CostFunction.java | 13 ++++- .../cost/CostFunctionType.java | 47 ++++++++++++---- .../cost/CountEnchantmentsCostFunction.java | 14 ++++- .../cost/CountLevelsCostFunction.java | 18 +++++- .../cost/CountMinPowerCostFunction.java | 14 ++++- .../cost/FilterCostFunction.java | 18 +++++- .../cost/FirstEnchantmentCostFunction.java | 22 ++++++-- .../cost/TransformCostFunction.java | 21 ++++++- .../registry/GrindEnchantmentsRegistries.java | 3 +- 23 files changed, 395 insertions(+), 51 deletions(-) diff --git a/src/main/java/de/mschae23/grindenchantments/GrindEnchantmentsMod.java b/src/main/java/de/mschae23/grindenchantments/GrindEnchantmentsMod.java index bc2e3bd..92996df 100644 --- a/src/main/java/de/mschae23/grindenchantments/GrindEnchantmentsMod.java +++ b/src/main/java/de/mschae23/grindenchantments/GrindEnchantmentsMod.java @@ -35,7 +35,9 @@ import net.minecraft.util.Identifier; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; +import net.fabricmc.fabric.api.client.networking.v1.ClientConfigurationConnectionEvents; import net.fabricmc.fabric.api.client.networking.v1.ClientConfigurationNetworking; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; import net.fabricmc.fabric.api.networking.v1.ServerConfigurationConnectionEvents; @@ -54,6 +56,7 @@ import de.mschae23.grindenchantments.config.legacy.v2.GrindEnchantmentsConfigV2; import de.mschae23.grindenchantments.config.legacy.v3.GrindEnchantmentsConfigV3; import de.mschae23.grindenchantments.config.sync.ServerConfigS2CPayload; +import de.mschae23.grindenchantments.cost.CostFunction; import de.mschae23.grindenchantments.cost.CostFunctionType; import de.mschae23.grindenchantments.event.ApplyLevelCostEvent; import de.mschae23.grindenchantments.event.GrindstoneEvents; @@ -71,10 +74,10 @@ public class GrindEnchantmentsMod implements ModInitializer { public static final String MODID = "grindenchantments"; public static final Logger LOGGER = LogManager.getLogger("Grind Enchantments"); + private static ClientConfig CLIENT_CONFIG = ClientConfig.DEFAULT; @Nullable private static ServerConfig SERVER_CONFIG = null; - @Nullable - private static ClientConfig CLIENT_CONFIG = null; + private static ServerConfig LOCAL_SERVER_CONFIG = ServerConfig.DEFAULT; @Override public void onInitialize() { @@ -91,26 +94,39 @@ public void onInitialize() { ServerLifecycleEvents.SERVER_STOPPING.register(server -> SERVER_CONFIG = null); // Multiplayer - PayloadTypeRegistry.configurationS2C().register(ServerConfigS2CPayload.ID, ServerConfigS2CPayload.CODEC); + PayloadTypeRegistry.configurationS2C().register(ServerConfigS2CPayload.ID, + ServerConfigS2CPayload.createPacketCodec(CostFunction.createPacketCodec())); ClientLifecycleEvents.CLIENT_STARTED.register(client -> { CLIENT_CONFIG = GrindEnchantmentsMod.initializeClientConfig(); + LOCAL_SERVER_CONFIG = GrindEnchantmentsMod.initializeServerConfig(RegistryWrapper.WrapperLookup.of( + Stream.of(GrindEnchantmentsRegistries.COST_FUNCTION))); ClientConfigurationNetworking.registerGlobalReceiver(ServerConfigS2CPayload.ID, (payload, context) -> { //noinspection resource context.client().execute(() -> { - log(Level.INFO, "Received server config"); - // TODO + // log(Level.DEBUG, payload.config()); + SERVER_CONFIG = payload.config(); }); }); + ClientPlayConnectionEvents.INIT.register((handler, client2) -> { + if (SERVER_CONFIG != null) { + SERVER_CONFIG.validateRegistryEntries(handler.getRegistryManager()); + } + }); }); ServerConfigurationConnectionEvents.CONFIGURE.register((handler, server) -> { if (ServerConfigurationNetworking.canSend(handler, ServerConfigS2CPayload.ID)) { - log(Level.INFO, "Sent server config"); - ServerConfigurationNetworking.send(handler, new ServerConfigS2CPayload()); + ServerConfigurationNetworking.send(handler, new ServerConfigS2CPayload(SERVER_CONFIG != null ? SERVER_CONFIG : LOCAL_SERVER_CONFIG)); } }); + // Set server config to null when joining a world, so that it is known whether the server sent its config + ClientConfigurationConnectionEvents.INIT.register((handler, client) -> SERVER_CONFIG = null); + // Set server config to null when leaving the world too, for the same reason + ClientConfigurationConnectionEvents.DISCONNECT.register((handler, client) -> SERVER_CONFIG = null); + ClientPlayConnectionEvents.DISCONNECT.register((handler, client) -> SERVER_CONFIG = null); + DisenchantOperation disenchant = new DisenchantOperation(); MoveOperation move = new MoveOperation(); ResetRepairCostOperation resetRepairCost = new ResetRepairCostOperation(); @@ -134,11 +150,13 @@ public void onInitialize() { } public static ServerConfig getServerConfig() { - return SERVER_CONFIG == null ? ServerConfig.DEFAULT : SERVER_CONFIG; + return SERVER_CONFIG == null ? + CLIENT_CONFIG.useLocalIfUnsynced() ? LOCAL_SERVER_CONFIG : ServerConfig.DISABLED + : SERVER_CONFIG; } public static ClientConfig getClientConfig() { - return CLIENT_CONFIG == null ? ClientConfig.DEFAULT : CLIENT_CONFIG; + return CLIENT_CONFIG; } public static > ModConfig.Type> getConfigType(ModConfig.Type>[] versions, int version) { diff --git a/src/main/java/de/mschae23/grindenchantments/config/ClientConfig.java b/src/main/java/de/mschae23/grindenchantments/config/ClientConfig.java index f3805d4..92cc304 100644 --- a/src/main/java/de/mschae23/grindenchantments/config/ClientConfig.java +++ b/src/main/java/de/mschae23/grindenchantments/config/ClientConfig.java @@ -25,10 +25,10 @@ import de.mschae23.config.api.ModConfig; import de.mschae23.grindenchantments.GrindEnchantmentsMod; -public record ClientConfig(boolean showLevelCost, boolean useDefaultIfUnsynced) implements ModConfig { +public record ClientConfig(boolean showLevelCost, boolean useLocalIfUnsynced) implements ModConfig { public static final MapCodec TYPE_CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( Codec.BOOL.fieldOf("show_enchantment_cost").forGetter(ClientConfig::showLevelCost), - Codec.BOOL.fieldOf("use_default_server_config_if_unsynced").forGetter(ClientConfig::useDefaultIfUnsynced) + Codec.BOOL.fieldOf("use_local_server_config_if_unsynced").forGetter(ClientConfig::useLocalIfUnsynced) ).apply(instance, instance.stable(ClientConfig::new))); public static final ModConfig.Type TYPE = new ModConfig.Type<>(4, TYPE_CODEC); @@ -53,4 +53,12 @@ public ClientConfig latest() { public boolean shouldUpdate() { return true; } + + @Override + public String toString() { + return "ClientConfig{" + + "showLevelCost=" + this.showLevelCost + + ", useLocalIfUnsynced=" + this.useLocalIfUnsynced + + '}'; + } } diff --git a/src/main/java/de/mschae23/grindenchantments/config/DedicatedServerConfig.java b/src/main/java/de/mschae23/grindenchantments/config/DedicatedServerConfig.java index a289885..49010b8 100644 --- a/src/main/java/de/mschae23/grindenchantments/config/DedicatedServerConfig.java +++ b/src/main/java/de/mschae23/grindenchantments/config/DedicatedServerConfig.java @@ -19,6 +19,9 @@ package de.mschae23.grindenchantments.config; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -27,5 +30,16 @@ public record DedicatedServerConfig(boolean alternativeCostDisplay) { Codec.BOOL.fieldOf("alternative_cost_display_enabled").forGetter(DedicatedServerConfig::alternativeCostDisplay) ).apply(instance, instance.stable(DedicatedServerConfig::new))); + public static final PacketCodec PACKET_CODEC = PacketCodecs.BOOLEAN.xmap( + DedicatedServerConfig::new, DedicatedServerConfig::alternativeCostDisplay).cast(); + public static final DedicatedServerConfig DEFAULT = new DedicatedServerConfig(false); + public static final DedicatedServerConfig DISABLED = new DedicatedServerConfig(false); + + @Override + public String toString() { + return "DedicatedServerConfig{" + + "alternativeCostDisplay=" + this.alternativeCostDisplay + + '}'; + } } diff --git a/src/main/java/de/mschae23/grindenchantments/config/DisenchantConfig.java b/src/main/java/de/mschae23/grindenchantments/config/DisenchantConfig.java index 893ade9..45c603d 100644 --- a/src/main/java/de/mschae23/grindenchantments/config/DisenchantConfig.java +++ b/src/main/java/de/mschae23/grindenchantments/config/DisenchantConfig.java @@ -19,7 +19,11 @@ package de.mschae23.grindenchantments.config; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; import de.mschae23.grindenchantments.cost.CostFunction; +import de.mschae23.grindenchantments.cost.CountLevelsCostFunction; import de.mschae23.grindenchantments.cost.CountMinPowerCostFunction; import de.mschae23.grindenchantments.cost.FilterCostFunction; import de.mschae23.grindenchantments.cost.TransformCostFunction; @@ -30,9 +34,30 @@ public record DisenchantConfig(boolean enabled, boolean consumeItem, CostFunctio public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( Codec.BOOL.fieldOf("enabled").forGetter(DisenchantConfig::enabled), Codec.BOOL.fieldOf("consume_enchanted_item").forGetter(DisenchantConfig::consumeItem), - CostFunction.TYPE_CODEC.fieldOf("cost_function").forGetter(DisenchantConfig::costFunction) + CostFunction.CODEC.fieldOf("cost_function").forGetter(DisenchantConfig::costFunction) ).apply(instance, instance.stable(DisenchantConfig::new))); public static final DisenchantConfig DEFAULT = new DisenchantConfig(true, false, new FilterCostFunction(new TransformCostFunction(new CountMinPowerCostFunction(), 0.3, 8.0))); + + public static final DisenchantConfig DISABLED = new DisenchantConfig(false, false, + new CountLevelsCostFunction(1.0, 1.0)); + + public static PacketCodec createPacketCodec(PacketCodec costFunctionCodec) { + return PacketCodec.tuple( + PacketCodecs.BOOLEAN, DisenchantConfig::enabled, + PacketCodecs.BOOLEAN, DisenchantConfig::consumeItem, + costFunctionCodec, DisenchantConfig::costFunction, + DisenchantConfig::new + ); + } + + @Override + public String toString() { + return "DisenchantConfig{" + + "enabled=" + this.enabled + + ", consumeItem=" + this.consumeItem + + ", costFunction=" + this.costFunction + + '}'; + } } diff --git a/src/main/java/de/mschae23/grindenchantments/config/FilterAction.java b/src/main/java/de/mschae23/grindenchantments/config/FilterAction.java index 61386cf..3330c4c 100644 --- a/src/main/java/de/mschae23/grindenchantments/config/FilterAction.java +++ b/src/main/java/de/mschae23/grindenchantments/config/FilterAction.java @@ -19,6 +19,9 @@ package de.mschae23.grindenchantments.config; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; import net.minecraft.util.StringIdentifiable; import com.mojang.serialization.Codec; @@ -30,6 +33,8 @@ public enum FilterAction implements StringIdentifiable { public static final Codec CODEC = StringIdentifiable.createCodec(FilterAction::values); public static final Codec NON_IGNORE_CODEC = StringIdentifiable.createCodec(() -> new FilterAction[] { ALLOW, DENY, }); + public static final PacketCodec PACKET_CODEC = PacketCodecs.indexed(i -> values()[i], FilterAction::ordinal).cast(); + private final String name; FilterAction(String name) { diff --git a/src/main/java/de/mschae23/grindenchantments/config/FilterConfig.java b/src/main/java/de/mschae23/grindenchantments/config/FilterConfig.java index 3e79600..87c5e23 100644 --- a/src/main/java/de/mschae23/grindenchantments/config/FilterConfig.java +++ b/src/main/java/de/mschae23/grindenchantments/config/FilterConfig.java @@ -25,6 +25,9 @@ import net.minecraft.component.type.ItemEnchantmentsComponent; import net.minecraft.enchantment.Enchantment; import net.minecraft.item.Item; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.RegistryWrapper; @@ -47,6 +50,17 @@ public record FilterConfig(boolean enabled, ItemConfig item, EnchantmentConfig e ).apply(instance, instance.stable(FilterConfig::new))); public static final FilterConfig DEFAULT = new FilterConfig(true, ItemConfig.DEFAULT, EnchantmentConfig.DEFAULT, FilterAction.IGNORE); + public static final FilterConfig DISABLED = new FilterConfig(false, ItemConfig.DEFAULT, EnchantmentConfig.DEFAULT, FilterAction.IGNORE); + + public static PacketCodec createPacketCodec() { + return PacketCodec.tuple( + PacketCodecs.BOOLEAN, FilterConfig::enabled, + ItemConfig.createPacketCodec(), FilterConfig::item, + EnchantmentConfig.createPacketCodec(), FilterConfig::enchantment, + FilterAction.PACKET_CODEC, FilterConfig::curses, + FilterConfig::new + ); + } private boolean shouldDeny(ItemEnchantmentsComponent.Builder builder) { if (this.curses == FilterAction.DENY) { @@ -111,6 +125,16 @@ public void validateRegistryEntries(RegistryWrapper.WrapperLookup wrapperLookup) this.enchantment.validateRegistryEntries(wrapperLookup); } + @Override + public String toString() { + return "FilterConfig{" + + "enabled=" + this.enabled + + ", item=" + this.item + + ", enchantment=" + this.enchantment + + ", curses=" + this.curses + + '}'; + } + public record ItemConfig(List items, FilterAction action) { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( Codecs.listOrSingle(Identifier.CODEC).fieldOf("enchantments").forGetter(ItemConfig::items), @@ -119,6 +143,14 @@ public record ItemConfig(List items, FilterAction action) { public static final ItemConfig DEFAULT = new ItemConfig(List.of(), FilterAction.DENY); + public static PacketCodec createPacketCodec() { + return PacketCodec.tuple( + Identifier.PACKET_CODEC.collect(PacketCodecs.toList()), ItemConfig::items, + FilterAction.PACKET_CODEC, ItemConfig::action, + ItemConfig::new + ); + } + public void validateRegistryEntries(RegistryWrapper.WrapperLookup wrapperLookup) { Optional> registryWrapperOpt = wrapperLookup.getOptional(RegistryKeys.ITEM); @@ -135,6 +167,14 @@ public void validateRegistryEntries(RegistryWrapper.WrapperLookup wrapperLookup) .map(Identifier::toString) .forEach(item -> GrindEnchantmentsMod.log(Level.WARN, "Filter config contains unknown item: " + item)); } + + @Override + public String toString() { + return "ItemConfig{" + + "items=" + this.items + + ", action=" + this.action + + '}'; + } } public record EnchantmentConfig(List enchantments, FilterAction action) { @@ -145,6 +185,14 @@ public record EnchantmentConfig(List enchantments, FilterAction acti public static final EnchantmentConfig DEFAULT = new EnchantmentConfig(List.of(), FilterAction.IGNORE); + public static PacketCodec createPacketCodec() { + return PacketCodec.tuple( + Identifier.PACKET_CODEC.collect(PacketCodecs.toList()), EnchantmentConfig::enchantments, + FilterAction.PACKET_CODEC, EnchantmentConfig::action, + EnchantmentConfig::new + ); + } + public void validateRegistryEntries(RegistryWrapper.WrapperLookup wrapperLookup) { Optional> registryWrapperOpt = wrapperLookup.getOptional(RegistryKeys.ENCHANTMENT); @@ -161,5 +209,13 @@ public void validateRegistryEntries(RegistryWrapper.WrapperLookup wrapperLookup) .map(Identifier::toString) .forEach(item -> GrindEnchantmentsMod.log(Level.WARN, "Filter config contains unknown enchantment: " + item)); } + + @Override + public String toString() { + return "EnchantmentConfig{" + + "enchantments=" + this.enchantments + + ", action=" + this.action + + '}'; + } } } diff --git a/src/main/java/de/mschae23/grindenchantments/config/MoveConfig.java b/src/main/java/de/mschae23/grindenchantments/config/MoveConfig.java index e534497..32e6131 100644 --- a/src/main/java/de/mschae23/grindenchantments/config/MoveConfig.java +++ b/src/main/java/de/mschae23/grindenchantments/config/MoveConfig.java @@ -19,21 +19,43 @@ package de.mschae23.grindenchantments.config; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import de.mschae23.grindenchantments.cost.CostFunction; import de.mschae23.grindenchantments.cost.CountLevelsCostFunction; import de.mschae23.grindenchantments.cost.FilterCostFunction; -import de.mschae23.grindenchantments.cost.TransformCostFunction; import de.mschae23.grindenchantments.cost.FirstEnchantmentCostFunction; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; +import de.mschae23.grindenchantments.cost.TransformCostFunction; public record MoveConfig(boolean enabled, CostFunction costFunction) { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( Codec.BOOL.fieldOf("enabled").forGetter(MoveConfig::enabled), - CostFunction.TYPE_CODEC.fieldOf("cost_function").forGetter(MoveConfig::costFunction) + CostFunction.CODEC.fieldOf("cost_function").forGetter(MoveConfig::costFunction) ).apply(instance, instance.stable(MoveConfig::new))); public static final MoveConfig DEFAULT = new MoveConfig(true, new FilterCostFunction(new FirstEnchantmentCostFunction(new TransformCostFunction( new CountLevelsCostFunction(3.0, 8.0), 0.5, 0.5)))); + + public static final MoveConfig DISABLED = new MoveConfig(false, + new CountLevelsCostFunction(1.0, 1.0)); + + public static PacketCodec createPacketCodec(PacketCodec costFunctionCodec) { + return PacketCodec.tuple( + PacketCodecs.BOOLEAN, MoveConfig::enabled, + costFunctionCodec, MoveConfig::costFunction, + MoveConfig::new + ); + } + + @Override + public String toString() { + return "MoveConfig{" + + "enabled=" + this.enabled + + ", costFunction=" + this.costFunction + + '}'; + } } diff --git a/src/main/java/de/mschae23/grindenchantments/config/ResetRepairCostConfig.java b/src/main/java/de/mschae23/grindenchantments/config/ResetRepairCostConfig.java index 8496db3..4cbb933 100644 --- a/src/main/java/de/mschae23/grindenchantments/config/ResetRepairCostConfig.java +++ b/src/main/java/de/mschae23/grindenchantments/config/ResetRepairCostConfig.java @@ -23,6 +23,9 @@ import java.util.Optional; import java.util.stream.Stream; import net.minecraft.item.Item; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.RegistryWrapper; @@ -43,7 +46,7 @@ public record ResetRepairCostConfig(boolean enabled, List catalystIt Codec.BOOL.fieldOf("enabled").forGetter(ResetRepairCostConfig::enabled), Codecs.listOrSingle(Identifier.CODEC).fieldOf("catalyst_items").forGetter(ResetRepairCostConfig::catalystItems), Codec.BOOL.fieldOf("requires_enchantment").forGetter(ResetRepairCostConfig::requiresEnchantment), - CostFunction.TYPE_CODEC.fieldOf("cost_function").forGetter(ResetRepairCostConfig::costFunction) + CostFunction.CODEC.fieldOf("cost_function").forGetter(ResetRepairCostConfig::costFunction) ).apply(instance, instance.stable(ResetRepairCostConfig::new))); public static final ResetRepairCostConfig DEFAULT = new ResetRepairCostConfig(false, @@ -51,6 +54,20 @@ public record ResetRepairCostConfig(boolean enabled, List catalystIt // Intentionally no filter function new TransformCostFunction(new AverageCountCostFunction(new CountLevelsCostFunction(1.0, 4.0)), 1.5, 4.0)); + public static final ResetRepairCostConfig DISABLED = new ResetRepairCostConfig(false, + List.of(), false, + new CountLevelsCostFunction(1.0, 1.0)); + + public static PacketCodec createPacketCodec(PacketCodec costFunctionCodec) { + return PacketCodec.tuple( + PacketCodecs.BOOLEAN, ResetRepairCostConfig::enabled, + Identifier.PACKET_CODEC.collect(PacketCodecs.toList()), ResetRepairCostConfig::catalystItems, + PacketCodecs.BOOLEAN, ResetRepairCostConfig::requiresEnchantment, + costFunctionCodec, ResetRepairCostConfig::costFunction, + ResetRepairCostConfig::new + ); + } + public void validateRegistryEntries(RegistryWrapper.WrapperLookup wrapperLookup) { Optional> registryWrapperOpt = wrapperLookup.getOptional(RegistryKeys.ITEM); @@ -67,4 +84,14 @@ public void validateRegistryEntries(RegistryWrapper.WrapperLookup wrapperLookup) .map(Identifier::toString) .forEach(item -> GrindEnchantmentsMod.log(Level.WARN, "Reset repair cost config contains unknown catalyst item: " + item)); } + + @Override + public String toString() { + return "ResetRepairCostConfig{" + + "enabled=" + this.enabled + + ", catalystItems=" + this.catalystItems + + ", requiresEnchantment=" + this.requiresEnchantment + + ", costFunction=" + this.costFunction + + '}'; + } } diff --git a/src/main/java/de/mschae23/grindenchantments/config/ServerConfig.java b/src/main/java/de/mschae23/grindenchantments/config/ServerConfig.java index 6d25f2c..c855129 100644 --- a/src/main/java/de/mschae23/grindenchantments/config/ServerConfig.java +++ b/src/main/java/de/mschae23/grindenchantments/config/ServerConfig.java @@ -19,12 +19,15 @@ package de.mschae23.grindenchantments.config; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; import net.minecraft.registry.RegistryWrapper; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import de.mschae23.config.api.ModConfig; import de.mschae23.grindenchantments.GrindEnchantmentsMod; +import de.mschae23.grindenchantments.cost.CostFunction; public record ServerConfig(DisenchantConfig disenchant, MoveConfig move, ResetRepairCostConfig resetRepairCost, FilterConfig filter, @@ -38,14 +41,16 @@ public record ServerConfig(DisenchantConfig disenchant, MoveConfig move, ResetRe ).apply(instance, instance.stable(ServerConfig::new))); public static final ModConfig.Type TYPE = new ModConfig.Type<>(4, TYPE_CODEC); - public static final ServerConfig DEFAULT = new ServerConfig(DisenchantConfig.DEFAULT, MoveConfig.DEFAULT, - ResetRepairCostConfig.DEFAULT, FilterConfig.DEFAULT, DedicatedServerConfig.DEFAULT); @SuppressWarnings("unchecked") public static final ModConfig.Type>[] VERSIONS = new ModConfig.Type[] { TYPE, }; - public static final Codec> CODEC = ModConfig.createCodec(TYPE.version(), version -> GrindEnchantmentsMod.getConfigType(VERSIONS, version)); + public static final ServerConfig DEFAULT = new ServerConfig(DisenchantConfig.DEFAULT, MoveConfig.DEFAULT, + ResetRepairCostConfig.DEFAULT, FilterConfig.DEFAULT, DedicatedServerConfig.DEFAULT); + public static final ServerConfig DISABLED = new ServerConfig(DisenchantConfig.DISABLED, MoveConfig.DISABLED, + ResetRepairCostConfig.DISABLED, FilterConfig.DISABLED, DedicatedServerConfig.DISABLED); + @Override public Type type() { return TYPE; @@ -61,8 +66,30 @@ public boolean shouldUpdate() { return true; } + public static PacketCodec createPacketCodec(PacketCodec costFunctionCodec) { + return PacketCodec.tuple( + DisenchantConfig.createPacketCodec(costFunctionCodec), ServerConfig::disenchant, + MoveConfig.createPacketCodec(costFunctionCodec), ServerConfig::move, + ResetRepairCostConfig.createPacketCodec(costFunctionCodec), ServerConfig::resetRepairCost, + FilterConfig.createPacketCodec(), ServerConfig::filter, + DedicatedServerConfig.PACKET_CODEC, ServerConfig::dedicatedServerConfig, + ServerConfig::new + ); + } + public void validateRegistryEntries(RegistryWrapper.WrapperLookup wrapperLookup) { this.filter.validateRegistryEntries(wrapperLookup); this.resetRepairCost.validateRegistryEntries(wrapperLookup); } + + @Override + public String toString() { + return "ServerConfig{" + + "disenchant=" + this.disenchant + + ", move=" + this.move + + ", resetRepairCost=" + this.resetRepairCost + + ", filter=" + this.filter + + ", dedicatedServerConfig=" + this.dedicatedServerConfig + + '}'; + } } diff --git a/src/main/java/de/mschae23/grindenchantments/config/legacy/v1/DisenchantConfigV1.java b/src/main/java/de/mschae23/grindenchantments/config/legacy/v1/DisenchantConfigV1.java index defa116..43ff698 100644 --- a/src/main/java/de/mschae23/grindenchantments/config/legacy/v1/DisenchantConfigV1.java +++ b/src/main/java/de/mschae23/grindenchantments/config/legacy/v1/DisenchantConfigV1.java @@ -29,7 +29,7 @@ public record DisenchantConfigV1(boolean enabled, boolean consumeItem, CostFunct public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( Codec.BOOL.fieldOf("enabled").forGetter(DisenchantConfigV1::enabled), Codec.BOOL.fieldOf("consume_enchanted_item").forGetter(DisenchantConfigV1::consumeItem), - CostFunction.TYPE_CODEC.fieldOf("cost_config").forGetter(DisenchantConfigV1::costFunction) + CostFunction.CODEC.fieldOf("cost_config").forGetter(DisenchantConfigV1::costFunction) ).apply(instance, instance.stable(DisenchantConfigV1::new))); public DisenchantConfig latest() { diff --git a/src/main/java/de/mschae23/grindenchantments/config/legacy/v1/MoveConfigV1.java b/src/main/java/de/mschae23/grindenchantments/config/legacy/v1/MoveConfigV1.java index 77236b6..305fc6b 100644 --- a/src/main/java/de/mschae23/grindenchantments/config/legacy/v1/MoveConfigV1.java +++ b/src/main/java/de/mschae23/grindenchantments/config/legacy/v1/MoveConfigV1.java @@ -28,7 +28,7 @@ public record MoveConfigV1(boolean enabled, CostFunction costFunction) { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( Codec.BOOL.fieldOf("enabled").forGetter(MoveConfigV1::enabled), - CostFunction.TYPE_CODEC.fieldOf("cost_config").forGetter(MoveConfigV1::costFunction) + CostFunction.CODEC.fieldOf("cost_config").forGetter(MoveConfigV1::costFunction) ).apply(instance, instance.stable(MoveConfigV1::new))); public MoveConfig latest() { diff --git a/src/main/java/de/mschae23/grindenchantments/config/legacy/v3/ResetRepairCostConfigV3.java b/src/main/java/de/mschae23/grindenchantments/config/legacy/v3/ResetRepairCostConfigV3.java index 29d718a..90a4d01 100644 --- a/src/main/java/de/mschae23/grindenchantments/config/legacy/v3/ResetRepairCostConfigV3.java +++ b/src/main/java/de/mschae23/grindenchantments/config/legacy/v3/ResetRepairCostConfigV3.java @@ -36,7 +36,7 @@ public record ResetRepairCostConfigV3(boolean enabled, List catalyst Codec.BOOL.fieldOf("enabled").forGetter(ResetRepairCostConfigV3::enabled), Codecs.listOrSingle(Identifier.CODEC).fieldOf("catalyst_items").forGetter(ResetRepairCostConfigV3::catalystItems), Codec.BOOL.fieldOf("requires_enchantment").forGetter(ResetRepairCostConfigV3::requiresEnchantment), - CostFunction.TYPE_CODEC.fieldOf("cost_function").forGetter(ResetRepairCostConfigV3::costFunction) + CostFunction.CODEC.fieldOf("cost_function").forGetter(ResetRepairCostConfigV3::costFunction) ).apply(instance, instance.stable(ResetRepairCostConfigV3::new))); public static final ResetRepairCostConfigV3 DEFAULT = new ResetRepairCostConfigV3(false, diff --git a/src/main/java/de/mschae23/grindenchantments/config/sync/ServerConfigS2CPayload.java b/src/main/java/de/mschae23/grindenchantments/config/sync/ServerConfigS2CPayload.java index a1e69ff..eb22b78 100644 --- a/src/main/java/de/mschae23/grindenchantments/config/sync/ServerConfigS2CPayload.java +++ b/src/main/java/de/mschae23/grindenchantments/config/sync/ServerConfigS2CPayload.java @@ -24,15 +24,19 @@ import net.minecraft.network.packet.CustomPayload; import net.minecraft.util.Identifier; import de.mschae23.grindenchantments.GrindEnchantmentsMod; +import de.mschae23.grindenchantments.config.ServerConfig; +import de.mschae23.grindenchantments.cost.CostFunction; -public record ServerConfigS2CPayload() implements CustomPayload { +public record ServerConfigS2CPayload(ServerConfig config) implements CustomPayload { public static final Identifier PACKET_ID = GrindEnchantmentsMod.id("server_config"); public static final CustomPayload.Id ID = new CustomPayload.Id<>(PACKET_ID); - public static final PacketCodec CODEC = PacketCodec.unit(new ServerConfigS2CPayload()); - @Override public Id getId() { return ID; } + + public static PacketCodec createPacketCodec(PacketCodec costFunctionCodec) { + return ServerConfig.createPacketCodec(costFunctionCodec).xmap(ServerConfigS2CPayload::new, ServerConfigS2CPayload::config); + } } diff --git a/src/main/java/de/mschae23/grindenchantments/cost/AverageCountCostFunction.java b/src/main/java/de/mschae23/grindenchantments/cost/AverageCountCostFunction.java index 32e4284..f58aaf9 100644 --- a/src/main/java/de/mschae23/grindenchantments/cost/AverageCountCostFunction.java +++ b/src/main/java/de/mschae23/grindenchantments/cost/AverageCountCostFunction.java @@ -20,15 +20,18 @@ package de.mschae23.grindenchantments.cost; import net.minecraft.component.type.ItemEnchantmentsComponent; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; import net.minecraft.registry.RegistryWrapper; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import de.mschae23.grindenchantments.config.FilterConfig; public record AverageCountCostFunction(CostFunction function) implements CostFunction { - public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( - CostFunction.TYPE_CODEC.fieldOf("function").forGetter(AverageCountCostFunction::function) + public static final MapCodec TYPE_CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + CostFunction.CODEC.fieldOf("function").forGetter(AverageCountCostFunction::function) ).apply(instance, instance.stable(AverageCountCostFunction::new))); + public static final CostFunctionType.Impl TYPE = new CostFunctionType.Impl<>(TYPE_CODEC, AverageCountCostFunction::packetCodec); @Override public double getCost(ItemEnchantmentsComponent enchantments, FilterConfig filter, RegistryWrapper.WrapperLookup wrapperLookup) { @@ -46,4 +49,15 @@ public double getCost(ItemEnchantmentsComponent enchantments, FilterConfig filte public CostFunctionType getType() { return CostFunctionType.AVERAGE_COUNT; } + + public static PacketCodec packetCodec(PacketCodec delegateCodec) { + return PacketCodec.tuple(delegateCodec, AverageCountCostFunction::function, AverageCountCostFunction::new); + } + + @Override + public String toString() { + return "AverageCountCostFunction{" + + "function=" + this.function + + '}'; + } } diff --git a/src/main/java/de/mschae23/grindenchantments/cost/CostFunction.java b/src/main/java/de/mschae23/grindenchantments/cost/CostFunction.java index a853786..aec4921 100644 --- a/src/main/java/de/mschae23/grindenchantments/cost/CostFunction.java +++ b/src/main/java/de/mschae23/grindenchantments/cost/CostFunction.java @@ -20,15 +20,26 @@ package de.mschae23.grindenchantments.cost; import net.minecraft.component.type.ItemEnchantmentsComponent; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; import net.minecraft.registry.RegistryWrapper; import com.mojang.serialization.Codec; import de.mschae23.grindenchantments.config.FilterConfig; import de.mschae23.grindenchantments.registry.GrindEnchantmentsRegistries; public interface CostFunction { - Codec TYPE_CODEC = GrindEnchantmentsRegistries.COST_FUNCTION.getCodec().dispatch(CostFunction::getType, CostFunctionType::codec); + Codec CODEC = GrindEnchantmentsRegistries.COST_FUNCTION.getCodec().dispatch(CostFunction::getType, CostFunctionType::codec); double getCost(ItemEnchantmentsComponent enchantments, FilterConfig filter, RegistryWrapper.WrapperLookup wrapperLookup); CostFunctionType getType(); + + static PacketCodec createPacketCodec() { + return PacketCodec.recursive(delegateCodec -> + CostFunctionType.createPacketCodec().cast().dispatch(CostFunction::getType, + type -> type.packetCodec(delegateCodec))); + } + + @Override + String toString(); } diff --git a/src/main/java/de/mschae23/grindenchantments/cost/CostFunctionType.java b/src/main/java/de/mschae23/grindenchantments/cost/CostFunctionType.java index ce65e57..c53ba62 100644 --- a/src/main/java/de/mschae23/grindenchantments/cost/CostFunctionType.java +++ b/src/main/java/de/mschae23/grindenchantments/cost/CostFunctionType.java @@ -19,26 +19,53 @@ package de.mschae23.grindenchantments.cost; +import java.util.function.Function; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; +import com.mojang.serialization.MapCodec; import de.mschae23.grindenchantments.GrindEnchantmentsMod; import de.mschae23.grindenchantments.registry.GrindEnchantmentsRegistries; -import com.mojang.serialization.MapCodec; +import io.netty.buffer.ByteBuf; public interface CostFunctionType { - CostFunctionType COUNT_ENCHANTMENTS = register("count_enchantments", CountEnchantmentsCostFunction.CODEC); - CostFunctionType COUNT_LEVELS = register("count_levels", CountLevelsCostFunction.CODEC); - CostFunctionType COUNT_MIN_POWER = register("count_min_power", CountMinPowerCostFunction.CODEC); - CostFunctionType AVERAGE_COUNT = register("average_count", AverageCountCostFunction.CODEC); - CostFunctionType FIRST_ENCHANTMENT = register("first_enchantment", FirstEnchantmentCostFunction.CODEC); - CostFunctionType TRANSFORM = register("transform", TransformCostFunction.CODEC); - CostFunctionType FILTER = register("filter", FilterCostFunction.CODEC); + CostFunctionType COUNT_ENCHANTMENTS = register("count_enchantments", CountEnchantmentsCostFunction.TYPE); + CostFunctionType COUNT_LEVELS = register("count_levels", CountLevelsCostFunction.TYPE); + CostFunctionType COUNT_MIN_POWER = register("count_min_power", CountMinPowerCostFunction.TYPE); + CostFunctionType AVERAGE_COUNT = register("average_count", AverageCountCostFunction.TYPE); + CostFunctionType FIRST_ENCHANTMENT = register("first_enchantment", FirstEnchantmentCostFunction.TYPE); + CostFunctionType TRANSFORM = register("transform", TransformCostFunction.TYPE); + CostFunctionType FILTER = register("filter", FilterCostFunction.TYPE); MapCodec codec(); + PacketCodec packetCodec(PacketCodec delegateCodec); + + static CostFunctionType register(String id, CostFunctionType type) { + return Registry.register(GrindEnchantmentsRegistries.COST_FUNCTION, GrindEnchantmentsMod.id(id), type); + } - static CostFunctionType register(String id, MapCodec codec) { - return Registry.register(GrindEnchantmentsRegistries.COST_FUNCTION, GrindEnchantmentsMod.id(id), () -> codec); + static PacketCodec> createPacketCodec() { + return RegistryKey.createPacketCodec(GrindEnchantmentsRegistries.COST_FUNCTION_KEY).xmap( + key -> GrindEnchantmentsRegistries.COST_FUNCTION.getOptionalValue(key).orElseThrow( + () -> new IllegalStateException("Can't decode '" + key.getValue() + "', unregistered value")), + type -> GrindEnchantmentsRegistries.COST_FUNCTION.getKey(type).orElseThrow( + () -> new IllegalStateException("Can't encode '" + type + "', unregistered value")) + ); } static void init() { } + + record Impl(MapCodec codec, Function, PacketCodec> packetCodec) implements CostFunctionType { + @Override + public MapCodec codec() { + return this.codec; + } + + @Override + public PacketCodec packetCodec(PacketCodec delegateCodec) { + return this.packetCodec.apply(delegateCodec); + } + } } diff --git a/src/main/java/de/mschae23/grindenchantments/cost/CountEnchantmentsCostFunction.java b/src/main/java/de/mschae23/grindenchantments/cost/CountEnchantmentsCostFunction.java index dc3b414..4381dd1 100644 --- a/src/main/java/de/mschae23/grindenchantments/cost/CountEnchantmentsCostFunction.java +++ b/src/main/java/de/mschae23/grindenchantments/cost/CountEnchantmentsCostFunction.java @@ -20,13 +20,16 @@ package de.mschae23.grindenchantments.cost; import net.minecraft.component.type.ItemEnchantmentsComponent; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; import net.minecraft.registry.RegistryWrapper; import com.mojang.serialization.MapCodec; import de.mschae23.grindenchantments.config.FilterConfig; public class CountEnchantmentsCostFunction implements CostFunction { public static final CountEnchantmentsCostFunction INSTANCE = new CountEnchantmentsCostFunction(); - public static final MapCodec CODEC = MapCodec.unit(() -> INSTANCE); + public static final MapCodec TYPE_CODEC = MapCodec.unit(() -> INSTANCE); + public static final CostFunctionType TYPE = new CostFunctionType.Impl<>(TYPE_CODEC, CountEnchantmentsCostFunction::packetCodec); @Override public double getCost(ItemEnchantmentsComponent enchantments, FilterConfig filter, RegistryWrapper.WrapperLookup wrapperLookup) { @@ -37,4 +40,13 @@ public double getCost(ItemEnchantmentsComponent enchantments, FilterConfig filte public CostFunctionType getType() { return CostFunctionType.COUNT_ENCHANTMENTS; } + + public static PacketCodec packetCodec(PacketCodec delegateCodec) { + return PacketCodec.unit(INSTANCE); + } + + @Override + public String toString() { + return "CountEnchantmentsCostFunction{}"; + } } diff --git a/src/main/java/de/mschae23/grindenchantments/cost/CountLevelsCostFunction.java b/src/main/java/de/mschae23/grindenchantments/cost/CountLevelsCostFunction.java index a8fcec6..dc03a88 100644 --- a/src/main/java/de/mschae23/grindenchantments/cost/CountLevelsCostFunction.java +++ b/src/main/java/de/mschae23/grindenchantments/cost/CountLevelsCostFunction.java @@ -20,6 +20,9 @@ package de.mschae23.grindenchantments.cost; import net.minecraft.component.type.ItemEnchantmentsComponent; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; import net.minecraft.registry.RegistryWrapper; import net.minecraft.registry.tag.EnchantmentTags; import com.mojang.serialization.Codec; @@ -28,10 +31,11 @@ import de.mschae23.grindenchantments.config.FilterConfig; public record CountLevelsCostFunction(double normalFactor, double treasureFactor) implements CostFunction { - public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + public static final MapCodec TYPE_CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( Codec.DOUBLE.fieldOf("normal_factor").forGetter(CountLevelsCostFunction::normalFactor), Codec.DOUBLE.fieldOf("treasure_factor").forGetter(CountLevelsCostFunction::treasureFactor) ).apply(instance, instance.stable(CountLevelsCostFunction::new))); + public static final CostFunctionType TYPE = new CostFunctionType.Impl<>(TYPE_CODEC, CountLevelsCostFunction::packetCodec); @Override public double getCost(ItemEnchantmentsComponent enchantments, FilterConfig filter, RegistryWrapper.WrapperLookup wrapperLookup) { @@ -44,4 +48,16 @@ public double getCost(ItemEnchantmentsComponent enchantments, FilterConfig filte public CostFunctionType getType() { return CostFunctionType.COUNT_LEVELS; } + + public static PacketCodec packetCodec(PacketCodec delegateCodec) { + return PacketCodec.tuple(PacketCodecs.DOUBLE, CountLevelsCostFunction::normalFactor, PacketCodecs.DOUBLE, CountLevelsCostFunction::treasureFactor, CountLevelsCostFunction::new); + } + + @Override + public String toString() { + return "CountLevelsCostFunction{" + + "normalFactor=" + this.normalFactor + + ", treasureFactor=" + this.treasureFactor + + '}'; + } } diff --git a/src/main/java/de/mschae23/grindenchantments/cost/CountMinPowerCostFunction.java b/src/main/java/de/mschae23/grindenchantments/cost/CountMinPowerCostFunction.java index 352f3dd..712bae6 100644 --- a/src/main/java/de/mschae23/grindenchantments/cost/CountMinPowerCostFunction.java +++ b/src/main/java/de/mschae23/grindenchantments/cost/CountMinPowerCostFunction.java @@ -20,13 +20,16 @@ package de.mschae23.grindenchantments.cost; import net.minecraft.component.type.ItemEnchantmentsComponent; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; import net.minecraft.registry.RegistryWrapper; import com.mojang.serialization.MapCodec; import de.mschae23.grindenchantments.config.FilterConfig; public class CountMinPowerCostFunction implements CostFunction { public static final CountMinPowerCostFunction INSTANCE = new CountMinPowerCostFunction(); - public static final MapCodec CODEC = MapCodec.unit(() -> INSTANCE); + public static final MapCodec TYPE_CODEC = MapCodec.unit(() -> INSTANCE); + public static final CostFunctionType.Impl TYPE = new CostFunctionType.Impl<>(TYPE_CODEC, CountMinPowerCostFunction::packetCodec); @Override public double getCost(ItemEnchantmentsComponent enchantments, FilterConfig filter, RegistryWrapper.WrapperLookup wrapperLookup) { @@ -39,4 +42,13 @@ public double getCost(ItemEnchantmentsComponent enchantments, FilterConfig filte public CostFunctionType getType() { return CostFunctionType.COUNT_MIN_POWER; } + + public static PacketCodec packetCodec(PacketCodec delegateCodec) { + return PacketCodec.unit(INSTANCE); + } + + @Override + public String toString() { + return "CountMinPowerCostFunction{}"; + } } diff --git a/src/main/java/de/mschae23/grindenchantments/cost/FilterCostFunction.java b/src/main/java/de/mschae23/grindenchantments/cost/FilterCostFunction.java index ad4a57f..a392719 100644 --- a/src/main/java/de/mschae23/grindenchantments/cost/FilterCostFunction.java +++ b/src/main/java/de/mschae23/grindenchantments/cost/FilterCostFunction.java @@ -20,15 +20,18 @@ package de.mschae23.grindenchantments.cost; import net.minecraft.component.type.ItemEnchantmentsComponent; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; import net.minecraft.registry.RegistryWrapper; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import de.mschae23.grindenchantments.config.FilterConfig; public record FilterCostFunction(CostFunction function) implements CostFunction { - public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( - CostFunction.TYPE_CODEC.fieldOf("function").forGetter(FilterCostFunction::function) + public static final MapCodec TYPE_CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + CostFunction.CODEC.fieldOf("function").forGetter(FilterCostFunction::function) ).apply(instance, instance.stable(FilterCostFunction::new))); + public static final CostFunctionType.Impl TYPE = new CostFunctionType.Impl<>(TYPE_CODEC, FilterCostFunction::packetCodec); @Override public double getCost(ItemEnchantmentsComponent enchantments, FilterConfig filter, RegistryWrapper.WrapperLookup wrapperLookup) { @@ -39,4 +42,15 @@ public double getCost(ItemEnchantmentsComponent enchantments, FilterConfig filte public CostFunctionType getType() { return CostFunctionType.FILTER; } + + public static PacketCodec packetCodec(PacketCodec delegateCodec) { + return PacketCodec.tuple(delegateCodec, FilterCostFunction::function, FilterCostFunction::new); + } + + @Override + public String toString() { + return "FilterCostFunction{" + + "function=" + this.function + + '}'; + } } diff --git a/src/main/java/de/mschae23/grindenchantments/cost/FirstEnchantmentCostFunction.java b/src/main/java/de/mschae23/grindenchantments/cost/FirstEnchantmentCostFunction.java index d012230..8a91032 100644 --- a/src/main/java/de/mschae23/grindenchantments/cost/FirstEnchantmentCostFunction.java +++ b/src/main/java/de/mschae23/grindenchantments/cost/FirstEnchantmentCostFunction.java @@ -21,6 +21,8 @@ import net.minecraft.component.type.ItemEnchantmentsComponent; import net.minecraft.enchantment.Enchantment; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; import net.minecraft.registry.RegistryWrapper; import net.minecraft.registry.entry.RegistryEntry; import com.mojang.serialization.MapCodec; @@ -29,10 +31,11 @@ import de.mschae23.grindenchantments.impl.MoveOperation; import it.unimi.dsi.fastutil.objects.ObjectIntPair; -public record FirstEnchantmentCostFunction(CostFunction delegate) implements CostFunction { - public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( - TYPE_CODEC.fieldOf("function").forGetter(FirstEnchantmentCostFunction::delegate) +public record FirstEnchantmentCostFunction(CostFunction function) implements CostFunction { + public static final MapCodec TYPE_CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + CostFunction.CODEC.fieldOf("function").forGetter(FirstEnchantmentCostFunction::function) ).apply(instance, instance.stable(FirstEnchantmentCostFunction::new))); + public static final CostFunctionType.Impl TYPE = new CostFunctionType.Impl<>(TYPE_CODEC, FirstEnchantmentCostFunction::packetCodec); @Override public double getCost(ItemEnchantmentsComponent enchantments, FilterConfig filter, RegistryWrapper.WrapperLookup wrapperLookup) { @@ -44,7 +47,7 @@ public double getCost(ItemEnchantmentsComponent enchantments, FilterConfig filte ItemEnchantmentsComponent.Builder builder = new ItemEnchantmentsComponent.Builder(ItemEnchantmentsComponent.DEFAULT); builder.add(firstEnchantment.left(), firstEnchantment.rightInt()); - return this.delegate.getCost(builder.build(), filter, wrapperLookup); + return this.function.getCost(builder.build(), filter, wrapperLookup); } } @@ -52,4 +55,15 @@ public double getCost(ItemEnchantmentsComponent enchantments, FilterConfig filte public CostFunctionType getType() { return CostFunctionType.FIRST_ENCHANTMENT; } + + public static PacketCodec packetCodec(PacketCodec delegateCodec) { + return PacketCodec.tuple(delegateCodec, FirstEnchantmentCostFunction::function, FirstEnchantmentCostFunction::new); + } + + @Override + public String toString() { + return "FirstEnchantmentCostFunction{" + + "function=" + this.function + + '}'; + } } diff --git a/src/main/java/de/mschae23/grindenchantments/cost/TransformCostFunction.java b/src/main/java/de/mschae23/grindenchantments/cost/TransformCostFunction.java index 0a86265..a12dd2e 100644 --- a/src/main/java/de/mschae23/grindenchantments/cost/TransformCostFunction.java +++ b/src/main/java/de/mschae23/grindenchantments/cost/TransformCostFunction.java @@ -20,6 +20,9 @@ package de.mschae23.grindenchantments.cost; import net.minecraft.component.type.ItemEnchantmentsComponent; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; import net.minecraft.registry.RegistryWrapper; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; @@ -27,11 +30,12 @@ import de.mschae23.grindenchantments.config.FilterConfig; public record TransformCostFunction(CostFunction function, double factor, double offset) implements CostFunction { - public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( - TYPE_CODEC.fieldOf("function").forGetter(TransformCostFunction::function), + public static final MapCodec TYPE_CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + CostFunction.CODEC.fieldOf("function").forGetter(TransformCostFunction::function), Codec.DOUBLE.fieldOf("factor").orElse(1.0).forGetter(TransformCostFunction::factor), Codec.DOUBLE.fieldOf("offset").orElse(0.0).forGetter(TransformCostFunction::offset) ).apply(instance, instance.stable(TransformCostFunction::new))); + public static final CostFunctionType.Impl TYPE = new CostFunctionType.Impl<>(TYPE_CODEC, TransformCostFunction::packetCodec); @Override public double getCost(ItemEnchantmentsComponent enchantments, FilterConfig filter, RegistryWrapper.WrapperLookup wrapperLookup) { @@ -42,4 +46,17 @@ public double getCost(ItemEnchantmentsComponent enchantments, FilterConfig filte public CostFunctionType getType() { return CostFunctionType.TRANSFORM; } + + public static PacketCodec packetCodec(PacketCodec delegateCodec) { + return PacketCodec.tuple(delegateCodec, TransformCostFunction::function, PacketCodecs.DOUBLE, TransformCostFunction::factor, PacketCodecs.DOUBLE, TransformCostFunction::offset, TransformCostFunction::new); + } + + @Override + public String toString() { + return "TransformCostFunction{" + + "function=" + this.function + + ", factor=" + this.factor + + ", offset=" + this.offset + + '}'; + } } diff --git a/src/main/java/de/mschae23/grindenchantments/registry/GrindEnchantmentsRegistries.java b/src/main/java/de/mschae23/grindenchantments/registry/GrindEnchantmentsRegistries.java index 6bac4dd..79a242f 100644 --- a/src/main/java/de/mschae23/grindenchantments/registry/GrindEnchantmentsRegistries.java +++ b/src/main/java/de/mschae23/grindenchantments/registry/GrindEnchantmentsRegistries.java @@ -26,7 +26,8 @@ import de.mschae23.grindenchantments.cost.CostFunctionType; public final class GrindEnchantmentsRegistries { - public static final Registry> COST_FUNCTION = FabricRegistryBuilder.>createSimple(RegistryKey.ofRegistry(GrindEnchantmentsMod.id("cost_function_type"))).buildAndRegister(); + public static final RegistryKey>> COST_FUNCTION_KEY = RegistryKey.ofRegistry(GrindEnchantmentsMod.id("cost_function_type")); + public static final Registry> COST_FUNCTION = FabricRegistryBuilder.createSimple(COST_FUNCTION_KEY).buildAndRegister(); private GrindEnchantmentsRegistries() { }