切換
舊版
前往
大廳
主題

【Forge】熔(隆)爐(乳)教戰守則。Part 03

格子@懷念光牧的社畜 | 2015-03-16 21:37:11 | 巴幣 10 | 人氣 217

前言:
        其實我沒真的玩過艦娘,看到酷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。ˊ口ˋ

        我們下次再見。
        (可能,會拉長更新的時間,畢竟一天一篇還蠻拚的,老實說。
        (哈啦版那邊時間同步一樣拉成兩天一更ˊ口ˋ

創作回應

相關創作

更多創作