Skip to content

品质 / Tier 与显示排版

所属:服主指南 · 相关:词缀 · 随机生成

本章讲两件互相关联的事:品质(Tier) 怎么定义,以及最终物品 Lore 怎么排版


第一部分:品质 / Tier

配置文件:plugins/QinhItems/item_tiers.yml

1. Tier 是什么

Tier 是物品的稀有度等级(普通 / 稀有 / 史诗 / 传说…),它控制:

  1. 显示:在 Lore 顶部显示带颜色的品质名。
  2. 光效:可选的物品发光提示。
  3. 随机生成参数:被随机抽中的权重(chance)、能容纳多少词缀的容量(capacity)。

物品通过 tier: EPIC大写)引用一个 Tier。

2. item_tiers.yml 结构

yaml
tiers:
  TRASH:
    name: '<gray>废品</gray>'              # 显示名(MiniMessage)
    generation:
      chance: 0.05                         # 随机生成时被抽中的权重

  COMMON:
    name: '<gray>普通</gray>'
    generation:
      chance: 0.30
      capacity:                            # 词缀容量参数
        base: 2                            # 基础槽位
        scale: 0.25                        # 缩放变量(×随机[0,1))
        spread: 0.1                        # 额外变量
        max-spread: 0.25                   # 高端额外变量

  LEGENDARY:
    name: '<gold><bold>传说</bold></gold>'
    item-glow:                             # 发光提示
      hint: false
      color: GOLD                          # Bukkit DyeColor
    generation:
      chance: 0.08
      capacity:
        base: 10
        scale: 1.2
        spread: 0.12
        max-spread: 0.35

  EPIC:
    name: '<light_purple><bold>史诗</bold></light_purple>'
    unidentification:                      # 未鉴定显示
      name: '史诗'
      prefix: '<light_purple>'
    generation:
      chance: 0.06
      capacity:
        base: 12
        scale: 1.5
        spread: 0.15
        max-spread: 0.4

3. Tier 字段表

类型含义
nameString(必填)带颜色的显示名(MiniMessage)
unidentification.nameString未鉴定时的纯文本名(默认从 name 去色得到)
unidentification.prefixString未鉴定前缀
item-glow.hintBoolean是否显示发光提示
item-glow.colorStringBukkit DyeColor 名(如 GOLD
generation.chanceDouble该 Tier 被随机抽中的权重(0–1,但其实是相对权重)
generation.capacity.baseDouble词缀容量基础值(保底槽位)
generation.capacity.scaleDouble缩放项(结果 += scale × 随机[0,1))
generation.capacity.spreadDouble散布项(同上叠加)
generation.capacity.max-spreadDouble高端散布项(也写 max_spread

容量怎么算成槽位数?随机生成 → 容量计算。公式:base + scale×rand + spread×rand + maxSpread×rand,向下取整、不小于 0。

4. 品质解析顺序

物品显示时,QI 用 ItemTierRegistry.resolve() 决定用哪个 Tier,顺序:

  1. definition.tier(YAML 里写的 tier:
  2. 变量 values["tier"]
  3. 变量 values["quality"](按 plainName 或 id 匹配,大小写不敏感)

Tier 查找本身大小写不敏感(内部转小写),但 YAML 里建议大写以保持一致。

🖼️ [图片占位] 不同品质物品名的颜色对比图(废品/普通/稀有/史诗/传说) · 建议 assets/tier-colors.png


第二部分:Lore 显示排版

QI 用 StructuredLoreBuilder 把物品 Lore 按固定顺序自动拼装。理解这个顺序,你就知道每段内容从哪来、怎么调。

5. Lore 段顺序(从上到下)

#来源格式示例
1品质名ItemTierRegistry.resolve()<gold><bold>传说</bold></gold>
2物品类型类型 display物品类型:武器
3属性行providers.ap 解析攻击伤害: 22暴击几率: +12%
4分隔线自动────────────────(当上有属性、下有内容时插入)
5段 LoreSection 渲染词缀池产出的行
6宝石状态gem-state▪ 已镶嵌 xxx
7动作 Lore技能描述▸ 雷霆斩
8宝石空孔gem-sockets[ + ] 空孔
9套装 LoreSet 渲染套装件数 / 加成
10描述 / 风味lore: 字段你写的描述行
11需求options.restrictions✔ 需求: 等级 20 / ✘ 需求: …
12灵魂绑定实例数据xxx 的物品,见 灵魂绑定
13耐久可损耗且非无限耐久耐久度: 980 / 1000

注意:你在 lore: 字段里写的内容落在第 10 段(描述 / 风味),品质、属性、套装等是自动生成插在它前面的,不用你手写。

6. 属性显示标签

属性行的标签来自 ApDisplayLabels。内置中文标签:

标签标签
attack_damage攻击伤害armor护甲
attack_speed攻击速度armor_toughness护甲韧性
crit_rate暴击几率movement_speed移动速度
crit_damage暴伤增幅knockback_resistance击退抗性
max_health生命上限lifesteal生命偷取
damage_reduction伤害减免skill_damage技能伤害
pvp_damagePVP 伤害pve_damagePVE 伤害

未列入的键会回退成「下划线转空格、首字母大写」。数值若是 0–1 的比率(如 crit_rate)会显示成百分比 +12%

7. 名称的前后缀与星级

物品名(display_name)在渲染时:

  1. 先做变量替换({变量})。
  2. 再叠加 / 词缀产出的前缀 / 后缀
  3. 若类型支持星级且 values["star"] > 0,名尾追加 [+N]

支持星级后缀的类型:weapon / armor / projectile / shield / gem

8. 文本格式:MiniMessage

所有名称 / Lore 支持 MiniMessage<gold><gradient:#A:#B><bold> 等)。也兼容传统 & / § 颜色码(会被 DisplayText.normalizeToMini 转换)。

yaml
display_name: "<gradient:#9141AC:#C41E3A>史诗之刃</gradient>"
lore:
  - "<gray>普通灰色文字</gray>"
  - "&e传统黄色(也支持)"

下一步