背包成就优化

背包成就优化

invadvopt 是一个适用于 Minecraft 1.21.1 的专用服务器 NeoForge 模组。它加速了热键栏 inventory_changed 进度触发器,而无需替换 Minecraft 的谓词或奖励逻辑。客户端无需安装。

性能

🚀 进度判定加速器

当服务器拥有大量进度、数据包或在线玩家时,原版 Minecraft 会频繁遍历相关的进度判定条件。此模组为每个玩家创建一个物品索引,仅筛选可能与当前物品栏变更匹配的条件,同时保留 Minecraft 原版的谓词和奖励逻辑进行最终判定。

简而言之:减少不必要的检查,同时保持原版行为。⚡

🚀 显著减少候选检查

根据玩家物品栏中实际变更的物品来定位相关进度判定条件,避免每次对每个监听器进行全量扫描。

🎯 精准的原版判定

最终匹配仍然由 Minecraft 原版的 TriggerInstance、ItemPredicate 和上下文谓词执行。原版的奖励逻辑不会被替换。

🧩 支持复杂的物品条件

正确处理物品数量、标签、数据组件、空槽位变更、物品移除以及多个条件的组合。

🖥️ 仅需服务端安装

客户端无需安装此模组。原版客户端可直接连接服务器。

🛡️ 安全的回退机制

当遇到未知条件、异步调用、资源重载、Mixin 注入失败或内部异常时,模组会保留或回退到原版处理流程。

🔍 影子验证与熔断保护

默认情况下,模组会采样并对比优化结果与完整判定结果。如果检测到不匹配,则使用完整结果,并且模组可以自动禁用受影响的索引或切换回原版模式。

📊 内置运行时指标

查看触发次数、候选缩减比率、全量扫描次数、回退原因、延迟分布以及最活跃的玩家和物品。

💾 不修改世界数据

模组不会添加玩家附件、能力、存档格式更改或网络频道。移除模组无需进行存档迁移。

该项目包含一个确定性的候选层微基准测试,包含:

  • 5,000 个物品条件监听器
  • 1,000 个唯一的物品 ID
  • 50 个模拟玩家
  • 每次操作每个玩家变更一种物品类型

测试结果:

  • 每次操作平均生成约 5.014 个候选条件
  • 候选数量减少约 99.9%
  • 候选层测试速度提升约 4.04 倍

⚠️ 这些结果来自候选筛选层的微基准测试,并不代表每台服务器都会获得相同的 MSPT 提升。实际性能取决于数据包、进度数量、在线玩家数量和整合包环境。

首次启动后,NeoForge 会生成:

config/invadvopt-common.toml

默认启用安全的 EXACT 模式:

mode = "EXACT"
enabled = true
shadowVerifyRate = 0.01
periodicFullScanTicks = 200
fallbackOnUnknownPredicate = true
fallbackOnOffThreadCall = true
disableOnMismatch = true
metricsEnabled = true
debugLogging = false

如需立即禁用优化,将模式切换为 VANILLA。无需卸载模组或重启服务器。

以下命令需要服务器管理员权限等级 4:

/invadvopt status
/invadvopt stats
/invadvopt verify
/invadvopt mode vanilla
/invadvopt mode exact
/invadvopt reset-stats

🎮 Minecraft 1.21.1

🔧 NeoForge 21.1.x

☕ Java 21

🖥️ 专用服务器

👤 无需客户端安装

将模组 JAR 文件放入服务器的 mods 文件夹并启动服务器。

该模组专门针对混合 NeoForge/Bukkit/Paper 服务器环境设计,包括诸如 Youer 之类的服务器:

  • 不使用 @Overwrite
  • 不依赖 Bukkit 内部实现
  • 不使用 Unsafe 或 ClassLoader 黑客技巧
  • 当 Mixin 目标变更时自动保留原版逻辑
  • 针对可能的运行时差异提供采样验证和熔断保护

以下类似的进度优化模组与此模组不兼容:

  • achiopt
  • cerulean
  • icterine

当检测到冲突时,此模组会记录错误并保留原版的触发处理流程。

此模组特别适用于:

📚 拥有大型数据包的服务器

🏆 包含大量自定义进度的整合包

👥 多人生存服务器

🧱 频繁修改玩家物品栏的模组服务器

📉 希望减少进度判定开销的服务器

您可以随时通过以下方式还原:

  • 使用 /invadvopt mode vanilla 切换回原版模式
  • 在配置文件中设置 mode = "VANILLA"
  • 停止服务器并直接移除模组 JAR 文件

包含 380 个模组的服务器上的实际测试结果:

alt text alt text