From 00fc6bad29fa9a7b39c4fdfdbe7af6446db2b51a Mon Sep 17 00:00:00 2001 From: GaLi <3096147684@qq.com> Date: Sun, 10 Aug 2025 19:51:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=A0=B7=E6=9D=BF=E5=80=8D?= =?UTF-8?q?=E5=A2=9E=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../network/PatternScalingPacket.java | 127 ++++++++++++++++++ .../network/PatternScalingResultPacket.java | 89 ++++++++++++ 2 files changed, 216 insertions(+) create mode 100644 src/main/java/com/extendedae_plus/network/PatternScalingPacket.java create mode 100644 src/main/java/com/extendedae_plus/network/PatternScalingResultPacket.java diff --git a/src/main/java/com/extendedae_plus/network/PatternScalingPacket.java b/src/main/java/com/extendedae_plus/network/PatternScalingPacket.java new file mode 100644 index 0000000..83bf9df --- /dev/null +++ b/src/main/java/com/extendedae_plus/network/PatternScalingPacket.java @@ -0,0 +1,127 @@ +package com.extendedae_plus.network; + +import com.extendedae_plus.util.PatternProviderDataUtil; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraftforge.network.NetworkEvent; +import appeng.helpers.patternprovider.PatternProviderLogic; +import appeng.menu.me.common.MEStorageMenu; + +import java.util.function.Supplier; + +/** + * 样板缩放网络包 + * 用于从客户端发送样板倍增/除法请求到服务器 + */ +public class PatternScalingPacket { + + public enum ScalingType { + MULTIPLY, // 倍增 + DIVIDE // 除法 + } + + private final ScalingType scalingType; + private final double scaleFactor; + + public PatternScalingPacket(ScalingType scalingType, double scaleFactor) { + this.scalingType = scalingType; + this.scaleFactor = scaleFactor; + } + + /** + * 编码数据包 + */ + public static void encode(PatternScalingPacket packet, FriendlyByteBuf buffer) { + buffer.writeEnum(packet.scalingType); + buffer.writeDouble(packet.scaleFactor); + } + + /** + * 解码数据包 + */ + public static PatternScalingPacket decode(FriendlyByteBuf buffer) { + ScalingType scalingType = buffer.readEnum(ScalingType.class); + double scaleFactor = buffer.readDouble(); + return new PatternScalingPacket(scalingType, scaleFactor); + } + + /** + * 处理数据包(服务器端) + */ + public static void handle(PatternScalingPacket packet, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + ServerPlayer player = context.getSender(); + if (player == null) { + return; + } + + try { + // 获取玩家当前打开的样板供应器菜单 + PatternProviderLogic patternProvider = getCurrentPatternProvider(player); + if (patternProvider == null) { + System.out.println("ExtendedAE Plus: 玩家 " + player.getName().getString() + " 没有打开样板供应器界面"); + return; + } + + // 在服务器端执行样板缩放操作 + PatternProviderDataUtil.PatternScalingResult result; + if (packet.scalingType == ScalingType.MULTIPLY) { + result = PatternProviderDataUtil.duplicatePatternAmountsExtendedAEStyle(patternProvider, packet.scaleFactor); + } else { + result = PatternProviderDataUtil.dividePatternAmounts(patternProvider, packet.scaleFactor); + } + + // 发送结果回客户端 + if (result != null) { + PatternScalingResultPacket resultPacket = new PatternScalingResultPacket( + result.isSuccessful(), + result.getScaledPatterns(), + result.getFailedPatterns(), + result.getTotalPatterns(), + String.join("; ", result.getErrors()) + ); + NetworkHandler.sendToClient(resultPacket, player); + + System.out.println("ExtendedAE Plus: 服务器端样板缩放完成 - 成功: " + result.getScaledPatterns() + ", 失败: " + result.getFailedPatterns()); + } + + } catch (Exception e) { + System.out.println("ExtendedAE Plus: 服务器端处理样板缩放时发生错误: " + e.getMessage()); + e.printStackTrace(); + + // 发送错误结果回客户端 + PatternScalingResultPacket errorPacket = new PatternScalingResultPacket( + false, 0, 0, 0, "服务器端处理错误: " + e.getMessage() + ); + NetworkHandler.sendToClient(errorPacket, player); + } + }); + context.setPacketHandled(true); + } + + /** + * 获取玩家当前打开的样板供应器逻辑 + */ + private static PatternProviderLogic getCurrentPatternProvider(ServerPlayer player) { + try { + if (player.containerMenu != null) { + // 检查是否是样板供应器菜单 + String menuClassName = player.containerMenu.getClass().getSimpleName(); + if (menuClassName.contains("PatternProvider")) { + // 通过反射获取PatternProviderLogic + var logicField = player.containerMenu.getClass().getDeclaredField("logic"); + logicField.setAccessible(true); + Object logic = logicField.get(player.containerMenu); + + if (logic instanceof PatternProviderLogic) { + return (PatternProviderLogic) logic; + } + } + } + } catch (Exception e) { + System.out.println("ExtendedAE Plus: 获取样板供应器逻辑时发生错误: " + e.getMessage()); + } + return null; + } +} diff --git a/src/main/java/com/extendedae_plus/network/PatternScalingResultPacket.java b/src/main/java/com/extendedae_plus/network/PatternScalingResultPacket.java new file mode 100644 index 0000000..d1f1e83 --- /dev/null +++ b/src/main/java/com/extendedae_plus/network/PatternScalingResultPacket.java @@ -0,0 +1,89 @@ +package com.extendedae_plus.network; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraftforge.network.NetworkEvent; + +import java.util.function.Supplier; + +/** + * 样板缩放结果网络包 + * 用于从服务器发送样板缩放操作结果到客户端 + */ +public class PatternScalingResultPacket { + + private final boolean successful; + private final int scaledPatterns; + private final int failedPatterns; + private final int totalPatterns; + private final String errorMessage; + + public PatternScalingResultPacket(boolean successful, int scaledPatterns, int failedPatterns, int totalPatterns, String errorMessage) { + this.successful = successful; + this.scaledPatterns = scaledPatterns; + this.failedPatterns = failedPatterns; + this.totalPatterns = totalPatterns; + this.errorMessage = errorMessage != null ? errorMessage : ""; + } + + /** + * 编码数据包 + */ + public static void encode(PatternScalingResultPacket packet, FriendlyByteBuf buffer) { + buffer.writeBoolean(packet.successful); + buffer.writeInt(packet.scaledPatterns); + buffer.writeInt(packet.failedPatterns); + buffer.writeInt(packet.totalPatterns); + buffer.writeUtf(packet.errorMessage); + } + + /** + * 解码数据包 + */ + public static PatternScalingResultPacket decode(FriendlyByteBuf buffer) { + boolean successful = buffer.readBoolean(); + int scaledPatterns = buffer.readInt(); + int failedPatterns = buffer.readInt(); + int totalPatterns = buffer.readInt(); + String errorMessage = buffer.readUtf(); + return new PatternScalingResultPacket(successful, scaledPatterns, failedPatterns, totalPatterns, errorMessage); + } + + /** + * 处理数据包(客户端) + */ + public static void handle(PatternScalingResultPacket packet, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + Minecraft minecraft = Minecraft.getInstance(); + if (minecraft.player != null) { + // 在客户端显示结果消息 + String message; + if (packet.successful) { + if (packet.failedPatterns > 0) { + message = String.format("✅ ExtendedAE Plus: 样板缩放部分成功!成功处理 %d 个样板,跳过 %d 个样板", + packet.scaledPatterns, packet.failedPatterns); + } else { + message = String.format("✅ ExtendedAE Plus: 样板缩放成功!处理了 %d 个样板", packet.scaledPatterns); + } + } else { + message = "❌ ExtendedAE Plus: 样板缩放失败!" + + (packet.errorMessage.isEmpty() ? "" : " 错误: " + packet.errorMessage); + } + + // 显示消息到聊天栏和动作栏 + minecraft.player.displayClientMessage(Component.literal(message), true); + + // 同时输出到控制台用于调试 + System.out.println("ExtendedAE Plus 客户端收到结果: " + message); + + // 如果有错误信息,也输出详细错误 + if (!packet.errorMessage.isEmpty() && !packet.successful) { + System.out.println("ExtendedAE Plus 详细错误信息: " + packet.errorMessage); + } + } + }); + context.setPacketHandled(true); + } +}