修复了服务端打不开的问题
This commit is contained in:
parent
127f015284
commit
be3bc1dcf8
|
|
@ -15,7 +15,7 @@ loader_version_range=[1,)
|
|||
mod_id=extendedae_plus
|
||||
mod_name=ExtendedAE-Plus
|
||||
mod_license=LGPL-3.0-or-later
|
||||
mod_version=1.0.0
|
||||
mod_version=1.0.0fix
|
||||
mod_group_id=com.extendedae_plus
|
||||
mod_authors=GaLicn, XianYuFish001
|
||||
mod_description=
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ import appeng.core.AEConfig;
|
|||
import com.extendedae_plus.ExtendedAEPlus;
|
||||
import com.extendedae_plus.mixin.ae2.accessor.MEStorageScreenAccessor;
|
||||
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.PullFromJeiOrCraftC2SPacket;
|
||||
import com.glodblock.github.extendedae.client.gui.GuiExPatternTerminal;
|
||||
|
|
@ -78,37 +79,46 @@ public final class InputEvents {
|
|||
|
||||
@SubscribeEvent
|
||||
public static void onKeyPressedPre(ScreenEvent.KeyPressed.Pre event) {
|
||||
if (event.getKeyCode() != GLFW.GLFW_KEY_F) return;
|
||||
if (event.getKeyCode() == GLFW.GLFW_KEY_F) {
|
||||
// 仅当鼠标确实悬停在 JEI 配料上时触发
|
||||
// 大概会在一格有多个(?)stack的时候出bug, 但是真的会有那种时候吗?
|
||||
List<EmiStack> stack = EmiApi.getHoveredStack(false).getStack().getEmiStacks();
|
||||
if (stack.isEmpty()) return;
|
||||
String name = stack.getFirst().getName().getString();
|
||||
if (name.isEmpty()) return;
|
||||
|
||||
// 仅当鼠标确实悬停在 JEI 配料上时触发
|
||||
// 大概会在一格有多个(?)stack的时候出bug, 但是真的会有那种时候吗?
|
||||
List<EmiStack> stack = EmiApi.getHoveredStack(false).getStack().getEmiStacks();
|
||||
if (stack.isEmpty()) return;
|
||||
String name = stack.getFirst().getName().getString();
|
||||
if (name.isEmpty()) return;
|
||||
// 写入 AE2 终端的搜索框
|
||||
var screen = Minecraft.getInstance().screen;
|
||||
if (screen instanceof MEStorageScreen<?> me) {
|
||||
try {
|
||||
// 如果用EMI搜索框
|
||||
if (AEConfig.instance().isUseExternalSearch()) EmiApi.setSearchText(name);
|
||||
else {
|
||||
MEStorageScreenAccessor acc = (MEStorageScreenAccessor) me;
|
||||
acc.eap$getSearchField().setValue(name);
|
||||
acc.eap$setSearchText(name); // 同步到 Repo 并刷新
|
||||
}
|
||||
event.setCanceled(true);
|
||||
} catch (Throwable ignored) {
|
||||
}
|
||||
} else if (screen instanceof GuiExPatternTerminal<?> gpt) {
|
||||
try {
|
||||
if (AEConfig.instance().isUseExternalSearch()) EmiApi.setSearchText(name);
|
||||
else {
|
||||
GuiExPatternTerminalAccessor acc = (GuiExPatternTerminalAccessor) gpt;
|
||||
acc.getSearchField().setValue(name);
|
||||
}
|
||||
event.setCanceled(true);
|
||||
} catch (Throwable ignored) {
|
||||
}
|
||||
}
|
||||
} else if (event.getKeyCode() == GLFW.GLFW_KEY_LEFT_SHIFT)
|
||||
PacketDistributor.sendToServer(new C2SPacketTargetKeyTriggered(C2SPacketTargetKeyTriggered.KeyType.SHIFT_DOWN));
|
||||
}
|
||||
|
||||
// 写入 AE2 终端的搜索框
|
||||
var screen = Minecraft.getInstance().screen;
|
||||
if (screen instanceof MEStorageScreen<?> me) {
|
||||
try {
|
||||
// 如果用EMI搜索框
|
||||
if (AEConfig.instance().isUseExternalSearch()) EmiApi.setSearchText(name);
|
||||
else {
|
||||
MEStorageScreenAccessor acc = (MEStorageScreenAccessor) me;
|
||||
acc.eap$getSearchField().setValue(name);
|
||||
acc.eap$setSearchText(name); // 同步到 Repo 并刷新
|
||||
}
|
||||
event.setCanceled(true);
|
||||
} catch (Throwable ignored) {}
|
||||
} else if (screen instanceof GuiExPatternTerminal<?> gpt) {
|
||||
try {
|
||||
if (AEConfig.instance().isUseExternalSearch()) EmiApi.setSearchText(name);
|
||||
else {
|
||||
GuiExPatternTerminalAccessor acc = (GuiExPatternTerminalAccessor) gpt;
|
||||
acc.getSearchField().setValue(name);
|
||||
}
|
||||
event.setCanceled(true);
|
||||
} catch (Throwable ignored) {}
|
||||
}
|
||||
@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));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
package com.extendedae_plus.client;
|
||||
|
||||
public interface PatternEncodingTermMenuMixinHelper {
|
||||
void eaep$setShiftPressed(boolean pressed);
|
||||
}
|
||||
|
|
@ -24,7 +24,7 @@ import org.spongepowered.asm.mixin.injection.Inject;
|
|||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
/**
|
||||
* 为 AE2 原版样板供应器界面添加“高级阻挡模式”按钮。
|
||||
* 为 AE2 原版样板供应器界面添加“智能阻挡模式”按钮。
|
||||
* - 位于左侧工具栏
|
||||
* - 点击仅发送 C2S 切换请求;状态由 AE2 @GuiSync 回传决定
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -8,14 +8,13 @@ import appeng.api.storage.MEStorage;
|
|||
import appeng.api.storage.StorageHelper;
|
||||
import appeng.core.definitions.AEItems;
|
||||
import appeng.helpers.IPatternTerminalMenuHost;
|
||||
import appeng.menu.me.common.MEStorageMenu;
|
||||
import appeng.menu.me.items.PatternEncodingTermMenu;
|
||||
import appeng.menu.slot.RestrictedInputSlot;
|
||||
import appeng.parts.encoding.EncodingMode;
|
||||
import com.extendedae_plus.client.PatternEncodingTermMenuMixinHelper;
|
||||
import com.extendedae_plus.config.ModConfig;
|
||||
import com.extendedae_plus.mixin.ae2.accessor.MEStorageMenuAccessor;
|
||||
import com.extendedae_plus.network.C2SPacketEncodeFinished;
|
||||
import net.minecraft.client.gui.screens.Screen;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.world.entity.player.Inventory;
|
||||
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;
|
||||
|
||||
@Mixin(PatternEncodingTermMenu.class)
|
||||
public abstract class PatternEncodingTermMenuMixin {
|
||||
public abstract class PatternEncodingTermMenuMixin implements PatternEncodingTermMenuMixinHelper {
|
||||
// 防止重复执行
|
||||
@Unique
|
||||
private boolean eap$blankAutoFilled = false;
|
||||
|
||||
@Shadow
|
||||
private RestrictedInputSlot blankPatternSlot;
|
||||
|
||||
@Shadow
|
||||
public EncodingMode mode;
|
||||
@Unique
|
||||
public boolean isShiftPressed = false;
|
||||
|
||||
@Unique
|
||||
public void eaep$setShiftPressed(boolean press) {
|
||||
isShiftPressed = press;
|
||||
}
|
||||
|
||||
@Unique
|
||||
private void eap$tryFill(IPatternTerminalMenuHost host, Inventory ip) {
|
||||
|
|
@ -114,14 +118,14 @@ public abstract class PatternEncodingTermMenuMixin {
|
|||
}
|
||||
// 仅在服务器端执行
|
||||
var self = (PatternEncodingTermMenu) (Object) this;
|
||||
var acc = (MEStorageMenuAccessor) (Object) ((MEStorageMenu) self);
|
||||
var acc = (MEStorageMenuAccessor) self;
|
||||
MEStorage storage = acc.getStorage();
|
||||
IEnergySource power = acc.getEnergySource();
|
||||
var player = self.getPlayerInventory().player;
|
||||
if (player.level().isClientSide()) {
|
||||
return;
|
||||
}
|
||||
boolean canInteract = storage != null && power != null && ((MEStorageMenu) self).getLinkStatus().connected();
|
||||
boolean canInteract = storage != null && power != null && self.getLinkStatus().connected();
|
||||
if (!canInteract) {
|
||||
return;
|
||||
}
|
||||
|
|
@ -161,7 +165,8 @@ public abstract class PatternEncodingTermMenuMixin {
|
|||
@Inject(method = "encode", at = @At("TAIL"))
|
||||
private void eaep$onEncode(CallbackInfo ci) {
|
||||
if (ModConfig.INDEPENDENT_UPLOADING_BUTTON.getAsBoolean()) return;
|
||||
if (!Screen.hasShiftDown()) return;
|
||||
if (!isShiftPressed) return;
|
||||
isShiftPressed = false;
|
||||
var self = (PatternEncodingTermMenu) (Object) this;
|
||||
PacketDistributor.sendToPlayer((ServerPlayer) self.getPlayer(), C2SPacketEncodeFinished.INSTANCE);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -36,5 +36,8 @@ public class ModNetwork {
|
|||
registrar.playToClient(C2SPacketEncodeFinished.TYPE,
|
||||
C2SPacketEncodeFinished.STREAM_CODEC,
|
||||
C2SPacketEncodeFinished::handle);
|
||||
registrar.playToServer(C2SPacketTargetKeyTriggered.TYPE,
|
||||
C2SPacketTargetKeyTriggered.STREAM_CODEC,
|
||||
C2SPacketTargetKeyTriggered::handle);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,6 +7,8 @@ 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.neoforged.api.distmarker.Dist;
|
||||
import net.neoforged.api.distmarker.OnlyIn;
|
||||
import net.neoforged.neoforge.network.handling.IPayloadContext;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
|
@ -58,11 +60,14 @@ public class ProvidersListS2CPacket implements CustomPacketPayload {
|
|||
}
|
||||
|
||||
public static void handle(final ProvidersListS2CPacket msg, final IPayloadContext ctx) {
|
||||
ctx.enqueueWork(() -> {
|
||||
var mc = Minecraft.getInstance();
|
||||
if (mc == null) return;
|
||||
var current = mc.screen;
|
||||
mc.setScreen(new ProviderSelectScreen(current, msg.ids, msg.names, msg.emptySlots));
|
||||
});
|
||||
ctx.enqueueWork(() -> handleClient(msg));
|
||||
}
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
private static void handleClient(ProvidersListS2CPacket msg) {
|
||||
var mc = Minecraft.getInstance();
|
||||
if (mc == null) return;
|
||||
var current = mc.screen;
|
||||
mc.setScreen(new ProviderSelectScreen(current, msg.ids, msg.names, msg.emptySlots));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@
|
|||
"ae2.AEProcessingPatternMixin",
|
||||
"ae2.CraftingCPUClusterMixin",
|
||||
"ae2.EncodedPatternItemMixin",
|
||||
"ae2.QuartzCuttingKnifeItemMixin",
|
||||
"ae2.accessor.MEStorageMenuAccessor",
|
||||
"ae2.accessor.PatternEncodingTermMenuAccessor",
|
||||
"ae2.accessor.PatternProviderLogicAccessor",
|
||||
|
|
@ -36,6 +35,7 @@
|
|||
"PickFromWirelessMixin",
|
||||
"accessor.AbstractContainerScreenAccessor",
|
||||
"accessor.ScreenAccessor",
|
||||
"ae2.QuartzCuttingKnifeItemMixin",
|
||||
"ae2.accessor.AEBaseScreenAccessor",
|
||||
"ae2.accessor.AEBaseScreenInvoker",
|
||||
"ae2.accessor.MEStorageScreenAccessor",
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user