mixin-jei包
This commit is contained in:
parent
f51ca1b7f4
commit
06a5dafaaa
|
|
@ -1,6 +1,5 @@
|
||||||
package com.extendedae_plus.mixin;
|
package com.extendedae_plus.mixin;
|
||||||
|
|
||||||
import com.extendedae_plus.network.ModNetwork;
|
|
||||||
import com.extendedae_plus.network.PickFromWirelessC2SPacket;
|
import com.extendedae_plus.network.PickFromWirelessC2SPacket;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.player.LocalPlayer;
|
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.BlockHitResult;
|
||||||
import net.minecraft.world.phys.HitResult;
|
import net.minecraft.world.phys.HitResult;
|
||||||
import net.minecraft.world.phys.Vec3;
|
import net.minecraft.world.phys.Vec3;
|
||||||
|
import net.neoforged.neoforge.network.PacketDistributor;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
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;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
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)
|
@Mixin(Minecraft.class)
|
||||||
public class PickFromWirelessMixin {
|
public class PickFromWirelessMixin {
|
||||||
|
|
@ -46,7 +46,7 @@ public class PickFromWirelessMixin {
|
||||||
}
|
}
|
||||||
if (!picked.isEmpty()) {
|
if (!picked.isEmpty()) {
|
||||||
// 若主手已拿同一物品(含标签),则仍然走 AE 拉取逻辑进行补充/合并
|
// 若主手已拿同一物品(含标签),则仍然走 AE 拉取逻辑进行补充/合并
|
||||||
if (!ItemStack.isSameItemSameTags(picked, this.player.getMainHandItem())) {
|
if (!ItemStack.isSameItemSameComponents(picked, this.player.getMainHandItem())) {
|
||||||
int slot = this.player.getInventory().findSlotMatchingItem(picked);
|
int slot = this.player.getInventory().findSlotMatchingItem(picked);
|
||||||
if (slot != -1) {
|
if (slot != -1) {
|
||||||
return; // 交给原版 pickBlock 处理
|
return; // 交给原版 pickBlock 处理
|
||||||
|
|
@ -63,7 +63,7 @@ public class PickFromWirelessMixin {
|
||||||
// 不在客户端检查是否持有无线合成终端,由服务端权威校验(含 Curios 支持),以避免整合包环境下的软依赖与槽位问题
|
// 不在客户端检查是否持有无线合成终端,由服务端权威校验(含 Curios 支持),以避免整合包环境下的软依赖与槽位问题
|
||||||
// 背包没有:发送到服务端处理(从 AE2 网络拉取)并拦截原版
|
// 背包没有:发送到服务端处理(从 AE2 网络拉取)并拦截原版
|
||||||
Vec3 loc = bhr.getLocation();
|
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();
|
ci.cancel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,16 @@
|
||||||
package com.extendedae_plus.mixin.jei;
|
package com.extendedae_plus.mixin.jei;
|
||||||
|
|
||||||
import appeng.integration.modules.jei.transfer.EncodePatternTransferHandler;
|
import appeng.integration.modules.itemlists.EncodingHelper;
|
||||||
import appeng.integration.modules.jeirei.EncodingHelper;
|
import appeng.integration.modules.rei.transfer.EncodePatternTransferHandler;
|
||||||
import appeng.menu.me.items.PatternEncodingTermMenu;
|
import appeng.menu.me.items.PatternEncodingTermMenu;
|
||||||
import com.extendedae_plus.util.ExtendedAEPatternUploadUtil;
|
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.Recipe;
|
||||||
|
import net.minecraft.world.item.crafting.RecipeHolder;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
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;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
import me.shedaniel.rei.api.common.display.Display;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 捕获通过 JEI 点击 + 填充到样板编码终端的处理配方,并记录其工艺名称(如“烧炼”)。
|
* 捕获通过 JEI 点击 + 填充到样板编码终端的处理配方,并记录其工艺名称(如“烧炼”)。
|
||||||
|
|
@ -19,37 +18,22 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
@Mixin(value = EncodePatternTransferHandler.class, remap = false)
|
@Mixin(value = EncodePatternTransferHandler.class, remap = false)
|
||||||
public abstract class EncodePatternTransferHandlerMixin {
|
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,
|
private void extendedae_plus$captureProcessingName(PatternEncodingTermMenu menu,
|
||||||
Object recipeBase,
|
RecipeHolder<?> holder,
|
||||||
IRecipeSlotsView slotsView,
|
Display display,
|
||||||
Player player,
|
|
||||||
boolean maxTransfer,
|
|
||||||
boolean doTransfer,
|
boolean doTransfer,
|
||||||
CallbackInfoReturnable<IRecipeTransferError> cir) {
|
CallbackInfoReturnable<me.shedaniel.rei.api.client.registry.transfer.TransferHandler.Result> cir) {
|
||||||
if (!doTransfer) return;
|
if (!doTransfer) return;
|
||||||
String name = null;
|
String name = null;
|
||||||
if (recipeBase instanceof Recipe<?> recipe) {
|
Recipe<?> recipe = holder != null ? holder.value() : null;
|
||||||
|
if (recipe != null) {
|
||||||
// 仅记录处理配方(非 3x3 合成)
|
// 仅记录处理配方(非 3x3 合成)
|
||||||
if (EncodingHelper.isSupportedCraftingRecipe(recipe)) return;
|
if (EncodingHelper.isSupportedCraftingRecipe(recipe)) return;
|
||||||
name = ExtendedAEPatternUploadUtil.mapRecipeTypeToSearchKey(recipe);
|
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 {
|
} else {
|
||||||
// 非原版 Recipe<?> 的 JEI 条目,尝试从类名/包名推导关键词
|
// 非原版 Recipe<?> 的显示,尝试从 display 类名/包名推导关键词
|
||||||
name = ExtendedAEPatternUploadUtil.deriveSearchKeyFromUnknownRecipe(recipeBase);
|
name = ExtendedAEPatternUploadUtil.deriveSearchKeyFromUnknownRecipe(display);
|
||||||
}
|
}
|
||||||
if (name != null && !name.isBlank()) {
|
if (name != null && !name.isBlank()) {
|
||||||
ExtendedAEPatternUploadUtil.setLastProcessingName(name);
|
ExtendedAEPatternUploadUtil.setLastProcessingName(name);
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,12 @@ package com.extendedae_plus.mixin.jei;
|
||||||
import appeng.api.stacks.AEFluidKey;
|
import appeng.api.stacks.AEFluidKey;
|
||||||
import appeng.api.stacks.AEItemKey;
|
import appeng.api.stacks.AEItemKey;
|
||||||
import appeng.api.stacks.AEKey;
|
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.GridInventoryEntry;
|
||||||
import appeng.menu.me.common.MEStorageMenu;
|
import appeng.menu.me.common.MEStorageMenu;
|
||||||
import com.extendedae_plus.integration.jei.JeiRuntimeProxy;
|
import com.extendedae_plus.integration.jei.JeiRuntimeProxy;
|
||||||
import mezz.jei.api.constants.VanillaTypes;
|
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 mezz.jei.api.ingredients.ITypedIngredient;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
|
@ -30,7 +30,7 @@ public class EncodingHelperMixin {
|
||||||
List<? extends ITypedIngredient<?>> list = JeiRuntimeProxy.getBookmarkList();
|
List<? extends ITypedIngredient<?>> list = JeiRuntimeProxy.getBookmarkList();
|
||||||
for (ITypedIngredient<?> ingredient : list) {
|
for (ITypedIngredient<?> ingredient : list) {
|
||||||
ingredient.getIngredient(VanillaTypes.ITEM_STACK).ifPresent(itemStack -> result.put(AEItemKey.of(itemStack), index.getAndDecrement()));
|
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);
|
cir.setReturnValue(result);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user