💳 AdventureMonthCard

一、简介

AdventureMonthCard —— 冒险月卡签到系统,日历签到 · 双级月卡 · 积分里程碑 · 经济集成 · 自动备份

为您的服务器提供完整的月卡签到体系。玩家通过精美的 54 格日历面板每日签到,享受每日奖励、特殊日奖励和累计里程碑。支持普通/精英双级月卡、Vault & PlayerPoints 双经济、PlaceholderAPI 变量、MiniMessage & RGB 渐变色,以及 SQLite/MySQL 持久化存储。

兼容 Spigot / Paper 1.21.4+ 服务器(Java 21),HikariCP 内置,无需前置。

核心特性

  • 54格签到日历 — 7列日期布局,4种状态 (可签/已签/未到/错过),自定义材质 + CustomModelData
  • 双级月卡 — 普通月卡 (Vault 银币) + 精英月卡 (PlayerPoints 金币),精英包含普通奖励
  • 3层奖励体系 — 每日奖励 / 特殊日奖励 / 累计里程碑奖励
  • 月卡积分 — 签到累积积分,可通过管理命令管理
  • 连续签到追踪 — 自动记录连签天数,断签重置
  • 智能提醒 — 登录提醒 + 定时提醒,支持 CHAT / TITLE / ACTIONBAR 三种方式
  • 月卡商店 GUI — 可视化购买/查看月卡
  • MiniMessage + RGB — 渐变色 / HEX / 标签全支持
  • 数据存储 — SQLite / MySQL + HikariCP 连接池
  • 自动备份 — 定时 SQL 全量导出,自动轮替旧备份
  • PAPI 变量 — 10 个占位符,支持计分板/Tab等外部显示
  • 完全可配置 — 4 个 YAML 配置文件,所有文本/物品/布局均可自定义

二、插件前置说明

均为可选依赖,不安装也能正常运行:

  • Vault — 经济系统联动 (普通月卡购买使用银币)
  • PlayerPoints — 金币系统联动 (精英月卡购买使用金币)
  • PlaceholderAPI — 占位符扩展 (计分板 / Tab / 聊天格式)

📥 安装与目录

环境要求

项目要求
服务端Spigot / Paper 1.21.4+
Java21+

依赖插件

插件类型说明
Vault可选普通月卡购买 (银币)
PlayerPoints可选精英月卡购买 (金币)
PlaceholderAPI可选占位符扩展

安装步骤

  1. 放入 AdventureMonthCard-1.0.0.jarplugins/ 目录
  2. 重启服务器
  3. 编辑 plugins/AdventureMonthCard/ 下配置文件
  4. /monthcard admin reload 重载生效

目录结构

plugins/AdventureMonthCard/
├── config.yml          # 核心配置 (数据库/备份/提醒/音效)
├── passes.yml          # 月卡类型定义 (奖励/价格/里程碑)
├── gui.yml             # GUI面板外观 (日历/商店布局)
├── messages.yml        # 消息文本 (MiniMessage 格式)
├── data.db             # SQLite 数据库 (默认)
└── backUp/
    ├── backup_2026-05-07_04-00-00.sql
    └── ...             # 自动备份文件

💳 月卡体系

AdventureMonthCard 支持多种月卡类型,默认提供普通月卡精英月卡两级体系。

月卡对比

属性普通月卡精英月卡
价格5000 银币 (Vault)200 金币 (PlayerPoints)
有效期30 天30 天
每日积分1025
每日命令奖励钻石 ×1钻石 ×3 + 500银币
包含下级✅ 包含普通月卡所有奖励
权限节点monthcard.normalmonthcard.elite
商店图标PAPERNETHER_STAR

月卡生命周期

  1. 购买 — 玩家在商店 GUI 中选购月卡,扣除对应货币
  2. 激活 — 购买后立即激活,从当天起计算有效期
  3. 续费 — 若月卡已到期,可重新购买;有效期从当前日期起算
  4. 签到 — 月卡有效期内,每天可在日历 GUI 中签到一次
  5. 到期 — 到期后无法签到,需重新购买

includes 继承机制

精英月卡设置 includes: "normal",签到时自动额外发放普通月卡的当日奖励。这意味着精英月卡玩家一次签到获得两份奖励(精英 + 普通)。

ℹ️ 自定义月卡

passes.yml 中添加新的月卡节点即可扩展更多等级,插件会自动加载并在商店中显示。

📅 签到日历

54 格 (6行 × 9列) 日历面板,7列居中布局,两侧黑色边框填充。

面板布局

┌──┬──┬──┬──┬──┬──┬──┬──┬──┐
│🛒│▓ │▓ │▓ │📖│▓ │▓ │▓ │💎│  行0: 功能栏
├──┼──┼──┼──┼──┼──┼──┼──┼──┤
│▓ │01│02│03│04│05│06│07│▓ │  行1: 日历
│▓ │08│09│10│11│12│13│14│▓ │  行2
│▓ │15│16│17│18│19│20│21│▓ │  行3
│▓ │22│23│24│25│26│27│28│▓ │  行4
│▓ │29│30│31│  │  │  │  │▓ │  行5
└──┴──┴──┴──┴──┴──┴──┴──┴──┘

🛒 = 月卡商店 (Slot 0)    📖 = 月卡信息 (Slot 4)
💎 = 里程碑 (Slot 8)      ▓  = 黑色边框填充

4 种日期状态

状态配置键默认物品说明可交互
🌻 可签到availableSUNFLOWER (附魔发光)今天且未签到✅ 点击签到
✔ 已签到signedLIME_DYE已完成签到
◻ 未到达futureGRAY_STAINED_GLASS_PANE未来日期
✘ 已错过missedRED_DYE过去未签到

功能按钮

按钮Slot物品说明
月卡商店0GOLD_INGOT点击打开商店 GUI
月卡信息4BOOK显示月卡类型/到期/签到/积分/连签
里程碑8DIAMOND查看累计签到里程碑
边框填充两侧 + 空位BLACK_STAINED_GLASS_PANE装饰

日期格子自定义

每个状态的物品支持以下属性:

属性类型说明
materialMaterial物品类型
custom-model-dataint自定义模型 ID (资源包)
nameMiniMessage显示名称
loreList物品描述

可用变量

变量说明
%day%当月第几天 (1~31)
%points%该日签到积分
%reward_desc%奖励描述
%sign_time%签到时间
%month%当前月份
%pass_type%月卡类型名称
%expire_date%月卡到期日
%signed_days%本月已签到天数
%total_days%当月总天数
%streak%连续签到天数

🛒 月卡商店

27 格 (3行 × 9列) 商店面板,用于购买和查看月卡。

面板布局

┌──┬──┬──┬──┬──┬──┬──┬──┬──┐
│▓ │▓ │▓ │▓ │▓ │▓ │▓ │▓ │▓ │  行0: 边框
├──┼──┼──┼──┼──┼──┼──┼──┼──┤
│▓ │▓ │📄│▓ │▓ │▓ │⭐│▓ │▓ │  行1: 商品
├──┼──┼──┼──┼──┼──┼──┼──┼──┤
│▓ │▓ │▓ │▓ │🔙│▓ │▓ │▓ │▓ │  行2: 功能
└──┴──┴──┴──┴──┴──┴──┴──┴──┘

📄 = 普通月卡 (Slot 11)    ⭐ = 精英月卡 (Slot 15)
🔙 = 返回日历 (Slot 22)    ▓  = 黑色边框填充

商品显示

每个月卡商品自动读取 passes.yml 中的配置:

  • 图标shop-icon.material + custom-model-data
  • 名称display-name (支持 MiniMessage)
  • 描述description 列表
  • 价格 — 自动显示价格和货币类型
  • 状态 — 已拥有时显示到期日,未拥有时显示「点击购买」

购买流程

  1. 点击商品图标
  2. 检查是否已拥有该月卡(已拥有则拒绝)
  3. 扣除对应货币(Vault 或 PlayerPoints)
  4. 给予月卡,播放音效
  5. 自动刷新商店界面

🎁 奖励系统

3 层奖励体系

类型配置键触发条件可重复
📦 每日奖励daily-reward每次签到触发✅ 每天
⭐ 特殊日奖励special-days指定日期签到 (覆盖每日奖励)✅ 每月
🏆 里程碑奖励milestones当月累计签到达 N 天❌ 一次性

奖励内容

每种奖励包含两部分:

内容配置键说明
月卡积分points累加到玩家月卡积分
命令奖励commands以控制台身份执行,支持 %player% 变量

特殊日奖励

以当月第几天为键,覆盖当日的 daily-reward

special-days:
  7:           # 第7天
    points: 30
    commands:
      - "give %player% diamond 3"
      - "give %player% gold_ingot 5"
  14:          # 第14天
    points: 50
    commands:
      - "give %player% diamond 5"

累计里程碑

当月累计签到达到指定天数时额外触发,每个里程碑仅领取一次:

milestones:
  7:           # 累计7天
    points: 50
    commands:
      - "give %player% emerald 10"
  28:          # 累计28天 (满勤)
    points: 500
    commands:
      - "give %player% elytra 1"

精英月卡继承

设置 includes: "normal" 后,精英月卡签到时自动叠加普通月卡的当日奖励,包括积分和命令。

默认奖励对比

里程碑普通月卡精英月卡
第 7 天钻石 ×3 + 金锭 ×5 (30分)钻石块 ×1 (80分)
第 14 天钻石 ×5 (50分)钻石块 ×2 (120分)
第 21 天钻石块 ×1 (80分)下界合金锭 ×3 (200分)
第 28 天下界合金锭 ×1 (150分)下界合金块 ×1 (400分)
累计 7 天绿宝石 ×10 (50分)绿宝石块 ×2 (100分)
累计 14 天绿宝石块 ×1 (100分)下界之星 ×2 (200分)
累计 21 天下界之星 ×1 (200分)不死图腾 ×1 (400分)
累计 28 天鞘翅 ×1 (500分)鞘翅 ×1 + 下界合金块 ×2 (1000分)

积分系统

月卡积分是插件内置的独立积分体系,与 Vault/PlayerPoints 无关。

积分来源

来源说明
每日签到普通 10分/天,精英 25分/天
特殊日奖励指定日期额外积分
里程碑奖励累计签到达标额外积分
管理员给予/mc admin points <玩家> give <数量>

积分管理命令

/mc admin points <玩家> give <数量>   # 给予积分
/mc admin points <玩家> take <数量>   # 扣除积分
/mc admin points <玩家> set <数量>    # 设置积分

积分名称自定义

config.yml 中设置:

points-name: "<gradient:#FFD700:#FFA500>月卡积分</gradient>"

PAPI 占位符

积分可通过 %monthcard_points% 在任何支持 PAPI 的地方显示。

⌨️ 命令与权限

主命令

/monthcard (别名: /mc /mcard)

玩家命令

命令说明权限
/mc打开签到日历面板monthcard.use
/mc sign打开签到日历 (同上)monthcard.sign
/mc shop打开月卡商店monthcard.shop
/mc info查看自己的月卡信息monthcard.use
/mc help查看帮助monthcard.use

管理命令

命令说明权限
/mc admin reload重载所有配置文件monthcard.admin.reload
/mc admin give <玩家> <月卡ID> [天数]给予玩家月卡monthcard.admin.give
/mc admin reset <玩家>重置玩家所有数据monthcard.admin.reset
/mc admin backup手动触发备份monthcard.admin.backup
/mc admin points <玩家> give <数量>给予积分monthcard.admin
/mc admin points <玩家> take <数量>扣除积分monthcard.admin
/mc admin points <玩家> set <数量>设置积分monthcard.admin
/mc info <玩家>查看他人月卡信息monthcard.admin

权限节点

权限默认说明
monthcard.usetrue使用月卡基础功能
monthcard.signtrue签到权限
monthcard.shoptrue查看月卡商店
monthcard.adminOP管理员总权限
monthcard.admin.reloadOP重载配置
monthcard.admin.giveOP给予月卡
monthcard.admin.resetOP重置玩家数据
monthcard.admin.backupOP手动备份

⚙️ config.yml

完整配置参考

# 数据库设置
database:
  type: sqlite           # sqlite 或 mysql
  mysql:
    host: localhost
    port: 3306
    database: adventuremonthcard
    username: root
    password: ""
    pool-size: 5

# 自动备份
backup:
  enabled: true
  time: "04:00"          # 每天几点备份 (24小时制)
  max-backups: 7         # 最多保留几份

# 签到提醒
reminder:
  on-join: true          # 登录时提醒未签到
  on-join-delay: 60      # 延迟多少ticks后提醒
  scheduled:
    enabled: true        # 定时提醒
    times:
      - "12:00"
      - "20:00"
  type: TITLE            # CHAT / ACTIONBAR / TITLE

# 签到音效
sounds:
  sign-success: "ENTITY_PLAYER_LEVELUP"
  sign-fail: "ENTITY_VILLAGER_NO"
  shop-buy: "BLOCK_NOTE_BLOCK_PLING"
  gui-click: "UI_BUTTON_CLICK"
  gui-open: "BLOCK_CHEST_OPEN"

# 月卡积分名称
points-name: "<gradient:#FFD700:#FFA500>月卡积分</gradient>"

配置项说明

配置项类型默认值说明
database.typeStringsqlite数据库类型
backup.enabledbooleantrue启用自动备份
backup.timeString04:00备份时间
backup.max-backupsint7最大备份数
reminder.on-joinbooleantrue登录提醒
reminder.on-join-delayint60提醒延迟 (ticks)
reminder.typeStringTITLE提醒方式
sounds.*StringBukkit Sound 枚举名

📋 passes.yml

月卡定义结构

passes:
  月卡ID:
    display-name: "显示名称 (MiniMessage)"
    description:
      - "描述行1"
      - "描述行2"
    permission: "monthcard.月卡ID"
    duration-days: 30          # 有效天数
    price: 5000                # 价格
    currency-type: VAULT       # VAULT (银币) 或 PLAYERPOINTS (金币)
    includes: "其他月卡ID"      # 继承 (可选)
    shop-icon:
      material: PAPER          # 商店图标物品
      custom-model-data: 0     # 自定义模型ID
    daily-reward:
      points: 10               # 每日签到积分
      commands:
        - "give %player% diamond 1"
    special-days:
      7:                       # 当月第7天
        points: 30
        commands:
          - "give %player% diamond 3"
    milestones:
      7:                       # 累计签到7天
        points: 50
        commands:
          - "give %player% emerald 10"

字段说明

字段类型必填说明
display-nameString月卡显示名称 (MiniMessage)
descriptionList商店描述文本
permissionString购买后赋予的权限
duration-daysint有效天数
pricedouble购买价格
currency-typeenumVAULT 或 PLAYERPOINTS
includesString包含的低级月卡 ID
shop-iconSection商店图标 (material + cmd)
daily-rewardSection每日签到奖励
special-daysMap特殊日奖励 (key=天数)
milestonesMap里程碑奖励 (key=累计天数)

新增自定义月卡

只需在 passes 下新增一个节点,如 vip

passes:
  normal: ...
  elite: ...
  vip:                         # 新增 VIP 月卡
    display-name: "<gradient:#FF6B6B:#FF8E53>VIP月卡</gradient>"
    duration-days: 30
    price: 500
    currency-type: PLAYERPOINTS
    includes: "elite"          # 包含精英月卡奖励
    daily-reward:
      points: 50
      commands:
        - "give %player% diamond_block 1"

然后在 gui.ymlshop.items 中添加 vip.slot 即可在商店显示。

🎨 gui.yml

日历面板配置

calendar:
  title: "<gradient:#FFD700:#FFA500>✦ 月卡签到 - %month%月 ✦</gradient>"
  size: 54                     # GUI大小: 9/18/27/36/45/54
  day-slots:                   # 7列日期格子布局
    - 10,11,12,13,14,15,16
    - 19,20,21,22,23,24,25
    - 28,29,30,31,32,33,34
    - 37,38,39,40,41,42,43
    - 46,47,48,49,50,51,52
  items:
    available:                 # 今天可签到
      material: SUNFLOWER
      custom-model-data: 0
      name: "<yellow>✦ 第%day%天 - 点击签到!</yellow>"
      lore: [...]
    signed:                    # 已签到
      material: LIME_DYE
    future:                    # 未到日期
      material: GRAY_STAINED_GLASS_PANE
    missed:                    # 已错过
      material: RED_DYE
  buttons:
    info:
      slot: 4
      material: BOOK
    shop:
      slot: 0
      material: GOLD_INGOT
    milestone:
      slot: 8
      material: DIAMOND
    filler:
      material: BLACK_STAINED_GLASS_PANE

商店面板配置

shop:
  title: "<gradient:#FFD700:#FF8C00>✦ 月卡商店 ✦</gradient>"
  size: 27
  items:
    normal:
      slot: 11               # 普通月卡位置
    elite:
      slot: 15               # 精英月卡位置
  back:
    slot: 22
    material: ARROW
    name: "<gray>返回签到日历</gray>"

自定义日期布局

day-slots 定义了每一行的日期 Slot 位置。修改这些数字可以改变日期格子的排列方式。每行 7 个数字对应星期一到星期日。

💬 messages.yml

所有消息支持 MiniMessage 格式标签和 RGB 渐变色。

消息分类

分类前缀说明
签到sign.*签到成功/失败/里程碑/连签
商店shop.*购买成功/余额不足/已拥有
提醒reminder.*登录提醒/定时提醒/Title
管理admin.*重载/给予/重置/备份
信息info.*月卡信息显示
帮助help.*帮助文本

可用变量

变量说明适用消息
%player%玩家名全部
%points%获得积分 / 总积分sign / info
%days%签到天数sign / info / admin
%streak%连续签到天数sign / info
%pass%月卡类型名shop / info / admin
%price%价格shop
%currency%货币名称shop
%date%到期日期info
%amount%积分数量admin.points

前缀自定义

prefix: "<gradient:#FFD700:#FFA500>[月卡]</gradient> "

所有带前缀的消息自动拼接此前缀。

🔗 PlaceholderAPI 占位符

安装 PlaceholderAPI 后自动注册,无需手动下载扩展。

占位符列表

占位符说明示例值
%monthcard_points%月卡积分350
%monthcard_streak%连续签到天数7
%monthcard_signed_today%今日是否已签到true / false
%monthcard_signed_month%本月签到天数15
%monthcard_has_normal%是否拥有普通月卡true / false
%monthcard_has_elite%是否拥有精英月卡true / false
%monthcard_has_any%是否拥有任意月卡true / false
%monthcard_pass_type%当前最高月卡类型精英月卡 / 无
%monthcard_expire_normal%普通月卡到期日2026-06-07 / 无
%monthcard_expire_elite%精英月卡到期日2026-06-07 / 无

使用场景

  • 计分板 — 显示月卡积分、签到天数、连签
  • Tab 列表 — 显示月卡类型标识
  • 聊天格式 — 显示月卡徽章
  • NPC 对话 — 动态显示月卡信息
  • 条件判断 — 结合 PAPI 条件变量实现动态逻辑

💰 经济集成

双经济体系

经济插件用途配置值
银币Vault普通月卡购买currency-type: VAULT
金币PlayerPoints精英月卡购买currency-type: PLAYERPOINTS

Vault 集成

自动检测 Vault 插件,通过 Economy 服务进行扣款。如果 Vault 不存在,VAULT 类型的月卡将无法购买。

PlayerPoints 集成

通过反射挂钩 PlayerPoints API,无需编译依赖。如果 PlayerPoints 不存在,PLAYERPOINTS 类型的月卡将无法购买。

奖励命令中使用经济

奖励的 commands 可直接调用经济插件命令:

commands:
  - "eco give %player% 500"          # Vault 给银币
  - "points give %player% 100"       # PlayerPoints 给金币

🗄️ 数据库

支持类型

类型适用场景配置
SQLite单服 / 小型服务器type: sqlite
MySQL多服 / 大型服务器type: mysql

数据表结构

表名说明主键
mc_passes月卡拥有记录uuid + pass_id
mc_signs签到记录uuid + sign_date
mc_player_data玩家数据 (积分/连签)uuid
mc_milestones里程碑领取记录uuid + pass_id + milestone_day

MySQL 配置

database:
  type: mysql
  mysql:
    host: localhost
    port: 3306
    database: adventuremonthcard
    username: root
    password: "your_password"
    pool-size: 5

连接池

使用 HikariCP 高性能连接池 (内置,无需额外安装)。

  • 自动重连
  • 连接池大小可配置
  • 预编译语句缓存

数据缓存

  • 玩家上线时异步加载到内存缓存
  • 下线时自动保存并移除缓存
  • 5 分钟自动全量保存 (防止异常丢数据)

💾 自动备份

功能说明

定时将全部数据表导出为 SQL 文件,存储在 plugins/AdventureMonthCard/backUp/ 目录。

配置

backup:
  enabled: true          # 启用自动备份
  time: "04:00"          # 每天凌晨 4 点执行
  max-backups: 7         # 最多保留 7 份

备份文件格式

backUp/
├── backup_2026-05-01_04-00-00.sql
├── backup_2026-05-02_04-00-00.sql
├── ...
└── backup_2026-05-07_04-00-00.sql   # 最新

文件命名: backup_日期_时间.sql,内容为 INSERT 语句。

自动轮替

超过 max-backups 数量后,自动删除最旧的备份文件。

手动备份

/mc admin backup

管理员可随时手动触发备份,异步执行不影响服务器性能。

🌈 颜色与格式

所有配置文件中的文本均支持以下三种颜色格式:

1. MiniMessage 标签

标签效果
<black> ~ <white>16种基础颜色
<bold>粗体
<italic>斜体
<underlined>下划线
<strikethrough>删除线
<obfuscated>混淆文字
<reset>重置格式

示例: <green>签到成功! <yellow>+10 积分</yellow></green>

2. RGB HEX 颜色

<#FF6B35>橙色文字
<#4ADE80>绿色文字

3. 渐变色

<gradient:#FFD700:#FFA500>金色渐变文字</gradient>
<gradient:#87CEEB:#4682B4>蓝色渐变文字</gradient>

4. 传统颜色码

同时支持 & 颜色码: &a &6 &l 等。

支持颜色的配置位置

  • messages.yml — 所有消息文本
  • gui.yml — GUI 标题、物品名称、物品描述
  • passes.yml — 月卡显示名称、描述
  • config.yml — 积分名称

📝 更新日志

v1.0.0 最新

  • NEW 月卡体系 — 普通月卡 (Vault) + 精英月卡 (PlayerPoints) 双级体系
  • NEW 签到日历 GUI — 54格日历面板,4种日期状态,自定义材质 + CustomModelData
  • NEW 月卡商店 GUI — 可视化购买月卡,自动显示价格/状态
  • NEW 3层奖励体系 — 每日奖励 / 特殊日奖励 / 累计里程碑,精英包含普通奖励
  • NEW 月卡积分 — 独立积分体系,签到累积,管理员可管理
  • NEW 连续签到追踪 — 自动记录连签天数,断签重置
  • NEW 智能提醒 — 登录提醒 + 定时提醒 (CHAT / TITLE / ACTIONBAR)
  • NEW 双经济集成 — Vault (银币) + PlayerPoints (金币) 反射挂钩
  • NEW 数据存储 — SQLite / MySQL + HikariCP 连接池
  • NEW 自动备份 — 定时 SQL 全量导出 + 自动轮替
  • NEW PAPI 变量 — 10 个占位符 (积分/连签/月卡状态/到期日等)
  • NEW MiniMessage + RGB — 渐变色 / HEX / 标签全支持
  • NEW 完全可配置 — 4个 YAML 配置文件 (config/passes/gui/messages)
  • NEW 命令系统 — 玩家命令 + 管理命令 + Tab 补全