完成样板倍增功能

This commit is contained in:
GaLi 2025-08-10 19:51:19 +08:00
parent e892672f2b
commit 00fc6bad29
2 changed files with 216 additions and 0 deletions

View File

@ -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<NetworkEvent.Context> 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;
}
}

View File

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