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

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

`in_fire`表示实体正身处火中(如站在火块上)所受的持续性环境火伤,`on_fire`则表示实体自身已着火(如被火焰箭点燃)产生的燃烧伤害;二者语义不同,直接影响死亡消息、伤害计算与事件触发逻辑。

在Minecraft 1.19(及后续版本)的官方反编译源码(如MCP或Yarn映射)中,net.minecraft.world.damagesource.DamageSource 类定义了多个静态常量来区分不同来源的伤害。其中 IN_FIRE 和 ON_FIRE 表面相似,但设计意图和使用场景截然不同:

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

虽然二者均调用 .bypassArmor()(无视护甲减免)和 .setIsFire()(标记为火属性伤害),但核心差异在于伤害触发条件与状态语义

  • IN_FIRE:代表环境性火伤,即实体处于可造成火伤的方块中(如火、熔岩、营火、烛火等)。它不依赖实体是否“着火”,而是由位置决定。例如玩家站在火堆中每秒受到 IN_FIRE 伤害,即使其未被点燃(isOnFire() 返回 false)。

  • ON_FIRE:代表状态性燃烧伤害,源自实体自身的 fireTicks > 0 状态(即 Entity#isOnFire() 为 true)。该伤害由实

    体每刻主动施加,与所处位置无关——哪怕玩家在水中燃烧(通过命令或Mod实现),其持续掉血仍使用 ON_FIRE。

这一区分直接支撑了游戏关键机制:

  • 死亡消息精准化

    • "Player was burnt to a crisp" → 来自 IN_FIRE(死于环境火)
    • "Player went up in flames" → 来自 ON_FIRE(死于自身燃烧)
      源码中 DamageSource#getDeathMessage(LivingEntity) 方法依据 this == IN_FIRE 或 this == ON_FIRE 返回不同本地化字符串。
  • 事件与模组兼容性
    Forge/Fabric 的 LivingHurtEvent 或 AttackEntityEvent 可通过 damageSource == DamageSource.IN_FIRE 精确拦截环境火伤,而不干扰玩家被烈焰人喷火(ON_FIRE)等逻辑。

  • 伤害叠加与免疫逻辑
    某些效果(如防火药水)仅对 ON_FIRE 状态生效(清除 fireTicks),但无法减免 IN_FIRE 的环境伤害;反之,站在防火方块(如灵魂沙+营火)可能规避 IN_FIRE,却无法阻止 ON_FIRE 的持续燃烧。

开发建议

  • 在自定义伤害逻辑中,优先使用 DamageSource.IN_FIRE 表示“接触火源”,用 DamageSource.ON_FIRE 表示“已点燃状态”;
  • 切勿因二者均含 setIsFire() 而混用——语义错误将导致死亡消息错乱、事件监听失效或模组兼容问题;
  • 可通过 entity.hurt(DamageSource.IN_FIRE, amount) 主动施加环境火伤,而 entity.setSecondsOnFire(10) 则会间接触发 ON_FIRE 伤害循环。

总之,IN_FIRE 与 ON_FIRE 是Minecraft伤害系统中“位置驱动”与“状态驱动”两种火伤范式的精确建模,体现了源码设计对游戏表现力与扩展性的深层考量。


# 本地化  # 区别  # yarn  # 常量  # 字符串  # 循环  #   # 事件  # this  # fabric  # 站在  # 可通过  # 死于  # 如火  # 这一  # 多个  # 是由  # 两种  # 而不  # 自定义 


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


相关推荐: 高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  JS中对数组元素进行增删改移的方法总结  Python正则表达式进阶教程_复杂匹配与分组替换解析  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  如何确保FTP站点访问权限与数据传输安全?  如何快速查询域名建站关键信息?  利用python获取某年中每个月的第一天和最后一天  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  大连 网站制作,大连天途有线官网?  如何在阿里云香港服务器快速搭建网站?  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  如何实现javascript表单验证_正则表达式有哪些实用技巧  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  lovemo网页版地址 lovemo官网手机登录  如何在建站之星绑定自定义域名?  Linux系统命令中screen命令详解  如何在阿里云虚拟服务器快速搭建网站?  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  如何在IIS管理器中快速创建并配置网站?  javascript中的try catch异常捕获机制用法分析  如何快速使用云服务器搭建个人网站?  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  QQ浏览器网页版登录入口 个人中心在线进入  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  如何用低价快速搭建高质量网站?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  黑客入侵网站服务器的常见手法有哪些?  jQuery中的100个技巧汇总  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  微信小程序 require机制详解及实例代码  Bootstrap整体框架之JavaScript插件架构  昵图网官方站入口 昵图网素材图库官网入口  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  如何用好域名打造高点击率的自主建站?  LinuxCD持续部署教程_自动发布与回滚机制  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  公司门户网站制作流程,华为官网怎么做?  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  如何在阿里云购买域名并搭建网站?  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  如何用PHP工具快速搭建高效网站?  JS去除重复并统计数量的实现方法  长沙企业网站制作哪家好,长沙水业集团官方网站?