使远程打开UI支持mek的menu, 删除了自动上传非处理样板的逻辑
This commit is contained in:
parent
e80ed5a55c
commit
65389c4180
|
|
@ -2,7 +2,7 @@
|
||||||
_这个分支是粗浅的EMI适配,技术力不足,请见谅_
|
_这个分支是粗浅的EMI适配,技术力不足,请见谅_
|
||||||
|
|
||||||
### 相较于主分支(1.4.0)的改动
|
### 相较于主分支(1.4.0)的改动
|
||||||
- 删除了JEI的适配
|
- 暂无 _(大概?)_
|
||||||
|
|
||||||
### 增加/更改的QoL功能
|
### 增加/更改的QoL功能
|
||||||
- 在EMI配方/配方树界面快速拉起样板编写&上传
|
- 在EMI配方/配方树界面快速拉起样板编写&上传
|
||||||
|
|
|
||||||
|
|
@ -33,14 +33,6 @@ public class ExtendedAEPlus {
|
||||||
modEventBus.addListener(ModNetwork::registerPayloadHandlers);
|
modEventBus.addListener(ModNetwork::registerPayloadHandlers);
|
||||||
modEventBus.addListener(ModCapabilities::onRegisterCapabilities);
|
modEventBus.addListener(ModCapabilities::onRegisterCapabilities);
|
||||||
|
|
||||||
/*
|
|
||||||
TODO
|
|
||||||
将这literal地狱烧成灰(bushi
|
|
||||||
反正就是引入dataGeneration, 多写点translatable
|
|
||||||
顺便不小心露出我无敌的component工具类(
|
|
||||||
算了算了,我真不敢动aaa
|
|
||||||
*/
|
|
||||||
|
|
||||||
ModBlocks.BLOCKS.register(modEventBus);
|
ModBlocks.BLOCKS.register(modEventBus);
|
||||||
ModItems.ITEMS.register(modEventBus);
|
ModItems.ITEMS.register(modEventBus);
|
||||||
ModBlockEntities.BLOCK_ENTITY_TYPES.register(modEventBus);
|
ModBlockEntities.BLOCK_ENTITY_TYPES.register(modEventBus);
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,9 @@ public class NewIcon {
|
||||||
@SuppressWarnings("all")
|
@SuppressWarnings("all")
|
||||||
// 贴图当前存放于 assets/extendedae_plus/textures/gui/nicons.png
|
// 贴图当前存放于 assets/extendedae_plus/textures/gui/nicons.png
|
||||||
// 与 MODID (extendedaeplus) 不同,因此这里直接指定贴图所在命名空间
|
// 与 MODID (extendedaeplus) 不同,因此这里直接指定贴图所在命名空间
|
||||||
private static final ResourceLocation TEXTURE = ResourceLocation.fromNamespaceAndPath("extendedae_plus", "textures/gui/nicons.png");
|
// 真不同吗🧐
|
||||||
|
private static final ResourceLocation TEXTURE =
|
||||||
|
ResourceLocation.fromNamespaceAndPath(ExtendedAEPlus.MODID, "textures/gui/nicons.png");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ public class ModNetwork {
|
||||||
registrar.playToClient(SetPatternHighlightS2CPacket.TYPE, SetPatternHighlightS2CPacket.STREAM_CODEC, SetPatternHighlightS2CPacket::handle);
|
registrar.playToClient(SetPatternHighlightS2CPacket.TYPE, SetPatternHighlightS2CPacket.STREAM_CODEC, SetPatternHighlightS2CPacket::handle);
|
||||||
registrar.playToClient(AdvancedBlockingSyncS2CPacket.TYPE, AdvancedBlockingSyncS2CPacket.STREAM_CODEC, AdvancedBlockingSyncS2CPacket::handle);
|
registrar.playToClient(AdvancedBlockingSyncS2CPacket.TYPE, AdvancedBlockingSyncS2CPacket.STREAM_CODEC, AdvancedBlockingSyncS2CPacket::handle);
|
||||||
registrar.playToClient(ProvidersListS2CPacket.TYPE, ProvidersListS2CPacket.STREAM_CODEC, ProvidersListS2CPacket::handle);
|
registrar.playToClient(ProvidersListS2CPacket.TYPE, ProvidersListS2CPacket.STREAM_CODEC, ProvidersListS2CPacket::handle);
|
||||||
registrar.playToServer(RequestProvidersListC2SPacket.TYPE, RequestProvidersListC2SPacket.STREAM_CODEC, RequestProvidersListC2SPacket::handle);
|
registrar.playToServer(RequestUploadingC2SPacket.TYPE, RequestUploadingC2SPacket.STREAM_CODEC, RequestUploadingC2SPacket::handle);
|
||||||
registrar.playToClient(SetProviderPageS2CPacket.TYPE, SetProviderPageS2CPacket.STREAM_CODEC, SetProviderPageS2CPacket::handle);
|
registrar.playToClient(SetProviderPageS2CPacket.TYPE, SetProviderPageS2CPacket.STREAM_CODEC, SetProviderPageS2CPacket::handle);
|
||||||
registrar.playToServer(GlobalToggleProviderModesC2SPacket.TYPE, GlobalToggleProviderModesC2SPacket.STREAM_CODEC, GlobalToggleProviderModesC2SPacket::handle);
|
registrar.playToServer(GlobalToggleProviderModesC2SPacket.TYPE, GlobalToggleProviderModesC2SPacket.STREAM_CODEC, GlobalToggleProviderModesC2SPacket::handle);
|
||||||
registrar.playToServer(CraftingMonitorJumpC2SPacket.TYPE, CraftingMonitorJumpC2SPacket.STREAM_CODEC, CraftingMonitorJumpC2SPacket::handle);
|
registrar.playToServer(CraftingMonitorJumpC2SPacket.TYPE, CraftingMonitorJumpC2SPacket.STREAM_CODEC, CraftingMonitorJumpC2SPacket::handle);
|
||||||
|
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
package com.extendedae_plus.mixin;
|
|
||||||
|
|
||||||
import net.minecraft.world.inventory.AbstractContainerMenu;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
|
|
||||||
@Mixin(AbstractContainerMenu.class)
|
|
||||||
public abstract class MixinAbstractContainerMenu {
|
|
||||||
// @Inject(method = "stillValid(Lnet/minecraft/world/inventory/ContainerLevelAccess;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/block/Block;)Z",
|
|
||||||
// at = @At("HEAD"), cancellable = true)
|
|
||||||
// private static void eaep$cancelCheck(ContainerLevelAccess access, Player player, Block targetBlock, CallbackInfoReturnable<Boolean> cir) {
|
|
||||||
// cir.setReturnValue(access.evaluate(((level, pos) -> {
|
|
||||||
// for (Direction direction : Direction.values()) {
|
|
||||||
// if (level.getBlockState(pos.relative(direction)).getBlock()
|
|
||||||
// instanceof PatternProviderBlock)
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
// return level.getBlockState(pos).is(targetBlock) && player.canInteractWithBlock(pos, 4.0F);
|
|
||||||
// }), true));
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
@ -10,7 +10,7 @@ import com.extendedae_plus.config.ModConfig;
|
||||||
import com.extendedae_plus.mixin.accessor.AbstractContainerScreenAccessor;
|
import com.extendedae_plus.mixin.accessor.AbstractContainerScreenAccessor;
|
||||||
import com.extendedae_plus.mixin.accessor.ScreenAccessor;
|
import com.extendedae_plus.mixin.accessor.ScreenAccessor;
|
||||||
import com.extendedae_plus.mixin.ae2.accessor.AEBaseScreenAccessor;
|
import com.extendedae_plus.mixin.ae2.accessor.AEBaseScreenAccessor;
|
||||||
import com.extendedae_plus.network.RequestProvidersListC2SPacket;
|
import com.extendedae_plus.network.RequestUploadingC2SPacket;
|
||||||
import net.minecraft.client.gui.GuiGraphics;
|
import net.minecraft.client.gui.GuiGraphics;
|
||||||
import net.minecraft.client.gui.components.Tooltip;
|
import net.minecraft.client.gui.components.Tooltip;
|
||||||
import net.minecraft.client.renderer.Rect2i;
|
import net.minecraft.client.renderer.Rect2i;
|
||||||
|
|
@ -41,7 +41,7 @@ public abstract class PatternEncodingTermScreenMixin {
|
||||||
// 复用已存在的按钮实例,避免重复创建
|
// 复用已存在的按钮实例,避免重复创建
|
||||||
if (eap$uploadBtn == null) {
|
if (eap$uploadBtn == null) {
|
||||||
eap$uploadBtn = new IconButton(btn -> PacketDistributor
|
eap$uploadBtn = new IconButton(btn -> PacketDistributor
|
||||||
.sendToServer(RequestProvidersListC2SPacket.INSTANCE)) {
|
.sendToServer(RequestUploadingC2SPacket.INSTANCE)) {
|
||||||
private final float eap$scale = 0.75f; // 约 12x12
|
private final float eap$scale = 0.75f; // 约 12x12
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -1,20 +1,14 @@
|
||||||
package com.extendedae_plus.mixin.ae2.menu;
|
package com.extendedae_plus.mixin.ae2.menu;
|
||||||
|
|
||||||
import appeng.api.crafting.PatternDetailsHelper;
|
|
||||||
import appeng.menu.me.items.PatternEncodingTermMenu;
|
import appeng.menu.me.items.PatternEncodingTermMenu;
|
||||||
import appeng.menu.slot.RestrictedInputSlot;
|
|
||||||
import appeng.parts.encoding.EncodingMode;
|
|
||||||
import com.extendedae_plus.util.ExtendedAEPatternUploadUtil;
|
|
||||||
import com.glodblock.github.glodium.network.packet.sync.ActionMap;
|
import com.glodblock.github.glodium.network.packet.sync.ActionMap;
|
||||||
import com.glodblock.github.glodium.network.packet.sync.IActionHolder;
|
import com.glodblock.github.glodium.network.packet.sync.IActionHolder;
|
||||||
import net.minecraft.core.component.DataComponents;
|
import net.minecraft.core.component.DataComponents;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
|
||||||
import net.minecraft.world.entity.player.Player;
|
import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
import net.minecraft.world.item.component.CustomData;
|
import net.minecraft.world.item.component.CustomData;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
import org.spongepowered.asm.mixin.Unique;
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
|
@ -34,30 +28,6 @@ public abstract class ContainerPatternEncodingTermMenuMixin implements IActionHo
|
||||||
@Unique
|
@Unique
|
||||||
private Player epp$player;
|
private Player epp$player;
|
||||||
|
|
||||||
@Shadow(remap = false)
|
|
||||||
private RestrictedInputSlot encodedPatternSlot;
|
|
||||||
|
|
||||||
@Unique
|
|
||||||
private void eap$scheduleUploadWithRetry(ServerPlayer sp, PatternEncodingTermMenu menu, int attemptsLeft) {
|
|
||||||
sp.server.execute(() -> {
|
|
||||||
try {
|
|
||||||
if (attemptsLeft < 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var stack = this.encodedPatternSlot != null ? this.encodedPatternSlot.getItem() : net.minecraft.world.item.ItemStack.EMPTY;
|
|
||||||
if (stack != null && !stack.isEmpty() && PatternDetailsHelper.isEncodedPattern(stack)) {
|
|
||||||
ExtendedAEPatternUploadUtil.uploadFromEncodingMenuToMatrix(sp, menu);
|
|
||||||
} else {
|
|
||||||
// 槽位可能尚未同步到位,继续下一 tick 重试
|
|
||||||
if (attemptsLeft > 0) {
|
|
||||||
eap$scheduleUploadWithRetry(sp, menu, attemptsLeft - 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Throwable ignored) {
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// AE2 终端主构造:PatternEncodingTermMenu(int id, Inventory ip, IPatternTerminalMenuHost host)
|
// AE2 终端主构造:PatternEncodingTermMenu(int id, Inventory ip, IPatternTerminalMenuHost host)
|
||||||
@Inject(method = "<init>(ILnet/minecraft/world/entity/player/Inventory;Lappeng/helpers/IPatternTerminalMenuHost;)V", at = @At("TAIL"), remap = false)
|
@Inject(method = "<init>(ILnet/minecraft/world/entity/player/Inventory;Lappeng/helpers/IPatternTerminalMenuHost;)V", at = @At("TAIL"), remap = false)
|
||||||
private void eap$ctorA(int id, net.minecraft.world.entity.player.Inventory ip, appeng.helpers.IPatternTerminalMenuHost host, CallbackInfo ci) {
|
private void eap$ctorA(int id, net.minecraft.world.entity.player.Inventory ip, appeng.helpers.IPatternTerminalMenuHost host, CallbackInfo ci) {
|
||||||
|
|
@ -78,40 +48,6 @@ public abstract class ContainerPatternEncodingTermMenuMixin implements IActionHo
|
||||||
return this.eap$actions;
|
return this.eap$actions;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 服务器端:在 encode() 执行完毕后,如果已编码槽位存在样板且当前为“合成模式”,则上传到装配矩阵
|
|
||||||
@Inject(method = "encode", at = @At("TAIL"), remap = false)
|
|
||||||
private void eap$serverUploadAfterEncode(CallbackInfo ci) {
|
|
||||||
try {
|
|
||||||
if (!(this.epp$player instanceof ServerPlayer sp)) {
|
|
||||||
return; // 仅服务器执行
|
|
||||||
}
|
|
||||||
var menu = (PatternEncodingTermMenu) (Object) this;
|
|
||||||
if (menu.getMode() != EncodingMode.CRAFTING
|
|
||||||
&& menu.getMode() != EncodingMode.SMITHING_TABLE
|
|
||||||
&& menu.getMode() != EncodingMode.STONECUTTING) {
|
|
||||||
return; // 只处理合成/锻造台/切石机样板
|
|
||||||
}
|
|
||||||
if (this.encodedPatternSlot == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var stack = this.encodedPatternSlot.getItem();
|
|
||||||
if (stack == null || stack.isEmpty()) {
|
|
||||||
return; // 没有编码样板
|
|
||||||
}
|
|
||||||
if (!PatternDetailsHelper.isEncodedPattern(stack)) {
|
|
||||||
return; // 不是编码样板
|
|
||||||
}
|
|
||||||
// 为避免与 AE2 后续同步竞争,切到下一 tick 执行
|
|
||||||
sp.server.execute(() -> {
|
|
||||||
try {
|
|
||||||
ExtendedAEPatternUploadUtil.uploadFromEncodingMenuToMatrix(sp, menu);
|
|
||||||
} catch (Throwable ignored) {
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} catch (Throwable ignored) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 服务器端:在构造样板返回前插入编码玩家的名称
|
// 服务器端:在构造样板返回前插入编码玩家的名称
|
||||||
@Inject(method = "encodePattern", at = @At("TAIL"), remap = false, cancellable = true)
|
@Inject(method = "encodePattern", at = @At("TAIL"), remap = false, cancellable = true)
|
||||||
private void eap$writeEncodePlayerToPattern(CallbackInfoReturnable<ItemStack> cir) {
|
private void eap$writeEncodePlayerToPattern(CallbackInfoReturnable<ItemStack> cir) {
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@ public abstract class MEStorageMenuMixin {
|
||||||
placeholder = serverValue;
|
placeholder = serverValue;
|
||||||
}
|
}
|
||||||
// 使用辅助方法,统一进行受检的泛型转换后再注册
|
// 使用辅助方法,统一进行受检的泛型转换后再注册
|
||||||
eap$registerSettingCompat(client, setting, placeholder);
|
eap$registerSettingCompact(client, setting, placeholder);
|
||||||
} catch (Throwable ignore) {
|
} catch (Throwable ignore) {
|
||||||
// 防御:不让异常影响主流程
|
// 防御:不让异常影响主流程
|
||||||
}
|
}
|
||||||
|
|
@ -88,7 +88,7 @@ public abstract class MEStorageMenuMixin {
|
||||||
|
|
||||||
@Unique
|
@Unique
|
||||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||||
private static <T extends Enum<T>> void eap$registerSettingCompat(
|
private static <T extends Enum<T>> void eap$registerSettingCompact(
|
||||||
IConfigManager client, Setting<?> setting, Object value) {
|
IConfigManager client, Setting<?> setting, Object value) {
|
||||||
// 前置校验:仅处理枚举类型的设置值
|
// 前置校验:仅处理枚举类型的设置值
|
||||||
if (!(value instanceof Enum<?>)) {
|
if (!(value instanceof Enum<?>)) {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package com.extendedae_plus.mixin.ae2.menu;
|
package com.extendedae_plus.mixin.ae2.menu;
|
||||||
|
|
||||||
|
import appeng.api.crafting.PatternDetailsHelper;
|
||||||
import appeng.api.inventories.InternalInventory;
|
import appeng.api.inventories.InternalInventory;
|
||||||
import appeng.api.networking.energy.IEnergySource;
|
import appeng.api.networking.energy.IEnergySource;
|
||||||
import appeng.api.stacks.AEItemKey;
|
import appeng.api.stacks.AEItemKey;
|
||||||
|
|
@ -10,13 +11,16 @@ import appeng.core.definitions.AEItems;
|
||||||
import appeng.helpers.IPatternTerminalMenuHost;
|
import appeng.helpers.IPatternTerminalMenuHost;
|
||||||
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 com.extendedae_plus.client.PatternEncodingTermMenuMixinHelper;
|
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 com.extendedae_plus.util.ExtendedAEPatternUploadUtil;
|
||||||
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;
|
||||||
|
import net.minecraft.world.item.ItemStack;
|
||||||
import net.neoforged.neoforge.network.PacketDistributor;
|
import net.neoforged.neoforge.network.PacketDistributor;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
|
@ -26,6 +30,8 @@ import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
@Mixin(PatternEncodingTermMenu.class)
|
@Mixin(PatternEncodingTermMenu.class)
|
||||||
public abstract class PatternEncodingTermMenuMixin implements PatternEncodingTermMenuMixinHelper {
|
public abstract class PatternEncodingTermMenuMixin implements PatternEncodingTermMenuMixinHelper {
|
||||||
// 防止重复执行
|
// 防止重复执行
|
||||||
|
|
@ -33,6 +39,9 @@ public abstract class PatternEncodingTermMenuMixin implements PatternEncodingTer
|
||||||
private boolean eap$blankAutoFilled = false;
|
private boolean eap$blankAutoFilled = false;
|
||||||
@Shadow @Final
|
@Shadow @Final
|
||||||
private RestrictedInputSlot blankPatternSlot;
|
private RestrictedInputSlot blankPatternSlot;
|
||||||
|
@Shadow
|
||||||
|
@Final
|
||||||
|
private RestrictedInputSlot encodedPatternSlot;
|
||||||
@Unique
|
@Unique
|
||||||
public boolean eaep$isCtrlPressed = false;
|
public boolean eaep$isCtrlPressed = false;
|
||||||
|
|
||||||
|
|
@ -163,9 +172,18 @@ public abstract class PatternEncodingTermMenuMixin implements PatternEncodingTer
|
||||||
@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;
|
||||||
|
var self = (PatternEncodingTermMenu) (Object) this;
|
||||||
|
if (self.isClientSide()) return;
|
||||||
if (!eaep$isCtrlPressed) return;
|
if (!eaep$isCtrlPressed) return;
|
||||||
eaep$isCtrlPressed = false;
|
eaep$isCtrlPressed = false;
|
||||||
var self = (PatternEncodingTermMenu) (Object) this;
|
ItemStack pattern = this.encodedPatternSlot.getItem();
|
||||||
|
if (pattern == null || !PatternDetailsHelper.isEncodedPattern(pattern)) return;
|
||||||
|
Objects.requireNonNull(self.getPlayer().getServer()).execute(() -> {
|
||||||
|
try {
|
||||||
|
if (self.getMode() == EncodingMode.PROCESSING)
|
||||||
PacketDistributor.sendToPlayer((ServerPlayer) self.getPlayer(), C2SPacketEncodeFinished.INSTANCE);
|
PacketDistributor.sendToPlayer((ServerPlayer) self.getPlayer(), C2SPacketEncodeFinished.INSTANCE);
|
||||||
|
else ExtendedAEPatternUploadUtil.uploadFromEncodingMenuToMatrix((ServerPlayer) self.getPlayer(), self);
|
||||||
|
} catch (Throwable ignored) {}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ import appeng.integration.modules.emi.EmiStackHelper;
|
||||||
import appeng.menu.me.items.PatternEncodingTermMenu;
|
import appeng.menu.me.items.PatternEncodingTermMenu;
|
||||||
import com.extendedae_plus.integration.RecipeViewer.emi.HandlerBoMRecipes;
|
import com.extendedae_plus.integration.RecipeViewer.emi.HandlerBoMRecipes;
|
||||||
import com.extendedae_plus.integration.RecipeViewer.emi.PatternFillingHelper;
|
import com.extendedae_plus.integration.RecipeViewer.emi.PatternFillingHelper;
|
||||||
import com.extendedae_plus.network.RequestProvidersListC2SPacket;
|
import com.extendedae_plus.network.RequestUploadingC2SPacket;
|
||||||
import com.extendedae_plus.util.ExtendedAEPatternUploadUtil;
|
import com.extendedae_plus.util.ExtendedAEPatternUploadUtil;
|
||||||
import dev.emi.emi.api.stack.EmiStack;
|
import dev.emi.emi.api.stack.EmiStack;
|
||||||
import dev.emi.emi.bom.BoM;
|
import dev.emi.emi.bom.BoM;
|
||||||
|
|
@ -87,7 +87,7 @@ public abstract class MixinBoMScreen {
|
||||||
ExtendedAEPatternUploadUtil.addLastProcessingNameList(
|
ExtendedAEPatternUploadUtil.addLastProcessingNameList(
|
||||||
node.recipe.getId().toString().split("/")[0]);
|
node.recipe.getId().toString().split("/")[0]);
|
||||||
|
|
||||||
PacketDistributor.sendToServer(RequestProvidersListC2SPacket.INSTANCE);
|
PacketDistributor.sendToServer(RequestUploadingC2SPacket.INSTANCE);
|
||||||
}
|
}
|
||||||
Minecraft.getInstance().player.playSound(SoundEvents.UI_BUTTON_CLICK.value());
|
Minecraft.getInstance().player.playSound(SoundEvents.UI_BUTTON_CLICK.value());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,6 @@ public record C2SPacketEncodeFinished() implements CustomPacketPayload {
|
||||||
public static final StreamCodec<RegistryFriendlyByteBuf, C2SPacketEncodeFinished> STREAM_CODEC = StreamCodec.unit(INSTANCE);
|
public static final StreamCodec<RegistryFriendlyByteBuf, C2SPacketEncodeFinished> STREAM_CODEC = StreamCodec.unit(INSTANCE);
|
||||||
|
|
||||||
public static void handle(final C2SPacketEncodeFinished packet, final IPayloadContext context) {
|
public static void handle(final C2SPacketEncodeFinished packet, final IPayloadContext context) {
|
||||||
if (context.player().level().isClientSide) PacketDistributor.sendToServer(RequestProvidersListC2SPacket.INSTANCE);
|
if (context.player().level().isClientSide) PacketDistributor.sendToServer(RequestUploadingC2SPacket.INSTANCE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,8 @@ import net.minecraft.world.phys.BlockHitResult;
|
||||||
import net.minecraft.world.phys.Vec3;
|
import net.minecraft.world.phys.Vec3;
|
||||||
import net.neoforged.neoforge.network.handling.IPayloadContext;
|
import net.neoforged.neoforge.network.handling.IPayloadContext;
|
||||||
|
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
@ -87,6 +89,7 @@ public record CraftingMonitorJumpC2SPacket(AEKey what) implements CustomPacketPa
|
||||||
List<Direction> delayedBlocks = new ArrayList<>();
|
List<Direction> delayedBlocks = new ArrayList<>();
|
||||||
|
|
||||||
// 尝试对邻居打开 GUI(优先通过 MenuProvider)
|
// 尝试对邻居打开 GUI(优先通过 MenuProvider)
|
||||||
|
// 这功能真是太™有效了, 是个大点的mod就不用menuProvider😅
|
||||||
for (Direction dir : host.getTargets()) {
|
for (Direction dir : host.getTargets()) {
|
||||||
BlockPos targetPos = pbe.getBlockPos().relative(dir);
|
BlockPos targetPos = pbe.getBlockPos().relative(dir);
|
||||||
|
|
||||||
|
|
@ -104,7 +107,7 @@ public record CraftingMonitorJumpC2SPacket(AEKey what) implements CustomPacketPa
|
||||||
}
|
}
|
||||||
|
|
||||||
// awc这AE怎么这么坏啊😭😭😭
|
// awc这AE怎么这么坏啊😭😭😭
|
||||||
if (!(tbe instanceof AEBaseBlockEntity)) continue;
|
if (tbe instanceof AEBaseBlockEntity) {
|
||||||
switch (tbe) {
|
switch (tbe) {
|
||||||
case InterfaceBlockEntity ignored -> delayedBlocks.addFirst(dir);
|
case InterfaceBlockEntity ignored -> delayedBlocks.addFirst(dir);
|
||||||
case PatternProviderBlockEntity ignored -> delayedBlocks.addLast(dir);
|
case PatternProviderBlockEntity ignored -> delayedBlocks.addLast(dir);
|
||||||
|
|
@ -114,6 +117,17 @@ public record CraftingMonitorJumpC2SPacket(AEKey what) implements CustomPacketPa
|
||||||
new BlockHitResult(player.position(), dir.getOpposite(), targetPos, false));
|
new BlockHitResult(player.position(), dir.getOpposite(), targetPos, false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tbe == null) continue;
|
||||||
|
String blockEntityClassName = tbe.getClass().getName().toLowerCase();
|
||||||
|
if (blockEntityClassName.contains("mekanism") && blockEntityClassName.contains("tile")) {
|
||||||
|
try {
|
||||||
|
Method methodOpenGui = tbe.getClass().getMethod("openGui", Player.class);
|
||||||
|
methodOpenGui.invoke(tbe, player);
|
||||||
|
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ignored) {}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (delayedBlocks.isEmpty()) return;
|
if (delayedBlocks.isEmpty()) return;
|
||||||
BlockPos pos = pbe.getBlockPos().relative(delayedBlocks.getFirst());
|
BlockPos pos = pbe.getBlockPos().relative(delayedBlocks.getFirst());
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ package com.extendedae_plus.network;
|
||||||
import appeng.helpers.patternprovider.PatternContainer;
|
import appeng.helpers.patternprovider.PatternContainer;
|
||||||
import appeng.menu.implementations.PatternAccessTermMenu;
|
import appeng.menu.implementations.PatternAccessTermMenu;
|
||||||
import appeng.menu.me.items.PatternEncodingTermMenu;
|
import appeng.menu.me.items.PatternEncodingTermMenu;
|
||||||
|
import appeng.parts.encoding.EncodingMode;
|
||||||
import com.extendedae_plus.ExtendedAEPlus;
|
import com.extendedae_plus.ExtendedAEPlus;
|
||||||
import com.extendedae_plus.util.ExtendedAEPatternUploadUtil;
|
import com.extendedae_plus.util.ExtendedAEPatternUploadUtil;
|
||||||
import net.minecraft.network.FriendlyByteBuf;
|
import net.minecraft.network.FriendlyByteBuf;
|
||||||
|
|
@ -18,27 +19,34 @@ import java.util.List;
|
||||||
/**
|
/**
|
||||||
* C2S: 请求当前终端可见的样板供应器列表(用于弹窗选择)。
|
* C2S: 请求当前终端可见的样板供应器列表(用于弹窗选择)。
|
||||||
*/
|
*/
|
||||||
public class RequestProvidersListC2SPacket implements CustomPacketPayload {
|
public class RequestUploadingC2SPacket implements CustomPacketPayload {
|
||||||
public static final Type<RequestProvidersListC2SPacket> TYPE = new Type<>(
|
public static final Type<RequestUploadingC2SPacket> TYPE = new Type<>(
|
||||||
ResourceLocation.fromNamespaceAndPath(ExtendedAEPlus.MODID, "request_providers_list"));
|
ResourceLocation.fromNamespaceAndPath(ExtendedAEPlus.MODID, "request_uploading"));
|
||||||
|
|
||||||
public static final RequestProvidersListC2SPacket INSTANCE = new RequestProvidersListC2SPacket();
|
public static final RequestUploadingC2SPacket INSTANCE = new RequestUploadingC2SPacket();
|
||||||
|
|
||||||
public static final StreamCodec<FriendlyByteBuf, RequestProvidersListC2SPacket> STREAM_CODEC =
|
public static final StreamCodec<FriendlyByteBuf, RequestUploadingC2SPacket> STREAM_CODEC =
|
||||||
StreamCodec.unit(INSTANCE);
|
StreamCodec.unit(INSTANCE);
|
||||||
|
|
||||||
public RequestProvidersListC2SPacket() {}
|
public RequestUploadingC2SPacket() {}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Type<? extends CustomPacketPayload> type() {
|
public Type<? extends CustomPacketPayload> type() {
|
||||||
return TYPE;
|
return TYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void handle(final RequestProvidersListC2SPacket msg, final IPayloadContext ctx) {
|
public static void handle(final RequestUploadingC2SPacket msg, final IPayloadContext ctx) {
|
||||||
ctx.enqueueWork(() -> {
|
ctx.enqueueWork(() -> {
|
||||||
if (!(ctx.player() instanceof ServerPlayer player)) return;
|
if (!(ctx.player() instanceof ServerPlayer player)) return;
|
||||||
if (!(player.containerMenu instanceof PatternEncodingTermMenu encMenu)) return;
|
if (!(player.containerMenu instanceof PatternEncodingTermMenu encMenu)) return;
|
||||||
|
|
||||||
|
if (encMenu.getMode() != EncodingMode.PROCESSING) {
|
||||||
|
try {
|
||||||
|
ExtendedAEPatternUploadUtil.uploadFromEncodingMenuToMatrix(player, encMenu);
|
||||||
|
} catch (Throwable ignored) {}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// 优先:若玩家也打开了样板访问终端,则用 byId 方式(精确服务器ID)
|
// 优先:若玩家也打开了样板访问终端,则用 byId 方式(精确服务器ID)
|
||||||
PatternAccessTermMenu accessMenu = ExtendedAEPatternUploadUtil.getPatternAccessMenu(player);
|
PatternAccessTermMenu accessMenu = ExtendedAEPatternUploadUtil.getPatternAccessMenu(player);
|
||||||
if (accessMenu != null) {
|
if (accessMenu != null) {
|
||||||
|
|
@ -767,10 +767,7 @@ public class ExtendedAEPatternUploadUtil {
|
||||||
try {
|
try {
|
||||||
// 通过反射访问byId字段(ExtendedAE继承了这个字段)
|
// 通过反射访问byId字段(ExtendedAE继承了这个字段)
|
||||||
Field byIdField = findByIdField(menu.getClass());
|
Field byIdField = findByIdField(menu.getClass());
|
||||||
if (byIdField == null) {
|
if (byIdField == null) return null;
|
||||||
System.err.println("ExtendedAE Plus: 无法找到byId字段");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
byIdField.setAccessible(true);
|
byIdField.setAccessible(true);
|
||||||
|
|
||||||
|
|
@ -784,16 +781,12 @@ public class ExtendedAEPatternUploadUtil {
|
||||||
|
|
||||||
// 从ContainerTracker中获取PatternContainer
|
// 从ContainerTracker中获取PatternContainer
|
||||||
Field containerField = findContainerField(containerTracker.getClass());
|
Field containerField = findContainerField(containerTracker.getClass());
|
||||||
if (containerField == null) {
|
if (containerField == null) return null;
|
||||||
System.err.println("ExtendedAE Plus: 无法找到container字段");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
containerField.setAccessible(true);
|
containerField.setAccessible(true);
|
||||||
return (PatternContainer) containerField.get(containerTracker);
|
return (PatternContainer) containerField.get(containerTracker);
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
System.err.println("ExtendedAE Plus: 无法获取PatternContainer,错误: " + e.getMessage());
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@
|
||||||
"package": "com.extendedae_plus.mixin",
|
"package": "com.extendedae_plus.mixin",
|
||||||
"compatibilityLevel": "JAVA_21",
|
"compatibilityLevel": "JAVA_21",
|
||||||
"mixins": [
|
"mixins": [
|
||||||
"MixinAbstractContainerMenu",
|
|
||||||
"MixinPlayer",
|
"MixinPlayer",
|
||||||
"ae2.AEProcessingPatternMixin",
|
"ae2.AEProcessingPatternMixin",
|
||||||
"ae2.CraftingCPUClusterMixin",
|
"ae2.CraftingCPUClusterMixin",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user