- 版权类型
- 原创
- 插件中文名称
- RPT建筑迁移器
- 插件英文名称
- RptStructure
- 原帖地址
- #
- 支持的核心(服务端)
- Paper
- Folia
- 语言支持
- 中文(简体)
- 适配版本(Java)
- 26.x
- 1.21
关于这个插件
RptStructure 是给服主 / 管理员用的巨型建筑搬迁工具。要做的事很简单:在游戏里把一片区域框起来 → 存成一座"建筑" → 走到新位置打印出来。听起来像 WorldEdit 的 schematic,但它解决的是另一个维度的问题 —— 大。
原版
.nbt 结构方块和大多数结构插件在遇到"一座上百格见方的主城"时只有两种命运:要么卡服(一次性几百上千万个方块挤在同一个 tick 里),要么直接内存溢出。RptStructure 的做法是把建筑按区块切成很多小片:每一片的横截面固定是一个区块(16×16),纵向再按 48 格分层。切完之后一片一片地处理,每片单独加载区块、单独读写,所以再大的建筑也只是"慢一点",不会把服务端拖死,也完全适配 Folia 这种区域多线程核心。还有一个服主才会懂的点:打印之前会先把落点的原地形备份下来。建筑铺下去之后发现位置偏了、朝向错了、或者干脆铺错了世界 —— 点一下「撤销」,那一整片原地形会原样恢复。不需要提前手动 //copy 备份,也不需要回滚整个存档。
功能说明
1. 一个界面,管全部操作
输入/rptsm(或 /structuremigrator)打开建筑迁移界面。界面里一共 7 个按钮 + 1 张状态牌:| 你想干的事 | 按钮 | 做什么 |
| 设置选区点 1 | 点 1 | 把你脚下这一格设为角点 1 |
| 设置选区点 2 | 点 2 | 把你脚下这一格设为角点 2 |
| 重置选区 | 重置 | 清掉两个点,同时关掉线框与预览 |
| 保存建筑 | 保存 | 把选区里的建筑存下来(点击后在聊天栏输入名字) |
| 预览建筑 | 预览 | 在你脚下画出这座建筑将要占的范围(绿色线框) |
| 加载 / 打印建筑 | 加载 | 把建筑打印到当前位置(点击后在聊天栏输入名字) |
| 撤销上次加载 | 撤销 | 把上一次打印前备份的原地形恢复回去 |
- ★ 两个点都设好之后,会有一条青色粒子线框把选区框出来,一眼就能确认自己选对了没有。
- ★ 「预览」和「加载」是一对:先点预览,你会看到这座建筑要占多大一块;确认没问题,直接点加载,它就正好落在你刚才预览的位置(不需要再走一遍)。
- ★ 界面里所有点击与拖拽都被拦下,图标拿不走、也塞不进东西。
- ★ 界面中间那张状态牌随时告诉你:两个点设了没、选区多大、当前在忙还是空闲、撤销备份还能不能用、这座服务器上一共存了哪几座建筑。
- ★ 命令只有三条:
/rptsm(开界面)、/rptsm reload(管理员重载配置)、/rptsm help(帮助)。打错的子命令会直接打开界面,不会让管理员卡在"没有这个命令"上。
2. 为什么大建筑不会卡服
这是本插件的核心,值得单独说一段。① 按区块分片。 一座建筑的选区会被切成若干小片:横向严格压在单个区块(16×16)内,纵向每 48 格一层。这样每一个分片只归属一个区域(region) —— 在 Folia 这种把世界切成多个区域、每区域独立线程的核心上,"读这片方块、写这片方块"就永远只发生在同一条线程上,天然满足线程归属要求,不需要任何跨区域加锁。
② 一片一片来,而且严格按顺序。 分片不是一股脑全丢出去,而是"加载这一片的区块 → 处理完 → 再处理下一片"。
③ 按从下往上放。 打印建筑时,分片按 Y 从低到高排序。这一点很关键:如果从上往下放,一座有沙子和砾石的建筑,上半部分会先掉下来散掉。从下往上就完全没有这个问题。撤销时反过来从上往下放回,同样是刻意的。
④ 文件读写完全不占用服务器线程。 每一片在"读世界方块"和"写文件"之间是完全分开的两步,读写
.nbt 文件全程在插件自己的独立线程上跑,服务器区域线程只负责搬方块。所以即便你在打印一座超大型建筑,玩家该跑图跑图、该打架打架,不会被拖成幻灯片。3. 打印前自动备份,随时可撤销
- 点「加载」之后,插件先把落点那一片原地形完整备份下来(备份成同样的分片格式,存到
plugins/RptStructure/structures/_undo_<你的UUID>/)。 - ★ 只有备份完整成功,才会开始动世界。备份中途出任何问题都会取消加载并提示你,原地形一个方块都不动。
- 备份就绪之后才开始打印。打印完如果发现位置不对,回界面点「撤销」即可 —— 它会按原位置把备份从上往下打印回去,然后删掉这份备份。
- ★ 撤销记录是持久化的:就算中途重启了服务端,只要还没撤销过,回来照样能点撤销。不会出现"备份还在但撤销按钮没反应"的情况。
- 备份是每个管理员各一份的,互不干扰。
- 如果你在
config.yml里把undo.enabled关掉,「加载」按钮会直接拒绝执行并说明原因 —— 因为加载前必须能备份才能撤销,关掉备份等于放下去就回不了头。
4. 保存是"两阶段"的,不会把旧建筑弄坏
- 保存 / 覆盖一座同名建筑时,插件会先把所有新分片写进
.tmp临时文件; - 全部写成功之后,才统一改名替换成正式文件;
- 只要中途有任何一片失败,临时文件会被清掉,原来的旧数据一个字节都不动,并提示"保存失败,已保留原有数据"。
5. 输入建筑名不会打扰别人
点「保存 / 预览 / 加载」之后,界面会关闭,聊天栏提示你输入建筑名。- ★ 这个名字绝对不会发出去:插件用了两道保险(取消聊天事件 + 清空这条消息的收件人列表),所以这句话不会出现在任何人的聊天栏、不会进控制台日志,连你自己也看不到。
- 输入
cancel或取消可以放弃,默认 60 秒没输入会自动作废(可在config.yml调整)—— 作废之后你正常聊天不会被当成建筑名。 - 默认建筑名只允许字母 / 数字 / 下划线 / 短横线,最多 32 位(可在
config.yml改正则,想支持中文就改structure.name-regex)。
6. 数据存在哪、什么格式
- 全部数据就是文件:
plugins/RptStructure/structures/<建筑名>/下一堆.nbt分片。 - ★ 没有数据库、没有外部依赖,不需要装 MySQL,也不需要任何前置插件。
- ★
.nbt是原版结构格式 —— 用原版结构方块或其它工具能直接读;想手工搬服务器,把structures/目录整个拷走即可。 - 撤销位置记录在
plugins/RptStructure/undo.yml(很小的一行一个玩家)。
支持版本与环境
| 项目 | 说明 |
| Minecraft 版本 | 1.21 ~ 26.3(同一个 jar 跨版本,字节码目标 Java 21) |
| 服务端核心 | Folia、Paper(已声明 folia-supported: true) |
| Java 运行环境 | Java 21 及以上 |
| 前置插件 | 无 —— 不需要 WorldEdit、不需要 Vault、不需要任何经济/权限插件(权限可选用 LuckPerms 之类的权限插件分配) |
| 数据库 | 无,数据就是 .nbt 文件 |
| 编译基线 | dev.folia:folia-api:26.2.build.1-beta |
目标用户
- 要搬迁主城 / 大型建筑的服主 —— 这是本插件唯一的目标场景,也是它存在的理由。
- 用 Folia 核心的服主 —— 结构类操作在 Folia 上是最容易踩"跨区域碰方块"红线的一类功能。本插件从设计上就把分片边界钉在区块上,天生安全。
- 被"粘贴大建筑把服务器卡死"搞怕过的服主 —— 分片 + 顺序处理 + 文件 IO 完全离线程,就是冲着这个来的。
- 经常"铺完发现铺错位置"的人 —— 打印前自动备份 + 一键撤销,不用再手动
//undo。
是否付费
付费插件。 具体定价与授权方式以资源页「售价」项为准。- 插件不含任何联网校验、授权服务器或机器绑定,购买后安装即用,离线环境照常运行。
- 不区分免费版 / 高级版,买到的就是完整功能 —— 所有功能(含撤销)都在同一个 jar 里,没有任何功能被阉割。
- 插件未做任何混淆,欢迎安全审查。
获取作者帮助
| 途径 | 内容 |
| 交流群 | QQ 群 1124248111 |
| 作者 QQ | 2221899680 |
| 游戏内 | 输入 /rptsm help 查看说明 |
使用教程
安装
- 把
RptStructure-1.0.0.jar放进服务端plugins/目录。 - 重启服务端(新装插件不支持热加载)。
- 首次启动会生成
plugins/RptStructure/config.yml、gui.yml与structures/目录,默认配置开箱可用。 - 按需修改
config.yml(运行规则)与gui.yml(界面),然后执行/rptsm reload生效,不需要重启服务端。
指令列表
★ 全部功能都在界面里,所以这里只有三条:| 指令 | 权限 | 说明 |
/rptsm | rptsm.use | 打开建筑迁移界面(所有操作都在界面里) |
/rptsm help | 免权限 | 显示指令帮助 |
/rptsm reload | rptsm.admin | 重载 config.yml + gui.yml |
权限节点
| 权限 | 默认值 | 说明 |
rptsm.use | 仅 OP | 打开界面并使用全部功能(设点 / 保存 / 预览 / 加载 / 撤销) |
rptsm.admin | 仅 OP | 重载配置 |
主要配置项(config.yml)
| 配置项 | 默认值 | 说明 |
structure.root-folder | structures | 建筑数据根目录(每座建筑一个子目录) |
structure.name-regex | 字母/数字/下划线/短横线/中文 | 建筑名允许的字符(正则)。 |
structure.name-max-length | 32 | 建筑名长度上限 |
structure.y-band-size | 48 | 纵向分带高度。调小 = 分片更多更平滑,调大 = 分片更少单次更重 |
structure.input-timeout-seconds | 60 | 等管理员在聊天栏输入建筑名的超时(秒) |
particle.selection-color / .preview-color | AQUA / LIME | 选区线框 / 预览线框的颜色 |
particle.size | 1.5 | 粒子大小 |
particle.interval-ticks | 10 | 重画间隔(tick),调大能省客户端性能 |
undo.enabled | true | 关掉之后禁止加载(因为加载必须能备份才能撤销) |
messages.* | 见默认文件 | 全部提示文案,支持 MiniMessage |
界面配置(gui.yml,独立文件)
界面相关的一切都在plugins/RptStructure/gui.yml 里,不在 config.yml:| 配置项 | 说明 |
title / rows | 界面标题 / 行数(1~6 行) |
filler | 填充物(材质、名字) |
layout | ★ 字符矩阵布局:每行一个 9 字符的字符串。空格 = 留空,# = 填充物,其它字符由装饰格的 symbol 认领 |
decorations.<键> | 每个按钮/展示格的 symbol 或 slot、material、name、lore,以及 action(pos1 / pos2 / reset / save / preview / load / undo / close) |
texts | 状态牌上"没数据时"的占位文本 |
常见问题
- 保存时覆盖了同名建筑,旧的那座还在吗? 不在了(同名即覆盖),但覆盖过程是两阶段的 —— 新数据全部写成功才替换,失败会原样保留旧建筑。
- 为什么「加载」点不了 / 说自己没权限? 加载要求
undo.enabled: true(默认就是开的)。如果是关掉的,加载会被直接拒绝 —— 因为加载前必须能备份才能撤销。 - 撤销只能撤一次吗? 是。每个管理员只保留上一次加载的备份(备份就是那一整片原地形,已经很大了,保留多份不现实)。撤销成功后备份即删除。
- 服务器崩溃 / 重启了,还能撤销吗? 能。撤销位置是落盘保存的,只要还没撤销过,重启回来照样点得动。
- 打印到一半服务器关了会怎样? 建筑只铺了一部分,但备份是完整的(备份在打印之前就已经落盘了)。重启后点「撤销」即可把那一整片恢复原状。
- 能撤销「保存」吗? 不能,也不影响世界 —— 保存只是读方块存成文件,从不修改世界。
- 多个人同时操作会不会打架? 每个管理员有独立的选区和独立的撤销备份,互不影响。同一个人连点会被拦下("上一个操作还没完成"),不会出现两次操作叠在一起。
- 建筑存在哪?怎么备份服务器?
plugins/RptStructure/structures/<建筑名>/。整个目录拷走就行 —— 它就是一堆标准.nbt。 - 能搬到别的服务器吗? 能。把
structures/<建筑名>/整个目录拷到目标服务器的同路径下,/rptsm reload(或重启)后就能直接加载。 - 和原版结构方块 / WorldEdit 兼容吗? 文件本身是原版结构格式,可以用原版结构方块的工具读取;但本插件不做
schem一类格式的导入导出,也不提供建造/编辑功能。 - 超大建筑大概要多久? 取决于分片数量和磁盘速度。建议先用「预览」确认范围再加载;打印过程中界面不会卡死,你可以照常走动,完成后会收到提示。
声明
- 本插件为原创作品,保留所有权利,默认不允许转载与整合。如需转载或整合进服务端整合包,请先通过上方交流群或作者 QQ 联系获取授权。
- 本插件未使用任何混淆手段,欢迎安全审查。
- 本插件不含任何后门、病毒或远程控制代码,不含任何联网校验,所有数据仅保存在服务器本地
plugins/RptStructure/目录中。