fix: 支持样板供应器轮询

This commit is contained in:
C-H716 2025-08-29 20:26:25 +08:00
parent 956729412e
commit 7cb9fda3f1
3 changed files with 11 additions and 21 deletions

View File

@ -1,12 +0,0 @@
package com.extendedae_plus.mixin.autopattern;
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("providers")
List<?> eap$getProviders();
}

View File

@ -58,19 +58,21 @@ public abstract class CraftingTreeProcessMixin {
CraftingService craftingService = (CraftingService) cc; CraftingService craftingService = (CraftingService) cc;
Iterable<ICraftingProvider> providers = craftingService.getProviders(original); Iterable<ICraftingProvider> providers = craftingService.getProviders(original);
// 计算 provider 数量优先使用 mixin accessor 以避免消费迭代器 // 计算 provider 数量尝试用反射读取内部 providers 列表以避免消费迭代器
int size; int size;
if (providers instanceof CraftingProviderListAccessor acc) { try {
List<?> list = acc.eap$getProviders(); 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(); size = list == null ? 0 : list.size();
} else { } catch (Exception ex) {
// 回退为遍历计数会消费迭代器 // 反射失败回退为遍历计数会消费迭代器
size = (int) StreamSupport.stream(providers.spliterator(), false).count(); size = (int) StreamSupport.stream(providers.spliterator(), false).count();
} }
// requested providers 间均分向上取整保证每个 provider 分配整数且总量不少于 requested
// requested providers 间均分仅在 providers 数量大于1时均分保证整数且总量不少于 requested long perProvider = 1L;
long perProvider = requested; if (size > 0) {
if (size > 1) {
perProvider = requested / size + ((requested % size) == 0 ? 0 : 1); perProvider = requested / size + ((requested % size) == 0 ? 0 : 1);
if (perProvider <= 0) perProvider = 1L; if (perProvider <= 0) perProvider = 1L;
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1010 KiB

After

Width:  |  Height:  |  Size: 92 KiB