commit
0db35edb8f
|
|
@ -94,6 +94,15 @@ dependencies {
|
|||
modCompileOnly "curse.maven:just-enough-characters-250702:6680042"
|
||||
}
|
||||
|
||||
// 忽略所有过时警告
|
||||
gradle.projectsEvaluated {
|
||||
tasks.withType(JavaCompile).tap {
|
||||
configureEach {
|
||||
options.compilerArgs << "-Xlint:-deprecation"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
processResources {
|
||||
inputs.property 'version', project.version
|
||||
|
||||
|
|
|
|||
|
|
@ -1,19 +1,20 @@
|
|||
package com.extendedae_plus;
|
||||
|
||||
import appeng.menu.locator.MenuLocators;
|
||||
import com.extendedae_plus.config.ModConfigs;
|
||||
import com.extendedae_plus.init.ModBlockEntities;
|
||||
import com.extendedae_plus.init.ModBlocks;
|
||||
import com.extendedae_plus.init.ModCreativeTabs;
|
||||
import com.extendedae_plus.init.ModItems;
|
||||
import com.extendedae_plus.menu.locator.CuriosItemLocator;
|
||||
import com.extendedae_plus.network.ModNetwork;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.eventbus.api.IEventBus;
|
||||
import net.minecraftforge.fml.ModLoadingContext;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
import net.minecraftforge.fml.config.ModConfig;
|
||||
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
|
||||
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
|
||||
import net.minecraftforge.fml.ModLoadingContext;
|
||||
import net.minecraftforge.fml.config.ModConfig;
|
||||
import com.extendedae_plus.config.ModConfigs;
|
||||
import com.extendedae_plus.init.ModBlocks;
|
||||
import com.extendedae_plus.init.ModBlockEntities;
|
||||
import com.extendedae_plus.init.ModItems;
|
||||
import com.extendedae_plus.init.ModCreativeTabs;
|
||||
import com.extendedae_plus.network.ModNetwork;
|
||||
import com.extendedae_plus.menu.locator.CuriosItemLocator;
|
||||
import appeng.menu.locator.MenuLocators;
|
||||
|
||||
/**
|
||||
* ExtendedAE Plus 主mod类
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
package com.extendedae_plus;
|
||||
|
||||
import appeng.client.gui.style.Blitter;
|
||||
import com.glodblock.github.extendedae.ExtendedAE;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
|
||||
public class NewIcon {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,6 @@
|
|||
package com.extendedae_plus.api;
|
||||
|
||||
public interface AdvancedBlockingHolder {
|
||||
boolean eap$getAdvancedBlocking();
|
||||
void eap$setAdvancedBlocking(boolean value);
|
||||
}
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
package com.extendedae_plus.api;
|
||||
|
||||
public interface PatternProviderMenuAdvancedSync {
|
||||
boolean ext$getAdvancedBlockingSynced();
|
||||
boolean eap$getAdvancedBlockingSynced();
|
||||
}
|
||||
|
|
@ -1,19 +1,16 @@
|
|||
package com.extendedae_plus.client;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
|
||||
import appeng.api.stacks.GenericStack;
|
||||
import appeng.client.gui.me.common.MEStorageScreen;
|
||||
import appeng.integration.modules.jei.GenericEntryStackHelper;
|
||||
import com.extendedae_plus.ExtendedAEPlus;
|
||||
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.OpenCraftFromJeiC2SPacket;
|
||||
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.ingredients.ITypedIngredient;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.screens.Screen;
|
||||
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.eventbus.api.SubscribeEvent;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
import appeng.client.gui.me.common.MEStorageScreen;
|
||||
import com.extendedae_plus.mixin.accessor.MEStorageScreenAccessor;
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
@Mod.EventBusSubscriber(modid = ExtendedAEPlus.MODID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.FORGE)
|
||||
public final class InputEvents {
|
||||
|
|
@ -111,8 +109,8 @@ public final class InputEvents {
|
|||
if (screen instanceof MEStorageScreen<?> me) {
|
||||
try {
|
||||
MEStorageScreenAccessor acc = (MEStorageScreenAccessor) (Object) me;
|
||||
acc.ext$getSearchField().setValue(name);
|
||||
acc.ext$setSearchText(name); // 同步到 Repo 并刷新
|
||||
acc.eap$getSearchField().setValue(name);
|
||||
acc.eap$setSearchText(name); // 同步到 Repo 并刷新
|
||||
event.setCanceled(true);
|
||||
return;
|
||||
} catch (Throwable ignored) {
|
||||
|
|
|
|||
|
|
@ -8,11 +8,7 @@ import net.minecraft.client.gui.components.EditBox;
|
|||
import net.minecraft.client.gui.screens.Screen;
|
||||
import net.minecraft.network.chat.Component;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Objects;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* 简单的供应器选择弹窗。
|
||||
|
|
|
|||
|
|
@ -1,10 +1,12 @@
|
|||
package com.extendedae_plus.content.wireless;
|
||||
|
||||
import com.extendedae_plus.init.ModBlockEntities;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.world.InteractionHand;
|
||||
import net.minecraft.world.InteractionResult;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.level.BlockGetter;
|
||||
import net.minecraft.world.item.Items;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.EntityBlock;
|
||||
|
|
@ -13,10 +15,6 @@ import net.minecraft.world.level.block.entity.BlockEntityTicker;
|
|||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.phys.BlockHitResult;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import com.extendedae_plus.init.ModBlockEntities;
|
||||
import net.minecraft.world.item.Items;
|
||||
import net.minecraft.network.chat.Component;
|
||||
|
||||
public class WirelessTransceiverBlock extends Block implements EntityBlock {
|
||||
public WirelessTransceiverBlock(Properties props) {
|
||||
|
|
|
|||
|
|
@ -1,23 +1,20 @@
|
|||
package com.extendedae_plus.content.wireless;
|
||||
|
||||
import appeng.api.networking.GridHelper;
|
||||
import appeng.api.networking.IGridNode;
|
||||
import appeng.api.networking.IGridNodeListener;
|
||||
import appeng.api.networking.IManagedGridNode;
|
||||
import appeng.api.networking.IInWorldGridNodeHost;
|
||||
import appeng.api.networking.*;
|
||||
import com.extendedae_plus.init.ModBlockEntities;
|
||||
import com.extendedae_plus.init.ModItems;
|
||||
import com.extendedae_plus.wireless.IWirelessEndpoint;
|
||||
import com.extendedae_plus.wireless.WirelessMasterLink;
|
||||
import com.extendedae_plus.wireless.WirelessSlaveLink;
|
||||
import com.extendedae_plus.init.ModBlockEntities;
|
||||
import com.extendedae_plus.init.ModItems;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.core.Direction;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.EnumSet;
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package com.extendedae_plus.hooks;
|
||||
|
||||
import appeng.util.InteractionUtil;
|
||||
import com.extendedae_plus.ExtendedAEPlus;
|
||||
import com.extendedae_plus.content.wireless.WirelessTransceiverBlockEntity;
|
||||
import net.minecraft.network.chat.Component;
|
||||
|
|
@ -15,7 +16,6 @@ import net.minecraftforge.event.entity.player.PlayerInteractEvent;
|
|||
import net.minecraftforge.eventbus.api.Event;
|
||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
import appeng.util.InteractionUtil;
|
||||
|
||||
@Mod.EventBusSubscriber(modid = ExtendedAEPlus.MODID)
|
||||
public final class WrenchHook {
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
package com.extendedae_plus.init;
|
||||
|
||||
import com.extendedae_plus.ExtendedAEPlus;
|
||||
import net.minecraft.core.registries.Registries;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.world.item.CreativeModeTab;
|
||||
import net.minecraftforge.registries.DeferredRegister;
|
||||
import net.minecraft.core.registries.Registries;
|
||||
import net.minecraftforge.registries.RegistryObject;
|
||||
|
||||
public final class ModCreativeTabs {
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ package com.extendedae_plus.init;
|
|||
|
||||
import com.extendedae_plus.ExtendedAEPlus;
|
||||
import net.minecraft.world.item.BlockItem;
|
||||
import net.minecraft.world.item.CreativeModeTab;
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraftforge.registries.DeferredRegister;
|
||||
import net.minecraftforge.registries.ForgeRegistries;
|
||||
|
|
|
|||
|
|
@ -1,12 +1,11 @@
|
|||
package com.extendedae_plus.integration.jei;
|
||||
|
||||
import com.extendedae_plus.ExtendedAEPlus;
|
||||
import mezz.jei.api.IModPlugin;
|
||||
import mezz.jei.api.JeiPlugin;
|
||||
import mezz.jei.api.runtime.IJeiRuntime;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
|
||||
import com.extendedae_plus.ExtendedAEPlus;
|
||||
|
||||
@JeiPlugin
|
||||
public class ExtendedAEJeiPlugin implements IModPlugin {
|
||||
private static final ResourceLocation UID = new ResourceLocation(ExtendedAEPlus.MODID, "jei_plugin");
|
||||
|
|
|
|||
|
|
@ -1,15 +1,14 @@
|
|||
package com.extendedae_plus.integration.jei;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import mezz.jei.api.ingredients.ITypedIngredient;
|
||||
import mezz.jei.api.constants.VanillaTypes;
|
||||
import mezz.jei.api.ingredients.ITypedIngredient;
|
||||
import mezz.jei.api.runtime.IBookmarkOverlay;
|
||||
import mezz.jei.api.runtime.IIngredientListOverlay;
|
||||
import mezz.jei.api.runtime.IJeiRuntime;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* 线程安全地缓存并访问 JEI Runtime。
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,19 +1,15 @@
|
|||
package com.extendedae_plus.menu.host;
|
||||
|
||||
import java.util.function.BiConsumer;
|
||||
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.inventory.AbstractContainerMenu;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
|
||||
import appeng.menu.ISubMenu;
|
||||
import de.mari_023.ae2wtlib.terminal.WTMenuHost;
|
||||
|
||||
// Curios API
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.inventory.AbstractContainerMenu;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import top.theillusivec4.curios.api.type.inventory.ICurioStacksHandler;
|
||||
|
||||
import java.util.function.BiConsumer;
|
||||
|
||||
/**
|
||||
* 针对 Curios 槽位的 ae2wtlib WTMenuHost 适配器:
|
||||
* - 复用 wtlib 的量子卡跨维/跨距逻辑(rangeCheck/isQuantumLinked)。
|
||||
|
|
|
|||
|
|
@ -1,17 +1,11 @@
|
|||
package com.extendedae_plus.menu.host;
|
||||
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import appeng.api.storage.ISubMenuHost;
|
||||
import appeng.helpers.WirelessTerminalMenuHost;
|
||||
import appeng.menu.ISubMenu;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.inventory.AbstractContainerMenu;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
|
||||
import appeng.api.implementations.menuobjects.ItemMenuHost;
|
||||
import appeng.helpers.WirelessTerminalMenuHost;
|
||||
import appeng.menu.ISubMenu;
|
||||
import appeng.api.storage.ISubMenuHost;
|
||||
|
||||
// Curios API
|
||||
import top.theillusivec4.curios.api.type.inventory.ICurioStacksHandler;
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -1,27 +1,21 @@
|
|||
package com.extendedae_plus.menu.locator;
|
||||
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
|
||||
import appeng.api.implementations.menuobjects.IMenuItem;
|
||||
import appeng.api.implementations.menuobjects.ItemMenuHost;
|
||||
import appeng.helpers.WirelessTerminalMenuHost;
|
||||
import appeng.items.tools.powered.WirelessTerminalItem;
|
||||
import appeng.menu.MenuOpener;
|
||||
import appeng.menu.me.common.MEStorageMenu;
|
||||
import appeng.menu.locator.MenuLocator;
|
||||
import com.extendedae_plus.menu.host.CuriosWirelessTerminalMenuHost;
|
||||
|
||||
// ae2wtlib
|
||||
import de.mari_023.ae2wtlib.wut.WUTHandler;
|
||||
import de.mari_023.ae2wtlib.wut.WTDefinition;
|
||||
import de.mari_023.ae2wtlib.terminal.WTMenuHost;
|
||||
import appeng.menu.me.common.MEStorageMenu;
|
||||
import com.extendedae_plus.menu.host.CuriosWTMenuHost;
|
||||
|
||||
// Curios API (软依赖)
|
||||
import com.extendedae_plus.menu.host.CuriosWirelessTerminalMenuHost;
|
||||
import de.mari_023.ae2wtlib.terminal.WTMenuHost;
|
||||
import de.mari_023.ae2wtlib.wut.WTDefinition;
|
||||
import de.mari_023.ae2wtlib.wut.WUTHandler;
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import top.theillusivec4.curios.api.CuriosApi;
|
||||
import top.theillusivec4.curios.api.type.inventory.ICurioStacksHandler;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,22 +1,20 @@
|
|||
package com.extendedae_plus.mixin;
|
||||
|
||||
import com.extendedae_plus.network.ModNetwork;
|
||||
import com.extendedae_plus.network.PickFromWirelessC2SPacket;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.player.LocalPlayer;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.level.GameType;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.phys.BlockHitResult;
|
||||
import net.minecraft.world.phys.HitResult;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.player.LocalPlayer;
|
||||
import net.minecraft.world.level.GameType;
|
||||
import net.minecraft.world.phys.BlockHitResult;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import net.minecraft.world.phys.HitResult;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
|
||||
import com.extendedae_plus.network.ModNetwork;
|
||||
import com.extendedae_plus.network.PickFromWirelessC2SPacket;
|
||||
// no client-side WCT gating; server will check presence (including Curios)
|
||||
|
||||
|
||||
|
|
@ -26,7 +24,7 @@ public class PickFromWirelessMixin {
|
|||
@Shadow public HitResult hitResult;
|
||||
|
||||
@Inject(method = "pickBlock", at = @At("HEAD"), cancellable = true)
|
||||
private void extendedae_plus$pickFromAeWireless(CallbackInfo ci) {
|
||||
private void eap$pickFromAeWireless(CallbackInfo ci) {
|
||||
if (this.player == null || this.hitResult == null || this.hitResult.getType() != HitResult.Type.BLOCK) {
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,15 +1,14 @@
|
|||
package com.extendedae_plus.mixin.accessor;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
|
||||
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
|
||||
import net.minecraft.world.inventory.AbstractContainerMenu;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
|
||||
@Mixin(AbstractContainerScreen.class)
|
||||
public interface AbstractContainerScreenAccessor<T extends AbstractContainerMenu> {
|
||||
@Accessor("leftPos") int extendedae_plus$getLeftPos();
|
||||
@Accessor("topPos") int extendedae_plus$getTopPos();
|
||||
@Accessor("imageWidth") int extendedae_plus$getImageWidth();
|
||||
@Accessor("imageHeight") int extendedae_plus$getImageHeight();
|
||||
@Accessor("leftPos") int eap$getLeftPos();
|
||||
@Accessor("topPos") int eap$getTopPos();
|
||||
@Accessor("imageWidth") int eap$getImageWidth();
|
||||
@Accessor("imageHeight") int eap$getImageHeight();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,19 +1,18 @@
|
|||
package com.extendedae_plus.mixin.accessor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
|
||||
import net.minecraft.client.gui.components.Renderable;
|
||||
import net.minecraft.client.gui.components.events.GuiEventListener;
|
||||
import net.minecraft.client.gui.screens.Screen;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Mixin(Screen.class)
|
||||
public interface ScreenAccessor {
|
||||
@Accessor("renderables")
|
||||
List<Renderable> extendedae_plus$getRenderables();
|
||||
List<Renderable> eap$getRenderables();
|
||||
|
||||
@Accessor("children")
|
||||
List<GuiEventListener> extendedae_plus$getChildren();
|
||||
List<GuiEventListener> eap$getChildren();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,14 +1,13 @@
|
|||
package com.extendedae_plus.mixin.accessor;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Invoker;
|
||||
|
||||
import net.minecraft.client.gui.components.Renderable;
|
||||
import net.minecraft.client.gui.components.events.GuiEventListener;
|
||||
import net.minecraft.client.gui.screens.Screen;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Invoker;
|
||||
|
||||
@Mixin(Screen.class)
|
||||
public interface ScreenInvoker {
|
||||
@Invoker("addRenderableWidget")
|
||||
<W extends GuiEventListener & Renderable> W extendedae_plus$invokeAddRenderableWidget(W widget);
|
||||
<W extends GuiEventListener & Renderable> W eap$invokeAddRenderableWidget(W widget);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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.slot.RestrictedInputSlot;
|
||||
import appeng.api.crafting.PatternDetailsHelper;
|
||||
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.Paras;
|
||||
import com.extendedae_plus.util.ExtendedAEPatternUploadUtil;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
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;
|
||||
|
|
@ -20,6 +20,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|||
import java.util.Map;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import static com.extendedae_plus.util.ExtendedAELogger.LOGGER;
|
||||
/**
|
||||
* 给 AE2 的 PatternEncodingTermMenu 增加一个通用动作持有者,实现接收 EPP 的 CGenericPacket 动作。
|
||||
* 注册动作 "upload_to_matrix":仅上传“合成图样”到 ExtendedAE 装配矩阵。
|
||||
|
|
@ -28,7 +29,7 @@ import java.util.function.Consumer;
|
|||
public abstract class ContainerPatternEncodingTermMenuMixin implements IActionHolder {
|
||||
|
||||
@Unique
|
||||
private final Map<String, Consumer<Paras>> actions = createHolder();
|
||||
private final Map<String, Consumer<Paras>> eap$actions = createHolder();
|
||||
|
||||
@Unique
|
||||
private Player epp$player;
|
||||
|
|
@ -37,7 +38,7 @@ public abstract class ContainerPatternEncodingTermMenuMixin implements IActionHo
|
|||
private RestrictedInputSlot encodedPatternSlot;
|
||||
|
||||
@Unique
|
||||
private void epp$scheduleUploadWithRetry(ServerPlayer sp, PatternEncodingTermMenu menu, int attemptsLeft) {
|
||||
private void eap$scheduleUploadWithRetry(ServerPlayer sp, PatternEncodingTermMenu menu, int attemptsLeft) {
|
||||
sp.server.execute(() -> {
|
||||
try {
|
||||
if (attemptsLeft < 0) {
|
||||
|
|
@ -49,26 +50,25 @@ public abstract class ContainerPatternEncodingTermMenuMixin implements IActionHo
|
|||
} else {
|
||||
// 槽位可能尚未同步到位,继续下一 tick 重试
|
||||
if (attemptsLeft > 0) {
|
||||
epp$scheduleUploadWithRetry(sp, menu, attemptsLeft - 1);
|
||||
} else {
|
||||
|
||||
eap$scheduleUploadWithRetry(sp, menu, attemptsLeft - 1);
|
||||
}
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
LOGGER.error("Error uploading pattern to matrix", t);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// AE2 终端主构造:PatternEncodingTermMenu(int id, Inventory ip, IPatternTerminalMenuHost host)
|
||||
@Inject(method = "<init>(ILnet/minecraft/world/entity/player/Inventory;Lappeng/helpers/IPatternTerminalMenuHost;)V", at = @At("TAIL"), remap = false)
|
||||
private void epp$ctorA(int id, net.minecraft.world.entity.player.Inventory ip, appeng.helpers.IPatternTerminalMenuHost host, CallbackInfo ci) {
|
||||
private void eap$ctorA(int id, net.minecraft.world.entity.player.Inventory ip, appeng.helpers.IPatternTerminalMenuHost host, CallbackInfo ci) {
|
||||
this.epp$player = ip.player;
|
||||
// 不再注册任何上传相关动作
|
||||
}
|
||||
|
||||
// AE2 另一个构造:PatternEncodingTermMenu(MenuType, int, Inventory, IPatternTerminalMenuHost, boolean)
|
||||
@Inject(method = "<init>(Lnet/minecraft/world/inventory/MenuType;ILnet/minecraft/world/entity/player/Inventory;Lappeng/helpers/IPatternTerminalMenuHost;Z)V", at = @At("TAIL"), remap = false)
|
||||
private void epp$ctorB(net.minecraft.world.inventory.MenuType<?> menuType, int id, net.minecraft.world.entity.player.Inventory ip, appeng.helpers.IPatternTerminalMenuHost host, boolean bindInventory, CallbackInfo ci) {
|
||||
private void eap$ctorB(net.minecraft.world.inventory.MenuType<?> menuType, int id, net.minecraft.world.entity.player.Inventory ip, appeng.helpers.IPatternTerminalMenuHost host, boolean bindInventory, CallbackInfo ci) {
|
||||
this.epp$player = ip.player;
|
||||
// 不再注册任何上传相关动作
|
||||
}
|
||||
|
|
@ -76,12 +76,12 @@ public abstract class ContainerPatternEncodingTermMenuMixin implements IActionHo
|
|||
@NotNull
|
||||
@Override
|
||||
public Map<String, Consumer<Paras>> getActionMap() {
|
||||
return this.actions;
|
||||
return this.eap$actions;
|
||||
}
|
||||
|
||||
// 服务器端:在 encode() 执行完毕后,如果已编码槽位存在样板且当前为“合成模式”,则上传到装配矩阵
|
||||
@Inject(method = "encode", at = @At("TAIL"), remap = false)
|
||||
private void epp$serverUploadAfterEncode(CallbackInfo ci) {
|
||||
private void eap$serverUploadAfterEncode(CallbackInfo ci) {
|
||||
try {
|
||||
if (!(this.epp$player instanceof ServerPlayer sp)) {
|
||||
return; // 仅服务器执行
|
||||
|
|
@ -104,10 +104,11 @@ public abstract class ContainerPatternEncodingTermMenuMixin implements IActionHo
|
|||
sp.server.execute(() -> {
|
||||
try {
|
||||
ExtendedAEPatternUploadUtil.uploadFromEncodingMenuToMatrix(sp, menu);
|
||||
} catch (Throwable t) {
|
||||
} catch (Throwable ignored) {
|
||||
}
|
||||
});
|
||||
} catch (Throwable t) {
|
||||
LOGGER.error("Error uploading pattern to matrix", t);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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.Unique;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
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)
|
||||
* 而客户端 clientCM 未注册时,AE2 在同步环节会对 clientCM 执行 getSetting,
|
||||
* 进而抛出 UnsupportedSettingException。
|
||||
*
|
||||
* <p>
|
||||
* 方案:在服务端首次 broadcastChanges 时,仅为“客户端缺失”的设置执行注册补齐,且占位值与服务端不同,
|
||||
* 以确保 AE2 后续仍会发送 ConfigValuePacket 完成真正的值同步,避免影响排序等行为。
|
||||
*/
|
||||
|
|
@ -23,12 +22,12 @@ import appeng.api.config.Setting;
|
|||
public abstract class MEStorageMenuMixin {
|
||||
|
||||
@Unique
|
||||
private boolean extendedae_plus$settingsMirrored = false;
|
||||
private boolean eap$settingsMirrored = false;
|
||||
|
||||
@Inject(method = "broadcastChanges", at = @At("HEAD"))
|
||||
private void extendedae_plus$mirrorServerSettingsToClient(CallbackInfo ci) {
|
||||
private void eap$mirrorServerSettingsToClient(CallbackInfo ci) {
|
||||
var self = (MEStorageMenu) (Object) this;
|
||||
if (this.extendedae_plus$settingsMirrored) {
|
||||
if (this.eap$settingsMirrored) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
|
|
@ -51,30 +50,29 @@ public abstract class MEStorageMenuMixin {
|
|||
if (!clientHasSetting) {
|
||||
try {
|
||||
Object serverValue = server.getSetting(setting);
|
||||
Object placeholder = extendedae_plus$chooseDifferentEnumValue(serverValue);
|
||||
Object placeholder = eap$chooseDifferentEnumValue(serverValue);
|
||||
if (placeholder == null) {
|
||||
// 若无法选择不同的占位值(例如只有一个枚举常量),则退回服务端值
|
||||
placeholder = serverValue;
|
||||
}
|
||||
// 使用辅助方法,统一进行受检的泛型转换后再注册
|
||||
extendedae_plus$registerSettingCompat(client, setting, placeholder);
|
||||
eap$registerSettingCompat(client, setting, placeholder);
|
||||
} catch (Throwable ignore) {
|
||||
// 防御:不让异常影响主流程
|
||||
}
|
||||
}
|
||||
}
|
||||
this.extendedae_plus$settingsMirrored = true;
|
||||
this.eap$settingsMirrored = true;
|
||||
} catch (Throwable t) {
|
||||
// 防御:绝不让同步失败导致崩溃
|
||||
}
|
||||
}
|
||||
|
||||
@Unique
|
||||
private Object extendedae_plus$chooseDifferentEnumValue(Object serverValue) {
|
||||
private Object eap$chooseDifferentEnumValue(Object serverValue) {
|
||||
if (!(serverValue instanceof Enum<?> sv)) {
|
||||
return null;
|
||||
}
|
||||
@SuppressWarnings("unchecked")
|
||||
Class<? extends Enum<?>> enumClass = sv.getDeclaringClass();
|
||||
Object[] constants = enumClass.getEnumConstants();
|
||||
if (constants == null || constants.length == 0) {
|
||||
|
|
@ -90,7 +88,7 @@ public abstract class MEStorageMenuMixin {
|
|||
|
||||
@Unique
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
private static <T extends Enum<T>> void extendedae_plus$registerSettingCompat(
|
||||
private static <T extends Enum<T>> void eap$registerSettingCompat(
|
||||
IConfigManager client, Setting<?> setting, Object value) {
|
||||
// 前置校验:仅处理枚举类型的设置值
|
||||
if (!(value instanceof Enum<?>)) {
|
||||
|
|
@ -1,42 +1,38 @@
|
|||
package com.extendedae_plus.mixin;
|
||||
|
||||
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;
|
||||
package com.extendedae_plus.mixin.ae2;
|
||||
|
||||
import appeng.api.inventories.InternalInventory;
|
||||
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.AEKey;
|
||||
import appeng.api.storage.MEStorage;
|
||||
import appeng.api.storage.StorageHelper;
|
||||
import appeng.core.definitions.AEItems;
|
||||
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 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)
|
||||
public abstract class PatternEncodingTermMenuMixin {
|
||||
|
||||
// 防止重复执行
|
||||
@org.spongepowered.asm.mixin.Unique
|
||||
private boolean extendedae_plus$blankAutoFilled = false;
|
||||
@Unique
|
||||
private boolean eap$blankAutoFilled = false;
|
||||
|
||||
@Shadow
|
||||
private RestrictedInputSlot blankPatternSlot;
|
||||
|
||||
@org.spongepowered.asm.mixin.Unique
|
||||
private void extendedae_plus$tryFill(IPatternTerminalMenuHost host, Inventory ip) {
|
||||
@Unique
|
||||
private void eap$tryFill(IPatternTerminalMenuHost host, Inventory ip) {
|
||||
try {
|
||||
var self = (PatternEncodingTermMenu) (Object) this;
|
||||
var player = ip.player;
|
||||
|
|
@ -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",
|
||||
at = @At("TAIL"))
|
||||
private void extendedae_plus$autoFillBlankPattern(MenuType<?> menuType, int id, Inventory ip,
|
||||
IPatternTerminalMenuHost host, boolean bindInventory,
|
||||
CallbackInfo ci) {
|
||||
extendedae_plus$tryFill(host, ip);
|
||||
private void eap$autoFillBlankPattern(MenuType<?> menuType, int id, Inventory ip,
|
||||
IPatternTerminalMenuHost host, boolean bindInventory,
|
||||
CallbackInfo ci) {
|
||||
eap$tryFill(host, ip);
|
||||
}
|
||||
|
||||
@Inject(method = "<init>(ILnet/minecraft/world/entity/player/Inventory;Lappeng/helpers/IPatternTerminalMenuHost;)V",
|
||||
at = @At("TAIL"))
|
||||
private void extendedae_plus$autoFillCtor3(int id, Inventory ip, IPatternTerminalMenuHost host, CallbackInfo ci) {
|
||||
extendedae_plus$tryFill(host, ip);
|
||||
private void eap$autoFillCtor3(int id, Inventory ip, IPatternTerminalMenuHost host, CallbackInfo ci) {
|
||||
eap$tryFill(host, ip);
|
||||
}
|
||||
|
||||
// 在首次 broadcastChanges 后再尝试一次,避免构造时网络未激活
|
||||
@Inject(method = "broadcastChanges", at = @At("TAIL"))
|
||||
private void extendedae_plus$retryFillAfterPower(CallbackInfo ci) {
|
||||
if (this.extendedae_plus$blankAutoFilled) {
|
||||
private void eap$retryFillAfterPower(CallbackInfo ci) {
|
||||
if (this.eap$blankAutoFilled) {
|
||||
return;
|
||||
}
|
||||
// 仅在服务器端执行
|
||||
|
|
@ -132,7 +128,7 @@ public abstract class PatternEncodingTermMenuMixin {
|
|||
int space = Math.max(0, limit - current.getCount());
|
||||
space = Math.min(space, AEItems.BLANK_PATTERN.asItem().getMaxStackSize());
|
||||
if (space <= 0) {
|
||||
this.extendedae_plus$blankAutoFilled = true;
|
||||
this.eap$blankAutoFilled = true;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -154,6 +150,6 @@ public abstract class PatternEncodingTermMenuMixin {
|
|||
if (leftover > 0) {
|
||||
StorageHelper.poweredInsert(power, storage, blankKey, leftover, self.getActionSource());
|
||||
}
|
||||
this.extendedae_plus$blankAutoFilled = true;
|
||||
this.eap$blankAutoFilled = true;
|
||||
}
|
||||
}
|
||||
|
|
@ -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.Icon;
|
||||
import appeng.client.gui.me.items.PatternEncodingTermScreen;
|
||||
import appeng.client.gui.style.ScreenStyle;
|
||||
import appeng.client.gui.style.WidgetStyle;
|
||||
import appeng.client.gui.widgets.IconButton;
|
||||
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.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> {
|
||||
|
||||
@Unique
|
||||
private IconButton extendedae_plus$uploadBtn;
|
||||
private IconButton eap$uploadBtn;
|
||||
|
||||
@Inject(method = "init", at = @At("TAIL"))
|
||||
private void extendedae_plus$addUploadButton(CallbackInfo ci) {
|
||||
private void eap$addUploadButton(CallbackInfo ci) {
|
||||
// 仅在图样编码终端界面中添加按钮
|
||||
if (!(((Object) this) instanceof PatternEncodingTermScreen)) {
|
||||
return;
|
||||
}
|
||||
// 复用已存在的按钮实例,避免重复创建
|
||||
if (extendedae_plus$uploadBtn == null) {
|
||||
extendedae_plus$uploadBtn = new IconButton(btn -> ModNetwork.CHANNEL
|
||||
if (eap$uploadBtn == null) {
|
||||
eap$uploadBtn = new IconButton(btn -> ModNetwork.CHANNEL
|
||||
.sendToServer(new com.extendedae_plus.network.RequestProvidersListC2SPacket())) {
|
||||
private final float extendedae_plus$scale = 0.75f; // 约 12x12
|
||||
private final float eap$scale = 0.75f; // 约 12x12
|
||||
|
||||
@Override
|
||||
protected Icon getIcon() {
|
||||
|
|
@ -63,8 +60,8 @@ public abstract class PatternEncodingTermScreenMixin<T extends AEBaseMenu> {
|
|||
}
|
||||
|
||||
// 动态更新宽高用于聚焦边框/命中框
|
||||
this.width = Math.round(16 * extendedae_plus$scale);
|
||||
this.height = Math.round(16 * extendedae_plus$scale);
|
||||
this.width = Math.round(16 * eap$scale);
|
||||
this.height = Math.round(16 * eap$scale);
|
||||
|
||||
com.mojang.blaze3d.systems.RenderSystem.disableDepthTest();
|
||||
com.mojang.blaze3d.systems.RenderSystem.enableBlend();
|
||||
|
|
@ -79,7 +76,7 @@ public abstract class PatternEncodingTermScreenMixin<T extends AEBaseMenu> {
|
|||
var pose = guiGraphics.pose();
|
||||
pose.pushPose();
|
||||
pose.translate(getX(), getY(), 0.0F);
|
||||
pose.scale(extendedae_plus$scale, extendedae_plus$scale, 1.f);
|
||||
pose.scale(eap$scale, eap$scale, 1.f);
|
||||
if (!this.isDisableBackground()) {
|
||||
Icon.TOOLBAR_BUTTON_BACKGROUND.getBlitter().dest(0, 0).blit(guiGraphics);
|
||||
}
|
||||
|
|
@ -92,20 +89,20 @@ public abstract class PatternEncodingTermScreenMixin<T extends AEBaseMenu> {
|
|||
|
||||
@Override
|
||||
public Rect2i getTooltipArea() {
|
||||
return new Rect2i(getX(), getY(), Math.round(16 * extendedae_plus$scale), Math.round(16 * extendedae_plus$scale));
|
||||
return new Rect2i(getX(), getY(), Math.round(16 * eap$scale), Math.round(16 * eap$scale));
|
||||
}
|
||||
};
|
||||
extendedae_plus$uploadBtn.setTooltip(Tooltip.create(Component.translatable("extendedae_plus.button.choose_provider")));
|
||||
eap$uploadBtn.setTooltip(Tooltip.create(Component.translatable("extendedae_plus.button.choose_provider")));
|
||||
}
|
||||
|
||||
// 解析 encodePattern 的样式位置
|
||||
try {
|
||||
ScreenStyle style = ((AEBaseScreenAccessor<?>) (Object) this).extendedae_plus$getStyle();
|
||||
ScreenStyle style = ((AEBaseScreenAccessor<?>) (Object) this).eap$getStyle();
|
||||
WidgetStyle ws = style.getWidget("encodePattern");
|
||||
int leftPos = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getLeftPos();
|
||||
int topPos = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getTopPos();
|
||||
int imageWidth = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getImageWidth();
|
||||
int imageHeight = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getImageHeight();
|
||||
int leftPos = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getLeftPos();
|
||||
int topPos = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getTopPos();
|
||||
int imageWidth = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getImageWidth();
|
||||
int imageHeight = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getImageHeight();
|
||||
Rect2i bounds = new Rect2i(leftPos, topPos, imageWidth, imageHeight);
|
||||
var pos = ws.resolve(bounds);
|
||||
int baseW = ws.getWidth() > 0 ? ws.getWidth() : 16;
|
||||
|
|
@ -113,79 +110,79 @@ public abstract class PatternEncodingTermScreenMixin<T extends AEBaseMenu> {
|
|||
int targetW = Math.max(10, Math.round(baseW * 0.75f));
|
||||
int targetH = Math.max(10, Math.round(baseH * 0.75f));
|
||||
// 缩小为原尺寸的 0.75(稍微变大于 8x8)
|
||||
extendedae_plus$uploadBtn.setWidth(targetW);
|
||||
extendedae_plus$uploadBtn.setHeight(targetH);
|
||||
eap$uploadBtn.setWidth(targetW);
|
||||
eap$uploadBtn.setHeight(targetH);
|
||||
// 仍位于其左侧,但整体向右微移(减小间距)约 2px
|
||||
extendedae_plus$uploadBtn.setX(pos.getX() - targetW); // 原为 -targetW - 2,再右移 2px
|
||||
extendedae_plus$uploadBtn.setY(pos.getY());
|
||||
eap$uploadBtn.setX(pos.getX() - targetW); // 原为 -targetW - 2,再右移 2px
|
||||
eap$uploadBtn.setY(pos.getY());
|
||||
} catch (Throwable t) {
|
||||
// 回退:放在界面右侧大致位置,避免不可见
|
||||
extendedae_plus$uploadBtn.setWidth(12);
|
||||
extendedae_plus$uploadBtn.setHeight(12);
|
||||
int leftPos = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getLeftPos();
|
||||
int topPos = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getTopPos();
|
||||
int imageWidth = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getImageWidth();
|
||||
extendedae_plus$uploadBtn.setX(leftPos + imageWidth - 12 - 8 + 2); // 向右微移 2px
|
||||
extendedae_plus$uploadBtn.setY(topPos + 88);
|
||||
eap$uploadBtn.setWidth(12);
|
||||
eap$uploadBtn.setHeight(12);
|
||||
int leftPos = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getLeftPos();
|
||||
int topPos = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getTopPos();
|
||||
int imageWidth = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getImageWidth();
|
||||
eap$uploadBtn.setX(leftPos + imageWidth - 12 - 8 + 2); // 向右微移 2px
|
||||
eap$uploadBtn.setY(topPos + 88);
|
||||
}
|
||||
|
||||
// 直接向 renderables / children 列表添加,避免依赖受保护方法
|
||||
var accessor = (ScreenAccessor) (Object) this;
|
||||
var renderables = accessor.extendedae_plus$getRenderables();
|
||||
var children = accessor.extendedae_plus$getChildren();
|
||||
if (!renderables.contains(extendedae_plus$uploadBtn)) {
|
||||
renderables.add(extendedae_plus$uploadBtn);
|
||||
var renderables = accessor.eap$getRenderables();
|
||||
var children = accessor.eap$getChildren();
|
||||
if (!renderables.contains(eap$uploadBtn)) {
|
||||
renderables.add(eap$uploadBtn);
|
||||
}
|
||||
if (!children.contains(extendedae_plus$uploadBtn)) {
|
||||
children.add(extendedae_plus$uploadBtn);
|
||||
if (!children.contains(eap$uploadBtn)) {
|
||||
children.add(eap$uploadBtn);
|
||||
}
|
||||
}
|
||||
|
||||
@Inject(method = "containerTick", at = @At("TAIL"))
|
||||
private void extendedae_plus$ensureUploadButton(CallbackInfo ci) {
|
||||
private void eap$ensureUploadButton(CallbackInfo ci) {
|
||||
if (!(((Object) this) instanceof PatternEncodingTermScreen)) {
|
||||
return;
|
||||
}
|
||||
if (extendedae_plus$uploadBtn == null) {
|
||||
if (eap$uploadBtn == null) {
|
||||
return;
|
||||
}
|
||||
var renderables2 = ((ScreenAccessor) (Object) this).extendedae_plus$getRenderables();
|
||||
if (!renderables2.contains(extendedae_plus$uploadBtn)) {
|
||||
var renderables2 = ((ScreenAccessor) (Object) this).eap$getRenderables();
|
||||
if (!renderables2.contains(eap$uploadBtn)) {
|
||||
// 被其它模组清空/替换后,重新计算一次位置并补回
|
||||
try {
|
||||
ScreenStyle style = ((AEBaseScreenAccessor<?>) (Object) this).extendedae_plus$getStyle();
|
||||
ScreenStyle style = ((AEBaseScreenAccessor<?>) (Object) this).eap$getStyle();
|
||||
WidgetStyle ws = style.getWidget("encodePattern");
|
||||
int leftPos = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getLeftPos();
|
||||
int topPos = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getTopPos();
|
||||
int imageWidth = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getImageWidth();
|
||||
int imageHeight = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getImageHeight();
|
||||
int leftPos = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getLeftPos();
|
||||
int topPos = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getTopPos();
|
||||
int imageWidth = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getImageWidth();
|
||||
int imageHeight = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getImageHeight();
|
||||
Rect2i bounds = new Rect2i(leftPos, topPos, imageWidth, imageHeight);
|
||||
var pos = ws.resolve(bounds);
|
||||
int baseW = ws.getWidth() > 0 ? ws.getWidth() : 16;
|
||||
int baseH = ws.getHeight() > 0 ? ws.getHeight() : 16;
|
||||
int targetW = Math.max(10, Math.round(baseW * 0.75f));
|
||||
int targetH = Math.max(10, Math.round(baseH * 0.75f));
|
||||
extendedae_plus$uploadBtn.setWidth(targetW);
|
||||
extendedae_plus$uploadBtn.setHeight(targetH);
|
||||
extendedae_plus$uploadBtn.setX(pos.getX() - targetW); // 原为 -targetW - 2,再右移 2px
|
||||
extendedae_plus$uploadBtn.setY(pos.getY());
|
||||
eap$uploadBtn.setWidth(targetW);
|
||||
eap$uploadBtn.setHeight(targetH);
|
||||
eap$uploadBtn.setX(pos.getX() - targetW); // 原为 -targetW - 2,再右移 2px
|
||||
eap$uploadBtn.setY(pos.getY());
|
||||
} catch (Throwable t) {
|
||||
int leftPos = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getLeftPos();
|
||||
int topPos = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getTopPos();
|
||||
int imageWidth = ((AbstractContainerScreenAccessor<?>) (Object) this).extendedae_plus$getImageWidth();
|
||||
extendedae_plus$uploadBtn.setWidth(12);
|
||||
extendedae_plus$uploadBtn.setHeight(12);
|
||||
extendedae_plus$uploadBtn.setX(leftPos + imageWidth - 12 - 8 + 2);
|
||||
extendedae_plus$uploadBtn.setY(topPos + 88);
|
||||
int leftPos = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getLeftPos();
|
||||
int topPos = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getTopPos();
|
||||
int imageWidth = ((AbstractContainerScreenAccessor<?>) (Object) this).eap$getImageWidth();
|
||||
eap$uploadBtn.setWidth(12);
|
||||
eap$uploadBtn.setHeight(12);
|
||||
eap$uploadBtn.setX(leftPos + imageWidth - 12 - 8 + 2);
|
||||
eap$uploadBtn.setY(topPos + 88);
|
||||
}
|
||||
var accessor2 = (ScreenAccessor) (Object) this;
|
||||
var r = accessor2.extendedae_plus$getRenderables();
|
||||
var c = accessor2.extendedae_plus$getChildren();
|
||||
if (!r.contains(extendedae_plus$uploadBtn)) {
|
||||
r.add(extendedae_plus$uploadBtn);
|
||||
var r = accessor2.eap$getRenderables();
|
||||
var c = accessor2.eap$getChildren();
|
||||
if (!r.contains(eap$uploadBtn)) {
|
||||
r.add(eap$uploadBtn);
|
||||
}
|
||||
if (!c.contains(extendedae_plus$uploadBtn)) {
|
||||
c.add(extendedae_plus$uploadBtn);
|
||||
if (!c.contains(eap$uploadBtn)) {
|
||||
c.add(eap$uploadBtn);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,13 +1,12 @@
|
|||
package com.extendedae_plus.mixin.ae2;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
import appeng.api.crafting.IPatternDetails;
|
||||
import appeng.api.crafting.IPatternDetails.IInput;
|
||||
import appeng.api.stacks.AEKey;
|
||||
import appeng.api.stacks.GenericStack;
|
||||
import appeng.helpers.patternprovider.PatternProviderLogic;
|
||||
import appeng.helpers.patternprovider.PatternProviderTarget;
|
||||
import appeng.api.stacks.GenericStack;
|
||||
import com.extendedae_plus.api.AdvancedBlockingHolder;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
|
|
@ -16,7 +15,7 @@ import org.spongepowered.asm.mixin.injection.Inject;
|
|||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
import com.extendedae_plus.api.AdvancedBlockingHolder;
|
||||
import java.util.Collections;
|
||||
|
||||
@Mixin(PatternProviderLogic.class)
|
||||
public class PatternProviderLogicAdvancedMixin implements AdvancedBlockingHolder {
|
||||
|
|
@ -24,34 +23,33 @@ public class PatternProviderLogicAdvancedMixin implements AdvancedBlockingHolder
|
|||
private static final String EPP_ADV_BLOCKING_KEY = "epp_advanced_blocking";
|
||||
|
||||
@Unique
|
||||
private boolean epp$advancedBlocking = false;
|
||||
private boolean eap$advancedBlocking = false;
|
||||
|
||||
@Override
|
||||
public boolean ext$getAdvancedBlocking() {
|
||||
return epp$advancedBlocking;
|
||||
public boolean eap$getAdvancedBlocking() {
|
||||
return eap$advancedBlocking;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void ext$setAdvancedBlocking(boolean value) {
|
||||
this.epp$advancedBlocking = value;
|
||||
public void eap$setAdvancedBlocking(boolean value) {
|
||||
this.eap$advancedBlocking = value;
|
||||
}
|
||||
|
||||
@Inject(method = "writeToNBT", at = @At("TAIL"), remap = false)
|
||||
private void epp$writeAdvancedToNbt(CompoundTag tag, CallbackInfo ci) {
|
||||
tag.putBoolean(EPP_ADV_BLOCKING_KEY, this.epp$advancedBlocking);
|
||||
private void eap$writeAdvancedToNbt(CompoundTag tag, CallbackInfo ci) {
|
||||
tag.putBoolean(EPP_ADV_BLOCKING_KEY, this.eap$advancedBlocking);
|
||||
}
|
||||
|
||||
@Inject(method = "readFromNBT", at = @At("TAIL"), remap = false)
|
||||
private void epp$readAdvancedFromNbt(CompoundTag tag, CallbackInfo ci) {
|
||||
private void eap$readAdvancedFromNbt(CompoundTag tag, CallbackInfo ci) {
|
||||
if (tag.contains(EPP_ADV_BLOCKING_KEY)) {
|
||||
this.epp$advancedBlocking = tag.getBoolean(EPP_ADV_BLOCKING_KEY);
|
||||
} else {
|
||||
this.eap$advancedBlocking = tag.getBoolean(EPP_ADV_BLOCKING_KEY);
|
||||
}
|
||||
}
|
||||
|
||||
// 在 pushPattern 中,重定向对 adapter.containsPatternInput(...) 的调用
|
||||
@Redirect(method = "pushPattern", at = @At(value = "INVOKE", target = "Lappeng/helpers/patternprovider/PatternProviderTarget;containsPatternInput(Ljava/util/Set;)Z"), remap = false)
|
||||
private boolean epp$redirectBlockingContains(PatternProviderTarget adapter,
|
||||
private boolean eap$redirectBlockingContains(PatternProviderTarget adapter,
|
||||
java.util.Set<AEKey> patternInputs,
|
||||
IPatternDetails patternDetails,
|
||||
appeng.api.stacks.KeyCounter[] inputHolder) {
|
||||
|
|
@ -62,8 +60,8 @@ public class PatternProviderLogicAdvancedMixin implements AdvancedBlockingHolder
|
|||
}
|
||||
|
||||
// 仅当高级阻挡启用时启用“匹配则不阻挡”
|
||||
if (this.epp$advancedBlocking) {
|
||||
if (epp$targetFullyMatchesPatternInputs(adapter, patternDetails)) {
|
||||
if (this.eap$advancedBlocking) {
|
||||
if (eap$targetFullyMatchesPatternInputs(adapter, patternDetails)) {
|
||||
// 返回 false 表示“不包含阻挡关键物”,从而不触发 continue,允许发配
|
||||
return false;
|
||||
}
|
||||
|
|
@ -73,7 +71,7 @@ public class PatternProviderLogicAdvancedMixin implements AdvancedBlockingHolder
|
|||
}
|
||||
|
||||
@Unique
|
||||
private boolean epp$targetFullyMatchesPatternInputs(PatternProviderTarget adapter, IPatternDetails patternDetails) {
|
||||
private boolean eap$targetFullyMatchesPatternInputs(PatternProviderTarget adapter, IPatternDetails patternDetails) {
|
||||
for (IInput in : patternDetails.getInputs()) {
|
||||
boolean slotMatched = false;
|
||||
for (GenericStack candidate : in.getPossibleInputs()) {
|
||||
|
|
|
|||
|
|
@ -1,20 +1,22 @@
|
|||
package com.extendedae_plus.mixin.ae2;
|
||||
|
||||
import appeng.menu.implementations.PatternProviderMenu;
|
||||
import appeng.helpers.patternprovider.PatternProviderLogic;
|
||||
import appeng.menu.guisync.GuiSync;
|
||||
import appeng.helpers.patternprovider.PatternProviderLogicHost;
|
||||
import appeng.menu.guisync.GuiSync;
|
||||
import appeng.menu.implementations.PatternProviderMenu;
|
||||
import com.extendedae_plus.api.AdvancedBlockingHolder;
|
||||
import com.extendedae_plus.api.PatternProviderMenuAdvancedSync;
|
||||
import net.minecraft.world.entity.player.Inventory;
|
||||
import net.minecraft.world.inventory.MenuType;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
|
||||
import com.extendedae_plus.api.AdvancedBlockingHolder;
|
||||
import com.extendedae_plus.api.PatternProviderMenuAdvancedSync;
|
||||
import static com.extendedae_plus.util.ExtendedAELogger.LOGGER;
|
||||
|
||||
@Mixin(PatternProviderMenu.class)
|
||||
public abstract class PatternProviderMenuAdvancedMixin implements PatternProviderMenuAdvancedSync {
|
||||
|
|
@ -25,58 +27,61 @@ public abstract class PatternProviderMenuAdvancedMixin implements PatternProvide
|
|||
protected PatternProviderLogic logic;
|
||||
|
||||
// 选择一个未占用的 GUI 同步 id(AE2 已用到 7),这里使用 20 以避冲突
|
||||
@Unique
|
||||
@GuiSync(20)
|
||||
public boolean eppAdvancedBlocking = false;
|
||||
public boolean eap$AdvancedBlocking = false;
|
||||
|
||||
@Inject(method = "broadcastChanges", at = @At("HEAD"))
|
||||
private void epp$syncAdvancedBlocking(CallbackInfo ci) {
|
||||
private void eap$syncAdvancedBlocking(CallbackInfo ci) {
|
||||
if (this.isServerSide()) {
|
||||
var l = this.logic;
|
||||
if (l instanceof AdvancedBlockingHolder holder) {
|
||||
this.eppAdvancedBlocking = holder.ext$getAdvancedBlocking();
|
||||
this.eap$AdvancedBlocking = holder.eap$getAdvancedBlocking();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Inject(method = "broadcastChanges", at = @At("TAIL"))
|
||||
private void epp$syncAdvancedBlockingTail(CallbackInfo ci) {
|
||||
private void eap$syncAdvancedBlockingTail(CallbackInfo ci) {
|
||||
}
|
||||
|
||||
// 构造器尾注入(public ctor)
|
||||
@Inject(method = "<init>(ILnet/minecraft/world/entity/player/Inventory;Lappeng/helpers/patternprovider/PatternProviderLogicHost;)V", at = @At("TAIL"))
|
||||
private void epp$initAdvancedSync_Public(int id, Inventory playerInventory, PatternProviderLogicHost host, CallbackInfo ci) {
|
||||
private void eap$initAdvancedSync_Public(int id, Inventory playerInventory, PatternProviderLogicHost host, CallbackInfo ci) {
|
||||
try {
|
||||
var l = this.logic;
|
||||
if (l instanceof AdvancedBlockingHolder holder) {
|
||||
this.eppAdvancedBlocking = holder.ext$getAdvancedBlocking();
|
||||
this.eap$AdvancedBlocking = holder.eap$getAdvancedBlocking();
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
LOGGER.error("Error initializing advanced sync", t);
|
||||
}
|
||||
}
|
||||
|
||||
// 构造器尾注入(protected ctor with MenuType)
|
||||
@Inject(method = "<init>(Lnet/minecraft/world/inventory/MenuType;ILnet/minecraft/world/entity/player/Inventory;Lappeng/helpers/patternprovider/PatternProviderLogicHost;)V", at = @At("TAIL"))
|
||||
private void epp$initAdvancedSync_Protected(MenuType<? extends PatternProviderMenu> menuType, int id, Inventory playerInventory, PatternProviderLogicHost host, CallbackInfo ci) {
|
||||
private void eap$initAdvancedSync_Protected(MenuType<? extends PatternProviderMenu> menuType, int id, Inventory playerInventory, PatternProviderLogicHost host, CallbackInfo ci) {
|
||||
try {
|
||||
var l = this.logic;
|
||||
if (l instanceof AdvancedBlockingHolder holder) {
|
||||
this.eppAdvancedBlocking = holder.ext$getAdvancedBlocking();
|
||||
this.eap$AdvancedBlocking = holder.eap$getAdvancedBlocking();
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
LOGGER.error("Error initializing advanced sync", t);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean ext$getAdvancedBlockingSynced() {
|
||||
return this.eppAdvancedBlocking;
|
||||
public boolean eap$getAdvancedBlockingSynced() {
|
||||
return this.eap$AdvancedBlocking;
|
||||
}
|
||||
|
||||
// 调试:当 Screen 每帧读取这些 getter 时打印,验证 Mixin 是否生效
|
||||
@Inject(method = "getBlockingMode", at = @At("HEAD"), remap = false)
|
||||
private void epp$debug_getBlockingMode(CallbackInfoReturnable<?> cir) {
|
||||
private void eap$debug_getBlockingMode(CallbackInfoReturnable<?> cir) {
|
||||
}
|
||||
|
||||
@Inject(method = "getShowInAccessTerminal", at = @At("HEAD"), remap = false)
|
||||
private void epp$debug_getShowInAccessTerminal(CallbackInfoReturnable<?> cir) {
|
||||
private void eap$debug_getShowInAccessTerminal(CallbackInfoReturnable<?> cir) {
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,6 +6,12 @@ import appeng.client.gui.implementations.PatternProviderScreen;
|
|||
import appeng.client.gui.style.ScreenStyle;
|
||||
import appeng.client.gui.widgets.ToggleButton;
|
||||
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.world.entity.player.Inventory;
|
||||
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.callback.CallbackInfo;
|
||||
|
||||
import com.extendedae_plus.api.PatternProviderMenuAdvancedSync;
|
||||
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;
|
||||
|
||||
import static com.extendedae_plus.util.ExtendedAELogger.LOGGER;
|
||||
/**
|
||||
* 为 AE2 原版样板供应器界面添加“高级阻挡模式”按钮(仅客户端UI反馈)。
|
||||
* - 位于左侧工具栏
|
||||
|
|
@ -31,40 +31,41 @@ import com.extendedae_plus.mixin.accessor.PatternProviderLogicAccessor;
|
|||
public abstract class PatternProviderScreenMixin<C extends PatternProviderMenu> extends AEBaseScreen<C> {
|
||||
|
||||
@Unique
|
||||
private ToggleButton eppAdvancedBlockingToggle;
|
||||
private ToggleButton eap$AdvancedBlockingToggle;
|
||||
|
||||
@Unique
|
||||
private boolean eppAdvancedBlockingEnabled = false;
|
||||
private boolean eap$AdvancedBlockingEnabled = false;
|
||||
|
||||
@Unique
|
||||
private String eppProviderKey = null;
|
||||
private String eap$ProviderKey = null;
|
||||
|
||||
public PatternProviderScreenMixin(C menu, Inventory playerInventory, Component title, ScreenStyle style) {
|
||||
super(menu, playerInventory, title, style);
|
||||
}
|
||||
|
||||
@Inject(method = "<init>", at = @At("RETURN"))
|
||||
private void epp$initAdvancedBlocking(C menu, Inventory playerInventory, Component title, ScreenStyle style, CallbackInfo ci) {
|
||||
private void eap$initAdvancedBlocking(C menu, Inventory playerInventory, Component title, ScreenStyle style, CallbackInfo ci) {
|
||||
// 计算供应器唯一键:维度ID + 方块坐标
|
||||
try {
|
||||
var logic = ((PatternProviderMenuAdvancedAccessor) menu).ext$logic();
|
||||
var host = ((PatternProviderLogicAccessor) logic).ext$host();
|
||||
var logic = ((PatternProviderMenuAdvancedAccessor) menu).eap$logic();
|
||||
var host = ((PatternProviderLogicAccessor) logic).eap$host();
|
||||
var be = host.getBlockEntity();
|
||||
var level = be.getLevel();
|
||||
String dimId = level.dimension().location().toString();
|
||||
long posLong = be.getBlockPos().asLong();
|
||||
this.eppProviderKey = ClientAdvancedBlockingState.key(dimId, posLong);
|
||||
this.eap$ProviderKey = ClientAdvancedBlockingState.key(dimId, posLong);
|
||||
} catch (Throwable t) {
|
||||
LOGGER.error("Error initializing advanced sync", t);
|
||||
}
|
||||
|
||||
// 优先使用该供应器最近一次 S2C 状态;否则回退读取 @GuiSync 初始化
|
||||
if (this.eppProviderKey != null && ClientAdvancedBlockingState.has(this.eppProviderKey)) {
|
||||
this.eppAdvancedBlockingEnabled = ClientAdvancedBlockingState.get(this.eppProviderKey);
|
||||
if (this.eap$ProviderKey != null && ClientAdvancedBlockingState.has(this.eap$ProviderKey)) {
|
||||
this.eap$AdvancedBlockingEnabled = ClientAdvancedBlockingState.get(this.eap$ProviderKey);
|
||||
} else if (menu instanceof PatternProviderMenuAdvancedSync sync) {
|
||||
this.eppAdvancedBlockingEnabled = sync.ext$getAdvancedBlockingSynced();
|
||||
this.eap$AdvancedBlockingEnabled = sync.eap$getAdvancedBlockingSynced();
|
||||
}
|
||||
// 使用 ToggleButton 以便在 YES/NO 图标与提示之间动态切换
|
||||
this.eppAdvancedBlockingToggle = new ToggleButton(
|
||||
this.eap$AdvancedBlockingToggle = new ToggleButton(
|
||||
Icon.BLOCKING_MODE_YES,
|
||||
Icon.BLOCKING_MODE_NO,
|
||||
// 提示文本:名称与说明
|
||||
|
|
@ -72,67 +73,67 @@ public abstract class PatternProviderScreenMixin<C extends PatternProviderMenu>
|
|||
Component.literal("高级阻挡模式:当开启时,执行更严格的阻挡判定"),
|
||||
(state) -> {
|
||||
// 客户端立即反馈:切换图标/提示
|
||||
this.eppAdvancedBlockingEnabled = state;
|
||||
this.eppAdvancedBlockingToggle.setState(state);
|
||||
this.eap$AdvancedBlockingEnabled = state;
|
||||
this.eap$AdvancedBlockingToggle.setState(state);
|
||||
// 发送 C2S 切换请求
|
||||
ModNetwork.CHANNEL.sendToServer(new ToggleAdvancedBlockingC2SPacket());
|
||||
// 可根据状态调整提示文本(演示性:开启/关闭不同第二行)
|
||||
if (state) {
|
||||
this.eppAdvancedBlockingToggle.setTooltipOn(java.util.List.of(
|
||||
this.eap$AdvancedBlockingToggle.setTooltipOn(java.util.List.of(
|
||||
Component.literal("高级阻挡模式"),
|
||||
Component.literal("高级阻挡模式:已开启")));
|
||||
this.eppAdvancedBlockingToggle.setTooltipOff(java.util.List.of(
|
||||
this.eap$AdvancedBlockingToggle.setTooltipOff(java.util.List.of(
|
||||
Component.literal("高级阻挡模式"),
|
||||
Component.literal("高级阻挡模式:已开启")));
|
||||
} else {
|
||||
this.eppAdvancedBlockingToggle.setTooltipOn(java.util.List.of(
|
||||
this.eap$AdvancedBlockingToggle.setTooltipOn(java.util.List.of(
|
||||
Component.literal("高级阻挡模式"),
|
||||
Component.literal("高级阻挡模式:已关闭")));
|
||||
this.eppAdvancedBlockingToggle.setTooltipOff(java.util.List.of(
|
||||
this.eap$AdvancedBlockingToggle.setTooltipOff(java.util.List.of(
|
||||
Component.literal("高级阻挡模式"),
|
||||
Component.literal("高级阻挡模式:已关闭")));
|
||||
}
|
||||
}
|
||||
);
|
||||
this.eppAdvancedBlockingToggle.setState(this.eppAdvancedBlockingEnabled);
|
||||
this.eap$AdvancedBlockingToggle.setState(this.eap$AdvancedBlockingEnabled);
|
||||
// 初始 tooltip
|
||||
this.eppAdvancedBlockingToggle.setTooltipOn(java.util.List.of(
|
||||
this.eap$AdvancedBlockingToggle.setTooltipOn(java.util.List.of(
|
||||
Component.literal("高级阻挡模式"),
|
||||
Component.literal(this.eppAdvancedBlockingEnabled ? "高级阻挡模式:已开启" : "高级阻挡模式:已关闭")
|
||||
Component.literal(this.eap$AdvancedBlockingEnabled ? "高级阻挡模式:已开启" : "高级阻挡模式:已关闭")
|
||||
));
|
||||
this.eppAdvancedBlockingToggle.setTooltipOff(java.util.List.of(
|
||||
this.eap$AdvancedBlockingToggle.setTooltipOff(java.util.List.of(
|
||||
Component.literal("高级阻挡模式"),
|
||||
Component.literal(this.eppAdvancedBlockingEnabled ? "高级阻挡模式:已开启" : "高级阻挡模式:已关闭")
|
||||
Component.literal(this.eap$AdvancedBlockingEnabled ? "高级阻挡模式:已开启" : "高级阻挡模式:已关闭")
|
||||
));
|
||||
|
||||
this.addToLeftToolbar(this.eppAdvancedBlockingToggle);
|
||||
this.addToLeftToolbar(this.eap$AdvancedBlockingToggle);
|
||||
}
|
||||
|
||||
// 每帧刷新:从菜单同步布尔值,保持按钮状态一致
|
||||
@Inject(method = "updateBeforeRender", at = @At("TAIL"), remap = false)
|
||||
private void epp$updateAdvancedBlocking(CallbackInfo ci) {
|
||||
private void eap$updateAdvancedBlocking(CallbackInfo ci) {
|
||||
// 打印一条轻量 tick 日志以确认该方法被调用(频繁输出可在验证后移除)
|
||||
// System.out.println("[EPP][CLIENT] updateBeforeRender tick, local=" + this.eppAdvancedBlockingEnabled);
|
||||
|
||||
if (this.eppAdvancedBlockingToggle == null) return;
|
||||
if (this.eap$AdvancedBlockingToggle == null) return;
|
||||
|
||||
boolean desired = this.eppAdvancedBlockingEnabled;
|
||||
boolean desired = this.eap$AdvancedBlockingEnabled;
|
||||
// 优先使用该供应器最近一次 S2C 值
|
||||
if (this.eppProviderKey != null && ClientAdvancedBlockingState.has(this.eppProviderKey)) {
|
||||
desired = ClientAdvancedBlockingState.get(this.eppProviderKey);
|
||||
if (this.eap$ProviderKey != null && ClientAdvancedBlockingState.has(this.eap$ProviderKey)) {
|
||||
desired = ClientAdvancedBlockingState.get(this.eap$ProviderKey);
|
||||
} else if (this.menu instanceof PatternProviderMenuAdvancedSync sync) {
|
||||
desired = sync.ext$getAdvancedBlockingSynced();
|
||||
desired = sync.eap$getAdvancedBlockingSynced();
|
||||
}
|
||||
|
||||
if (desired != this.eppAdvancedBlockingEnabled) {
|
||||
this.eppAdvancedBlockingEnabled = desired;
|
||||
this.eppAdvancedBlockingToggle.setState(desired);
|
||||
if (desired != this.eap$AdvancedBlockingEnabled) {
|
||||
this.eap$AdvancedBlockingEnabled = desired;
|
||||
this.eap$AdvancedBlockingToggle.setState(desired);
|
||||
// 同步 tooltip 二行提示
|
||||
this.eppAdvancedBlockingToggle.setTooltipOn(java.util.List.of(
|
||||
this.eap$AdvancedBlockingToggle.setTooltipOn(java.util.List.of(
|
||||
Component.literal("高级阻挡模式"),
|
||||
Component.literal(desired ? "高级阻挡模式:已开启" : "高级阻挡模式:已关闭")
|
||||
));
|
||||
this.eppAdvancedBlockingToggle.setTooltipOff(java.util.List.of(
|
||||
this.eap$AdvancedBlockingToggle.setTooltipOff(java.util.List.of(
|
||||
Component.literal("高级阻挡模式"),
|
||||
Component.literal(desired ? "高级阻挡模式:已开启" : "高级阻挡模式:已关闭")
|
||||
));
|
||||
|
|
|
|||
|
|
@ -23,8 +23,6 @@ import net.minecraft.world.phys.HitResult;
|
|||
import net.minecraft.world.phys.Vec3;
|
||||
import net.minecraftforge.fml.ModList;
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
|
|
@ -38,6 +36,8 @@ import java.lang.reflect.Method;
|
|||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import static com.extendedae_plus.util.ExtendedAELogger.LOGGER;
|
||||
|
||||
/**
|
||||
* 为 AE2 石英切割刀添加:潜行 + 右键 指向世界中的方块/部件(如线缆)时,复制其名称到剪贴板。
|
||||
* <p>
|
||||
|
|
@ -48,8 +48,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||
*/
|
||||
@Mixin(value = QuartzCuttingKnifeItem.class)
|
||||
public abstract class QuartzCuttingKnifeItemMixin {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger("ExtendedAEPlus");
|
||||
|
||||
@Inject(method = "use", at = @At("HEAD"), cancellable = true)
|
||||
private void eap$copyNameOnShiftRightClick(Level level, Player player, InteractionHand hand,
|
||||
CallbackInfoReturnable<InteractionResultHolder<ItemStack>> cir) {
|
||||
|
|
|
|||
|
|
@ -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.gui.layout.SlotGridLayout;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
|
|
@ -1,14 +1,13 @@
|
|||
package com.extendedae_plus.mixin.accessor;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
package com.extendedae_plus.mixin.ae2.accessor;
|
||||
|
||||
import appeng.client.gui.AEBaseScreen;
|
||||
import appeng.client.gui.style.ScreenStyle;
|
||||
import appeng.menu.AEBaseMenu;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
|
||||
@Mixin(value = AEBaseScreen.class, remap = false)
|
||||
public interface AEBaseScreenAccessor<T extends AEBaseMenu> {
|
||||
@Accessor(value = "style", remap = false)
|
||||
ScreenStyle extendedae_plus$getStyle();
|
||||
ScreenStyle eap$getStyle();
|
||||
}
|
||||
|
|
@ -1,9 +1,8 @@
|
|||
package com.extendedae_plus.mixin.accessor;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
package com.extendedae_plus.mixin.ae2.accessor;
|
||||
|
||||
import appeng.client.gui.AEBaseScreen;
|
||||
import appeng.menu.AEBaseMenu;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
|
||||
@Mixin(AEBaseScreen.class)
|
||||
public interface AEBaseScreenInvoker<T extends AEBaseMenu> {
|
||||
|
|
@ -1,14 +1,12 @@
|
|||
package com.extendedae_plus.mixin.accessor;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
package com.extendedae_plus.mixin.ae2.accessor;
|
||||
|
||||
import appeng.api.networking.energy.IEnergySource;
|
||||
import appeng.api.storage.MEStorage;
|
||||
import appeng.menu.me.common.MEStorageMenu;
|
||||
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)
|
||||
public interface MEStorageMenuAccessor {
|
||||
|
|
@ -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.gen.Accessor;
|
||||
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)
|
||||
public interface MEStorageScreenAccessor {
|
||||
@Accessor("searchField")
|
||||
AETextField ext$getSearchField();
|
||||
AETextField eap$getSearchField();
|
||||
|
||||
@Invoker("setSearchText")
|
||||
void ext$setSearchText(String text);
|
||||
void eap$setSearchText(String text);
|
||||
}
|
||||
|
|
@ -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.slot.RestrictedInputSlot;
|
||||
|
|
@ -8,8 +8,8 @@ import org.spongepowered.asm.mixin.gen.Accessor;
|
|||
@Mixin(PatternEncodingTermMenu.class)
|
||||
public interface PatternEncodingTermMenuAccessor {
|
||||
@Accessor("encodedPatternSlot")
|
||||
RestrictedInputSlot epp$getEncodedPatternSlot();
|
||||
RestrictedInputSlot eap$getEncodedPatternSlot();
|
||||
|
||||
@Accessor("blankPatternSlot")
|
||||
RestrictedInputSlot epp$getBlankPatternSlot();
|
||||
RestrictedInputSlot eap$getBlankPatternSlot();
|
||||
}
|
||||
|
|
@ -1,13 +1,12 @@
|
|||
package com.extendedae_plus.mixin.accessor;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
package com.extendedae_plus.mixin.ae2.accessor;
|
||||
|
||||
import appeng.helpers.patternprovider.PatternProviderLogic;
|
||||
import appeng.helpers.patternprovider.PatternProviderLogicHost;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
|
||||
@Mixin(PatternProviderLogic.class)
|
||||
public interface PatternProviderLogicAccessor {
|
||||
@Accessor("host")
|
||||
PatternProviderLogicHost ext$host();
|
||||
PatternProviderLogicHost eap$host();
|
||||
}
|
||||
|
|
@ -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.gen.Accessor;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import appeng.api.stacks.AEKey;
|
||||
import appeng.helpers.patternprovider.PatternProviderLogic;
|
||||
|
||||
@Mixin(PatternProviderLogic.class)
|
||||
public interface PatternProviderLogicPatternInputsAccessor {
|
||||
@Accessor("patternInputs")
|
||||
Set<AEKey> ext$patternInputs();
|
||||
Set<AEKey> eap$patternInputs();
|
||||
}
|
||||
|
|
@ -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.gen.Accessor;
|
||||
|
||||
import appeng.menu.implementations.PatternProviderMenu;
|
||||
import appeng.helpers.patternprovider.PatternProviderLogic;
|
||||
|
||||
@Mixin(PatternProviderMenu.class)
|
||||
public interface PatternProviderMenuAdvancedAccessor {
|
||||
@Accessor("logic")
|
||||
PatternProviderLogic ext$logic();
|
||||
PatternProviderLogic eap$logic();
|
||||
}
|
||||
|
|
@ -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.glodblock.github.extendedae.xmod.wt.ContainerUWirelessExPAT;
|
||||
import com.glodblock.github.extendedae.xmod.wt.HostUWirelessExPAT;
|
||||
|
|
@ -27,23 +26,23 @@ import java.util.function.Consumer;
|
|||
public abstract class ContainerUWirelessExPatternTerminalMixin implements IActionHolder {
|
||||
|
||||
@Unique
|
||||
private final Map<String, Consumer<Paras>> actions = createHolder();
|
||||
private final Map<String, Consumer<Paras>> eap$actions = createHolder();
|
||||
|
||||
@Unique
|
||||
private Player epp$player;
|
||||
private Player eap$player;
|
||||
|
||||
// 明确目标构造签名:<init>(int, Inventory, HostUWirelessExPAT)
|
||||
@Inject(method = "<init>(ILnet/minecraft/world/entity/player/Inventory;Lcom/glodblock/github/extendedae/xmod/wt/HostUWirelessExPAT;)V", at = @At("TAIL"), remap = false)
|
||||
private void init(int id, net.minecraft.world.entity.player.Inventory playerInventory, HostUWirelessExPAT host, CallbackInfo ci) {
|
||||
this.epp$player = playerInventory.player;
|
||||
this.eap$player = playerInventory.player;
|
||||
// 注册上传动作:参数顺序必须与客户端 CGenericPacket 保持一致
|
||||
this.actions.put("upload", p -> {
|
||||
this.eap$actions.put("upload", p -> {
|
||||
try {
|
||||
Object o0 = p.get(0);
|
||||
Object o1 = p.get(1);
|
||||
int playerSlotIndex = (o0 instanceof Number) ? ((Number) o0).intValue() : Integer.parseInt(String.valueOf(o0));
|
||||
long providerId = (o1 instanceof Number) ? ((Number) o1).longValue() : Long.parseLong(String.valueOf(o1));
|
||||
var sp = (ServerPlayer) this.epp$player;
|
||||
var sp = (ServerPlayer) this.eap$player;
|
||||
ExtendedAEPatternUploadUtil.uploadPatternToProvider(sp, playerSlotIndex, providerId);
|
||||
} catch (Throwable t) {
|
||||
}
|
||||
|
|
@ -54,6 +53,6 @@ public abstract class ContainerUWirelessExPatternTerminalMixin implements IActio
|
|||
@NotNull
|
||||
@Override
|
||||
public Map<String, Consumer<Paras>> getActionMap() {
|
||||
return this.actions;
|
||||
return this.eap$actions;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
package com.extendedae_plus.api;
|
||||
|
||||
public interface AdvancedBlockingHolder {
|
||||
boolean ext$getAdvancedBlocking();
|
||||
void ext$setAdvancedBlocking(boolean value);
|
||||
}
|
||||
|
|
@ -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.menu.SlotSemantics;
|
||||
import appeng.menu.guisync.GuiSync;
|
||||
import appeng.menu.implementations.PatternProviderMenu;
|
||||
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.glodium.network.packet.sync.IActionHolder;
|
||||
import com.glodblock.github.glodium.network.packet.sync.Paras;
|
||||
import net.minecraft.world.entity.player.Inventory;
|
||||
import net.minecraft.world.inventory.MenuType;
|
||||
import net.minecraft.world.inventory.Slot;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
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 org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Consumer;
|
||||
|
|
@ -32,23 +31,23 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
|
|||
|
||||
@GuiSync(11451)
|
||||
@Unique
|
||||
public int page = 0;
|
||||
public int eap$page = 0;
|
||||
|
||||
@Unique
|
||||
public int maxPage = 0;
|
||||
public int eap$maxPage = 0;
|
||||
|
||||
@Unique
|
||||
private static final int SLOTS_PER_PAGE = 36; // 每页显示36个槽位
|
||||
|
||||
@Unique
|
||||
private final Map<String, Consumer<Paras>> actions = createHolder();
|
||||
private final Map<String, Consumer<Paras>> eap$actions = createHolder();
|
||||
|
||||
public ContainerExPatternProviderMixin(MenuType<? extends PatternProviderMenu> menuType, int id, Inventory playerInventory, PatternProviderLogicHost host) {
|
||||
super(menuType, id, playerInventory, host);
|
||||
}
|
||||
|
||||
@Unique
|
||||
public void showPage() {
|
||||
public void eap$showPage() {
|
||||
List<Slot> slots = this.getSlots(SlotSemantics.ENCODED_PATTERN);
|
||||
int totalSlots = slots.size();
|
||||
|
||||
|
|
@ -65,13 +64,9 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
|
|||
for (Slot s : slots) {
|
||||
int page_id = slot_id / SLOTS_PER_PAGE;
|
||||
|
||||
if (page_id == this.page) {
|
||||
// 当前页的槽位激活
|
||||
((AppEngSlot) s).setActive(true);
|
||||
} else {
|
||||
// 其他页的槽位隐藏
|
||||
((AppEngSlot) s).setActive(false);
|
||||
}
|
||||
// 当前页的槽位激活
|
||||
// 其他页的槽位隐藏
|
||||
((AppEngSlot) s).setActive(page_id == this.eap$page);
|
||||
++slot_id;
|
||||
}
|
||||
}
|
||||
|
|
@ -79,29 +74,29 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
|
|||
@Inject(method = "<init>", at = @At("TAIL"))
|
||||
public void init(int id, Inventory playerInventory, PatternProviderLogicHost host, CallbackInfo ci) {
|
||||
int maxSlots = this.getSlots(SlotSemantics.ENCODED_PATTERN).size();
|
||||
this.maxPage = (maxSlots + SLOTS_PER_PAGE - 1) / SLOTS_PER_PAGE;
|
||||
this.eap$maxPage = (maxSlots + SLOTS_PER_PAGE - 1) / SLOTS_PER_PAGE;
|
||||
|
||||
// 注册通用动作(供 CGenericPacket 分发)
|
||||
this.actions.put("multiply2", p -> { modifyPatterns(2, false); });
|
||||
this.actions.put("divide2", p -> { modifyPatterns(2, true); });
|
||||
this.actions.put("multiply5", p -> { modifyPatterns(5, false); });
|
||||
this.actions.put("divide5", p -> { modifyPatterns(5, true); });
|
||||
this.actions.put("multiply10",p -> { modifyPatterns(10, false);});
|
||||
this.actions.put("divide10", p -> { modifyPatterns(10, true); });
|
||||
this.eap$actions.put("multiply2", p -> { eap$modifyPatterns(2, false); });
|
||||
this.eap$actions.put("divide2", p -> { eap$modifyPatterns(2, true); });
|
||||
this.eap$actions.put("multiply5", p -> { eap$modifyPatterns(5, false); });
|
||||
this.eap$actions.put("divide5", p -> { eap$modifyPatterns(5, true); });
|
||||
this.eap$actions.put("multiply10", p -> { eap$modifyPatterns(10, false);});
|
||||
this.eap$actions.put("divide10", p -> { eap$modifyPatterns(10, true); });
|
||||
}
|
||||
|
||||
@Unique
|
||||
public int getPage() {
|
||||
return this.page;
|
||||
return this.eap$page;
|
||||
}
|
||||
|
||||
@Unique
|
||||
public void setPage(int page) {
|
||||
this.page = page;
|
||||
this.eap$page = page;
|
||||
}
|
||||
|
||||
@Unique
|
||||
private void modifyPatterns(int scale, boolean div) {
|
||||
private void eap$modifyPatterns(int scale, boolean div) {
|
||||
if (scale <= 0) return;
|
||||
for (var slot : this.getSlots(SlotSemantics.ENCODED_PATTERN)) {
|
||||
var stack = slot.getItem();
|
||||
|
|
@ -110,11 +105,11 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
|
|||
if (detail instanceof AEProcessingPattern process) {
|
||||
var input = process.getSparseInputs();
|
||||
var output = process.getOutputs();
|
||||
if (checkModify(input, scale, div) && checkModify(output, scale, div)) {
|
||||
if (eap$checkModify(input, scale, div) && eap$checkModify(output, scale, div)) {
|
||||
var mulInput = new GenericStack[input.length];
|
||||
var mulOutput = new GenericStack[output.length];
|
||||
modifyStacks(input, mulInput, scale, div);
|
||||
modifyStacks(output, mulOutput, scale, div);
|
||||
eap$modifyStacks(input, mulInput, scale, div);
|
||||
eap$modifyStacks(output, mulOutput, scale, div);
|
||||
var newPattern = PatternDetailsHelper.encodeProcessingPattern(mulInput, mulOutput);
|
||||
slot.set(newPattern);
|
||||
}
|
||||
|
|
@ -124,7 +119,7 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
|
|||
}
|
||||
|
||||
@Unique
|
||||
private boolean checkModify(GenericStack[] stacks, int scale, boolean div) {
|
||||
private boolean eap$checkModify(GenericStack[] stacks, int scale, boolean div) {
|
||||
if (stacks == null) return false;
|
||||
if (div) {
|
||||
for (var stack : stacks) {
|
||||
|
|
@ -149,7 +144,7 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
|
|||
}
|
||||
|
||||
@Unique
|
||||
private void modifyStacks(GenericStack[] src, GenericStack[] dst, int scale, boolean div) {
|
||||
private void eap$modifyStacks(GenericStack[] src, GenericStack[] dst, int scale, boolean div) {
|
||||
for (int i = 0; i < src.length; i++) {
|
||||
var stack = src[i];
|
||||
if (stack != null) {
|
||||
|
|
@ -165,6 +160,6 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
|
|||
@NotNull
|
||||
@Override
|
||||
public Map<String, Consumer<Paras>> getActionMap() {
|
||||
return this.actions;
|
||||
return this.eap$actions;
|
||||
}
|
||||
}
|
||||
|
|
@ -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 com.extendedae_plus.util.ExtendedAEPatternUploadUtil;
|
||||
import appeng.api.util.IConfigurableObject;
|
||||
import com.glodblock.github.extendedae.container.ContainerExPatternTerminal;
|
||||
import com.glodblock.github.glodium.network.packet.sync.IActionHolder;
|
||||
import com.glodblock.github.glodium.network.packet.sync.Paras;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
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.function.Consumer;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
|
||||
@Mixin(ContainerExPatternTerminal.class)
|
||||
public abstract class ContainerExPatternTerminalMixin implements IActionHolder {
|
||||
|
||||
@GuiSync(11452)
|
||||
@Unique
|
||||
public boolean hidePatternSlots = false;
|
||||
public boolean eap$hidePatternSlots = false;
|
||||
|
||||
@Unique
|
||||
public boolean isHidePatternSlots() {
|
||||
return this.hidePatternSlots;
|
||||
return this.eap$hidePatternSlots;
|
||||
}
|
||||
|
||||
@Unique
|
||||
public void setHidePatternSlots(boolean hide) {
|
||||
this.hidePatternSlots = hide;
|
||||
this.eap$hidePatternSlots = hide;
|
||||
}
|
||||
|
||||
@Unique
|
||||
public void toggleHidePatternSlots() {
|
||||
this.hidePatternSlots = !this.hidePatternSlots;
|
||||
this.eap$hidePatternSlots = !this.eap$hidePatternSlots;
|
||||
}
|
||||
|
||||
@Unique
|
||||
private final Map<String, Consumer<Paras>> actions = createHolder();
|
||||
private final Map<String, Consumer<Paras>> eap$actions = createHolder();
|
||||
|
||||
@Unique
|
||||
private Player epp$player;
|
||||
|
||||
@Inject(method = "<init>", at = @At("TAIL"))
|
||||
@Inject(method = "<init>*", at = @At("TAIL"))
|
||||
private void init(int id, net.minecraft.world.entity.player.Inventory playerInventory, IConfigurableObject host, CallbackInfo ci) {
|
||||
this.epp$player = playerInventory.player;
|
||||
// 注册上传动作:参数顺序必须与客户端 CGenericPacket 保持一致
|
||||
this.actions.put("upload", p -> {
|
||||
this.eap$actions.put("upload", p -> {
|
||||
try {
|
||||
Object o0 = p.get(0);
|
||||
Object o1 = p.get(1);
|
||||
|
|
@ -58,7 +58,7 @@ public abstract class ContainerExPatternTerminalMixin implements IActionHolder {
|
|||
long providerId = (o1 instanceof Number) ? ((Number) o1).longValue() : Long.parseLong(String.valueOf(o1));
|
||||
var sp = (ServerPlayer) this.epp$player;
|
||||
ExtendedAEPatternUploadUtil.uploadPatternToProvider(sp, playerSlotIndex, providerId);
|
||||
} catch (Throwable t) {
|
||||
} catch (Throwable ignored) {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
@ -66,6 +66,6 @@ public abstract class ContainerExPatternTerminalMixin implements IActionHolder {
|
|||
@NotNull
|
||||
@Override
|
||||
public Map<String, Consumer<Paras>> getActionMap() {
|
||||
return this.actions;
|
||||
return this.eap$actions;
|
||||
}
|
||||
}
|
||||
|
|
@ -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.glodblock.github.extendedae.container.ContainerWirelessExPAT;
|
||||
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.Paras;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
|
|
@ -27,7 +26,7 @@ import java.util.function.Consumer;
|
|||
public abstract class ContainerWirelessExPatternTerminalMixin implements IActionHolder {
|
||||
|
||||
@Unique
|
||||
private final Map<String, Consumer<Paras>> actions = createHolder();
|
||||
private final Map<String, Consumer<Paras>> eap$actions = createHolder();
|
||||
|
||||
@Unique
|
||||
private Player epp$player;
|
||||
|
|
@ -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) {
|
||||
this.epp$player = playerInventory.player;
|
||||
// 注册上传动作:参数顺序必须与客户端 CGenericPacket 保持一致
|
||||
this.actions.put("upload", p -> {
|
||||
this.eap$actions.put("upload", p -> {
|
||||
try {
|
||||
Object o0 = p.get(0);
|
||||
Object o1 = p.get(1);
|
||||
|
|
@ -45,7 +44,7 @@ public abstract class ContainerWirelessExPatternTerminalMixin implements IAction
|
|||
long providerId = (o1 instanceof Number) ? ((Number) o1).longValue() : Long.parseLong(String.valueOf(o1));
|
||||
var sp = (ServerPlayer) this.epp$player;
|
||||
ExtendedAEPatternUploadUtil.uploadPatternToProvider(sp, playerSlotIndex, providerId);
|
||||
} catch (Throwable t) {
|
||||
} catch (Throwable ignored) {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
@ -53,6 +52,6 @@ public abstract class ContainerWirelessExPatternTerminalMixin implements IAction
|
|||
@NotNull
|
||||
@Override
|
||||
public Map<String, Consumer<Paras>> getActionMap() {
|
||||
return this.actions;
|
||||
return this.eap$actions;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,18 +1,16 @@
|
|||
package com.extendedae_plus.mixin;
|
||||
package com.extendedae_plus.mixin.extendedae;
|
||||
|
||||
import appeng.client.gui.Icon;
|
||||
import appeng.client.gui.implementations.PatternProviderScreen;
|
||||
import appeng.client.gui.style.PaletteColor;
|
||||
import appeng.client.gui.style.ScreenStyle;
|
||||
import appeng.client.gui.widgets.VerticalButtonBar;
|
||||
import appeng.menu.SlotSemantics;
|
||||
import com.extendedae_plus.NewIcon;
|
||||
import com.extendedae_plus.util.PatternProviderUIHelper;
|
||||
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.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.gui.Font;
|
||||
import net.minecraft.client.gui.GuiGraphics;
|
||||
|
|
@ -32,11 +30,11 @@ import java.util.List;
|
|||
public abstract class GuiExPatternProviderMixin extends PatternProviderScreen<ContainerExPatternProvider> {
|
||||
|
||||
@Unique
|
||||
ScreenStyle screenStyle;
|
||||
ScreenStyle eap$screenStyle;
|
||||
|
||||
// 跟踪上次屏幕尺寸,处理 GUI 缩放/窗口大小变化后按钮丢失问题
|
||||
private int epp_lastScreenWidth = -1;
|
||||
private int epp_lastScreenHeight = -1;
|
||||
@Unique private int eap$lastScreenWidth = -1;
|
||||
@Unique private int eap$lastScreenHeight = -1;
|
||||
|
||||
// 不再使用右侧 VerticalButtonBar,直接把按钮注册为独立 AE2 小部件
|
||||
|
||||
|
|
@ -61,7 +59,7 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen<Co
|
|||
int maxPage = getMaxPage();
|
||||
|
||||
// 获取ae通用界面样式
|
||||
int color = screenStyle.getColor(PaletteColor.DEFAULT_TEXT_COLOR).toARGB();
|
||||
int color = eap$screenStyle.getColor(PaletteColor.DEFAULT_TEXT_COLOR).toARGB();
|
||||
// 调整页码显示位置:在"样板"文字的右边
|
||||
guiGraphics.drawString(font, Component.literal("第 " + (currentPage + 1) + "/" + maxPage + " 页"),
|
||||
leftPos + 8 + 50, topPos + 30, color, false);
|
||||
|
|
@ -106,15 +104,15 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen<Co
|
|||
}
|
||||
|
||||
// 调整槽位位置
|
||||
this.adjustSlotPositions(page);
|
||||
this.eap$adjustSlotPositions(page);
|
||||
} catch (Exception e) {
|
||||
// 忽略反射错误
|
||||
}
|
||||
|
||||
// 如果屏幕尺寸发生变化(窗口/GUI缩放),重新注册按钮,避免被 Screen.init 清空
|
||||
if (this.width != epp_lastScreenWidth || this.height != epp_lastScreenHeight) {
|
||||
epp_lastScreenWidth = this.width;
|
||||
epp_lastScreenHeight = this.height;
|
||||
if (this.width != eap$lastScreenWidth || this.height != eap$lastScreenHeight) {
|
||||
eap$lastScreenWidth = this.width;
|
||||
eap$lastScreenHeight = this.height;
|
||||
try {
|
||||
if (this.divideBy2Button != null) {
|
||||
this.removeWidget(this.divideBy2Button);
|
||||
|
|
@ -181,7 +179,7 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen<Co
|
|||
}
|
||||
|
||||
@Unique
|
||||
private void adjustSlotPositions(int currentPage) {
|
||||
private void eap$adjustSlotPositions(int currentPage) {
|
||||
try {
|
||||
List<Slot> slots = this.getMenu().getSlots(SlotSemantics.ENCODED_PATTERN);
|
||||
int totalSlots = slots.size();
|
||||
|
|
@ -276,7 +274,7 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen<Co
|
|||
// 在构造器返回后初始化按钮与翻页控制
|
||||
@Inject(method = "<init>", at = @At("RETURN"))
|
||||
private void injectInit(ContainerExPatternProvider menu, Inventory playerInventory, Component title, ScreenStyle style, CallbackInfo ci) {
|
||||
this.screenStyle = style;
|
||||
this.eap$screenStyle = style;
|
||||
// 保留:不再打印菜单类型
|
||||
|
||||
// 翻页按钮(仅在需要时显示)
|
||||
|
|
@ -420,11 +418,11 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen<Co
|
|||
minecraft.player.displayClientMessage(net.minecraft.network.chat.Component.literal(message), true);
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
});
|
||||
|
||||
} catch (Exception e) {
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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.Icon;
|
||||
import appeng.client.gui.style.ScreenStyle;
|
||||
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.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.network.chat.Component;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.world.entity.player.Inventory;
|
||||
import net.minecraft.world.inventory.Slot;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import appeng.api.crafting.PatternDetailsHelper;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
|
|
@ -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.gui.GuiExPatternTerminal;
|
||||
|
|
@ -49,13 +49,13 @@ public abstract class HighlightButtonMixin {
|
|||
try {
|
||||
var setMethod = terminal.getClass().getMethod("setCurrentlyChoicePatternProvider", long.class);
|
||||
setMethod.invoke(terminal, serverId);
|
||||
} catch (Exception e) {
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package com.extendedae_plus.mixin;
|
||||
package com.extendedae_plus.mixin.extendedae;
|
||||
|
||||
import com.extendedae_plus.config.ModConfigs;
|
||||
import com.glodblock.github.extendedae.common.parts.PartExPatternProvider;
|
||||
|
|
@ -17,7 +17,7 @@ public abstract class PartExPatternProviderMixin {
|
|||
),
|
||||
index = 2
|
||||
)
|
||||
private int extendedae_plus$multiplyCapacity(int original) {
|
||||
private int eap$multiplyCapacity(int original) {
|
||||
int mult = ModConfigs.PAGE_MULTIPLIER.get();
|
||||
if (mult < 1) mult = 1;
|
||||
if (mult > 64) mult = 64;
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package com.extendedae_plus.mixin;
|
||||
package com.extendedae_plus.mixin.extendedae;
|
||||
|
||||
import com.extendedae_plus.config.ModConfigs;
|
||||
import com.glodblock.github.extendedae.common.tileentities.TileExPatternProvider;
|
||||
|
|
@ -17,7 +17,7 @@ public abstract class TileExPatternProviderMixin {
|
|||
),
|
||||
index = 2
|
||||
)
|
||||
private int extendedae_plus$multiplyCapacity(int original) {
|
||||
private int eap$multiplyCapacity(int original) {
|
||||
int mult = ModConfigs.PAGE_MULTIPLIER.get();
|
||||
if (mult < 1) mult = 1;
|
||||
if (mult > 64) mult = 64;
|
||||
|
|
@ -1,13 +1,10 @@
|
|||
package com.extendedae_plus.network;
|
||||
|
||||
import com.extendedae_plus.ExtendedAEPlus;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraftforge.network.NetworkDirection;
|
||||
import net.minecraftforge.network.NetworkRegistry;
|
||||
import net.minecraftforge.network.simple.SimpleChannel;
|
||||
import net.minecraftforge.network.NetworkDirection;
|
||||
|
||||
import com.extendedae_plus.ExtendedAEPlus;
|
||||
import com.extendedae_plus.network.PullFromJeiOrCraftC2SPacket;
|
||||
import com.extendedae_plus.network.UploadEncodedPatternToProviderC2SPacket;
|
||||
|
||||
public class ModNetwork {
|
||||
private static final String PROTOCOL_VERSION = "1";
|
||||
|
|
|
|||
|
|
@ -1,21 +1,18 @@
|
|||
package com.extendedae_plus.network;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
|
||||
import net.minecraftforge.network.NetworkEvent;
|
||||
|
||||
import appeng.api.networking.IGrid;
|
||||
import appeng.api.stacks.AEKey;
|
||||
import appeng.api.stacks.GenericStack;
|
||||
import appeng.items.tools.powered.WirelessTerminalItem;
|
||||
import appeng.menu.locator.MenuLocators;
|
||||
import com.extendedae_plus.menu.locator.CuriosItemLocator;
|
||||
import appeng.menu.me.crafting.CraftAmountMenu;
|
||||
|
||||
import com.extendedae_plus.menu.locator.CuriosItemLocator;
|
||||
import com.extendedae_plus.util.WirelessTerminalLocator;
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraftforge.network.NetworkEvent;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
/**
|
||||
* C2S:从 JEI 中键点击请求打开 AE 的下单界面。
|
||||
|
|
|
|||
|
|
@ -1,33 +1,30 @@
|
|||
package com.extendedae_plus.network;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import appeng.api.networking.IGrid;
|
||||
import appeng.api.networking.energy.IEnergyService;
|
||||
import appeng.api.stacks.AEItemKey;
|
||||
import appeng.api.storage.MEStorage;
|
||||
import appeng.api.storage.StorageHelper;
|
||||
import appeng.items.tools.powered.WirelessCraftingTerminalItem;
|
||||
import appeng.items.tools.powered.WirelessTerminalItem;
|
||||
import appeng.me.helpers.PlayerSource;
|
||||
import com.extendedae_plus.util.WirelessTerminalLocator;
|
||||
import com.extendedae_plus.util.WirelessTerminalLocator.LocatedTerminal;
|
||||
import de.mari_023.ae2wtlib.terminal.WTMenuHost;
|
||||
import de.mari_023.ae2wtlib.wut.WTDefinition;
|
||||
import de.mari_023.ae2wtlib.wut.WUTHandler;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.phys.BlockHitResult;
|
||||
import net.minecraft.world.phys.HitResult;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import net.minecraftforge.network.NetworkEvent;
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
|
||||
import appeng.api.networking.IGrid;
|
||||
import appeng.api.storage.MEStorage;
|
||||
import appeng.api.storage.StorageHelper;
|
||||
import appeng.api.stacks.AEItemKey;
|
||||
import appeng.api.networking.energy.IEnergyService;
|
||||
import appeng.me.helpers.PlayerSource;
|
||||
import appeng.items.tools.powered.WirelessCraftingTerminalItem;
|
||||
import appeng.items.tools.powered.WirelessTerminalItem;
|
||||
// ae2wtlib
|
||||
import de.mari_023.ae2wtlib.wut.WUTHandler;
|
||||
import de.mari_023.ae2wtlib.wut.WTDefinition;
|
||||
import de.mari_023.ae2wtlib.terminal.WTMenuHost;
|
||||
import com.extendedae_plus.util.WirelessTerminalLocator;
|
||||
import com.extendedae_plus.util.WirelessTerminalLocator.LocatedTerminal;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class PickFromWirelessC2SPacket {
|
||||
private final BlockPos pos;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package com.extendedae_plus.network;
|
||||
|
||||
import com.extendedae_plus.client.ui.ProviderSelectScreen;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
|
|
@ -10,8 +11,6 @@ import java.util.ArrayList;
|
|||
import java.util.List;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import com.extendedae_plus.client.ui.ProviderSelectScreen;
|
||||
|
||||
/**
|
||||
* S2C: 返回可见且有空位的样板供应器列表,客户端弹窗展示供用户选择。
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,34 +1,30 @@
|
|||
package com.extendedae_plus.network;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraftforge.network.NetworkEvent;
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
|
||||
import appeng.api.networking.IGrid;
|
||||
import appeng.api.storage.MEStorage;
|
||||
import appeng.api.storage.StorageHelper;
|
||||
import appeng.api.networking.energy.IEnergyService;
|
||||
import appeng.api.stacks.AEItemKey;
|
||||
import appeng.api.stacks.AEKey;
|
||||
import appeng.api.stacks.GenericStack;
|
||||
import appeng.api.networking.energy.IEnergyService;
|
||||
import appeng.api.storage.MEStorage;
|
||||
import appeng.api.storage.StorageHelper;
|
||||
import appeng.items.tools.powered.WirelessCraftingTerminalItem;
|
||||
import appeng.items.tools.powered.WirelessTerminalItem;
|
||||
import appeng.me.helpers.PlayerSource;
|
||||
import appeng.menu.locator.MenuLocators;
|
||||
import appeng.menu.me.crafting.CraftAmountMenu;
|
||||
|
||||
// ae2wtlib
|
||||
import de.mari_023.ae2wtlib.wut.WUTHandler;
|
||||
import de.mari_023.ae2wtlib.wut.WTDefinition;
|
||||
import de.mari_023.ae2wtlib.terminal.WTMenuHost;
|
||||
|
||||
import com.extendedae_plus.menu.locator.CuriosItemLocator;
|
||||
import com.extendedae_plus.util.WirelessTerminalLocator;
|
||||
import com.extendedae_plus.util.WirelessTerminalLocator.LocatedTerminal;
|
||||
import com.extendedae_plus.menu.locator.CuriosItemLocator;
|
||||
import de.mari_023.ae2wtlib.terminal.WTMenuHost;
|
||||
import de.mari_023.ae2wtlib.wut.WTDefinition;
|
||||
import de.mari_023.ae2wtlib.wut.WUTHandler;
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraftforge.network.NetworkEvent;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class PullFromJeiOrCraftC2SPacket {
|
||||
private final GenericStack stack;
|
||||
|
|
|
|||
|
|
@ -1,18 +1,17 @@
|
|||
package com.extendedae_plus.network;
|
||||
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
import net.minecraftforge.network.NetworkEvent;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import appeng.menu.me.items.PatternEncodingTermMenu;
|
||||
import appeng.menu.implementations.PatternAccessTermMenu;
|
||||
import appeng.helpers.patternprovider.PatternContainer;
|
||||
import appeng.menu.implementations.PatternAccessTermMenu;
|
||||
import appeng.menu.me.items.PatternEncodingTermMenu;
|
||||
import com.extendedae_plus.util.ExtendedAEPatternUploadUtil;
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraftforge.network.NetworkEvent;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import com.extendedae_plus.util.ExtendedAEPatternUploadUtil;
|
||||
|
||||
/**
|
||||
* C2S: 请求当前终端可见的样板供应器列表(用于弹窗选择)。
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,17 +1,16 @@
|
|||
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.minecraftforge.network.NetworkEvent;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraftforge.network.NetworkDirection;
|
||||
import net.minecraftforge.network.NetworkEvent;
|
||||
|
||||
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:切换高级阻挡模式。
|
||||
* 不含额外负载,直接基于玩家当前打开的 PatternProviderMenu 进行切换。
|
||||
|
|
@ -34,15 +33,15 @@ public class ToggleAdvancedBlockingC2SPacket {
|
|||
|
||||
// 通过 accessor 获取逻辑与当前状态
|
||||
var accessor = (PatternProviderMenuAdvancedAccessor) menu;
|
||||
var logic = accessor.ext$logic();
|
||||
var logic = accessor.eap$logic();
|
||||
if (logic instanceof AdvancedBlockingHolder holder) {
|
||||
boolean current = holder.ext$getAdvancedBlocking();
|
||||
boolean current = holder.eap$getAdvancedBlocking();
|
||||
boolean next = !current;
|
||||
holder.ext$setAdvancedBlocking(next);
|
||||
holder.eap$setAdvancedBlocking(next);
|
||||
// 关键:保存持久化,触发 AE2 写入逻辑(writeToNBT),并由菜单 @GuiSync 同步回客户端
|
||||
logic.saveChanges();
|
||||
// 直接下发 S2C 强制同步(带供应器标识:维度+方块坐标)
|
||||
var host = ((PatternProviderLogicAccessor) logic).ext$host();
|
||||
var host = ((PatternProviderLogicAccessor) logic).eap$host();
|
||||
var be = host.getBlockEntity();
|
||||
var level = be.getLevel();
|
||||
String dimId = level.dimension().location().toString();
|
||||
|
|
|
|||
|
|
@ -1,14 +1,13 @@
|
|||
package com.extendedae_plus.network;
|
||||
|
||||
import appeng.menu.me.items.PatternEncodingTermMenu;
|
||||
import com.extendedae_plus.util.ExtendedAEPatternUploadUtil;
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraftforge.network.NetworkEvent;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import appeng.menu.me.items.PatternEncodingTermMenu;
|
||||
import com.extendedae_plus.util.ExtendedAEPatternUploadUtil;
|
||||
|
||||
/**
|
||||
* C2S: 请求将图样编码终端的已编码样板上传到指定的样板供应器(由客户端选择)。
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,46 +1,40 @@
|
|||
package com.extendedae_plus.util;
|
||||
|
||||
import appeng.api.inventories.InternalInventory;
|
||||
import appeng.api.crafting.PatternDetailsHelper;
|
||||
import appeng.api.crafting.IPatternDetails;
|
||||
import appeng.api.crafting.PatternDetailsHelper;
|
||||
import appeng.api.inventories.InternalInventory;
|
||||
import appeng.api.networking.IGrid;
|
||||
import appeng.api.networking.IGridNode;
|
||||
import appeng.core.definitions.AEItems;
|
||||
import appeng.crafting.pattern.AECraftingPattern;
|
||||
import appeng.helpers.patternprovider.PatternContainer;
|
||||
import appeng.menu.implementations.PatternAccessTermMenu;
|
||||
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.filter.IAEItemFilter;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
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.extendedae_plus.mixin.ae2.accessor.PatternEncodingTermMenuAccessor;
|
||||
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.GsonBuilder;
|
||||
import com.google.gson.JsonElement;
|
||||
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扩展样板管理终端专用的样板上传工具类
|
||||
|
|
@ -431,8 +425,8 @@ public class ExtendedAEPatternUploadUtil {
|
|||
}
|
||||
|
||||
// 读取已编码槽位的物品
|
||||
var encodedSlot = ((com.extendedae_plus.mixin.accessor.PatternEncodingTermMenuAccessor) (Object) menu)
|
||||
.epp$getEncodedPatternSlot();
|
||||
var encodedSlot = ((PatternEncodingTermMenuAccessor) (Object) menu)
|
||||
.eap$getEncodedPatternSlot();
|
||||
ItemStack stack = encodedSlot.getItem();
|
||||
if (stack.isEmpty() || !PatternDetailsHelper.isEncodedPattern(stack)) {
|
||||
sendMessage(player, "ExtendedAE Plus: 没有可上传的编码样板");
|
||||
|
|
@ -465,8 +459,8 @@ public class ExtendedAEPatternUploadUtil {
|
|||
player.sendSystemMessage(Component.literal("ExtendedAE Plus: 装配矩阵已存在相同样板,已跳过上传并返还空白样板"));
|
||||
}
|
||||
try {
|
||||
var accessor = (com.extendedae_plus.mixin.accessor.PatternEncodingTermMenuAccessor) (Object) menu;
|
||||
var blankSlot = accessor.epp$getBlankPatternSlot();
|
||||
var accessor = (PatternEncodingTermMenuAccessor) (Object) menu;
|
||||
var blankSlot = accessor.eap$getBlankPatternSlot();
|
||||
ItemStack blanks = AEItems.BLANK_PATTERN.stack(stack.getCount());
|
||||
if (blankSlot != null && blankSlot.mayPlace(blanks)) {
|
||||
ItemStack remain = blankSlot.safeInsert(blanks);
|
||||
|
|
@ -982,8 +976,8 @@ public class ExtendedAEPatternUploadUtil {
|
|||
return false;
|
||||
}
|
||||
// 读取已编码槽位的物品(通过 accessor)
|
||||
var encodedSlot = ((com.extendedae_plus.mixin.accessor.PatternEncodingTermMenuAccessor) (Object) menu)
|
||||
.epp$getEncodedPatternSlot();
|
||||
var encodedSlot = ((PatternEncodingTermMenuAccessor) (Object) menu)
|
||||
.eap$getEncodedPatternSlot();
|
||||
ItemStack stack = encodedSlot.getItem();
|
||||
if (stack.isEmpty() || !PatternDetailsHelper.isEncodedPattern(stack)) {
|
||||
return false;
|
||||
|
|
@ -1054,8 +1048,8 @@ public class ExtendedAEPatternUploadUtil {
|
|||
if (player == null || menu == null) {
|
||||
return false;
|
||||
}
|
||||
var encodedSlot = ((com.extendedae_plus.mixin.accessor.PatternEncodingTermMenuAccessor) (Object) menu)
|
||||
.epp$getEncodedPatternSlot();
|
||||
var encodedSlot = ((PatternEncodingTermMenuAccessor) (Object) menu)
|
||||
.eap$getEncodedPatternSlot();
|
||||
ItemStack stack = encodedSlot.getItem();
|
||||
if (stack.isEmpty() || !PatternDetailsHelper.isEncodedPattern(stack)) {
|
||||
return false;
|
||||
|
|
@ -1192,8 +1186,8 @@ public class ExtendedAEPatternUploadUtil {
|
|||
var container = list.get(index);
|
||||
if (container == null) return false;
|
||||
|
||||
var encodedSlot = ((com.extendedae_plus.mixin.accessor.PatternEncodingTermMenuAccessor) (Object) menu)
|
||||
.epp$getEncodedPatternSlot();
|
||||
var encodedSlot = ((PatternEncodingTermMenuAccessor) (Object) menu)
|
||||
.eap$getEncodedPatternSlot();
|
||||
ItemStack stack = encodedSlot.getItem();
|
||||
if (stack.isEmpty() || !PatternDetailsHelper.isEncodedPattern(stack)) {
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -2,10 +2,10 @@ package com.extendedae_plus.util;
|
|||
|
||||
import appeng.api.crafting.IPatternDetails;
|
||||
import appeng.api.crafting.PatternDetailsHelper;
|
||||
import appeng.api.inventories.InternalInventory;
|
||||
import appeng.api.stacks.AEKey;
|
||||
import appeng.api.stacks.GenericStack;
|
||||
import appeng.helpers.patternprovider.PatternProviderLogic;
|
||||
import appeng.api.inventories.InternalInventory;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.level.Level;
|
||||
|
||||
|
|
@ -13,7 +13,6 @@ import java.util.ArrayList;
|
|||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* 样板供应器数据工具类
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
package com.extendedae_plus.util;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.screens.Screen;
|
||||
import appeng.client.gui.implementations.PatternProviderScreen;
|
||||
import appeng.helpers.patternprovider.PatternProviderLogic;
|
||||
import appeng.menu.implementations.PatternProviderMenu;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.screens.Screen;
|
||||
|
||||
/**
|
||||
* 样板供应器UI辅助工具类
|
||||
|
|
|
|||
|
|
@ -1,22 +1,17 @@
|
|||
package com.extendedae_plus.util;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
|
||||
import net.minecraftforge.fml.ModList;
|
||||
import net.minecraftforge.common.util.LazyOptional;
|
||||
|
||||
import appeng.items.tools.powered.WirelessCraftingTerminalItem;
|
||||
import appeng.items.tools.powered.WirelessTerminalItem;
|
||||
|
||||
// Curios API (软依赖)
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraftforge.fml.ModList;
|
||||
import top.theillusivec4.curios.api.CuriosApi;
|
||||
import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler;
|
||||
import top.theillusivec4.curios.api.type.inventory.ICurioStacksHandler;
|
||||
import top.theillusivec4.curios.api.type.inventory.IDynamicStackHandler;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
* 定位玩家身上的无线终端:
|
||||
* - 原版槽位:主手、副手、盔甲、背包
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package com.extendedae_plus.wireless;
|
||||
|
||||
import com.extendedae_plus.config.ModConfigs;
|
||||
import net.minecraft.resources.ResourceKey;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.world.level.Level;
|
||||
|
|
@ -9,8 +10,6 @@ import java.util.HashMap;
|
|||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
import com.extendedae_plus.config.ModConfigs;
|
||||
|
||||
/**
|
||||
* 无线主端注册中心:按 维度 + 频率 唯一注册一个主收发器端点。
|
||||
* 从端通过本注册中心按频率查找主端,实现一对多连接。
|
||||
|
|
|
|||
|
|
@ -4,36 +4,39 @@
|
|||
"compatibilityLevel": "JAVA_17",
|
||||
"minVersion": "0.8",
|
||||
"client": [
|
||||
"GuiExPatternProviderMixin",
|
||||
"SlotGridLayoutMixin",
|
||||
"GuiExPatternTerminalMixin",
|
||||
"HighlightButtonMixin",
|
||||
"PickFromWirelessMixin",
|
||||
"PatternEncodingTermScreenMixin",
|
||||
"ae2.PatternProviderScreenMixin",
|
||||
"jei.EncodePatternTransferHandlerMixin",
|
||||
"ae2.QuartzCuttingKnifeItemMixin",
|
||||
"accessor.AEBaseScreenAccessor",
|
||||
"accessor.AbstractContainerScreenAccessor",
|
||||
"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": [
|
||||
"ContainerExPatternProviderMixin",
|
||||
"ContainerExPatternTerminalMixin",
|
||||
"ContainerWirelessExPatternTerminalMixin",
|
||||
"ContainerUWirelessExPatternTerminalMixin",
|
||||
"TileExPatternProviderMixin",
|
||||
"PartExPatternProviderMixin",
|
||||
"PatternEncodingTermMenuMixin",
|
||||
"ContainerPatternEncodingTermMenuMixin",
|
||||
"MEStorageMenuMixin",
|
||||
"accessor.MEStorageMenuAccessor",
|
||||
"accessor.PatternEncodingTermMenuAccessor",
|
||||
"ae2.ContainerPatternEncodingTermMenuMixin",
|
||||
"ae2.MEStorageMenuMixin",
|
||||
"ae2.PatternEncodingTermMenuMixin",
|
||||
"ae2.PatternProviderLogicAdvancedMixin",
|
||||
"ae2.PatternProviderMenuAdvancedMixin",
|
||||
"accessor.PatternProviderMenuAdvancedAccessor",
|
||||
"accessor.PatternProviderLogicAccessor"
|
||||
"ae2.accessor.MEStorageMenuAccessor",
|
||||
"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": {
|
||||
"defaultRequire": 1
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user