diff --git a/.gitignore b/.gitignore index c9ef071..78bd68c 100644 --- a/.gitignore +++ b/.gitignore @@ -4,15 +4,14 @@ run/ library/ .idea/ .vscode/ +.reasonix/ .superpowers/ .workbuddy/ +.trae/ .iml *.log task_plan.md findings.md progress.md -library/参考/ -library/log/ -library/*.md -library/*.txt -路径.md +/modules/thaumicenergistics-neo/存储体系方案.md +/modules/thaumicenergistics-neo/计划书-配方溯源.md diff --git a/gradle.properties b/gradle.properties index f5c9f37..72f65ac 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ # Project -mod_version=2.1.0 +mod_version=2.0.1 mod_group=thaumicenergistics # Mod @@ -16,3 +16,16 @@ ae2_version=19.2.17 jei_version=19.39.0.368 thaumcraft_version=0.2.2.34-port.1 jade_version=15.9.1+neoforge +org.gradle.jvmargs=-Xmx2G +org.gradle.daemon=true +org.gradle.parallel=true +org.gradle.caching=true +org.gradle.configuration-cache=true +minecraft_version_range=[1.21.1,1.22) +neoforge_version_range=[21,) +loader_version_range=[4,) +systemProp.http.proxyHost=127.0.0.1 +systemProp.http.proxyPort=7890 +systemProp.https.proxyHost=127.0.0.1 +systemProp.https.proxyPort=7890 +systemProp.http.nonProxyHosts=localhost|127.* diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e644113..a4b76b9 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1cbf2a8..e18bc25 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,8 +1,7 @@ -distributionBase=GRADLE_USER_HOME +distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.12-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists - diff --git a/settings.gradle b/settings.gradle index 2e16831..e116946 100644 --- a/settings.gradle +++ b/settings.gradle @@ -6,9 +6,4 @@ pluginManagement { } } -plugins { - id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' -} - -include("thaumicenergistics") -project(":thaumicenergistics").projectDir = file("modules/thaumicenergistics-neo") +rootProject.name = "thaumicenergistics-neo" diff --git a/src/main/java/thaumicenergistics/client/ResearchGateOverlay.java b/src/main/java/thaumicenergistics/client/ResearchGateOverlay.java new file mode 100644 index 0000000..40e71af --- /dev/null +++ b/src/main/java/thaumicenergistics/client/ResearchGateOverlay.java @@ -0,0 +1,94 @@ +package thaumicenergistics.client; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; + +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.client.event.ScreenEvent; + +import appeng.api.networking.crafting.ICraftingSubmitResult; +import appeng.client.gui.me.crafting.CraftConfirmScreen; +import appeng.client.gui.me.crafting.CraftErrorScreen; +import appeng.menu.me.crafting.CraftConfirmMenu; + +import thaumicenergistics.ThaumicEnergistics; + +/** + * 客户端:研究未解锁拦截的提示渲染。 + * + * 服务端拦截合成提交后,通过 ResearchGateErrorPacket 发送研究键; + * 本类在合成屏(确认屏/错误屏)之上绘制提示文字(最上层,不被 GUI 遮挡), + * 并暴露 hasResearchGateError() 供 MixinCraftConfirmScreen 判断是否拦截 CPU 忙错误屏。 + */ +@EventBusSubscriber(modid = ThaumicEnergistics.MODID, value = Dist.CLIENT) +public final class ResearchGateOverlay { + + private static String pendingResearch = null; + + private ResearchGateOverlay() {} + + /** 网络包处理:记录研究键(客户端线程)。 */ + public static void setPendingResearch(String research) { + pendingResearch = research; + } + + /** + * 当前菜单是否处于研究未解锁拦截状态。 + * 依据 CraftConfirmMenu.submitError 判断:错误结果存在且 errorCode 非空, + * 说明本次提交被拒绝(研究拦截触发 CPU_BUSY)。 + */ + public static boolean hasResearchGateError() { + return pendingResearch != null; + } + + /** 清空研究拦截状态(玩家离开合成屏或成功重试时由外部调用)。 */ + public static void clearPendingResearch() { + pendingResearch = null; + } + + @SubscribeEvent + public static void onScreenRenderPost(ScreenEvent.Render.Post event) { + // 玩家已离开合成屏(不是确认屏/错误屏)→ 清除拦截状态 + if (!(event.getScreen() instanceof CraftConfirmScreen) + && !(event.getScreen() instanceof CraftErrorScreen)) { + if (pendingResearch != null) { + clearPendingResearch(); + } + return; + } + // 无拦截状态不渲染 + if (pendingResearch == null) { + return; + } + + GuiGraphics gui = event.getGuiGraphics(); + Minecraft mc = Minecraft.getInstance(); + int width = mc.getWindow().getGuiScaledWidth(); + + // 纯色无样式,保证与 MC 默认 GUI 字体一致 + Component msg = Component.literal("当前研究节点未解锁:" + pendingResearch); + + int textWidth = mc.font.width(msg); + int x = (width - textWidth) / 2; + int y = 30; + + drawWithShadow(gui, mc, msg, x, y, 0xFF5555, 0x000000); + } + + /** 以指定颜色绘制文字并叠 8 向同偏移描边,保证在全屏 GUI 之上可读。 */ + private static void drawWithShadow(GuiGraphics gui, Minecraft mc, Component msg, int x, int y, + int textColor, int outlineColor) { + for (int dx = -1; dx <= 1; dx++) { + for (int dy = -1; dy <= 1; dy++) { + if (dx == 0 && dy == 0) { + continue; + } + gui.drawString(mc.font, msg, x + dx, y + dy, outlineColor); + } + } + gui.drawString(mc.font, msg, x, y, textColor); + } +} diff --git a/src/main/java/thaumicenergistics/common/container/ContainerDistillationPatternEncoder.java b/src/main/java/thaumicenergistics/common/container/ContainerDistillationPatternEncoder.java index d838089..d0c76ac 100644 --- a/src/main/java/thaumicenergistics/common/container/ContainerDistillationPatternEncoder.java +++ b/src/main/java/thaumicenergistics/common/container/ContainerDistillationPatternEncoder.java @@ -4,8 +4,10 @@ import appeng.api.crafting.PatternDetailsHelper; import appeng.api.stacks.AEItemKey; import appeng.api.stacks.GenericStack; import appeng.core.definitions.AEItems; +import net.minecraft.core.component.DataComponents; import net.minecraft.network.RegistryFriendlyByteBuf; import net.neoforged.neoforge.network.PacketDistributor; +import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; @@ -13,11 +15,13 @@ import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.ClickType; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.CustomData; import net.neoforged.neoforge.items.ItemStackHandler; import net.neoforged.neoforge.items.SlotItemHandler; import thaumcraft.api.ThaumcraftApiHelper; import thaumcraft.api.aspects.Aspect; import thaumcraft.api.aspects.AspectList; +import thaumcraft.common.research.TCResearchManager; import thaumcraft.common.research.ThaumometerScanManager; import thaumicenergistics.ThaumicEnergistics; import thaumicenergistics.common.integration.appeng.AEssentiaKey; @@ -31,6 +35,10 @@ import java.util.List; public class ContainerDistillationPatternEncoder extends AbstractContainerMenu { + /** 蒸馏编码统一要求的研究节点(要素蒸馏)。 */ + private static final String RESEARCH_DISTILESSENTIA = "DISTILESSENTIA"; + private static final String NBTKEY_RESEARCH = "research"; + private static final int PLAYER_INV_Y = 150; private static final int HOTBAR_Y = 208; private static final int PLAYER_INV_X = 8; @@ -249,6 +257,13 @@ public class ContainerDistillationPatternEncoder extends AbstractContainerMenu { public void onEncodePattern() { if (encoder == null) return; + + // 研究限制:必须解锁"要素蒸馏"才能配置物品→源质蒸馏样板 + if (!TCResearchManager.has(playerInv.player, RESEARCH_DISTILESSENTIA)) { + ThaumicEnergistics.LOG.info("[DistillationEncoder] 玩家未解锁研究 {},拒绝编码蒸馏样板", RESEARCH_DISTILESSENTIA); + return; + } + Aspect selected = getSelectedAspect(); ItemStack source = getSourceItem(); ItemStack blankSlot = encoder.inventory.getStackInSlot(TileDistillationPatternEncoder.SLOT_BLANK_PATTERNS); @@ -288,6 +303,11 @@ public class ContainerDistillationPatternEncoder extends AbstractContainerMenu { List.of(output) ); + // 在样板上标记研究键(供使用端按玩家校验) + CompoundTag researchTag = new CompoundTag(); + researchTag.putString(NBTKEY_RESEARCH, RESEARCH_DISTILESSENTIA); + encoded.set(DataComponents.CUSTOM_DATA, CustomData.of(researchTag)); + encoder.inventory.setStackInSlot(TileDistillationPatternEncoder.SLOT_ENCODED_PATTERN, encoded); } diff --git a/src/main/java/thaumicenergistics/common/container/ContainerKnowledgeInscriber.java b/src/main/java/thaumicenergistics/common/container/ContainerKnowledgeInscriber.java index b5ebc13..eb19d33 100644 --- a/src/main/java/thaumicenergistics/common/container/ContainerKnowledgeInscriber.java +++ b/src/main/java/thaumicenergistics/common/container/ContainerKnowledgeInscriber.java @@ -23,6 +23,7 @@ import thaumcraft.api.aspects.AspectList; import thaumcraft.api.crafting.IArcaneRecipe; import thaumcraft.api.crafting.ShapedArcaneRecipe; import thaumcraft.api.crafting.ShapelessArcaneRecipe; +import thaumcraft.common.research.TCResearchManager; import thaumicenergistics.common.container.slot.GhostSlot; import thaumicenergistics.common.integration.tc.ArcaneCraftingPattern; import thaumicenergistics.common.inventory.HandlerKnowledgeCore; @@ -220,6 +221,13 @@ public class ContainerKnowledgeInscriber extends AbstractContainerMenu { return CoreSaveState.Disabled_InvalidRecipe; } + // 研究限制:配方有研究要求且玩家未解锁 → 禁止保存 + String research = activeRecipe.getResearch(); + if (research != null && !research.isEmpty() + && !TCResearchManager.has(playerInv.player, research)) { + return CoreSaveState.Disabled_InvalidRecipe; + } + boolean isNew = !kCoreHandler.hasPatternFor(result); if (isNew) { return kCoreHandler.hasRoomToStorePattern() @@ -364,6 +372,14 @@ public class ContainerKnowledgeInscriber extends AbstractContainerMenu { private void savePattern() { if (activeRecipe == null) return; + // 研究限制:配方有研究要求时,操作者必须已解锁对应研究才能编码 + String research = activeRecipe.getResearch(); + if (research != null && !research.isEmpty() + && !TCResearchManager.has(playerInv.player, research)) { + ThaumicEnergistics.LOG.info("[KnowledgeInscriber] 玩家未解锁研究 {},拒绝保存奥术样板", research); + return; + } + ItemStack[] inputs = new ItemStack[CRAFTING_GRID_SIZE]; for (int i = 0; i < CRAFTING_GRID_SIZE; i++) { ItemStack stack = craftingInventory.getStackInSlot(i); @@ -376,7 +392,7 @@ public class ContainerKnowledgeInscriber extends AbstractContainerMenu { } ItemStack result = resultInventory.getStackInSlot(0).copy(); - ArcaneCraftingPattern pattern = new ArcaneCraftingPattern(aspects, result, inputs); + ArcaneCraftingPattern pattern = new ArcaneCraftingPattern(aspects, result, inputs, research); kCoreHandler.addPattern(pattern); updatePatternSlots(); sendSaveState(); diff --git a/src/main/java/thaumicenergistics/common/container/GuiEssentiaLevelEmitter.java b/src/main/java/thaumicenergistics/common/container/GuiEssentiaLevelEmitter.java index ab0a069..189ff96 100644 --- a/src/main/java/thaumicenergistics/common/container/GuiEssentiaLevelEmitter.java +++ b/src/main/java/thaumicenergistics/common/container/GuiEssentiaLevelEmitter.java @@ -72,10 +72,6 @@ public class GuiEssentiaLevelEmitter extends UpgradeableScreen TYPE = + new Type<>(ThaumicEnergistics.id("research_gate_error")); + + public static final StreamCodec STREAM_CODEC = StreamCodec.of( + (buf, pkt) -> buf.writeUtf(pkt.research), + buf -> new ResearchGateErrorPacket(buf.readUtf()) + ); + + @Override + public Type type() { + return TYPE; + } + + /** + * 客户端处理:记录最近一次研究未解锁拦截的研究键,供渲染层读取。 + */ + public void handleOnClient(IPayloadContext ctx) { + ctx.enqueueWork(() -> { + // 无论当前在什么界面,记录研究键 + ResearchGateOverlay.setPendingResearch(this.research); + }); + } +} diff --git a/src/main/java/thaumicenergistics/common/network/ThENetworking.java b/src/main/java/thaumicenergistics/common/network/ThENetworking.java index 7f5ba75..346a1ea 100644 --- a/src/main/java/thaumicenergistics/common/network/ThENetworking.java +++ b/src/main/java/thaumicenergistics/common/network/ThENetworking.java @@ -49,5 +49,12 @@ public final class ThENetworking { CellWorkbenchSyncPacket.STREAM_CODEC, (pkt, ctx) -> pkt.handleOnClient(ctx) ); + + // ResearchGateErrorPacket — S2C(服务端→客户端,研究未解锁拦截提示,携带研究键) + registrar.playToClient( + ResearchGateErrorPacket.TYPE, + ResearchGateErrorPacket.STREAM_CODEC, + (pkt, ctx) -> pkt.handleOnClient(ctx) + ); } } diff --git a/src/main/java/thaumicenergistics/common/parts/VisInterfacePart.java b/src/main/java/thaumicenergistics/common/parts/VisInterfacePart.java index c7740c8..fb3b0e2 100644 --- a/src/main/java/thaumicenergistics/common/parts/VisInterfacePart.java +++ b/src/main/java/thaumicenergistics/common/parts/VisInterfacePart.java @@ -164,13 +164,14 @@ public class VisInterfacePart extends P2PTunnelPart implements /** * 找到面对中继的隧道端:优先 P2P 输入端,其次任一输出端,最后自身。 + * 注意:内部使用 super.getOutputs() 而非 getOutputs(),避免覆写导致递归。 */ private VisInterfacePart findRelayEnd() { VisInterfacePart input = getInput(); if (input != null && input.getRelay() != null) { return input; } - for (VisInterfacePart output : getOutputs()) { + for (VisInterfacePart output : super.getOutputs()) { if (output.getRelay() != null) { return output; } @@ -181,6 +182,25 @@ public class VisInterfacePart extends P2PTunnelPart implements return null; } + /** + * 覆写输出端列表:半 P2P 场景下(装配器直接按频率查输入,无标准 P2P 输出端), + * 若存在有效的中继端(findRelayEnd 非空,含自身面对中继的情况), + * 将其视为已链接,使 AE2 P2P 状态显示(Jade/TOP)不再显示"Unlinked"。 + */ + @Override + public List getOutputs() { + List outputs = super.getOutputs(); + if (!outputs.isEmpty()) { + return outputs; + } + VisInterfacePart relayEnd = findRelayEnd(); + if (relayEnd != null) { + // 含自身面对中继的情况:返回 relayEnd(可能是 this),让 P2P 状态显示已链接 + return relayEnd == this ? List.of(this) : List.of(relayEnd); + } + return outputs; + } + private int drawFromRelay(VisRelayBlockEntity relay, ResourceLocation aspectId, int centivis) { if (relay == null) { return 0; diff --git a/src/main/java/thaumicenergistics/common/tiles/TileArcaneAssembler.java b/src/main/java/thaumicenergistics/common/tiles/TileArcaneAssembler.java index 18961f6..50334b7 100644 --- a/src/main/java/thaumicenergistics/common/tiles/TileArcaneAssembler.java +++ b/src/main/java/thaumicenergistics/common/tiles/TileArcaneAssembler.java @@ -483,7 +483,8 @@ public class TileArcaneAssembler extends ThETileBase } } - return new ArcaneAssemblerPattern(AEItemKey.of(result), null, aspects, result, inputs); + return new ArcaneAssemblerPattern(AEItemKey.of(result), null, aspects, result, inputs, + acp.getResearch()); } private boolean beginCrafting(ArcaneAssemblerPattern arcanePattern) { @@ -751,14 +752,22 @@ public class TileArcaneAssembler extends ThETileBase private final AspectList aspects; private final ItemStack resultStack; private final IInput[] inputs; + private final String research; public ArcaneAssemblerPattern(AEItemKey definition, IArcaneRecipe recipe, AspectList aspects, ItemStack resultStack, List inputStacks) { + this(definition, recipe, aspects, resultStack, inputStacks, null); + } + + public ArcaneAssemblerPattern(AEItemKey definition, IArcaneRecipe recipe, + AspectList aspects, ItemStack resultStack, + List inputStacks, String research) { this.definition = definition; this.recipe = recipe; this.aspects = aspects; this.resultStack = resultStack; + this.research = research; this.inputs = new IInput[inputStacks.size()]; for (int i = 0; i < inputStacks.size(); i++) { GenericStack stack = inputStacks.get(i); @@ -820,5 +829,8 @@ public class TileArcaneAssembler extends ThETileBase public IArcaneRecipe getRecipe() { return recipe; } public AspectList getAspects() { return aspects; } public ItemStack getResultStack() { return resultStack; } + /** 对应 TC 奥术配方的研究键;无研究要求/老数据时可能为 null。 */ + @Nullable + public String getResearch() { return research; } } } diff --git a/src/main/java/thaumicenergistics/mixins/ae2/MixinCraftConfirmScreen.java b/src/main/java/thaumicenergistics/mixins/ae2/MixinCraftConfirmScreen.java new file mode 100644 index 0000000..7325088 --- /dev/null +++ b/src/main/java/thaumicenergistics/mixins/ae2/MixinCraftConfirmScreen.java @@ -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(); + } + } +} diff --git a/src/main/java/thaumicenergistics/mixins/ae2/MixinCraftingService.java b/src/main/java/thaumicenergistics/mixins/ae2/MixinCraftingService.java new file mode 100644 index 0000000..0a6e867 --- /dev/null +++ b/src/main/java/thaumicenergistics/mixins/ae2/MixinCraftingService.java @@ -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 cir) { + // 仅玩家发起的请求需要研究校验;机器自动合成放行 + if (src == null || src.player().isEmpty()) { + return; + } + Player player = src.player().get(); + if (player == null) { + return; + } + + for (Map.Entry 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; + } + } + } +} diff --git a/src/main/resources/assets/thaumicenergistics/lang/en_us.json b/src/main/resources/assets/thaumicenergistics/lang/en_us.json index 85af40b..d82c70c 100644 --- a/src/main/resources/assets/thaumicenergistics/lang/en_us.json +++ b/src/main/resources/assets/thaumicenergistics/lang/en_us.json @@ -37,6 +37,9 @@ "tooltip.thaumicenergistics.essentia_storage_bus.desc": "Bidirectionally syncs an external essentia container with the ME network", "tooltip.thaumicenergistics.essentia_storage_bus.hint": "Place on a cable facing an essentia container to use it as network storage", "tooltip.thaumicenergistics.essentia_terminal.desc": "View and extract essentia from the ME network", + "tooltip.thaumicenergistics.arcane_crafting_terminal.desc": "Perform arcane crafting from the ME network", + "tooltip.thaumicenergistics.essentia_level_emitter.desc": "Emits redstone based on essentia levels in the network", + "tooltip.thaumicenergistics.vis_interface.desc": "Bridges the Thaumcraft vis network with the ME network for vis extraction/supply", "ae2.keytype.thaumicenergistics.essentia": "Essentia", "tc.research_category.THAUMICENERGISTICS": "Thaumic Energistics", "tc.research_name.BASEENERGISTICS": "Basic Energistics", diff --git a/src/main/resources/assets/thaumicenergistics/lang/zh_cn.json b/src/main/resources/assets/thaumicenergistics/lang/zh_cn.json index 24df856..9d8c779 100644 --- a/src/main/resources/assets/thaumicenergistics/lang/zh_cn.json +++ b/src/main/resources/assets/thaumicenergistics/lang/zh_cn.json @@ -38,6 +38,9 @@ "tooltip.thaumicenergistics.essentia_storage_bus.desc": "将相邻的源质容器与ME网络双向同步", "tooltip.thaumicenergistics.essentia_storage_bus.hint": "贴在线缆上,把外部源质容器当作ME存储单元使用", "tooltip.thaumicenergistics.essentia_terminal.desc": "查看并取出/存入源质", + "tooltip.thaumicenergistics.arcane_crafting_terminal.desc": "在ME网络上进行奥术合成", + "tooltip.thaumicenergistics.essentia_level_emitter.desc": "根据网络中源质数量输出红石信号", + "tooltip.thaumicenergistics.vis_interface.desc": "将TC要素网络与ME网络桥接,可抽取/供给要素", "ae2.keytype.thaumicenergistics.essentia": "源质", diff --git a/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/clay.png b/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/clay.png deleted file mode 100644 index 3e8f4b7..0000000 Binary files a/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/clay.png and /dev/null differ diff --git a/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/diamond.png b/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/diamond.png deleted file mode 100644 index 3f7cdf0..0000000 Binary files a/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/diamond.png and /dev/null differ diff --git a/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/flesh.png b/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/flesh.png deleted file mode 100644 index 7662a93..0000000 Binary files a/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/flesh.png and /dev/null differ diff --git a/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/gold.png b/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/gold.png deleted file mode 100644 index 6c98730..0000000 Binary files a/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/gold.png and /dev/null differ diff --git a/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/iron.png b/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/iron.png deleted file mode 100644 index 6c3747b..0000000 Binary files a/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/iron.png and /dev/null differ diff --git a/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/stone.png b/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/stone.png deleted file mode 100644 index ea52fce..0000000 Binary files a/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/stone.png and /dev/null differ diff --git a/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/straw.png b/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/straw.png deleted file mode 100644 index f2739c2..0000000 Binary files a/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/straw.png and /dev/null differ diff --git a/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/tallow.png b/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/tallow.png deleted file mode 100644 index 4d60e21..0000000 Binary files a/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/tallow.png and /dev/null differ diff --git a/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/thaum.png b/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/thaum.png deleted file mode 100644 index effad48..0000000 Binary files a/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/thaum.png and /dev/null differ diff --git a/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/wood.png b/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/wood.png deleted file mode 100644 index 33af719..0000000 Binary files a/src/main/resources/assets/thaumicenergistics/textures/model/golembackpack/wood.png and /dev/null differ diff --git a/src/main/resources/thaumicenergistics.mixins.json b/src/main/resources/thaumicenergistics.mixins.json index 543151e..5111ece 100644 --- a/src/main/resources/thaumicenergistics.mixins.json +++ b/src/main/resources/thaumicenergistics.mixins.json @@ -4,6 +4,7 @@ "compatibilityLevel": "JAVA_21", "refmap": "thaumicenergistics.refmap.json", "mixins": [ + "ae2.MixinCraftingService", "ae2.MixinCraftingTreeProcess", "ae2.MixinAbstractTerminalPart", "ae2.MixinConfigMenuInventory", @@ -11,6 +12,7 @@ "tc.MixinVisRelayBlock" ], "client": [ + "ae2.MixinCraftConfirmScreen", "tc.ResearchPageIndexMixin", "tc.MixinThaumonomiconScreen" ],