🎰 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+
Java21+
可选依赖Vault、PlayerPoints、PlaceholderAPI、AdventureMail

安装步骤

  1. AdventureLottery-1.0.0.jar 放入 plugins/ 目录
  2. 按需安装 Vault / PlayerPoints / AdventureMail
  3. 启动服务器,自动生成配置文件和示例奖池
  4. 编辑配置文件和奖池定义
  5. 执行 /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.ymlprizes.yml 两个文件。你可以无限创建奖池。

🎯 奖池类型

AdventureLottery 支持两种奖池模式,满足不同玩法需求:

标准奖池 (STANDARD)

经典抽奖模式,玩家消耗 钥匙货币 进行抽奖,每次随机获得一个奖品。

  • 支持保底机制 (小保底 / 大保底 / 天花板)
  • 支持 1/5/10 连抽
  • 支持重复奖品处理 (允许 / 移除 / 转换)
  • 支持前置奖品解锁链

积分奖池 (SCORING)

积分收集模式,每次抽奖获得 ♦ 积分,积满后可兑换奖励。

  • 无保护抽 — 固定消耗,抽到不同奖品时积分清零
  • 保护抽 — 递增消耗,抽到不同奖品仅加 1♦
  • ♦ 进度条直观显示 (7 格)
  • 积满后可兑换宝箱奖励 (支持左键/右键两种奖励)
  • 积分奖池不支持连抽

消耗模式

模式配置键说明
固定消耗FIXED每次消耗相同数量
递增消耗ESCALATING第 N 次消耗 = N × 基础价
指数消耗EXPONENTIAL第 N 次消耗 = 2^N × 基础价

货币类型

类型配置键说明
虚拟钥匙KEY插件内置虚拟钥匙 (推荐)
实体物品ITEM消耗背包中的指定物品
Vault 银币VAULT消耗 Vault 经济余额
PlayerPointsPOINTS消耗 PlayerPoints 点券

🎬 动画系统

AdventureLottery 提供 5 种抽奖动画效果,每个奖池可独立配置。

动画类型一览

动画配置键GUI 大小效果说明
🎡 转盘WHEEL54 格 (6×9)奖品沿边框顺时针旋转,停在顶部中央
🔄 跑马灯MARQUEE36 格 (4×9)奖品水平滚动,停在中间位置
🔫 CS:GO 开箱CSGO36 格 (4×9)类似 CS:GO 的水平滚动开箱动画
🃏 翻牌CARD_FLIP54 格 (6×9)点击牌位翻开,逐步揭示奖品
⚡ 直接展示DIRECT36 格 (4×9)无动画,直接显示结果

动画阶段

滚动类动画 (WHEEL/MARQUEE/CSGO) 分为 3 个阶段:

  1. 慢启动 — 缓慢开始滚动,营造期待感
  2. 快速滚动 — 高速滚动,奖品快速切换
  3. 减速停止 — 逐渐减速,最终停在目标奖品上

预启动特效

单抽动画开始前会播放暗幕 + 闪烁预启动效果 (约 0.7 秒),增强仪式感。

连抽加速

连抽模式下动画会自动加速,减少等待时间:

连抽数动画加速间隔延迟
1 抽正常速度
5 连抽3× 加速0.25 秒
10 连抽4× 加速0.15 秒

跳过动画

在动画播放中关闭 GUI 可跳过动画。为防止误触,需要 关闭两次 才会真正跳过:

  1. 第一次关闭:GUI 重新打开,显示 "再次关闭将跳过动画" 提示
  2. 第二次关闭:动画跳过,所有奖品自动通过邮件/暂存箱发放
ℹ️ 安全机制

无论何种情况 (断线、崩溃、关闭) 跳过动画,所有已抽取的奖品都会通过邮件安全发放,绝不丢失。

🛡️ 保底机制

保底系统确保玩家不会无限抽取而不出好东西。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. 玩家选择 无保护抽保护抽
  2. 抽奖结果为一个奖品 — 若与上次相同则 ♦+1,若不同则行为取决于抽法
  3. ♦ 进度条 (7 格) 实时显示收集进度
  4. 积满后点击对应宝箱兑换奖励

两种抽法

抽法消耗抽到相同奖品抽到不同奖品
无保护抽固定消耗♦ +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 定义奖池的基本属性。

完整字段说明

字段类型说明
idString奖池唯一 ID
display-nameString显示名称 (支持颜色码)
descriptionList描述文本列表
typeSTANDARD / SCORING奖池类型
permissionString使用权限 (空=无限制)
costSection消耗配置
pitySection保底配置
duplicateSection重复处理
deliverySTASH / MAIL / DIRECT发放方式
multi-pullSection连抽设置
animation.type动画类型枚举动画效果
iconSectionGUI 图标
gui-titleString抽奖界面标题
hide-probabilityboolean是否隐藏概率显示

标准奖池示例

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-nameString奖品显示名称
rarity枚举稀有度: COMMON / UNCOMMON / RARE / EPIC / LEGENDARY
weightdouble权重 (越高越容易抽到)
display-materialMaterialGUI 中显示的材质
custom-model-dataint自定义模型数据 (0=原版)
display-loreListGUI 描述文本
reward-commandsList抽到后执行的指令 (%player%)
decompose-commandsList分解时执行的指令
decompose-descriptionString分解描述文本
pity-eligibleSection保底候选标记 (small/big/ceiling)
prerequisitesList前置奖品 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.bypassfalse不接收播报消息

管理员权限

权限默认说明
adventurelottery.adminOP管理员基础权限
adventurelottery.admin.reloadOP重载配置
adventurelottery.admin.giveOP发放/扣除/设置钥匙
adventurelottery.admin.resetOP重置玩家数据
adventurelottery.admin.testOP模拟抽奖测试

📊 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 货币类型)
PlaceholderAPIPAPI 变量注册
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 空奖品池防护 — 增加空奖品列表防护,避免配置错误导致崩溃