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 】
相关推荐:
如何在阿里云虚拟服务器快速搭建网站?
javascript基本数据类型及类型检测常用方法小结
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
如何用AWS免费套餐快速搭建高效网站?
为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】
微信小程序 input输入框控件详解及实例(多种示例)
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
如何在香港服务器上快速搭建免备案网站?
phpredis提高消息队列的实时性方法(推荐)
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
javascript日期怎么处理_如何格式化输出
如何为不同团队 ID 动态生成多个非值班状态按钮
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
JavaScript如何实现倒计时_时间函数如何精确控制
如何在橙子建站上传落地页?操作指南详解
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
如何构建满足综合性能需求的优质建站方案?
Laravel用户密码怎么加密_Laravel Hash门面使用教程
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
活动邀请函制作网站有哪些,活动邀请函文案?
详解Oracle修改字段类型方法总结
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
,怎么在广州志愿者网站注册?
Android okhttputils现在进度显示实例代码
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
Laravel怎么调用外部API_Laravel Http Client客户端使用
浅谈Javascript中的Label语句
大同网页,大同瑞慈医院官网?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
Bootstrap整体框架之JavaScript插件架构
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
什么是javascript作用域_全局和局部作用域有什么区别?
详解Android——蓝牙技术 带你实现终端间数据传输
个人摄影网站制作流程,摄影爱好者都去什么网站?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
Python文件操作最佳实践_稳定性说明【指导】
如何在IIS7中新建站点?详细步骤解析
如何在建站宝盒中设置产品搜索功能?
敲碗10年!Mac系列传将迎来「触控与联网」双革新
HTML 中动态设置元素 name 属性的正确语法详解
如何在云指建站中生成FTP站点?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
郑州企业网站制作公司,郑州招聘网站有哪些?
如何在云虚拟主机上快速搭建个人网站?
JavaScript如何实现类型判断_typeof和instanceof有什么区别
中国移动官方网站首页入口 中国移动官网网页登录


