按住shift可取回上一个上传样板 ui箭头朝下
This commit is contained in:
parent
ece92fa795
commit
3405e20dca
|
|
@ -189,6 +189,12 @@ public final class ModNetwork {
|
||||||
.decoder(CancelPendingPatternC2SPacket::decode)
|
.decoder(CancelPendingPatternC2SPacket::decode)
|
||||||
.consumerNetworkThread(CancelPendingPatternC2SPacket::handle)
|
.consumerNetworkThread(CancelPendingPatternC2SPacket::handle)
|
||||||
.add();
|
.add();
|
||||||
|
|
||||||
|
CHANNEL.messageBuilder(ReturnLastPatternC2SPacket.class,nextId(), NetworkDirection.PLAY_TO_SERVER)
|
||||||
|
.encoder(ReturnLastPatternC2SPacket::encode)
|
||||||
|
.decoder(ReturnLastPatternC2SPacket::decode)
|
||||||
|
.consumerNetworkThread(ReturnLastPatternC2SPacket::handle)
|
||||||
|
.add();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int nextId() { return id++; }
|
private static int nextId() { return id++; }
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ import com.extendedae_plus.mixin.ae2.accessor.AEBaseScreenAccessor;
|
||||||
import com.extendedae_plus.mixin.minecraft.accessor.AbstractContainerScreenAccessor;
|
import com.extendedae_plus.mixin.minecraft.accessor.AbstractContainerScreenAccessor;
|
||||||
import com.extendedae_plus.mixin.minecraft.accessor.ScreenAccessor;
|
import com.extendedae_plus.mixin.minecraft.accessor.ScreenAccessor;
|
||||||
import com.extendedae_plus.network.provider.RequestProvidersListC2SPacket;
|
import com.extendedae_plus.network.provider.RequestProvidersListC2SPacket;
|
||||||
|
import com.extendedae_plus.network.provider.ReturnLastPatternC2SPacket;
|
||||||
import com.extendedae_plus.network.upload.EncodeWithShiftFlagC2SPacket;
|
import com.extendedae_plus.network.upload.EncodeWithShiftFlagC2SPacket;
|
||||||
import com.mojang.blaze3d.systems.RenderSystem;
|
import com.mojang.blaze3d.systems.RenderSystem;
|
||||||
import net.minecraft.client.gui.GuiGraphics;
|
import net.minecraft.client.gui.GuiGraphics;
|
||||||
|
|
@ -66,9 +67,13 @@ public abstract class PatternEncodingTermScreenMixin {
|
||||||
|
|
||||||
@Unique
|
@Unique
|
||||||
private IconButton createUploadButton() {
|
private IconButton createUploadButton() {
|
||||||
IconButton btn = new IconButton(button ->
|
IconButton btn = new IconButton(button -> {
|
||||||
ModNetwork.CHANNEL.sendToServer(new RequestProvidersListC2SPacket())
|
if (Screen.hasShiftDown()) {
|
||||||
) {
|
ModNetwork.CHANNEL.sendToServer(new ReturnLastPatternC2SPacket());
|
||||||
|
} else {
|
||||||
|
ModNetwork.CHANNEL.sendToServer(new RequestProvidersListC2SPacket());
|
||||||
|
}
|
||||||
|
}) {
|
||||||
private final float eap$scale = 0.75f;
|
private final float eap$scale = 0.75f;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -99,7 +104,19 @@ public abstract class PatternEncodingTermScreenMixin {
|
||||||
if (!this.isDisableBackground()) {
|
if (!this.isDisableBackground()) {
|
||||||
Icon.TOOLBAR_BUTTON_BACKGROUND.getBlitter().dest(0, 0).blit(guiGraphics);
|
Icon.TOOLBAR_BUTTON_BACKGROUND.getBlitter().dest(0, 0).blit(guiGraphics);
|
||||||
}
|
}
|
||||||
blitter.dest(0, 0).blit(guiGraphics);
|
|
||||||
|
if (Screen.hasShiftDown()) {
|
||||||
|
pose.pushPose();
|
||||||
|
// Rotate around the center of the 16x16 icon
|
||||||
|
pose.translate(8.0f, 8.0f, 0.0f);
|
||||||
|
pose.mulPose(com.mojang.math.Axis.ZP.rotationDegrees(180.0f));
|
||||||
|
pose.translate(-8.0f, -8.0f, 0.0f);
|
||||||
|
blitter.dest(0, 0).blit(guiGraphics);
|
||||||
|
pose.popPose();
|
||||||
|
} else {
|
||||||
|
blitter.dest(0, 0).blit(guiGraphics);
|
||||||
|
}
|
||||||
|
|
||||||
pose.popPose();
|
pose.popPose();
|
||||||
|
|
||||||
RenderSystem.enableDepthTest();
|
RenderSystem.enableDepthTest();
|
||||||
|
|
@ -110,6 +127,16 @@ public abstract class PatternEncodingTermScreenMixin {
|
||||||
return new Rect2i(getX(), getY(), Math.round(16 * eap$scale), Math.round(16 * eap$scale));
|
return new Rect2i(getX(), getY(), Math.round(16 * eap$scale), Math.round(16 * eap$scale));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void render(GuiGraphics p_281670_, int p_282682_, int p_281714_, float p_282542_) {
|
||||||
|
if (Screen.hasShiftDown()) {
|
||||||
|
this.setTooltip(Tooltip.create(Component.translatable("extendedae_plus.button.return_last_pattern")));
|
||||||
|
} else {
|
||||||
|
this.setTooltip(Tooltip.create(Component.translatable("extendedae_plus.button.choose_provider")));
|
||||||
|
}
|
||||||
|
super.render(p_281670_, p_282682_, p_281714_, p_282542_);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Icon getIcon() {
|
protected Icon getIcon() {
|
||||||
return Icon.ARROW_UP;
|
return Icon.ARROW_UP;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,94 @@
|
||||||
|
package com.extendedae_plus.network.provider;
|
||||||
|
|
||||||
|
import appeng.api.crafting.PatternDetailsHelper;
|
||||||
|
import appeng.api.inventories.InternalInventory;
|
||||||
|
import appeng.helpers.patternprovider.PatternContainer;
|
||||||
|
import appeng.menu.implementations.PatternAccessTermMenu;
|
||||||
|
import appeng.menu.me.items.PatternEncodingTermMenu;
|
||||||
|
import com.extendedae_plus.util.PatternTerminalUtil;
|
||||||
|
import com.extendedae_plus.util.uploadPattern.ProviderUploadUtil;
|
||||||
|
import net.minecraft.network.FriendlyByteBuf;
|
||||||
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
|
import net.minecraft.world.item.ItemStack;
|
||||||
|
import net.minecraftforge.network.NetworkEvent;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* C2S: Retrieved the last uploaded pattern from the recently used provider.
|
||||||
|
*/
|
||||||
|
public class ReturnLastPatternC2SPacket {
|
||||||
|
public ReturnLastPatternC2SPacket() {}
|
||||||
|
|
||||||
|
public static void encode(ReturnLastPatternC2SPacket msg, FriendlyByteBuf buf) {}
|
||||||
|
|
||||||
|
public static ReturnLastPatternC2SPacket decode(FriendlyByteBuf buf) {
|
||||||
|
return new ReturnLastPatternC2SPacket();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void handle(ReturnLastPatternC2SPacket msg, Supplier<NetworkEvent.Context> ctxSupplier) {
|
||||||
|
var ctx = ctxSupplier.get();
|
||||||
|
ctx.enqueueWork(() -> {
|
||||||
|
ServerPlayer player = ctx.getSender();
|
||||||
|
if (player == null) return;
|
||||||
|
|
||||||
|
long lastProviderId = ProviderUploadUtil.getLastUploadedProviderId(player);
|
||||||
|
if (lastProviderId == Long.MIN_VALUE) {
|
||||||
|
return; // Nothing to return
|
||||||
|
}
|
||||||
|
|
||||||
|
PatternContainer targetContainer = null;
|
||||||
|
|
||||||
|
// Try to resolve the container using encoding menu
|
||||||
|
if (player.containerMenu instanceof PatternEncodingTermMenu encMenu) {
|
||||||
|
if (lastProviderId >= 0) {
|
||||||
|
PatternAccessTermMenu accessMenu = PatternTerminalUtil.getPatternAccessMenu(player);
|
||||||
|
if (accessMenu != null) {
|
||||||
|
targetContainer = PatternTerminalUtil.getPatternContainerById(accessMenu, lastProviderId);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
int index = (int) (-1L - lastProviderId);
|
||||||
|
List<PatternContainer> list = PatternTerminalUtil.listAvailableProvidersFromGrid(encMenu);
|
||||||
|
if (index >= 0 && index < list.size()) {
|
||||||
|
targetContainer = list.get(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Try to resolve from player network if not in encoding menu (e.g. pending ctrl+q state)
|
||||||
|
if (lastProviderId >= 0) {
|
||||||
|
// It's harder without access terminal menu, but technically we could search the grid
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
int index = (int) (-1L - lastProviderId);
|
||||||
|
List<PatternContainer> list = ProviderUploadUtil.listAvailableProvidersFromPlayerNetwork(player);
|
||||||
|
if (index >= 0 && index < list.size()) {
|
||||||
|
targetContainer = list.get(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetContainer == null || !targetContainer.isVisibleInTerminal()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
InternalInventory inv = targetContainer.getTerminalPatternInventory();
|
||||||
|
if (inv == null || inv.size() <= 0) return;
|
||||||
|
|
||||||
|
// Find the highest slot with an encoded pattern
|
||||||
|
for (int slot = inv.size() - 1; slot >= 0; slot--) {
|
||||||
|
ItemStack stack = inv.getStackInSlot(slot);
|
||||||
|
if (!stack.isEmpty() && PatternDetailsHelper.isEncodedPattern(stack)) {
|
||||||
|
ItemStack extracted = inv.extractItem(slot, 1, false);
|
||||||
|
if (!extracted.isEmpty()) {
|
||||||
|
if (!player.getInventory().add(extracted)) {
|
||||||
|
player.drop(extracted, false);
|
||||||
|
}
|
||||||
|
return; // Found and returned
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
ctx.setPacketHandled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -35,6 +35,7 @@ import java.util.UUID;
|
||||||
public final class ProviderUploadUtil {
|
public final class ProviderUploadUtil {
|
||||||
private static final String PENDING_DATA_KEY = "eap_ctrlq_pending_provider_upload_id";
|
private static final String PENDING_DATA_KEY = "eap_ctrlq_pending_provider_upload_id";
|
||||||
private static final String PENDING_STACK_KEY = "eap_ctrlq_pending_provider_upload_stack";
|
private static final String PENDING_STACK_KEY = "eap_ctrlq_pending_provider_upload_stack";
|
||||||
|
private static final String LAST_UPLOADED_PROVIDER_KEY = "eap_last_uploaded_provider_id";
|
||||||
|
|
||||||
private ProviderUploadUtil() {}
|
private ProviderUploadUtil() {}
|
||||||
|
|
||||||
|
|
@ -114,6 +115,8 @@ public final class ProviderUploadUtil {
|
||||||
player.getInventory().setItem(playerSlotIndex, ItemStack.EMPTY);
|
player.getInventory().setItem(playerSlotIndex, ItemStack.EMPTY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
player.getPersistentData().putLong(LAST_UPLOADED_PROVIDER_KEY, providerId);
|
||||||
|
|
||||||
String terminalType = PatternTerminalUtil.isExtendedAETerminal(player) ? "扩展样板管理终端" : "样板访问终端";
|
String terminalType = PatternTerminalUtil.isExtendedAETerminal(player) ? "扩展样板管理终端" : "样板访问终端";
|
||||||
sendMessage(player, "ExtendedAE Plus: 通过" + terminalType + "成功上传 " + insertedCount + " 个样板");
|
sendMessage(player, "ExtendedAE Plus: 通过" + terminalType + "成功上传 " + insertedCount + " 个样板");
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -175,6 +178,7 @@ public final class ProviderUploadUtil {
|
||||||
} else {
|
} else {
|
||||||
encodedSlot.set(stack);
|
encodedSlot.set(stack);
|
||||||
}
|
}
|
||||||
|
player.getPersistentData().putLong(LAST_UPLOADED_PROVIDER_KEY, id);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -227,6 +231,15 @@ public final class ProviderUploadUtil {
|
||||||
} else {
|
} else {
|
||||||
encodedSlot.set(stack);
|
encodedSlot.set(stack);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For index-based, we can store the negative index to let the return logic resolve it
|
||||||
|
player.getPersistentData().putLong(LAST_UPLOADED_PROVIDER_KEY, index == 0 && c == list.get(0) ? (-1L - index) : -1000000L); // store specifically if logic allows, but to be sure let's store the index format
|
||||||
|
// actually we know `c` might be from tryList, let's find the true index of `c` in `list`
|
||||||
|
int trueIndex = list.indexOf(c);
|
||||||
|
if (trueIndex >= 0) {
|
||||||
|
player.getPersistentData().putLong(LAST_UPLOADED_PROVIDER_KEY, -1L - trueIndex);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -278,6 +291,8 @@ public final class ProviderUploadUtil {
|
||||||
} else {
|
} else {
|
||||||
player.getPersistentData().put(PENDING_STACK_KEY, remain.save(new CompoundTag()));
|
player.getPersistentData().put(PENDING_STACK_KEY, remain.save(new CompoundTag()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
player.getPersistentData().putLong(LAST_UPLOADED_PROVIDER_KEY, providerId);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -407,6 +422,15 @@ public final class ProviderUploadUtil {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static long getLastUploadedProviderId(ServerPlayer player) {
|
||||||
|
if (player == null) return Long.MIN_VALUE;
|
||||||
|
CompoundTag data = player.getPersistentData();
|
||||||
|
if (data.contains(LAST_UPLOADED_PROVIDER_KEY)) {
|
||||||
|
return data.getLong(LAST_UPLOADED_PROVIDER_KEY);
|
||||||
|
}
|
||||||
|
return Long.MIN_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ExtendedAE兼容的样板过滤器
|
* ExtendedAE兼容的样板过滤器
|
||||||
* 使用AE2的PatternDetailsHelper进行样板验证
|
* 使用AE2的PatternDetailsHelper进行样板验证
|
||||||
|
|
|
||||||
|
|
@ -126,6 +126,7 @@
|
||||||
|
|
||||||
"extendedae_plus.screen.open_provider_ui": "Open the target container UI of this provider",
|
"extendedae_plus.screen.open_provider_ui": "Open the target container UI of this provider",
|
||||||
"extendedae_plus.button.choose_provider": "Upload Pattern",
|
"extendedae_plus.button.choose_provider": "Upload Pattern",
|
||||||
|
"extendedae_plus.button.return_last_pattern": "Return Last Uploaded Pattern",
|
||||||
"extendedae_plus.pattern.hovertext.player": "Encoded by %s",
|
"extendedae_plus.pattern.hovertext.player": "Encoded by %s",
|
||||||
|
|
||||||
"item.extendedae_plus.entity_speed_ticker": "Entity Speed Ticker",
|
"item.extendedae_plus.entity_speed_ticker": "Entity Speed Ticker",
|
||||||
|
|
|
||||||
|
|
@ -125,6 +125,7 @@
|
||||||
|
|
||||||
"extendedae_plus.screen.open_provider_ui": "打开该供应器目标容器的界面",
|
"extendedae_plus.screen.open_provider_ui": "打开该供应器目标容器的界面",
|
||||||
"extendedae_plus.button.choose_provider":"上传样板",
|
"extendedae_plus.button.choose_provider":"上传样板",
|
||||||
|
"extendedae_plus.button.return_last_pattern":"取回上一个上传样板",
|
||||||
"extendedae_plus.pattern.hovertext.player": "由 %s 编码",
|
"extendedae_plus.pattern.hovertext.player": "由 %s 编码",
|
||||||
|
|
||||||
"item.extendedae_plus.entity_speed_ticker": "实体加速器",
|
"item.extendedae_plus.entity_speed_ticker": "实体加速器",
|
||||||
|
|
|
||||||
|
|
@ -125,6 +125,7 @@
|
||||||
|
|
||||||
"extendedae_plus.screen.open_provider_ui": "開啟該供應器目標容器的介面",
|
"extendedae_plus.screen.open_provider_ui": "開啟該供應器目標容器的介面",
|
||||||
"extendedae_plus.button.choose_provider": "上傳樣板",
|
"extendedae_plus.button.choose_provider": "上傳樣板",
|
||||||
|
"extendedae_plus.button.return_last_pattern": "取回上一個上傳樣板",
|
||||||
"extendedae_plus.pattern.hovertext.player": "由 %s 編碼",
|
"extendedae_plus.pattern.hovertext.player": "由 %s 編碼",
|
||||||
|
|
||||||
"item.extendedae_plus.entity_speed_ticker": "實體加速器",
|
"item.extendedae_plus.entity_speed_ticker": "實體加速器",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user