前言:
最後:
其實我沒真的玩過艦娘,看到酷X網有艦娘動漫我還是沒去看。
因為要載撥放器ˊ口ˋ。
但是昨天看完第一集之後,等我回神過來已經看到第三集了。(厭惡這樣的自己)
然後除了麥姊,其實金剛大和赤城別忘了扶桑還有長門都超讚的。(長門麥姊大愛ˊ口ˋ)
續上篇:
這邊做個小小的前情提要。
在上一篇我們做了一個可以大喊被性騷擾的方塊。
但是呢。在最後一張同場加映的圖片當中,我們可以看見,這個顯示世界名稱的地方有點
錯誤。系統無法分辨原世界、地獄、還有終界。
那麼這邊我們來探討一下各個世界的關係吧!
根據我粗淺(強調:粗淺)的了解,原版Minecraft裏頭,原世界、地獄、終界,是歸類在
同一個世界裏頭。證明大概就是Seed(種子碼)相同,而且在生成世界的函數裏頭有三種
類型,分別為原生(0)、地獄(1)、還有終界(-1)。
那麼這邊我們來做點小小的改變,來改善無法顯示的問題。
請開啟你的TileBlockFirst.class檔。
我們在回傳的字串後頭再加上一串取得世界類型的字串。
接下來到遊戲去性騷擾那個方塊。
處裡完這個之後呢。
其實還有一個小小的Bug。(這麼說就是很大的意思。)
有一些人可能會在驚鴻一瞥的時候看到這個Error訊息。
發生這個的原因是我們沒有註冊這個該死的TileEntity,
而始作俑者就是有個小笨蛋忘記教學ˊ口ˋ (眼神死)。
請打開各位的Tutorial.class檔案,
然後很簡單的加上一行。
加上55行,註冊TileEntity的函數就可以了。(攤手)
然後我發現我們忘記加入儲存還有讀取的函數。
打開TileBlockFirst.class也加上這些東西,
本篇會用到噢!
分別是writeToNBT()還有readFromNBT()。
最後用力地踹你的方塊。
它再也不會哀號Error。
接下來我們就可以進入我們的正題了。(發軟)
第1-1章:高能反應爐(?)。 之 甚麼鬼東西?!
好的,
本章請各位做好心理建設,這裡會有超級高能反應。
中途聽不懂的勇者們,准許離席再回。
真的撐不住的,就請各位照著打就好了。(大燦笑)
那麼我們來回顧一下本次開篇的主題吧!
"熔(隆)爐(乳)教戰守則。"
顧名思義,我們要來打造一個跟熔爐一樣功能的東西。
所以說我們會放入物品、那就要把這個熔爐,所以我們必須要實作Inventory。
你問我Inventory是甚麼噢?
答曰:「庫存。」(某種詭異的大陸翻譯法,來自估X、X狗。)
簡單來講,舉凡能夠把物品塞進去的方塊、介面、雜七雜八的地方。
通通都要實作(implements)成Inventory。
我知道有一些人開始不懂了,動手蠻幹就對了!
請打開你的TileBlockFirst.class檔,我們來大改造!
實作Inventory(implements IInventory),並且Import必要的檔案。
然後你一定會得到一個錯誤XD"
它叫我們實作方法。
好吧,那就實作。(聳肩)
總共需要實作12個函數。
I know,超可怕的ˊ口ˋ。
這12個函數都"必須"要實作它。
所以接下來我們就"一個一個"來仔細講解。
請各位保重。
第1-2節:高能反應爐(?)。 之 12個核子反應堆。
在這之前,我們先來剖析一下整個熔爐的結構吧。
首先是三個格子,分別放置燃料、可燃物、還有結果。
所以我們需要三個格子。
第12行的地方,我們宣告了一個儲存ItemStack(道具訊息)的陣列,命名為Inventory。
然後在第17行的地方,我們在建構子執行的階段,初始化這個陣列。
它的大小是三,分別存放那三格。
接著我們就直接開始著手於各個函數的實作吧。
首先是前兩個。
第一個getSizeInventory(),取得欄位的大小,這邊回傳給他inventory.length,的陣列大
小。
第二個getStackInSlot(),第一個參數是slotIndex,也就是格子的編號。
在這邊我們回傳給他指定格子的物品。 inventory[p_70301_1_]。
第三個decrStackSize(),來進行物品的減少。可以透過這個函數來使道具的數量減少指定
數目。第一個參數是slotIndex、第二個則是減少的數量。
在這邊有一點小複雜,姑且我就先用文字解釋。有慧根的朋友們自然會去看懂程式碼XD"
首先函數被呼叫的時候,我宣告了一個區域變數,來暫存指定格子的道具資料。
接著把這個道具資料的stackSize(翻譯過去也就是堆疊數量)減1。
然後把這個格子的資料重新指定一次剛才我們修改過的資料。
最後再把格子的資訊回傳出去。老話一句看不懂照抄ˊ口ˋ。
第四個getStackInSlotOnClosing()這個我們暫時先不實作,直接return null;就好了。
爾後再說。
第五個setInventorySlotContents(),用來設定指定欄位的道具資訊。第一個參數是
slotIndex、第二個是新的道具資料。由於這邊我們不必考慮是否有資料在指定格子裡面。
所以我們直接把指定格子的資料覆寫也沒關係。
第六個getInventoryName(),很明顯的就是取得Inventory的名字,我就直接回傳一個字串
了。是不是不可重複無所謂,不過可以的話盡可能讓它獨一無二ˊ口ˋ。以免有蟲。(甩手
(一口氣講完ˊ口ˋ)
第七個,hasCustomInventoryName(),算是一個確認用的函數XD",如果它有自定義的
Inventory名字,就回傳true,否則false。
第八個,getInventoryStackLimit(),這個是格子能夠放的上限,當然就是64。(想改也可
以,都改、都可以改XD")
第九個,isUseableByPlayer(),可以被玩家使用嗎?當然可以。(眼神死。)
第十個還有第十一個,openInventory()跟closeInventory(),分別在Inventory被打開還有關
閉的時候呼叫,不過這邊我們先放在一旁,晚點再來講。
最後一個第十二個,isItemValidForSlot(),道具是否在指定格子有效。這個其實我還沒實際
使用到,所以並不是很清楚效果(吐舌),歡迎嘗試XD?這邊我先回傳false。
之後出錯了再回來改XD"。(前提是知道壞在這邊ˊ口ˋ)
第2節:反應爐容器。
做完了這些,我知道大家都累了。
不過我們還是得提振精神繼續下去。(攤手)
請建立一個Package在org.mocstudio底下,命名為Container,
然後建立一個class檔叫做ContainerBlockFirst.class,並且extends Container。
然後引入相關的檔案。別忘了新增該實作的方法噢!
我們把唯一一個需要實作的函數return true。
這邊的解釋是,這個容器是否可以被玩家戳,當然是回傳true。ˊ口ˋ
這個容器是給TileBlockFirst.class所實作的Inventory所使用,
所以他必須要求一個TileBlockFirst的參數,那麼我們來實作它的建構子。
為了方便使用,再多要求一個EntityPlayer的參數也無可厚非。(聳肩)
第10跟11行宣告了兩個受保護的變數,分別存取要求的參數。
然後第12行建立了一個建構子,要求EntityPlayer跟TileBlockFirst參數。
這邊第18到20行的函數,是新增格子的函數。
因為只有三格,所以我就沒有用for迴圈去處理了。
而且懶懶的,所以我把xy都指定成10。所以基本上這三格應該是疊在一起的。
最後:
做到這邊之後,基本上,
我還是給各位一點時間消化消化ˊ口ˋ,可能已經很多人胃潰瘍了。
下一篇我會來進行GUI的編寫。
就可以看到一個Error的熔爐囉!
(迷:一個不能燒東西、沒有畫面的、只有道具可以放進去的空虛方塊。)
拜託別巴我。
這一篇是我寫出來難產的一篇。
剛剛還跑去做Debug。發現自己其實很多地方漏掉該注意的。
所以有一些Bug。ˊ口ˋ
我們下次再見。
(可能,會拉長更新的時間,畢竟一天一篇還蠻拚的,老實說。
(哈啦版那邊時間同步一樣拉成兩天一更ˊ口ˋ