From d056ee43a9f3629430e1c605c732f83998117270 Mon Sep 17 00:00:00 2001 From: GaLicn <133291877+GaLicn@users.noreply.github.com> Date: Sat, 6 Sep 2025 00:01:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=9E=E5=A4=8D=E7=BD=91=E7=BB=9C=E9=80=9A?= =?UTF-8?q?=E9=81=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 + .../com/extendedae_plus/ExtendedAEPlus.java | 5 +-- .../gui/PatternProviderScreenMixin.java | 8 ++-- .../PatternProviderLogicAdvancedMixin.java | 19 +--------- .../PatternProviderLogicDoublingMixin.java | 19 +--------- .../extendedae_plus/network/ModNetwork.java | 22 ++++------- .../ToggleAdvancedBlockingC2SPacket.java | 38 ++++++++++++++++--- .../network/ToggleSmartDoublingC2SPacket.java | 37 +++++++++++++++--- src/main/resources/extendedaeplus.mixins.json | 6 +-- 9 files changed, 88 insertions(+), 68 deletions(-) diff --git a/build.gradle b/build.gradle index c52f6ea..963f8a0 100644 --- a/build.gradle +++ b/build.gradle @@ -144,6 +144,8 @@ sourceSets.main.java { // 仅保留 mixin 中的 accessor 参与编译 // 解除对 accessor 的屏蔽 include 'com/extendedae_plus/mixin/ae2/accessor/**' + // 启用对 PatternProviderLogic 的功能混入(高级阻挡/智能翻倍开关的持久化与逻辑) + include 'com/extendedae_plus/mixin/ae2/helpers/**' // GUI 方案A:解禁最小 GUI 混入 include 'com/extendedae_plus/mixin/ae2/client/gui/PatternProviderScreenMixin.java' include 'com/extendedae_plus/mixin/ae2/menu/PatternProviderMenuAdvancedMixin.java' diff --git a/src/main/java/com/extendedae_plus/ExtendedAEPlus.java b/src/main/java/com/extendedae_plus/ExtendedAEPlus.java index 868eadc..8067c15 100644 --- a/src/main/java/com/extendedae_plus/ExtendedAEPlus.java +++ b/src/main/java/com/extendedae_plus/ExtendedAEPlus.java @@ -71,6 +71,8 @@ public class ExtendedAEPlus { public ExtendedAEPlus(IEventBus modEventBus, ModContainer modContainer) { // Register the commonSetup method for modloading modEventBus.addListener(this::commonSetup); + // 注册网络负载处理器(NeoForge 1.21 新式 Payload API) + modEventBus.addListener(ModNetwork::registerPayloadHandlers); // Register the Deferred Register to the mod event bus so blocks get registered BLOCKS.register(modEventBus); @@ -101,9 +103,6 @@ public class ExtendedAEPlus { LOGGER.info("HELLO FROM COMMON SETUP"); // 示例日志,避免引用不存在的模板 Config 字段 LOGGER.info("DIRT BLOCK >> {}", BuiltInRegistries.BLOCK.getKey(Blocks.DIRT)); - - // 注册网络通道 - event.enqueueWork(ModNetwork::register); } // Add the example block item to the building blocks tab diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/PatternProviderScreenMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/PatternProviderScreenMixin.java index e07471a..839f903 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/PatternProviderScreenMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/PatternProviderScreenMixin.java @@ -10,11 +10,11 @@ import appeng.menu.implementations.PatternProviderMenu; import com.extendedae_plus.api.ExPatternButtonsAccessor; import com.extendedae_plus.api.PatternProviderMenuAdvancedSync; import com.extendedae_plus.api.PatternProviderMenuDoublingSync; -import com.extendedae_plus.network.ModNetwork; import com.extendedae_plus.network.ToggleAdvancedBlockingC2SPacket; import com.extendedae_plus.network.ToggleSmartDoublingC2SPacket; import com.extendedae_plus.util.ExtendedAELogger; import com.glodblock.github.extendedae.client.gui.GuiExPatternProvider; +import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Inventory; import org.spongepowered.asm.mixin.Mixin; @@ -65,7 +65,8 @@ public abstract class PatternProviderScreenMixin (btn, backwards) -> { // 不做本地切换,点击仅发送自定义C2S,显示由@GuiSync回传 ExtendedAELogger.LOGGER.debug("[EAP] Click advanced blocking toggle: send C2S"); - ModNetwork.CHANNEL.sendToServer(new ToggleAdvancedBlockingC2SPacket()); + var conn = Minecraft.getInstance().getConnection(); + if (conn != null) conn.send(ToggleAdvancedBlockingC2SPacket.INSTANCE); } ) { @Override @@ -98,7 +99,8 @@ public abstract class PatternProviderScreenMixin this.eap$SmartDoublingEnabled ? YesNo.YES : YesNo.NO, (btn, backwards) -> { ExtendedAELogger.LOGGER.debug("[EAP] Click smart doubling toggle: send C2S"); - ModNetwork.CHANNEL.sendToServer(new ToggleSmartDoublingC2SPacket()); + var conn = Minecraft.getInstance().getConnection(); + if (conn != null) conn.send(ToggleSmartDoublingC2SPacket.INSTANCE); } ) { @Override diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicAdvancedMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicAdvancedMixin.java index 5cff7ca..3990ae3 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicAdvancedMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicAdvancedMixin.java @@ -38,12 +38,12 @@ public class PatternProviderLogicAdvancedMixin implements AdvancedBlockingHolder } @Inject(method = "writeToNBT", at = @At("TAIL")) - private void eap$writeAdvancedToNbt(CompoundTag tag, CallbackInfo ci) { + private void eap$writeAdvancedToNbt(CompoundTag tag, net.minecraft.core.HolderLookup.Provider registries, CallbackInfo ci) { tag.putBoolean(EPP_ADV_BLOCKING_KEY, this.eap$advancedBlocking); } @Inject(method = "readFromNBT", at = @At("TAIL")) - private void eap$readAdvancedFromNbt(CompoundTag tag, CallbackInfo ci) { + private void eap$readAdvancedFromNbt(CompoundTag tag, net.minecraft.core.HolderLookup.Provider registries, CallbackInfo ci) { if (tag.contains(EPP_ADV_BLOCKING_KEY)) { this.eap$advancedBlocking = tag.getBoolean(EPP_ADV_BLOCKING_KEY); } @@ -91,19 +91,4 @@ public class PatternProviderLogicAdvancedMixin implements AdvancedBlockingHolder } @Shadow public void saveChanges() {} - - @Inject(method = "exportSettings(Lnet/minecraft/nbt/CompoundTag;)V", at = @At("TAIL")) - private void onExportSettings(CompoundTag output, CallbackInfo ci) { - System.out.println(this.eap$advancedBlocking); - output.putBoolean("eap_advanced_blocking", this.eap$advancedBlocking); - } - - @Inject(method = "importSettings(Lnet/minecraft/nbt/CompoundTag;Lnet/minecraft/world/entity/player/Player;)V", at = @At("TAIL")) - private void onImportSettings(CompoundTag input, Player player, CallbackInfo ci) { - if (input.contains("eap_advanced_blocking")) { - this.eap$advancedBlocking = input.getBoolean("eap_advanced_blocking"); - // 持久化到 world - this.saveChanges(); - } - } } diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicDoublingMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicDoublingMixin.java index 462506f..ad455d6 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicDoublingMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicDoublingMixin.java @@ -46,12 +46,12 @@ public class PatternProviderLogicDoublingMixin implements SmartDoublingHolder { } @Inject(method = "writeToNBT", at = @At("TAIL")) - private void eap$writeSmartDoublingToNbt(CompoundTag tag, CallbackInfo ci) { + private void eap$writeSmartDoublingToNbt(CompoundTag tag, net.minecraft.core.HolderLookup.Provider registries, CallbackInfo ci) { tag.putBoolean(EPP_SMART_DOUBLING_KEY, this.eap$smartDoubling); } @Inject(method = "readFromNBT", at = @At("TAIL")) - private void eap$readSmartDoublingFromNbt(CompoundTag tag, CallbackInfo ci) { + private void eap$readSmartDoublingFromNbt(CompoundTag tag, net.minecraft.core.HolderLookup.Provider registries, CallbackInfo ci) { if (tag.contains(EPP_SMART_DOUBLING_KEY)) { this.eap$smartDoubling = tag.getBoolean(EPP_SMART_DOUBLING_KEY); } @@ -73,19 +73,4 @@ public class PatternProviderLogicDoublingMixin implements SmartDoublingHolder { @Shadow public void saveChanges() {} - - @Inject(method = "exportSettings(Lnet/minecraft/nbt/CompoundTag;)V", at = @At("TAIL")) - private void onExportSettings(CompoundTag output, CallbackInfo ci) { - System.out.println(this.eap$smartDoubling); - output.putBoolean("eap_smart_doubling", this.eap$smartDoubling); - } - - @Inject(method = "importSettings(Lnet/minecraft/nbt/CompoundTag;Lnet/minecraft/world/entity/player/Player;)V", at = @At("TAIL")) - private void onImportSettings(CompoundTag input, Player player, CallbackInfo ci) { - if (input.contains("eap_smart_doubling")) { - this.eap$smartDoubling = input.getBoolean("eap_smart_doubling"); - // 持久化到 world - this.saveChanges(); - } - } } diff --git a/src/main/java/com/extendedae_plus/network/ModNetwork.java b/src/main/java/com/extendedae_plus/network/ModNetwork.java index c684639..2c6a49a 100644 --- a/src/main/java/com/extendedae_plus/network/ModNetwork.java +++ b/src/main/java/com/extendedae_plus/network/ModNetwork.java @@ -1,19 +1,13 @@ package com.extendedae_plus.network; -/** - * 临时的网络通道占位实现,仅用于让 GUI 方案A 最小子集通过编译。 - * 后续将替换为 NeoForge SimpleChannel 正式实现。 - */ +import com.extendedae_plus.ExtendedAEPlus; +import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; + public class ModNetwork { - public static final DummyChannel CHANNEL = new DummyChannel(); - - public static void register() { - // TODO: 后续接入 NeoForge SimpleChannel 正式注册 - } - - public static class DummyChannel { - public void sendToServer(Object any) { - // no-op 占位 - } + // 在 Mod 构造中通过 modEventBus.addListener(ModNetwork::registerPayloadHandlers) 注册 + public static void registerPayloadHandlers(final RegisterPayloadHandlersEvent event) { + var registrar = event.registrar(ExtendedAEPlus.MODID); + registrar.playToServer(ToggleAdvancedBlockingC2SPacket.TYPE, ToggleAdvancedBlockingC2SPacket.STREAM_CODEC, ToggleAdvancedBlockingC2SPacket::handle); + registrar.playToServer(ToggleSmartDoublingC2SPacket.TYPE, ToggleSmartDoublingC2SPacket.STREAM_CODEC, ToggleSmartDoublingC2SPacket::handle); } } diff --git a/src/main/java/com/extendedae_plus/network/ToggleAdvancedBlockingC2SPacket.java b/src/main/java/com/extendedae_plus/network/ToggleAdvancedBlockingC2SPacket.java index 5607440..d179997 100644 --- a/src/main/java/com/extendedae_plus/network/ToggleAdvancedBlockingC2SPacket.java +++ b/src/main/java/com/extendedae_plus/network/ToggleAdvancedBlockingC2SPacket.java @@ -3,20 +3,46 @@ package com.extendedae_plus.network; import appeng.menu.implementations.PatternProviderMenu; import com.extendedae_plus.api.AdvancedBlockingHolder; import com.extendedae_plus.mixin.ae2.accessor.PatternProviderMenuAdvancedAccessor; +import com.extendedae_plus.ExtendedAEPlus; import net.minecraft.network.FriendlyByteBuf; - +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.network.handling.IPayloadContext; import net.minecraft.server.level.ServerPlayer; /** * C2S:切换高级阻挡模式。 * 不含额外负载,直接基于玩家当前打开的 PatternProviderMenu 进行切换。 */ -public class ToggleAdvancedBlockingC2SPacket { - public ToggleAdvancedBlockingC2SPacket() {} +public class ToggleAdvancedBlockingC2SPacket implements CustomPacketPayload { + public static final Type TYPE = new Type<>( + ResourceLocation.fromNamespaceAndPath(ExtendedAEPlus.MODID, "toggle_adv_blocking")); - public static void encode(ToggleAdvancedBlockingC2SPacket msg, FriendlyByteBuf buf) {} + public static final ToggleAdvancedBlockingC2SPacket INSTANCE = new ToggleAdvancedBlockingC2SPacket(); - public static ToggleAdvancedBlockingC2SPacket decode(FriendlyByteBuf buf) { - return new ToggleAdvancedBlockingC2SPacket(); + public static final StreamCodec STREAM_CODEC = + StreamCodec.unit(INSTANCE); + + private ToggleAdvancedBlockingC2SPacket() {} + + @Override + public Type type() { + return TYPE; + } + + public static void handle(final ToggleAdvancedBlockingC2SPacket msg, final IPayloadContext ctx) { + ctx.enqueueWork(() -> { + if (!(ctx.player() instanceof ServerPlayer player)) return; + if (!(player.containerMenu instanceof PatternProviderMenu menu)) return; + + var accessor = (PatternProviderMenuAdvancedAccessor) menu; + var logic = accessor.eap$logic(); + if (logic instanceof AdvancedBlockingHolder holder) { + boolean next = !holder.eap$getAdvancedBlocking(); + holder.eap$setAdvancedBlocking(next); + logic.saveChanges(); + } + }); } } diff --git a/src/main/java/com/extendedae_plus/network/ToggleSmartDoublingC2SPacket.java b/src/main/java/com/extendedae_plus/network/ToggleSmartDoublingC2SPacket.java index 87ada39..2e2bd82 100644 --- a/src/main/java/com/extendedae_plus/network/ToggleSmartDoublingC2SPacket.java +++ b/src/main/java/com/extendedae_plus/network/ToggleSmartDoublingC2SPacket.java @@ -3,19 +3,46 @@ package com.extendedae_plus.network; import appeng.menu.implementations.PatternProviderMenu; import com.extendedae_plus.api.SmartDoublingHolder; import com.extendedae_plus.mixin.ae2.accessor.PatternProviderMenuAdvancedAccessor; +import com.extendedae_plus.ExtendedAEPlus; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.network.handling.IPayloadContext; import net.minecraft.server.level.ServerPlayer; /** * C2S:切换智能翻倍启用状态。 * 不含额外负载,基于玩家当前打开的 PatternProviderMenu 进行切换。 */ -public class ToggleSmartDoublingC2SPacket { - public ToggleSmartDoublingC2SPacket() {} +public class ToggleSmartDoublingC2SPacket implements CustomPacketPayload { + public static final Type TYPE = new Type<>( + ResourceLocation.fromNamespaceAndPath(ExtendedAEPlus.MODID, "toggle_smart_doubling")); - public static void encode(ToggleSmartDoublingC2SPacket msg, FriendlyByteBuf buf) {} + public static final ToggleSmartDoublingC2SPacket INSTANCE = new ToggleSmartDoublingC2SPacket(); - public static ToggleSmartDoublingC2SPacket decode(FriendlyByteBuf buf) { - return new ToggleSmartDoublingC2SPacket(); + public static final StreamCodec STREAM_CODEC = + StreamCodec.unit(INSTANCE); + + private ToggleSmartDoublingC2SPacket() {} + + @Override + public Type type() { + return TYPE; + } + + public static void handle(final ToggleSmartDoublingC2SPacket msg, final IPayloadContext ctx) { + ctx.enqueueWork(() -> { + if (!(ctx.player() instanceof ServerPlayer player)) return; + if (!(player.containerMenu instanceof PatternProviderMenu menu)) return; + + var accessor = (PatternProviderMenuAdvancedAccessor) menu; + var logic = accessor.eap$logic(); + if (logic instanceof SmartDoublingHolder holder) { + boolean next = !holder.eap$getSmartDoubling(); + holder.eap$setSmartDoubling(next); + logic.saveChanges(); + } + }); } } diff --git a/src/main/resources/extendedaeplus.mixins.json b/src/main/resources/extendedaeplus.mixins.json index 4782dea..fadf66c 100644 --- a/src/main/resources/extendedaeplus.mixins.json +++ b/src/main/resources/extendedaeplus.mixins.json @@ -3,13 +3,13 @@ "package": "com.extendedae_plus.mixin", "compatibilityLevel": "JAVA_21", "mixins": [ - // AE2 accessors "ae2.accessor.PatternProviderLogicAccessor", "ae2.accessor.PatternProviderMenuAdvancedAccessor", - // GUI mixins for Pattern Provider "ae2.client.gui.PatternProviderScreenMixin", "ae2.menu.PatternProviderMenuAdvancedMixin", - "ae2.menu.PatternProviderMenuDoublingMixin" + "ae2.menu.PatternProviderMenuDoublingMixin", + "ae2.helpers.PatternProviderLogicAdvancedMixin", + "ae2.helpers.PatternProviderLogicDoublingMixin" ], "injectors": { "defaultRequire": 1