mixin-jei包

This commit is contained in:
GaLicn 2025-09-06 16:17:17 +08:00
parent f51ca1b7f4
commit 06a5dafaaa
3 changed files with 19 additions and 35 deletions

View File

@ -1,6 +1,5 @@
package com.extendedae_plus.mixin;
import com.extendedae_plus.network.ModNetwork;
import com.extendedae_plus.network.PickFromWirelessC2SPacket;
import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer;
@ -10,13 +9,14 @@ import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.Vec3;
import net.neoforged.neoforge.network.PacketDistributor;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
// no client-side WCT gating; server will check presence (including Curios)
// no client-side WCT gating; server will check presence (including Curios)
@Mixin(Minecraft.class)
public class PickFromWirelessMixin {
@ -46,7 +46,7 @@ public class PickFromWirelessMixin {
}
if (!picked.isEmpty()) {
// 若主手已拿同一物品含标签则仍然走 AE 拉取逻辑进行补充/合并
if (!ItemStack.isSameItemSameTags(picked, this.player.getMainHandItem())) {
if (!ItemStack.isSameItemSameComponents(picked, this.player.getMainHandItem())) {
int slot = this.player.getInventory().findSlotMatchingItem(picked);
if (slot != -1) {
return; // 交给原版 pickBlock 处理
@ -63,7 +63,7 @@ public class PickFromWirelessMixin {
// 不在客户端检查是否持有无线合成终端由服务端权威校验 Curios 支持以避免整合包环境下的软依赖与槽位问题
// 背包没有发送到服务端处理 AE2 网络拉取并拦截原版
Vec3 loc = bhr.getLocation();
ModNetwork.CHANNEL.sendToServer(new PickFromWirelessC2SPacket(bhr.getBlockPos(), bhr.getDirection(), loc));
PacketDistributor.sendToServer(new PickFromWirelessC2SPacket(bhr.getBlockPos(), bhr.getDirection(), loc));
ci.cancel();
}
}

View File

@ -1,17 +1,16 @@
package com.extendedae_plus.mixin.jei;
import appeng.integration.modules.jei.transfer.EncodePatternTransferHandler;
import appeng.integration.modules.jeirei.EncodingHelper;
import appeng.integration.modules.itemlists.EncodingHelper;
import appeng.integration.modules.rei.transfer.EncodePatternTransferHandler;
import appeng.menu.me.items.PatternEncodingTermMenu;
import com.extendedae_plus.util.ExtendedAEPatternUploadUtil;
import mezz.jei.api.gui.ingredient.IRecipeSlotsView;
import mezz.jei.api.recipe.transfer.IRecipeTransferError;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.crafting.RecipeHolder;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import me.shedaniel.rei.api.common.display.Display;
/**
* 捕获通过 JEI 点击 + 填充到样板编码终端的处理配方并记录其工艺名称烧炼
@ -19,37 +18,22 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(value = EncodePatternTransferHandler.class, remap = false)
public abstract class EncodePatternTransferHandlerMixin {
@Inject(method = "transferRecipe", at = @At("HEAD"), require = 0)
@Inject(method = "transferRecipe", at = @At("HEAD"), require = 0, remap = false)
private void extendedae_plus$captureProcessingName(PatternEncodingTermMenu menu,
Object recipeBase,
IRecipeSlotsView slotsView,
Player player,
boolean maxTransfer,
RecipeHolder<?> holder,
Display display,
boolean doTransfer,
CallbackInfoReturnable<IRecipeTransferError> cir) {
CallbackInfoReturnable<me.shedaniel.rei.api.client.registry.transfer.TransferHandler.Result> cir) {
if (!doTransfer) return;
String name = null;
if (recipeBase instanceof Recipe<?> recipe) {
Recipe<?> recipe = holder != null ? holder.value() : null;
if (recipe != null) {
// 仅记录处理配方 3x3 合成
if (EncodingHelper.isSupportedCraftingRecipe(recipe)) return;
name = ExtendedAEPatternUploadUtil.mapRecipeTypeToSearchKey(recipe);
} else if (recipeBase != null &&
"com.gregtechceu.gtceu.api.recipe.GTRecipe".equals(recipeBase.getClass().getName())) {
// 反射路径GTCEu 专用 GTRecipeType 提取注册ID并映射为中文或path
name = ExtendedAEPatternUploadUtil.mapGTCEuRecipeToSearchKey(recipeBase);
} else if ("com.gregtechceu.gtceu.integration.jei.recipe.GTRecipeWrapper".equals(recipeBase.getClass().getName())) {
// 通过反射处理 GTCEu JEI 包装类避免硬依赖
try {
var field = recipeBase.getClass().getField("recipe"); // public final GTRecipe recipe;
Object inner = field.get(recipeBase);
// 反射路径将内部 GTRecipe Object 传入
name = ExtendedAEPatternUploadUtil.mapGTCEuRecipeToSearchKey(inner);
} catch (Throwable ignored) {
// 反射失败则继续走通用回退
}
} else {
// 非原版 Recipe<?> JEI 条目尝试从类名/包名推导关键词
name = ExtendedAEPatternUploadUtil.deriveSearchKeyFromUnknownRecipe(recipeBase);
// 非原版 Recipe<?> 的显示尝试从 display 类名/包名推导关键词
name = ExtendedAEPatternUploadUtil.deriveSearchKeyFromUnknownRecipe(display);
}
if (name != null && !name.isBlank()) {
ExtendedAEPatternUploadUtil.setLastProcessingName(name);

View File

@ -3,12 +3,12 @@ package com.extendedae_plus.mixin.jei;
import appeng.api.stacks.AEFluidKey;
import appeng.api.stacks.AEItemKey;
import appeng.api.stacks.AEKey;
import appeng.integration.modules.jeirei.EncodingHelper;
import appeng.integration.modules.itemlists.EncodingHelper;
import appeng.menu.me.common.GridInventoryEntry;
import appeng.menu.me.common.MEStorageMenu;
import com.extendedae_plus.integration.jei.JeiRuntimeProxy;
import mezz.jei.api.constants.VanillaTypes;
import mezz.jei.api.forge.ForgeTypes;
import mezz.jei.api.neoforge.NeoForgeTypes;
import mezz.jei.api.ingredients.ITypedIngredient;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
@ -30,7 +30,7 @@ public class EncodingHelperMixin {
List<? extends ITypedIngredient<?>> list = JeiRuntimeProxy.getBookmarkList();
for (ITypedIngredient<?> ingredient : list) {
ingredient.getIngredient(VanillaTypes.ITEM_STACK).ifPresent(itemStack -> result.put(AEItemKey.of(itemStack), index.getAndDecrement()));
ingredient.getIngredient(ForgeTypes.FLUID_STACK).ifPresent(fluidStack -> result.put(AEFluidKey.of(fluidStack), index.getAndDecrement()));
ingredient.getIngredient(NeoForgeTypes.FLUID_STACK).ifPresent(fluidStack -> result.put(AEFluidKey.of(fluidStack), index.getAndDecrement()));
}
cir.setReturnValue(result);
}