[释放]修正研究节点未解锁时可以使用已有合成的漏洞;修复要素中继接口状态栏;删除源质发信器多余渲染。

This commit is contained in:
1820982382
2026-08-08 13:00:16 +08:00
parent 3573873518
commit 2d93c9d256
30 changed files with 415 additions and 22 deletions
@@ -0,0 +1,29 @@
package thaumicenergistics.mixins.ae2;
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.CallbackInfo;
import thaumicenergistics.client.ResearchGateOverlay;
/**
* 拦截 CraftConfirmScreen 打开 CPU 忙错误屏。
*
* 研究未解锁拦截会触发 AE2 的 CPU_BUSY 错误屏;本 Mixin 在错误屏被 switchToScreen 之前
* (updateBeforeRender HEAD)检测到研究拦截(ResearchGateOverlay 已有网络包写入的研究键),
* 取消原渲染逻辑,避免打开误导性的"CPU 忙"窗口。
* 提示文字由 ResearchGateOverlay 在无 GUI 遮挡时绘制。
*/
@Mixin(targets = "appeng.client.gui.me.crafting.CraftConfirmScreen", remap = false)
public abstract class MixinCraftConfirmScreen {
@Inject(method = "updateBeforeRender()V", at = @At("HEAD"), cancellable = true, remap = false)
private void thaumicenergistics$blockCpuBusyScreen(CallbackInfo ci) {
// 网络包已写入研究键 = 本次失败是研究拦截,而非真实 CPU 忙碌
// 使用 submitError 状态而非时间戳:只要错误未被玩家清除就持续拦截,避免过期后弹窗
if (ResearchGateOverlay.hasResearchGateError()) {
ci.cancel();
}
}
}
@@ -0,0 +1,73 @@
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.ThaumicEnergistics;
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)) {
ThaumicEnergistics.LOG.info(
"[AE2ResearchGate] 玩家 {} 未解锁研究 {},拒绝合成请求 (pattern={})",
player.getName().getString(), research, pattern.getDefinition());
// 通过自定义网络包发送研究键到客户端(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;
}
}
}
}