“死亡不掉落”附魔
湖神有没有做过类似于“灵魂绑定”之类的附魔?就是死了复活,拥有该附魔的东西还会在,相当于拥有这个附魔的物品死亡不掉落。
今天一位群友问到这个,以后可能还会有人问,那么我就写个随笔记录一下吧。
有人会建议参考暮色的保管符咒,对此我持否定态度。
暮色的保管符咒实现原理是写一个专门的类,用列表记录保管的物品,在玩家复活时发进玩家的包里。然而,一旦玩家下线,所有这样记录的物品就会立刻被扔出来,洒的满地都是,极易遗失。因为,他没有做持久化,没有写入存档,为了不彻底丢失,他只好把物品扔地上。
暮色写的不好,那么有没有写的好的呢?我们看一下植物魔法的坚毅之藤的代码。
它的思路很简单:玩家死的时候,把物品删了,转化为数据存在nbt里,复活时再根据创造一份完全一致的物品。
首先,需要一个判断某stack是否应该死亡不掉落的接口。在上述的例子中,是hasIvy。植物魔法使用NBT标记判断一个道具是否有“坚毅之藤”附着。如果是附魔的话,改写成对应的判断就好。总之,
接着,监听LivingDropsEvent。为什么不是死亡事件LivingDeathEvent呢?因为死亡可以被中断,你监听之后,可能有其他mod执行免死。
在这个事件中,检查掉落物的列表。每个需要不掉落的道具被扔进临时列表,并从掉落列表里去掉。
接下来就是关键了,他把每一个道具都调用了stack.write(new CompoundNBT()),转化为一条nbt数据,然后按照
XXX_1 = {掉落物数据}
XXX_2 = {掉落物数据}
XXX_3 = {掉落物数据}
的格式依次存进玩家的持久化NBT里。之所以要存进持久化的部分,是为了防止这数据在玩家死亡或者下线的时候清掉。
最后,他又存了一个int,表示到底有几条这样的数据。
之后,监听复活事件PlayerRespawnEvent 在复活的时候,根据个数,逐个恢复这些数据发到包里。包如果满了,就调用entityDropItem把道具扔地上。执行完毕之后,清除掉这些数据,以免下次死亡时又刷出一份。

https://www.mcmod.cn/item/407171.html
我之前制作过这样一件道具,它的一个效果是死亡不掉落。相比之下,我写的就烂多了。
我监听的是死亡事件,如果玩家在我事件监听后复活,他就有可能把这个道具卡没。不过,我没法像他那样监听掉落事件,因为我需要知道他死亡时这个道具在哪,是否穿在身上。