- 版权类型
- 原创
- 插件中文名称
- RPT时长奖励
- 插件英文名称
- RptPlaytimeReward
- 原帖地址
- #
- 支持的核心(服务端)
- Paper
- Folia
- 语言支持
- 中文(简体)
- 适配版本(Java)
- 26.x
- 1.21
关于这个插件
RptPlaytimeReward 是一套在线时长奖励系统。它在服务端 tick 上给每个玩家记三个数:当日在线、当月累计、总累计。你在配置里给这三个维度各配一组"档位"——比如"每日在线满 30 分钟给 3 个钻石""本月累计满 50 小时给 3 个下界合金锭"。玩家打开对应界面,进度一目了然,到点就能点一下领走。
三个维度各是一个完全独立的界面:没有主菜单,界面之间也不互通 —— 输入
/rptpr daily 就是每日界面,/rptpr monthly 就是每月界面,/rptpr total 就是总计界面。每个维度还能用 enabled: true / false 单独开启或禁用:关掉之后玩家打不开那个界面,对应的档位也不发放(时长照常统计,随时改回来即可)。奖励内容完全由你决定:档位的发放走"控制台执行指令",所以你写
give %player% diamond 1 就是发物品,写 eco give %player% 100 就是给钱,写你们服自己的称号指令就是发称号 —— 不绑任何特定插件。计时口径是服务端 tick:不读客户端时钟,也不依赖玩家本地时间,所以改电脑时间这种小把戏没用。
功能说明
1. 三个维度,三个独立界面,各自可开关
| 维度 | 指令 | 说明 | 重置 |
| 每日 | /rptpr daily | 当日在线时长 | 每天到你配的时刻清零(reset.daily-at,支持非 0 点,比如 04:00) |
| 每月 | /rptpr monthly | 当月累计 | 每月到你配的日期清零(reset.monthly-day) |
| 总计 | /rptpr total | 总累计在线 | 永不清零 |
- 三个界面互相独立:各有自己的标题、行数、布局、填充色,不设主菜单、界面之间没有任何跳转按钮。
- 可单独启用 / 禁用:
daily.enabled/monthly.enabled/total.enabled(在gui.yml里),默认都是true。
设成false时该界面的指令会提示"该维度已被关闭",对应档位也领不到(时长仍照常统计)。 - 三个维度互不影响:今天的 30 分钟不会因为你昨天在线很久就自动"够了"。
- 每个档位单独配置:需要多少分钟、图标、名字、说明、可选权限门槛、以及发放的指令列表。
2. 界面布局用「字符矩阵」画,一看就懂
每个维度用自己的layout 画界面 —— 一个字符串 = 一行(固定 9 格):
YAML:
layout:
- "####@###*" # # = 填充物 @ = 我的信息 * = 关闭按钮
- "#A B C D#" # A B C D = 第 1/2/3/4 档奖励
- "#E F G H#"
- "#J K L M#"
- "#########"
- 每个字符 = 界面上的一张"图",含义在下面两处定义:
icons.<字符>—— 普通图标(填充物、信息牌、关闭按钮…,可写material/name/lore/action: close);reward.<字符>—— 这一格是奖励档位(写time需要分钟数 +commands点击执行什么)。
- 同一个字符出现几次,就在几个格子里放它。空格 = 留空。
- 奖励领取状态在
status里配三种(unavailable不可领取 /available可领取 /taken已领取):档位material写%icon%时图标随状态自动换 —— 默认配法是未领取统一用附魔瓶、已领取统一换成玻璃瓶,一眼就能分清哪些还没领。 - 界面里的所有点击与拖拽都被拦下,图标拿不走;一次只领一档。
3. 防重复领取
- 领取记录存在数据库里,每档每天 / 每月只能领一次,总累计档位则永只能领一次。
- 每日 / 每月的档位在跨周期后会自动恢复可领(底层用的是"档位 + 周期"作为记录键,不是简单标记)。
- 过期的领取记录会按
storage.keep-claims-days(默认 90 天)自动清理,总累计的记录永远保留。
4. 计时口径(防篡改)
- 全局调度器每
count.step-seconds(默认 10 秒)给所有在线玩家的三个计数器各加一次。 - 纯服务端 tick 驱动,不读客户端时间 —— 玩家改本地时钟、用加速齿轮都没用。
- 步长可调:想更精确就调小(更费一点),想更省就调大。
- 时长内存里累加、定时批量落库(
storage.save-interval-seconds),关服时在独立线程做阻塞收尾。
5. 对外暴露 PAPI 变量
装了 PlaceholderAPI 就会自动注册rptpr 扩展(软依赖,没装不影响插件本体)。变量覆盖面很全,共 22 个:① 时长(格式化文本,直接显示用)
| 变量 | 说明 |
%rptpr_daily% | 当日在线时长(如 2 小时 13 分) |
%rptpr_monthly% | 当月累计在线时长 |
%rptpr_total% | 总累计在线时长 |
② 时长(纯数字,适合做条件判断 / 排序)
| 变量 | 说明 |
%rptpr_daily_seconds% / %rptpr_daily_minutes% | 当日秒数 / 分钟数 |
%rptpr_monthly_seconds% / %rptpr_monthly_minutes% | 当月秒数 / 分钟数 |
%rptpr_total_seconds% / %rptpr_total_minutes% / %rptpr_total_hours% | 总秒数 / 分钟数 / 小时数 |
③ 档位进度
| 变量 | 说明 |
%rptpr_next_daily% | 距下一档每日奖励还差多久(已全领完为 -) |
%rptpr_next_monthly% / %rptpr_next_total% | 同上,对应每月 / 总计 |
%rptpr_progress_daily% | 当日档位进度百分比(0~100) |
%rptpr_progress_monthly% / %rptpr_progress_total% | 同上,对应每月 / 总计 |
%rptpr_next_name_daily% | 下一档的名字(如 每日在线 30 分钟;已全领完为 -) |
%rptpr_next_name_monthly% / %rptpr_next_name_total% | 同上,对应每月 / 总计 |
④ 领取数量
| 变量 | 说明 |
%rptpr_claimable_daily% | 当前可领取(够时间且没领过)的档位数 |
%rptpr_claimable_monthly% / %rptpr_claimable_total% | 同上,对应每月 / 总计 |
%rptpr_claimed_daily% | 当前周期内已领取的档位数 |
%rptpr_claimed_monthly% / %rptpr_claimed_total% | 同上,对应每月 / 总计 |
支持版本与环境
| 组件 | 说明 |
| Minecraft 版本 | 1.21 ~ 26.3(同一个 jar 跨版本,字节码目标 Java 21) |
| 服务端核心 | Paper、Folia(已声明 folia-supported: true) |
| Java 运行环境 | Java 21 及以上 |
| 前置插件 | 无(必装项为零)。PlaceholderAPI 可选(不装就没有变量,插件本体照常跑) |
| 数据库 | 无外部依赖,使用内嵌 SQLite,不需要 MySQL |
| 编译基线 | dev.folia:folia-api:26.2.build.1-beta |
目标用户
- 想让玩家"待得住"的生存服 / 长期服服主 —— 挂机也有回报,但奖励由你设计。
- 做签到 + 时长双重留存的服主 —— 签到靠动作,时长靠在线,两个维度互补。
- 需要把在线时长展示在外面的服主 —— PAPI 变量可直接接记分板、TAB、菜单标题。
- 正在用 Folia 核心的服主 —— 计时任务按 Folia 的线程规矩做。
是否付费
付费插件。 具体定价与授权方式以资源页「售价」项为准。- 插件不含任何联网校验、授权服务器或机器绑定,购买后安装即用,离线环境照常运行。
- 不区分免费版 / 高级版,买到的就是完整功能(三个维度 + PAPI + 面板)。
- 插件未做任何混淆,欢迎安全审查。
获取作者帮助
| 途径 | 内容 |
| 交流群 | QQ 群 1124248111 |
| 作者 QQ | 2221899680 |
| 游戏内 | 输入 /rptpr help 查看全部指令与说明 |
使用教程
安装
- 把
RptPlaytimeReward-1.0.0.jar放进服务端plugins/目录。 - (可选)想用变量就装 PlaceholderAPI。
- 重启服务端(换 jar / 新装插件不支持热加载)。
- 首次启动会生成
plugins/RptPlaytimeReward/下的config.yml(存储 / 计时 / 重置 / 消息)+gui.yml(三个维度的界面与奖励档位)+playtime.db(数据)。
★ 默认配置里的档位是示例,奖励发的是原版物品,请按自己服务器的经济与玩法改。 - 改完
config.yml或gui.yml执行/rptpr reload生效,不需要重启服务端。
指令列表
| 指令 | 权限 | 说明 |
/rptpr daily | rptpr.use | 打开【每日】奖励界面 |
/rptpr monthly | rptpr.use | 打开【每月】奖励界面 |
/rptpr total | rptpr.use | 打开【总计】奖励界面 |
/rptpr menu | rptpr.use | 打开第一个已启用的维度界面(等价于该维度的指令) |
/rptpr time | rptpr.use | 查看自己的三个维度在线时长 |
/rptpr time <玩家> | rptpr.admin | 查看某人的在线时长 |
/rptpr reset <玩家> <维度> | rptpr.admin | 把某人的某个维度清零(daily / monthly / total) |
/rptpr help | 免权限 | 显示指令帮助 |
/rptpr reload | rptpr.admin | 重载 config.yml 与 gui.yml |
权限节点
| 权限 | 默认值 | 说明 |
rptpr.use | 仅 OP | 打开面板、领取奖励、查自己的时长 |
rptpr.admin | 仅 OP | 查任意玩家时长 / 清零 / 重载 |
| (档位自带) | — | 每个档位可写 permission,作为领取门槛(例如只让 VIP 领某一档) |
主要配置项
config.yml(存储 / 计时 / 重置时刻 / 消息)| 配置项 | 默认值 | 说明 |
storage.database-file | playtime.db | SQLite 数据文件名 |
storage.save-interval-seconds | 60 | 内存时长落库间隔(秒) |
storage.keep-claims-days | 90 | 过期领取记录保留天数(总累计记录永久保留) |
reset.daily-at | "00:00" | 每日清零时刻(支持非 0 点,如 04:00) |
reset.monthly-day | 1 | 每月几号清零 |
count.step-seconds | 10 | 计时步长(秒) |
messages.* | 见默认文件 | 全部提示文案,支持 MiniMessage |
gui.yml(三个维度的界面 + 奖励档位)| 配置项 | 默认值 | 说明 |
daily / monthly / total | 见默认文件 | 三个维度的独立界面配置,每段含 enabled / title / rows / layout / icons / status / reward |
维度界面字段(
gui.yml 的 <维度> 段下):| 字段 | 说明 |
enabled | 是否启用该界面(true / false,默认 true)。关掉后指令提示"该维度已关闭",档位也不发放 |
display-name | 维度显示名(消息里的 <scope> 用,如「每日」) |
title / rows | 该界面的标题 / 行数(1~6) |
layout | 字符矩阵:每行 9 个字符,字符含义由 icons / reward 定义;空格 = 留空 |
icons.<字符> | 普通图标:material / name / lore / action: close(可写 slot 定位,或直接用字符) |
status.<状态> | 三种领取状态的图标与文字:unavailable / available / taken,各有 icon 与 name |
reward.<字符> | 奖励档位:material(可写 %icon% 按状态换图标)/ name / lore / time(需要分钟)/ permission / commands |
档位字段(
reward.<字符> 下):| 字段 | 说明 |
time | 该维度累计到多少分钟可领(必填) |
material | 图标材质。写 %icon% 时按领取状态自动换(取自 status.<状态>.icon) |
name | 条目名称(支持 MiniMessage 与 &a 旧式颜色) |
lore | 说明行(可选) |
permission | 可选:领取需要的权限 |
commands | 领取后执行的指令:console: 控制台指令 / message: 发给玩家;%player% 替换为玩家名 |
档位里可用的占位符(写在
name / lore,以及 messages 的领取提示里):| 占位符 | 含义 |
%minutes% | 该档需要多少分钟(如 60) |
%status% | 当前状态文字(不可领取 / 点击领取 / 已领取,取自 status.<状态>.name) |
<current> / <required> / <percent> | 当前时长 / 需要时长 / 进度百分比 |
<player> / <scope> / <name> | 玩家名 / 维度名 / 档位名 |
常见问题
- 时长为什么是 10 秒的倍数? 因为计时按
count.step-seconds走(默认 10 秒加一次)。想要更细就把它调小。 - 玩家改电脑时间有用吗? 没用。计时完全由服务端 tick 驱动,跟客户端时钟无关。
- 每日 / 每月几点重置? 由
reset.daily-at(默认00:00,可以设成04:00这种非零点)和reset.monthly-day决定。 - 三个界面能互相跳转吗? 不能,也没有主菜单 —— 这是刻意的设计:
/rptpr daily、/rptpr monthly、/rptpr total各开各的,互不干扰。 - 界面怎么改? 改
gui.yml对应维度的layout:一个字一个格子,字符是icons里的图标还是reward里的档位你说了算,改完/rptpr reload。 - 只想开其中一两个维度? 把不想开的那个设
enabled: false就行,时长照样统计,随时改回true立刻恢复。 - 奖励发什么? 你在档位的
commands里写指令。发物品give %player% diamond 1、给钱eco give %player% 100(需装 Vault 经济)、发称号就写你们服的称号指令。 - 能只让 VIP 领某一档吗? 能,给那一档写
permission。 - 图标为什么有的瓶子有的玻璃瓶? 这是领取状态自动换的:没领的是附魔瓶、领过的是玻璃瓶。想换别的材质,改
status.<状态>.icon即可。 - 会不会重复领? 不会。每档每天/每月只能领一次,总累计档位一辈子一次(按"档位 + 周期"记录)。
- PAPI 变量有哪些? 见上面「对外暴露 PAPI 变量」一节;没装 PlaceholderAPI 就没有这些变量,但插件本体不受影响。
- 数据在哪、怎么备份?
plugins/RptPlaytimeReward/playtime.db,复制该文件即可备份全部时长与领取记录。 - 想给某个玩家清零重来?
/rptpr reset <玩家> daily|monthly|total。
声明
- 本插件为原创作品,保留所有权利,默认不允许转载与整合。如需转载或整合进服务端整合包,请先通过上方交流群或作者 QQ 联系获取授权。
- 本插件未使用任何混淆手段,欢迎安全审查。
- 本插件不含任何后门、病毒或远程控制代码,不含任何联网校验,所有数据仅保存在服务器本地
plugins/RptPlaytimeReward/目录中。