EntityZoneLimiter-区域限制

原创 闭源 EntityZoneLimiter-区域限制

版权类型
原创
插件中文名称
区域限制
插件英文名称
EntityZoneLimiter
原帖地址
#
支持的核心(服务端)
  1. Spigot
  2. Paper
  3. Purpur
语言支持
中文(简体)
前置组件
无
适配版本(Java)
  1. 1.21
  2. 1.20
  3. 1.19
  4. 1.18
  5. 1.17
  6. 1.16
  7. 1.15
  8. 1.14
  9. 1.13
  10. 1.12

加交流群下载Q:741873025​

​

先知道它到底解决什么问题​

EntityZoneLimiter 的核心目标不是“展示刷怪数量”,而是对指定世界或指定区块区域做实体数量上限控制。到达上限后,会在生物生成事件阶段直接阻止新的自然生成,减轻主城、活动区域或高密度刷怪点的压力。

它适合用在这些场景​

  • 主城或出生点控怪避免公共区域堆怪,降低新手区压力。
  • 活动地牢限流给副本、刷怪塔、竞技区设定独立密度。
  • 多世界差异化管理主世界、地狱、末地可以分别给不同上限。
  • 性能兜底把最容易产生刷怪负载的区块控制在可预期范围内。

当前版本的确定实现​

  • 事件入口监听 CreatureSpawnEvent。
  • 限制层级区域限制 > 世界限制 > 全局默认限制。
  • 命令体系支持 reload、list、addzone、removezone、setworldlimit、info。
  • 强约束逻辑真正拦截生成时始终按精确统计处理,不让 quick 模式放松拦截。

一句话版​

如果你只想快速理解:这个插件让你给“整个世界”或“某块区块范围”设置怪物数量上限,超过就不再继续自然生成。

1775011155294.webp


第一次部署,按这 5 步做基本不会绕路​

这是基于当前项目资源目录、默认配置与命令逻辑整理出来的最短落地路径,适合第一次上服测试。
把构建出的 JAR 放进服务器的 plugins 目录当前项目构建产物名为 EntityZoneLimiter-1.0.7.jar。
启动服务器生成默认配置插件会在 plugins/EntityZoneLimiter/config/ 下生成 3 个配置文件。
先改全局限制,再决定是否开区域限制一般先看 config.yml 里的 default-limit、use-zones、monitored-entities。
再补 worlds.yml 或 zones.yml如果只是多世界区分,用世界限制;如果要精确圈地控怪,用区域限制。
执行 /entitylimit reload 与 /entitylimit info重载配置后,站到目标地点用 info 看当前到底命中了哪个限制。

限制优先级,先搞懂这个再配文件​

很多“为什么没生效”的问题,本质上都是没有先理解优先级。当前源码实现顺序非常明确。

01 区域限制优先​

如果 use-zones: true 且当前生成位置命中了某个区域,那么优先取这个区域的 limit 和实体类型配置。

02 世界限制兜底​

如果没有命中区域,则读取 worlds.yml 中当前世界的独立限制。

03 全局默认限制最后兜底​

如果世界也没有配置,则回退到 config.yml 的 default-limit。

check-mode 别理解错了​

quick 和 precise 主要影响 /entitylimit info 这类“查看信息”的统计方式。真正生成拦截时,当前实现会固定走精确统计,避免 quick 模式导致超限放行。

安装后的目录长什么样​

插件第一次启动后,会把默认配置解包到自己的数据目录。当前实现固定使用 config 子目录来收纳 3 份配置文件。
放入 JAR 并启动服务器让插件自动生成默认配置,避免手搓目录结构。
先改配置,再热重载修改完成后执行 /entitylimit reload。
站到目标位置做验证用 /entitylimit info 检查命中的到底是区域还是世界限制。


三个配置文件各管什么​

建议不要一上来就盯着 zones.yml。先决定全局策略,再补世界差异,最后才做区域精修。


config.ym
enabled总开关。关掉后插件仍加载,但不会参与生成拦截。
default-limit全局默认上限。只有在没命中区域、世界又没单独配置时才使用它。
use-zones是否启用区域限制。如果关掉,就只看世界限制和默认限制。
check-mode影响信息查看统计方式。quick 快,precise 更接近真实数量。
monitored-entities全局监控实体类型。* 表示全部;也可只写具体实体枚举。
exclude-player-spawned


什么时候该用 worlds.yml​

如果你的需求只是“不同世界给不同上限”,那优先用这里,结构简单、维护成本低。只有需要精确到某块区域时,再切去 zones.yml。
1775011350189.webp

配区域前先记住这几个规则​

下面这些都直接对应到当前源码里的 ZoneLoader、ZoneManager 和命令校验逻辑。
  • 必须填合法边界最小区块坐标不能大于最大区块坐标,否则区域会被拒绝。
  • 区域不能重叠同世界下只要 X、Z 范围都发生交叉,就判定为重叠。
  • 世界必须已存在且已加载命令新增区域时会直接检查 Bukkit 当前是否能拿到这个世界。
  • 区域可覆盖实体类型如果区域自己写了 monitored-entities,就会覆盖全局配置。

区域配置最容易踩的坑​

这里使用的是 区块坐标,不是方块坐标;并且当前实现会拒绝加载重叠区域。也就是说,哪怕你觉得重叠无所谓,源码依然会把它判为非法配置

1775011362816.webp



先区分管理员命令和普通查询命令​

当前 plugin.yml 里只定义了两类权限节点,结构很干净,适合直接分给管理组和普通巡查人员。

ezlimiter.adminop允许管理区域、修改世界上限、重载配置、查看列表。
ezlimiter.usertrue允许查看当前位置或指定玩家位置对应的限制信息。


所有命令一页看全​

下面的用法与行为,按当前命令类和各子命令源码整理,不是只抄旧文档。

/entitylimit reloadadmin重载 3 个配置文件并重新载入区域。成功后会回显当前已加载区域数量。
/entitylimit list [世界名]admin列出全部区域,或只列出指定世界的区域。输出会带上世界、区块范围、上限与实体类型。
/entitylimit addzone ...admin新增一个区域限制。会校验世界是否存在、坐标是否正确、是否重叠、实体类型是否有效。
/entitylimit removezone <名称>admin删除指定区域。会直接写回 zones.yml 并重载。
/entitylimit setworldlimit <世界> <上限>admin设置世界独立上限。会写回 worlds.yml 并重载。
/entitylimit info [玩家]user查看自己或指定玩家当前位置的限制命中情况。控制台执行时必须指定玩家名。


常见问题,按当前实现回答​

这里重点解释源码真正做了什么,而不是大家想当然以为它做了什么。

为什么玩家刷怪蛋不受影响?​

如果 exclude-player-spawned: true,当前监听器会忽略一批玩家主动触发的生成原因,包括 SPAWNER_EGG、BREEDING、BUILD_SNOWMAN、BUILD_IRONGOLEM、DISPENSE_EGG、CUSTOM。

quick 模式是不是会让拦截不准确?​

查看信息时会更快,但真正生成拦截不会放松。当前限制服务对拦截使用的是精确统计逻辑,这一点已经在 1.0.7 的文档中明确。

为什么加区域时报重叠?​

因为当前实现明确拒绝同世界下重叠区域,目的是避免优先级歧义。不是你命令写错,而是逻辑就是这么设计的。
作者
FenLing
查看
233
首次发布
最后更新

评分

0.00 星 0 次评分

FenLing 的其他资源

后退
顶部 底部