Skip to content

随机物品生成

所属:服主指南 · 相关:品质与显示 · · 词缀

QI 能像 MMOItems 一样随机生成装备:按品质权重抽 Tier → 按容量算词缀槽位 → 从词缀池抽词缀 → 拼成物品。命令入口 /qi generate


1. 命令用法

命令说明
/qi generate [tier] [type] [amount]随机生成物品并放进背包
/qi generate preview [tier] [type]只预览生成结果,不真正造
/qi generate pools列出可用词缀池

参数都可省略(不填则随机 Tier、默认池)。见 命令


2. 生成流程

1. 抽 Tier        ItemTierRarityRoller —— 按各 tier 的 generation.chance 加权随机
2. 算容量         TierCapacityCalculator —— 由 tier 的 capacity 参数算出槽位数
3. 分配容量       AffixRoller.distributeCapacity —— 容量均分到各词缀池
4. 抽词缀         AffixRoller.rollFromPool —— 每个池按容量抽词缀
5. 合并           前缀取第一个、后缀取第一个、Lore 全合并
6. 造物品         生成 amount 件,写入种子 / tier / 品质 / 模板标签
7. 发放           若指定玩家则进背包,溢出自然掉落

3. 容量计算

容量参数来自 Tier 的 generation.capacity(见 品质):

容量 = base + (scale × rand) + (spread × rand) + (maxSpread × rand)
     (各 rand 是独立的 [0,1) 随机;结果向下取整,不小于 0)

例:

COMMON   { base:2, scale:3 }                 → 2 + rand(0~3)            = [2,4]
LEGENDARY{ base:10, scale:5, spread:3, maxSpread:2 } → 10 + 各项随机    = [10,20]

4. Tier 加权抽取

候选 = 所有 generation.chance > 0 的 tier
total = 各 chance 之和
r = random × total
逐个减去 chance,r < 0 时命中该 tier

例:COMMON=50、UNCOMMON=30、RARE=15、EPIC=4、LEGENDARY=1,r=45 → 命中 EPIC。


5. 词缀池抽取

每个池(一个)按其类型抽取:

段类型抽法
weight_join / affix_pool加权不放回,抽 amount
quality_pool按当前 tier 找子池,再当 weight_join
其它当单条目池,取其 prefix/suffix/lore

词缀池默认是 affix_pool,可用 /qi generate pools 查看全部。

品质池的两级路由

yaml
quality_pool_damage:
  type: quality_pool
  common: "pool_damage_common"     # tier=COMMON → 用这个子池
  rare: "pool_damage_rare"

pool_damage_rare:
  type: weight_join
  values:
    - "3::+8 伤害"
    - "5::+10 伤害"

生成 RARE 物品时,quality_pool_damage 找到 rarepool_damage_rare → 从中加权抽。


6. 开发者 API

kotlin
RandomItemGenerator.generate(random, Options(
    tierId = "LEGENDARY",            // 强制 tier(不填则随机)
    itemType = "sword",              // 强制类型
    templateId = "legendary_sword",  // 用模板物品
    poolIds = listOf("affix_pool"),  // 词缀池
    amount = 3,                      // 数量
    giveTo = player,                 // 直接发放(溢出掉落)
)): GenerationResult

RandomItemGenerator.preview(random, options): String   // 文本预览

返回:

kotlin
data class GenerationResult(
    val items: List<ItemStack>,
    val tier: ItemTier?,
    val affixResults: List<AffixRoller.AffixResult>,
    val summary: String,             // 人类可读摘要
)

7. 物品刷新服务

随机生成相关的一个配套能力:当你改了套装 / Tier / 模板配置后,让玩家身上已有的物品重新渲染。QinhItemRefreshService

kotlin
QinhItemRefreshService.refreshOnlinePlayers(): RefreshReport
QinhItemRefreshService.refreshPlayer(player): RefreshReport
QinhItemRefreshService.refreshEquipment(player): RefreshReport
QinhItemRefreshService.refreshItems(items): RefreshReport

对应命令 /qi refresh(及 all / inventory / armor / equipment / hand),见 命令。刷新 = 对每件 QI 物品调 assembly().rebuild() + variables().refresh(),保留实例 / 种子、只更新显示。


下一步