Minecraft源码中IN_FIRE与ON_FIRE伤害源的本质区别解析

发布时间 - 2026-01-29 00:00:00    点击率:

在minecraft 1.19源码中,`damagesource.in_fire`与`damagesource.on_fire`虽同为火系伤害源且均绕过护甲、标记为火焰类型,但语义与触发场景截然不同:前者表示实体**处于火焰方块中**(如站在火堆里),后者表示实体**自身正在燃烧**(如被火把点燃后持续掉血)。

这两个常量定义于 net.minecraft.world.damagesource.DamageSource 类中:

public static final DamageSource IN_FIRE = (new DamageSource("inFire")).bypassArmor().setIsFire();
public static final DamageSource ON_FIRE = (new DamageSource("onFire")).bypassArmor().setIsFire();

表面上看,二者行为高度相似——都调用 .bypassArmor()(无视护甲减免)和 .setIsFire()(启用火焰相关逻辑,如对凋灵造成伤害、触发防火药水效果等)。但其设计核心在于语义分离与上下文精确性,这是Minecraft死亡消息系统、成就判定及模组兼容性的关键基础。

✅ 实际使用场景差异

  • IN_FIRE:用于实体直接接触火焰方块(Fire Block)或熔岩时的即时伤害。
    例如:玩家跳入火堆、僵尸卡在燃烧的草方块中、掉落进岩浆池边缘的火焰层。该伤害每秒触发一次,且仅当实体的碰撞箱完全或部分位于火焰方块内时生效

  • ON_FIRE:用于实体已被点燃(setOnFireFor(int ticks))后,每刻(20 ticks/秒)持续承受的燃烧伤害
    例如:被烈焰人火球击中、手持打火石点燃自己、受“着火”状态效果影响。此伤害独立于环境方块,即使玩家瞬移出火堆,只要燃烧倒计时未结束,ON_FIRE 仍会持续造成伤害。

? 验证依据:死亡消息与日志表现

Minecraft通过 DamageSource.getLocalizedDeathMessage(LivingEntity) 方法生成死亡提示,而 IN_FIRE 与 ON_FIRE 对应不同本地化键:

  • inFire → "death.attack.inFire" → "Player was burnt to a crisp"`
  • onFire → "death.attack.onFire"

    "Player went up in flames"`

你可以在 en_us.json 资源文件中查到这两条独立翻译,证实它们面向不同事件语义。若合并为同一 DamageSource,则无法实现精准死亡反馈——比如“在火里烤焦”和“自燃成灰”在游戏叙事中具有明确区分。

⚠️ 注意事项与开发建议

  • 模组开发中切勿混用:若你的模组添加自定义火焰伤害逻辑,请根据实际触发条件选择对应 DamageSource。误用 ON_FIRE 替代 IN_FIRE 可能导致死亡消息错误,或与防火药水、抗火附魔等机制产生意外交互。
  • 服务端同步安全:二者均为 public static final 常量,在多线程环境下安全共享,无需额外同步。
  • 扩展性考量:MCP(Mod Coder Pack)或Yarn映射中,此类命名规范(inXxx vs onXxx)是Mojang惯用模式,类似还有 IN_WALL / WALL(挤压伤害)、FALLING_BLOCK / FALLING_ANVIL(下落物细分)等,体现其精细化伤害建模哲学。

简言之,IN_FIRE 是环境致害,ON_FIRE 是状态致害;名称差异不是冗余,而是Minecraft底层伤害系统语义严谨性的直接体现。理解这一点,是读懂原版逻辑、编写健壮模组的基础。


# js  # json  # 本地化  # 区别  # yarn  # Static  # 常量  # int  #   # public  # 线程  # 多线程  # 事件  # 造成伤害  # 这是  # 站在  # 你可以  # 已被  # 均为  # 这两个  # 此类  # 自定义  # 上看 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: javascript基本数据类型及类型检测常用方法小结  怎么用AI帮你为初创公司进行市场定位分析?  Linux系统命令中tree命令详解  如何在IIS中新建站点并配置端口与IP地址?  JS实现鼠标移上去显示图片或微信二维码  *服务器网站为何频现安全漏洞?  简单实现Android文件上传  如何自定义建站之星模板颜色并下载新样式?  深圳网站制作的公司有哪些,dido官方网站?  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  如何用好域名打造高点击率的自主建站?  如何在云指建站中生成FTP站点?  Laravel怎么在Blade中安全地输出原始HTML内容  如何自定义建站之星网站的导航菜单样式?  新三国志曹操传主线渭水交兵攻略  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  iOS发送验证码倒计时应用  高防服务器:AI智能防御DDoS攻击与数据安全保障  如何快速搭建自助建站会员专属系统?  Laravel如何实现本地化和多语言支持?(i18n教程)  免费网站制作appp,免费制作app哪个平台好?  php结合redis实现高并发下的抢购、秒杀功能的实例  Laravel如何实现数据库事务?(DB Facade示例)  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  清除minerd进程的简单方法  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  如何挑选高效建站主机与优质域名?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  微信小程序 input输入框控件详解及实例(多种示例)  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  奇安信“盘古石”团队突破 iOS 26.1 提权  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  Laravel如何使用Vite进行前端资源打包?(配置示例)  香港网站服务器数量如何影响SEO优化效果?  太平洋网站制作公司,网络用语太平洋是什么意思?  网站制作软件有哪些,制图软件有哪些?  长沙做网站要多少钱,长沙国安网络怎么样?  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  潮流网站制作头像软件下载,适合母子的网名有哪些?  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  HTML 中如何正确使用模板变量为元素的 name 属性赋值  制作旅游网站html,怎样注册旅游网站?  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  电商网站制作价格怎么算,网上拍卖流程以及规则?  香港服务器租用每月最低只需15元?  Android使用GridView实现日历的简单功能