Temporary Dimension
概览
Temporary Dimension 会把玩家送入模板世界的一个全新副本。该副本在玩家进入时从 Advanced SlimeWorld 模板创建,只存在于内存中,并在玩家离开后立即卸载,因此每次访问都从模板开始。它适用于不应被共享或保留的地下城、教程、私人房间和过场动画场景。
你只需用一个 Temporary Dimension Definition 条目描述一次维度:模板世界(会随机选择一个)、玩家出现的区域、进入所需的权限、被禁用的命令,以及进入和离开时要触发的内容。玩家通过命令、TypeWriter 动作或管理员命令进入,并回到他们离开的确切位置。
它运行于 TypeWriter 的 BTC 构建版本和 BTC Core(Paper/Folia),同时也支持 AdvancedSlimePaper 服务器。创建、出生点搜索和传送都是异步的,并且兼容 Folia。
功能
- 实例世界 — 每个条目都会从模板创建一个名为
tempdim_<uuid>的新世界,并在其为空时将其删除。 - 多个模板 — 列出多个模板世界,随机选取其中一个。
- 安全的随机出生点 — 在一个方框内随机取点,然后在其中心周围搜索,只接受实心且无危险的方块上方的空气。
- 出生方块白名单 — 将出生限制在选定的方块类型上。
- 命令黑名单 — 在内部时禁用命令(及其
plugin:形式)。 - 返回原点 — 玩家会回到他们离开时所在的位置、朝向和世界。
- 进入与离开触发器 — 在进入和离开时运行任意 TypeWriter 条目并发送 MiniMessage 消息。
- 按维度设置权限 — 每个维度一个权限,由命令检查,也可由动作选择性地检查。
- 事实与占位符 — 得知玩家是否处于某个维度、是哪一个,以及还有谁在其中。
安装
- 在 BTC Core 或 AdvancedSlimePaper 上运行服务器;扩展会在运行时寻找其中之一。
- 将 Temporary Dimension 的 JAR 放入
plugins/Typewriter/extensions/并重启服务器。 - 将你的模板世界准备为 Slime 世界:
- 在 BTC Core 上,将它们放在
fileSlime 加载器读取世界的位置(默认为服务器文件夹中的slime_worlds)。 - 在 AdvancedSlimePaper 上,模板必须是一个已加载的、模板名称完全一致的 Slime 世界;它是从内存中复制的。
- 在 BTC Core 上,将它们放在
- 将你在维度上设置的权限授予玩家。
快速上手
创建一个玩家可以通过 /typewriter tempdim dungeon1 进入的地下城。
- 将你的地下城构建为名为
dungeon1_template的 Slime 世界,并将其放在你的服务器预期存放模板的位置(见上文)。 - 在 TypeWriter 网页面板中,打开一个**静态(static)**页面,添加一个 Temporary Dimension Definition 条目。
- 将
commandName设为dungeon1,permission设为dimension.dungeon1,并将dungeon1_template添加到templateWorlds。 - 将
spawnZone设置为入口周围的两个对角(x1、y1、z1和x2、y2、z2)。请使用模板世界的方块坐标。 - 可选:填写
blacklistedCommands(例如home、spawn、tpa),并在onEnter和onExit中链接触发器。 - 发布,授予测试玩家该权限,并运行
/typewriter tempdim dungeon1。
若要改为通过任务或 NPC 进入,请使用 Enter Temporary Dimension,并使用 Leave Temporary Dimension 来离开。
维度命令是 /typewriter tempdim 的子命令;扩展不会注册顶层命令。可以通过在你的页面上添加 TypeWriter 的 custom_command 条目来提供 /dungeon1 之类的短命令,这样可以保证命令注册在重载时是安全的。
工作原理
一位玩家同一时间只能处于一个临时维度中。如果创建失败(没有模板、找不到模板、10 秒内没有找到安全的出生点、传送失败),玩家会留在原地,收到一条错误消息,并且未完成的世界会被移除。如果玩家断线,他会在不传送的情况下被移出实例,并且世界在其为空时被关闭。每当 TypeWriter 重载或停止时,所有实例都会被关闭。
命令
所有命令都位于 /typewriter 之下。
| 命令 | 说明 |
|---|---|
/typewriter tempdim <commandName> | 进入 commandName 匹配的维度。需要该维度的 permission(为空表示对所有人开放)。 |
/typewriter tempdim enter <dimension> | 进入从条目列表中选择的任意维度,忽略其权限。需要 typewriter.temporarydimension.admin。 |
/typewriter tempdim leave | 离开你当前的维度并回到你的原点。不需要权限。 |
/typewriter tempdim list | 列出处于活动状态的实例及其玩家数量和世界名称。需要 typewriter.temporarydimension.admin。 |
commandName 只接受字母、数字、_、- 和 :,并且不能是 enter、leave 或 list。命令是在条目加载时构建的,因此更改后请重新发布。
权限
| 权限 | 授予 |
|---|---|
typewriter.temporarydimension.admin | /typewriter tempdim enter 和 /typewriter tempdim list。 |
定义的 permission 字段 | /typewriter tempdim <commandName>,以及在开启 checkPermission 时的进入动作。 |
占位符
MiniPlaceholders 扩展 tempdim,可作为 MiniMessage 标签使用。当玩家不在某个维度中时,它们返回空值或 0/false。
| 占位符 | 返回 |
|---|---|
<tempdim_in_dimension> | true 或 false。 |
<tempdim_in_dimension_bool> | 1 或 0,用于数值比较。 |
<tempdim_current> | 当前维度的条目名称。 |
<tempdim_current_id> | 当前维度的条目 id。 |
<tempdim_current_world> | 实例的世界名称(tempdim_...)。 |
<tempdim_players> | 实例中的玩家数量。 |
<tempdim_players_list> | 实例中的玩家名称,以逗号分隔。 |
在定义的消息中,<dimension> 会被替换为条目名称,被禁用命令消息中的 <command> 会被替换为被禁用的命令。
条目
5 个条目,由扩展源码生成。
动作2
- Enter Temporary Dimension ActionEnter a temporary dimension
- Leave Temporary Dimension ActionLeave current temporary dimension
事实2
- In Specific Dimension FactCheck if player is in a specific dimension
- In Temporary Dimension FactCheck if player is in a temporary dimension
清单1
- Temporary DimensionTemporary Dimension Definition
故障排查
Unable to prepare the temporary dimension. 无法克隆模板。请对照 Slime 世界名称检查 templateWorlds 中的模板名称,检查该世界是否位于 slime_worlds(BTC Core)或已加载(AdvancedSlimePaper),并阅读日志中的警告以了解原因。在既不是 BTC Core 也不是 AdvancedSlimePaper 的服务器上,日志会显示 unsupported server platform for SlimeWorld。
没有任何反应,且日志显示 no template configured。 templateWorlds 为空,或只包含空白名称。
No safe spawn was found in the temporary dimension. 在测试的点中,没有任何一个点的实心方块(不是岩浆、火、仙人掌或岩浆块)上方有两格空气。请扩大 spawnZone,确保它覆盖了模板中的实心地面(包括 Y 轴),并检查 spawnBlockWhitelist 是否包含地面的方块。
You are already in a temporary dimension. 玩家同一时间只能处于一个实例中。请先使用离开命令或动作。
某个命令在维度内仍然有效。 请在 blacklistedCommands 中写入不带斜杠的命令名。匹配基于第一个单词,不区分大小写,同时也会阻止 name:command 形式,但不会阻止以其他名称注册的别名。
编辑后维度命令不存在。 维度命令是由条目生成的:请发布页面,并检查 commandName 只使用了允许的字符,并且没有与其他维度冲突。