Skip to content

Null-K/Mirrora

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Mirrora [English]

在 Minecraft 服务器里创建真实的镜子,玩家站到镜子前,能看到自己(以及其他所有在场玩家)的实时镜像,包括姿态、装备、朝向和挥手动作。

如果在使用中遇到问题或者想一起交流,欢迎加入 1104261361 群聊。

效果

  • 镜子是世界里固定存在的一整片矩形区域,贴在墙上,重启服务器后依然存在。
  • 只有站在镜子正面、且落在选定的矩形范围与生效深度内的玩家才会被反射。走出范围或绕到镜子背面,镜像会立刻消失。
  • 同一时间站在镜子范围内的所有玩家都能互相看到对方(以及自己)的镜像。
  • 镜像会实时同步位置、朝向、姿态(站立/蹲伏/游泳等)、装备、主副手挥动动作、举手状态(吃东西/喝药/格挡/拉弓)。
  • 镜子仅对区域内的玩家客户端可见,区域外的玩家不会收到任何相关数据包,不会看到镜子背后有个玩家实体。
  • (可选)镜子还能反射玩家这一侧的方块,包括楼梯、箱子、告示牌等带朝向的方块,效果就像照镜子看到身后的场景一样。

实现原理

利用 1.21.9+ 新增的 mannequin 实体作为镜像载体,通过 packetevents 直接向客户端发送实体数据包,不在服务端创建任何真实实体,也不依赖客户端资源包或模组。

镜像的坐标是玩家位置关于镜面所在平面做反射计算得出的,只反转垂直于墙面的那个水平坐标轴,朝向做镜像翻转,姿态和装备直接复制。

方块反射的原理类似:定期扫描镜面前(玩家所在一侧)与镜子范围/深度一致的方块区域,将每个方块的坐标和朝向按同样的规则镜像后,通过 BlockChange 数据包伪造发送给区域内的观察者,使其看起来像是镜子里的反射;方块变化会低频轮询同步,观察者离开区域后会立即恢复为真实方块状态。这套机制不会在服务端实际改变任何方块,纯粹是发给客户端的视觉欺骗。

方块反射(可选功能)

启用后,镜子会把玩家所在一侧、与镜子矩形范围及深度一致的方块也反射到镜子内,效果和照镜子看到身后的家具、墙面一样:

  • 支持带朝向的方块(楼梯、箱子、炉子、门、告示牌、生物头颅等),镜像时会自动翻转朝向。
  • 方块反射的刷新频率独立于玩家反射,默认较低(20 tick 一次),因为方块变化没有玩家动作那么频繁。
  • 可以设置方块探测范围的膨胀格数,让反射范围比镜子本身的矩形更大(仅膨胀宽度/高度方向,不影响深度)。
  • 出于性能考虑,单个镜子反射的方块总数有上限,超过上限会跳过该镜子的方块反射(不影响玩家镜像)。
  • 该功能默认关闭,需要在配置文件中手动开启。

配置

# 语言
language: zh_cn

mirror:
  # 创建镜子时未指定深度时使用的默认值(格)
  default-depth: 8.0

  # 深度允许设置的最大值(格)
  max-depth: 32.0

  # 反射刷新间隔(tick),数值越小越流畅,但开销越大
  tick-interval: 1

  block-reflection:
    # 是否启用方块反射(镜面前方块范围与镜子范围/深度一致)
    enabled: false

    # 方块反射刷新间隔(tick),建议远大于 mirror.tick-interval,因为方块变化频率低
    tick-interval: 20

    # 单个镜子允许反射的最大方块数量,超过该数量的镜子将跳过方块反射
    max-blocks: 4096

    # 方块探测范围在镜子宽度/高度方向各自向外膨胀的格数(不影响深度)
    expand: 0

wand:
  # 选区工具使用的物品材质
  material: BLAZE_ROD

依赖

  • Paper 1.21.9 或更高版本(依赖 mannequin 实体,需要 1.21.9+ 的服务端核心与客户端)
  • 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. 管理镜子

/mirror list          # 列出所有已创建的镜子
/mirror remove <id>   # 移除指定镜子

命令与权限

命令 说明 所需权限
/mirror wand 获取选区工具 mirrora.admin
/mirror create <id> [深度] 用当前选区创建镜子 mirrora.admin
/mirror remove <id> 移除指定镜子 mirrora.admin
/mirror list 列出所有镜子 mirrora.admin
/mirror reload 重新加载配置文件 mirrora.admin
权限节点 说明 默认值
mirrora.admin 允许创建、移除、管理镜子区域 op

镜子创建完成后,任何玩家站到镜子范围内都能看到镜像,不需要额外权限。

数据存储

镜子的区域信息会保存在 plugins/Mirrora/mirrors.yml,插件启动时自动加载,创建/删除镜子时立即写入磁盘。

About

使用插件在 Minecraft 服务器里创建真实的镜子

Resources

License

Stars

16 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors

Languages