Merge pull request #4 from C-H716/refactor/document

Refactor/document
This commit is contained in:
GaLicn 2025-08-22 09:36:14 +08:00 committed by GitHub
commit 0db35edb8f
62 changed files with 544 additions and 623 deletions

View File

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

View File

@ -1,19 +1,20 @@
package com.extendedae_plus; 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.common.MinecraftForge;
import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.config.ModConfig;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; 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类 * ExtendedAE Plus 主mod类

View File

@ -1,7 +1,6 @@
package com.extendedae_plus; package com.extendedae_plus;
import appeng.client.gui.style.Blitter; import appeng.client.gui.style.Blitter;
import com.glodblock.github.extendedae.ExtendedAE;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
public class NewIcon { 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; package com.extendedae_plus.api;
public interface PatternProviderMenuAdvancedSync { public interface PatternProviderMenuAdvancedSync {
boolean ext$getAdvancedBlockingSynced(); boolean eap$getAdvancedBlockingSynced();
} }

View File

@ -1,19 +1,16 @@
package com.extendedae_plus.client; package com.extendedae_plus.client;
import java.util.Optional; import appeng.api.stacks.GenericStack;
import appeng.client.gui.me.common.MEStorageScreen;
import org.lwjgl.glfw.GLFW; import appeng.integration.modules.jei.GenericEntryStackHelper;
import com.extendedae_plus.ExtendedAEPlus; import com.extendedae_plus.ExtendedAEPlus;
import com.extendedae_plus.integration.jei.JeiRuntimeProxy; import com.extendedae_plus.integration.jei.JeiRuntimeProxy;
import com.extendedae_plus.mixin.ae2.accessor.MEStorageScreenAccessor;
import com.extendedae_plus.network.ModNetwork; import com.extendedae_plus.network.ModNetwork;
import com.extendedae_plus.network.OpenCraftFromJeiC2SPacket; import com.extendedae_plus.network.OpenCraftFromJeiC2SPacket;
import com.extendedae_plus.network.PullFromJeiOrCraftC2SPacket; import com.extendedae_plus.network.PullFromJeiOrCraftC2SPacket;
import appeng.api.stacks.GenericStack;
import appeng.integration.modules.jei.GenericEntryStackHelper;
import mezz.jei.api.ingredients.ITypedIngredient;
import mezz.jei.api.constants.VanillaTypes; import mezz.jei.api.constants.VanillaTypes;
import mezz.jei.api.ingredients.ITypedIngredient;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.Screen;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
@ -21,8 +18,9 @@ import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.ScreenEvent; import net.minecraftforge.client.event.ScreenEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import appeng.client.gui.me.common.MEStorageScreen; import org.lwjgl.glfw.GLFW;
import com.extendedae_plus.mixin.accessor.MEStorageScreenAccessor;
import java.util.Optional;
@Mod.EventBusSubscriber(modid = ExtendedAEPlus.MODID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.FORGE) @Mod.EventBusSubscriber(modid = ExtendedAEPlus.MODID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.FORGE)
public final class InputEvents { public final class InputEvents {
@ -111,8 +109,8 @@ public final class InputEvents {
if (screen instanceof MEStorageScreen<?> me) { if (screen instanceof MEStorageScreen<?> me) {
try { try {
MEStorageScreenAccessor acc = (MEStorageScreenAccessor) (Object) me; MEStorageScreenAccessor acc = (MEStorageScreenAccessor) (Object) me;
acc.ext$getSearchField().setValue(name); acc.eap$getSearchField().setValue(name);
acc.ext$setSearchText(name); // 同步到 Repo 并刷新 acc.eap$setSearchText(name); // 同步到 Repo 并刷新
event.setCanceled(true); event.setCanceled(true);
return; return;
} catch (Throwable ignored) { } 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.client.gui.screens.Screen;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import java.util.ArrayList; import java.util.*;
import java.util.Objects;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/** /**
* 简单的供应器选择弹窗 * 简单的供应器选择弹窗

View File

@ -1,10 +1,12 @@
package com.extendedae_plus.content.wireless; package com.extendedae_plus.content.wireless;
import com.extendedae_plus.init.ModBlockEntities;
import net.minecraft.core.BlockPos; 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.InteractionHand;
import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player; 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.Level;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.EntityBlock; 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.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult; 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 class WirelessTransceiverBlock extends Block implements EntityBlock {
public WirelessTransceiverBlock(Properties props) { public WirelessTransceiverBlock(Properties props) {

View File

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

View File

@ -1,5 +1,6 @@
package com.extendedae_plus.hooks; package com.extendedae_plus.hooks;
import appeng.util.InteractionUtil;
import com.extendedae_plus.ExtendedAEPlus; import com.extendedae_plus.ExtendedAEPlus;
import com.extendedae_plus.content.wireless.WirelessTransceiverBlockEntity; import com.extendedae_plus.content.wireless.WirelessTransceiverBlockEntity;
import net.minecraft.network.chat.Component; 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.Event;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import appeng.util.InteractionUtil;
@Mod.EventBusSubscriber(modid = ExtendedAEPlus.MODID) @Mod.EventBusSubscriber(modid = ExtendedAEPlus.MODID)
public final class WrenchHook { public final class WrenchHook {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,17 +1,11 @@
package com.extendedae_plus.menu.host; 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.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.item.ItemStack; 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; import top.theillusivec4.curios.api.type.inventory.ICurioStacksHandler;
/** /**

View File

@ -1,27 +1,21 @@
package com.extendedae_plus.menu.locator; 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.IMenuItem;
import appeng.api.implementations.menuobjects.ItemMenuHost; import appeng.api.implementations.menuobjects.ItemMenuHost;
import appeng.helpers.WirelessTerminalMenuHost; import appeng.helpers.WirelessTerminalMenuHost;
import appeng.items.tools.powered.WirelessTerminalItem; import appeng.items.tools.powered.WirelessTerminalItem;
import appeng.menu.MenuOpener; import appeng.menu.MenuOpener;
import appeng.menu.me.common.MEStorageMenu;
import appeng.menu.locator.MenuLocator; import appeng.menu.locator.MenuLocator;
import com.extendedae_plus.menu.host.CuriosWirelessTerminalMenuHost; import appeng.menu.me.common.MEStorageMenu;
// 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.host.CuriosWTMenuHost; import com.extendedae_plus.menu.host.CuriosWTMenuHost;
import com.extendedae_plus.menu.host.CuriosWirelessTerminalMenuHost;
// Curios API (软依赖) 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.CuriosApi;
import top.theillusivec4.curios.api.type.inventory.ICurioStacksHandler; import top.theillusivec4.curios.api.type.inventory.ICurioStacksHandler;

View File

@ -1,22 +1,20 @@
package com.extendedae_plus.mixin; 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.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 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) // no client-side WCT gating; server will check presence (including Curios)
@ -26,7 +24,7 @@ public class PickFromWirelessMixin {
@Shadow public HitResult hitResult; @Shadow public HitResult hitResult;
@Inject(method = "pickBlock", at = @At("HEAD"), cancellable = true) @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) { if (this.player == null || this.hitResult == null || this.hitResult.getType() != HitResult.Type.BLOCK) {
return; return;
} }

View File

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

View File

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

View File

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

View File

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

View File

@ -1,21 +1,20 @@
package com.extendedae_plus.mixin; package com.extendedae_plus.mixin.ae2;
import appeng.api.config.Setting;
import appeng.api.util.IConfigManager;
import appeng.menu.me.common.MEStorageMenu;
import com.extendedae_plus.mixin.ae2.accessor.MEStorageMenuAccessor;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import appeng.api.util.IConfigManager;
import appeng.menu.me.common.MEStorageMenu;
import com.extendedae_plus.mixin.accessor.MEStorageMenuAccessor;
import appeng.api.config.Setting;
/** /**
* 修复当服务端 ConfigManager 注册了额外设置例如 TERMINAL_SHOW_PATTERN_PROVIDERS * 修复当服务端 ConfigManager 注册了额外设置例如 TERMINAL_SHOW_PATTERN_PROVIDERS
* 而客户端 clientCM 未注册时AE2 在同步环节会对 clientCM 执行 getSetting * 而客户端 clientCM 未注册时AE2 在同步环节会对 clientCM 执行 getSetting
* 进而抛出 UnsupportedSettingException * 进而抛出 UnsupportedSettingException
* * <p>
* 方案在服务端首次 broadcastChanges 仅为客户端缺失的设置执行注册补齐且占位值与服务端不同 * 方案在服务端首次 broadcastChanges 仅为客户端缺失的设置执行注册补齐且占位值与服务端不同
* 以确保 AE2 后续仍会发送 ConfigValuePacket 完成真正的值同步避免影响排序等行为 * 以确保 AE2 后续仍会发送 ConfigValuePacket 完成真正的值同步避免影响排序等行为
*/ */
@ -23,12 +22,12 @@ import appeng.api.config.Setting;
public abstract class MEStorageMenuMixin { public abstract class MEStorageMenuMixin {
@Unique @Unique
private boolean extendedae_plus$settingsMirrored = false; private boolean eap$settingsMirrored = false;
@Inject(method = "broadcastChanges", at = @At("HEAD")) @Inject(method = "broadcastChanges", at = @At("HEAD"))
private void extendedae_plus$mirrorServerSettingsToClient(CallbackInfo ci) { private void eap$mirrorServerSettingsToClient(CallbackInfo ci) {
var self = (MEStorageMenu) (Object) this; var self = (MEStorageMenu) (Object) this;
if (this.extendedae_plus$settingsMirrored) { if (this.eap$settingsMirrored) {
return; return;
} }
try { try {
@ -51,30 +50,29 @@ public abstract class MEStorageMenuMixin {
if (!clientHasSetting) { if (!clientHasSetting) {
try { try {
Object serverValue = server.getSetting(setting); Object serverValue = server.getSetting(setting);
Object placeholder = extendedae_plus$chooseDifferentEnumValue(serverValue); Object placeholder = eap$chooseDifferentEnumValue(serverValue);
if (placeholder == null) { if (placeholder == null) {
// 若无法选择不同的占位值例如只有一个枚举常量则退回服务端值 // 若无法选择不同的占位值例如只有一个枚举常量则退回服务端值
placeholder = serverValue; placeholder = serverValue;
} }
// 使用辅助方法统一进行受检的泛型转换后再注册 // 使用辅助方法统一进行受检的泛型转换后再注册
extendedae_plus$registerSettingCompat(client, setting, placeholder); eap$registerSettingCompat(client, setting, placeholder);
} catch (Throwable ignore) { } catch (Throwable ignore) {
// 防御不让异常影响主流程 // 防御不让异常影响主流程
} }
} }
} }
this.extendedae_plus$settingsMirrored = true; this.eap$settingsMirrored = true;
} catch (Throwable t) { } catch (Throwable t) {
// 防御绝不让同步失败导致崩溃 // 防御绝不让同步失败导致崩溃
} }
} }
@Unique @Unique
private Object extendedae_plus$chooseDifferentEnumValue(Object serverValue) { private Object eap$chooseDifferentEnumValue(Object serverValue) {
if (!(serverValue instanceof Enum<?> sv)) { if (!(serverValue instanceof Enum<?> sv)) {
return null; return null;
} }
@SuppressWarnings("unchecked")
Class<? extends Enum<?>> enumClass = sv.getDeclaringClass(); Class<? extends Enum<?>> enumClass = sv.getDeclaringClass();
Object[] constants = enumClass.getEnumConstants(); Object[] constants = enumClass.getEnumConstants();
if (constants == null || constants.length == 0) { if (constants == null || constants.length == 0) {
@ -90,7 +88,7 @@ public abstract class MEStorageMenuMixin {
@Unique @Unique
@SuppressWarnings({"unchecked", "rawtypes"}) @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) { IConfigManager client, Setting<?> setting, Object value) {
// 前置校验仅处理枚举类型的设置值 // 前置校验仅处理枚举类型的设置值
if (!(value instanceof Enum<?>)) { if (!(value instanceof Enum<?>)) {

View File

@ -1,42 +1,38 @@
package com.extendedae_plus.mixin; package com.extendedae_plus.mixin.ae2;
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 org.jetbrains.annotations.Nullable;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.inventory.MenuType;
import appeng.api.inventories.InternalInventory; import appeng.api.inventories.InternalInventory;
import appeng.api.networking.energy.IEnergySource; import appeng.api.networking.energy.IEnergySource;
import appeng.api.storage.MEStorage;
import appeng.api.storage.StorageHelper;
import appeng.api.stacks.AEItemKey; import appeng.api.stacks.AEItemKey;
import appeng.api.stacks.AEKey; import appeng.api.stacks.AEKey;
import appeng.api.storage.MEStorage;
import appeng.api.storage.StorageHelper;
import appeng.core.definitions.AEItems; import appeng.core.definitions.AEItems;
import appeng.helpers.IPatternTerminalMenuHost; import appeng.helpers.IPatternTerminalMenuHost;
import appeng.menu.me.items.PatternEncodingTermMenu;
import appeng.api.networking.security.IActionSource;
import appeng.menu.slot.RestrictedInputSlot;
import appeng.menu.me.common.MEStorageMenu; import appeng.menu.me.common.MEStorageMenu;
import com.extendedae_plus.mixin.accessor.MEStorageMenuAccessor; import appeng.menu.me.items.PatternEncodingTermMenu;
import appeng.menu.slot.RestrictedInputSlot;
import com.extendedae_plus.mixin.ae2.accessor.MEStorageMenuAccessor;
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;
@Mixin(PatternEncodingTermMenu.class) @Mixin(PatternEncodingTermMenu.class)
public abstract class PatternEncodingTermMenuMixin { public abstract class PatternEncodingTermMenuMixin {
// 防止重复执行 // 防止重复执行
@org.spongepowered.asm.mixin.Unique @Unique
private boolean extendedae_plus$blankAutoFilled = false; private boolean eap$blankAutoFilled = false;
@Shadow @Shadow
private RestrictedInputSlot blankPatternSlot; private RestrictedInputSlot blankPatternSlot;
@org.spongepowered.asm.mixin.Unique @Unique
private void extendedae_plus$tryFill(IPatternTerminalMenuHost host, Inventory ip) { private void eap$tryFill(IPatternTerminalMenuHost host, Inventory ip) {
try { try {
var self = (PatternEncodingTermMenu) (Object) this; var self = (PatternEncodingTermMenu) (Object) this;
var player = ip.player; var player = ip.player;
@ -92,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", @Inject(method = "<init>(Lnet/minecraft/world/inventory/MenuType;ILnet/minecraft/world/entity/player/Inventory;Lappeng/helpers/IPatternTerminalMenuHost;Z)V",
at = @At("TAIL")) at = @At("TAIL"))
private void extendedae_plus$autoFillBlankPattern(MenuType<?> menuType, int id, Inventory ip, private void eap$autoFillBlankPattern(MenuType<?> menuType, int id, Inventory ip,
IPatternTerminalMenuHost host, boolean bindInventory, IPatternTerminalMenuHost host, boolean bindInventory,
CallbackInfo ci) { CallbackInfo ci) {
extendedae_plus$tryFill(host, ip); eap$tryFill(host, ip);
} }
@Inject(method = "<init>(ILnet/minecraft/world/entity/player/Inventory;Lappeng/helpers/IPatternTerminalMenuHost;)V", @Inject(method = "<init>(ILnet/minecraft/world/entity/player/Inventory;Lappeng/helpers/IPatternTerminalMenuHost;)V",
at = @At("TAIL")) at = @At("TAIL"))
private void extendedae_plus$autoFillCtor3(int id, Inventory ip, IPatternTerminalMenuHost host, CallbackInfo ci) { private void eap$autoFillCtor3(int id, Inventory ip, IPatternTerminalMenuHost host, CallbackInfo ci) {
extendedae_plus$tryFill(host, ip); eap$tryFill(host, ip);
} }
// 在首次 broadcastChanges 后再尝试一次避免构造时网络未激活 // 在首次 broadcastChanges 后再尝试一次避免构造时网络未激活
@Inject(method = "broadcastChanges", at = @At("TAIL")) @Inject(method = "broadcastChanges", at = @At("TAIL"))
private void extendedae_plus$retryFillAfterPower(CallbackInfo ci) { private void eap$retryFillAfterPower(CallbackInfo ci) {
if (this.extendedae_plus$blankAutoFilled) { if (this.eap$blankAutoFilled) {
return; return;
} }
// 仅在服务器端执行 // 仅在服务器端执行
@ -132,7 +128,7 @@ public abstract class PatternEncodingTermMenuMixin {
int space = Math.max(0, limit - current.getCount()); int space = Math.max(0, limit - current.getCount());
space = Math.min(space, AEItems.BLANK_PATTERN.asItem().getMaxStackSize()); space = Math.min(space, AEItems.BLANK_PATTERN.asItem().getMaxStackSize());
if (space <= 0) { if (space <= 0) {
this.extendedae_plus$blankAutoFilled = true; this.eap$blankAutoFilled = true;
return; return;
} }
@ -154,6 +150,6 @@ public abstract class PatternEncodingTermMenuMixin {
if (leftover > 0) { if (leftover > 0) {
StorageHelper.poweredInsert(power, storage, blankKey, leftover, self.getActionSource()); StorageHelper.poweredInsert(power, storage, blankKey, leftover, self.getActionSource());
} }
this.extendedae_plus$blankAutoFilled = true; this.eap$blankAutoFilled = true;
} }
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,7 +1,7 @@
package com.extendedae_plus.mixin; package com.extendedae_plus.mixin.ae2;
import appeng.client.gui.layout.SlotGridLayout;
import appeng.client.Point; import appeng.client.Point;
import appeng.client.gui.layout.SlotGridLayout;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.Unique;

View File

@ -1,14 +1,13 @@
package com.extendedae_plus.mixin.accessor; package com.extendedae_plus.mixin.ae2.accessor;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import appeng.client.gui.AEBaseScreen; import appeng.client.gui.AEBaseScreen;
import appeng.client.gui.style.ScreenStyle; import appeng.client.gui.style.ScreenStyle;
import appeng.menu.AEBaseMenu; import appeng.menu.AEBaseMenu;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(value = AEBaseScreen.class, remap = false) @Mixin(value = AEBaseScreen.class, remap = false)
public interface AEBaseScreenAccessor<T extends AEBaseMenu> { public interface AEBaseScreenAccessor<T extends AEBaseMenu> {
@Accessor(value = "style", remap = false) @Accessor(value = "style", remap = false)
ScreenStyle extendedae_plus$getStyle(); ScreenStyle eap$getStyle();
} }

View File

@ -1,9 +1,8 @@
package com.extendedae_plus.mixin.accessor; package com.extendedae_plus.mixin.ae2.accessor;
import org.spongepowered.asm.mixin.Mixin;
import appeng.client.gui.AEBaseScreen; import appeng.client.gui.AEBaseScreen;
import appeng.menu.AEBaseMenu; import appeng.menu.AEBaseMenu;
import org.spongepowered.asm.mixin.Mixin;
@Mixin(AEBaseScreen.class) @Mixin(AEBaseScreen.class)
public interface AEBaseScreenInvoker<T extends AEBaseMenu> { public interface AEBaseScreenInvoker<T extends AEBaseMenu> {

View File

@ -1,14 +1,12 @@
package com.extendedae_plus.mixin.accessor; package com.extendedae_plus.mixin.ae2.accessor;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import org.jetbrains.annotations.Nullable;
import appeng.api.networking.energy.IEnergySource; import appeng.api.networking.energy.IEnergySource;
import appeng.api.storage.MEStorage; import appeng.api.storage.MEStorage;
import appeng.menu.me.common.MEStorageMenu;
import appeng.api.util.IConfigManager; import appeng.api.util.IConfigManager;
import appeng.menu.me.common.MEStorageMenu;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(MEStorageMenu.class) @Mixin(MEStorageMenu.class)
public interface MEStorageMenuAccessor { public interface MEStorageMenuAccessor {

View File

@ -1,17 +1,16 @@
package com.extendedae_plus.mixin.accessor; package com.extendedae_plus.mixin.ae2.accessor;
import appeng.client.gui.me.common.MEStorageScreen;
import appeng.client.gui.widgets.AETextField;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Accessor;
import org.spongepowered.asm.mixin.gen.Invoker; import org.spongepowered.asm.mixin.gen.Invoker;
import appeng.client.gui.me.common.MEStorageScreen;
import appeng.client.gui.widgets.AETextField;
@Mixin(value = MEStorageScreen.class, remap = false) @Mixin(value = MEStorageScreen.class, remap = false)
public interface MEStorageScreenAccessor { public interface MEStorageScreenAccessor {
@Accessor("searchField") @Accessor("searchField")
AETextField ext$getSearchField(); AETextField eap$getSearchField();
@Invoker("setSearchText") @Invoker("setSearchText")
void ext$setSearchText(String text); void eap$setSearchText(String text);
} }

View File

@ -1,4 +1,4 @@
package com.extendedae_plus.mixin.accessor; package com.extendedae_plus.mixin.ae2.accessor;
import appeng.menu.me.items.PatternEncodingTermMenu; import appeng.menu.me.items.PatternEncodingTermMenu;
import appeng.menu.slot.RestrictedInputSlot; import appeng.menu.slot.RestrictedInputSlot;
@ -8,8 +8,8 @@ import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(PatternEncodingTermMenu.class) @Mixin(PatternEncodingTermMenu.class)
public interface PatternEncodingTermMenuAccessor { public interface PatternEncodingTermMenuAccessor {
@Accessor("encodedPatternSlot") @Accessor("encodedPatternSlot")
RestrictedInputSlot epp$getEncodedPatternSlot(); RestrictedInputSlot eap$getEncodedPatternSlot();
@Accessor("blankPatternSlot") @Accessor("blankPatternSlot")
RestrictedInputSlot epp$getBlankPatternSlot(); RestrictedInputSlot eap$getBlankPatternSlot();
} }

View File

@ -1,13 +1,12 @@
package com.extendedae_plus.mixin.accessor; package com.extendedae_plus.mixin.ae2.accessor;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import appeng.helpers.patternprovider.PatternProviderLogic; import appeng.helpers.patternprovider.PatternProviderLogic;
import appeng.helpers.patternprovider.PatternProviderLogicHost; import appeng.helpers.patternprovider.PatternProviderLogicHost;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(PatternProviderLogic.class) @Mixin(PatternProviderLogic.class)
public interface PatternProviderLogicAccessor { public interface PatternProviderLogicAccessor {
@Accessor("host") @Accessor("host")
PatternProviderLogicHost ext$host(); PatternProviderLogicHost eap$host();
} }

View File

@ -1,15 +1,14 @@
package com.extendedae_plus.mixin.accessor; package com.extendedae_plus.mixin.ae2.accessor;
import appeng.api.stacks.AEKey;
import appeng.helpers.patternprovider.PatternProviderLogic;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Accessor;
import java.util.Set; import java.util.Set;
import appeng.api.stacks.AEKey;
import appeng.helpers.patternprovider.PatternProviderLogic;
@Mixin(PatternProviderLogic.class) @Mixin(PatternProviderLogic.class)
public interface PatternProviderLogicPatternInputsAccessor { public interface PatternProviderLogicPatternInputsAccessor {
@Accessor("patternInputs") @Accessor("patternInputs")
Set<AEKey> ext$patternInputs(); Set<AEKey> eap$patternInputs();
} }

View File

@ -1,13 +1,12 @@
package com.extendedae_plus.mixin.accessor; package com.extendedae_plus.mixin.ae2.accessor;
import appeng.helpers.patternprovider.PatternProviderLogic;
import appeng.menu.implementations.PatternProviderMenu;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Accessor;
import appeng.menu.implementations.PatternProviderMenu;
import appeng.helpers.patternprovider.PatternProviderLogic;
@Mixin(PatternProviderMenu.class) @Mixin(PatternProviderMenu.class)
public interface PatternProviderMenuAdvancedAccessor { public interface PatternProviderMenuAdvancedAccessor {
@Accessor("logic") @Accessor("logic")
PatternProviderLogic ext$logic(); PatternProviderLogic eap$logic();
} }

View File

@ -1,6 +1,5 @@
package com.extendedae_plus.mixin; package com.extendedae_plus.mixin.ae2WTlib;
import appeng.api.util.IConfigurableObject;
import com.extendedae_plus.util.ExtendedAEPatternUploadUtil; import com.extendedae_plus.util.ExtendedAEPatternUploadUtil;
import com.glodblock.github.extendedae.xmod.wt.ContainerUWirelessExPAT; import com.glodblock.github.extendedae.xmod.wt.ContainerUWirelessExPAT;
import com.glodblock.github.extendedae.xmod.wt.HostUWirelessExPAT; import com.glodblock.github.extendedae.xmod.wt.HostUWirelessExPAT;
@ -27,23 +26,23 @@ import java.util.function.Consumer;
public abstract class ContainerUWirelessExPatternTerminalMixin implements IActionHolder { public abstract class ContainerUWirelessExPatternTerminalMixin implements IActionHolder {
@Unique @Unique
private final Map<String, Consumer<Paras>> actions = createHolder(); private final Map<String, Consumer<Paras>> eap$actions = createHolder();
@Unique @Unique
private Player epp$player; private Player eap$player;
// 明确目标构造签名<init>(int, Inventory, HostUWirelessExPAT) // 明确目标构造签名<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) @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) { 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 保持一致 // 注册上传动作参数顺序必须与客户端 CGenericPacket 保持一致
this.actions.put("upload", p -> { this.eap$actions.put("upload", p -> {
try { try {
Object o0 = p.get(0); Object o0 = p.get(0);
Object o1 = p.get(1); Object o1 = p.get(1);
int playerSlotIndex = (o0 instanceof Number) ? ((Number) o0).intValue() : Integer.parseInt(String.valueOf(o0)); 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)); 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); ExtendedAEPatternUploadUtil.uploadPatternToProvider(sp, playerSlotIndex, providerId);
} catch (Throwable t) { } catch (Throwable t) {
} }
@ -54,6 +53,6 @@ public abstract class ContainerUWirelessExPatternTerminalMixin implements IActio
@NotNull @NotNull
@Override @Override
public Map<String, Consumer<Paras>> getActionMap() { 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

@ -1,28 +1,27 @@
package com.extendedae_plus.mixin; package com.extendedae_plus.mixin.extendedae;
import appeng.api.crafting.PatternDetailsHelper;
import appeng.api.stacks.GenericStack;
import appeng.crafting.pattern.AEProcessingPattern;
import appeng.crafting.pattern.EncodedPatternItem;
import appeng.helpers.patternprovider.PatternProviderLogicHost; import appeng.helpers.patternprovider.PatternProviderLogicHost;
import appeng.menu.SlotSemantics; import appeng.menu.SlotSemantics;
import appeng.menu.guisync.GuiSync; import appeng.menu.guisync.GuiSync;
import appeng.menu.implementations.PatternProviderMenu; import appeng.menu.implementations.PatternProviderMenu;
import appeng.menu.slot.AppEngSlot; import appeng.menu.slot.AppEngSlot;
import appeng.crafting.pattern.EncodedPatternItem;
import appeng.crafting.pattern.AEProcessingPattern;
import appeng.api.stacks.GenericStack;
import appeng.api.crafting.PatternDetailsHelper;
import com.glodblock.github.extendedae.container.ContainerExPatternProvider; import com.glodblock.github.extendedae.container.ContainerExPatternProvider;
import com.glodblock.github.glodium.network.packet.sync.IActionHolder; import com.glodblock.github.glodium.network.packet.sync.IActionHolder;
import com.glodblock.github.glodium.network.packet.sync.Paras; import com.glodblock.github.glodium.network.packet.sync.Paras;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.inventory.Slot; import net.minecraft.world.inventory.Slot;
import org.jetbrains.annotations.NotNull;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.jetbrains.annotations.NotNull;
import java.lang.reflect.Field;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.function.Consumer; import java.util.function.Consumer;
@ -32,23 +31,23 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
@GuiSync(11451) @GuiSync(11451)
@Unique @Unique
public int page = 0; public int eap$page = 0;
@Unique @Unique
public int maxPage = 0; public int eap$maxPage = 0;
@Unique @Unique
private static final int SLOTS_PER_PAGE = 36; // 每页显示36个槽位 private static final int SLOTS_PER_PAGE = 36; // 每页显示36个槽位
@Unique @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) { public ContainerExPatternProviderMixin(MenuType<? extends PatternProviderMenu> menuType, int id, Inventory playerInventory, PatternProviderLogicHost host) {
super(menuType, id, playerInventory, host); super(menuType, id, playerInventory, host);
} }
@Unique @Unique
public void showPage() { public void eap$showPage() {
List<Slot> slots = this.getSlots(SlotSemantics.ENCODED_PATTERN); List<Slot> slots = this.getSlots(SlotSemantics.ENCODED_PATTERN);
int totalSlots = slots.size(); int totalSlots = slots.size();
@ -65,13 +64,9 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
for (Slot s : slots) { for (Slot s : slots) {
int page_id = slot_id / SLOTS_PER_PAGE; int page_id = slot_id / SLOTS_PER_PAGE;
if (page_id == this.page) { // 当前页的槽位激活
// 当前页的槽位激活 // 其他页的槽位隐藏
((AppEngSlot) s).setActive(true); ((AppEngSlot) s).setActive(page_id == this.eap$page);
} else {
// 其他页的槽位隐藏
((AppEngSlot) s).setActive(false);
}
++slot_id; ++slot_id;
} }
} }
@ -79,29 +74,29 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
@Inject(method = "<init>", at = @At("TAIL")) @Inject(method = "<init>", at = @At("TAIL"))
public void init(int id, Inventory playerInventory, PatternProviderLogicHost host, CallbackInfo ci) { public void init(int id, Inventory playerInventory, PatternProviderLogicHost host, CallbackInfo ci) {
int maxSlots = this.getSlots(SlotSemantics.ENCODED_PATTERN).size(); 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 分发 // 注册通用动作 CGenericPacket 分发
this.actions.put("multiply2", p -> { modifyPatterns(2, false); }); this.eap$actions.put("multiply2", p -> { eap$modifyPatterns(2, false); });
this.actions.put("divide2", p -> { modifyPatterns(2, true); }); this.eap$actions.put("divide2", p -> { eap$modifyPatterns(2, true); });
this.actions.put("multiply5", p -> { modifyPatterns(5, false); }); this.eap$actions.put("multiply5", p -> { eap$modifyPatterns(5, false); });
this.actions.put("divide5", p -> { modifyPatterns(5, true); }); this.eap$actions.put("divide5", p -> { eap$modifyPatterns(5, true); });
this.actions.put("multiply10",p -> { modifyPatterns(10, false);}); this.eap$actions.put("multiply10", p -> { eap$modifyPatterns(10, false);});
this.actions.put("divide10", p -> { modifyPatterns(10, true); }); this.eap$actions.put("divide10", p -> { eap$modifyPatterns(10, true); });
} }
@Unique @Unique
public int getPage() { public int getPage() {
return this.page; return this.eap$page;
} }
@Unique @Unique
public void setPage(int page) { public void setPage(int page) {
this.page = page; this.eap$page = page;
} }
@Unique @Unique
private void modifyPatterns(int scale, boolean div) { private void eap$modifyPatterns(int scale, boolean div) {
if (scale <= 0) return; if (scale <= 0) return;
for (var slot : this.getSlots(SlotSemantics.ENCODED_PATTERN)) { for (var slot : this.getSlots(SlotSemantics.ENCODED_PATTERN)) {
var stack = slot.getItem(); var stack = slot.getItem();
@ -110,11 +105,11 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
if (detail instanceof AEProcessingPattern process) { if (detail instanceof AEProcessingPattern process) {
var input = process.getSparseInputs(); var input = process.getSparseInputs();
var output = process.getOutputs(); 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 mulInput = new GenericStack[input.length];
var mulOutput = new GenericStack[output.length]; var mulOutput = new GenericStack[output.length];
modifyStacks(input, mulInput, scale, div); eap$modifyStacks(input, mulInput, scale, div);
modifyStacks(output, mulOutput, scale, div); eap$modifyStacks(output, mulOutput, scale, div);
var newPattern = PatternDetailsHelper.encodeProcessingPattern(mulInput, mulOutput); var newPattern = PatternDetailsHelper.encodeProcessingPattern(mulInput, mulOutput);
slot.set(newPattern); slot.set(newPattern);
} }
@ -124,7 +119,7 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
} }
@Unique @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 (stacks == null) return false;
if (div) { if (div) {
for (var stack : stacks) { for (var stack : stacks) {
@ -149,7 +144,7 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
} }
@Unique @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++) { for (int i = 0; i < src.length; i++) {
var stack = src[i]; var stack = src[i];
if (stack != null) { if (stack != null) {
@ -165,6 +160,6 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
@NotNull @NotNull
@Override @Override
public Map<String, Consumer<Paras>> getActionMap() { public Map<String, Consumer<Paras>> getActionMap() {
return this.actions; return this.eap$actions;
} }
} }

View File

@ -1,12 +1,13 @@
package com.extendedae_plus.mixin; package com.extendedae_plus.mixin.extendedae;
import appeng.api.util.IConfigurableObject;
import appeng.menu.guisync.GuiSync; import appeng.menu.guisync.GuiSync;
import com.extendedae_plus.util.ExtendedAEPatternUploadUtil; import com.extendedae_plus.util.ExtendedAEPatternUploadUtil;
import appeng.api.util.IConfigurableObject;
import com.glodblock.github.extendedae.container.ContainerExPatternTerminal; import com.glodblock.github.extendedae.container.ContainerExPatternTerminal;
import com.glodblock.github.glodium.network.packet.sync.IActionHolder; import com.glodblock.github.glodium.network.packet.sync.IActionHolder;
import com.glodblock.github.glodium.network.packet.sync.Paras; import com.glodblock.github.glodium.network.packet.sync.Paras;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.player.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.Unique;
@ -16,41 +17,40 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.Map; import java.util.Map;
import java.util.function.Consumer; import java.util.function.Consumer;
import net.minecraft.world.entity.player.Player;
@Mixin(ContainerExPatternTerminal.class) @Mixin(ContainerExPatternTerminal.class)
public abstract class ContainerExPatternTerminalMixin implements IActionHolder { public abstract class ContainerExPatternTerminalMixin implements IActionHolder {
@GuiSync(11452) @GuiSync(11452)
@Unique @Unique
public boolean hidePatternSlots = false; public boolean eap$hidePatternSlots = false;
@Unique @Unique
public boolean isHidePatternSlots() { public boolean isHidePatternSlots() {
return this.hidePatternSlots; return this.eap$hidePatternSlots;
} }
@Unique @Unique
public void setHidePatternSlots(boolean hide) { public void setHidePatternSlots(boolean hide) {
this.hidePatternSlots = hide; this.eap$hidePatternSlots = hide;
} }
@Unique @Unique
public void toggleHidePatternSlots() { public void toggleHidePatternSlots() {
this.hidePatternSlots = !this.hidePatternSlots; this.eap$hidePatternSlots = !this.eap$hidePatternSlots;
} }
@Unique @Unique
private final Map<String, Consumer<Paras>> actions = createHolder(); private final Map<String, Consumer<Paras>> eap$actions = createHolder();
@Unique @Unique
private Player epp$player; 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) { private void init(int id, net.minecraft.world.entity.player.Inventory playerInventory, IConfigurableObject host, CallbackInfo ci) {
this.epp$player = playerInventory.player; this.epp$player = playerInventory.player;
// 注册上传动作参数顺序必须与客户端 CGenericPacket 保持一致 // 注册上传动作参数顺序必须与客户端 CGenericPacket 保持一致
this.actions.put("upload", p -> { this.eap$actions.put("upload", p -> {
try { try {
Object o0 = p.get(0); Object o0 = p.get(0);
Object o1 = p.get(1); 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)); long providerId = (o1 instanceof Number) ? ((Number) o1).longValue() : Long.parseLong(String.valueOf(o1));
var sp = (ServerPlayer) this.epp$player; var sp = (ServerPlayer) this.epp$player;
ExtendedAEPatternUploadUtil.uploadPatternToProvider(sp, playerSlotIndex, providerId); ExtendedAEPatternUploadUtil.uploadPatternToProvider(sp, playerSlotIndex, providerId);
} catch (Throwable t) { } catch (Throwable ignored) {
} }
}); });
} }
@ -66,6 +66,6 @@ public abstract class ContainerExPatternTerminalMixin implements IActionHolder {
@NotNull @NotNull
@Override @Override
public Map<String, Consumer<Paras>> getActionMap() { public Map<String, Consumer<Paras>> getActionMap() {
return this.actions; return this.eap$actions;
} }
} }

View File

@ -1,9 +1,8 @@
package com.extendedae_plus.mixin; package com.extendedae_plus.mixin.extendedae;
import appeng.api.util.IConfigurableObject;
import com.extendedae_plus.util.ExtendedAEPatternUploadUtil; import com.extendedae_plus.util.ExtendedAEPatternUploadUtil;
import com.glodblock.github.extendedae.container.ContainerWirelessExPAT;
import com.glodblock.github.extendedae.common.me.itemhost.HostWirelessExPAT; import com.glodblock.github.extendedae.common.me.itemhost.HostWirelessExPAT;
import com.glodblock.github.extendedae.container.ContainerWirelessExPAT;
import com.glodblock.github.glodium.network.packet.sync.IActionHolder; import com.glodblock.github.glodium.network.packet.sync.IActionHolder;
import com.glodblock.github.glodium.network.packet.sync.Paras; import com.glodblock.github.glodium.network.packet.sync.Paras;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
@ -27,7 +26,7 @@ import java.util.function.Consumer;
public abstract class ContainerWirelessExPatternTerminalMixin implements IActionHolder { public abstract class ContainerWirelessExPatternTerminalMixin implements IActionHolder {
@Unique @Unique
private final Map<String, Consumer<Paras>> actions = createHolder(); private final Map<String, Consumer<Paras>> eap$actions = createHolder();
@Unique @Unique
private Player epp$player; private Player epp$player;
@ -37,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) { private void init(int id, net.minecraft.world.entity.player.Inventory playerInventory, HostWirelessExPAT host, CallbackInfo ci) {
this.epp$player = playerInventory.player; this.epp$player = playerInventory.player;
// 注册上传动作参数顺序必须与客户端 CGenericPacket 保持一致 // 注册上传动作参数顺序必须与客户端 CGenericPacket 保持一致
this.actions.put("upload", p -> { this.eap$actions.put("upload", p -> {
try { try {
Object o0 = p.get(0); Object o0 = p.get(0);
Object o1 = p.get(1); Object o1 = p.get(1);
@ -45,7 +44,7 @@ public abstract class ContainerWirelessExPatternTerminalMixin implements IAction
long providerId = (o1 instanceof Number) ? ((Number) o1).longValue() : Long.parseLong(String.valueOf(o1)); long providerId = (o1 instanceof Number) ? ((Number) o1).longValue() : Long.parseLong(String.valueOf(o1));
var sp = (ServerPlayer) this.epp$player; var sp = (ServerPlayer) this.epp$player;
ExtendedAEPatternUploadUtil.uploadPatternToProvider(sp, playerSlotIndex, providerId); ExtendedAEPatternUploadUtil.uploadPatternToProvider(sp, playerSlotIndex, providerId);
} catch (Throwable t) { } catch (Throwable ignored) {
} }
}); });
} }
@ -53,6 +52,6 @@ public abstract class ContainerWirelessExPatternTerminalMixin implements IAction
@NotNull @NotNull
@Override @Override
public Map<String, Consumer<Paras>> getActionMap() { public Map<String, Consumer<Paras>> getActionMap() {
return this.actions; return this.eap$actions;
} }
} }

View File

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

@ -1,22 +1,19 @@
package com.extendedae_plus.mixin; package com.extendedae_plus.mixin.extendedae;
import appeng.client.gui.Icon; import appeng.api.crafting.PatternDetailsHelper;
import appeng.client.gui.AEBaseScreen; import appeng.client.gui.AEBaseScreen;
import appeng.client.gui.Icon;
import appeng.client.gui.style.ScreenStyle; import appeng.client.gui.style.ScreenStyle;
import appeng.client.gui.widgets.IconButton; import appeng.client.gui.widgets.IconButton;
import com.extendedae_plus.util.ExtendedAEPatternUploadUtil; import com.glodblock.github.extendedae.client.gui.GuiExPatternTerminal;
import com.glodblock.github.extendedae.container.ContainerExPatternTerminal;
import com.glodblock.github.extendedae.network.EPPNetworkHandler; import com.glodblock.github.extendedae.network.EPPNetworkHandler;
import com.glodblock.github.glodium.network.packet.CGenericPacket; import com.glodblock.github.glodium.network.packet.CGenericPacket;
import com.glodblock.github.extendedae.client.gui.GuiExPatternTerminal;
import com.glodblock.github.extendedae.client.gui.GuiWirelessExPAT;
import com.glodblock.github.extendedae.container.ContainerExPatternTerminal;
import net.minecraft.client.gui.components.Tooltip; import net.minecraft.client.gui.components.Tooltip;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.inventory.Slot; import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import appeng.api.crafting.PatternDetailsHelper;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;

View File

@ -1,4 +1,4 @@
package com.extendedae_plus.mixin; package com.extendedae_plus.mixin.extendedae;
import com.glodblock.github.extendedae.client.button.HighlightButton; import com.glodblock.github.extendedae.client.button.HighlightButton;
import com.glodblock.github.extendedae.client.gui.GuiExPatternTerminal; import com.glodblock.github.extendedae.client.gui.GuiExPatternTerminal;
@ -49,13 +49,13 @@ public abstract class HighlightButtonMixin {
try { try {
var setMethod = terminal.getClass().getMethod("setCurrentlyChoicePatternProvider", long.class); var setMethod = terminal.getClass().getMethod("setCurrentlyChoicePatternProvider", long.class);
setMethod.invoke(terminal, serverId); setMethod.invoke(terminal, serverId);
} catch (Exception e) { } catch (Exception ignored) {
} }
break; break;
} }
} }
} }
} catch (Exception e) { } catch (Exception ignored) {
} }
} }
} }

View File

@ -1,4 +1,4 @@
package com.extendedae_plus.mixin; package com.extendedae_plus.mixin.extendedae;
import com.extendedae_plus.config.ModConfigs; import com.extendedae_plus.config.ModConfigs;
import com.glodblock.github.extendedae.common.parts.PartExPatternProvider; import com.glodblock.github.extendedae.common.parts.PartExPatternProvider;
@ -17,7 +17,7 @@ public abstract class PartExPatternProviderMixin {
), ),
index = 2 index = 2
) )
private int extendedae_plus$multiplyCapacity(int original) { private int eap$multiplyCapacity(int original) {
int mult = ModConfigs.PAGE_MULTIPLIER.get(); int mult = ModConfigs.PAGE_MULTIPLIER.get();
if (mult < 1) mult = 1; if (mult < 1) mult = 1;
if (mult > 64) mult = 64; if (mult > 64) mult = 64;

View File

@ -1,4 +1,4 @@
package com.extendedae_plus.mixin; package com.extendedae_plus.mixin.extendedae;
import com.extendedae_plus.config.ModConfigs; import com.extendedae_plus.config.ModConfigs;
import com.glodblock.github.extendedae.common.tileentities.TileExPatternProvider; import com.glodblock.github.extendedae.common.tileentities.TileExPatternProvider;
@ -17,7 +17,7 @@ public abstract class TileExPatternProviderMixin {
), ),
index = 2 index = 2
) )
private int extendedae_plus$multiplyCapacity(int original) { private int eap$multiplyCapacity(int original) {
int mult = ModConfigs.PAGE_MULTIPLIER.get(); int mult = ModConfigs.PAGE_MULTIPLIER.get();
if (mult < 1) mult = 1; if (mult < 1) mult = 1;
if (mult > 64) mult = 64; if (mult > 64) mult = 64;

View File

@ -1,13 +1,10 @@
package com.extendedae_plus.network; package com.extendedae_plus.network;
import com.extendedae_plus.ExtendedAEPlus;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.network.NetworkDirection;
import net.minecraftforge.network.NetworkRegistry; import net.minecraftforge.network.NetworkRegistry;
import net.minecraftforge.network.simple.SimpleChannel; 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 { public class ModNetwork {
private static final String PROTOCOL_VERSION = "1"; private static final String PROTOCOL_VERSION = "1";

View File

@ -1,21 +1,18 @@
package com.extendedae_plus.network; 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.networking.IGrid;
import appeng.api.stacks.AEKey; import appeng.api.stacks.AEKey;
import appeng.api.stacks.GenericStack; import appeng.api.stacks.GenericStack;
import appeng.items.tools.powered.WirelessTerminalItem; import appeng.items.tools.powered.WirelessTerminalItem;
import appeng.menu.locator.MenuLocators; import appeng.menu.locator.MenuLocators;
import com.extendedae_plus.menu.locator.CuriosItemLocator;
import appeng.menu.me.crafting.CraftAmountMenu; import appeng.menu.me.crafting.CraftAmountMenu;
import com.extendedae_plus.menu.locator.CuriosItemLocator;
import com.extendedae_plus.util.WirelessTerminalLocator; 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 的下单界面 * C2S JEI 中键点击请求打开 AE 的下单界面

View File

@ -1,33 +1,30 @@
package com.extendedae_plus.network; 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.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.network.NetworkEvent;
import net.minecraft.network.FriendlyByteBuf;
import appeng.api.networking.IGrid; import java.util.function.Supplier;
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;
public class PickFromWirelessC2SPacket { public class PickFromWirelessC2SPacket {
private final BlockPos pos; private final BlockPos pos;

View File

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

View File

@ -1,34 +1,30 @@
package com.extendedae_plus.network; 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.networking.IGrid;
import appeng.api.storage.MEStorage; import appeng.api.networking.energy.IEnergyService;
import appeng.api.storage.StorageHelper;
import appeng.api.stacks.AEItemKey; import appeng.api.stacks.AEItemKey;
import appeng.api.stacks.AEKey; import appeng.api.stacks.AEKey;
import appeng.api.stacks.GenericStack; 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.WirelessCraftingTerminalItem;
import appeng.items.tools.powered.WirelessTerminalItem; import appeng.items.tools.powered.WirelessTerminalItem;
import appeng.me.helpers.PlayerSource; import appeng.me.helpers.PlayerSource;
import appeng.menu.locator.MenuLocators; import appeng.menu.locator.MenuLocators;
import appeng.menu.me.crafting.CraftAmountMenu; import appeng.menu.me.crafting.CraftAmountMenu;
import com.extendedae_plus.menu.locator.CuriosItemLocator;
// 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;
import com.extendedae_plus.util.WirelessTerminalLocator.LocatedTerminal; 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 { public class PullFromJeiOrCraftC2SPacket {
private final GenericStack stack; private final GenericStack stack;

View File

@ -1,18 +1,17 @@
package com.extendedae_plus.network; 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.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.ArrayList;
import java.util.List; import java.util.List;
import java.util.function.Supplier; import java.util.function.Supplier;
import com.extendedae_plus.util.ExtendedAEPatternUploadUtil;
/** /**
* C2S: 请求当前终端可见的样板供应器列表用于弹窗选择 * C2S: 请求当前终端可见的样板供应器列表用于弹窗选择
*/ */

View File

@ -1,17 +1,16 @@
package com.extendedae_plus.network; package com.extendedae_plus.network;
import appeng.menu.implementations.PatternProviderMenu;
import com.extendedae_plus.api.AdvancedBlockingHolder;
import com.extendedae_plus.mixin.ae2.accessor.PatternProviderLogicAccessor;
import com.extendedae_plus.mixin.ae2.accessor.PatternProviderMenuAdvancedAccessor;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraftforge.network.NetworkEvent;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraftforge.network.NetworkDirection; import net.minecraftforge.network.NetworkDirection;
import net.minecraftforge.network.NetworkEvent;
import java.util.function.Supplier; import java.util.function.Supplier;
import appeng.menu.implementations.PatternProviderMenu;
import com.extendedae_plus.mixin.accessor.PatternProviderMenuAdvancedAccessor;
import com.extendedae_plus.api.AdvancedBlockingHolder;
import com.extendedae_plus.mixin.accessor.PatternProviderLogicAccessor;
/** /**
* C2S切换高级阻挡模式 * C2S切换高级阻挡模式
* 不含额外负载直接基于玩家当前打开的 PatternProviderMenu 进行切换 * 不含额外负载直接基于玩家当前打开的 PatternProviderMenu 进行切换
@ -34,15 +33,15 @@ public class ToggleAdvancedBlockingC2SPacket {
// 通过 accessor 获取逻辑与当前状态 // 通过 accessor 获取逻辑与当前状态
var accessor = (PatternProviderMenuAdvancedAccessor) menu; var accessor = (PatternProviderMenuAdvancedAccessor) menu;
var logic = accessor.ext$logic(); var logic = accessor.eap$logic();
if (logic instanceof AdvancedBlockingHolder holder) { if (logic instanceof AdvancedBlockingHolder holder) {
boolean current = holder.ext$getAdvancedBlocking(); boolean current = holder.eap$getAdvancedBlocking();
boolean next = !current; boolean next = !current;
holder.ext$setAdvancedBlocking(next); holder.eap$setAdvancedBlocking(next);
// 关键保存持久化触发 AE2 写入逻辑writeToNBT并由菜单 @GuiSync 同步回客户端 // 关键保存持久化触发 AE2 写入逻辑writeToNBT并由菜单 @GuiSync 同步回客户端
logic.saveChanges(); logic.saveChanges();
// 直接下发 S2C 强制同步带供应器标识维度+方块坐标 // 直接下发 S2C 强制同步带供应器标识维度+方块坐标
var host = ((PatternProviderLogicAccessor) logic).ext$host(); var host = ((PatternProviderLogicAccessor) logic).eap$host();
var be = host.getBlockEntity(); var be = host.getBlockEntity();
var level = be.getLevel(); var level = be.getLevel();
String dimId = level.dimension().location().toString(); String dimId = level.dimension().location().toString();

View File

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

View File

@ -1,46 +1,40 @@
package com.extendedae_plus.util; package com.extendedae_plus.util;
import appeng.api.inventories.InternalInventory;
import appeng.api.crafting.PatternDetailsHelper;
import appeng.api.crafting.IPatternDetails; import appeng.api.crafting.IPatternDetails;
import appeng.api.crafting.PatternDetailsHelper;
import appeng.api.inventories.InternalInventory;
import appeng.api.networking.IGrid; import appeng.api.networking.IGrid;
import appeng.api.networking.IGridNode; import appeng.api.networking.IGridNode;
import appeng.core.definitions.AEItems;
import appeng.crafting.pattern.AECraftingPattern;
import appeng.helpers.patternprovider.PatternContainer; import appeng.helpers.patternprovider.PatternContainer;
import appeng.menu.implementations.PatternAccessTermMenu; import appeng.menu.implementations.PatternAccessTermMenu;
import appeng.menu.me.items.PatternEncodingTermMenu; import appeng.menu.me.items.PatternEncodingTermMenu;
import appeng.crafting.pattern.AECraftingPattern;
import appeng.core.definitions.AEItems;
import appeng.util.inv.FilteredInternalInventory; import appeng.util.inv.FilteredInternalInventory;
import appeng.util.inv.filter.IAEItemFilter; import appeng.util.inv.filter.IAEItemFilter;
import net.minecraft.server.level.ServerPlayer; import com.extendedae_plus.mixin.ae2.accessor.PatternEncodingTermMenuAccessor;
import net.minecraft.world.item.ItemStack;
import net.minecraft.network.chat.Component;
import java.lang.reflect.Field;
import java.util.Map;
import java.util.Set;
import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.nio.file.Path;
import java.nio.file.Files;
import java.io.IOException;
import com.glodblock.github.extendedae.common.tileentities.matrix.TileAssemblerMatrixBase; import com.glodblock.github.extendedae.common.tileentities.matrix.TileAssemblerMatrixBase;
import net.minecraftforge.common.capabilities.ForgeCapabilities;
import net.minecraftforge.fml.loading.FMLPaths;
import net.minecraftforge.items.IItemHandler;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.crafting.RecipeType;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.crafting.RecipeType;
import net.minecraftforge.common.capabilities.ForgeCapabilities;
import net.minecraftforge.fml.loading.FMLPaths;
import net.minecraftforge.items.IItemHandler;
import java.io.IOException;
import java.lang.reflect.Field;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/** /**
* ExtendedAE扩展样板管理终端专用的样板上传工具类 * ExtendedAE扩展样板管理终端专用的样板上传工具类
@ -431,8 +425,8 @@ public class ExtendedAEPatternUploadUtil {
} }
// 读取已编码槽位的物品 // 读取已编码槽位的物品
var encodedSlot = ((com.extendedae_plus.mixin.accessor.PatternEncodingTermMenuAccessor) (Object) menu) var encodedSlot = ((PatternEncodingTermMenuAccessor) (Object) menu)
.epp$getEncodedPatternSlot(); .eap$getEncodedPatternSlot();
ItemStack stack = encodedSlot.getItem(); ItemStack stack = encodedSlot.getItem();
if (stack.isEmpty() || !PatternDetailsHelper.isEncodedPattern(stack)) { if (stack.isEmpty() || !PatternDetailsHelper.isEncodedPattern(stack)) {
sendMessage(player, "ExtendedAE Plus: 没有可上传的编码样板"); sendMessage(player, "ExtendedAE Plus: 没有可上传的编码样板");
@ -465,8 +459,8 @@ public class ExtendedAEPatternUploadUtil {
player.sendSystemMessage(Component.literal("ExtendedAE Plus: 装配矩阵已存在相同样板,已跳过上传并返还空白样板")); player.sendSystemMessage(Component.literal("ExtendedAE Plus: 装配矩阵已存在相同样板,已跳过上传并返还空白样板"));
} }
try { try {
var accessor = (com.extendedae_plus.mixin.accessor.PatternEncodingTermMenuAccessor) (Object) menu; var accessor = (PatternEncodingTermMenuAccessor) (Object) menu;
var blankSlot = accessor.epp$getBlankPatternSlot(); var blankSlot = accessor.eap$getBlankPatternSlot();
ItemStack blanks = AEItems.BLANK_PATTERN.stack(stack.getCount()); ItemStack blanks = AEItems.BLANK_PATTERN.stack(stack.getCount());
if (blankSlot != null && blankSlot.mayPlace(blanks)) { if (blankSlot != null && blankSlot.mayPlace(blanks)) {
ItemStack remain = blankSlot.safeInsert(blanks); ItemStack remain = blankSlot.safeInsert(blanks);
@ -982,8 +976,8 @@ public class ExtendedAEPatternUploadUtil {
return false; return false;
} }
// 读取已编码槽位的物品通过 accessor // 读取已编码槽位的物品通过 accessor
var encodedSlot = ((com.extendedae_plus.mixin.accessor.PatternEncodingTermMenuAccessor) (Object) menu) var encodedSlot = ((PatternEncodingTermMenuAccessor) (Object) menu)
.epp$getEncodedPatternSlot(); .eap$getEncodedPatternSlot();
ItemStack stack = encodedSlot.getItem(); ItemStack stack = encodedSlot.getItem();
if (stack.isEmpty() || !PatternDetailsHelper.isEncodedPattern(stack)) { if (stack.isEmpty() || !PatternDetailsHelper.isEncodedPattern(stack)) {
return false; return false;
@ -1054,8 +1048,8 @@ public class ExtendedAEPatternUploadUtil {
if (player == null || menu == null) { if (player == null || menu == null) {
return false; return false;
} }
var encodedSlot = ((com.extendedae_plus.mixin.accessor.PatternEncodingTermMenuAccessor) (Object) menu) var encodedSlot = ((PatternEncodingTermMenuAccessor) (Object) menu)
.epp$getEncodedPatternSlot(); .eap$getEncodedPatternSlot();
ItemStack stack = encodedSlot.getItem(); ItemStack stack = encodedSlot.getItem();
if (stack.isEmpty() || !PatternDetailsHelper.isEncodedPattern(stack)) { if (stack.isEmpty() || !PatternDetailsHelper.isEncodedPattern(stack)) {
return false; return false;
@ -1192,8 +1186,8 @@ public class ExtendedAEPatternUploadUtil {
var container = list.get(index); var container = list.get(index);
if (container == null) return false; if (container == null) return false;
var encodedSlot = ((com.extendedae_plus.mixin.accessor.PatternEncodingTermMenuAccessor) (Object) menu) var encodedSlot = ((PatternEncodingTermMenuAccessor) (Object) menu)
.epp$getEncodedPatternSlot(); .eap$getEncodedPatternSlot();
ItemStack stack = encodedSlot.getItem(); ItemStack stack = encodedSlot.getItem();
if (stack.isEmpty() || !PatternDetailsHelper.isEncodedPattern(stack)) { if (stack.isEmpty() || !PatternDetailsHelper.isEncodedPattern(stack)) {
return false; return false;

View File

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

View File

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

View File

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

View File

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

View File

@ -4,36 +4,39 @@
"compatibilityLevel": "JAVA_17", "compatibilityLevel": "JAVA_17",
"minVersion": "0.8", "minVersion": "0.8",
"client": [ "client": [
"GuiExPatternProviderMixin",
"SlotGridLayoutMixin",
"GuiExPatternTerminalMixin",
"HighlightButtonMixin",
"PickFromWirelessMixin", "PickFromWirelessMixin",
"PatternEncodingTermScreenMixin",
"ae2.PatternProviderScreenMixin",
"jei.EncodePatternTransferHandlerMixin",
"ae2.QuartzCuttingKnifeItemMixin",
"accessor.AEBaseScreenAccessor",
"accessor.AbstractContainerScreenAccessor", "accessor.AbstractContainerScreenAccessor",
"accessor.ScreenAccessor", "accessor.ScreenAccessor",
"accessor.MEStorageScreenAccessor" "accessor.ScreenInvoker",
"ae2.PatternEncodingTermScreenMixin",
"ae2.PatternProviderScreenMixin",
"ae2.QuartzCuttingKnifeItemMixin",
"ae2.SlotGridLayoutMixin",
"ae2.accessor.AEBaseScreenAccessor",
"ae2.accessor.AEBaseScreenInvoker",
"ae2.accessor.MEStorageScreenAccessor",
"extendedae.GuiExPatternProviderMixin",
"extendedae.GuiExPatternTerminalMixin",
"extendedae.HighlightButtonMixin",
"jei.EncodePatternTransferHandlerMixin"
], ],
"mixins": [ "mixins": [
"ContainerExPatternProviderMixin", "ae2.ContainerPatternEncodingTermMenuMixin",
"ContainerExPatternTerminalMixin", "ae2.MEStorageMenuMixin",
"ContainerWirelessExPatternTerminalMixin", "ae2.PatternEncodingTermMenuMixin",
"ContainerUWirelessExPatternTerminalMixin",
"TileExPatternProviderMixin",
"PartExPatternProviderMixin",
"PatternEncodingTermMenuMixin",
"ContainerPatternEncodingTermMenuMixin",
"MEStorageMenuMixin",
"accessor.MEStorageMenuAccessor",
"accessor.PatternEncodingTermMenuAccessor",
"ae2.PatternProviderLogicAdvancedMixin", "ae2.PatternProviderLogicAdvancedMixin",
"ae2.PatternProviderMenuAdvancedMixin", "ae2.PatternProviderMenuAdvancedMixin",
"accessor.PatternProviderMenuAdvancedAccessor", "ae2.accessor.MEStorageMenuAccessor",
"accessor.PatternProviderLogicAccessor" "ae2.accessor.PatternEncodingTermMenuAccessor",
"ae2.accessor.PatternProviderLogicAccessor",
"ae2.accessor.PatternProviderLogicPatternInputsAccessor",
"ae2.accessor.PatternProviderMenuAdvancedAccessor",
"ae2WTlib.ContainerUWirelessExPatternTerminalMixin",
"extendedae.ContainerExPatternProviderMixin",
"extendedae.ContainerExPatternTerminalMixin",
"extendedae.ContainerWirelessExPatternTerminalMixin",
"extendedae.PartExPatternProviderMixin",
"extendedae.TileExPatternProviderMixin"
], ],
"injectors": { "injectors": {
"defaultRequire": 1 "defaultRequire": 1