回复网络通道

This commit is contained in:
GaLicn 2025-09-06 00:01:38 +08:00
parent 701affe217
commit d056ee43a9
9 changed files with 88 additions and 68 deletions

View File

@ -144,6 +144,8 @@ sourceSets.main.java {
// mixin accessor // mixin accessor
// accessor // accessor
include 'com/extendedae_plus/mixin/ae2/accessor/**' include 'com/extendedae_plus/mixin/ae2/accessor/**'
// PatternProviderLogic /
include 'com/extendedae_plus/mixin/ae2/helpers/**'
// GUI A GUI // GUI A GUI
include 'com/extendedae_plus/mixin/ae2/client/gui/PatternProviderScreenMixin.java' include 'com/extendedae_plus/mixin/ae2/client/gui/PatternProviderScreenMixin.java'
include 'com/extendedae_plus/mixin/ae2/menu/PatternProviderMenuAdvancedMixin.java' include 'com/extendedae_plus/mixin/ae2/menu/PatternProviderMenuAdvancedMixin.java'

View File

@ -71,6 +71,8 @@ public class ExtendedAEPlus {
public ExtendedAEPlus(IEventBus modEventBus, ModContainer modContainer) { public ExtendedAEPlus(IEventBus modEventBus, ModContainer modContainer) {
// Register the commonSetup method for modloading // Register the commonSetup method for modloading
modEventBus.addListener(this::commonSetup); 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 // Register the Deferred Register to the mod event bus so blocks get registered
BLOCKS.register(modEventBus); BLOCKS.register(modEventBus);
@ -101,9 +103,6 @@ public class ExtendedAEPlus {
LOGGER.info("HELLO FROM COMMON SETUP"); LOGGER.info("HELLO FROM COMMON SETUP");
// 示例日志避免引用不存在的模板 Config 字段 // 示例日志避免引用不存在的模板 Config 字段
LOGGER.info("DIRT BLOCK >> {}", BuiltInRegistries.BLOCK.getKey(Blocks.DIRT)); LOGGER.info("DIRT BLOCK >> {}", BuiltInRegistries.BLOCK.getKey(Blocks.DIRT));
// 注册网络通道
event.enqueueWork(ModNetwork::register);
} }
// Add the example block item to the building blocks tab // Add the example block item to the building blocks tab

View File

@ -10,11 +10,11 @@ import appeng.menu.implementations.PatternProviderMenu;
import com.extendedae_plus.api.ExPatternButtonsAccessor; import com.extendedae_plus.api.ExPatternButtonsAccessor;
import com.extendedae_plus.api.PatternProviderMenuAdvancedSync; import com.extendedae_plus.api.PatternProviderMenuAdvancedSync;
import com.extendedae_plus.api.PatternProviderMenuDoublingSync; import com.extendedae_plus.api.PatternProviderMenuDoublingSync;
import com.extendedae_plus.network.ModNetwork;
import com.extendedae_plus.network.ToggleAdvancedBlockingC2SPacket; import com.extendedae_plus.network.ToggleAdvancedBlockingC2SPacket;
import com.extendedae_plus.network.ToggleSmartDoublingC2SPacket; import com.extendedae_plus.network.ToggleSmartDoublingC2SPacket;
import com.extendedae_plus.util.ExtendedAELogger; import com.extendedae_plus.util.ExtendedAELogger;
import com.glodblock.github.extendedae.client.gui.GuiExPatternProvider; import com.glodblock.github.extendedae.client.gui.GuiExPatternProvider;
import net.minecraft.client.Minecraft;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Inventory;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
@ -65,7 +65,8 @@ public abstract class PatternProviderScreenMixin<C extends PatternProviderMenu>
(btn, backwards) -> { (btn, backwards) -> {
// 不做本地切换点击仅发送自定义C2S显示由@GuiSync回传 // 不做本地切换点击仅发送自定义C2S显示由@GuiSync回传
ExtendedAELogger.LOGGER.debug("[EAP] Click advanced blocking toggle: send C2S"); 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 @Override
@ -98,7 +99,8 @@ public abstract class PatternProviderScreenMixin<C extends PatternProviderMenu>
this.eap$SmartDoublingEnabled ? YesNo.YES : YesNo.NO, this.eap$SmartDoublingEnabled ? YesNo.YES : YesNo.NO,
(btn, backwards) -> { (btn, backwards) -> {
ExtendedAELogger.LOGGER.debug("[EAP] Click smart doubling toggle: send C2S"); 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 @Override

View File

@ -38,12 +38,12 @@ public class PatternProviderLogicAdvancedMixin implements AdvancedBlockingHolder
} }
@Inject(method = "writeToNBT", at = @At("TAIL")) @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); tag.putBoolean(EPP_ADV_BLOCKING_KEY, this.eap$advancedBlocking);
} }
@Inject(method = "readFromNBT", at = @At("TAIL")) @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)) { if (tag.contains(EPP_ADV_BLOCKING_KEY)) {
this.eap$advancedBlocking = tag.getBoolean(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() {} @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();
}
}
} }

View File

@ -46,12 +46,12 @@ public class PatternProviderLogicDoublingMixin implements SmartDoublingHolder {
} }
@Inject(method = "writeToNBT", at = @At("TAIL")) @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); tag.putBoolean(EPP_SMART_DOUBLING_KEY, this.eap$smartDoubling);
} }
@Inject(method = "readFromNBT", at = @At("TAIL")) @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)) { if (tag.contains(EPP_SMART_DOUBLING_KEY)) {
this.eap$smartDoubling = tag.getBoolean(EPP_SMART_DOUBLING_KEY); this.eap$smartDoubling = tag.getBoolean(EPP_SMART_DOUBLING_KEY);
} }
@ -73,19 +73,4 @@ public class PatternProviderLogicDoublingMixin implements SmartDoublingHolder {
@Shadow @Shadow
public void saveChanges() {} 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();
}
}
} }

View File

@ -1,19 +1,13 @@
package com.extendedae_plus.network; package com.extendedae_plus.network;
/** import com.extendedae_plus.ExtendedAEPlus;
* 临时的网络通道占位实现仅用于让 GUI 方案A 最小子集通过编译 import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent;
* 后续将替换为 NeoForge SimpleChannel 正式实现
*/
public class ModNetwork { public class ModNetwork {
public static final DummyChannel CHANNEL = new DummyChannel(); // Mod 构造中通过 modEventBus.addListener(ModNetwork::registerPayloadHandlers) 注册
public static void registerPayloadHandlers(final RegisterPayloadHandlersEvent event) {
public static void register() { var registrar = event.registrar(ExtendedAEPlus.MODID);
// TODO: 后续接入 NeoForge SimpleChannel 正式注册 registrar.playToServer(ToggleAdvancedBlockingC2SPacket.TYPE, ToggleAdvancedBlockingC2SPacket.STREAM_CODEC, ToggleAdvancedBlockingC2SPacket::handle);
} registrar.playToServer(ToggleSmartDoublingC2SPacket.TYPE, ToggleSmartDoublingC2SPacket.STREAM_CODEC, ToggleSmartDoublingC2SPacket::handle);
public static class DummyChannel {
public void sendToServer(Object any) {
// no-op 占位
}
} }
} }

View File

@ -3,20 +3,46 @@ package com.extendedae_plus.network;
import appeng.menu.implementations.PatternProviderMenu; import appeng.menu.implementations.PatternProviderMenu;
import com.extendedae_plus.api.AdvancedBlockingHolder; import com.extendedae_plus.api.AdvancedBlockingHolder;
import com.extendedae_plus.mixin.ae2.accessor.PatternProviderMenuAdvancedAccessor; import com.extendedae_plus.mixin.ae2.accessor.PatternProviderMenuAdvancedAccessor;
import com.extendedae_plus.ExtendedAEPlus;
import net.minecraft.network.FriendlyByteBuf; 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; import net.minecraft.server.level.ServerPlayer;
/** /**
* C2S切换高级阻挡模式 * C2S切换高级阻挡模式
* 不含额外负载直接基于玩家当前打开的 PatternProviderMenu 进行切换 * 不含额外负载直接基于玩家当前打开的 PatternProviderMenu 进行切换
*/ */
public class ToggleAdvancedBlockingC2SPacket { public class ToggleAdvancedBlockingC2SPacket implements CustomPacketPayload {
public ToggleAdvancedBlockingC2SPacket() {} public static final Type<ToggleAdvancedBlockingC2SPacket> 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) { public static final StreamCodec<FriendlyByteBuf, ToggleAdvancedBlockingC2SPacket> STREAM_CODEC =
return new ToggleAdvancedBlockingC2SPacket(); StreamCodec.unit(INSTANCE);
private ToggleAdvancedBlockingC2SPacket() {}
@Override
public Type<? extends CustomPacketPayload> 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();
}
});
} }
} }

View File

@ -3,19 +3,46 @@ package com.extendedae_plus.network;
import appeng.menu.implementations.PatternProviderMenu; import appeng.menu.implementations.PatternProviderMenu;
import com.extendedae_plus.api.SmartDoublingHolder; import com.extendedae_plus.api.SmartDoublingHolder;
import com.extendedae_plus.mixin.ae2.accessor.PatternProviderMenuAdvancedAccessor; import com.extendedae_plus.mixin.ae2.accessor.PatternProviderMenuAdvancedAccessor;
import com.extendedae_plus.ExtendedAEPlus;
import net.minecraft.network.FriendlyByteBuf; 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; import net.minecraft.server.level.ServerPlayer;
/** /**
* C2S切换智能翻倍启用状态 * C2S切换智能翻倍启用状态
* 不含额外负载基于玩家当前打开的 PatternProviderMenu 进行切换 * 不含额外负载基于玩家当前打开的 PatternProviderMenu 进行切换
*/ */
public class ToggleSmartDoublingC2SPacket { public class ToggleSmartDoublingC2SPacket implements CustomPacketPayload {
public ToggleSmartDoublingC2SPacket() {} public static final Type<ToggleSmartDoublingC2SPacket> 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) { public static final StreamCodec<FriendlyByteBuf, ToggleSmartDoublingC2SPacket> STREAM_CODEC =
return new ToggleSmartDoublingC2SPacket(); StreamCodec.unit(INSTANCE);
private ToggleSmartDoublingC2SPacket() {}
@Override
public Type<? extends CustomPacketPayload> 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();
}
});
} }
} }

View File

@ -3,13 +3,13 @@
"package": "com.extendedae_plus.mixin", "package": "com.extendedae_plus.mixin",
"compatibilityLevel": "JAVA_21", "compatibilityLevel": "JAVA_21",
"mixins": [ "mixins": [
// AE2 accessors
"ae2.accessor.PatternProviderLogicAccessor", "ae2.accessor.PatternProviderLogicAccessor",
"ae2.accessor.PatternProviderMenuAdvancedAccessor", "ae2.accessor.PatternProviderMenuAdvancedAccessor",
// GUI mixins for Pattern Provider
"ae2.client.gui.PatternProviderScreenMixin", "ae2.client.gui.PatternProviderScreenMixin",
"ae2.menu.PatternProviderMenuAdvancedMixin", "ae2.menu.PatternProviderMenuAdvancedMixin",
"ae2.menu.PatternProviderMenuDoublingMixin" "ae2.menu.PatternProviderMenuDoublingMixin",
"ae2.helpers.PatternProviderLogicAdvancedMixin",
"ae2.helpers.PatternProviderLogicDoublingMixin"
], ],
"injectors": { "injectors": {
"defaultRequire": 1 "defaultRequire": 1