“死亡不掉落”附魔
湖神有沒有做過類似于“靈魂綁定”之類的附魔?就是死了復(fù)活,擁有該附魔的東西還會在,相當(dāng)于擁有這個附魔的物品死亡不掉落。
今天一位群友問到這個,以后可能還會有人問,那么我就寫個隨筆記錄一下吧。
有人會建議參考暮色的保管符咒,對此我持否定態(tài)度。
暮色的保管符咒實現(xiàn)原理是寫一個專門的類,用列表記錄保管的物品,在玩家復(fù)活時發(fā)進玩家的包里。然而,一旦玩家下線,所有這樣記錄的物品就會立刻被扔出來,灑的滿地都是,極易遺失。因為,他沒有做持久化,沒有寫入存檔,為了不徹底丟失,他只好把物品扔地上。
暮色寫的不好,那么有沒有寫的好的呢?我們看一下植物魔法的堅毅之藤的代碼。
它的思路很簡單:玩家死的時候,把物品刪了,轉(zhuǎn)化為數(shù)據(jù)存在nbt里,復(fù)活時再根據(jù)創(chuàng)造一份完全一致的物品。
首先,需要一個判斷某stack是否應(yīng)該死亡不掉落的接口。在上述的例子中,是hasIvy。植物魔法使用NBT標(biāo)記判斷一個道具是否有“堅毅之藤”附著。如果是附魔的話,改寫成對應(yīng)的判斷就好??傊?,
接著,監(jiān)聽LivingDropsEvent。為什么不是死亡事件LivingDeathEvent呢?因為死亡可以被中斷,你監(jiān)聽之后,可能有其他mod執(zhí)行免死。
在這個事件中,檢查掉落物的列表。每個需要不掉落的道具被扔進臨時列表,并從掉落列表里去掉。
接下來就是關(guān)鍵了,他把每一個道具都調(diào)用了stack.write(new?CompoundNBT()),轉(zhuǎn)化為一條nbt數(shù)據(jù),然后按照
XXX_1 = {掉落物數(shù)據(jù)}
XXX_2 = {掉落物數(shù)據(jù)}
XXX_3 = {掉落物數(shù)據(jù)}
的格式依次存進玩家的持久化NBT里。之所以要存進持久化的部分,是為了防止這數(shù)據(jù)在玩家死亡或者下線的時候清掉。
最后,他又存了一個int,表示到底有幾條這樣的數(shù)據(jù)。
之后,監(jiān)聽復(fù)活事件PlayerRespawnEvent?在復(fù)活的時候,根據(jù)個數(shù),逐個恢復(fù)這些數(shù)據(jù)發(fā)到包里。包如果滿了,就調(diào)用entityDropItem把道具扔地上。執(zhí)行完畢之后,清除掉這些數(shù)據(jù),以免下次死亡時又刷出一份。

https://www.mcmod.cn/item/407171.html
我之前制作過這樣一件道具,它的一個效果是死亡不掉落。相比之下,我寫的就爛多了。
我監(jiān)聽的是死亡事件,如果玩家在我事件監(jiān)聽后復(fù)活,他就有可能把這個道具卡沒。不過,我沒法像他那樣監(jiān)聽掉落事件,因為我需要知道他死亡時這個道具在哪,是否穿在身上。