AdventureLottery
一、简介
AdventureLottery —— 一款高级抽奖系统插件,为 Minecraft 服务器提供类似原神/崩铁的抽卡体验。
支持 5 种动画类型、3 层保底机制、标准/积分双奖池模式、连抽、暂存箱、方块宝箱绑定、兑换商店等丰富功能。所有文本完全可配置,支持多语言。
AdventureLottery 支持 Paper 1.21.4+ 服务器(Java 21),并且会第一时间支持未来版本。
核心特性
- 5 种动画 — 转盘 (WHEEL)、跑马灯 (MARQUEE)、CS:GO 开箱 (CSGO)、翻牌 (CARD_FLIP)、直接展示 (DIRECT)
- 双奖池模式 — 标准奖池 (消耗钥匙抽奖) + 积分奖池 (收集♦积分兑换)
- 3 层保底 — 小保底 / 大保底 / 天花板保底,确保玩家不会永远不出货
- 连抽系统 — 支持 1/5/10 连抽,加速动画播放
- 暂存箱 — 奖品安全暂存,支持领取和分解
- 方块宝箱 — 将任意方块设置为抽奖入口,自带全息文字和粒子特效
- 兑换商店 — 支持 Vault/Points/物品 兑换钥匙
- 重复处理 — 允许 / 移除 / 自动转换补偿
- 前置解锁 — 奖品之间可设置 DAG 解锁链
- 3 种消耗模式 — 固定 / 递增 / 指数递增
- 播报系统 — 聊天/ActionBar/BossBar/音效/烟花 全方位播报
- 跳过动画 — 关闭 GUI 可跳过动画,奖品自动邮件/暂存发放
- 数据持久化 — SQLite / MySQL 双驱动,HikariCP 连接池
- PlaceholderAPI — 5 个 PAPI 变量,方便计分板/菜单集成
二、插件前置说明
- Vault — 经济插件 (可选,使用银币消费时需要)
- PlayerPoints — 点券插件 (可选,使用点券消费时需要)
- PlaceholderAPI — PAPI 变量支持 (可选)
- AdventureMail — 邮件系统 (可选,奖品邮件发放时需要)
安装与目录
环境要求
| 项目 | 要求 |
|---|---|
| 服务端 | Paper 1.21.4+ |
| Java | 21+ |
| 可选依赖 | Vault、PlayerPoints、PlaceholderAPI、AdventureMail |
安装步骤
- 将
AdventureLottery-1.0.0.jar放入plugins/目录 - 按需安装 Vault / PlayerPoints / AdventureMail
- 启动服务器,自动生成配置文件和示例奖池
- 编辑配置文件和奖池定义
- 执行
/al admin reload热加载
目录结构
plugins/AdventureLottery/
├── config.yml # 主配置 (数据库/备份/暂存箱/音效)
├── messages.yml # 全部消息文本
├── exchange.yml # 兑换商店配置
├── chests.yml # 方块宝箱数据 (自动生成)
├── pools/
│ ├── demo_standard/ # 标准奖池示例
│ │ ├── pool.yml # 奖池定义
│ │ └── prizes.yml # 奖品列表
│ └── demo_scoring/ # 积分奖池示例
│ ├── pool.yml
│ └── prizes.yml
└── data.db # SQLite 数据库 (自动生成)
每个奖池是 pools/ 下的一个子文件夹,包含 pool.yml 和 prizes.yml 两个文件。你可以无限创建奖池。
奖池类型
AdventureLottery 支持两种奖池模式,满足不同玩法需求:
标准奖池 (STANDARD)
经典抽奖模式,玩家消耗 钥匙 或 货币 进行抽奖,每次随机获得一个奖品。
- 支持保底机制 (小保底 / 大保底 / 天花板)
- 支持 1/5/10 连抽
- 支持重复奖品处理 (允许 / 移除 / 转换)
- 支持前置奖品解锁链
积分奖池 (SCORING)
积分收集模式,每次抽奖获得 ♦ 积分,积满后可兑换奖励。
- 无保护抽 — 固定消耗,抽到不同奖品时积分清零
- 保护抽 — 递增消耗,抽到不同奖品仅加 1♦
- ♦ 进度条直观显示 (7 格)
- 积满后可兑换宝箱奖励 (支持左键/右键两种奖励)
- 积分奖池不支持连抽
消耗模式
| 模式 | 配置键 | 说明 |
|---|---|---|
| 固定消耗 | FIXED | 每次消耗相同数量 |
| 递增消耗 | ESCALATING | 第 N 次消耗 = N × 基础价 |
| 指数消耗 | EXPONENTIAL | 第 N 次消耗 = 2^N × 基础价 |
货币类型
| 类型 | 配置键 | 说明 |
|---|---|---|
| 虚拟钥匙 | KEY | 插件内置虚拟钥匙 (推荐) |
| 实体物品 | ITEM | 消耗背包中的指定物品 |
| Vault 银币 | VAULT | 消耗 Vault 经济余额 |
| PlayerPoints | POINTS | 消耗 PlayerPoints 点券 |
动画系统
AdventureLottery 提供 5 种抽奖动画效果,每个奖池可独立配置。
动画类型一览
| 动画 | 配置键 | GUI 大小 | 效果说明 |
|---|---|---|---|
| 🎡 转盘 | WHEEL | 54 格 (6×9) | 奖品沿边框顺时针旋转,停在顶部中央 |
| 🔄 跑马灯 | MARQUEE | 36 格 (4×9) | 奖品水平滚动,停在中间位置 |
| 🔫 CS:GO 开箱 | CSGO | 36 格 (4×9) | 类似 CS:GO 的水平滚动开箱动画 |
| 🃏 翻牌 | CARD_FLIP | 54 格 (6×9) | 点击牌位翻开,逐步揭示奖品 |
| ⚡ 直接展示 | DIRECT | 36 格 (4×9) | 无动画,直接显示结果 |
动画阶段
滚动类动画 (WHEEL/MARQUEE/CSGO) 分为 3 个阶段:
- 慢启动 — 缓慢开始滚动,营造期待感
- 快速滚动 — 高速滚动,奖品快速切换
- 减速停止 — 逐渐减速,最终停在目标奖品上
预启动特效
单抽动画开始前会播放暗幕 + 闪烁预启动效果 (约 0.7 秒),增强仪式感。
连抽加速
连抽模式下动画会自动加速,减少等待时间:
| 连抽数 | 动画加速 | 间隔延迟 |
|---|---|---|
| 1 抽 | 正常速度 | — |
| 5 连抽 | 3× 加速 | 0.25 秒 |
| 10 连抽 | 4× 加速 | 0.15 秒 |
跳过动画
在动画播放中关闭 GUI 可跳过动画。为防止误触,需要 关闭两次 才会真正跳过:
- 第一次关闭:GUI 重新打开,显示 "再次关闭将跳过动画" 提示
- 第二次关闭:动画跳过,所有奖品自动通过邮件/暂存箱发放
无论何种情况 (断线、崩溃、关闭) 跳过动画,所有已抽取的奖品都会通过邮件安全发放,绝不丢失。
保底机制
保底系统确保玩家不会无限抽取而不出好东西。AdventureLottery 支持 3 层保底,优先级从高到低:
三层保底
| 层级 | 配置键 | 说明 |
|---|---|---|
| 🏆 天花板保底 | ceiling | 累计 N 次必出指定奖品 (最终保障,仅触发一次) |
| 🥇 大保底 | big-pity | 每 N 次必出一次指定奖品 |
| 🥈 小保底 | small-pity | 每 N 次必出一次指定奖品 |
触发优先级
每次抽奖时按 天花板 → 大保底 → 小保底 → 正常随机 顺序判定。高优先级触发后跳过低优先级。
配置示例
pity:
small-pity: 5 # 每5抽触发小保底
small-pity-prizes: # 小保底候选奖品ID列表
- uncommon_sword
- uncommon_armor
big-pity: 25 # 每25抽触发大保底
big-pity-prizes:
- epic_weapon
ceiling: 100 # 累计100抽触发天花板
ceiling-prizes:
- legendary_set
设为 0 可关闭对应层级的保底。每个奖品可通过 pity-eligible 标记自己是否参与保底。
暂存箱
暂存箱是奖品的安全中转站。当发放方式设为 STASH 时,奖品先进入暂存箱,玩家随时领取。
功能
- 领取 (左键) — 将奖品发放到背包,执行奖励指令
- 分解 (右键) — 分解奖品获得补偿材料 (需奖品配置
decompose-commands)
容量限制
每个玩家的暂存箱容量可在 config.yml 中设置,默认 54 格:
stash:
max-size: 54
发放方式
| 方式 | 配置键 | 说明 |
|---|---|---|
| 暂存箱 | STASH | 奖品进入暂存箱,玩家手动领取 |
| 邮件 | MAIL | 通过 AdventureMail 发送 (需安装) |
| 直接发放 | DIRECT | 直接放入背包 (满则转邮件) |
积分奖池
积分奖池是一种特殊玩法:每次抽奖不直接给奖品,而是收集 ♦ 积分,积满后兑换大奖。
玩法流程
- 玩家选择 无保护抽 或 保护抽
- 抽奖结果为一个奖品 — 若与上次相同则 ♦+1,若不同则行为取决于抽法
- ♦ 进度条 (7 格) 实时显示收集进度
- 积满后点击对应宝箱兑换奖励
两种抽法
| 抽法 | 消耗 | 抽到相同奖品 | 抽到不同奖品 |
|---|---|---|---|
| 无保护抽 | 固定消耗 | ♦ +1 | ♦ 清零,重新开始 |
| 保护抽 | 递增消耗 (指数) | ♦ +1 | ♦ +1 (不清零) |
宝箱兑换
积分池最多可配置 7 个等级的宝箱奖励,每个宝箱支持左键/右键两种奖励:
score:
max: 7
filled-symbol: "♦"
empty-symbol: "◇"
chest-rewards:
3:
display-name: "3♦ 铜宝箱"
material: CHEST
left-name: "奖励A"
left-commands:
- "give %player% iron_ingot 16"
right-name: "奖励B"
right-commands:
- "give %player% gold_ingot 8"
方块宝箱
管理员可以将世界中的任意方块设置为抽奖入口。玩家左键/右键点击该方块即可打开对应奖池的抽奖界面。
功能特性
- 全息文字 — 方块上方自动生成浮动标题文字
- 粒子特效 — 方块周围持续播放粒子效果,吸引玩家注意
- 背包检查 — 背包空间不足时提示警告,确认后放行
- 数据持久化 — 方块位置自动保存到
chests.yml
管理指令
| 操作 | 说明 |
|---|---|
| 面对方块执行设置指令 | 将面前方块绑定到指定奖池 |
| 面对方块执行移除指令 | 解除方块的宝箱绑定 |
| 列出全部宝箱 | 显示所有已设置的方块宝箱位置 |
config.yml
主配置文件,管理数据库、备份、暂存箱、音效等全局设置。
数据库配置
database:
type: sqlite # sqlite 或 mysql
mysql:
host: localhost
port: 3306
database: adventurelottery
username: root
password: ""
table-prefix: "al_"
pool-size: 5
备份设置
backup:
enabled: true
interval-hours: 24 # 备份间隔 (小时)
keep-days: 7 # 备份保留天数
暂存箱设置
stash:
max-size: 54 # 单个玩家暂存箱容量
抽奖记录
history:
max-per-player: 100 # 每个玩家最大记录数
音效设置
sounds:
pull: "minecraft:entity.experience_orb.pickup"
pity-small: "minecraft:entity.player.levelup"
pity-big: "minecraft:ui.toast.challenge_complete"
stash-claim: "minecraft:entity.item.pickup"
stash-decompose: "minecraft:block.grindstone.use"
奖池配置 (pool.yml)
每个奖池文件夹下的 pool.yml 定义奖池的基本属性。
完整字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
id | String | 奖池唯一 ID |
display-name | String | 显示名称 (支持颜色码) |
description | List | 描述文本列表 |
type | STANDARD / SCORING | 奖池类型 |
permission | String | 使用权限 (空=无限制) |
cost | Section | 消耗配置 |
pity | Section | 保底配置 |
duplicate | Section | 重复处理 |
delivery | STASH / MAIL / DIRECT | 发放方式 |
multi-pull | Section | 连抽设置 |
animation.type | 动画类型枚举 | 动画效果 |
icon | Section | GUI 图标 |
gui-title | String | 抽奖界面标题 |
hide-probability | boolean | 是否隐藏概率显示 |
标准奖池示例
id: demo_standard
display-name: "&6标准宝箱"
description:
- "&7经典转盘抽奖"
- "&7每5抽一次小保底"
type: STANDARD
permission: ""
cost:
currency-type: KEY
currency-id: "standard"
currency-name: "标准钥匙"
base-amount: 1
cost-mode: FIXED
pity:
small-pity: 5
small-pity-prizes: [uncommon_sword, uncommon_armor]
big-pity: 25
big-pity-prizes: [epic_weapon]
ceiling: 100
ceiling-prizes: [legendary_set]
duplicate:
mode: ALLOW # ALLOW / REMOVE / CONVERT
convert-to: ""
delivery: STASH
multi-pull:
enabled: true
options: [1, 5]
animation:
type: WHEEL
gui-title: "&6✦ 标准宝箱 ✦"
重复处理模式
| 模式 | 说明 |
|---|---|
ALLOW | 允许重复获得 (默认) |
REMOVE | 已获得的奖品不再出现 |
CONVERT | 重复时自动转换为补偿 (执行 convert-to 指令) |
奖品配置 (prizes.yml)
奖品定义文件,每个奖品以唯一 ID 为键,配置展示、权重、奖励等属性。
奖品字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
display-name | String | 奖品显示名称 |
rarity | 枚举 | 稀有度: COMMON / UNCOMMON / RARE / EPIC / LEGENDARY |
weight | double | 权重 (越高越容易抽到) |
display-material | Material | GUI 中显示的材质 |
custom-model-data | int | 自定义模型数据 (0=原版) |
display-lore | List | GUI 描述文本 |
reward-commands | List | 抽到后执行的指令 (%player%) |
decompose-commands | List | 分解时执行的指令 |
decompose-description | String | 分解描述文本 |
pity-eligible | Section | 保底候选标记 (small/big/ceiling) |
prerequisites | List | 前置奖品 ID 列表 |
稀有度等级
| 等级 | 颜色 | 典型用途 |
|---|---|---|
| COMMON | 白色 | 基础材料、常见物品 |
| UNCOMMON | 绿色 | 进阶装备、小保底奖品 |
| RARE | 蓝色 | 稀有装备 |
| EPIC | 紫色 | 大保底奖品 |
| LEGENDARY | 金色 | 天花板保底奖品、终极大奖 |
奖品配置示例
common_stone:
display-name: "圆石 x32"
rarity: COMMON
weight: 40.0
display-material: COBBLESTONE
display-lore:
- "&7一堆普通的圆石"
reward-commands:
- "give %player% cobblestone 32"
decompose-commands:
- "give %player% cobblestone 8"
decompose-description: "&7分解获得: 圆石 x8"
epic_weapon:
display-name: "传说之刃"
rarity: EPIC
weight: 1.0
display-material: NETHERITE_SWORD
display-lore:
- "&5传说中的神兵利器"
reward-commands:
- "give %player% netherite_sword 1"
pity-eligible:
small: false
big: true
ceiling: false
播报配置
每个奖品可单独配置播报方式:
epic_weapon:
broadcast:
enabled: true
chat: true
actionbar: false
bossbar: true
bossbar-duration: 5
sound:
enabled: true
sound: "minecraft:ui.toast.challenge_complete"
volume: 1.0
pitch: 1.0
firework:
enabled: true
colors: [RED, GOLD]
type: BALL_LARGE
兑换商店
兑换商店允许玩家使用货币/物品兑换钥匙或其他道具。通过 /al exchange 打开。
兑换项配置
# exchange.yml
items:
standard_key_buy:
display-name: "标准钥匙 x1"
display-material: TRIPWIRE_HOOK
custom-model-data: 0
display-lore:
- "&7用于标准奖池抽奖"
cost:
currency: VAULT # KEY / ITEM / VAULT / POINTS
currency-id: ""
amount: 1000
reward-commands:
- "al admin givekey %player% standard 1"
diamond_to_key:
display-name: "钻石换钥匙"
display-material: DIAMOND
cost:
currency: ITEM
currency-id: "DIAMOND" # 物品材质
amount: 5
reward-commands:
- "al admin givekey %player% standard 1"
消息配置 (messages.yml)
所有插件消息均在 messages.yml 中配置,支持 &颜色码、RRGGBB 和占位符。
消息分类
| 分类 | 说明 |
|---|---|
pull.* | 抽奖相关消息 (余额不足、动画中、跳过、发放通知、重复转换等) |
stash.* | 暂存箱消息 (领取、分解) |
score.* | 积分兑换消息 |
exchange.* | 兑换商店消息 |
broadcast.* | 播报消息模板 |
command.* | 命令反馈消息 |
可用占位符
| 占位符 | 说明 |
|---|---|
%player% | 玩家名 |
%prize% | 奖品名称 |
%rarity% | 稀有度 |
%pool% | 奖池名称 |
{prize} | 奖品名称 (暂存箱/积分消息) |
{reward} | 奖励名称 (积分兑换) |
{item} | 兑换项名称 |
命令列表
统一命令: /adventurelottery (别名: /al, /choujiang)
玩家命令
| 命令 | 说明 | 权限 |
|---|---|---|
/al open <奖池ID> | 打开指定奖池抽奖界面 | adventurelottery.use |
/al stash | 打开暂存箱 | adventurelottery.stash |
/al exchange | 打开兑换商店 | adventurelottery.exchange |
/al score <奖池ID> | 打开积分商店 | adventurelottery.use |
/al history [奖池ID] | 查看抽奖记录 | adventurelottery.history |
/al list | 列出所有可用奖池 | adventurelottery.use |
/al help | 显示帮助信息 | 无 |
管理员命令
| 命令 | 说明 | 权限 |
|---|---|---|
/al admin reload | 重载所有配置文件 | adventurelottery.admin.reload |
/al admin givekey <玩家> <钥匙ID> <数量> | 给予钥匙 | adventurelottery.admin.give |
/al admin takekey <玩家> <钥匙ID> <数量> | 扣除钥匙 | adventurelottery.admin.give |
/al admin setkey <玩家> <钥匙ID> <数量> | 设置钥匙数量 | adventurelottery.admin.give |
/al admin reset <玩家> [奖池ID] | 重置玩家数据 | adventurelottery.admin.reset |
/al admin test <奖池ID> <次数> | 模拟抽奖测试 | adventurelottery.admin.test |
/al admin info <玩家> [奖池ID] | 查看玩家抽奖数据 | adventurelottery.admin |
权限节点
玩家权限
| 权限 | 默认 | 说明 |
|---|---|---|
adventurelottery.use | 所有人 | 使用抽奖系统 |
adventurelottery.stash | 所有人 | 使用暂存箱 |
adventurelottery.exchange | 所有人 | 使用兑换商店 |
adventurelottery.history | 所有人 | 查看抽奖记录 |
adventurelottery.broadcast.bypass | false | 不接收播报消息 |
管理员权限
| 权限 | 默认 | 说明 |
|---|---|---|
adventurelottery.admin | OP | 管理员基础权限 |
adventurelottery.admin.reload | OP | 重载配置 |
adventurelottery.admin.give | OP | 发放/扣除/设置钥匙 |
adventurelottery.admin.reset | OP | 重置玩家数据 |
adventurelottery.admin.test | OP | 模拟抽奖测试 |
PlaceholderAPI 变量
需安装 PlaceholderAPI,变量前缀为 %lottery_。
| 变量 | 说明 |
|---|---|
%lottery_keys_<钥匙ID>% | 玩家持有的指定钥匙数量 |
%lottery_pulls_<奖池ID>% | 玩家在指定奖池的总抽奖次数 |
%lottery_pity_<奖池ID>% | 玩家在指定奖池的当前保底计数 |
%lottery_score_<奖池ID>% | 玩家在指定积分池的当前♦积分 |
%lottery_stash_count% | 玩家暂存箱中的物品数量 |
使用示例
# 在计分板/菜单中显示
标准钥匙: %lottery_keys_standard%
抽奖次数: %lottery_pulls_demo_standard%
暂存箱: %lottery_stash_count% 件
插件联动
可选依赖
| 插件 | 用途 |
|---|---|
| Vault | 银币经济消耗 (VAULT 货币类型) |
| PlayerPoints | 点券经济消耗 (POINTS 货币类型) |
| PlaceholderAPI | PAPI 变量注册 |
| AdventureMail | 邮件发放通道 (MAIL 发放方式) |
联动说明
- 所有依赖均为 软依赖 (softdepend),未安装时对应功能自动禁用
- 使用
KEY货币时不需要任何外部插件 - 使用
ITEM货币时不需要任何外部插件 (直接扣除背包物品) - 发放方式为
MAIL但未安装 AdventureMail 时,自动回退到STASH
更新日志
v1.0.0 首发 — 2026-05-18
- NEW 5 种动画系统 — 转盘 (WHEEL)、跑马灯 (MARQUEE)、CS:GO (CSGO)、翻牌 (CARD_FLIP)、直接展示 (DIRECT)
- NEW 双奖池模式 — 标准奖池 (STANDARD) + 积分奖池 (SCORING)
- NEW 3 层保底机制 — 小保底 / 大保底 / 天花板保底,优先级分级判定
- NEW 连抽系统 — 1/5/10 连抽,动画自动加速 (5 连=3× / 10 连=4×)
- NEW 暂存箱 — 奖品安全暂存,支持左键领取 + 右键分解
- NEW 方块宝箱 — 任意方块绑定奖池,全息文字 + 粒子特效
- NEW 兑换商店 — Vault / Points / 物品兑换钥匙
- NEW 4 种货币 — KEY (虚拟钥匙) / ITEM (物品) / VAULT (银币) / POINTS (点券)
- NEW 3 种消耗模式 — 固定 (FIXED) / 递增 (ESCALATING) / 指数 (EXPONENTIAL)
- NEW 重复处理 — 允许 (ALLOW) / 移除 (REMOVE) / 自动转换 (CONVERT)
- NEW 前置解锁 — 奖品之间 DAG 依赖链
- NEW 积分池♦系统 — 7 格进度条、无保护/保护双抽法、宝箱兑换
- NEW 播报系统 — 聊天 / ActionBar / BossBar / 音效 / 烟花 全维度播报
- NEW 跳过动画 — 双关闭确认机制,奖品邮件安全发放
- NEW 预启动特效 — 暗幕 + 闪烁预启动动画 (0.7 秒仪式感)
- NEW 数据持久化 — SQLite / MySQL 双驱动,HikariCP 连接池,自动备份
- NEW PlaceholderAPI — 5 个 PAPI 变量 (钥匙/次数/保底/积分/暂存箱)
- NEW 消息外置 — 所有文本 messages.yml 可配置
- NEW 统一命令 —
/al玩家 +/al admin管理 - NEW bStats 统计 — 插件使用数据匿名统计
v1.0.0 BugFix 补丁 — 2026-05-18
- FIX 方块宝箱无法触发抽奖 — 修复了点击方块宝箱后 GUI 按钮无响应的问题
- FIX GUI 开启时轨道空白 — 修复了打开抽奖界面后奖品轨道需等待 0.4 秒才显示的问题
- FIX 5 连抽奖品丢失 — 修复了连抽中途跳过动画时未播放部分的奖品不发放的严重问题
- FIX 连抽动画速度优化 — 5 连抽加速至 3× (原 2×),10 连抽加速至 4× (原 3×),结果展示暂停时间按倍率缩短
- FIX 空奖品池防护 — 增加空奖品列表防护,避免配置错误导致崩溃