Skip to content

SealAttributes 服主管理手册

本手册适用于 Java 21、Paper/Purpur/Leaf 1.21.x。项目主要真实验收平台为 Leaf 1.21.4。 SealAttributes 只权威接管“实体对实体”的 RPG 战斗;摔落、火焰、饥饿等环境伤害仍走服务端原版规则。

首次了解插件能力和适用范围时,先阅读 delivery/SealAttributes-1.0.8-插件介绍.md

1. 安装

  1. 正常停止服务端,不要使用 Bukkit /reload
  2. 将版本匹配的唯一 Paper 运行文件 SealAttributes-1.0.8.jar 放进 plugins/。不要把 sealattributes-api、构建子模块或验收探针放进服务端。
  3. 可选安装 PlaceholderAPI、DecentHolograms 和 MythicMobs 5.x。三者都是软前置:前两者负责展示, MythicMobs 联动负责导入怪物生成时的实际最大生命,并读取 Mythic 物品里的 SealAttributes:。 适配器已经合并在主插件中,不需要再安装额外的 SealAttributes 适配 JAR。
  4. 使用 Java 21 启动一次。看到 SealAttributes ... runtime is active 后正常停服。
  5. 阅读并修改 plugins/SealAttributes/ 下八份中文业务配置。数据库类型、连接池、队列等结构项修改后 必须完整重启;其余字段按文件注释决定是否可用 /sa reload
  6. 登录后用 /sa version/sa database status/sa stats 验证版本、数据库和 GUI。

斗罗服还应把同版本 SealAttributes-Douluo-1.0.8.jar 放进 plugins/SealAttributes/extensions/。它只提供 douluo:* 属性和 douluo:soul_power 资源定义,不是第二个 Paper 插件;装备、魂骨、魂技等玩法插件仍通过 SealAttributes API 贡献数值或消费资源。

插件默认使用 SQLite,首次启动会由 Paper 下载固定版本的 SQLite JDBC 驱动。生产环境应允许服务端在首次 启动时访问依赖仓库,或按 Paper 的 library cache 机制预置依赖。

内部属性扩展包

SealAttributes 启动时会创建并扫描:

text
plugins/SealAttributes/extensions/*.jar

这里的 JAR 是由 SealAttributes 管理的属性包,不是独立 Paper 插件,不需要 plugin.yml,也不能放进 plugins/ 根目录。一个扩展包可以集中注册几十个同类属性;不建议一个属性制作一个 JAR。

扩展只在服务器完整启动时加载,不支持 /sa reload、Bukkit /reload、热安装或热卸载。临时停用时, 正常停止服务器后把后缀改成 .jar.disabled;恢复 .jar 后再启动。最多加载 64 个扩展 JAR。

扩展 JAR 与普通插件一样拥有执行服务器代码的权限,只能安装可信来源。入口缺失、API 基线不匹配、 命名空间冲突或注册异常时,SealAttributes 会拒绝启动,不会带着半套属性继续运行。启动日志会逐个显示 成功加载的扩展 ID,并在 SealAttributes 加载行显示总数量。

百万生命的服务端上限

SealAttributes 不设置自己的“最大生命硬上限”,但服务端会限制原版 minecraft:max_health 载体。需要百万 生命时,服主必须在服务端配置中放宽上限。例如本项目 Leaf 1.21.4 性能验收使用:

yaml
# spigot.yml
settings:
  attribute:
    maxHealth:
      max: 20000000.0

Leaf/Purpur 若启用了 settings.clamp-attributes,还要按所用服务端版本决定是否关闭该额外钳制。改完必须 重启,并用原版 /attribute <玩家> minecraft:max_health get/sa health <玩家> 同时核对载体上限和 RPG 有效生命。装备写“最大生命 +100”会在基础 100 上得到 200;它不是修改服务器全局上限。

2. 八份业务配置

文件管什么常见影响
config.yml语言、权威战斗模式、基础 Profile、诊断战斗边界和总体运行策略
attributes.yml调整或关闭内置及已注册扩展属性基础数值、装备加成和显示
sources.ymlSTRUCTURED/LORE 物品模式、PDC 键、Lore 规则六槽装备如何产生属性来源
combat.yml命中、格挡、攻速、Rating、反伤、恢复与容量战斗公式参数和有界状态容量
database.ymlSQLite/MySQL、连接池、队列、超时、检查点持久来源和生命检查点可靠性
messages.yml管理命令与错误提示只改变文字,不改变结果
gui.yml54 槽只读 GUI 的标题、材料、槽位与容量属性页视觉与打开/刷新上限
display.yml数字格式、全息、观察者、合并、反馈特效PAPI 格式化和战斗反馈成本

每个可编辑字段旁都写明“可填什么、默认值、影响什么、不影响什么、能否热重载、填错结果和性能代价”。 重载会先读取八份候选并整体校验;任意一项失败都继续使用旧完整配置,不会出现半新半旧。

datasource.yml 是 TabooLib 的内部连接桥,不是第九份业务配置。插件每次启动都会从已校验的 database.yml 重建其内存内容,服主不要编辑它。

属性默认值与开关

新安装生成的 attributes.yml 会完整列出 22 个内置属性及其 enabled、基础值、名称、分类、单位、说明和顺序, 方便服主直接查看和修改。插件内部同时保留完整默认值,因此你也可以删掉不想覆盖的属性块或字段:

yaml
attributes:
  physical_attack:
    base-value: 20

  critical_chance:
    name: "会心率"

  reflection_rating:
    enabled: false

上例只把基础物理攻击改为 20、把“暴击率”改名为“会心率”,并关闭反伤;其他属性和没写出的字段都沿用 插件默认值。旧版包含全部 22 个属性的文件仍可直接使用。

启动时已经成功注册的扩展属性也由 SealAttributes 管理。插件会把缺失的扩展属性块追加到同一份 attributes.yml,使用完整 ID,默认只生成 enabledbase-valuename

yaml
attributes:
  'douluo:max_soul_power':
    enabled: true
    base-value: 0.0
    name: "魂力上限"

你可以像内置属性一样修改这三项,也可以按需增加 categoryunitdescriptionorder。扩展定义的 真实数值类型、公式和行为不能被配置改写。自动补齐只新增缺失块,绝不覆盖已有值;暂时移除扩展时原配置 仍会保留,重新安装后继续使用。扩展没有加载时,对应的旧块会被安全忽略。

enabled: false 后,该属性不会出现在 /sa inspect、GUI 或属性 Placeholder 中,装备 Lore、结构化物品和 第三方 API 提供的加成也不会参与计算。关闭期间的结构化/API 来源不会被删除,重新改为 true 并执行 /sa reload 后可以恢复生效。为保证实体生命和战斗公式始终有效,关闭期间会使用插件内置的安全基础值, 配置中的 base-value 也暂不生效;重新开启后才会恢复该基础值和来源加成。

扩展属性的结构化 JSON 和 API 来源与内置属性共用聚合流程。若使用传统 Lore 读取扩展属性,需要在 sources.ymllore.templates 中以完整属性 ID 显式配置规则;自动按显示名生成的 Lore 规则只覆盖 22 项内置属性,以免大量扩展把 Lore 规则总数推过安全上限。

玩家与怪物基础 Profile

attributes.yml 顶部可以只写玩家或怪物与全局基础值不同的项目。这里写的是“最终裸装基础值”,不是在 base-value 上继续增加:

yaml
base-profiles:
  player-default:
    max_health: 100
  entity-default:
    max_health: 20
    physical_attack: 5

上例让无其他来源的玩家拥有 100 生命,让普通实体拥有 20 生命和 5 物攻。没有写出的属性继续继承下方 attributes.<属性>.base-value,不需要把 22 个属性复制两遍。config.ymlbase-profile.player/entity 选择模板名;修改后执行 /sa reload,在线玩家和实体会在同一次原子配置切换中重算。MythicMobs 已导入的 mythicmobs:mob_health 仍是独立来源,会按来源规则参与最终计算。

战斗随机模型

combat.yml 可把暴击与闪避分别设置为传统独立随机或 PRD:

yaml
hit:
  random-model:
    critical: INDEPENDENT
    evasion: INDEPENDENT
  • INDEPENDENT:每次合法判定都按当前概率独立投掷;这是默认值,旧配置缺少字段时也使用它。
  • PRD:连续失败会逐次提高下一次机会,成功后归零,使长期频率接近配置概率并减少连续脸黑。

暴击连败状态归攻击者,闪避连败状态归防守者;所有具备对应 capability 的 CombatPlan 共用该主体通道。 概率按 0.01 个百分点分桶,低于 0.1% 的正概率保留精确独立投掷,避免极低概率系数求解进入命中热路径。 状态只保存在有界内存中, 不写数据库;/sa reload 的运行代次切换、玩家/实体会话释放、死亡后会话替换、下线和重启都会重置。 属性或武器普通变化不会单独重置。修改后执行 /sa reload 可原子生效。

物品来源模式

以下 SealItems 热切换保护从 API baseline 1.1 开始生效,正式 1.0.8 已包含该保护。

默认情况下,SealAttributes 会自动读取主手、副手和四件护甲。如果以后由 SealItems 统一管理原版与 自定义槽位,在 sources.yml 中关闭内置读取器:

yaml
built-in-equipment-reader:
  enabled: false

接入 SealItems 前应正常停止服务器,将该值改为 false,再完整启动。现有 sealattributes:equipment/* 六槽来源会被撤销,装备变化也不再触发物品读取。基础 Profile、第三方 API 来源、持久来源和 MythicMobs 怪物生命来源不受影响;SealItems 应通过 SealAttributes API 提交完整装备 快照。sealitems provider 已绑定时,任何试图通过 /sa reload 改变该值的操作都会整体拒绝并保留旧配置, 管理员必须停服修改。旧版 sources.yml 没有这个字段时仍按 true 处理。

API baseline 1.3 起,SourceSnapshot 不再有独立贡献条数限制。SealItems 应为主手、副手、头、胸、 腿、脚各发布一个完整槽快照,跨槽套装/共鸣另发布一个 equipment/resonance;不要截断、按玩法拆源 或为规避历史 64 条阈值而分片。这不改变单件物品 PDC/Lore 的独立不可信输入限制。

/sa item inspect 在关闭状态下仍可检查物品数据,但只做诊断,不会把检查结果自动计入玩家属性。

  • STRUCTURED:只读物品 PDC 中的结构化 JSON;不会再读 Lore。
  • LORE:只按 sources.yml 中的规则读取 Lore;不会再读结构化 PDC。
  • 第三方 API 来源始终独立,不受物品模式切换影响。

Lore 模式默认自动读取全部已启用属性的 name,只需配置两组全局格式:

yaml
lore:
  formats:
    number: ["{name} {value}", "{name}: {value}", "{name}:{value}", "{value} {name}"]
    percent: ["{name} {value}", "{name} {value}%", "{name}: {value}%", "{name}:{value}%", "{value}% {name}"]
  aliases:
    physical_attack: ["物理攻击", "物攻"] # 只有需要简称的属性才写
  templates: []                              # 高级兼容规则,通常留空

例如 attributes.yml 的名称是“物理攻击力”,上面会自动接受 物理攻击力 +100物理攻击力:+100+100 物理攻击力;百分比还接受 暴击率 +10%aliases 只为需要多个名称的 少数属性填写。全局格式每组可写 1~8 种,所有名称展开后最多 128 种。旧版逐属性 template/formats 仍可 放进 templates,主要用于 TOTAL_PERCENT 或特殊固定文字。PERCENT 的 +10+10% 都表示内部 0.10。匹配前会去掉颜色并转成纯文本,其他字符仍精确匹配,不执行正则。

STRUCTURED 不是在 Lore 里写属性。服主使用 MythicMobs 5.x 时,直接在物品节点下写 SealAttributes: 即可:

yaml
SealStructuredSword:
  Id: NETHERITE_SWORD
  Display: '&6&lSeal 结构化测试剑'
  SealAttributes:
    physical_attack: 1350
    critical_chance: 10
    max_health: 5000
    total-percent:
      physical_attack: 12

普通键表示 ADDtotal-percent 下表示 TOTAL_PERCENT。键名使用 attributes.yml 的块名,不是中文 name;省略命名空间时会自动补成 sealattributes:<键>。已注册的自定义属性也可写完整键,例如 'customplugin:mana': 50。数值必须是固定 YAML 数字,不能写成带引号的字符串、占位符、区间或随机表达式; 百分比仍是人类百分数,10 表示 10%。属性 ID 必须已经注册,total-percent 只允许 AMOUNT 类型。 配置在 MythicMobs 加载或 /mm reload 时统一校验,错误时整段不注入并在控制台报告物品名。重载后只影响 重新生成的物品,不追溯修改玩家背包里的旧物品。

适配器最终仍写入 SealAttributes 的标准结构化数据,因此只有 STRUCTURED 模式会读取;LORE 模式会忽略 它。服务器只在 plugins/ 根目录安装 SealAttributes 主 JAR;斗罗定义包只放内部 extensions/,不要把 构建目录中的适配子模块 JAR 放进根目录。

若不使用适配器语法,MythicMobs 也仍可手工写扁平 DOUBLE PDC:

yaml
SealStructuredSwordRawPdc:
  Id: NETHERITE_SWORD
  NBT:
    PublicBukkitValues:
      'sealattributes:physical_attack': double/1350
      'sealattributes:critical_chance': double/10
      'sealattributes:total_percent/physical_attack': double/12

程序化物品插件仍可把下列 JSON 作为 STRING 写入 PDC 键 sealattributes:item_attributes

json
{
  "schema": 1,
  "attributes": [
    {"id": "sealattributes:physical_attack", "operation": "ADD", "value": 1000},
    {"id": "sealattributes:critical_chance", "operation": "ADD", "value": 10},
    {"id": "sealattributes:max_health", "operation": "ADD", "value": 5000}
  ]
}

其中百分比仍写人类百分数,10 表示 10%;TOTAL_PERCENT 只允许 AMOUNT,例如最大生命最终再增加 20%:

json
{"id":"sealattributes:max_health","operation":"TOTAL_PERCENT","value":20}

物品插件应在 Paper 主线程写入该字符串:

kotlin
val json = """{"schema":1,"attributes":[{"id":"sealattributes:physical_attack","operation":"ADD","value":1000}]}"""
val meta = item.itemMeta
meta.persistentDataContainer.set(
    NamespacedKey("sealattributes", "item_attributes"),
    PersistentDataType.STRING,
    json,
)
item.itemMeta = meta

扁平 PDC 和 JSON 不能同时出现在一件物品上;混用、错误 PDC 类型或非有限数值都会拒绝整件装备,避免重复 叠加。两种结构化数据都不会显示在物品说明中,STRUCTURED 模式也不会读取 Lore 兜底。修改配置后执行 /sa reload,MythicMobs 物品配置修改后还要重新生成物品。

插件不会覆盖服务器上已经存在的 sources.yml。旧文件不加 formats 也能继续使用。若要迁移到全局格式, 请先备份,再加入 formats/aliases,删除已经被全局格式取代的旧 ADD 规则,只把特殊固定文字或 TOTAL_PERCENT 规则留在 templates,避免重复匹配或超过 128 个展开格式。

切换模式时,在线 Subject 会暂时标为 ITEM_MODE_RECONFIGURING,六槽装备在有界批次中重建。重建完成前 实体战斗 fail-closed,避免同一击混用新旧模式;API 注入来源不会被删除。

MythicMobs 技能伤害与治疗

技能仍然放在 MythicMobs 的 Skills 目录,不需要再到 SealAttributes 创建同名技能:

yaml
SealFireBall:
  Skills:
    - sealDamage{type=spell;base=100;scale=1.5;trueScale=1} @target

SealHeal:
  Skills:
    - sealHeal{amount=100} @target

physical 使用物理攻击、物防和物穿;spell 使用法术攻击、法防和法穿;true 无视防御。 base 是技能固定伤害,scale 是对应攻击属性倍率;物理或法术技能需要附加施法者真实伤害时再写 trueScale=1。治疗会自动计算施法者治疗强度和目标受到治疗加成,并限制在目标最大生命以内。

sealDamage/sealHeal 是显式接入,不会接管旧技能。迁移时请把原来的 damageheal 替换掉, 不要把新旧机制写在同一次命中里。范围目标会逐个独立结算。可复制的完整示例位于 sealattributes-adapters/mythicmobs/examples/skills.yml

3. SQLite 与 MySQL

SQLite(默认)

yaml
type: SQLITE
sqlite:
  file: storage/sealattributes.db
pool:
  minimum-idle: 1
  maximum-pool-size: 1
queue:
  storage-threads: 1

SQLite 固定单连接、单存储线程,适合一台服务器。路径必须位于 plugins/SealAttributes/ 内,不能用绝对路径或 ..

MySQL 8+

先由数据库管理员创建库和账号,再修改:

yaml
type: MYSQL
mysql:
  host: 127.0.0.1
  port: 3306
  database: sealattributes
  username: sealattributes
  password: "替换为真实密码"
  use-ssl: true
  allow-public-key-retrieval: false
pool:
  minimum-idle: 1
  maximum-pool-size: 4
queue:
  storage-threads: 2
  capacity: 2048

插件只创建/更新目标库里的 sa_* 表,不创建数据库。连接失败会拒绝启用,不会偷偷退回 SQLite。连接池最大 16;同一玩家的写入始终串行,因此盲目增大线程和连接不会提高单玩家吞吐。

检查点和故障行为

  • 每次攻击/治疗/资源操作只更新内存,不同步写库;在线生命和当前资源按 health-checkpoint.interval-seconds、退出和停服保存。该间隔默认 60 秒,可填 0 或 10~600。
  • 周期采集到的存活状态和生命值与内存检查点完全相同时不会重新标脏或写库;真实生命变化、死亡、 重生以及失败后的 dirty 重试仍按 revision 顺序提交。
  • 队列满时新持久操作明确失败,生命与资源保留 dirty 标记,不创建无界队列,也不阻塞战斗线程。
  • 运行期数据库中断后,已经 READY 的玩家可继续内存战斗;新登录和新持久修改 fail-closed。插件按 reconnect.interval-seconds 探测恢复。
  • /sa database status 查看 availability、pending、活动玩家 lane、成功/失败/拒绝计数; /sa database flush 捕获检查点并等待有界排空。

4. 备份、升级、恢复和回滚

升级前

  1. 执行 /sa database flush,确认完成。
  2. 正常停服并保存八份配置、当前运行 JAR、数据库备份和对应 SHA-256。
  3. SQLite:停服后复制 storage/sealattributes.db;不要只在运行中复制主文件而漏掉 WAL。
  4. MySQL:使用组织现有的物理备份或 mysqldump --single-transaction,并实际验证备份可恢复。
  5. 在副本服务端先启动新 JAR,检查 /sa version、数据库迁移、登录、来源、生命、资源和停服排空。

已有 SQLite 在向前迁移前会用 VACUUM INTO 自动生成 sealattributes.db.backup-<UTC时间> 并执行完整性检查。MySQL 旧 schema 向前迁移不会替你备份;完成外部备份 后才把 migration.mysql-backup-confirmed 临时设为 true。新安装不需要该确认。

恢复

  1. 停止服务端并保留故障现场副本。
  2. SQLite:恢复同一时点的数据库文件和八份配置;MySQL:恢复完整目标库。
  3. 使用与该 schema 匹配的 SealAttributes JAR 启动。若数据库 schema 比插件支持的新,插件会拒绝启动。
  4. 检查 /sa database status,再以测试玩家核对持久来源与生命;确认后才开放服务器。

回滚边界

只替换旧 JAR 不是数据库回滚。若新版已经迁移 schema,必须同时恢复升级前数据库和配置;否则旧版可能拒绝 启动或误读数据。SQLite 和 MySQL 之间不会自动搬迁,切换 type 只连接另一套存储。

5. 命令与权限

主命令 /sealattributes,别名 /sa。命令中的“玩家”均要求在线;管理写入必须给出可审计原因。

命令权限作用
/sa stats [在线玩家]sealattributes.command.stats;看他人还需 inspect 权限打开只读属性 GUI;控制台退化为文字 inspect
/sa inspect <在线玩家>自己用 stats;他人用 sealattributes.command.inspect.others查看 READY、修订号和全部已提交属性
/sa inspect <在线玩家> <属性ID>同上拆解该属性的基础值、每个来源、最终百分比和规则修正结果
/sa sources <在线玩家>sealattributes.command.sources查看来源总贡献、最大单来源,以及各来源键、revision、持久性和贡献数
/sa health <在线玩家>sealattributes.command.health查看真实当前生命/有效最大生命
/sa health repair <玩家> <原因>sealattributes.command.health.repair只修复 SealAttributes 自有生命与移动投影并审计
/sa source list <玩家>sealattributes.command.sources等同来源列表
/sa source show <玩家> <source-id>sealattributes.command.sources查看 sealattributes_admin:<source-id> 内容
/sa source set <玩家> <source-id> <属性ID> <ADD|TOTAL_PERCENT> <值> <PERMANENT|EXPIRES_AT> [秒] <原因>sealattributes.command.source.manage异步写入一个管理持久来源
/sa source remove <玩家> <source-id> <原因>sealattributes.command.source.manage异步撤销管理持久来源;不会删除第三方运行期来源
/sa refresh <在线玩家>sealattributes.command.refresh读取器开启时重建六槽来源;关闭时提示改由装备插件提交
/sa reloadsealattributes.command.reload原子重载八份配置;结构项会明确要求重启
/sa database status|flushsealattributes.command.database查看或排空有界存储队列
/sa versionsealattributes.command.version查看插件、API、Core、平台和数据库 schema
/sa item inspect [在线玩家]sealattributes.command.diagnostics用正式装备编译器检查主手物品,不修改属性来源
/sa combat trace [在线玩家]sealattributes.command.diagnostics查看参与者最近一次战斗的关键属性和最终结算
/sa doctor [在线玩家]sealattributes.command.diagnostics检查 Java、平台、Core 聚合/来源/物品与生命有界指标、数据库、可选联动、战斗浮字容量和生命投影

statsversion 默认所有玩家可用,其余管理权限默认 OP。item inspectcombat trace 不会写入 数据库;战斗追踪只保留内存中的最近记录,重启后自动清空。

当前资源没有单独的管理员命令或权限。/sa stats 打开的现有 GUI 会在 slot 13“生命与资源”中展示生命及 全部已注册资源的当前值、上限、百分比或“未初始化”,资源变化时自动刷新。玩法状态修改应由对应玩法插件通过 Resource API 完成,不维护第二套管理员余额。

6. PlaceholderAPI

安装 PlaceholderAPI 后,内置 expansion 标识为 sealattributes,无需另外下载 eCloud expansion。只支持在线玩家; 未知属性或不合法参数返回 unresolved/null,不伪造 0。

占位符返回
%sealattributes_ready%true/false
%sealattributes_snapshot_revision%该 Subject 已提交快照修订号
%sealattributes_runtime_revision%当前运行配置修订号
%sealattributes_display_revision%当前显示配置修订号
%sealattributes_current_health_raw%原始当前生命
%sealattributes_current_health_formatted%display.yml 格式化的当前生命
%sealattributes_max_health_raw%RPG 最大生命属性
%sealattributes_max_health_formatted%格式化 RPG 最大生命
%sealattributes_effective_max_health_raw%Paper 载体最终有效最大生命
%sealattributes_effective_max_health_formatted%格式化有效最大生命
%sealattributes_attribute_<id>_raw%任意属性原始值;内置属性可省略 sealattributes:
%sealattributes_attribute_<id>_formatted%任意属性格式化值;百分比会换算为人类百分数,但不附带 %
%sealattributes_attribute_<id>_name%属性中文显示名
%sealattributes_resource_<资源ID>_current_raw%当前资源原始值
%sealattributes_resource_<资源ID>_current_formatted%格式化当前资源
%sealattributes_resource_<资源ID>_max_raw%当前有效上限原始值
%sealattributes_resource_<资源ID>_max_formatted%格式化有效上限
%sealattributes_resource_<资源ID>_percent_raw%当前比例 0..1
%sealattributes_resource_<资源ID>_percent_formatted%当前比例乘 100 后的格式化数值
%sealattributes_resource_<资源ID>_name%资源显示名

例如 %sealattributes_attribute_physical_attack_formatted%%sealattributes_resource_douluo:soul_power_current_formatted%。属性与资源查询只读内存快照,不访问数据库或 重新聚合;未知资源或玩家未 READY 时保持 unresolved/null。

7. DecentHolograms 与战斗反馈

DecentHolograms 是软前置。安装后重启,日志应显示对应 NMS adapter 初始化;插件缺失、禁用或接口异常时,全息 独立降级,伤害仍然提交。display.ymlviewers 可组合:

  • ATTACKER:本次攻击者玩家;
  • TARGET:本次目标玩家;怪物目标不会凭空成为观察者;
  • PARTICIPANTS:攻击者与目标中属于玩家的双方;
  • NEARBY:同世界、配置半径内最近的在线玩家,受 maximum-viewers 限制。

TOTAL 只显示合并总伤害;BREAKDOWN 显示物理、法术、真实三个已提交通道。全息不重新执行公式。活动数、每 tick 创建数、附近观察者数、粒子批次和合并窗口都有硬上限;超过时丢弃展示而不是排无界队列。 /sa doctor 会显示当前活动数、容量、每 tick 创建上限以及按容量/速率累计丢弃的次数;累计丢弃非零时会提示 WARN,可据此判断是否需要调整 display.yml,但属性结算和实际伤害不会因此丢失。

8. 与其他插件共存

  • 不要同时让另一个插件权威提交同一实体战斗。V1 只支持 AUTHORITATIVE,没有隐式混算。
  • MythicMobs 5.x 怪物完成生成时,SealAttributes 会读取该 ActiveMob 经等级计算后的 Health,并发布 mythicmobs:mob_health 运行期来源。例如 MythicMobs 的 Health: 100000 会保持为 RPG 最大生命 100000,而不会被 attributes.yml 的实体基础生命 100 覆盖。装备和其他合法来源仍可继续叠加。
  • 修改 MythicMobs 怪物生命或 SealAttributes 的 sealattributes:max_health.base-value 后,应重新生成 相关怪物;已经存在的怪物不会因为配置文件重载自动改写其生成时来源。Bukkit /reload 仍不受支持。
  • “是否彻底禁用原版附魔、药水、物品伤害或其他原版 RPG 内容”不属于 SealAttributes 职责,应由服务器自己的 内容/规则插件处理。
  • 第三方物品、技能、怪物、任务或保护插件应使用稳定 API 注入来源、CombatPlan 或 Gate,不能异步访问 Bukkit Entity,也不能从 Lore 反向猜 SealAttributes 的运行态。
  • Bukkit /reload 和热替换插件不受支持。使用完整停启来更换 JAR 或数据库结构配置。

9. 常见故障

现象先检查
插件未启用Java 21、服务端 1.21.x、日志中第一条配置/数据库错误、首次依赖下载网络
百万生命只有 1024spigot.yml 的 maxHealth 上限和 Leaf/Purpur attribute clamp,修改后是否完整重启
MythicMobs 写 100000 却被一击击杀日志是否出现 MythicMobs 5.x maximum-health integration is active;确认使用 5.x、服务端 maxHealth 上限已放宽,并在修改配置后重新生成怪物
sealDamage/sealHeal 不识别确认 MythicMobs 为 5.x、SealAttributes 启动日志显示 skill adapter 已启用,并检查机制名和参数拼写
Mythic 技能重复扣血或治疗同一次命中是否同时保留了 damage+sealDamageheal+sealHeal
玩家无法登录数据库 availability、预加载超时、MySQL 权限/TLS/认证设置;插件会 fail-closed
/sa reload 失败返回的文件、字段、实际值和期望范围;旧配置仍在运行,无需紧急回滚
装备没属性先用 /sa doctor 检查六槽读取是否关闭;开启时再检查 STRUCTURED/LORE、槽位和 Lore 规则,关闭时检查 SealItems 等装备插件是否通过 API 提交来源
PAPI 不替换PlaceholderAPI 是否启用、玩家是否在线、日志是否注册 expansion、属性 ID 是否正确
没有全息DecentHolograms 是否启用、display.yml 总开关/容量/观察者、客户端是否在可见范围
停服有 unfinished/dirty保存日志、数据库可用性和 shutdown timeout;在再次开放前恢复并验证数据