修复了服务端打不开的问题

This commit is contained in:
XianYuFish001 2025-09-24 16:48:13 +08:00
parent 127f015284
commit be3bc1dcf8
9 changed files with 122 additions and 47 deletions

View File

@ -15,7 +15,7 @@ loader_version_range=[1,)
mod_id=extendedae_plus mod_id=extendedae_plus
mod_name=ExtendedAE-Plus mod_name=ExtendedAE-Plus
mod_license=LGPL-3.0-or-later mod_license=LGPL-3.0-or-later
mod_version=1.0.0 mod_version=1.0.0fix
mod_group_id=com.extendedae_plus mod_group_id=com.extendedae_plus
mod_authors=GaLicn, XianYuFish001 mod_authors=GaLicn, XianYuFish001
mod_description= mod_description=

View File

@ -6,6 +6,7 @@ import appeng.core.AEConfig;
import com.extendedae_plus.ExtendedAEPlus; import com.extendedae_plus.ExtendedAEPlus;
import com.extendedae_plus.mixin.ae2.accessor.MEStorageScreenAccessor; import com.extendedae_plus.mixin.ae2.accessor.MEStorageScreenAccessor;
import com.extendedae_plus.mixin.extendedae.accessor.GuiExPatternTerminalAccessor; import com.extendedae_plus.mixin.extendedae.accessor.GuiExPatternTerminalAccessor;
import com.extendedae_plus.network.C2SPacketTargetKeyTriggered;
import com.extendedae_plus.network.OpenCraftFromJeiC2SPacket; import com.extendedae_plus.network.OpenCraftFromJeiC2SPacket;
import com.extendedae_plus.network.PullFromJeiOrCraftC2SPacket; import com.extendedae_plus.network.PullFromJeiOrCraftC2SPacket;
import com.glodblock.github.extendedae.client.gui.GuiExPatternTerminal; import com.glodblock.github.extendedae.client.gui.GuiExPatternTerminal;
@ -78,8 +79,7 @@ public final class InputEvents {
@SubscribeEvent @SubscribeEvent
public static void onKeyPressedPre(ScreenEvent.KeyPressed.Pre event) { public static void onKeyPressedPre(ScreenEvent.KeyPressed.Pre event) {
if (event.getKeyCode() != GLFW.GLFW_KEY_F) return; if (event.getKeyCode() == GLFW.GLFW_KEY_F) {
// 仅当鼠标确实悬停在 JEI 配料上时触发 // 仅当鼠标确实悬停在 JEI 配料上时触发
// 大概会在一格有多个(?)stack的时候出bug, 但是真的会有那种时候吗? // 大概会在一格有多个(?)stack的时候出bug, 但是真的会有那种时候吗?
List<EmiStack> stack = EmiApi.getHoveredStack(false).getStack().getEmiStacks(); List<EmiStack> stack = EmiApi.getHoveredStack(false).getStack().getEmiStacks();
@ -99,7 +99,8 @@ public final class InputEvents {
acc.eap$setSearchText(name); // 同步到 Repo 并刷新 acc.eap$setSearchText(name); // 同步到 Repo 并刷新
} }
event.setCanceled(true); event.setCanceled(true);
} catch (Throwable ignored) {} } catch (Throwable ignored) {
}
} else if (screen instanceof GuiExPatternTerminal<?> gpt) { } else if (screen instanceof GuiExPatternTerminal<?> gpt) {
try { try {
if (AEConfig.instance().isUseExternalSearch()) EmiApi.setSearchText(name); if (AEConfig.instance().isUseExternalSearch()) EmiApi.setSearchText(name);
@ -108,7 +109,16 @@ public final class InputEvents {
acc.getSearchField().setValue(name); acc.getSearchField().setValue(name);
} }
event.setCanceled(true); event.setCanceled(true);
} catch (Throwable ignored) {} } catch (Throwable ignored) {
} }
} }
} else if (event.getKeyCode() == GLFW.GLFW_KEY_LEFT_SHIFT)
PacketDistributor.sendToServer(new C2SPacketTargetKeyTriggered(C2SPacketTargetKeyTriggered.KeyType.SHIFT_DOWN));
}
@SubscribeEvent
public static void onKeyReleasePre(ScreenEvent.KeyReleased.Pre event) {
if (event.getKeyCode() == GLFW.GLFW_KEY_LEFT_SHIFT)
PacketDistributor.sendToServer(new C2SPacketTargetKeyTriggered(C2SPacketTargetKeyTriggered.KeyType.SHIFT_UP));
}
} }

View File

@ -0,0 +1,5 @@
package com.extendedae_plus.client;
public interface PatternEncodingTermMenuMixinHelper {
void eaep$setShiftPressed(boolean pressed);
}

View File

@ -24,7 +24,7 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
/** /**
* AE2 原版样板供应器界面添加高级阻挡模式按钮 * AE2 原版样板供应器界面添加智能阻挡模式按钮
* - 位于左侧工具栏 * - 位于左侧工具栏
* - 点击仅发送 C2S 切换请求状态由 AE2 @GuiSync 回传决定 * - 点击仅发送 C2S 切换请求状态由 AE2 @GuiSync 回传决定
*/ */

View File

@ -8,14 +8,13 @@ import appeng.api.storage.MEStorage;
import appeng.api.storage.StorageHelper; import appeng.api.storage.StorageHelper;
import appeng.core.definitions.AEItems; import appeng.core.definitions.AEItems;
import appeng.helpers.IPatternTerminalMenuHost; import appeng.helpers.IPatternTerminalMenuHost;
import appeng.menu.me.common.MEStorageMenu;
import appeng.menu.me.items.PatternEncodingTermMenu; import appeng.menu.me.items.PatternEncodingTermMenu;
import appeng.menu.slot.RestrictedInputSlot; import appeng.menu.slot.RestrictedInputSlot;
import appeng.parts.encoding.EncodingMode; import appeng.parts.encoding.EncodingMode;
import com.extendedae_plus.client.PatternEncodingTermMenuMixinHelper;
import com.extendedae_plus.config.ModConfig; import com.extendedae_plus.config.ModConfig;
import com.extendedae_plus.mixin.ae2.accessor.MEStorageMenuAccessor; import com.extendedae_plus.mixin.ae2.accessor.MEStorageMenuAccessor;
import com.extendedae_plus.network.C2SPacketEncodeFinished; import com.extendedae_plus.network.C2SPacketEncodeFinished;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.MenuType;
@ -28,16 +27,21 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(PatternEncodingTermMenu.class) @Mixin(PatternEncodingTermMenu.class)
public abstract class PatternEncodingTermMenuMixin { public abstract class PatternEncodingTermMenuMixin implements PatternEncodingTermMenuMixinHelper {
// 防止重复执行 // 防止重复执行
@Unique @Unique
private boolean eap$blankAutoFilled = false; private boolean eap$blankAutoFilled = false;
@Shadow @Shadow
private RestrictedInputSlot blankPatternSlot; private RestrictedInputSlot blankPatternSlot;
@Shadow @Shadow
public EncodingMode mode; public EncodingMode mode;
@Unique
public boolean isShiftPressed = false;
@Unique
public void eaep$setShiftPressed(boolean press) {
isShiftPressed = press;
}
@Unique @Unique
private void eap$tryFill(IPatternTerminalMenuHost host, Inventory ip) { private void eap$tryFill(IPatternTerminalMenuHost host, Inventory ip) {
@ -114,14 +118,14 @@ public abstract class PatternEncodingTermMenuMixin {
} }
// 仅在服务器端执行 // 仅在服务器端执行
var self = (PatternEncodingTermMenu) (Object) this; var self = (PatternEncodingTermMenu) (Object) this;
var acc = (MEStorageMenuAccessor) (Object) ((MEStorageMenu) self); var acc = (MEStorageMenuAccessor) self;
MEStorage storage = acc.getStorage(); MEStorage storage = acc.getStorage();
IEnergySource power = acc.getEnergySource(); IEnergySource power = acc.getEnergySource();
var player = self.getPlayerInventory().player; var player = self.getPlayerInventory().player;
if (player.level().isClientSide()) { if (player.level().isClientSide()) {
return; return;
} }
boolean canInteract = storage != null && power != null && ((MEStorageMenu) self).getLinkStatus().connected(); boolean canInteract = storage != null && power != null && self.getLinkStatus().connected();
if (!canInteract) { if (!canInteract) {
return; return;
} }
@ -161,7 +165,8 @@ public abstract class PatternEncodingTermMenuMixin {
@Inject(method = "encode", at = @At("TAIL")) @Inject(method = "encode", at = @At("TAIL"))
private void eaep$onEncode(CallbackInfo ci) { private void eaep$onEncode(CallbackInfo ci) {
if (ModConfig.INDEPENDENT_UPLOADING_BUTTON.getAsBoolean()) return; if (ModConfig.INDEPENDENT_UPLOADING_BUTTON.getAsBoolean()) return;
if (!Screen.hasShiftDown()) return; if (!isShiftPressed) return;
isShiftPressed = false;
var self = (PatternEncodingTermMenu) (Object) this; var self = (PatternEncodingTermMenu) (Object) this;
PacketDistributor.sendToPlayer((ServerPlayer) self.getPlayer(), C2SPacketEncodeFinished.INSTANCE); PacketDistributor.sendToPlayer((ServerPlayer) self.getPlayer(), C2SPacketEncodeFinished.INSTANCE);
} }

View File

@ -0,0 +1,47 @@
package com.extendedae_plus.network;
import appeng.menu.me.items.PatternEncodingTermMenu;
import com.extendedae_plus.ExtendedAEPlus;
import com.extendedae_plus.client.PatternEncodingTermMenuMixinHelper;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerPlayer;
import net.neoforged.neoforge.network.codec.NeoForgeStreamCodecs;
import net.neoforged.neoforge.network.handling.IPayloadContext;
public record C2SPacketTargetKeyTriggered(KeyType keyType) implements CustomPacketPayload{
public enum KeyType {
SHIFT_DOWN,
SHIFT_UP
}
@Override
public Type<? extends CustomPacketPayload> type() {
return TYPE;
}
public static final Type<C2SPacketTargetKeyTriggered> TYPE = new Type<>(
ResourceLocation.fromNamespaceAndPath(ExtendedAEPlus.MODID, "target_key_pressed"));
public static final StreamCodec<RegistryFriendlyByteBuf, C2SPacketTargetKeyTriggered> STREAM_CODEC = StreamCodec.composite(
NeoForgeStreamCodecs.enumCodec(KeyType.class), C2SPacketTargetKeyTriggered::keyType,
C2SPacketTargetKeyTriggered::new);
public static void handle(C2SPacketTargetKeyTriggered packet, IPayloadContext context) {
context.enqueueWork(() -> {
if (context.player().level().isClientSide) return;
ServerPlayer player = (ServerPlayer) context.player();
if (player.containerMenu instanceof PatternEncodingTermMenu patternMenu) {
if (patternMenu instanceof PatternEncodingTermMenuMixinHelper accessor) {
accessor.eaep$setShiftPressed(switch (packet.keyType) {
case SHIFT_UP -> false;
case SHIFT_DOWN -> true;
});
}
}
});
}
}

View File

@ -36,5 +36,8 @@ public class ModNetwork {
registrar.playToClient(C2SPacketEncodeFinished.TYPE, registrar.playToClient(C2SPacketEncodeFinished.TYPE,
C2SPacketEncodeFinished.STREAM_CODEC, C2SPacketEncodeFinished.STREAM_CODEC,
C2SPacketEncodeFinished::handle); C2SPacketEncodeFinished::handle);
registrar.playToServer(C2SPacketTargetKeyTriggered.TYPE,
C2SPacketTargetKeyTriggered.STREAM_CODEC,
C2SPacketTargetKeyTriggered::handle);
} }
} }

View File

@ -7,6 +7,8 @@ import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.api.distmarker.OnlyIn;
import net.neoforged.neoforge.network.handling.IPayloadContext; import net.neoforged.neoforge.network.handling.IPayloadContext;
import java.util.ArrayList; import java.util.ArrayList;
@ -58,11 +60,14 @@ public class ProvidersListS2CPacket implements CustomPacketPayload {
} }
public static void handle(final ProvidersListS2CPacket msg, final IPayloadContext ctx) { public static void handle(final ProvidersListS2CPacket msg, final IPayloadContext ctx) {
ctx.enqueueWork(() -> { ctx.enqueueWork(() -> handleClient(msg));
}
@OnlyIn(Dist.CLIENT)
private static void handleClient(ProvidersListS2CPacket msg) {
var mc = Minecraft.getInstance(); var mc = Minecraft.getInstance();
if (mc == null) return; if (mc == null) return;
var current = mc.screen; var current = mc.screen;
mc.setScreen(new ProviderSelectScreen(current, msg.ids, msg.names, msg.emptySlots)); mc.setScreen(new ProviderSelectScreen(current, msg.ids, msg.names, msg.emptySlots));
});
} }
} }

View File

@ -6,7 +6,6 @@
"ae2.AEProcessingPatternMixin", "ae2.AEProcessingPatternMixin",
"ae2.CraftingCPUClusterMixin", "ae2.CraftingCPUClusterMixin",
"ae2.EncodedPatternItemMixin", "ae2.EncodedPatternItemMixin",
"ae2.QuartzCuttingKnifeItemMixin",
"ae2.accessor.MEStorageMenuAccessor", "ae2.accessor.MEStorageMenuAccessor",
"ae2.accessor.PatternEncodingTermMenuAccessor", "ae2.accessor.PatternEncodingTermMenuAccessor",
"ae2.accessor.PatternProviderLogicAccessor", "ae2.accessor.PatternProviderLogicAccessor",
@ -36,6 +35,7 @@
"PickFromWirelessMixin", "PickFromWirelessMixin",
"accessor.AbstractContainerScreenAccessor", "accessor.AbstractContainerScreenAccessor",
"accessor.ScreenAccessor", "accessor.ScreenAccessor",
"ae2.QuartzCuttingKnifeItemMixin",
"ae2.accessor.AEBaseScreenAccessor", "ae2.accessor.AEBaseScreenAccessor",
"ae2.accessor.AEBaseScreenInvoker", "ae2.accessor.AEBaseScreenInvoker",
"ae2.accessor.MEStorageScreenAccessor", "ae2.accessor.MEStorageScreenAccessor",