package com.extendedae_plus.mixin; import appeng.api.util.IConfigurableObject; import com.extendedae_plus.util.ExtendedAEPatternUploadUtil; import com.glodblock.github.extendedae.container.ContainerWirelessExPAT; import com.glodblock.github.extendedae.common.me.itemhost.HostWirelessExPAT; import com.glodblock.github.glodium.network.packet.sync.IActionHolder; import com.glodblock.github.glodium.network.packet.sync.Paras; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Pseudo; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Map; import java.util.function.Consumer; /** * 为无线样板访问终端容器注册通用动作(CGenericPacket 分发) */ @Pseudo @Mixin(ContainerWirelessExPAT.class) public abstract class ContainerWirelessExPatternTerminalMixin implements IActionHolder { @Unique private final Map> actions = createHolder(); @Unique private Player epp$player; // 明确目标构造签名:(int, Inventory, HostWirelessExPAT) @Inject(method = "(ILnet/minecraft/world/entity/player/Inventory;Lcom/glodblock/github/extendedae/common/me/itemhost/HostWirelessExPAT;)V", at = @At("TAIL"), require = 0) private void init(int id, net.minecraft.world.entity.player.Inventory playerInventory, HostWirelessExPAT host, CallbackInfo ci) { this.epp$player = playerInventory.player; // 注册上传动作:参数顺序必须与客户端 CGenericPacket 保持一致 this.actions.put("upload", p -> { try { Object o0 = p.get(0); Object o1 = p.get(1); int playerSlotIndex = (o0 instanceof Number) ? ((Number) o0).intValue() : Integer.parseInt(String.valueOf(o0)); long providerId = (o1 instanceof Number) ? ((Number) o1).longValue() : Long.parseLong(String.valueOf(o1)); var sp = (ServerPlayer) this.epp$player; System.out.println("[EAE+][Server][Wireless] upload: slot=" + playerSlotIndex + ", provider=" + providerId); ExtendedAEPatternUploadUtil.uploadPatternToProvider(sp, playerSlotIndex, providerId); } catch (Throwable t) { t.printStackTrace(); } }); System.out.println("[EAE+][Server] WirelessExPAT actions registered: " + this.actions.keySet()); } // 兼容部分整合包构造签名(第三参为 IConfigurableObject),在不存在该重载时不报错 @Inject(method = "(ILnet/minecraft/world/entity/player/Inventory;Lappeng/api/util/IConfigurableObject;)V", at = @At("TAIL"), require = 0) private void initFallback(int id, net.minecraft.world.entity.player.Inventory playerInventory, IConfigurableObject host, CallbackInfo ci) { this.epp$player = playerInventory.player; this.actions.put("upload", p -> { try { Object o0 = p.get(0); Object o1 = p.get(1); int playerSlotIndex = (o0 instanceof Number) ? ((Number) o0).intValue() : Integer.parseInt(String.valueOf(o0)); long providerId = (o1 instanceof Number) ? ((Number) o1).longValue() : Long.parseLong(String.valueOf(o1)); var sp = (ServerPlayer) this.epp$player; System.out.println("[EAE+][Server][Wireless/Fallback] upload: slot=" + playerSlotIndex + ", provider=" + providerId); ExtendedAEPatternUploadUtil.uploadPatternToProvider(sp, playerSlotIndex, providerId); } catch (Throwable t) { t.printStackTrace(); } }); System.out.println("[EAE+][Server] WirelessExPAT actions registered (fallback): " + this.actions.keySet()); } @NotNull @Override public Map> getActionMap() { return this.actions; } }