适配146eae
This commit is contained in:
parent
c1ecd1b320
commit
ceac245fdb
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 为所有可见的样板槽位添加数量显示
|
* 为所有可见的样板槽位添加数量显示
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -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
|
@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 文本
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user