Files
thaumicenergistics-neo/src/main/java/thaumicenergistics/mixins/ae2/MixinCraftingService.java
T
2026-08-28 00:41:54 +08:00

70 lines
3.0 KiB
Java

package thaumicenergistics.mixins.ae2;
import java.util.Map;
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 appeng.api.crafting.IPatternDetails;
import appeng.api.networking.crafting.CraftingSubmitErrorCode;
import appeng.api.networking.crafting.ICraftingCPU;
import appeng.api.networking.crafting.ICraftingPlan;
import appeng.api.networking.crafting.ICraftingRequester;
import appeng.api.networking.crafting.ICraftingSubmitResult;
import appeng.api.networking.security.IActionSource;
import appeng.crafting.execution.CraftingSubmitResult;
import net.minecraft.world.entity.player.Player;
import thaumcraft.common.research.TCResearchManager;
import thaumicenergistics.common.integration.tc.PatternResearchHelper;
/**
* 使用端研究限制:玩家从 AE 终端发起合成请求时(submitJob),
* 若请求涉及尚未解锁对应 TC 研究的样板(奥术/蒸馏),则拒绝该请求。
*
* 机器自动合成(IActionSource 无玩家)不拦截。
*/
@Mixin(targets = "appeng.me.service.CraftingService", remap = false)
public abstract class MixinCraftingService {
@Inject(method = "submitJob", at = @At("HEAD"), cancellable = true, remap = false)
private void thaumicenergistics$checkResearchBeforeSubmit(
ICraftingPlan job,
ICraftingRequester requestingMachine,
ICraftingCPU target,
boolean prioritizePower,
IActionSource src,
CallbackInfoReturnable<ICraftingSubmitResult> cir) {
// 仅玩家发起的请求需要研究校验;机器自动合成放行
if (src == null || src.player().isEmpty()) {
return;
}
Player player = src.player().get();
if (player == null) {
return;
}
for (Map.Entry<IPatternDetails, Long> entry : job.patternTimes().entrySet()) {
IPatternDetails pattern = entry.getKey();
String research = PatternResearchHelper.getResearch(pattern);
if (research == null || research.isEmpty()) {
continue; // 无研究要求
}
if (!TCResearchManager.has(player, research)) {
// 通过自定义网络包发送研究键到客户端(AE2 errorDetail 不跨网络传输)
if (player instanceof net.minecraft.server.level.ServerPlayer serverPlayer) {
net.neoforged.neoforge.network.PacketDistributor.sendToPlayer(
serverPlayer,
new thaumicenergistics.common.network.ResearchGateErrorPacket(research));
}
// 拒绝提交(CPU_BUSY 触发 AE2 错误屏;具体提示由客户端网络包渲染)
cir.setReturnValue(CraftingSubmitResult.simpleError(CraftingSubmitErrorCode.CPU_BUSY));
return;
}
}
}
}