回复网络通道

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
// 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'

View File

@ -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

View File

@ -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<C extends PatternProviderMenu>
(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<C extends PatternProviderMenu>
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

View File

@ -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();
}
}
}

View File

@ -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();
}
}
}

View File

@ -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);
}
}

View File

@ -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<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) {
return new ToggleAdvancedBlockingC2SPacket();
public static final StreamCodec<FriendlyByteBuf, ToggleAdvancedBlockingC2SPacket> STREAM_CODEC =
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 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<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) {
return new ToggleSmartDoublingC2SPacket();
public static final StreamCodec<FriendlyByteBuf, ToggleSmartDoublingC2SPacket> STREAM_CODEC =
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",
"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