- 版权类型
- 原创
- 插件中文名称
- 镜子
- 插件英文名称
- Mirrora
- 支持的核心(服务端)
- Paper
- Purpur
- Leaves
- 其他核心
- 语言支持
- 多语言
- 前置组件
- packetevents(必须)
- 适配版本(Java)
- 最新版本
- 26.x
- 1.21
[MD] # Mirrora 在 Minecraft 服务器里创建真实的镜子,玩家站到镜子前,能看到自己(以及其他所有在场玩家)的实时镜像,包括姿态、装备、朝向和挥手动作。 如果在使用中遇到问题或者想一起交流,欢迎加入 `1104261361` 群聊。 --- ## 效果 - 镜子是世界里固定存在的一整片矩形区域,贴在墙上,重启服务器后依然存在。 - 只有站在镜子**正面**、且落在选定的矩形范围与生效深度内的玩家才会被反射。走出范围或绕到镜子背面,镜像会立刻消失。 - 同一时间站在镜子范围内的所有玩家都能互相看到对方(以及自己)的镜像。 - 镜像会实时同步位置、朝向、姿态(站立/蹲伏/游泳等)、装备、主副手挥动动作、举手状态(吃东西/喝药/格挡/拉弓)。 - 镜子仅对区域内的玩家客户端可见,区域外的玩家不会收到任何相关数据包,不会看到镜子背后有个玩家实体。 - (可选)镜子还能反射玩家这一侧的方块,包括楼梯、箱子、告示牌等带朝向的方块,效果就像照镜子看到身后的场景一样。 --- ## 实现原理 利用 1.21.9+ 新增的 `mannequin` 实体作为镜像载体,通过 [packetevents](https://github.com/retrooper/packetevents) 直接向客户端发送实体数据包,不在服务端创建任何真实实体,也不依赖客户端资源包或模组。 镜像的坐标是玩家位置关于镜面所在平面做反射计算得出的,只反转垂直于墙面的那个水平坐标轴,朝向做镜像翻转,姿态和装备直接复制。 方块反射的原理类似:定期扫描镜面前(玩家所在一侧)与镜子范围/深度一致的方块区域,将每个方块的坐标和朝向按同样的规则镜像后,通过 `BlockChange` 数据包伪造发送给区域内的观察者,使其看起来像是镜子里的反射;方块变化会低频轮询同步,观察者离开区域后会立即恢复为真实方块状态。这套机制不会在服务端实际改变任何方块,纯粹是发给客户端的视觉欺骗。 ## 方块反射(可选功能) 启用后,镜子会把玩家所在一侧、与镜子矩形范围及深度一致的方块也反射到镜子内,效果和照镜子看到身后的家具、墙面一样: - 支持带朝向的方块(楼梯、箱子、炉子、门、告示牌、生物头颅等),镜像时会自动翻转朝向。 - 方块反射的刷新频率独立于玩家反射,默认较低(20 tick 一次),因为方块变化没有玩家动作那么频繁。 - 可以设置方块探测范围的膨胀格数,让反射范围比镜子本身的矩形更大(仅膨胀宽度/高度方向,不影响深度)。 - 出于性能考虑,单个镜子反射的方块总数有上限,超过上限会跳过该镜子的方块反射(不影响玩家镜像)。 - 该功能默认关闭,需要在配置文件中手动开启。 --- ## 配置 ```yaml # 语言 language: zh_cn mirror: # 创建镜子时未指定深度时使用的默认值(格) default-depth: 8.0 # 深度允许设置的最大值(格) max-depth: 32.0 # 反射刷新间隔(tick),数值越小越流畅,但开销越大 tick-interval: 1 wand: # 选区工具使用的物品材质 material: BLAZE_ROD ``` --- ## 依赖 - [Paper](https://papermc.io/) 1.21.9 或更高版本(依赖 `mannequin` 实体,需要 1.21.9+ 的服务端核心与客户端) - [packetevents](https://github.com/retrooper/packetevents) 2.13.0 或更高版本(必须) --- ## 安装 1. 安装 packetevents 前置插件到 `plugins/` 目录。 2. 将编译好的 `Mirrora.jar` 放入 `plugins/` 目录。 3. 启动服务器。 --- ## 使用方法 创建镜子需要 `mirrora.admin` 权限,普通玩家使用镜子(站到镜子前看到镜像)不需要任何权限。 ### 1. 获取选区工具 `/mirror wand` 获得一把 "镜子选区工具",用于框选一片墙面作为镜子的范围。 ### 2. 选取两个点 拿着选区工具: - **左键** 点击墙面上的一个方块,作为选点 1 - **右键** 点击墙面上的另一个方块,作为选点 2 两个点必须点在**同一朝向**的墙面上(比如都点在朝北的墙上),否则无法创建镜子。两点之间围成的矩形就是镜子的范围。 ### 3. 创建镜子 `/mirror create <id> [深度]` - `id`:镜子的唯一标识,用于之后管理(删除、查看列表) - `深度`(可选):镜子正面生效的距离,单位为格,默认 8,最大 32。玩家必须站在这个距离以内才能看到/被反射。 示例: `/mirror create test-mirror 6` ### 4. 管理镜子 ```yaml /mirror list # 列出所有已创建的镜子 /mirror remove <id> # 移除指定镜子 ``` --- ## 命令与权限 | 命令 | 说明 | 所需权限 | | --- | --- | --- | | `/mirror wand` | 获取选区工具 | `mirrora.admin` | | `/mirror create <id> [深度]` | 用当前选区创建镜子 | `mirrora.admin` | | `/mirror remove <id>` | 移除指定镜子 | `mirrora.admin` | | `/mirror list` | 列出所有镜子 | `mirrora.admin` | | 权限节点 | 说明 | 默认值 | | --- | --- | --- | | `mirrora.admin` | 允许创建、移除、管理镜子区域 | `op` | 镜子创建完成后,任何玩家站到镜子范围内都能看到镜像,不需要额外权限。 [/MD]