适配146eae
This commit is contained in:
parent
c1ecd1b320
commit
ceac245fdb
|
|
@ -81,14 +81,13 @@ dependencies {
|
|||
//exendedae前置
|
||||
modImplementation "curse.maven:glodium-957920:${glodium_version}"
|
||||
//extendedAE
|
||||
modImplementation files('libs/ExtendedAE-1.20-1.4.2-forge.jar')
|
||||
modRuntimeOnly fileTree(dir: 'libs', includes: ['*.jar'])
|
||||
implementation "curse.maven:ex-pattern-provider-892005:7005572"
|
||||
|
||||
//ae2
|
||||
modImplementation "appeng:appliedenergistics2-forge:${ae2_version}"
|
||||
modImplementation "org.appliedenergistics:guideme:${guideme_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}"
|
||||
|
||||
//mae2
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import appeng.api.config.Actionable;
|
|||
import appeng.api.crafting.IPatternDetails;
|
||||
import appeng.api.inventories.InternalInventory;
|
||||
import appeng.api.networking.IGridNode;
|
||||
import appeng.api.networking.security.IActionSource;
|
||||
import appeng.api.networking.storage.IStorageService;
|
||||
import appeng.api.networking.ticking.TickRateModulation;
|
||||
import appeng.api.networking.ticking.TickingRequest;
|
||||
|
|
@ -12,6 +13,7 @@ import appeng.api.stacks.GenericStack;
|
|||
import appeng.api.stacks.KeyCounter;
|
||||
import appeng.util.inv.CombinedInternalInventory;
|
||||
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.matrix.ClusterAssemblerMatrix;
|
||||
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 InternalInventory internalInv;
|
||||
private final BlockEntityType<?> overriddenType;
|
||||
private short states = 0;
|
||||
|
||||
public CrafterCorePlusBlockEntity(BlockPos pos, BlockState blockState) {
|
||||
super(pos, blockState);
|
||||
|
|
@ -39,13 +42,35 @@ public class CrafterCorePlusBlockEntity extends TileAssemblerMatrixCrafter {
|
|||
|
||||
InternalInventory[] inventories = new InternalInventory[MAX_THREAD];
|
||||
for (int i = 0; i < MAX_THREAD; i++) {
|
||||
this.threads[i] = new CraftingThread(this);
|
||||
this.threads[i].setPusher(this::pushResult);
|
||||
int finalI = i;
|
||||
this.threads[i] = new CraftingMatrixThread(this, this::getSrc, (signal) -> this.changeState(finalI, signal));
|
||||
inventories[i] = this.threads[i].getInternalInventory();
|
||||
}
|
||||
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() {
|
||||
int count = 0;
|
||||
for (CraftingThread thread : this.threads) {
|
||||
|
|
@ -144,11 +169,7 @@ public class CrafterCorePlusBlockEntity extends TileAssemblerMatrixCrafter {
|
|||
thread.updateSleepiness();
|
||||
isAwake |= thread.isAwake();
|
||||
}
|
||||
if (isAwake) {
|
||||
for (CraftingThread thread : this.threads) {
|
||||
thread.forceAwake();
|
||||
}
|
||||
}
|
||||
|
||||
return new TickingRequest(1, 1, !isAwake, false);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -19,14 +19,18 @@ import com.extendedae_plus.mixin.minecraft.accessor.AbstractContainerScreenAcces
|
|||
import com.extendedae_plus.mixin.minecraft.accessor.ScreenAccessor;
|
||||
import com.extendedae_plus.network.crafting.CraftingMonitorJumpC2SPacket;
|
||||
import com.extendedae_plus.network.crafting.CraftingMonitorOpenProviderC2SPacket;
|
||||
import com.extendedae_plus.mixin.extendedae.accessor.IGuiExPatternTerminalUploadAccessor;
|
||||
import com.extendedae_plus.util.GuiUtil;
|
||||
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.gui.Font;
|
||||
import net.minecraft.client.gui.GuiGraphics;
|
||||
import net.minecraft.client.gui.screens.Screen;
|
||||
import net.minecraft.client.renderer.Rect2i;
|
||||
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 org.jetbrains.annotations.Nullable;
|
||||
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) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 为所有可见的样板槽位添加数量显示
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -0,0 +1,17 @@
|
|||
package com.extendedae_plus.mixin.extendedae.accessor;
|
||||
|
||||
/**
|
||||
* 用于访问 GuiExPatternTerminalMixin 中快速上传功能的接口
|
||||
*/
|
||||
public interface IGuiExPatternTerminalUploadAccessor {
|
||||
/**
|
||||
* 获取当前选择的样板供应器ID
|
||||
*/
|
||||
long eap$getCurrentlyChoicePatternProvider();
|
||||
|
||||
/**
|
||||
* 快速上传样板到当前选择的供应器
|
||||
*/
|
||||
void eap$quickUploadPattern(int playerSlotIndex);
|
||||
}
|
||||
|
||||
|
|
@ -47,7 +47,7 @@ import static com.extendedae_plus.util.GlobalSendMessage.sendPlayerMessage;
|
|||
@Pseudo
|
||||
@SuppressWarnings({"AddedMixinMembersNamePattern"})
|
||||
@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_Y;
|
||||
@Shadow(remap = false) @Final private static int GUI_HEADER_HEIGHT;
|
||||
|
|
@ -91,41 +91,28 @@ public abstract class GuiExPatternTerminalMixin extends AEBaseScreen<AEBaseMenu>
|
|||
}
|
||||
|
||||
/**
|
||||
* 拦截鼠标点击事件,实现Shift+左键快速上传样板功能
|
||||
* 注意:某些整合包的 ExtendedAE 版本不在该类中覆写 mouseClicked,此处设置 require=0 以防止注入失败导致崩溃。
|
||||
* 实现接口方法:获取当前选择的样板供应器ID
|
||||
*/
|
||||
@Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true, require = 0)
|
||||
private void onMouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable<Boolean> cir) {
|
||||
// 检查是否是左键点击 + Shift键
|
||||
if (button == 0 && hasShiftDown()) {
|
||||
// 获取点击的槽位
|
||||
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 long eap$getCurrentlyChoicePatternProvider() {
|
||||
return this.currentlyChoicePatterProvider;
|
||||
}
|
||||
|
||||
/**
|
||||
* 快速上传样板到当前选择的供应器
|
||||
* 实现接口方法:快速上传样板
|
||||
*/
|
||||
@Override
|
||||
@Unique
|
||||
public void eap$quickUploadPattern(int playerSlotIndex) {
|
||||
this.eap$quickUploadPatternInternal(playerSlotIndex);
|
||||
}
|
||||
|
||||
/**
|
||||
* 快速上传样板到当前选择的供应器(内部实现)
|
||||
*/
|
||||
@Unique
|
||||
private void eap$quickUploadPattern(int playerSlotIndex) {
|
||||
private void eap$quickUploadPatternInternal(int playerSlotIndex) {
|
||||
if (this.minecraft.player == null) return;
|
||||
|
||||
ItemStack itemToUpload = this.minecraft.player.getInventory().getItem(playerSlotIndex);
|
||||
|
|
@ -218,14 +205,6 @@ public abstract class GuiExPatternTerminalMixin extends AEBaseScreen<AEBaseMenu>
|
|||
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)
|
||||
private void onRefreshListStart(CallbackInfo ci) {
|
||||
// 更新 toggle 按钮 tooltip 文本
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user