战斗而非养殖(活体刷怪笼)

战斗而非养殖(活体刷怪笼)

将普通刷怪笼方块变为静止的、可攻击的生物刷怪笼。

怪物

战斗而非养殖

这个模组的基本理念是让刷怪笼成为你需要真正战斗的对象,而不是用火把围起来或进行养殖。活体刷怪笼是一种静止的、可攻击的实体,当玩家靠近时,它会持续召唤原本配置好的生物,只有当你在消灭了所有增援并摧毁刷怪笼本身后,这场遭遇才算结束。

之前

刷怪笼方块 → 用火把围住或养殖

之后

活体刷怪笼 → 战斗突破其召唤物 → 摧毁它

需求

  • Minecraft 1.21.1
  • 适用于 Minecraft 1.21.1 的 NeoForge 21.1.244 或更新版本
  • 服务器和开发机器上需安装 Java 21
  • 该模组必须同时安装在服务器和连接的客户端上

无需任何库模组。它不使用 mixins,也不涉及地形或结构生成。

安装

  1. 为 1.21.1 安装 NeoForge。
  2. 将 foughtnotfarmed-1.2.1.jar 放入游戏实例的 mods 文件夹。
  3. 在专用服务器和每个客户端上使用相同的 JAR 文件。
  4. 运行游戏或服务器一次,以生成配置文件。

默认工作方式

  • 每个符合条件的 minecraft:spawner 都有 100% 的一次性转换几率。
  • 如果刷怪笼被包裹,它会迁移到最近的、至少有两个暴露面的已加载空气或水位置。其行为、可接受的方块、暴露面数量和搜索半径均可配置。
  • 新生成的结构、旧加载的区块、运行时方块放置以及有界的轮询扫描均能正常工作。
  • 原有的 SpawnData、带权重的 SpawnPotentials、实体 NBT、延迟、生成数量、附近上限、玩家范围和生成范围都会全部保留。
  • 活体刷怪笼拥有 50 点生命值,大小为一格,无法移动,不受击退,也没有寻路目标。
  • 它承受正常的近战、投射物、魔法、火焰和爆炸伤害。默认关闭在墙内、溺水、摔落、仙人掌、拥挤、冰冻以及类似环境伤害。
  • 当配置范围内没有玩家时,以及在和平难度下,它会暂停活动。
  • 被玩家杀死时掉落 15 点经验值,默认没有物品战利品。
  • 它已召唤的生物在刷怪笼死亡后仍然存活。
  • 被摧毁的活体刷怪笼默认在服务器加载时间 30 分钟后于其死亡位置重生。重生启用、延迟、服务器时间与系统时间追踪以及基于生命值的延迟缩放均可配置。
  • 笼子使用原版刷怪笼方块模型渲染,并利用任何可用的模组实体渲染器显示当前生物预览。
  • 活跃的笼子会发出原版的烟雾和火焰粒子。在可配置的预警窗口期间,它们会震动并播放警报音效,然后在一次成功生成周期后短暂地放大和缩小。

与其他模组和数据包的兼容性

刷怪笼的现有数据构成了整个兼容层。如果另一个模组或数据包放置了带有已注册实体类型的普通 Minecraft 刷怪笼,Fought Not Farmed 会尝试从原始 NBT 中加载该实体,并触发 NeoForge 的刷怪笼位置/最终生成钩子。没有硬编码的支持生物或结构列表。

转换系统在区块进入正常的服务器线程处理后运行。它检查方块实体位置而不是扫描每个方块,从不扫描整个世界,也不等待区块生成工作线程。运行时扫描以可配置的间隔轮询扫描可配置数量的已加载区块。

数据包可以扩展这些实体类型标签:

  • foughtnotfarmed:cannot_be_spawned_by_living_spawner(硬性排除;包括活体刷怪笼本身)
  • foughtnotfarmed:bosses(当 allowBossEntities 为 false 时,带有此标签的生物将被排除;默认包括末影龙和凋灵)

配置

游戏玩法设置位于 config/foughtnotfarmed-common.toml。显示设置位于 config/foughtnotfarmed-client.toml。更改后需重启游戏/服务器。

主要分组:

  • conversion:自动转换、一次性几率、旧/运行时区块处理、玩家放置策略、实体/维度过滤器、扫描预算、被包裹刷怪笼的迁移。
  • combat:生命值/缩放、护甲、击退抗性、伤害类别、全局伤害倍率。
  • respawning:启用、延迟、时钟源、可选的最大生命值缩放。
  • spawning:生成数量/延迟/范围倍率、主动召唤策略、视线、Boss 策略、和平行为、预警时机。
  • rewards:经验值、战利品表、死亡时是否丢弃已加载的追踪召唤物。
  • 客户端配置:激活粒子、笼子震动、预览旋转、视觉悬浮幅度。

过滤器语义明确:在 BLACKLIST 模式下仅使用黑名单,在 WHITELIST 模式下仅使用白名单。有权重刷怪笼中的每个实体 ID 都必须通过活动过滤器的检查,刷怪笼才能转换。

当转换几率低于 100% 时,首次掷骰结果会保存在原版刷怪笼方块实体中。重新加载区块不会重新掷骰,直到最终转换。管理员仍然可以使用转换命令强制转换。

玩家放置的刷怪笼

playerPlacedMode 支持 CONVERT、KEEP 和 DISALLOW 三种模式。只有在此模组实际观察到玩家放置方块时,才能可靠地识别放置来源。保留的放置会获得一个持久标记。Minecraft 不会在旧的刷怪笼方块上存储可信的自然生成与玩家放置的来源信息,因此在安装模组之前玩家放置的刷怪笼无法与生成的分辨开;它们将遵循现有区块的策略。

命令

所有命令都需要权限等级 2。

  • /foughtnotfarmed convert(转换你正在注视的刷怪笼方块;绕过自动启用/几率和已保存的玩家保留标记,同时仍尊重实体/维度安全过滤器)
  • /foughtnotfarmed convertchunk(转换当前已加载区块中符合条件的刷怪笼方块实体)
  • /foughtnotfarmed convertarea <radius>(检查与方块半径(最多 256)相交的已加载区块中的方块实体;不会强制加载区块)
  • /foughtnotfarmed debug(显示被注视的活体刷怪笼的源位置、UUID、实体池、延迟、范围以及所拥有的主动召唤物数量)

添加到现有世界

你可以将模组添加到现有世界。当 convertExistingChunks=true 时,符合条件的刷怪笼会在其区块加载时转换。无需新建世界或特定结构集成。

在更改模组列表之前请备份你的世界。移除模组会移除活体刷怪笼实体,但无法重建每个被替换的方块。

安全限制和已知约束

  • 不规范的值会被限制以保护服务器:生成数量 64,主动追踪/上限 256,玩家范围 256,生成范围 64。
  • 所有者 UUID 存储在每个生成实体的 NeoForge 持久数据中。已加载的追踪实体计入上限;未加载的不消耗主动处理或槽位,直到再次遇到。
  • 一个活体刷怪笼最多追踪 512 个 UUID,清理死亡/未加载的引用,并在重新加载后从附近已加载实体重建所有权。
  • 如果 despawnSummonsOnDeath=true,当前已加载的追踪召唤物将被丢弃。未加载的实体无法在不强制加载区块的情况下移除,而我是不会这么做的。
  • 重生记录按维度区分。到期的重生会等待其死亡区块加载,绝不会强制加载它。
  • 程序化转换使用普通的服务器方块变更。伤害是正常的生物事件,保护模组可以取消;命令访问受权限控制。