欢迎光临散文网 会员登陆 & 注册

【我的世界1.19.4mod开发】解决重生后Capability无法同步到重生玩家实体的问题

2023-08-15 20:12 作者:尤尔沃克不会解方程  | 我要投稿

感谢大佬@Flandre芙兰在Kook频道里愿意抽出时间协助我这个小萌新解决问题(鞠躬.jpg)

一、背景描述

我在我的MOD中为玩家添加了一个经验等级系统(Player Level Capability),玩家有阶段(Elite Level)、玩家等级(Player Level)、经验(Experience)三种属性。在1.19.4的Minecraft中,玩家死亡重生后,Capability的数值会重置为初始值,然而玩家等级理论上来讲是不能随着玩家死亡而重置的,因此需要监听玩家死亡相关的事件,将死亡前的Capability同步到重生后的玩家实体。



二、问题描述

有问题的代码部分如下:

我在这里监听了玩家实体克隆事件,从理论上来讲,oldPlayerLevel存储着玩家死亡前的Capability信息,使用newPlayerLevel存储着玩家重生后的Capability信息,我使用如下代码对死亡前后的Capability进行同步:

然而同步失败了,我用/kill指令杀死玩家后重生,结果没有输出“old: 死亡前的经验值 new: 死亡后的经验值”的信息,这说明oldPlayerLevel.ifPresent(Lambda表达式)没有按住预期那样执行Lambda表达式,这也意味着oldPlayerLevel.isPrensent()返回值为false



三、问题解决

我尝试了很多办法,试图让oldPlayerLevel.isPrensent()返回值为true,但是都失败了,于是我换了一种思路解决问题。

我设置了一个静态全局变量cachePlayerLevel用于缓存玩家的Capability信息,这个全局变量在玩家进入游戏的时候缓存玩家的Capability(其实可以用“指向”,因为我直接把玩家的Capability赋值给了这个全局变量),在玩家死亡重生后将重生后Capability的值更新为全局变量缓存的值,然后让全局变量缓存重生后玩家的Capability的值。

修改后的代码如下(也可以不这么写,仅供参考):

这个全局变量定义在PlayerLevel(也就是定义这个Capability的类)中

接着,监听玩家进入游戏的事件:

然后把出问题的部分(哪里出问题已经写在上面代码的注释中了)修改为:

进入游戏后,一切按照计划运行,大功告成!

如果这篇文章帮到了你,麻烦长按点赞给一个免费的三连吧


【我的世界1.19.4mod开发】解决重生后Capability无法同步到重生玩家实体的问题的评论 (共 条)

分享到微博请遵守国家法律