【心得】嘗試用了 Storage 來保存物品數據(廢話偏多,慎入)

( ˘•ω•˘ ) 第一次發文,排版和符號傷眼、格式錯誤請告知(我努力改善)


概述:
--在不依賴道具、實體、甚至是任何方塊的情況下把玩家、怪物或一些雜七雜八身上的數據保存起來的功能。

先貼個影片大略展示:
--影片裡面只是簡單的保存了身上的所有道具,然後再把保存過的道具重新還回來而已。


事前聲明:
--我平常沒有太常逛巴哈或國外的文章之類的,所以內容如有雷同純屬巧合。我也在想可能早就有人發現了畢竟都已經到1.16+了,所以只是單純聊聊而已,順便分享給喜歡做地圖的同好。


廢話前言:

--這次單純只是好久沒玩 Minecraft(自1.13之後我就跑去玩別的遊戲了),回鍋之後發現又多了好多我完全看不懂的東西,心血來潮就想來做點甚麼,但內容依然還是很鱉屎就是了。總而言之有一天突然在跟一個寫插件的朋友在聊天,那時候剛好聊到 minecraft 本身好像沒什麼能保存玩家數據的地方,都只能把數據存在道具的NBT里或是路邊的箱子和指令方塊,聽朋友說就連插件都要自己額外寫。

P.S. 雖然每次看到官方願意添加新的功能是很開心沒錯啦,只是同時又覺得噢干好累喔又要學新知識,煩捏。這年頭想混個分都不行。

--因為以前如果要保存數據的話都要把數據存在道具裡面(畢竟道具可以自由亂加標籤都沒問題)但是怪物把道具帶在身上就算了,如果要保存玩家數據的話也總不能老是在玩家身上塞一個專門存數據的道具(每次都被當成垃圾丟出去),所以這次回鍋之後發現多了一個能保存各種 NBT 標籤的方式(storage),那時候還不以為然沒想太多。

想說「媽咧,又只能像對象池一樣自己先定義好預設要用的空間然後才在指令上做調用」,
正當我要去睡覺之前,就在此時,突然
有一個想法閃過我悲哀尺寸的花生腦,不是還有 數組[]的存在嗎?只要有數組我就不用一個一個先準備好玩家要用的空間了阿,要多少有多少。


作法概述:
我的作法可能比較沒那麼聰明,如果有大神路過的話還請多指教,這是依我的能力我目前能想到的了。
首先我先把我要保存的東西準備好,接著在加進玩家自身的 UUID 把它們變成一組的。
像這種感覺:
{UUID,DataTag}
至於為甚麼要多塞一個 UUID 呢?後面會解釋。(懂得人應該馬上就理解了)
接著如果是多人的話會排成一個數組:

[
        {UUID,DataTag},
        {UUID,DataTag},
        {UUID,DataTag}
]

接著就只是把數據保存進去而已,就是這麼簡單,
而這個中括弧裡面的東西就是包含世界中有保存過數據的玩家信息。

然後要怎麼在眾多的數據中找到屬於指定的數據呢,這時候就要依賴剛剛塞進去的 UUID 了,
透過對應的 UUID 去尋找跟他同一組的數據。(就像 Java 的 map 和 C# 的 dictionary 的感覺)

接著迎來的又是另一個問題,在 Minecraft 裡面又沒有像 List<T>.Find() 這麼方便的東西,在 execute 裡面雖然有 data 可以用來查找但是根本不能帶入 UUID 這樣的變數啊,那要怎麼在數組海之中找到我要到結果呢。

這時候我就直接搬出了我在 1.12 之前的邏輯思維,無腦暴力刪去法,開始模仿在 C# 里去 Foreach 每個對象的方式,只要一個一個從 數組[0] 開始找的話那就沒問題啦!(ゝ∀・)
P.S. 只是這個做法的缺點是當保存的數值越多,它就要花更多資源去尋找目標。

我的作法是用:
檢查
數組[0] 的 UUID 是不是玩家的 UUID
不是:把
數組[0] Copy 到另一個 數組裡,然後在把
數組[0] 刪掉。
:把
數組[0] 單獨取出來,再把剩下沒檢查的貼到另一個數組裡面。

找到之後就可以直接對剛剛取出來的數據上下其手了,要殺要寡任你選。


延伸想法:
-可以模仿RPG存檔機制,死亡就回復上一次存檔的內容。
-或是像魔物獵人那樣只要重製任務就把消耗的東西還給你的感覺。
或是快速把身上的物品收起來之後放入RPG技能的快捷鍵,在這之間來回切換。
或是像各大小遊戲模式一樣在玩之前把東西收好,玩完之後再還回來。


DataPack demo下載:
下載網址
反正就是個 Datapack 包而已,至於怎麼安裝就不壘述了,相信會做地圖的人都知道怎麼裝。
然後運行指令是:
保存並移除身上有的物品:
/function royce_inventory_save:save
重新載入上一次保存的物品:
/function royce_inventory_save:load
喔對了順帶一提,因為我不知道怎麼把保存的 NBT 標籤 modify 到玩家身上,所以如果身上有穿裝備或是副手上有拿東西的話一律會被吸回物品欄裡面,如果有解決辦法的話還有請大神路過幫無知的小弟解惑。( ˘•ω•˘ )

以上就是這樣,純粹只是想交流而已,相信應該有很多人有更好更有效率的方式能達到目的,只是我憑我未開化的原始腦就是想不到,祝大家做地圖順利。

本文來自網路,不代表3樓貓立場,轉載請註明出處:https://www.3loumao.org/3780.html?variant=zh-tw
返回頂部