概述:
--在不依赖道具、实体、甚至是任何方块的情况下把玩家、怪物或一些杂七杂八身上的数据保存起来的功能。
先贴个影片大略展示:
--影片里面只是简单的保存了身上的所有道具,然后再把保存过的道具重新还回来而已。
--我平常没有太常逛巴哈或国外的文章之类的,所以内容如有雷同纯属巧合。我也在想可能早就有人发现了毕竟都已经到1.16+了,所以只是单纯聊聊而已,顺便分享给喜欢做地图的同好。
废话前言:
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] Copy 到另一个 数组里,然后在把 数组[0] 删掉。
是:把 数组[0] 单独取出来,再把剩下没检查的贴到另一个数组里面。
找到之后就可以直接对刚刚取出来的数据上下其手了,要杀要寡任你选。
延伸想法:
-可以模仿RPG存盘机制,死亡就回复上一次存盘的内容。
-或是像魔物猎人那样只要重制任务就把消耗的东西还给你的感觉。
-或是快速把身上的物品收起来之后放入RPG技能的快捷键,在这之间来回切换。
-或是像各大小游戏模式一样在玩之前把东西收好,玩完之后再还回来。
DataPack demo下载:下载网址
反正就是个 Datapack 包而已,至于怎么安装就不垒述了,相信会做地图的人都知道怎么装。
然后运行指令是:
保存并移除身上有的物品:
/function royce_inventory_save:save
重新加载上一次保存的物品:
/function royce_inventory_save:load
喔对了顺带一提,因为我不知道怎么把保存的 NBT 标签 modify 到玩家身上,所以如果身上有穿装备或是副手上有拿东西的话一律会被吸回物品栏里面,如果有解决办法的话还有请大神路过帮无知的小弟解惑。( ˘•ω•˘ )
以上就是这样,纯粹只是想交流而已,相信应该有很多人有更好更有效率的方式能达到目的,只是我凭我未开化的原始脑就是想不到,祝大家做地图顺利。