diff --git a/CHANGELOG.md b/CHANGELOG.md index 626be86..837f2e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,8 @@ - Added natural sorting functionality for the upload pattern list - 添加合成计划字节数显示的格式化功能 - Added formatted display for crafting plan byte count +- 添加部分物品用于磁盘合成(与AAE、APPFLUX、MEGA均有联动) + - Add some items for disk synthesis (linked with AAE, APPFLUX, MEGA) ### Changed / 变更 - 调整实体加速器模型 @@ -33,6 +35,10 @@ - Added translation key support for some previously hardcoded text, improving internationalization experience - 略微提升无线收发器基础硬度,锁定状态下挖掘速度降至10% - Slightly increased wireless transceiver base hardness, mining speed reduced to 10% when locked +- 调整部分物品合成配方 + - Adjust the synthesis formula of some items +- 优化本mod磁盘性能 + - Optimize the disk performance of this mod ### Fixed / 修复 - 修复供应器高亮在服务器中不显示的问题 diff --git a/src/main/java/com/extendedae_plus/api/storage/InfinityBigIntegerCellInventory.java b/src/main/java/com/extendedae_plus/api/storage/InfinityBigIntegerCellInventory.java index 8c1eac8..72b86fc 100644 --- a/src/main/java/com/extendedae_plus/api/storage/InfinityBigIntegerCellInventory.java +++ b/src/main/java/com/extendedae_plus/api/storage/InfinityBigIntegerCellInventory.java @@ -42,10 +42,13 @@ public class InfinityBigIntegerCellInventory implements StorageCell { // 存储的物品种类数量 private int totalAEKeyType; // 存储的物品总数 - private BigInteger totalAEKey2Amounts = BigInteger.ZERO; + private BigInteger totalAEKey2Amounts = BI_ZERO; // 标记是否已持久化到 SavedData private boolean isPersisted = true; + private static final BigInteger BI_ZERO = BigInteger.ZERO; + private static final BigInteger BI_LONG_MAX = BigInteger.valueOf(Long.MAX_VALUE); + public InfinityBigIntegerCellInventory(InfinityBigIntegerCellItem cell, ItemStack stack, ISaveProvider saveProvider) { // 保存存储单元类型(InfinityBigIntegerCellItem 实例),用于访问磁盘属性 @@ -93,15 +96,16 @@ public class InfinityBigIntegerCellInventory implements StorageCell { private void initData() { // 如果磁盘有 UUID,加载存储的物品数据 if (hasUUID()) { - this.totalAEKeyType = getCellStorage().amounts.size(); - this.totalAEKey2Amounts = getCellStorage().itemCount.equals(BigInteger.ZERO) ? - BigInteger.ZERO : - getCellStorage().itemCount; + InfinityDataStorage storage = getCellStorage(); + this.totalAEKeyType = storage.amounts.size(); + this.totalAEKey2Amounts = storage.itemCount.equals(BI_ZERO) ? + BI_ZERO : + storage.itemCount; } else { // 否则初始化为空 this.totalAEKeyType = 0; - this.totalAEKey2Amounts = BigInteger.ZERO; + this.totalAEKey2Amounts = BI_ZERO; // 加载物品数据 getCellStoredMap(); } @@ -111,7 +115,7 @@ public class InfinityBigIntegerCellInventory implements StorageCell { @Override public CellState getStatus() { // 如果没有存储任何物品,返回空状态 - if (this.getTotalAEKey2Amounts().equals(BigInteger.ZERO)) { + if (this.getTotalAEKey2Amounts().equals(BI_ZERO)) { return CellState.EMPTY; } // 否则返回满状态 @@ -130,7 +134,7 @@ public class InfinityBigIntegerCellInventory implements StorageCell { if (this.isPersisted) return; - if (totalAEKey2Amounts.equals(BigInteger.ZERO)) { + if (totalAEKey2Amounts.equals(BI_ZERO)) { if (hasUUID()) { getStorageManagerInstance().removeCell(getUUID()); if (self.hasTag()) { @@ -152,12 +156,12 @@ public class InfinityBigIntegerCellInventory implements StorageCell { // 创建物品数量列表 ListTag amounts = new ListTag(); // 初始化物品总数 - BigInteger itemCount = BigInteger.ZERO; + BigInteger itemCount = BI_ZERO; for (var entry : this.AEKey2AmountsMap.object2ObjectEntrySet()) { BigInteger amount = entry.getValue(); // 如果数量大于 0,添加到键和数量列表 - if (amount.compareTo(BigInteger.ZERO) > 0) { + if (amount.compareTo(BI_ZERO) > 0) { keys.add(entry.getKey().toTagGeneric()); CompoundTag amountTag = new CompoundTag(); amountTag.putByteArray("value", amount.toByteArray()); @@ -233,7 +237,7 @@ public class InfinityBigIntegerCellInventory implements StorageCell { // 获取或初始化存储映射 private Object2ObjectMap getCellStoredMap() { if (AEKey2AmountsMap == null) { - AEKey2AmountsMap = new Object2ObjectOpenHashMap<>(); + AEKey2AmountsMap = new Object2ObjectOpenHashMap<>(512, 0.6f); this.loadCellStoredMap(); } return AEKey2AmountsMap; @@ -242,30 +246,39 @@ public class InfinityBigIntegerCellInventory implements StorageCell { // 获取所有可用的物品堆栈及其数量 @Override public void getAvailableStacks(KeyCounter out) { - BigInteger maxLong = BigInteger.valueOf(Long.MAX_VALUE); - if(this.getCellStoredMap() == null) return; - for (var entry : this.getCellStoredMap().object2ObjectEntrySet()) { - AEKey key = entry.getKey(); - BigInteger value = entry.getValue(); + var map = getCellStoredMap(); + if (map == null || map.isEmpty()) { + return; + } - // 获取 KeyCounter 中已有的值 + for (var entry : map.object2ObjectEntrySet()) { + AEKey key = entry.getKey(); + BigInteger amount = entry.getValue(); + + // 如果当前要添加的数量本身就超过 Long.MAX_VALUE,直接设为 MAX + if (amount.compareTo(BI_LONG_MAX) > 0) { + out.set(key, Long.MAX_VALUE); + continue; + } + + long addAmount = amount.longValue(); long existing = out.get(key); - // 计算总和并限制到 Long.MAX_VALUE - BigInteger sum = BigInteger.valueOf(existing).add(value); - long toSet = sum.compareTo(maxLong) > 0 ? Long.MAX_VALUE : sum.longValue(); - // 更新 KeyCounter + // 如果已有值已是 MAX,直接跳过 if (existing == Long.MAX_VALUE) { continue; } - long delta = toSet - existing; - if (delta != 0) { - out.add(key, delta); + + // 计算总和,防止溢出 + long sum = existing + addAmount; + if (sum < 0 || sum < existing) { // 溢出检测 + out.set(key, Long.MAX_VALUE); + } else { + out.add(key, addAmount); // 安全添加 } } } - // 从存储中加载物品映射 private void loadCellStoredMap() { boolean dataCorruption = false; @@ -282,7 +295,7 @@ public class InfinityBigIntegerCellInventory implements StorageCell { AEKey key = AEKey.fromTagGeneric(keys.getCompound(i)); BigInteger amount = new BigInteger(amounts.getCompound(i).getByteArray("value")); // 检查数据是否损坏 - if (amount.compareTo(BigInteger.ZERO) <= 0 || key == null) { + if (amount.compareTo(BI_ZERO) <= 0 || key == null) { dataCorruption = true; } else { AEKey2AmountsMap.put(key, amount); @@ -303,7 +316,7 @@ public class InfinityBigIntegerCellInventory implements StorageCell { // 更新存储的物品种类数量 this.totalAEKeyType = this.AEKey2AmountsMap.size(); // 重置物品总数 - this.totalAEKey2Amounts = BigInteger.ZERO; + this.totalAEKey2Amounts = BI_ZERO; // 计算物品总数 for (BigInteger AEKey2Amounts : this.AEKey2AmountsMap.values()) { this.totalAEKey2Amounts = this.totalAEKey2Amounts.add(AEKey2Amounts); @@ -341,7 +354,7 @@ public class InfinityBigIntegerCellInventory implements StorageCell { loadCellStoredMap(); } // 获取当前物品数量 - BigInteger currentAmount = this.getCellStoredMap().getOrDefault(what, BigInteger.ZERO); + BigInteger currentAmount = this.getCellStoredMap().getOrDefault(what, BI_ZERO); if (mode == Actionable.MODULATE) { // 实际插入,更新数量并保存 @@ -355,9 +368,9 @@ public class InfinityBigIntegerCellInventory implements StorageCell { // 从存储单元提取物品 @Override public long extract(AEKey what, long amount, Actionable mode, IActionSource source) { - BigInteger currentAmount = this.getCellStoredMap().getOrDefault(what, BigInteger.ZERO); + BigInteger currentAmount = this.getCellStoredMap().getOrDefault(what, BI_ZERO); // 如果有物品可提取 - if (currentAmount.compareTo(BigInteger.ZERO) > 0) { + if (currentAmount.compareTo(BI_ZERO) > 0) { BigInteger requested = BigInteger.valueOf(amount); @@ -367,7 +380,7 @@ public class InfinityBigIntegerCellInventory implements StorageCell { getCellStoredMap().remove(what); this.saveChanges(); } - return currentAmount.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) > 0 ? Long.MAX_VALUE : currentAmount.longValue(); + return currentAmount.compareTo(BI_LONG_MAX) > 0 ? Long.MAX_VALUE : currentAmount.longValue(); } else { // 提取部分数量 if (mode == Actionable.MODULATE) {