【MCJE】字符串拼接
本專欄使用版本:Minecraft JE?1.20 pre-6
相信不少人在使用命令會遇到變量限制而不得不使用窮舉、遍歷、疊加等方法
例如這種情況:使用fill命令填充以兩個實體的坐標為區(qū)域兩個對角確定的一塊區(qū)域
大家一般會想到,fill命令在執(zhí)行時可以以命令執(zhí)行坐標為基準確定目標位置(即相對坐標)
例:/fill ~1 ~3?~1 ~-1 ~3?~-1 stone
因為這條命令由我在聊天框直接打出,因此執(zhí)行位置就是我的位置,所以這條命令便會在我的位置上方3格的東南延長1格與西北延長1格之間的區(qū)域生效

但這種方法無法用于上文中提到的情況
因為一條命令內(nèi),執(zhí)行位置只有一個,而要求卻提到了兩個實體的坐標,fill命令在確定一個執(zhí)行位置時,仍無法獲得另一個實體的坐標
在以前的版本有一種解決辦法是遍歷,在第一個實體的位置依次走過每一個位置,并在每次走過時放置方塊,這種辦法既麻煩,而且性能消耗也相對較大,是否有一種辦法能直接用原版命令填充這塊區(qū)域呢?
當(dāng)然有,這便是本文所講的內(nèi)容:通過字符串拼接更改命令并在其中添加變量
帶變量的命令
首先,需要先知道普通字符串與字符串形式的原始JSON文本
在nbt中,字符串需要用引號包裹表示
"我是文本"
而原始JSON文本是一種擁有多種功能的文本顯示方式
'[{},{},{}...]'
花括號{}內(nèi)可以填寫用引號包裹的鍵值對
這部分內(nèi)容不多說明,可自行查看wiki
教程/原始JSON文本 - Minecraft Wiki_BWIKI_嗶哩嗶哩 (biligame.com)
重點是其中的"score"與"nbt"等
格式如下
{"score":{"name":"分數(shù)擁有者","objective":"計分項id"}}
//顯示一段分數(shù)
{"nbt":"路徑","block":"方塊坐標"}
{"nbt":"路徑","entity":"目標實體"}
{"nbt":"路徑","storage":"儲存路徑"}
//顯示一個方塊、實體、或儲存中某個nbt的值
注:這兩著都屬于高級原始JSON文本元件
而計分板分數(shù)、nbt中的字符串,我們可以通過多種方法更改,通過scoreboard、data、execute中的store等
使用普通的字符串,我們可以直接將一條命令的文本形式顯示在聊天框中
例:/tellraw @s "/fill 5 5 5 20 20 20"
使用原始JSON文本與字符串,我們可以直接將一條命令與它的變量組合并顯示在聊天框中
例:/tellraw @s?["/fill ",{"score":{"name": "#v_x1","objective": "test"}}," ",{"score":{"name": "#v_y1","objective": "test"}}," ",{"score":{"name": "#v_z1","objective": "test"}}," ",{"score":{"name": "#v_x2","objective": "test"}}," ",{"score":{"name": "#v_y2","objective": "test"}}," ",{"score":{"name": "#v_z2","objective": "test"}}," ",{"nbt":"id","storage":"store:string"}]

其中,-1321,4,-91,-1321,9,-98,minecraft:glass?都是可以方便地更改的變量,分別為兩個實體的坐標、玩家手持物品的id
通過這張圖,不難發(fā)現(xiàn),此時展示給玩家看的這個文本已經(jīng)是一條完整的命令了
它能夠隨著計分板分數(shù)、玩家手持的物品(變量)而變化內(nèi)容
若能夠執(zhí)行,執(zhí)行的效果也會受變量影響
那么,我們現(xiàn)在只需要想辦法把它當(dāng)作一條命令執(zhí)行就可以了
但它僅僅是展示給玩家看的文本,并不能直接執(zhí)行
這時候,大佬們已經(jīng)發(fā)現(xiàn)了一個辦法
獲取字符串
我們已知的包括以下內(nèi)容:
1. 實體的自定義名稱可以使用普通原始JSON文本,但不能使用高級原始JSON文本元件

2. 告示牌上的文字可以使用包括高級原始JSON文本元件的完整的原始JSON文本

3. 告示牌會將高級原始JSON文本元件解析為以普通原始JSON文本儲存的nbt

4. 命令方塊中會記錄上一次執(zhí)行命令后的報錯,且報錯中含有實體名稱的字符串

通過上述內(nèi)容,我們可以先將 “?帶變量的命令 ” 部分中講述的JSON文本放入告示牌中
讓告示牌將高級原始JSON文本元件解析為以普通原始JSON文本儲存的nbt
(仔細觀察前面第3點圖片中的內(nèi)容,你會發(fā)現(xiàn)它與“?帶變量的命令?” 部分中的變量元件(高級原始JSON文本元件)已變化為了純字符串的普通原始JSON文本)
再將告示牌轉(zhuǎn)化后的普通原始JSON文本復(fù)制到實體中(前面第1點的實體的自定義名稱只能使用普通原始JSON文本)
接著,在命令方塊中用enchant向?qū)嶓w附魔物品(不重要),將獲得一個報錯(第4點的圖)
而這個報錯正好包含實體的名稱(最終字符串形式)——也就是 “?帶變量的命令?” 最后圖片中顯示的命令,它將直接儲存在命令方塊“報錯”的nbt中
但此時,我們又如何將這條命令從字符串中分出來呢?
截取字符串
在23w03a(1.19.4)版本中,data命令加入了一個值來源:string(與value、from同級)
能夠在一個nbt字符串中截取一部分作為值,含有兩個選項:開始的字符位置、結(jié)束的字符位置,如下
若?開始的字符位置 為3??結(jié)束的字符位置 為4
ABCDEFG
123
1234
最后作為值的字符串便是藍色部分
在1.20 pre-1版本中,這兩個位置可以是負數(shù),此時將從最末尾開始截取,如下
若?開始的字符位置 為2??結(jié)束的字符位置?為-1
ABCDEFG
12
654321X(負的,X即不填)
最后作為值的字符串便是藍色部分
這為我們截取命令部分大大提供了方便
最后最后,我們將截取的命令放入命令方塊的Command中執(zhí)行,便可完成最終的執(zhí)行
如下(核心部分)



效果參考視頻?BV1to4y137VA