调整全部前缀为eap!优化部分东西

This commit is contained in:
C-H716 2025-08-22 01:21:18 +08:00
parent 3ed49ae1c5
commit cd01e21c26
57 changed files with 388 additions and 435 deletions

View File

@ -94,6 +94,15 @@ dependencies {
modCompileOnly "curse.maven:just-enough-characters-250702:6680042"
}
//
gradle.projectsEvaluated {
tasks.withType(JavaCompile).tap {
configureEach {
options.compilerArgs << "-Xlint:-deprecation"
}
}
}
processResources {
inputs.property 'version', project.version

View File

@ -1,19 +1,20 @@
package com.extendedae_plus;
import appeng.menu.locator.MenuLocators;
import com.extendedae_plus.config.ModConfigs;
import com.extendedae_plus.init.ModBlockEntities;
import com.extendedae_plus.init.ModBlocks;
import com.extendedae_plus.init.ModCreativeTabs;
import com.extendedae_plus.init.ModItems;
import com.extendedae_plus.menu.locator.CuriosItemLocator;
import com.extendedae_plus.network.ModNetwork;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.config.ModConfig;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.config.ModConfig;
import com.extendedae_plus.config.ModConfigs;
import com.extendedae_plus.init.ModBlocks;
import com.extendedae_plus.init.ModBlockEntities;
import com.extendedae_plus.init.ModItems;
import com.extendedae_plus.init.ModCreativeTabs;
import com.extendedae_plus.network.ModNetwork;
import com.extendedae_plus.menu.locator.CuriosItemLocator;
import appeng.menu.locator.MenuLocators;
/**
* ExtendedAE Plus 主mod类

View File

@ -1,7 +1,6 @@
package com.extendedae_plus;
import appeng.client.gui.style.Blitter;
import com.glodblock.github.extendedae.ExtendedAE;
import net.minecraft.resources.ResourceLocation;
public class NewIcon {

View File

@ -0,0 +1,6 @@
package com.extendedae_plus.api;
public interface AdvancedBlockingHolder {
boolean eap$getAdvancedBlocking();
void eap$setAdvancedBlocking(boolean value);
}

View File

@ -1,5 +1,5 @@
package com.extendedae_plus.api;
public interface PatternProviderMenuAdvancedSync {
boolean ext$getAdvancedBlockingSynced();
boolean eap$getAdvancedBlockingSynced();
}

View File

@ -109,8 +109,8 @@ public final class InputEvents {
if (screen instanceof MEStorageScreen<?> me) {
try {
MEStorageScreenAccessor acc = (MEStorageScreenAccessor) (Object) me;
acc.ext$getSearchField().setValue(name);
acc.ext$setSearchText(name); // 同步到 Repo 并刷新
acc.eap$getSearchField().setValue(name);
acc.eap$setSearchText(name); // 同步到 Repo 并刷新
event.setCanceled(true);
return;
} catch (Throwable ignored) {

View File

@ -8,11 +8,7 @@ import net.minecraft.client.gui.components.EditBox;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;
import java.util.ArrayList;
import java.util.Objects;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* 简单的供应器选择弹窗

View File

@ -1,10 +1,12 @@
package com.extendedae_plus.content.wireless;
import com.extendedae_plus.init.ModBlockEntities;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.network.chat.Component;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.EntityBlock;
@ -13,10 +15,6 @@ import net.minecraft.world.level.block.entity.BlockEntityTicker;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
import org.jetbrains.annotations.Nullable;
import com.extendedae_plus.init.ModBlockEntities;
import net.minecraft.world.item.Items;
import net.minecraft.network.chat.Component;
public class WirelessTransceiverBlock extends Block implements EntityBlock {
public WirelessTransceiverBlock(Properties props) {

View File

@ -1,23 +1,20 @@
package com.extendedae_plus.content.wireless;
import appeng.api.networking.GridHelper;
import appeng.api.networking.IGridNode;
import appeng.api.networking.IGridNodeListener;
import appeng.api.networking.IManagedGridNode;
import appeng.api.networking.IInWorldGridNodeHost;
import appeng.api.networking.*;
import com.extendedae_plus.init.ModBlockEntities;
import com.extendedae_plus.init.ModItems;
import com.extendedae_plus.wireless.IWirelessEndpoint;
import com.extendedae_plus.wireless.WirelessMasterLink;
import com.extendedae_plus.wireless.WirelessSlaveLink;
import com.extendedae_plus.init.ModBlockEntities;
import com.extendedae_plus.init.ModItems;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.core.Direction;
import org.jetbrains.annotations.Nullable;
import java.util.EnumSet;
/**

View File

@ -1,5 +1,6 @@
package com.extendedae_plus.hooks;
import appeng.util.InteractionUtil;
import com.extendedae_plus.ExtendedAEPlus;
import com.extendedae_plus.content.wireless.WirelessTransceiverBlockEntity;
import net.minecraft.network.chat.Component;
@ -15,7 +16,6 @@ import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.eventbus.api.Event;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import appeng.util.InteractionUtil;
@Mod.EventBusSubscriber(modid = ExtendedAEPlus.MODID)
public final class WrenchHook {

View File

@ -1,10 +1,10 @@
package com.extendedae_plus.init;
import com.extendedae_plus.ExtendedAEPlus;
import net.minecraft.core.registries.Registries;
import net.minecraft.network.chat.Component;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraft.core.registries.Registries;
import net.minecraftforge.registries.RegistryObject;
public final class ModCreativeTabs {

View File

@ -2,7 +2,6 @@ package com.extendedae_plus.init;
import com.extendedae_plus.ExtendedAEPlus;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.Item;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;

View File

@ -1,12 +1,11 @@
package com.extendedae_plus.integration.jei;
import com.extendedae_plus.ExtendedAEPlus;
import mezz.jei.api.IModPlugin;
import mezz.jei.api.JeiPlugin;
import mezz.jei.api.runtime.IJeiRuntime;
import net.minecraft.resources.ResourceLocation;
import com.extendedae_plus.ExtendedAEPlus;
@JeiPlugin
public class ExtendedAEJeiPlugin implements IModPlugin {
private static final ResourceLocation UID = new ResourceLocation(ExtendedAEPlus.MODID, "jei_plugin");

View File

@ -1,15 +1,14 @@
package com.extendedae_plus.integration.jei;
import java.util.Optional;
import javax.annotation.Nullable;
import mezz.jei.api.ingredients.ITypedIngredient;
import mezz.jei.api.constants.VanillaTypes;
import mezz.jei.api.ingredients.ITypedIngredient;
import mezz.jei.api.runtime.IBookmarkOverlay;
import mezz.jei.api.runtime.IIngredientListOverlay;
import mezz.jei.api.runtime.IJeiRuntime;
import javax.annotation.Nullable;
import java.util.Optional;
/**
* 线程安全地缓存并访问 JEI Runtime
*/

View File

@ -1,19 +1,15 @@
package com.extendedae_plus.menu.host;
import java.util.function.BiConsumer;
import org.jetbrains.annotations.Nullable;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.item.ItemStack;
import appeng.menu.ISubMenu;
import de.mari_023.ae2wtlib.terminal.WTMenuHost;
// Curios API
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.item.ItemStack;
import org.jetbrains.annotations.Nullable;
import top.theillusivec4.curios.api.type.inventory.ICurioStacksHandler;
import java.util.function.BiConsumer;
/**
* 针对 Curios 槽位的 ae2wtlib WTMenuHost 适配器
* - 复用 wtlib 的量子卡跨维/跨距逻辑rangeCheck/isQuantumLinked

View File

@ -1,17 +1,11 @@
package com.extendedae_plus.menu.host;
import org.jetbrains.annotations.Nullable;
import appeng.api.storage.ISubMenuHost;
import appeng.helpers.WirelessTerminalMenuHost;
import appeng.menu.ISubMenu;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.item.ItemStack;
import appeng.api.implementations.menuobjects.ItemMenuHost;
import appeng.helpers.WirelessTerminalMenuHost;
import appeng.menu.ISubMenu;
import appeng.api.storage.ISubMenuHost;
// Curios API
import top.theillusivec4.curios.api.type.inventory.ICurioStacksHandler;
/**

View File

@ -1,27 +1,21 @@
package com.extendedae_plus.menu.locator;
import org.jetbrains.annotations.Nullable;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import appeng.api.implementations.menuobjects.IMenuItem;
import appeng.api.implementations.menuobjects.ItemMenuHost;
import appeng.helpers.WirelessTerminalMenuHost;
import appeng.items.tools.powered.WirelessTerminalItem;
import appeng.menu.MenuOpener;
import appeng.menu.me.common.MEStorageMenu;
import appeng.menu.locator.MenuLocator;
import com.extendedae_plus.menu.host.CuriosWirelessTerminalMenuHost;
// ae2wtlib
import de.mari_023.ae2wtlib.wut.WUTHandler;
import de.mari_023.ae2wtlib.wut.WTDefinition;
import de.mari_023.ae2wtlib.terminal.WTMenuHost;
import appeng.menu.me.common.MEStorageMenu;
import com.extendedae_plus.menu.host.CuriosWTMenuHost;
// Curios API (软依赖)
import com.extendedae_plus.menu.host.CuriosWirelessTerminalMenuHost;
import de.mari_023.ae2wtlib.terminal.WTMenuHost;
import de.mari_023.ae2wtlib.wut.WTDefinition;
import de.mari_023.ae2wtlib.wut.WUTHandler;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import org.jetbrains.annotations.Nullable;
import top.theillusivec4.curios.api.CuriosApi;
import top.theillusivec4.curios.api.type.inventory.ICurioStacksHandler;

View File

@ -1,22 +1,20 @@
package com.extendedae_plus.mixin;
import com.extendedae_plus.network.ModNetwork;
import com.extendedae_plus.network.PickFromWirelessC2SPacket;
import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.GameType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.Vec3;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.world.level.GameType;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.Vec3;
import net.minecraft.world.phys.HitResult;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.state.BlockState;
import com.extendedae_plus.network.ModNetwork;
import com.extendedae_plus.network.PickFromWirelessC2SPacket;
// no client-side WCT gating; server will check presence (including Curios)
@ -26,7 +24,7 @@ public class PickFromWirelessMixin {
@Shadow public HitResult hitResult;
@Inject(method = "pickBlock", at = @At("HEAD"), cancellable = true)
private void extendedae_plus$pickFromAeWireless(CallbackInfo ci) {
private void eap$pickFromAeWireless(CallbackInfo ci) {
if (this.player == null || this.hitResult == null || this.hitResult.getType() != HitResult.Type.BLOCK) {
return;
}

View File

@ -1,15 +1,14 @@
package com.extendedae_plus.mixin.accessor;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.world.inventory.AbstractContainerMenu;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(AbstractContainerScreen.class)
public interface AbstractContainerScreenAccessor<T extends AbstractContainerMenu> {
@Accessor("leftPos") int extendedae_plus$getLeftPos();
@Accessor("topPos") int extendedae_plus$getTopPos();
@Accessor("imageWidth") int extendedae_plus$getImageWidth();
@Accessor("imageHeight") int extendedae_plus$getImageHeight();
@Accessor("leftPos") int eap$getLeftPos();
@Accessor("topPos") int eap$getTopPos();
@Accessor("imageWidth") int eap$getImageWidth();
@Accessor("imageHeight") int eap$getImageHeight();
}

View File

@ -1,19 +1,18 @@
package com.extendedae_plus.mixin.accessor;
import java.util.List;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.client.gui.components.Renderable;
import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.client.gui.screens.Screen;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import java.util.List;
@Mixin(Screen.class)
public interface ScreenAccessor {
@Accessor("renderables")
List<Renderable> extendedae_plus$getRenderables();
List<Renderable> eap$getRenderables();
@Accessor("children")
List<GuiEventListener> extendedae_plus$getChildren();
List<GuiEventListener> eap$getChildren();
}

View File

@ -1,14 +1,13 @@
package com.extendedae_plus.mixin.accessor;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
import net.minecraft.client.gui.components.Renderable;
import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.client.gui.screens.Screen;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
@Mixin(Screen.class)
public interface ScreenInvoker {
@Invoker("addRenderableWidget")
<W extends GuiEventListener & Renderable> W extendedae_plus$invokeAddRenderableWidget(W widget);
<W extends GuiEventListener & Renderable> W eap$invokeAddRenderableWidget(W widget);
}

View File

@ -20,6 +20,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.Map;
import java.util.function.Consumer;
import static com.extendedae_plus.util.ExtendedAELogger.LOGGER;
/**
* AE2 PatternEncodingTermMenu 增加一个通用动作持有者实现接收 EPP CGenericPacket 动作
* 注册动作 "upload_to_matrix"仅上传合成图样 ExtendedAE 装配矩阵
@ -28,7 +29,7 @@ import java.util.function.Consumer;
public abstract class ContainerPatternEncodingTermMenuMixin implements IActionHolder {
@Unique
private final Map<String, Consumer<Paras>> actions = createHolder();
private final Map<String, Consumer<Paras>> eap$actions = createHolder();
@Unique
private Player epp$player;
@ -37,7 +38,7 @@ public abstract class ContainerPatternEncodingTermMenuMixin implements IActionHo
private RestrictedInputSlot encodedPatternSlot;
@Unique
private void epp$scheduleUploadWithRetry(ServerPlayer sp, PatternEncodingTermMenu menu, int attemptsLeft) {
private void eap$scheduleUploadWithRetry(ServerPlayer sp, PatternEncodingTermMenu menu, int attemptsLeft) {
sp.server.execute(() -> {
try {
if (attemptsLeft < 0) {
@ -49,26 +50,25 @@ public abstract class ContainerPatternEncodingTermMenuMixin implements IActionHo
} else {
// 槽位可能尚未同步到位继续下一 tick 重试
if (attemptsLeft > 0) {
epp$scheduleUploadWithRetry(sp, menu, attemptsLeft - 1);
} else {
eap$scheduleUploadWithRetry(sp, menu, attemptsLeft - 1);
}
}
} catch (Throwable t) {
LOGGER.error("Error uploading pattern to matrix", t);
}
});
}
// AE2 终端主构造PatternEncodingTermMenu(int id, Inventory ip, IPatternTerminalMenuHost host)
@Inject(method = "<init>(ILnet/minecraft/world/entity/player/Inventory;Lappeng/helpers/IPatternTerminalMenuHost;)V", at = @At("TAIL"), remap = false)
private void epp$ctorA(int id, net.minecraft.world.entity.player.Inventory ip, appeng.helpers.IPatternTerminalMenuHost host, CallbackInfo ci) {
private void eap$ctorA(int id, net.minecraft.world.entity.player.Inventory ip, appeng.helpers.IPatternTerminalMenuHost host, CallbackInfo ci) {
this.epp$player = ip.player;
// 不再注册任何上传相关动作
}
// AE2 另一个构造PatternEncodingTermMenu(MenuType, int, Inventory, IPatternTerminalMenuHost, boolean)
@Inject(method = "<init>(Lnet/minecraft/world/inventory/MenuType;ILnet/minecraft/world/entity/player/Inventory;Lappeng/helpers/IPatternTerminalMenuHost;Z)V", at = @At("TAIL"), remap = false)
private void epp$ctorB(net.minecraft.world.inventory.MenuType<?> menuType, int id, net.minecraft.world.entity.player.Inventory ip, appeng.helpers.IPatternTerminalMenuHost host, boolean bindInventory, CallbackInfo ci) {
private void eap$ctorB(net.minecraft.world.inventory.MenuType<?> menuType, int id, net.minecraft.world.entity.player.Inventory ip, appeng.helpers.IPatternTerminalMenuHost host, boolean bindInventory, CallbackInfo ci) {
this.epp$player = ip.player;
// 不再注册任何上传相关动作
}
@ -76,12 +76,12 @@ public abstract class ContainerPatternEncodingTermMenuMixin implements IActionHo
@NotNull
@Override
public Map<String, Consumer<Paras>> getActionMap() {
return this.actions;
return this.eap$actions;
}
// 服务器端 encode() 执行完毕后如果已编码槽位存在样板且当前为合成模式则上传到装配矩阵
@Inject(method = "encode", at = @At("TAIL"), remap = false)
private void epp$serverUploadAfterEncode(CallbackInfo ci) {
private void eap$serverUploadAfterEncode(CallbackInfo ci) {
try {
if (!(this.epp$player instanceof ServerPlayer sp)) {
return; // 仅服务器执行
@ -104,10 +104,11 @@ public abstract class ContainerPatternEncodingTermMenuMixin implements IActionHo
sp.server.execute(() -> {
try {
ExtendedAEPatternUploadUtil.uploadFromEncodingMenuToMatrix(sp, menu);
} catch (Throwable t) {
} catch (Throwable ignored) {
}
});
} catch (Throwable t) {
LOGGER.error("Error uploading pattern to matrix", t);
}
}
}

View File

@ -22,12 +22,12 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
public abstract class MEStorageMenuMixin {
@Unique
private boolean extendedae_plus$settingsMirrored = false;
private boolean eap$settingsMirrored = false;
@Inject(method = "broadcastChanges", at = @At("HEAD"))
private void extendedae_plus$mirrorServerSettingsToClient(CallbackInfo ci) {
private void eap$mirrorServerSettingsToClient(CallbackInfo ci) {
var self = (MEStorageMenu) (Object) this;
if (this.extendedae_plus$settingsMirrored) {
if (this.eap$settingsMirrored) {
return;
}
try {
@ -50,30 +50,29 @@ public abstract class MEStorageMenuMixin {
if (!clientHasSetting) {
try {
Object serverValue = server.getSetting(setting);
Object placeholder = extendedae_plus$chooseDifferentEnumValue(serverValue);
Object placeholder = eap$chooseDifferentEnumValue(serverValue);
if (placeholder == null) {
// 若无法选择不同的占位值例如只有一个枚举常量则退回服务端值
placeholder = serverValue;
}
// 使用辅助方法统一进行受检的泛型转换后再注册
extendedae_plus$registerSettingCompat(client, setting, placeholder);
eap$registerSettingCompat(client, setting, placeholder);
} catch (Throwable ignore) {
// 防御不让异常影响主流程
}
}
}
this.extendedae_plus$settingsMirrored = true;
this.eap$settingsMirrored = true;
} catch (Throwable t) {
// 防御绝不让同步失败导致崩溃
}
}
@Unique
private Object extendedae_plus$chooseDifferentEnumValue(Object serverValue) {
private Object eap$chooseDifferentEnumValue(Object serverValue) {
if (!(serverValue instanceof Enum<?> sv)) {
return null;
}
@SuppressWarnings("unchecked")
Class<? extends Enum<?>> enumClass = sv.getDeclaringClass();
Object[] constants = enumClass.getEnumConstants();
if (constants == null || constants.length == 0) {
@ -89,7 +88,7 @@ public abstract class MEStorageMenuMixin {
@Unique
@SuppressWarnings({"unchecked", "rawtypes"})
private static <T extends Enum<T>> void extendedae_plus$registerSettingCompat(
private static <T extends Enum<T>> void eap$registerSettingCompat(
IConfigManager client, Setting<?> setting, Object value) {
// 前置校验仅处理枚举类型的设置值
if (!(value instanceof Enum<?>)) {

View File

@ -16,6 +16,7 @@ import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.inventory.MenuType;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@ -24,14 +25,14 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
public abstract class PatternEncodingTermMenuMixin {
// 防止重复执行
@org.spongepowered.asm.mixin.Unique
private boolean extendedae_plus$blankAutoFilled = false;
@Unique
private boolean eap$blankAutoFilled = false;
@Shadow
private RestrictedInputSlot blankPatternSlot;
@org.spongepowered.asm.mixin.Unique
private void extendedae_plus$tryFill(IPatternTerminalMenuHost host, Inventory ip) {
@Unique
private void eap$tryFill(IPatternTerminalMenuHost host, Inventory ip) {
try {
var self = (PatternEncodingTermMenu) (Object) this;
var player = ip.player;
@ -87,22 +88,22 @@ public abstract class PatternEncodingTermMenuMixin {
@Inject(method = "<init>(Lnet/minecraft/world/inventory/MenuType;ILnet/minecraft/world/entity/player/Inventory;Lappeng/helpers/IPatternTerminalMenuHost;Z)V",
at = @At("TAIL"))
private void extendedae_plus$autoFillBlankPattern(MenuType<?> menuType, int id, Inventory ip,
IPatternTerminalMenuHost host, boolean bindInventory,
CallbackInfo ci) {
extendedae_plus$tryFill(host, ip);
private void eap$autoFillBlankPattern(MenuType<?> menuType, int id, Inventory ip,
IPatternTerminalMenuHost host, boolean bindInventory,
CallbackInfo ci) {
eap$tryFill(host, ip);
}
@Inject(method = "<init>(ILnet/minecraft/world/entity/player/Inventory;Lappeng/helpers/IPatternTerminalMenuHost;)V",
at = @At("TAIL"))
private void extendedae_plus$autoFillCtor3(int id, Inventory ip, IPatternTerminalMenuHost host, CallbackInfo ci) {
extendedae_plus$tryFill(host, ip);
private void eap$autoFillCtor3(int id, Inventory ip, IPatternTerminalMenuHost host, CallbackInfo ci) {
eap$tryFill(host, ip);
}
// 在首次 broadcastChanges 后再尝试一次避免构造时网络未激活
@Inject(method = "broadcastChanges", at = @At("TAIL"))
private void extendedae_plus$retryFillAfterPower(CallbackInfo ci) {
if (this.extendedae_plus$blankAutoFilled) {
private void eap$retryFillAfterPower(CallbackInfo ci) {
if (this.eap$blankAutoFilled) {
return;
}
// 仅在服务器端执行
@ -127,7 +128,7 @@ public abstract class PatternEncodingTermMenuMixin {
int space = Math.max(0, limit - current.getCount());
space = Math.min(space, AEItems.BLANK_PATTERN.asItem().getMaxStackSize());
if (space <= 0) {
this.extendedae_plus$blankAutoFilled = true;
this.eap$blankAutoFilled = true;
return;
}
@ -149,6 +150,6 @@ public abstract class PatternEncodingTermMenuMixin {
if (leftover > 0) {
StorageHelper.poweredInsert(power, storage, blankKey, leftover, self.getActionSource());
}
this.extendedae_plus$blankAutoFilled = true;
this.eap$blankAutoFilled = true;
}
}

View File

@ -30,19 +30,19 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
public abstract class PatternEncodingTermScreenMixin<T extends AEBaseMenu> {
@Unique
private IconButton extendedae_plus$uploadBtn;
private IconButton eap$uploadBtn;
@Inject(method = "init", at = @At("TAIL"))
private void extendedae_plus$addUploadButton(CallbackInfo ci) {
private void eap$addUploadButton(CallbackInfo ci) {
// 仅在图样编码终端界面中添加按钮
if (!(((Object) this) instanceof PatternEncodingTermScreen)) {
return;
}
// 复用已存在的按钮实例避免重复创建
if (extendedae_plus$uploadBtn == null) {
extendedae_plus$uploadBtn = new IconButton(btn -> ModNetwork.CHANNEL
if (eap$uploadBtn == null) {
eap$uploadBtn = new IconButton(btn -> ModNetwork.CHANNEL
.sendToServer(new com.extendedae_plus.network.RequestProvidersListC2SPacket())) {
private final float extendedae_plus$scale = 0.75f; // 12x12
private final float eap$scale = 0.75f; // 12x12
@Override
protected Icon getIcon() {
@ -60,8 +60,8 @@ public abstract class PatternEncodingTermScreenMixin<T extends AEBaseMenu> {
}
// 动态更新宽高用于聚焦边框/命中框
this.width = Math.round(16 * extendedae_plus$scale);
this.height = Math.round(16 * extendedae_plus$scale);
this.width = Math.round(16 * eap$scale);
this.height = Math.round(16 * eap$scale);
com.mojang.blaze3d.systems.RenderSystem.disableDepthTest();
com.mojang.blaze3d.systems.RenderSystem.enableBlend();
@ -76,7 +76,7 @@ public abstract class PatternEncodingTermScreenMixin<T extends AEBaseMenu> {
var pose = guiGraphics.pose();
pose.pushPose();
pose.translate(getX(), getY(), 0.0F);
pose.scale(extendedae_plus$scale, extendedae_plus$scale, 1.f);
pose.scale(eap$scale, eap$scale, 1.f);
if (!this.isDisableBackground()) {
Icon.TOOLBAR_BUTTON_BACKGROUND.getBlitter().dest(0, 0).blit(guiGraphics);
}
@ -89,20 +89,20 @@ public abstract class PatternEncodingTermScreenMixin<T extends AEBaseMenu> {
@Override
public Rect2i getTooltipArea() {
return new Rect2i(getX(), getY(), Math.round(16 * extendedae_plus$scale), Math.round(16 * extendedae_plus$scale));
return new Rect2i(getX(), getY(), Math.round(16 * eap$scale), Math.round(16 * eap$scale));
}
};
extendedae_plus$uploadBtn.setTooltip(Tooltip.create(Component.translatable("extendedae_plus.button.choose_provider")));
eap$uploadBtn.setTooltip(Tooltip.create(Component.translatable("extendedae_plus.button.choose_provider")));
}
// 解析 encodePattern 的样式位置
try {
ScreenStyle style = ((AEBaseScreenAccessor<?>) (Object) this).extendedae_plus$getStyle();
ScreenStyle style = ((AEBaseScreenAccessor<?>) (Object) this).eap$getStyle();
WidgetStyle ws = style.getWidget("encodePattern");
int leftPos = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getLeftPos();
int topPos = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getTopPos();
int imageWidth = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getImageWidth();
int imageHeight = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getImageHeight();
int leftPos = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getLeftPos();
int topPos = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getTopPos();
int imageWidth = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getImageWidth();
int imageHeight = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getImageHeight();
Rect2i bounds = new Rect2i(leftPos, topPos, imageWidth, imageHeight);
var pos = ws.resolve(bounds);
int baseW = ws.getWidth() > 0 ? ws.getWidth() : 16;
@ -110,79 +110,79 @@ public abstract class PatternEncodingTermScreenMixin<T extends AEBaseMenu> {
int targetW = Math.max(10, Math.round(baseW * 0.75f));
int targetH = Math.max(10, Math.round(baseH * 0.75f));
// 缩小为原尺寸的 0.75稍微变大于 8x8
extendedae_plus$uploadBtn.setWidth(targetW);
extendedae_plus$uploadBtn.setHeight(targetH);
eap$uploadBtn.setWidth(targetW);
eap$uploadBtn.setHeight(targetH);
// 仍位于其左侧但整体向右微移减小间距 2px
extendedae_plus$uploadBtn.setX(pos.getX() - targetW); // 原为 -targetW - 2再右移 2px
extendedae_plus$uploadBtn.setY(pos.getY());
eap$uploadBtn.setX(pos.getX() - targetW); // 原为 -targetW - 2再右移 2px
eap$uploadBtn.setY(pos.getY());
} catch (Throwable t) {
// 回退放在界面右侧大致位置避免不可见
extendedae_plus$uploadBtn.setWidth(12);
extendedae_plus$uploadBtn.setHeight(12);
int leftPos = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getLeftPos();
int topPos = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getTopPos();
int imageWidth = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getImageWidth();
extendedae_plus$uploadBtn.setX(leftPos + imageWidth - 12 - 8 + 2); // 向右微移 2px
extendedae_plus$uploadBtn.setY(topPos + 88);
eap$uploadBtn.setWidth(12);
eap$uploadBtn.setHeight(12);
int leftPos = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getLeftPos();
int topPos = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getTopPos();
int imageWidth = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getImageWidth();
eap$uploadBtn.setX(leftPos + imageWidth - 12 - 8 + 2); // 向右微移 2px
eap$uploadBtn.setY(topPos + 88);
}
// 直接向 renderables / children 列表添加避免依赖受保护方法
var accessor = (ScreenAccessor) (Object) this;
var renderables = accessor.extendedae_plus$getRenderables();
var children = accessor.extendedae_plus$getChildren();
if (!renderables.contains(extendedae_plus$uploadBtn)) {
renderables.add(extendedae_plus$uploadBtn);
var renderables = accessor.eap$getRenderables();
var children = accessor.eap$getChildren();
if (!renderables.contains(eap$uploadBtn)) {
renderables.add(eap$uploadBtn);
}
if (!children.contains(extendedae_plus$uploadBtn)) {
children.add(extendedae_plus$uploadBtn);
if (!children.contains(eap$uploadBtn)) {
children.add(eap$uploadBtn);
}
}
@Inject(method = "containerTick", at = @At("TAIL"))
private void extendedae_plus$ensureUploadButton(CallbackInfo ci) {
private void eap$ensureUploadButton(CallbackInfo ci) {
if (!(((Object) this) instanceof PatternEncodingTermScreen)) {
return;
}
if (extendedae_plus$uploadBtn == null) {
if (eap$uploadBtn == null) {
return;
}
var renderables2 = ((ScreenAccessor) (Object) this).extendedae_plus$getRenderables();
if (!renderables2.contains(extendedae_plus$uploadBtn)) {
var renderables2 = ((ScreenAccessor) (Object) this).eap$getRenderables();
if (!renderables2.contains(eap$uploadBtn)) {
// 被其它模组清空/替换后重新计算一次位置并补回
try {
ScreenStyle style = ((AEBaseScreenAccessor<?>) (Object) this).extendedae_plus$getStyle();
ScreenStyle style = ((AEBaseScreenAccessor<?>) (Object) this).eap$getStyle();
WidgetStyle ws = style.getWidget("encodePattern");
int leftPos = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getLeftPos();
int topPos = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getTopPos();
int imageWidth = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getImageWidth();
int imageHeight = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getImageHeight();
int leftPos = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getLeftPos();
int topPos = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getTopPos();
int imageWidth = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getImageWidth();
int imageHeight = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getImageHeight();
Rect2i bounds = new Rect2i(leftPos, topPos, imageWidth, imageHeight);
var pos = ws.resolve(bounds);
int baseW = ws.getWidth() > 0 ? ws.getWidth() : 16;
int baseH = ws.getHeight() > 0 ? ws.getHeight() : 16;
int targetW = Math.max(10, Math.round(baseW * 0.75f));
int targetH = Math.max(10, Math.round(baseH * 0.75f));
extendedae_plus$uploadBtn.setWidth(targetW);
extendedae_plus$uploadBtn.setHeight(targetH);
extendedae_plus$uploadBtn.setX(pos.getX() - targetW); // 原为 -targetW - 2再右移 2px
extendedae_plus$uploadBtn.setY(pos.getY());
eap$uploadBtn.setWidth(targetW);
eap$uploadBtn.setHeight(targetH);
eap$uploadBtn.setX(pos.getX() - targetW); // 原为 -targetW - 2再右移 2px
eap$uploadBtn.setY(pos.getY());
} catch (Throwable t) {
int leftPos = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getLeftPos();
int topPos = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getTopPos();
int imageWidth = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getImageWidth();
extendedae_plus$uploadBtn.setWidth(12);
extendedae_plus$uploadBtn.setHeight(12);
extendedae_plus$uploadBtn.setX(leftPos + imageWidth - 12 - 8 + 2);
extendedae_plus$uploadBtn.setY(topPos + 88);
int leftPos = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getLeftPos();
int topPos = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getTopPos();
int imageWidth = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getImageWidth();
eap$uploadBtn.setWidth(12);
eap$uploadBtn.setHeight(12);
eap$uploadBtn.setX(leftPos + imageWidth - 12 - 8 + 2);
eap$uploadBtn.setY(topPos + 88);
}
var accessor2 = (ScreenAccessor) (Object) this;
var r = accessor2.extendedae_plus$getRenderables();
var c = accessor2.extendedae_plus$getChildren();
if (!r.contains(extendedae_plus$uploadBtn)) {
r.add(extendedae_plus$uploadBtn);
var r = accessor2.eap$getRenderables();
var c = accessor2.eap$getChildren();
if (!r.contains(eap$uploadBtn)) {
r.add(eap$uploadBtn);
}
if (!c.contains(extendedae_plus$uploadBtn)) {
c.add(extendedae_plus$uploadBtn);
if (!c.contains(eap$uploadBtn)) {
c.add(eap$uploadBtn);
}
}
}

View File

@ -1,13 +1,12 @@
package com.extendedae_plus.mixin.ae2;
import java.util.Collections;
import appeng.api.crafting.IPatternDetails;
import appeng.api.crafting.IPatternDetails.IInput;
import appeng.api.stacks.AEKey;
import appeng.api.stacks.GenericStack;
import appeng.helpers.patternprovider.PatternProviderLogic;
import appeng.helpers.patternprovider.PatternProviderTarget;
import appeng.api.stacks.GenericStack;
import com.extendedae_plus.api.AdvancedBlockingHolder;
import net.minecraft.nbt.CompoundTag;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
@ -16,7 +15,7 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import com.extendedae_plus.api.AdvancedBlockingHolder;
import java.util.Collections;
@Mixin(PatternProviderLogic.class)
public class PatternProviderLogicAdvancedMixin implements AdvancedBlockingHolder {
@ -24,34 +23,33 @@ public class PatternProviderLogicAdvancedMixin implements AdvancedBlockingHolder
private static final String EPP_ADV_BLOCKING_KEY = "epp_advanced_blocking";
@Unique
private boolean epp$advancedBlocking = false;
private boolean eap$advancedBlocking = false;
@Override
public boolean ext$getAdvancedBlocking() {
return epp$advancedBlocking;
public boolean eap$getAdvancedBlocking() {
return eap$advancedBlocking;
}
@Override
public void ext$setAdvancedBlocking(boolean value) {
this.epp$advancedBlocking = value;
public void eap$setAdvancedBlocking(boolean value) {
this.eap$advancedBlocking = value;
}
@Inject(method = "writeToNBT", at = @At("TAIL"), remap = false)
private void epp$writeAdvancedToNbt(CompoundTag tag, CallbackInfo ci) {
tag.putBoolean(EPP_ADV_BLOCKING_KEY, this.epp$advancedBlocking);
private void eap$writeAdvancedToNbt(CompoundTag tag, CallbackInfo ci) {
tag.putBoolean(EPP_ADV_BLOCKING_KEY, this.eap$advancedBlocking);
}
@Inject(method = "readFromNBT", at = @At("TAIL"), remap = false)
private void epp$readAdvancedFromNbt(CompoundTag tag, CallbackInfo ci) {
private void eap$readAdvancedFromNbt(CompoundTag tag, CallbackInfo ci) {
if (tag.contains(EPP_ADV_BLOCKING_KEY)) {
this.epp$advancedBlocking = tag.getBoolean(EPP_ADV_BLOCKING_KEY);
} else {
this.eap$advancedBlocking = tag.getBoolean(EPP_ADV_BLOCKING_KEY);
}
}
// pushPattern 重定向对 adapter.containsPatternInput(...) 的调用
@Redirect(method = "pushPattern", at = @At(value = "INVOKE", target = "Lappeng/helpers/patternprovider/PatternProviderTarget;containsPatternInput(Ljava/util/Set;)Z"), remap = false)
private boolean epp$redirectBlockingContains(PatternProviderTarget adapter,
private boolean eap$redirectBlockingContains(PatternProviderTarget adapter,
java.util.Set<AEKey> patternInputs,
IPatternDetails patternDetails,
appeng.api.stacks.KeyCounter[] inputHolder) {
@ -62,8 +60,8 @@ public class PatternProviderLogicAdvancedMixin implements AdvancedBlockingHolder
}
// 仅当高级阻挡启用时启用匹配则不阻挡
if (this.epp$advancedBlocking) {
if (epp$targetFullyMatchesPatternInputs(adapter, patternDetails)) {
if (this.eap$advancedBlocking) {
if (eap$targetFullyMatchesPatternInputs(adapter, patternDetails)) {
// 返回 false 表示不包含阻挡关键物从而不触发 continue允许发配
return false;
}
@ -73,7 +71,7 @@ public class PatternProviderLogicAdvancedMixin implements AdvancedBlockingHolder
}
@Unique
private boolean epp$targetFullyMatchesPatternInputs(PatternProviderTarget adapter, IPatternDetails patternDetails) {
private boolean eap$targetFullyMatchesPatternInputs(PatternProviderTarget adapter, IPatternDetails patternDetails) {
for (IInput in : patternDetails.getInputs()) {
boolean slotMatched = false;
for (GenericStack candidate : in.getPossibleInputs()) {

View File

@ -1,20 +1,22 @@
package com.extendedae_plus.mixin.ae2;
import appeng.menu.implementations.PatternProviderMenu;
import appeng.helpers.patternprovider.PatternProviderLogic;
import appeng.menu.guisync.GuiSync;
import appeng.helpers.patternprovider.PatternProviderLogicHost;
import appeng.menu.guisync.GuiSync;
import appeng.menu.implementations.PatternProviderMenu;
import com.extendedae_plus.api.AdvancedBlockingHolder;
import com.extendedae_plus.api.PatternProviderMenuAdvancedSync;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.inventory.MenuType;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import com.extendedae_plus.api.AdvancedBlockingHolder;
import com.extendedae_plus.api.PatternProviderMenuAdvancedSync;
import static com.extendedae_plus.util.ExtendedAELogger.LOGGER;
@Mixin(PatternProviderMenu.class)
public abstract class PatternProviderMenuAdvancedMixin implements PatternProviderMenuAdvancedSync {
@ -25,58 +27,61 @@ public abstract class PatternProviderMenuAdvancedMixin implements PatternProvide
protected PatternProviderLogic logic;
// 选择一个未占用的 GUI 同步 idAE2 已用到 7这里使用 20 以避冲突
@Unique
@GuiSync(20)
public boolean eppAdvancedBlocking = false;
public boolean eap$AdvancedBlocking = false;
@Inject(method = "broadcastChanges", at = @At("HEAD"))
private void epp$syncAdvancedBlocking(CallbackInfo ci) {
private void eap$syncAdvancedBlocking(CallbackInfo ci) {
if (this.isServerSide()) {
var l = this.logic;
if (l instanceof AdvancedBlockingHolder holder) {
this.eppAdvancedBlocking = holder.ext$getAdvancedBlocking();
this.eap$AdvancedBlocking = holder.eap$getAdvancedBlocking();
}
}
}
@Inject(method = "broadcastChanges", at = @At("TAIL"))
private void epp$syncAdvancedBlockingTail(CallbackInfo ci) {
private void eap$syncAdvancedBlockingTail(CallbackInfo ci) {
}
// 构造器尾注入public ctor
@Inject(method = "<init>(ILnet/minecraft/world/entity/player/Inventory;Lappeng/helpers/patternprovider/PatternProviderLogicHost;)V", at = @At("TAIL"))
private void epp$initAdvancedSync_Public(int id, Inventory playerInventory, PatternProviderLogicHost host, CallbackInfo ci) {
private void eap$initAdvancedSync_Public(int id, Inventory playerInventory, PatternProviderLogicHost host, CallbackInfo ci) {
try {
var l = this.logic;
if (l instanceof AdvancedBlockingHolder holder) {
this.eppAdvancedBlocking = holder.ext$getAdvancedBlocking();
this.eap$AdvancedBlocking = holder.eap$getAdvancedBlocking();
}
} catch (Throwable t) {
LOGGER.error("Error initializing advanced sync", t);
}
}
// 构造器尾注入protected ctor with MenuType
@Inject(method = "<init>(Lnet/minecraft/world/inventory/MenuType;ILnet/minecraft/world/entity/player/Inventory;Lappeng/helpers/patternprovider/PatternProviderLogicHost;)V", at = @At("TAIL"))
private void epp$initAdvancedSync_Protected(MenuType<? extends PatternProviderMenu> menuType, int id, Inventory playerInventory, PatternProviderLogicHost host, CallbackInfo ci) {
private void eap$initAdvancedSync_Protected(MenuType<? extends PatternProviderMenu> menuType, int id, Inventory playerInventory, PatternProviderLogicHost host, CallbackInfo ci) {
try {
var l = this.logic;
if (l instanceof AdvancedBlockingHolder holder) {
this.eppAdvancedBlocking = holder.ext$getAdvancedBlocking();
this.eap$AdvancedBlocking = holder.eap$getAdvancedBlocking();
}
} catch (Throwable t) {
LOGGER.error("Error initializing advanced sync", t);
}
}
@Override
public boolean ext$getAdvancedBlockingSynced() {
return this.eppAdvancedBlocking;
public boolean eap$getAdvancedBlockingSynced() {
return this.eap$AdvancedBlocking;
}
// 调试 Screen 每帧读取这些 getter 时打印验证 Mixin 是否生效
@Inject(method = "getBlockingMode", at = @At("HEAD"), remap = false)
private void epp$debug_getBlockingMode(CallbackInfoReturnable<?> cir) {
private void eap$debug_getBlockingMode(CallbackInfoReturnable<?> cir) {
}
@Inject(method = "getShowInAccessTerminal", at = @At("HEAD"), remap = false)
private void epp$debug_getShowInAccessTerminal(CallbackInfoReturnable<?> cir) {
private void eap$debug_getShowInAccessTerminal(CallbackInfoReturnable<?> cir) {
}
}

View File

@ -20,6 +20,7 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import static com.extendedae_plus.util.ExtendedAELogger.LOGGER;
/**
* AE2 原版样板供应器界面添加高级阻挡模式按钮仅客户端UI反馈
* - 位于左侧工具栏
@ -30,40 +31,41 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
public abstract class PatternProviderScreenMixin<C extends PatternProviderMenu> extends AEBaseScreen<C> {
@Unique
private ToggleButton eppAdvancedBlockingToggle;
private ToggleButton eap$AdvancedBlockingToggle;
@Unique
private boolean eppAdvancedBlockingEnabled = false;
private boolean eap$AdvancedBlockingEnabled = false;
@Unique
private String eppProviderKey = null;
private String eap$ProviderKey = null;
public PatternProviderScreenMixin(C menu, Inventory playerInventory, Component title, ScreenStyle style) {
super(menu, playerInventory, title, style);
}
@Inject(method = "<init>", at = @At("RETURN"))
private void epp$initAdvancedBlocking(C menu, Inventory playerInventory, Component title, ScreenStyle style, CallbackInfo ci) {
private void eap$initAdvancedBlocking(C menu, Inventory playerInventory, Component title, ScreenStyle style, CallbackInfo ci) {
// 计算供应器唯一键维度ID + 方块坐标
try {
var logic = ((PatternProviderMenuAdvancedAccessor) menu).ext$logic();
var host = ((PatternProviderLogicAccessor) logic).ext$host();
var logic = ((PatternProviderMenuAdvancedAccessor) menu).eap$logic();
var host = ((PatternProviderLogicAccessor) logic).eap$host();
var be = host.getBlockEntity();
var level = be.getLevel();
String dimId = level.dimension().location().toString();
long posLong = be.getBlockPos().asLong();
this.eppProviderKey = ClientAdvancedBlockingState.key(dimId, posLong);
this.eap$ProviderKey = ClientAdvancedBlockingState.key(dimId, posLong);
} catch (Throwable t) {
LOGGER.error("Error initializing advanced sync", t);
}
// 优先使用该供应器最近一次 S2C 状态否则回退读取 @GuiSync 初始化
if (this.eppProviderKey != null && ClientAdvancedBlockingState.has(this.eppProviderKey)) {
this.eppAdvancedBlockingEnabled = ClientAdvancedBlockingState.get(this.eppProviderKey);
if (this.eap$ProviderKey != null && ClientAdvancedBlockingState.has(this.eap$ProviderKey)) {
this.eap$AdvancedBlockingEnabled = ClientAdvancedBlockingState.get(this.eap$ProviderKey);
} else if (menu instanceof PatternProviderMenuAdvancedSync sync) {
this.eppAdvancedBlockingEnabled = sync.ext$getAdvancedBlockingSynced();
this.eap$AdvancedBlockingEnabled = sync.eap$getAdvancedBlockingSynced();
}
// 使用 ToggleButton 以便在 YES/NO 图标与提示之间动态切换
this.eppAdvancedBlockingToggle = new ToggleButton(
this.eap$AdvancedBlockingToggle = new ToggleButton(
Icon.BLOCKING_MODE_YES,
Icon.BLOCKING_MODE_NO,
// 提示文本名称与说明
@ -71,67 +73,67 @@ public abstract class PatternProviderScreenMixin<C extends PatternProviderMenu>
Component.literal("高级阻挡模式:当开启时,执行更严格的阻挡判定"),
(state) -> {
// 客户端立即反馈切换图标/提示
this.eppAdvancedBlockingEnabled = state;
this.eppAdvancedBlockingToggle.setState(state);
this.eap$AdvancedBlockingEnabled = state;
this.eap$AdvancedBlockingToggle.setState(state);
// 发送 C2S 切换请求
ModNetwork.CHANNEL.sendToServer(new ToggleAdvancedBlockingC2SPacket());
// 可根据状态调整提示文本演示性开启/关闭不同第二行
if (state) {
this.eppAdvancedBlockingToggle.setTooltipOn(java.util.List.of(
this.eap$AdvancedBlockingToggle.setTooltipOn(java.util.List.of(
Component.literal("高级阻挡模式"),
Component.literal("高级阻挡模式:已开启")));
this.eppAdvancedBlockingToggle.setTooltipOff(java.util.List.of(
this.eap$AdvancedBlockingToggle.setTooltipOff(java.util.List.of(
Component.literal("高级阻挡模式"),
Component.literal("高级阻挡模式:已开启")));
} else {
this.eppAdvancedBlockingToggle.setTooltipOn(java.util.List.of(
this.eap$AdvancedBlockingToggle.setTooltipOn(java.util.List.of(
Component.literal("高级阻挡模式"),
Component.literal("高级阻挡模式:已关闭")));
this.eppAdvancedBlockingToggle.setTooltipOff(java.util.List.of(
this.eap$AdvancedBlockingToggle.setTooltipOff(java.util.List.of(
Component.literal("高级阻挡模式"),
Component.literal("高级阻挡模式:已关闭")));
}
}
);
this.eppAdvancedBlockingToggle.setState(this.eppAdvancedBlockingEnabled);
this.eap$AdvancedBlockingToggle.setState(this.eap$AdvancedBlockingEnabled);
// 初始 tooltip
this.eppAdvancedBlockingToggle.setTooltipOn(java.util.List.of(
this.eap$AdvancedBlockingToggle.setTooltipOn(java.util.List.of(
Component.literal("高级阻挡模式"),
Component.literal(this.eppAdvancedBlockingEnabled ? "高级阻挡模式:已开启" : "高级阻挡模式:已关闭")
Component.literal(this.eap$AdvancedBlockingEnabled ? "高级阻挡模式:已开启" : "高级阻挡模式:已关闭")
));
this.eppAdvancedBlockingToggle.setTooltipOff(java.util.List.of(
this.eap$AdvancedBlockingToggle.setTooltipOff(java.util.List.of(
Component.literal("高级阻挡模式"),
Component.literal(this.eppAdvancedBlockingEnabled ? "高级阻挡模式:已开启" : "高级阻挡模式:已关闭")
Component.literal(this.eap$AdvancedBlockingEnabled ? "高级阻挡模式:已开启" : "高级阻挡模式:已关闭")
));
this.addToLeftToolbar(this.eppAdvancedBlockingToggle);
this.addToLeftToolbar(this.eap$AdvancedBlockingToggle);
}
// 每帧刷新从菜单同步布尔值保持按钮状态一致
@Inject(method = "updateBeforeRender", at = @At("TAIL"), remap = false)
private void epp$updateAdvancedBlocking(CallbackInfo ci) {
private void eap$updateAdvancedBlocking(CallbackInfo ci) {
// 打印一条轻量 tick 日志以确认该方法被调用频繁输出可在验证后移除
// System.out.println("[EPP][CLIENT] updateBeforeRender tick, local=" + this.eppAdvancedBlockingEnabled);
if (this.eppAdvancedBlockingToggle == null) return;
if (this.eap$AdvancedBlockingToggle == null) return;
boolean desired = this.eppAdvancedBlockingEnabled;
boolean desired = this.eap$AdvancedBlockingEnabled;
// 优先使用该供应器最近一次 S2C
if (this.eppProviderKey != null && ClientAdvancedBlockingState.has(this.eppProviderKey)) {
desired = ClientAdvancedBlockingState.get(this.eppProviderKey);
if (this.eap$ProviderKey != null && ClientAdvancedBlockingState.has(this.eap$ProviderKey)) {
desired = ClientAdvancedBlockingState.get(this.eap$ProviderKey);
} else if (this.menu instanceof PatternProviderMenuAdvancedSync sync) {
desired = sync.ext$getAdvancedBlockingSynced();
desired = sync.eap$getAdvancedBlockingSynced();
}
if (desired != this.eppAdvancedBlockingEnabled) {
this.eppAdvancedBlockingEnabled = desired;
this.eppAdvancedBlockingToggle.setState(desired);
if (desired != this.eap$AdvancedBlockingEnabled) {
this.eap$AdvancedBlockingEnabled = desired;
this.eap$AdvancedBlockingToggle.setState(desired);
// 同步 tooltip 二行提示
this.eppAdvancedBlockingToggle.setTooltipOn(java.util.List.of(
this.eap$AdvancedBlockingToggle.setTooltipOn(java.util.List.of(
Component.literal("高级阻挡模式"),
Component.literal(desired ? "高级阻挡模式:已开启" : "高级阻挡模式:已关闭")
));
this.eppAdvancedBlockingToggle.setTooltipOff(java.util.List.of(
this.eap$AdvancedBlockingToggle.setTooltipOff(java.util.List.of(
Component.literal("高级阻挡模式"),
Component.literal(desired ? "高级阻挡模式:已开启" : "高级阻挡模式:已关闭")
));

View File

@ -23,8 +23,6 @@ import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.fml.ModList;
import org.lwjgl.glfw.GLFW;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
@ -38,6 +36,8 @@ import java.lang.reflect.Method;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean;
import static com.extendedae_plus.util.ExtendedAELogger.LOGGER;
/**
* AE2 石英切割刀添加潜行 + 右键 指向世界中的方块/部件如线缆复制其名称到剪贴板
* <p>
@ -48,8 +48,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
*/
@Mixin(value = QuartzCuttingKnifeItem.class)
public abstract class QuartzCuttingKnifeItemMixin {
private static final Logger LOGGER = LoggerFactory.getLogger("ExtendedAEPlus");
@Inject(method = "use", at = @At("HEAD"), cancellable = true)
private void eap$copyNameOnShiftRightClick(Level level, Player player, InteractionHand hand,
CallbackInfoReturnable<InteractionResultHolder<ItemStack>> cir) {

View File

@ -9,5 +9,5 @@ import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(value = AEBaseScreen.class, remap = false)
public interface AEBaseScreenAccessor<T extends AEBaseMenu> {
@Accessor(value = "style", remap = false)
ScreenStyle extendedae_plus$getStyle();
ScreenStyle eap$getStyle();
}

View File

@ -9,8 +9,8 @@ import org.spongepowered.asm.mixin.gen.Invoker;
@Mixin(value = MEStorageScreen.class, remap = false)
public interface MEStorageScreenAccessor {
@Accessor("searchField")
AETextField ext$getSearchField();
AETextField eap$getSearchField();
@Invoker("setSearchText")
void ext$setSearchText(String text);
void eap$setSearchText(String text);
}

View File

@ -8,8 +8,8 @@ import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(PatternEncodingTermMenu.class)
public interface PatternEncodingTermMenuAccessor {
@Accessor("encodedPatternSlot")
RestrictedInputSlot epp$getEncodedPatternSlot();
RestrictedInputSlot eap$getEncodedPatternSlot();
@Accessor("blankPatternSlot")
RestrictedInputSlot epp$getBlankPatternSlot();
RestrictedInputSlot eap$getBlankPatternSlot();
}

View File

@ -8,5 +8,5 @@ import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(PatternProviderLogic.class)
public interface PatternProviderLogicAccessor {
@Accessor("host")
PatternProviderLogicHost ext$host();
PatternProviderLogicHost eap$host();
}

View File

@ -10,5 +10,5 @@ import java.util.Set;
@Mixin(PatternProviderLogic.class)
public interface PatternProviderLogicPatternInputsAccessor {
@Accessor("patternInputs")
Set<AEKey> ext$patternInputs();
Set<AEKey> eap$patternInputs();
}

View File

@ -8,5 +8,5 @@ import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(PatternProviderMenu.class)
public interface PatternProviderMenuAdvancedAccessor {
@Accessor("logic")
PatternProviderLogic ext$logic();
PatternProviderLogic eap$logic();
}

View File

@ -26,23 +26,23 @@ import java.util.function.Consumer;
public abstract class ContainerUWirelessExPatternTerminalMixin implements IActionHolder {
@Unique
private final Map<String, Consumer<Paras>> actions = createHolder();
private final Map<String, Consumer<Paras>> eap$actions = createHolder();
@Unique
private Player epp$player;
private Player eap$player;
// 明确目标构造签名<init>(int, Inventory, HostUWirelessExPAT)
@Inject(method = "<init>(ILnet/minecraft/world/entity/player/Inventory;Lcom/glodblock/github/extendedae/xmod/wt/HostUWirelessExPAT;)V", at = @At("TAIL"), remap = false)
private void init(int id, net.minecraft.world.entity.player.Inventory playerInventory, HostUWirelessExPAT host, CallbackInfo ci) {
this.epp$player = playerInventory.player;
this.eap$player = playerInventory.player;
// 注册上传动作参数顺序必须与客户端 CGenericPacket 保持一致
this.actions.put("upload", p -> {
this.eap$actions.put("upload", p -> {
try {
Object o0 = p.get(0);
Object o1 = p.get(1);
int playerSlotIndex = (o0 instanceof Number) ? ((Number) o0).intValue() : Integer.parseInt(String.valueOf(o0));
long providerId = (o1 instanceof Number) ? ((Number) o1).longValue() : Long.parseLong(String.valueOf(o1));
var sp = (ServerPlayer) this.epp$player;
var sp = (ServerPlayer) this.eap$player;
ExtendedAEPatternUploadUtil.uploadPatternToProvider(sp, playerSlotIndex, providerId);
} catch (Throwable t) {
}
@ -53,6 +53,6 @@ public abstract class ContainerUWirelessExPatternTerminalMixin implements IActio
@NotNull
@Override
public Map<String, Consumer<Paras>> getActionMap() {
return this.actions;
return this.eap$actions;
}
}

View File

@ -1,6 +0,0 @@
package com.extendedae_plus.api;
public interface AdvancedBlockingHolder {
boolean ext$getAdvancedBlocking();
void ext$setAdvancedBlocking(boolean value);
}

View File

@ -31,23 +31,23 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
@GuiSync(11451)
@Unique
public int page = 0;
public int eap$page = 0;
@Unique
public int maxPage = 0;
public int eap$maxPage = 0;
@Unique
private static final int SLOTS_PER_PAGE = 36; // 每页显示36个槽位
@Unique
private final Map<String, Consumer<Paras>> actions = createHolder();
private final Map<String, Consumer<Paras>> eap$actions = createHolder();
public ContainerExPatternProviderMixin(MenuType<? extends PatternProviderMenu> menuType, int id, Inventory playerInventory, PatternProviderLogicHost host) {
super(menuType, id, playerInventory, host);
}
@Unique
public void showPage() {
public void eap$showPage() {
List<Slot> slots = this.getSlots(SlotSemantics.ENCODED_PATTERN);
int totalSlots = slots.size();
@ -64,13 +64,9 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
for (Slot s : slots) {
int page_id = slot_id / SLOTS_PER_PAGE;
if (page_id == this.page) {
// 当前页的槽位激活
((AppEngSlot) s).setActive(true);
} else {
// 其他页的槽位隐藏
((AppEngSlot) s).setActive(false);
}
// 当前页的槽位激活
// 其他页的槽位隐藏
((AppEngSlot) s).setActive(page_id == this.eap$page);
++slot_id;
}
}
@ -78,29 +74,29 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
@Inject(method = "<init>", at = @At("TAIL"))
public void init(int id, Inventory playerInventory, PatternProviderLogicHost host, CallbackInfo ci) {
int maxSlots = this.getSlots(SlotSemantics.ENCODED_PATTERN).size();
this.maxPage = (maxSlots + SLOTS_PER_PAGE - 1) / SLOTS_PER_PAGE;
this.eap$maxPage = (maxSlots + SLOTS_PER_PAGE - 1) / SLOTS_PER_PAGE;
// 注册通用动作 CGenericPacket 分发
this.actions.put("multiply2", p -> { modifyPatterns(2, false); });
this.actions.put("divide2", p -> { modifyPatterns(2, true); });
this.actions.put("multiply5", p -> { modifyPatterns(5, false); });
this.actions.put("divide5", p -> { modifyPatterns(5, true); });
this.actions.put("multiply10",p -> { modifyPatterns(10, false);});
this.actions.put("divide10", p -> { modifyPatterns(10, true); });
this.eap$actions.put("multiply2", p -> { eap$modifyPatterns(2, false); });
this.eap$actions.put("divide2", p -> { eap$modifyPatterns(2, true); });
this.eap$actions.put("multiply5", p -> { eap$modifyPatterns(5, false); });
this.eap$actions.put("divide5", p -> { eap$modifyPatterns(5, true); });
this.eap$actions.put("multiply10", p -> { eap$modifyPatterns(10, false);});
this.eap$actions.put("divide10", p -> { eap$modifyPatterns(10, true); });
}
@Unique
public int getPage() {
return this.page;
return this.eap$page;
}
@Unique
public void setPage(int page) {
this.page = page;
this.eap$page = page;
}
@Unique
private void modifyPatterns(int scale, boolean div) {
private void eap$modifyPatterns(int scale, boolean div) {
if (scale <= 0) return;
for (var slot : this.getSlots(SlotSemantics.ENCODED_PATTERN)) {
var stack = slot.getItem();
@ -109,11 +105,11 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
if (detail instanceof AEProcessingPattern process) {
var input = process.getSparseInputs();
var output = process.getOutputs();
if (checkModify(input, scale, div) && checkModify(output, scale, div)) {
if (eap$checkModify(input, scale, div) && eap$checkModify(output, scale, div)) {
var mulInput = new GenericStack[input.length];
var mulOutput = new GenericStack[output.length];
modifyStacks(input, mulInput, scale, div);
modifyStacks(output, mulOutput, scale, div);
eap$modifyStacks(input, mulInput, scale, div);
eap$modifyStacks(output, mulOutput, scale, div);
var newPattern = PatternDetailsHelper.encodeProcessingPattern(mulInput, mulOutput);
slot.set(newPattern);
}
@ -123,7 +119,7 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
}
@Unique
private boolean checkModify(GenericStack[] stacks, int scale, boolean div) {
private boolean eap$checkModify(GenericStack[] stacks, int scale, boolean div) {
if (stacks == null) return false;
if (div) {
for (var stack : stacks) {
@ -148,7 +144,7 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
}
@Unique
private void modifyStacks(GenericStack[] src, GenericStack[] dst, int scale, boolean div) {
private void eap$modifyStacks(GenericStack[] src, GenericStack[] dst, int scale, boolean div) {
for (int i = 0; i < src.length; i++) {
var stack = src[i];
if (stack != null) {
@ -164,6 +160,6 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
@NotNull
@Override
public Map<String, Consumer<Paras>> getActionMap() {
return this.actions;
return this.eap$actions;
}
}

View File

@ -23,34 +23,34 @@ public abstract class ContainerExPatternTerminalMixin implements IActionHolder {
@GuiSync(11452)
@Unique
public boolean hidePatternSlots = false;
public boolean eap$hidePatternSlots = false;
@Unique
public boolean isHidePatternSlots() {
return this.hidePatternSlots;
return this.eap$hidePatternSlots;
}
@Unique
public void setHidePatternSlots(boolean hide) {
this.hidePatternSlots = hide;
this.eap$hidePatternSlots = hide;
}
@Unique
public void toggleHidePatternSlots() {
this.hidePatternSlots = !this.hidePatternSlots;
this.eap$hidePatternSlots = !this.eap$hidePatternSlots;
}
@Unique
private final Map<String, Consumer<Paras>> actions = createHolder();
private final Map<String, Consumer<Paras>> eap$actions = createHolder();
@Unique
private Player epp$player;
@Inject(method = "<init>", at = @At("TAIL"))
@Inject(method = "<init>*", at = @At("TAIL"))
private void init(int id, net.minecraft.world.entity.player.Inventory playerInventory, IConfigurableObject host, CallbackInfo ci) {
this.epp$player = playerInventory.player;
// 注册上传动作参数顺序必须与客户端 CGenericPacket 保持一致
this.actions.put("upload", p -> {
this.eap$actions.put("upload", p -> {
try {
Object o0 = p.get(0);
Object o1 = p.get(1);
@ -58,7 +58,7 @@ public abstract class ContainerExPatternTerminalMixin implements IActionHolder {
long providerId = (o1 instanceof Number) ? ((Number) o1).longValue() : Long.parseLong(String.valueOf(o1));
var sp = (ServerPlayer) this.epp$player;
ExtendedAEPatternUploadUtil.uploadPatternToProvider(sp, playerSlotIndex, providerId);
} catch (Throwable t) {
} catch (Throwable ignored) {
}
});
}
@ -66,6 +66,6 @@ public abstract class ContainerExPatternTerminalMixin implements IActionHolder {
@NotNull
@Override
public Map<String, Consumer<Paras>> getActionMap() {
return this.actions;
return this.eap$actions;
}
}

View File

@ -26,7 +26,7 @@ import java.util.function.Consumer;
public abstract class ContainerWirelessExPatternTerminalMixin implements IActionHolder {
@Unique
private final Map<String, Consumer<Paras>> actions = createHolder();
private final Map<String, Consumer<Paras>> eap$actions = createHolder();
@Unique
private Player epp$player;
@ -36,7 +36,7 @@ public abstract class ContainerWirelessExPatternTerminalMixin implements IAction
private void init(int id, net.minecraft.world.entity.player.Inventory playerInventory, HostWirelessExPAT host, CallbackInfo ci) {
this.epp$player = playerInventory.player;
// 注册上传动作参数顺序必须与客户端 CGenericPacket 保持一致
this.actions.put("upload", p -> {
this.eap$actions.put("upload", p -> {
try {
Object o0 = p.get(0);
Object o1 = p.get(1);
@ -44,7 +44,7 @@ public abstract class ContainerWirelessExPatternTerminalMixin implements IAction
long providerId = (o1 instanceof Number) ? ((Number) o1).longValue() : Long.parseLong(String.valueOf(o1));
var sp = (ServerPlayer) this.epp$player;
ExtendedAEPatternUploadUtil.uploadPatternToProvider(sp, playerSlotIndex, providerId);
} catch (Throwable t) {
} catch (Throwable ignored) {
}
});
}
@ -52,6 +52,6 @@ public abstract class ContainerWirelessExPatternTerminalMixin implements IAction
@NotNull
@Override
public Map<String, Consumer<Paras>> getActionMap() {
return this.actions;
return this.eap$actions;
}
}

View File

@ -30,11 +30,11 @@ import java.util.List;
public abstract class GuiExPatternProviderMixin extends PatternProviderScreen<ContainerExPatternProvider> {
@Unique
ScreenStyle screenStyle;
ScreenStyle eap$screenStyle;
// 跟踪上次屏幕尺寸处理 GUI 缩放/窗口大小变化后按钮丢失问题
private int epp_lastScreenWidth = -1;
private int epp_lastScreenHeight = -1;
@Unique private int eap$lastScreenWidth = -1;
@Unique private int eap$lastScreenHeight = -1;
// 不再使用右侧 VerticalButtonBar直接把按钮注册为独立 AE2 小部件
@ -59,7 +59,7 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen<Co
int maxPage = getMaxPage();
// 获取ae通用界面样式
int color = screenStyle.getColor(PaletteColor.DEFAULT_TEXT_COLOR).toARGB();
int color = eap$screenStyle.getColor(PaletteColor.DEFAULT_TEXT_COLOR).toARGB();
// 调整页码显示位置"样板"文字的右边
guiGraphics.drawString(font, Component.literal("" + (currentPage + 1) + "/" + maxPage + ""),
leftPos + 8 + 50, topPos + 30, color, false);
@ -104,15 +104,15 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen<Co
}
// 调整槽位位置
this.adjustSlotPositions(page);
this.eap$adjustSlotPositions(page);
} catch (Exception e) {
// 忽略反射错误
}
// 如果屏幕尺寸发生变化窗口/GUI缩放重新注册按钮避免被 Screen.init 清空
if (this.width != epp_lastScreenWidth || this.height != epp_lastScreenHeight) {
epp_lastScreenWidth = this.width;
epp_lastScreenHeight = this.height;
if (this.width != eap$lastScreenWidth || this.height != eap$lastScreenHeight) {
eap$lastScreenWidth = this.width;
eap$lastScreenHeight = this.height;
try {
if (this.divideBy2Button != null) {
this.removeWidget(this.divideBy2Button);
@ -179,7 +179,7 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen<Co
}
@Unique
private void adjustSlotPositions(int currentPage) {
private void eap$adjustSlotPositions(int currentPage) {
try {
List<Slot> slots = this.getMenu().getSlots(SlotSemantics.ENCODED_PATTERN);
int totalSlots = slots.size();
@ -274,7 +274,7 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen<Co
// 在构造器返回后初始化按钮与翻页控制
@Inject(method = "<init>", at = @At("RETURN"))
private void injectInit(ContainerExPatternProvider menu, Inventory playerInventory, Component title, ScreenStyle style, CallbackInfo ci) {
this.screenStyle = style;
this.eap$screenStyle = style;
// 保留不再打印菜单类型
// 翻页按钮仅在需要时显示
@ -418,11 +418,11 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen<Co
minecraft.player.displayClientMessage(net.minecraft.network.chat.Component.literal(message), true);
}
} catch (Exception e) {
} catch (Exception ignored) {
}
});
} catch (Exception e) {
} catch (Exception ignored) {
}
}

View File

@ -49,13 +49,13 @@ public abstract class HighlightButtonMixin {
try {
var setMethod = terminal.getClass().getMethod("setCurrentlyChoicePatternProvider", long.class);
setMethod.invoke(terminal, serverId);
} catch (Exception e) {
} catch (Exception ignored) {
}
break;
}
}
}
} catch (Exception e) {
} catch (Exception ignored) {
}
}
}

View File

@ -17,7 +17,7 @@ public abstract class PartExPatternProviderMixin {
),
index = 2
)
private int extendedae_plus$multiplyCapacity(int original) {
private int eap$multiplyCapacity(int original) {
int mult = ModConfigs.PAGE_MULTIPLIER.get();
if (mult < 1) mult = 1;
if (mult > 64) mult = 64;

View File

@ -17,7 +17,7 @@ public abstract class TileExPatternProviderMixin {
),
index = 2
)
private int extendedae_plus$multiplyCapacity(int original) {
private int eap$multiplyCapacity(int original) {
int mult = ModConfigs.PAGE_MULTIPLIER.get();
if (mult < 1) mult = 1;
if (mult > 64) mult = 64;

View File

@ -1,13 +1,10 @@
package com.extendedae_plus.network;
import com.extendedae_plus.ExtendedAEPlus;
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.network.NetworkDirection;
import net.minecraftforge.network.NetworkRegistry;
import net.minecraftforge.network.simple.SimpleChannel;
import net.minecraftforge.network.NetworkDirection;
import com.extendedae_plus.ExtendedAEPlus;
import com.extendedae_plus.network.PullFromJeiOrCraftC2SPacket;
import com.extendedae_plus.network.UploadEncodedPatternToProviderC2SPacket;
public class ModNetwork {
private static final String PROTOCOL_VERSION = "1";

View File

@ -1,21 +1,18 @@
package com.extendedae_plus.network;
import java.util.function.Supplier;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.server.level.ServerPlayer;
import net.minecraftforge.network.NetworkEvent;
import appeng.api.networking.IGrid;
import appeng.api.stacks.AEKey;
import appeng.api.stacks.GenericStack;
import appeng.items.tools.powered.WirelessTerminalItem;
import appeng.menu.locator.MenuLocators;
import com.extendedae_plus.menu.locator.CuriosItemLocator;
import appeng.menu.me.crafting.CraftAmountMenu;
import com.extendedae_plus.menu.locator.CuriosItemLocator;
import com.extendedae_plus.util.WirelessTerminalLocator;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.server.level.ServerPlayer;
import net.minecraftforge.network.NetworkEvent;
import java.util.function.Supplier;
/**
* C2S JEI 中键点击请求打开 AE 的下单界面

View File

@ -1,33 +1,30 @@
package com.extendedae_plus.network;
import java.util.function.Supplier;
import appeng.api.networking.IGrid;
import appeng.api.networking.energy.IEnergyService;
import appeng.api.stacks.AEItemKey;
import appeng.api.storage.MEStorage;
import appeng.api.storage.StorageHelper;
import appeng.items.tools.powered.WirelessCraftingTerminalItem;
import appeng.items.tools.powered.WirelessTerminalItem;
import appeng.me.helpers.PlayerSource;
import com.extendedae_plus.util.WirelessTerminalLocator;
import com.extendedae_plus.util.WirelessTerminalLocator.LocatedTerminal;
import de.mari_023.ae2wtlib.terminal.WTMenuHost;
import de.mari_023.ae2wtlib.wut.WTDefinition;
import de.mari_023.ae2wtlib.wut.WUTHandler;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.network.NetworkEvent;
import net.minecraft.network.FriendlyByteBuf;
import appeng.api.networking.IGrid;
import appeng.api.storage.MEStorage;
import appeng.api.storage.StorageHelper;
import appeng.api.stacks.AEItemKey;
import appeng.api.networking.energy.IEnergyService;
import appeng.me.helpers.PlayerSource;
import appeng.items.tools.powered.WirelessCraftingTerminalItem;
import appeng.items.tools.powered.WirelessTerminalItem;
// ae2wtlib
import de.mari_023.ae2wtlib.wut.WUTHandler;
import de.mari_023.ae2wtlib.wut.WTDefinition;
import de.mari_023.ae2wtlib.terminal.WTMenuHost;
import com.extendedae_plus.util.WirelessTerminalLocator;
import com.extendedae_plus.util.WirelessTerminalLocator.LocatedTerminal;
import java.util.function.Supplier;
public class PickFromWirelessC2SPacket {
private final BlockPos pos;

View File

@ -1,5 +1,6 @@
package com.extendedae_plus.network;
import com.extendedae_plus.client.ui.ProviderSelectScreen;
import net.minecraft.client.Minecraft;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraftforge.api.distmarker.Dist;
@ -10,8 +11,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;
import com.extendedae_plus.client.ui.ProviderSelectScreen;
/**
* S2C: 返回可见且有空位的样板供应器列表客户端弹窗展示供用户选择
*/

View File

@ -1,34 +1,30 @@
package com.extendedae_plus.network;
import java.util.function.Supplier;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.network.NetworkEvent;
import net.minecraft.network.FriendlyByteBuf;
import appeng.api.networking.IGrid;
import appeng.api.storage.MEStorage;
import appeng.api.storage.StorageHelper;
import appeng.api.networking.energy.IEnergyService;
import appeng.api.stacks.AEItemKey;
import appeng.api.stacks.AEKey;
import appeng.api.stacks.GenericStack;
import appeng.api.networking.energy.IEnergyService;
import appeng.api.storage.MEStorage;
import appeng.api.storage.StorageHelper;
import appeng.items.tools.powered.WirelessCraftingTerminalItem;
import appeng.items.tools.powered.WirelessTerminalItem;
import appeng.me.helpers.PlayerSource;
import appeng.menu.locator.MenuLocators;
import appeng.menu.me.crafting.CraftAmountMenu;
// ae2wtlib
import de.mari_023.ae2wtlib.wut.WUTHandler;
import de.mari_023.ae2wtlib.wut.WTDefinition;
import de.mari_023.ae2wtlib.terminal.WTMenuHost;
import com.extendedae_plus.menu.locator.CuriosItemLocator;
import com.extendedae_plus.util.WirelessTerminalLocator;
import com.extendedae_plus.util.WirelessTerminalLocator.LocatedTerminal;
import com.extendedae_plus.menu.locator.CuriosItemLocator;
import de.mari_023.ae2wtlib.terminal.WTMenuHost;
import de.mari_023.ae2wtlib.wut.WTDefinition;
import de.mari_023.ae2wtlib.wut.WUTHandler;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.network.NetworkEvent;
import java.util.function.Supplier;
public class PullFromJeiOrCraftC2SPacket {
private final GenericStack stack;

View File

@ -1,18 +1,17 @@
package com.extendedae_plus.network;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraftforge.network.NetworkEvent;
import net.minecraft.server.level.ServerPlayer;
import appeng.menu.me.items.PatternEncodingTermMenu;
import appeng.menu.implementations.PatternAccessTermMenu;
import appeng.helpers.patternprovider.PatternContainer;
import appeng.menu.implementations.PatternAccessTermMenu;
import appeng.menu.me.items.PatternEncodingTermMenu;
import com.extendedae_plus.util.ExtendedAEPatternUploadUtil;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.server.level.ServerPlayer;
import net.minecraftforge.network.NetworkEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;
import com.extendedae_plus.util.ExtendedAEPatternUploadUtil;
/**
* C2S: 请求当前终端可见的样板供应器列表用于弹窗选择
*/

View File

@ -33,15 +33,15 @@ public class ToggleAdvancedBlockingC2SPacket {
// 通过 accessor 获取逻辑与当前状态
var accessor = (PatternProviderMenuAdvancedAccessor) menu;
var logic = accessor.ext$logic();
var logic = accessor.eap$logic();
if (logic instanceof AdvancedBlockingHolder holder) {
boolean current = holder.ext$getAdvancedBlocking();
boolean current = holder.eap$getAdvancedBlocking();
boolean next = !current;
holder.ext$setAdvancedBlocking(next);
holder.eap$setAdvancedBlocking(next);
// 关键保存持久化触发 AE2 写入逻辑writeToNBT并由菜单 @GuiSync 同步回客户端
logic.saveChanges();
// 直接下发 S2C 强制同步带供应器标识维度+方块坐标
var host = ((PatternProviderLogicAccessor) logic).ext$host();
var host = ((PatternProviderLogicAccessor) logic).eap$host();
var be = host.getBlockEntity();
var level = be.getLevel();
String dimId = level.dimension().location().toString();

View File

@ -1,14 +1,13 @@
package com.extendedae_plus.network;
import appeng.menu.me.items.PatternEncodingTermMenu;
import com.extendedae_plus.util.ExtendedAEPatternUploadUtil;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.server.level.ServerPlayer;
import net.minecraftforge.network.NetworkEvent;
import java.util.function.Supplier;
import net.minecraft.server.level.ServerPlayer;
import appeng.menu.me.items.PatternEncodingTermMenu;
import com.extendedae_plus.util.ExtendedAEPatternUploadUtil;
/**
* C2S: 请求将图样编码终端的已编码样板上传到指定的样板供应器由客户端选择
*/

View File

@ -426,7 +426,7 @@ public class ExtendedAEPatternUploadUtil {
// 读取已编码槽位的物品
var encodedSlot = ((PatternEncodingTermMenuAccessor) (Object) menu)
.epp$getEncodedPatternSlot();
.eap$getEncodedPatternSlot();
ItemStack stack = encodedSlot.getItem();
if (stack.isEmpty() || !PatternDetailsHelper.isEncodedPattern(stack)) {
sendMessage(player, "ExtendedAE Plus: 没有可上传的编码样板");
@ -460,7 +460,7 @@ public class ExtendedAEPatternUploadUtil {
}
try {
var accessor = (PatternEncodingTermMenuAccessor) (Object) menu;
var blankSlot = accessor.epp$getBlankPatternSlot();
var blankSlot = accessor.eap$getBlankPatternSlot();
ItemStack blanks = AEItems.BLANK_PATTERN.stack(stack.getCount());
if (blankSlot != null && blankSlot.mayPlace(blanks)) {
ItemStack remain = blankSlot.safeInsert(blanks);
@ -977,7 +977,7 @@ public class ExtendedAEPatternUploadUtil {
}
// 读取已编码槽位的物品通过 accessor
var encodedSlot = ((PatternEncodingTermMenuAccessor) (Object) menu)
.epp$getEncodedPatternSlot();
.eap$getEncodedPatternSlot();
ItemStack stack = encodedSlot.getItem();
if (stack.isEmpty() || !PatternDetailsHelper.isEncodedPattern(stack)) {
return false;
@ -1049,7 +1049,7 @@ public class ExtendedAEPatternUploadUtil {
return false;
}
var encodedSlot = ((PatternEncodingTermMenuAccessor) (Object) menu)
.epp$getEncodedPatternSlot();
.eap$getEncodedPatternSlot();
ItemStack stack = encodedSlot.getItem();
if (stack.isEmpty() || !PatternDetailsHelper.isEncodedPattern(stack)) {
return false;
@ -1187,7 +1187,7 @@ public class ExtendedAEPatternUploadUtil {
if (container == null) return false;
var encodedSlot = ((PatternEncodingTermMenuAccessor) (Object) menu)
.epp$getEncodedPatternSlot();
.eap$getEncodedPatternSlot();
ItemStack stack = encodedSlot.getItem();
if (stack.isEmpty() || !PatternDetailsHelper.isEncodedPattern(stack)) {
return false;

View File

@ -2,10 +2,10 @@ package com.extendedae_plus.util;
import appeng.api.crafting.IPatternDetails;
import appeng.api.crafting.PatternDetailsHelper;
import appeng.api.inventories.InternalInventory;
import appeng.api.stacks.AEKey;
import appeng.api.stacks.GenericStack;
import appeng.helpers.patternprovider.PatternProviderLogic;
import appeng.api.inventories.InternalInventory;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
@ -13,7 +13,6 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Arrays;
/**
* 样板供应器数据工具类

View File

@ -1,10 +1,10 @@
package com.extendedae_plus.util;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen;
import appeng.client.gui.implementations.PatternProviderScreen;
import appeng.helpers.patternprovider.PatternProviderLogic;
import appeng.menu.implementations.PatternProviderMenu;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen;
/**
* 样板供应器UI辅助工具类

View File

@ -1,22 +1,17 @@
package com.extendedae_plus.util;
import java.util.function.Consumer;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.common.util.LazyOptional;
import appeng.items.tools.powered.WirelessCraftingTerminalItem;
import appeng.items.tools.powered.WirelessTerminalItem;
// Curios API (软依赖)
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.fml.ModList;
import top.theillusivec4.curios.api.CuriosApi;
import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler;
import top.theillusivec4.curios.api.type.inventory.ICurioStacksHandler;
import top.theillusivec4.curios.api.type.inventory.IDynamicStackHandler;
import java.util.function.Consumer;
/**
* 定位玩家身上的无线终端
* - 原版槽位主手副手盔甲背包

View File

@ -1,5 +1,6 @@
package com.extendedae_plus.wireless;
import com.extendedae_plus.config.ModConfigs;
import net.minecraft.resources.ResourceKey;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.Level;
@ -9,8 +10,6 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import com.extendedae_plus.config.ModConfigs;
/**
* 无线主端注册中心 维度 + 频率 唯一注册一个主收发器端点
* 从端通过本注册中心按频率查找主端实现一对多连接