原创
原版并没有这个Bug,如果你安装的Mod包含召唤实体事件,那可能会触发这个Bug
如果你的游戏或者服务器没有同样的NRE异常,那就没必要下这个Mod。
—————————异常描述————————–
最近玩游戏发现SpawnEntity(召唤实体事件)调用的Bug:由事件调用引起的空引用异常导致游戏、服务器频繁崩溃。
1、同样的Mod,在服务器玩,服务器经常崩溃,体现为:丢东西浮空、掉进地心、传送卡半空等等,而服务器后台一直刷红字(NullReferenceException),报错代码:GameEventActionSequence.update()
2、同样的Mod,在单机玩, 控制台就一直刷红字(NullReferenceException),只能Alt+F4强关游戏,而本地的log文件输出同样的错误:GameEventActionSequence.update()
—————————异常触发以及修复————————–
日志、报错截图:
本机日志目录:C:\Users\用户\AppData\Roaming\7DaysToDie\logs
服务器日志目录:盘符:\ xxx\xxx\steamapps\common\7 Days to Die Dedicated Server\7DaysToDieServer_Data
出错Mod代码示例,见图:
上图的代码,是导致游戏、服务器频繁报红、崩溃的根源。
该NRE异常不是能百分百触发的,触发条件:如果目标实体已死亡,假如这时候SpawnEntity还在运行,那么就会报错、崩溃。
解决办法:添加<property name=”action_type” value=”Game”/>
修复之后的代码如图:
—————————为什么要设置action_type————————–
action_type的类型是枚举,有三个取值:TwitchAction,TwitchVote,Game,而C#枚举的默认值是第一个。
因此,如果SpawnEntity所在的事件序列不设置action_type,那么就会用默认值TwitchAction,事件管理器在事件处理过程中会对TwitchAction做特殊处理,就在TwitchAction处理过程中报了NRE异常(Requester是Null)。
再看ActionSpawnEntity对目标是否死亡的处理逻辑流程:
1、目标死亡
2、如果action_type是TwitchAction,做特殊处理(NRE异常)
3、action完成
如果action_type是Game,那么第1、3步执行完,action就结束了
如果action_type是TwitchAction,就要处理第2步(NRE异常)
TwitchAction特殊处理报错分析:报错代码是Requester.entityId,Debug发现Requester是Null,Null调用肯定报NRE异常,但是仔细查看了Requester的相关引用和赋值,没发现有效赋值的地方,难道Requester永远是Null?(研究就到此为止了)
—————————修复NRE异常的Mod————————–
鉴于有同样情况的Mod可能有很多,就出个一劳永逸的修复Mod,这个Mod的作用是强制设置action_type的值是Game。
当然你也可以手动在gameevents.xml里搜索SpawnEntity并设置action_sequence的action_type值是Game。
PS:
1、action_type的值有3个,有2个是Twitch相关的,还一个是Game。直接强制设置所有的action_type是Game,百分百是没问题的。
2、建议所有Mod作者在写Mod时,如果涉及到召唤实体事件(SpawnEntity),一定要设置action_type,并且设置值是Game。
3、还有一种修复办法,因为action_type是枚举,枚举的默认值是第一个,因此只要把Game放到第一个,像这样:Game,TwitchAction,TwitchVote,就修复了这个NRE异常(这个方法需要官方来处理)
隐藏内容需要回复可以看见
二楼Bug反馈
666
这个逼装的我给82分,剩下的用666的方式打给你!
接点模组定制 +q 1079703478
1
这个逼装的我给82分,剩下的用666的方式打给你!
卧槽还得是你牛逼,我大部分bug都找到原因了,唯独这个召唤实体报错的一直不知道原因,困扰我好几个月了。
定制加Q417983415
牛逼 大佬
这个逼装的我给82分,剩下的用666的方式打给你!感谢大佬的付出,赞一个!
感谢大佬的付出,赞一个!这个逼装的我给82分,剩下的用666的方式打给你!