Skip to content

配置说明

LyLotteryReload 的主要配置由全局配置、宝箱配置和奖池配置组成。玩家数据与方块绑定数据由插件自动生成,不建议手动修改。

文件结构

文件 / 目录用途是否建议手动编辑
config.yml数据存储、消息、点击冷却、默认示例、音效和抽奖界面按钮
chest/*.yml宝箱标题、打开方式、抽奖条件、普通与稀有奖池、低保和累计奖励
reward/*.yml奖池内的奖励、权重、动态权重、物品、指令和消息
chestblock.yml保存通过指令绑定的宝箱方块坐标
data/<玩家 UUID>.yml未启用 MySQL 时保存玩家抽奖数据

玩家数据包含以下内容:

  • 每个宝箱的累计抽奖次数。
  • 每个宝箱触发稀有奖池的次数。
  • 每个奖池中各奖励的抽中次数。
  • 已领取的累计抽奖奖励。
  • 各宝箱保留的抽奖记录。

config.yml

MySQL 存储

yaml
mysql:
  enable: false
  databasename: mc2
  username: mc2
  password: mc1234
  port: 3306
  ip: 127.0.0.1
配置项类型说明
mysql.enable布尔值是否使用 MySQL 保存玩家数据。切换后需要重启服务器
mysql.databasename字符串数据库名称
mysql.username字符串数据库用户名
mysql.password字符串数据库密码
mysql.port整数数据库端口
mysql.ip字符串数据库地址

MySQL 前置要求

启用 mysql.enable 后,必须安装 LyMySQLCore,并确认其已成功连接数据库。LyMySQLCore 未加载或数据库连接失败时,MySQL 玩家数据的读取、保存、同步及相关记录不会正常生效。

启用后,插件会创建以插件名称命名的数据表,并以玩家名称查找数据。玩家的全部抽奖数据会序列化到表中的 data 字段。

关闭 MySQL 时,玩家数据保存在:

text
plugins/LyLotteryReload/data/<玩家 UUID>.yml

条件物品分隔符

yaml
condition-item-key: '#'

condition-item-key 用于分隔条件物品名称与数量,默认格式为:

text
item:{物品名称#数量}

如果物品名称本身需要使用 #,可将该配置改为其他字符,并同步修改所有宝箱中的物品条件。

该分隔符也用于解析 cxlyshop 条件中的标识与数量。

龙核兼容

yaml
dragoncore-enable: true

开启后,如果服务器已安装并启用 DragonCore,抽奖结果会发送到龙核槽位:

抽奖方式槽位
单抽lycj_reward_0
十连抽lycj_reward_0lycj_reward_9

发送完成后,插件会调用龙核界面 抽奖界面 中对应的单抽或十连方法。未安装 DragonCore 时,该配置不会影响普通箱子界面的抽奖功能。

自动保存

yaml
auto-save-interval: 3
配置项类型单位说明
auto-save-interval整数玩家数据自动保存间隔,用于降低异常停服造成的数据丢失风险

插件重载时会停止并重新启动自动保存任务。

点击冷却

yaml
click-cooldown: 300
配置项类型单位说明
click-cooldown整数毫秒玩家点击单抽或十连按钮后的操作冷却

单抽与十连共用同一个界面点击冷却。冷却期间再次点击会发送 message.click-cooldown

消息

yaml
message:
  reward-group-empty: '&c奖池已空, 无法继续抽取!'
  lottery-count-max: '&c已达该宝箱抽取次数上限, 无法继续抽取!'
  empty-slot-shortage: '&c背包空间不足 &6{amount}&7 格!'
  not-lottery-condition: '&c不满足抽奖条件.'
  rare-lottery: '&e恭喜你, 本次抽奖触发了稀有奖池!'
  normal-lottery: '&a第 &6{amount} &a次抽奖成功!'
  claimed-reward-success: '&a领取累计奖励成功!'
  claimed-reward-fail: '&c领取累计奖励失败! 未达到领取该奖励的要求!'
  claimed-reward-repeat: '&c无法重复领取!'
  click-cooldown: '&7对不起, 操作过快, 请稍后尝试.'
配置项触发场景可用占位符
message.reward-group-empty当前奖池没有最终权重大于 0 且仍可抽取的奖励
message.lottery-count-max找不到下一次抽奖对应的 condition 配置
message.empty-slot-shortage抽奖时背包已满,或领取累计奖励时空位不足{amount}
message.not-lottery-condition任意抽奖条件未通过
message.rare-lottery本次抽奖进入稀有奖池
message.normal-lottery本次抽奖进入普通奖池{amount}
message.claimed-reward-success累计奖励领取成功
message.claimed-reward-fail未达到累计奖励要求
message.claimed-reward-repeat重复领取同一档累计奖励
message.click-cooldown界面按钮仍处于点击冷却

message.normal-lottery 中的 {amount} 表示本次完成后的宝箱累计抽奖次数。

抽奖记录格式

yaml
lottery-log-format: '&7[{time}] &f{name}x{amount}'
占位符说明
{time}记录时间,格式为 MM-dd HH:mm
{name}奖励展示物品的名称;没有自定义名称时使用 Bukkit 材质名
{amount}奖励配置的物品数量

格式化后的记录供 PlaceholderAPI 变量 %lycj_log_宝箱ID% 使用。是否记录以及保留多少条记录由宝箱配置中的 lottery-log-amount 控制。

累计奖励状态

yaml
reward-status-shortage: '&7不满足要求'
reward-status-clickable: '&a<可领取>'
reward-status-clicked: '&7<已领取>'
配置项状态
reward-status-shortage当前抽奖次数未达到要求
reward-status-clickable已达到要求且尚未领取
reward-status-clicked已领取该档奖励

状态文本会替换累计奖励名称和 Lore 中的 {status}

默认示例配置

yaml
load-default-config: true

插件重载时会尝试释放以下内置文件,但不会覆盖已经存在的同名文件:

text
chest/示例宝箱.yml
chest/无稀有的示例宝箱.yml
reward/示例奖池.yml

load-default-configfalse 时,当前代码只会跳过加载文件名完全匹配的以下文件:

text
chest/示例宝箱.yml
reward/示例奖池.yml

chest/无稀有的示例宝箱.yml 不在过滤名单中,仍会参与加载。如不需要该宝箱,应自行移走、改名或删除对应文件。

全局中奖消息

yaml
global-player-message:
  - '&a恭喜你中奖了!'

奖品未配置 player-message,或该列表为空时,插件会向中奖玩家发送全局消息。奖品配置了非空的 player-message 后,只发送奖品自己的玩家消息。

消息会经过 PlaceholderAPI 解析,因此可使用服务器中已注册的 PlaceholderAPI 变量。

稀有奖励音效

yaml
rare-reward-sound: 'ENTITY_PLAYER_LEVELUP'

抽奖进入稀有奖池时,插件会尝试按 Bukkit Sound 枚举名称播放音效。留空字符串可关闭音效。

音效名称必须与当前服务端版本匹配。名称无效时不会播放,并会在控制台输出音效配置错误。

抽奖界面

当前箱子界面固定为 54 格:

区域槽位用途
奖励预览035每页最多显示 36 个奖励,稀有奖池排在普通奖池前面
底栏3644填充物品、翻页、单抽和十连按钮
累计奖励4553最多显示前 9 档累计奖励
yaml
gui:
  title: '&5抽奖界面'
  fill-item: '160:0'
  fill-name: '&7封锁'

  once-lottery-button-item: '399:0'
  once-lottery-button-name: '&a单次抽奖'
  once-lottery-button-lore:
    - ''
    - '&7该奖池已抽 &6{lottery_count} &7次'
    - '&7已抽中稀有奖励 &6{rare_count} &7次'
    - ''
    - '&7本次抽奖需要:'
    - '{need_condition}'

  ten-times-lottery-button-item: '399:0'
  ten-times-lottery-button-amount: 10
  ten-times-lottery-button-name: '&a十连抽奖'
  ten-times-lottery-button-lore:
    - ''
    - '&7该奖池已抽 &6{lottery_count} &7次'
    - '&7已抽中稀有奖励 &6{rare_count} &7次'
    - ''
    - '&7本次抽奖需要:'
    - '{need_condition}'
    - ''
    - '&c注意! 只是尝试连续进行10次抽奖.'
    - '&c如果不满足抽奖条件会停止连抽.'

  last-item: '341:0'
  last-name: '&6上一页'
  next-item: '341:0'
  next-name: '&6下一页'
配置项说明
gui.title配置文件中保留的界面标题键;当前代码实际使用宝箱文件中的 title 创建界面
gui.fill-item底栏填充物品,格式为 Bukkit 物品 ID 与子 ID
gui.fill-name底栏填充物品名称
gui.once-lottery-button-item单抽按钮物品
gui.once-lottery-button-name单抽按钮名称
gui.once-lottery-button-lore单抽按钮 Lore
gui.ten-times-lottery-button-item十连按钮物品
gui.ten-times-lottery-button-amount十连按钮显示的物品堆叠数量,不会改变固定的十连次数
gui.ten-times-lottery-button-name十连按钮名称
gui.ten-times-lottery-button-lore十连按钮 Lore
gui.last-item上一页按钮物品
gui.last-name上一页按钮名称
gui.next-item下一页按钮物品
gui.next-name下一页按钮名称

按钮 Lore 支持以下占位符:

占位符说明
{lottery_count}当前宝箱已完成的抽奖次数
{rare_count}当前宝箱已进入稀有奖池的次数
{need_condition}插入下一次抽奖条件中 `

当下一次抽奖没有对应的 condition 时,按钮需求区域会显示“抽奖次数已达上限”。

十连抽固定最多尝试执行 10 次。任意一次抽奖失败后会立即停止,已经成功完成的抽奖不会回退。

chest/*.yml

每个文件定义一个独立宝箱。文件名不作为宝箱 ID,实际引用值由文件中的 id 决定。

基础配置

yaml
id: '示例宝箱'
title: '&6示例宝箱'

match-item-name:
  - '&6示例宝箱'
  - '&6这是第二个示例宝箱'

normal-reward: '示例奖池'
rare-reward: '示例奖池'
配置项是否必需说明
id宝箱唯一 ID,用于指令、变量、数据保存和奖池统计
title宝箱界面标题,支持 & 颜色代码
match-item-name玩家手持显示名称完全匹配的物品右键时打开该宝箱
normal-reward普通抽奖使用的奖池 ID,必须对应已加载的 reward/*.yml
rare-reward稀有抽奖使用的奖池 ID;删除、留空或填写无效 ID 时停用稀有奖池

match-item-name 按物品显示名称完全匹配,包含颜色代码转换后的结果。它不检查物品材质、Lore 或 NBT。

奖励预览会先显示稀有奖池奖励,再显示普通奖池奖励。如果普通和稀有奖池指向同一个奖池,界面会分别追加两次该奖池的预览内容。

抽奖条件

yaml
condition:
  1-120:
    - 'item:{物品名#1}|&7需要扣除 {item}x{amount}'
    - 'papi:{%player_level% >= 0}|&7需要等级大于0'
    - 'permission:{vip.1}|&7需要vip.1权限'
    - 'nopermission:{vip.1}|&7需要没有vip.1权限'
    - 'eco:{1}|&7需要扣除 {amount}金币'
    - 'point:{1}|&7需要扣除 {amount}点券'

condition 的子键表示该组条件适用的抽奖次数。支持单次和闭区间:

yaml
condition:
  1:
    - 'item:{新手抽奖券#1}|&7需要新手抽奖券x{amount}'
  2-10:
    - 'item:{普通抽奖券#1}|&7需要普通抽奖券x{amount}'

插件按照“本次抽奖完成后的次数”查找条件。玩家已经抽取 0 次时,会读取键 1;已经抽取 9 次时,会读取键 10

没有任何键匹配下一次抽奖次数时,玩家将无法继续抽奖,并收到 message.lottery-count-max

每条条件格式为:

text
条件|界面显示文本

| 左侧用于实际判断和扣除,右侧用于替换界面按钮 Lore 中的 {need_condition}。抽奖前会先检查全部条件;确定奖池中存在可抽奖励后,才会处理需要扣除的条件。

条件格式作用相关插件
物品item:{物品名称#数量}检查并扣除指定显示名称的物品
PAPI 判断papi:{表达式}解析变量后判断表达式PlaceholderAPI
拥有权限permission:{权限节点}要求玩家拥有权限
不拥有权限nopermission:{权限节点}要求玩家不拥有权限
金币eco:{数量}检查并扣除 Vault 经济余额Vault 及经济插件
点券point:{数量}检查并扣除 PlayerPoints 点券PlayerPoints
离渊商店货币lyshop:{货币ID#数量}检查并扣除对应货币对应物品或货币插件
CX 变量cx:{变量ID#数量}检查并扣除对应变量数量对应变量插件

示例配置说明,条件中的数值部分可使用一对尖括号包裹运算公式,例如:

text
item:{抽奖券#<1+1>}

仅在服务器具备对应插件和变量环境时使用相关条件。缺少经济、点券或变量插件时,不应配置对应条件。

条件显示文本常用占位符:

占位符说明
{item}item 条件中的物品名称
{amount}物品、金币、点券或其他货币条件中的数量

抽奖记录

yaml
lottery-log-amount: 0
说明
0不保留该宝箱的抽奖记录
大于 0最多保留指定条数,最新记录排在第一行

抽奖记录会增加玩家数据读写量。不需要通过 %lycj_log_宝箱ID% 展示记录时,建议保持为 0

稀有奖池

yaml
rare-reward: '示例奖池'
trigger-rare-chance: 0.01
max-trigger-rare-reward-count: 3

lowest-rare-count:
  1: '60'
  2: '100'
  3: '120'
  4-10: '50*{count}'
配置项默认值说明
rare-reward稀有奖池 ID;无有效奖池时全部稀有机制停用
trigger-rare-chance0每次抽奖随机进入稀有奖池的概率,0.01 表示 1%
max-trigger-rare-reward-count-1每名玩家在该宝箱最多进入稀有奖池的次数,-1 表示不限制
lowest-rare-count按下一次稀有触发序号配置累计抽奖低保

稀有奖池判断顺序如下:

  1. 宝箱必须存在有效的 rare-reward
  2. 当前稀有触发次数必须未达到 max-trigger-rare-reward-count
  3. 先检查 lowest-rare-count 低保。
  4. 未达到低保时,再按 trigger-rare-chance 随机判断。

lowest-rare-count 的键表示“下一次将触发的稀有次数”,值表示玩家至少需要达到的宝箱累计抽奖次数。键支持单次与范围。

值支持 PlaceholderAPI、四则运算和 {count}

内容说明
{count}本次准备触发的稀有次数,从 1 开始
PlaceholderAPI 变量先按当前玩家解析,再参与计算
50*{count}410 次稀有触发所需的累计抽奖次数公式

无论通过低保还是随机概率进入稀有奖池,都会增加该宝箱的稀有触发次数。触发稀有奖池不会清空累计抽奖次数。

如不需要稀有奖池,可删除 rare-reward、填写空值或不配置有效奖池,同时省略其他稀有配置。

累计抽奖奖励

yaml
accumulated-count-of-rewards:
  10:
    item: 'CHEST:0'
    name: '&6累计抽奖{now_count}/10次礼包'
    lore:
      - ''
      - '{status}'
    slot: 1
    give-item:
      - 'MM4@累计10次礼包#1'
    commands:
      - '[console]tell %player_name% 你领取了累计10次礼包'

accumulated-count-of-rewards 的子键是领取所需的宝箱累计抽奖次数。奖励会按次数从小到大排序,界面最多显示前 9 档。

配置项默认值说明
item界面中显示的 Bukkit 物品,格式为 材质:子ID
name显示名称,支持颜色代码和累计奖励占位符
lore空列表显示 Lore,支持颜色代码和累计奖励占位符
slot0领取前要求的背包空位数量
give-item空列表领取时给予的插件物品列表
commands空列表领取成功后执行的指令列表

名称和 Lore 支持:

占位符说明
{need_count}该档奖励要求的抽奖次数
{now_count}玩家当前宝箱累计抽奖次数
{status}config.yml 中配置的累计奖励状态文本

give-item 格式为:

text
插件标识@物品ID#数量

默认示例列出的物品来源标识包括:

标识示例配置对应来源
MM4MythicMobs 4
MM5MythicMobs 5
NINeigeItems
SISX-Item

领取时,如果物品格式错误或对应物品不存在,该物品会被跳过并在控制台输出错误,其他有效物品与指令仍会继续处理。

commands 支持插件统一指令前缀,例如:

yaml
commands:
  - '[console]tell %player_name% 已领取累计奖励'
  - '[op]say 已领取奖励'

同一玩家对同一宝箱的同一档累计奖励只能领取一次。领取状态会保存到玩家数据中。

reward/*.yml

每个奖池文件包含一个奖池 ID 和多个奖励。奖励顺序按照 YAML 中的配置顺序用于界面预览。

奖池结构

yaml
id: '示例奖池'

reward:
  '奖励1':
    show-item: 'MM4#测试'
    give-item: ''
    extra-lore:
      - '{物品信息}'
      - ''
      - '&7该奖品已抽中 &6{now_count}/{max_count} &7次'
    amount: 1
    weight: 100
    condition: []
    command:
      - '[console]bc 恭喜%player_name%抽中了测试奖品'
    server-message:
      - '&f[抽奖] &a恭喜%player_name%抽中了测试奖品'
    player-message:
      - '&a恭喜你抽中了测试奖品'
    max-count: 1
配置项默认值说明
id奖池唯一 ID,供宝箱的 normal-rewardrare-reward 引用
reward奖励配置节点,每个子键为奖励 ID
show-item空字符串奖励预览和抽奖结果使用的插件物品
give-item空字符串实际给予玩家的插件物品;留空时不给物品
extra-lore空列表替换展示物品 Lore 的内容
amount1展示和给予的物品数量
weight1奖励基础权重
condition空列表满足条件时修改当前奖励权重
command空列表抽中奖励时执行的指令
server-message空列表抽中奖励时发送给所有在线玩家的消息
player-message空列表抽中奖励时发送给中奖玩家的消息
max-count-1每名玩家最多抽中该奖励的次数,-1 表示不限制

id、奖励 ID、宝箱 ID 会参与玩家数据路径或内部统计标识,不应随意修改已经投入使用的 ID,否则原有统计不会自动迁移到新 ID。

展示物品与给予物品

show-itemgive-item 使用以下格式:

text
插件标识#物品ID

默认奖池示例确认的展示物品来源标识包括:

标识示例配置对应来源
MM4MythicMobs 4
MM5MythicMobs 5
NINeigeItems
SISX-Item
SX2SX-Item 2

show-item 必须包含 #,并且必须能取得有效物品,否则该奖励会从界面预览中跳过。抽奖记录仍会在无法取得展示物品时使用原始 show-item 字符串作为奖励名称。

give-item 留空时,奖励仍可执行指令和发送消息,但不会向玩家背包加入物品。

抽奖前会检查玩家背包是否至少存在一个空位,即使中奖项只执行指令或 give-item 为空,也需要一个空位才能开始抽奖。

额外 Lore

yaml
extra-lore:
  - '{物品信息}'
  - ''
  - '&7该奖品已抽中 &6{now_count}/{max_count} &7次'
占位符说明
{物品信息}插入展示物品原有 Lore;原物品没有 Lore 时插入一个空行
{now_count}当前玩家在该奖池中抽中该奖励的次数
{max_count}该奖励的 max-count;配置为 -1 时显示“无限”

配置 extra-lore 后,最终展示 Lore 由该列表重新生成。需要保留物品原 Lore 时必须加入 {物品信息}

界面展示的物品堆叠数量最高为 64。实际给予物品时使用配置的 amount

基础权重

yaml
weight: 100

奖励概率按当前奖池内所有可用奖励的最终权重计算:

text
单项概率 = 该奖励最终权重 / 全部可用奖励最终权重之和

最终权重小于或等于 0 的奖励不会参与本次抽取。达到 max-count 的奖励同样不会参与抽取,也不会继续显示在预览界面中。

当奖池中没有任何可抽奖励时,会发送 message.reward-group-empty。本次抽奖不会扣除条件,但代码已在奖池检查前增加宝箱累计抽奖次数,因此配置奖池时应避免出现全部奖励同时失效的情况。

动态权重条件

yaml
condition:
  - 'papi:{%player_level% >= 0}|{weight}+10|200'
  - 'nopermission:{lcj.示例奖池.奖励1}|{weight}*2'
  - 'permission:{lcj.示例奖池.奖励1}|0'
  - 'papi:{%player_level% >= 0}|{weight}+{count}*0.01'

每条动态权重配置格式为:

text
条件|新权重公式|本次计算上限

第三段上限可省略。插件按照列表从上到下处理,每条条件独立判断,满足后使用当前权重计算新值。

内容说明
{weight}处理当前条件前的权重
{count}本次抽奖开始前,该宝箱已经完成的抽奖次数
PlaceholderAPI 变量在权重公式计算前按当前玩家解析
第三段整数当前这一步计算允许得到的最大权重

动态权重条件支持项目中通用的条件判断形式,包括 papipermissionnopermission。最终计算结果会转换为整数,小数部分不会作为权重保留。

抽中奖励后的操作

yaml
command:
  - '[console]bc 恭喜%player_name%抽中了测试奖品'

server-message:
  - '&f[抽奖] &a恭喜%player_name%抽中了测试奖品'

player-message:
  - '&a恭喜你抽中了测试奖品'
配置项处理方式
command抽中奖励后执行,支持 [console][op] 前缀
server-message经过 PlaceholderAPI 解析后发送给所有在线玩家
player-message经过 PlaceholderAPI 解析后发送给中奖玩家

player-message 不存在或为空列表时,插件改用 config.yml 中的 global-player-message

最大抽中次数

yaml
max-count: 1

max-count 按“玩家、奖池 ID、奖励 ID”分别记录。

说明
-1不限制抽中次数
0奖励无法参与抽取
大于 0玩家达到该次数后,奖励不再参与抽取或预览

多个宝箱引用同一个奖池时,会共用该奖池内各奖励的抽中次数统计。管理员清空某个宝箱数据时,也会清理该宝箱普通奖池和稀有奖池对应的奖励统计;如果这些奖池同时被其他宝箱引用,相关共享统计也会受到影响。

chestblock.yml

该文件由方块绑定功能自动维护,记录宝箱 ID、世界和方块坐标:

yaml
world_100_64_100:
  chest: '示例宝箱'
  world: 'world'
  x: 100
  y: 64
  z: 100

顶层键由世界名和坐标组合生成。玩家右键已绑定方块时,会打开对应宝箱界面。

绑定数据在插件启动时读取,在添加绑定、删除绑定和插件关闭时保存。不要在服务器运行期间手动修改该文件,否则内存中的绑定数据可能再次覆盖文件。

数据文件

未启用 MySQL 时,每名玩家的数据保存在独立 YAML 文件中:

yaml
lottery-count:
  示例宝箱: 10

rare-lottery:
  示例宝箱: 1

number-of-lottery:
  示例奖池:
    奖励1: 1

accumulated-count-of-reward:
  示例宝箱:
    - 10

lottery-log:
  示例宝箱:
    - '§7[07-19 12:30] §f测试物品x1'
数据节点说明
lottery-count玩家在各宝箱中的累计抽奖次数
rare-lottery玩家在各宝箱中进入稀有奖池的次数
number-of-lottery玩家在各奖池中抽中各奖励的次数
accumulated-count-of-reward玩家已领取的累计奖励档位
lottery-log各宝箱保留的中奖记录

这些文件由插件在玩家加入、退出、被踢、自动保存和插件关闭时管理,不应作为日常配置文件编辑。