适配146eae

This commit is contained in:
GaLi 2025-12-02 11:09:16 +08:00
parent c1ecd1b320
commit ceac245fdb
5 changed files with 119 additions and 48 deletions

View File

@ -81,14 +81,13 @@ dependencies {
//exendedae前置 //exendedae前置
modImplementation "curse.maven:glodium-957920:${glodium_version}" modImplementation "curse.maven:glodium-957920:${glodium_version}"
//extendedAE //extendedAE
modImplementation files('libs/ExtendedAE-1.20-1.4.2-forge.jar') implementation "curse.maven:ex-pattern-provider-892005:7005572"
modRuntimeOnly fileTree(dir: 'libs', includes: ['*.jar'])
//ae2 //ae2
modImplementation "appeng:appliedenergistics2-forge:${ae2_version}" modImplementation "appeng:appliedenergistics2-forge:${ae2_version}"
modImplementation "org.appliedenergistics:guideme:${guideme_version}" modImplementation "org.appliedenergistics:guideme:${guideme_version}"
modImplementation "curse.maven:applied-energistics-2-wireless-terminals-459929:${wireless_terminals_version}" modImplementation "curse.maven:applied-energistics-2-wireless-terminals-459929:${wireless_terminals_version}"
modImplementation "curse.maven:applied-flux-965012:6755986" modImplementation "curse.maven:applied-flux-965012:7072853"
modImplementation "curse.maven:mega-cells-622112:${mega_cells_version}" modImplementation "curse.maven:mega-cells-622112:${mega_cells_version}"
//mae2 //mae2

View File

@ -4,6 +4,7 @@ import appeng.api.config.Actionable;
import appeng.api.crafting.IPatternDetails; import appeng.api.crafting.IPatternDetails;
import appeng.api.inventories.InternalInventory; import appeng.api.inventories.InternalInventory;
import appeng.api.networking.IGridNode; import appeng.api.networking.IGridNode;
import appeng.api.networking.security.IActionSource;
import appeng.api.networking.storage.IStorageService; import appeng.api.networking.storage.IStorageService;
import appeng.api.networking.ticking.TickRateModulation; import appeng.api.networking.ticking.TickRateModulation;
import appeng.api.networking.ticking.TickingRequest; import appeng.api.networking.ticking.TickingRequest;
@ -12,6 +13,7 @@ import appeng.api.stacks.GenericStack;
import appeng.api.stacks.KeyCounter; import appeng.api.stacks.KeyCounter;
import appeng.util.inv.CombinedInternalInventory; import appeng.util.inv.CombinedInternalInventory;
import com.extendedae_plus.init.ModBlockEntities; import com.extendedae_plus.init.ModBlockEntities;
import com.glodblock.github.extendedae.common.me.CraftingMatrixThread;
import com.glodblock.github.extendedae.common.me.CraftingThread; import com.glodblock.github.extendedae.common.me.CraftingThread;
import com.glodblock.github.extendedae.common.me.matrix.ClusterAssemblerMatrix; import com.glodblock.github.extendedae.common.me.matrix.ClusterAssemblerMatrix;
import com.glodblock.github.extendedae.common.tileentities.matrix.TileAssemblerMatrixCrafter; import com.glodblock.github.extendedae.common.tileentities.matrix.TileAssemblerMatrixCrafter;
@ -32,6 +34,7 @@ public class CrafterCorePlusBlockEntity extends TileAssemblerMatrixCrafter {
private final CraftingThread[] threads = new CraftingThread[MAX_THREAD]; private final CraftingThread[] threads = new CraftingThread[MAX_THREAD];
private final InternalInventory internalInv; private final InternalInventory internalInv;
private final BlockEntityType<?> overriddenType; private final BlockEntityType<?> overriddenType;
private short states = 0;
public CrafterCorePlusBlockEntity(BlockPos pos, BlockState blockState) { public CrafterCorePlusBlockEntity(BlockPos pos, BlockState blockState) {
super(pos, blockState); super(pos, blockState);
@ -39,13 +42,35 @@ public class CrafterCorePlusBlockEntity extends TileAssemblerMatrixCrafter {
InternalInventory[] inventories = new InternalInventory[MAX_THREAD]; InternalInventory[] inventories = new InternalInventory[MAX_THREAD];
for (int i = 0; i < MAX_THREAD; i++) { for (int i = 0; i < MAX_THREAD; i++) {
this.threads[i] = new CraftingThread(this); int finalI = i;
this.threads[i].setPusher(this::pushResult); this.threads[i] = new CraftingMatrixThread(this, this::getSrc, (signal) -> this.changeState(finalI, signal));
inventories[i] = this.threads[i].getInternalInventory(); inventories[i] = this.threads[i].getInternalInventory();
} }
this.internalInv = new CombinedInternalInventory(inventories); this.internalInv = new CombinedInternalInventory(inventories);
} }
private void changeState(int index, boolean state) {
boolean oldState = this.states > 0;
if (state) {
this.states |= (short)(1 << index);
} else {
this.states &= (short)(~(1 << index));
}
if (state) {
if (!oldState) {
this.getMainNode().ifPresent((grid, node) -> grid.getTickManager().wakeDevice(node));
}
} else if (oldState && this.states <= 0) {
this.getMainNode().ifPresent((grid, node) -> grid.getTickManager().sleepDevice(node));
}
}
private IActionSource getSrc() {
return this.cluster.getSrc();
}
public int usedThread() { public int usedThread() {
int count = 0; int count = 0;
for (CraftingThread thread : this.threads) { for (CraftingThread thread : this.threads) {
@ -144,11 +169,7 @@ public class CrafterCorePlusBlockEntity extends TileAssemblerMatrixCrafter {
thread.updateSleepiness(); thread.updateSleepiness();
isAwake |= thread.isAwake(); isAwake |= thread.isAwake();
} }
if (isAwake) {
for (CraftingThread thread : this.threads) {
thread.forceAwake();
}
}
return new TickingRequest(1, 1, !isAwake, false); return new TickingRequest(1, 1, !isAwake, false);
} }

View File

@ -19,14 +19,18 @@ import com.extendedae_plus.mixin.minecraft.accessor.AbstractContainerScreenAcces
import com.extendedae_plus.mixin.minecraft.accessor.ScreenAccessor; import com.extendedae_plus.mixin.minecraft.accessor.ScreenAccessor;
import com.extendedae_plus.network.crafting.CraftingMonitorJumpC2SPacket; import com.extendedae_plus.network.crafting.CraftingMonitorJumpC2SPacket;
import com.extendedae_plus.network.crafting.CraftingMonitorOpenProviderC2SPacket; import com.extendedae_plus.network.crafting.CraftingMonitorOpenProviderC2SPacket;
import com.extendedae_plus.mixin.extendedae.accessor.IGuiExPatternTerminalUploadAccessor;
import com.extendedae_plus.util.GuiUtil; import com.extendedae_plus.util.GuiUtil;
import com.glodblock.github.extendedae.client.gui.GuiExPatternProvider; import com.glodblock.github.extendedae.client.gui.GuiExPatternProvider;
import com.glodblock.github.extendedae.client.gui.GuiExPatternTerminal;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font; import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.renderer.Rect2i; import net.minecraft.client.renderer.Rect2i;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack;
import net.minecraft.network.chat.contents.TranslatableContents; import net.minecraft.network.chat.contents.TranslatableContents;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
@ -78,6 +82,57 @@ public abstract class AEBaseScreenMixin {
} }
} }
/**
* AEBaseScreen mouseClicked 入口拦截 GuiExPatternTerminal Shift+左键快速上传样板功能
*/
@Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true)
private void eap$exPatternTerminalShiftClick(double mouseX, double mouseY, int button, CallbackInfoReturnable<Boolean> cir) {
// 仅处理 GuiExPatternTerminal 实例
Object self = this;
if (!(self instanceof GuiExPatternTerminal<?> terminal) || !(self instanceof IGuiExPatternTerminalUploadAccessor accessor)) {
return;
}
// 检查是否是左键点击 + Shift键
if (button != 0 || !Screen.hasShiftDown()) {
return;
}
try {
// 获取点击的槽位通过accessor访问hoveredSlot字段
if (!(self instanceof AbstractContainerScreenAccessor<?> screenAccessor)) {
return;
}
Slot hoveredSlot = screenAccessor.eap$getHoveredSlot();
if (hoveredSlot == null || hoveredSlot.container != Minecraft.getInstance().player.getInventory()) {
return;
}
// 点击的是玩家背包槽位
ItemStack clickedItem = hoveredSlot.getItem();
// 检查是否是有效的编码样板
if (clickedItem.isEmpty() || !PatternDetailsHelper.isEncodedPattern(clickedItem)) {
return;
}
// 检查是否选择了样板供应器
if (accessor.eap$getCurrentlyChoicePatternProvider() != -1) {
// 执行快速上传
accessor.eap$quickUploadPattern(hoveredSlot.getSlotIndex());
// 取消默认的点击行为
cir.setReturnValue(true);
} else {
// 显示提示消息请先选择一个样板供应器
if (Minecraft.getInstance().player != null) {
Minecraft.getInstance().player.displayClientMessage(
Component.translatable("extendedae_plus.screen.upload.select_provider_first"), false);
}
}
} catch (Throwable ignored) {
}
}
/** /**
* 为所有可见的样板槽位添加数量显示 * 为所有可见的样板槽位添加数量显示
*/ */

View File

@ -0,0 +1,17 @@
package com.extendedae_plus.mixin.extendedae.accessor;
/**
* 用于访问 GuiExPatternTerminalMixin 中快速上传功能的接口
*/
public interface IGuiExPatternTerminalUploadAccessor {
/**
* 获取当前选择的样板供应器ID
*/
long eap$getCurrentlyChoicePatternProvider();
/**
* 快速上传样板到当前选择的供应器
*/
void eap$quickUploadPattern(int playerSlotIndex);
}

View File

@ -47,7 +47,7 @@ import static com.extendedae_plus.util.GlobalSendMessage.sendPlayerMessage;
@Pseudo @Pseudo
@SuppressWarnings({"AddedMixinMembersNamePattern"}) @SuppressWarnings({"AddedMixinMembersNamePattern"})
@Mixin(value = GuiExPatternTerminal.class) @Mixin(value = GuiExPatternTerminal.class)
public abstract class GuiExPatternTerminalMixin extends AEBaseScreen<AEBaseMenu> { public abstract class GuiExPatternTerminalMixin extends AEBaseScreen<AEBaseMenu> implements com.extendedae_plus.mixin.extendedae.accessor.IGuiExPatternTerminalUploadAccessor {
@Shadow(remap = false) @Final private static int GUI_PADDING_X; @Shadow(remap = false) @Final private static int GUI_PADDING_X;
@Shadow(remap = false) @Final private static int GUI_PADDING_Y; @Shadow(remap = false) @Final private static int GUI_PADDING_Y;
@Shadow(remap = false) @Final private static int GUI_HEADER_HEIGHT; @Shadow(remap = false) @Final private static int GUI_HEADER_HEIGHT;
@ -91,41 +91,28 @@ public abstract class GuiExPatternTerminalMixin extends AEBaseScreen<AEBaseMenu>
} }
/** /**
* 拦截鼠标点击事件实现Shift+左键快速上传样板功能 * 实现接口方法获取当前选择的样板供应器ID
* 注意某些整合包的 ExtendedAE 版本不在该类中覆写 mouseClicked此处设置 require=0 以防止注入失败导致崩溃
*/ */
@Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true, require = 0) @Override
private void onMouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable<Boolean> cir) { @Unique
// 检查是否是左键点击 + Shift键 public long eap$getCurrentlyChoicePatternProvider() {
if (button == 0 && hasShiftDown()) { return this.currentlyChoicePatterProvider;
// 获取点击的槽位
Slot hoveredSlot = this.getSlotUnderMouse();
if (hoveredSlot != null && hoveredSlot.container == this.minecraft.player.getInventory()) {
// 点击的是玩家背包槽位
ItemStack clickedItem = hoveredSlot.getItem();
// 检查是否是有效的编码样板
if (!clickedItem.isEmpty() && PatternDetailsHelper.isEncodedPattern(clickedItem)) {
// 检查是否选择了样板供应器
if (currentlyChoicePatterProvider != -1) {
// 执行快速上传
this.eap$quickUploadPattern(hoveredSlot.getSlotIndex());
// 取消默认的点击行为
cir.setReturnValue(true);
} else {
// 显示提示消息请先选择一个样板供应器
sendPlayerMessage(Component.translatable("extendedae_plus.screen.upload.select_provider_first"));
}
}
}
}
} }
/** /**
* 快速上传样板到当前选择的供应器 * 实现接口方法快速上传样板
*/
@Override
@Unique
public void eap$quickUploadPattern(int playerSlotIndex) {
this.eap$quickUploadPatternInternal(playerSlotIndex);
}
/**
* 快速上传样板到当前选择的供应器内部实现
*/ */
@Unique @Unique
private void eap$quickUploadPattern(int playerSlotIndex) { private void eap$quickUploadPatternInternal(int playerSlotIndex) {
if (this.minecraft.player == null) return; if (this.minecraft.player == null) return;
ItemStack itemToUpload = this.minecraft.player.getInventory().getItem(playerSlotIndex); ItemStack itemToUpload = this.minecraft.player.getInventory().getItem(playerSlotIndex);
@ -218,14 +205,6 @@ public abstract class GuiExPatternTerminalMixin extends AEBaseScreen<AEBaseMenu>
this.addToLeftToolbar(this.eap$toggleSlotsButton); this.addToLeftToolbar(this.eap$toggleSlotsButton);
} }
@Inject(method = "init", at = @At("TAIL"), remap = false, require = 0)
private void eap$onInit(CallbackInfo ci) {
// 清理旧的打开UI按钮并标记需要重建
this.openUIButtons.values().forEach(this::removeWidget);
this.openUIButtons.clear();
this.buttonsDirty = true;
}
@Inject(method = "refreshList", at = @At("HEAD"), remap = false) @Inject(method = "refreshList", at = @At("HEAD"), remap = false)
private void onRefreshListStart(CallbackInfo ci) { private void onRefreshListStart(CallbackInfo ci) {
// 更新 toggle 按钮 tooltip 文本 // 更新 toggle 按钮 tooltip 文本