本项目为 MikuMC 服务器原创插件,公开给大众免费使用,MikuMC 服务器与作者 JunXieX 享有项目著作权,本项目非开源项目,请注意。
MikuMC 系列插件交流群:1105054380
MikuMC 服务器原创的 反矿透 + 带宽优化 双模块插件,适配 Paper 26.2+ / Folia,基于 Java 25。
一句话:让透视端看不到真矿,同时让服务端少发封包。
把埋在地下、玩家看不见的矿物与容器替换成普通方块后再发给客户端;等玩家真的走近、且真的能看见时,再还原成真实方块。
| 能力 | 说明 |
|---|---|
| 掩埋伪装 | 默认模式(all)会把所有看不见的目标方块替换掉(含暴露在洞穴里的矿脉——透视端最爱看的正是这些);也可切换为 enclosed,只伪装六面都被包住的方块。伪装方块按权重随机选取,支持按高度分层(深层深板岩、浅层石头),还能直接沿用「下方方块」让伪装更自然 |
| 按维度配置 | 主世界 / 地狱 / 末地各自配置「隐藏什么、伪装成什么、怎么伪装」;末地默认关闭。支持 tag(...) 写法(如 tag(diamond_ores) 自动展开为全部钻石矿) |
| 世界黑名单 / 逐世界覆盖 | 主城、副本等不想伪装也不想省带宽的世界加入独立文件 blacklist.yml 即可同时豁免反矿透与带宽优化;也可以只给某个世界单独覆盖反矿透设置 |
| 邻近显形 | 玩家靠近被伪装的位置时主动还原真实方块。还原前做视线判定——隔着墙、隔着地层绝不会提前亮出来;支持事件即时显形(挖开/炸开方块时当 tick 修复),显形包合并发送 |
| 视锥剔除 | 只处理玩家当前看得到的方向,省带宽;内建安全下限,「玩家看得见的方块一定是真的」是硬保证 |
| 磁盘缓存 | 改写结果落盘,重启后直接复用,省掉重复判定与编码;区块内容或配置变化会自动失效重写,磁盘异常自动降级为纯内存运行 |
| 引导绕过 | 持有 mikuxraynet.bypass 权限的玩家看到真实世界(方便管理员排查)。该权限在玩家进入服务器时判定一次,运行中授予/撤销需让玩家重新进入才生效 |
| 判定纠错 | 内置遮挡判定提供的「人工纠正表」,发现某方块被误判时填注册名即可修正 |
默认隐藏清单(可在配置里自由增删):主世界 16 种矿石 + 3 种粗金属块 + 箱子 + 刷怪笼 + 苔石;地狱为下界残骸 + 下界金矿 + 箱子 + 刷怪笼(默认不含地狱石英矿——分布广、价值低,藏了只会到处是假石头)。
在不改变玩家看到的内容的前提下减少封包数量与体积。
| 能力 | 说明 |
|---|---|
| 零位移包取消 | 纯位移包在位移全为 0 时直接不发(可白名单豁免盔甲架、展示框等);朝向包一律放行——朝向是绝对量化角,「全 0」是合法的正南/平视,按全 0 取消会导致客户端朝向不同步 |
| 方块变更合并 | 玩家周围短时间内的多条方块变更合并成一条批量包;挖掘/放置半径内原包立即放行,不影响手感 |
| 调色板位宽预算 | 防止「替换方块导致区块封包膨胀」,并顺带清理无用的调色板条目,多数情况下封包更小 |
| 实体剔除 | 剔除被墙完全挡住的实体,带强制可见距离兜底(玩家自身、其它玩家、烟花始终放行) |
| 视锥剔除 | 在「被墙挡住」之外,再剔除位于视野之外、且距离超过设定值的实体(玩家背后 / 侧后根本看不到的实体),连射线都省下;玩家转头后一个复检周期内自动补发。视锥数学与反矿透侧共用同一套,FOV 默认取客户端上限 110°,保证把 FOV 拉满也看不到被剔除的实体 |
| AFK 降级 | 挂机玩家按距离丢弃粒子与方块破坏动画等低价值包 |
| 高延迟降视距 | 延迟持续超标的玩家自动降低视距,恢复正常后还原 |
| 运行摘要 | 定时在控制台输出一行精简摘要,随时掌握省包情况 |
- 依赖
- PacketEvents 2.13.0+(必需):缺失时插件直接禁用。
- ProtocolLib 5.3.0+(必需):它是封包拦截通道;缺失时插件仍能加载,但反矿透与带宽优化停用,仅保留配置与命令,便于排查。
- 可选兼容:ViaVersion / ViaBackwards / Geyser-Spigot(自动识别加载顺序)。
- 运行环境:Paper 26.2+ 或 Folia 26.x,Java 25;不支持 Java 17 及以下。Folia 兼容(世界访问一律走区域调度器),且已在
paper-plugin.yml显式声明folia-supported: true。只支持 Paper 系核心(Paper / Leaf / Folia):jar 内只附带paper-plugin.yml,不再附带传统plugin.yml,纯 Bukkit/Spigot 核心无法加载本插件。 - 配置文件:首次启动自动生成
antixray.yml、bandwidth.yml与blacklist.yml(世界黑名单,对两个模块同时生效),全部带中文注释,按服主视角说明每项作用;改完执行/mikuxraynet reload即时生效(少部分项需重启,命令会提示)。 - 安全上下限:关键项都设了安全区间,配超范围会被自动钳制到安全值并在控制台提示一次。下限(例:视锥角度 110°、视锥豁免距离 16 格、降视距下限 6 格、磁盘缓存过期 1 天、实体视锥 FOV 30°)用来避免「玩家看得见假方块」或「看得到实体却被剔除」;上限(例:合并窗口 200ms、复检周期 40 tick、降视距幅度 4 格、邻近显形距离 128 格)用来避免手滑配出「明显延迟」或「拖慢服务器」的数值。
- 缓存会失效重建:修改隐藏清单、伪装方块、遮挡规则、
remove-block-entities、blacklist.yml的世界名单、bandwidth.yml的palette段(位宽预算 / 自检)、磁盘缓存的zstd-sha256等会改变改写结果的项,都会让磁盘缓存与内存缓存整体失效并自动重建一次;此外区块边界依赖的邻块贴边快照内容变化时,也会让对应条目自然失效重写。以上均属正常现象,之后命中率恢复。 - 磁盘缓存占用:默认上限 20000 条约占 200~600 MB;过期时间从写入时刻起算,应大于两次开服的间隔(默认 7 天)。要限制占用请调
max-entries/max-file-size-mb。另可用disk-cache.zstd-sha256对自动下载的压缩库做摘要校验(默认留空=不校验,但仍会打印实际 SHA-256 供你填入);若缓存目录被另一个服务端实例同时占用,本实例会自动停用「被占用文件」的磁盘缓存(只提示一次,功能不受影响)。 - 给主城减负:把主城 / 副本世界加入
blacklist.yml的world-blacklist,可同时跳过反矿透(省 CPU,也避免建筑被伪装)与带宽优化(不做实体剔除、变更合并等);也可只单独覆盖反矿透设置(antixray.yml的world-overrides),此时带宽优化照常工作。黑名单优先级高于world-overrides。 - 全程 fail-open:任何超时、队列积压或异常都会放行原包,绝不卡住玩家或客户端加载。
- 自带诊断:
/mxnet status查看完整统计,/mxnet dump导出诊断文件;状态里有「安全阀触发」计数,正常运营下应恒为 0,非 0 请带 dump 反馈。
- 原生封包改写,不碰 NMS:直接在出站区块封包上做纯字节级编解码(复用 Netty ByteBuf),服务端版本升级不需要改代码,也不会因为内部类变动而崩服。
- 真异步扣包,网络线程零计算:通过 ProtocolLib 的异步通道拦截封包,回调只登记任务后立即让出;解码、遮挡判定、重编码全部在自有线程池完成,并设有队列上限与处理超时——积压的结果是放行,而不是卡玩家。
- 前置只当「启动期字典」用:PacketEvents 仅在启动时构建方块状态位图(空气 / 流体 / 遮挡 / 伪装权重),此后热路径零引用,不给封包链路增加任何额外开销。
- 自研磁盘缓存格式:32×32 区块一个区域文件、一个区块一条独立追加记录(改 1 个区块只重压 1 条,不再重压整桶)+ zstd 压缩(服务端缺失时自动回退内置压缩,并支持自动下载与镜像源);每条负载携带「原始区块字节指纹 + 配置指纹 + 邻块快照内容指纹」多重校验,跨重启安全复用,内容、配置或邻块状态一变立刻自动重写。
- 内容指纹走硬件指令:区块内容指纹(每个区块封包都要校验一次)改用 JDK 内置的 CRC32C + CRC32 两个不同多项式组合(仍是 64 位强度)。本机实测 200 KB 负载从标量 FNV-1a 的约 143 µs 降到约 8.8 µs(1.4 GB/s → 22 GB/s,约 16 倍),且未采用「抽样指纹」——抽样会漏检未采样区间的单字节改动,那等于放行按旧内容改写的新区块,属不可接受的正确性风险。
- 显形索引用得省、发得也省:伪装坐标按区块共享(内存占用与玩家数无关),已显形坐标按玩家记录(天然有界);一个巡检周期的显形数据用 Paper 原生批量包一次性发出,通常只产生「涉及区块段数」个包。
- 遮挡判定走异步位图:反矿透显形与实体剔除共用同一套遮挡判定(区块级遮挡位图 + 专用线程池异步射线),候选点只取暴露面,「只发玩家真正看得见的」,既省带宽也不隔着墙泄露;判定全程在网络线程之外完成,堵塞结果是放行而非卡玩家。
- 实体优化也守线程纪律:视锥剔除复用反矿透侧同一套视锥数学,并在每个玩家所属线程上做纯数学复判(不打射线),据此实现「转头后 ≤ 1 个复检周期补发」,全程不触碰任何实体 API。
- 面向 Folia 的线程纪律:Paper / Folia 双平台启动期自动判定;世界访问一律走区域调度器,跨区域访问严格规避,区域化多线程下同样稳定。
- 停用/热重载也做清理:Bukkit 会在
onDisable之前就把插件置为 disabled,导致此时任何调度都会被拒绝——本插件在停用期改为同步恢复被隐藏的实体与降过的视距(跨区域时明确提示需重登),不会留下「看不见的怪」或「被降死的视距」。 - 内存纪律:缓存键只含世界名与坐标等基本类型,绝不持有
World/Chunk/Player/ 封包对象,世界卸载即整体释放。 - 邻块快照位打包:用于消除区块边界漏洞的邻块贴边数据按每格 1 bit 存储(单条约 3 KB),并按列裁剪到地表高度;只在需要六面判定的模式下才抓取,默认模式完全不抓。
- 可观测性:改写 / 显形 / 实体隐藏 / 磁盘缓存 / 线程池水位 / 安全阀计数全部可在
/mxnet status与 dump 中查看,任何异常都有一处可追的证据。
- 将
MikuXrayNet-x.y.z.jar放入plugins/。 - 确保已安装前置 PacketEvents 与 ProtocolLib。
- 启动服务端,自动生成两份带中文注释的配置;按需修改后
/mikuxraynet reload生效。
| 命令 | 说明 |
|---|---|
/mikuxraynet status(别名 /mxnet、/mxr) |
查看运行状态:依赖、平台、改写与显形统计、实体隐藏、磁盘缓存命中率、线程池水位 |
/mikuxraynet dump |
导出完整诊断转储文件并回显路径 |
/mikuxraynet reload |
热重载两份配置并重建周期任务 |
| 权限 | 说明 | 默认 |
|---|---|---|
mikuxraynet.admin |
管理命令总权限(父节点,含 status / dump / reload) | OP |
mikuxraynet.status |
查看运行状态与统计 | OP |
mikuxraynet.dump |
导出诊断转储 | OP |
mikuxraynet.reload |
热重载配置 | OP |
mikuxraynet.bypass |
绕过反矿透,看到真实世界(进入服务器时判定一次) | 无 |
三个子命令权限可单独授予:只给 mikuxraynet.status 的玩家,补全里只出现 status、也只能执行它;mikuxraynet.admin 是这三者的父节点,授予 admin 即同时授予三者。