《我的世界》中大家知道什么是結(jié)構(gòu)方塊嗎?它已經(jīng)出現(xiàn)了很長一段時(shí)間了,但是還有很多玩家不知道怎么使用結(jié)構(gòu)方塊,今天就為大家?guī)砹擞伞白屗撊耸空f”分享的我的世界結(jié)構(gòu)方塊使用教程,非常詳細(xì)的內(nèi)容,想學(xué)習(xí)結(jié)構(gòu)方塊的朋友不要錯(cuò)過。
結(jié)構(gòu)方塊出現(xiàn)已經(jīng)有很長一段時(shí)間了。但是我發(fā)現(xiàn)直到現(xiàn)在很多人仍然不會(huì)使用。結(jié)構(gòu)方塊仍然很冷門,并且它的文章有很多不詳細(xì)的地方。我希望通過這個(gè)文章讓更多的人掌握結(jié)構(gòu)方塊,并且掌握結(jié)構(gòu)方塊的高級(jí)用法。
本文章以1.11版本為準(zhǔn)。沒有證實(shí)的地方會(huì)使用//標(biāo)出(可能由于需要查閱代碼來證明,因?yàn)槲抑荒苡蓪?shí)驗(yàn)的結(jié)果推測(cè)。也可能由于加載模式隨機(jī)功能的緣故,有可能我的測(cè)試恰好讓我歸納出錯(cuò)誤的結(jié)論)。
結(jié)構(gòu)方塊id是minecraft:structure_block,數(shù)字id是255,不能直接從創(chuàng)造模式拿出,必須使用give指令。放置/破壞/開啟它需要服務(wù)器權(quán)限。這個(gè)方塊有4種模式,分別是Save Load Corner Data。模式會(huì)使用NBT中的mode字符串保存。同時(shí)也會(huì)用方塊元數(shù)據(jù)0~3保存。//當(dāng)不一致時(shí)會(huì)按照NBT修正方塊元數(shù)據(jù)。//
其中data模式只在游戲自己自然生成建筑時(shí)能夠發(fā)揮作用。我們不會(huì)詳細(xì)介紹它。
save模式可以將結(jié)構(gòu)保存成NBT文件。首先輸入相對(duì)位置(在32到-32之間(含)的整數(shù))(NBT中posX posY posZ int)和結(jié)構(gòu)大?。ū?2?。ê┑恼麛?shù))(NBT中sizeX sizeY sizeZ int)(技巧:可以使用tab切換光標(biāo)到下一個(gè)文本框)。相對(duì)位置以結(jié)構(gòu)方塊作為坐標(biāo)原點(diǎn)。當(dāng)在GUI中按下save按鍵時(shí)即可將選中的區(qū)域用結(jié)構(gòu)名稱(NBT中name 字符串)為名字保存成.nbt文件。如果該文件已存在則會(huì)覆蓋已有的文件。保存在存檔文件夾中structures文件夾。若使用紅石激活將不會(huì)保存成文件,只能夠臨時(shí)使用。使用起來和真的生成了文件的情形別無二致,只是在游戲退出后即消失。顯示隱形方塊按鈕可以在選中的所有的空氣方塊和結(jié)構(gòu)方塊上做出標(biāo)記。保存時(shí)會(huì)略過結(jié)構(gòu)虛空方塊(因此結(jié)構(gòu)虛空加載時(shí)不替換原有方塊。結(jié)構(gòu)中若真的有結(jié)構(gòu)虛空方塊也是會(huì)加載的)。若包括實(shí)體(NBT中ignoreEntities byte)開了,則會(huì)將碰撞箱和結(jié)構(gòu)方塊選擇范圍有公共部分的實(shí)體也保存進(jìn)文件。
corner模式用于輔助save模式。為了避免仔細(xì)計(jì)算相對(duì)位置和結(jié)構(gòu)大小,可以將兩個(gè)同樣結(jié)構(gòu)名稱(NBT中name 字符串)corner方塊放在結(jié)構(gòu)外包長方體相對(duì)定點(diǎn)。在同樣名字的save模式方塊中點(diǎn)擊detect就能夠自動(dòng)設(shè)置相對(duì)位置和結(jié)構(gòu)大小。如果只找到一個(gè)同名corner模式方塊,save方塊會(huì)把自己當(dāng)作另外一個(gè)角。(技巧:雖然禁止空白名字結(jié)構(gòu)保存,但是探測(cè)時(shí)可以??梢韵葘ave和corner名字留空,探測(cè)好后填入save中的名字并保存。)
load模式可以將nbt文件加載入存檔。它會(huì)尋找以結(jié)構(gòu)名稱(NBT中name字符串)為名的結(jié)構(gòu)文件用于加載。//在按下加載按鈕時(shí),為了防止意外的位置錯(cuò)誤,如果發(fā)現(xiàn)結(jié)構(gòu)方塊的結(jié)構(gòu)大?。∟BT中sizeX sizeY sizeZ int)(在這里不顯示)和結(jié)構(gòu)文件中的不一致,則不會(huì)加載,它會(huì)關(guān)閉GUI,將結(jié)構(gòu)大小改成文件中要求的,讓你檢查是否正確。//如果一致就會(huì)直接加載了。這個(gè)過程也可以用紅石完成。紅石加載不會(huì)進(jìn)行這個(gè)檢查,無論是否一致都會(huì)直接加載。加載時(shí)也可以選擇是否將文件中可能存在的實(shí)體一同加載。當(dāng)然加載時(shí)會(huì)無視實(shí)體的pos和UUID這些NBT(但是其他的自然不會(huì)無視,造成shulker仍然記住自己所在的方塊的坐標(biāo),一旦加載會(huì)立刻瞬移過去......)。也可以選擇繞y軸旋轉(zhuǎn)90°的倍數(shù)或者前后反射或者左右反射。(NBT中rotation mirror字符串)??梢噪[藏白色邊框(NBT中showboundingbox byte)。
加載時(shí)可以選擇隨機(jī)性部分加載。你可以在加載前填入結(jié)構(gòu)完整性(0~1實(shí)數(shù),含0、1)和種子(integrity f seed L)。結(jié)構(gòu)完整性代表了里面每個(gè)方塊被放置的概率。//可以認(rèn)為每個(gè)方塊的放置與否是獨(dú)立的。//若種子填入0是一個(gè)特例,表明會(huì)隨機(jī)選擇種子。//方塊防止與否和種子、結(jié)構(gòu)完整性、和該方塊在結(jié)構(gòu)文件中的順序(不是指它在結(jié)構(gòu)中的坐標(biāo))(比如同樣的種子和概率,加載一個(gè)游戲產(chǎn)生的5*1*5的結(jié)構(gòu)和10*1*10的結(jié)構(gòu),前者在前兩x方向的列的放置與否和后者在第一個(gè)x方向的列的放置與否是一致的)//。//在種子相同的情況下,如果某個(gè)方塊在小的概率下放置,那么在較大種子下一定放置。(生成0至1隨機(jī)數(shù)然后若小于等于結(jié)構(gòu)完整性就放置?)//在游戲第一次被要求加載某個(gè)結(jié)構(gòu)的時(shí)候,游戲會(huì)讀取這個(gè)結(jié)構(gòu)。之后再要求的時(shí)候,游戲不會(huì)再讀取。
結(jié)構(gòu)文件保存在存檔中structures文件夾(游戲自帶的在jar文件中assets/minecraft/structures)。是壓縮的nbt格式??梢钥匆娎锩嬗腥齻€(gè)list,分別是blocks entities和palette。
palette中有順序地存儲(chǔ)了結(jié)構(gòu)中出現(xiàn)的各種方塊(和他們的不同方塊狀態(tài)的變種)。blocks有順序地存放了每個(gè)方塊在結(jié)構(gòu)中的位置和他的種類在palette中的編號(hào)(還有NBT,如果有的話)上文說的“方塊在結(jié)構(gòu)文件中的順序”就是指在block這個(gè)list中的順序。entities中是結(jié)構(gòu)中每個(gè)實(shí)體在結(jié)構(gòu)中的位置,還有取整后的位置(作用不明)。
可見,文件中的方塊和實(shí)體的位置完全可以超出結(jié)構(gòu)大小,甚至超過32*32*32的范圍(加載幾個(gè)區(qū)塊也是可以的,當(dāng)然會(huì)引起一些卡頓)。可見結(jié)構(gòu)大小只是一個(gè)讓使用結(jié)構(gòu)的人方便用的參考,他可以通過白色的外框知道放置的位置是否合適。當(dāng)然結(jié)構(gòu)大小如果有任意一個(gè)值超過32,就不能使用GUI加載了(這個(gè)值會(huì)被自動(dòng)改回離他最近的符合要求的數(shù),使得結(jié)構(gòu)方塊的結(jié)構(gòu)大小和文件要求的不一致,其結(jié)果在上文已經(jīng)寫了)。但仍然能用紅石加載。
save方塊在載入文件的時(shí)候按照坐標(biāo)的字典序?qū)⒎綁K寫入文件。加載時(shí)方塊按照方塊在結(jié)構(gòu)文件中的順序依次放置。比如用加載紅石塊的方法激活命令方塊,命令方塊會(huì)按照紅石塊的的放置順序激活。如果有兩個(gè)方塊占據(jù)在同一個(gè)位置,后放置的會(huì)將前面的覆蓋。所以如果在list里先有一個(gè)紅石塊,后有一個(gè)石塊在同一個(gè)位置,被放置的位置本來是空氣,結(jié)構(gòu)完整性是0.5,那么加載后有二分之一的概率是石塊,四分之一的概率是紅石塊,四分之一的概率是空氣。
當(dāng)結(jié)構(gòu)被加載時(shí),文件中每個(gè)方塊都會(huì)引起方塊更新。即使方塊前后沒有變化,或者隨機(jī)放置時(shí)該方塊沒被隨機(jī)到(人工更新某區(qū)域內(nèi)方塊(概率設(shè)為0))。如果方塊前后沒有變化,不會(huì)引起觀察者響應(yīng)//(除非該方快具有方塊實(shí)體)//。如果方塊結(jié)構(gòu)中有兩個(gè)方塊占據(jù)在同一個(gè)位置,比如一開始是紅石塊,文件要求先換成石頭再換成紅石塊,也會(huì)讓觀察者響應(yīng),雖然前后都是紅石塊。
結(jié)構(gòu)方塊有一個(gè)充能標(biāo)志(powered byte)。若加載模式結(jié)構(gòu)方塊發(fā)現(xiàn)自己被充能(或者接觸充能方塊)并且充能標(biāo)志為0,自然會(huì)加載并且把充能標(biāo)志改成1。但是,被加載的或者clone的//或者fill的或者setblock的//或者手動(dòng)放置到被充能位置的加載模式方塊不會(huì)自己更新自己。也就是說放(不論什么方式)的時(shí)候就放在紅石塊邊上的加載模式方塊處于BUD態(tài)。當(dāng)然,如果被加載的或clone的時(shí)候相鄰位置有其他方塊一同被加載(clone),那么就會(huì)更新到它讓他加載(當(dāng)然,必須周圍有紅石塊之類的和他接觸)(一同加載的方塊產(chǎn)生更新條件見上)。
那么如何用cb在某地加載結(jié)構(gòu)呢?可以想到先setblock結(jié)構(gòu)方塊然后setblock紅石塊。但如果直接把相鄰的結(jié)構(gòu)方塊和紅石塊一同clone過去(或者想讓加載的結(jié)構(gòu)里的結(jié)構(gòu)方塊繼續(xù)加載其他的結(jié)構(gòu)使得不修改文件立即加載很大的建筑),結(jié)構(gòu)方塊已經(jīng)是被激活的,clone過去的也是被激活的,這時(shí)就不會(huì)讓結(jié)構(gòu)方塊激活。所以應(yīng)當(dāng)讓使用blockdata指令修改clone前的結(jié)構(gòu)方塊的充能標(biāo)志,再它被clone過去的時(shí)候結(jié)構(gòu)方塊周圍的方塊放置更新它讓他加載。
結(jié)構(gòu)方塊有一個(gè)自我保護(hù)機(jī)制。具體保護(hù)機(jī)制觸發(fā)條件并不清楚。似乎是為了保護(hù)自己不陷入死循環(huán)。他會(huì)將“肇事”的加載模式結(jié)構(gòu)方塊替換成屏障方塊。
如轉(zhuǎn)載涉及版權(quán)等問題,請(qǐng)作者與我司聯(lián)系,我司將在第一時(shí)間刪除或支付稿酬。
全部評(píng)論