feat: 倍增优化

This commit is contained in:
C-H716 2025-10-22 12:59:27 +08:00
parent f74d611962
commit 9cc0fbc31e
5 changed files with 20 additions and 19 deletions

View File

@ -12,7 +12,7 @@ import net.minecraftforge.network.NetworkDirection;
import net.minecraftforge.network.NetworkRegistry;
import net.minecraftforge.network.simple.SimpleChannel;
public class ModNetwork {
public final class ModNetwork {
private static final String PROTOCOL_VERSION = "1";
public static final SimpleChannel CHANNEL = NetworkRegistry.ChannelBuilder
.named(new ResourceLocation(ExtendedAEPlus.MODID, "main"))

View File

@ -12,7 +12,7 @@ import static com.glodblock.github.extendedae.common.EPPItemAndBlock.*;
/**
*
*/
public class UpgradeCards {
public final class UpgradeCards {
public UpgradeCards(final FMLCommonSetupEvent event) {
event.enqueueWork(() -> {
// 现有 Entity Ticker 的部件注册为处理 SPEED/ENERGY 卡的宿主

View File

@ -0,0 +1,13 @@
package com.extendedae_plus.mixin.ae2.autopattern;
import appeng.api.networking.crafting.ICraftingProvider;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import java.util.List;
@Mixin(targets = "appeng.me.service.helpers.NetworkCraftingProviders$CraftingProviderList")
public interface CraftingProviderListAccessor {
@Accessor(value = "providers",remap = false)
List<ICraftingProvider> getProviders();
}

View File

@ -19,7 +19,6 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyVariable;
import java.util.List;
import java.util.stream.StreamSupport;
import static com.extendedae_plus.util.Logger.EAP$LOGGER;
@ -69,21 +68,10 @@ public abstract class CraftingTreeProcessMixin {
perProvider = requested;
if (perProvider <= 0) perProvider = 1L;
} else {
CraftingService craftingService = (CraftingService) cc;
Iterable<ICraftingProvider> providers = craftingService.getProviders(original);
// 计算 provider 数量尝试用反射读取内部 providers 列表以避免消费迭代器
int size;
try {
var cls = providers.getClass();
var f = cls.getDeclaredField("providers"); // private ArrayList<ICraftingProvider>
f.setAccessible(true);
List<?> list = (List<?>) f.get(providers);
size = list == null ? 0 : list.size();
} catch (Exception ex) {
// 反射失败回退为遍历计数会消费迭代器
size = (int) StreamSupport.stream(providers.spliterator(), false).count();
}
// 计算 provider 数量
Iterable<ICraftingProvider> providerIterable = ((CraftingService) cc).getProviders(original);
List<ICraftingProvider> providerList = ((CraftingProviderListAccessor) providerIterable).getProviders();
int size = providerList == null ? 0 : providerList.size();
// requested providers 间均分向上取整保证每个 provider 分配整数且总量不少于 requested
if (size > 0) {
@ -97,7 +85,6 @@ public abstract class CraftingTreeProcessMixin {
return scaled != null ? scaled : original;
} catch (Exception e) {
EAP$LOGGER.warn("构建倍增样板出错", e);
e.printStackTrace();
return original;
}
}

View File

@ -48,6 +48,7 @@
"ae2.accessor.PatternEncodingTermMenuAccessor",
"ae2.accessor.PatternProviderLogicAccessor",
"ae2.accessor.PatternProviderMenuAccessor",
"ae2.autopattern.CraftingProviderListAccessor",
"ae2.autopattern.CraftingServiceGetProvidersMixin",
"ae2.autopattern.CraftingTreeNodeAccessor",
"ae2.autopattern.CraftingTreeNodeMixin",