- 版权类型
- 原创
- 插件中文名称
- 区域限制
- 插件英文名称
- EntityZoneLimiter
- 原帖地址
- #
- 支持的核心(服务端)
- Spigot
- Paper
- Purpur
- 语言支持
- 中文(简体)
- 前置组件
- 无
- 适配版本(Java)
- 1.21
- 1.20
- 1.19
- 1.18
- 1.17
- 1.16
- 1.15
- 1.14
- 1.13
- 1.12
加交流群下载Q:741873025
先知道它到底解决什么问题
EntityZoneLimiter 的核心目标不是“展示刷怪数量”,而是对指定世界或指定区块区域做实体数量上限控制。到达上限后,会在生物生成事件阶段直接阻止新的自然生成,减轻主城、活动区域或高密度刷怪点的压力。它适合用在这些场景
- 主城或出生点控怪避免公共区域堆怪,降低新手区压力。
- 活动地牢限流给副本、刷怪塔、竞技区设定独立密度。
- 多世界差异化管理主世界、地狱、末地可以分别给不同上限。
- 性能兜底把最容易产生刷怪负载的区块控制在可预期范围内。
当前版本的确定实现
- 事件入口监听 CreatureSpawnEvent。
- 限制层级区域限制 > 世界限制 > 全局默认限制。
- 命令体系支持 reload、list、addzone、removezone、setworldlimit、info。
- 强约束逻辑真正拦截生成时始终按精确统计处理,不让 quick 模式放松拦截。
一句话版
如果你只想快速理解:这个插件让你给“整个世界”或“某块区块范围”设置怪物数量上限,超过就不再继续自然生成。第一次部署,按这 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。配区域前先记住这几个规则
下面这些都直接对应到当前源码里的 ZoneLoader、ZoneManager 和命令校验逻辑。- 必须填合法边界最小区块坐标不能大于最大区块坐标,否则区域会被拒绝。
- 区域不能重叠同世界下只要 X、Z 范围都发生交叉,就判定为重叠。
- 世界必须已存在且已加载命令新增区域时会直接检查 Bukkit 当前是否能拿到这个世界。
- 区域可覆盖实体类型如果区域自己写了 monitored-entities,就会覆盖全局配置。
区域配置最容易踩的坑
这里使用的是 区块坐标,不是方块坐标;并且当前实现会拒绝加载重叠区域。也就是说,哪怕你觉得重叠无所谓,源码依然会把它判为非法配置先区分管理员命令和普通查询命令
当前 plugin.yml 里只定义了两类权限节点,结构很干净,适合直接分给管理组和普通巡查人员。| ezlimiter.admin | op | 允许管理区域、修改世界上限、重载配置、查看列表。 |
| ezlimiter.user | true | 允许查看当前位置或指定玩家位置对应的限制信息。 |
所有命令一页看全
下面的用法与行为,按当前命令类和各子命令源码整理,不是只抄旧文档。| /entitylimit reload | admin | 重载 3 个配置文件并重新载入区域。 | 成功后会回显当前已加载区域数量。 |
| /entitylimit list [世界名] | admin | 列出全部区域,或只列出指定世界的区域。 | 输出会带上世界、区块范围、上限与实体类型。 |
| /entitylimit addzone ... | admin | 新增一个区域限制。 | 会校验世界是否存在、坐标是否正确、是否重叠、实体类型是否有效。 |
| /entitylimit removezone <名称> | admin | 删除指定区域。 | 会直接写回 zones.yml 并重载。 |
| /entitylimit setworldlimit <世界> <上限> | admin | 设置世界独立上限。 | 会写回 worlds.yml 并重载。 |
| /entitylimit info [玩家] | user | 查看自己或指定玩家当前位置的限制命中情况。 | 控制台执行时必须指定玩家名。 |