看板 Minecraft 關於我們 聯絡資訊
因為在弄自動灑骨粉的mod所以我想知道這個樹苗是有機會成長成功是怎麼判斷的 [於是我去看了程式碼,其實打這篇在邊看邊打] [因為之前是看1.4.7,這篇是1.5.1-7.7.1.673] [有興趣的人可以去http://jd.minecraftforge.net/ 看程式碼] [這篇打的順序不是由上往下 最後才會把結論打在前面] [樹木成長基本上是沒啥變化 有變化是骨粉的部分] ┌─┬───┬───────────────────┐ │ │樹 苗│45%機率成功,成功兩次以上才會嚐試長大 │ │ ├───┼───────────────────┤ │骨│香 菇│40%機率嚐試長大 │ │ ├───┴───┬───────────────┤ │ │西瓜莖、南瓜莖│成長度範圍:0 ~ 7 │ │ │小 麥、蘿 蔔│沒完整成長才會使用 │ │ │馬鈴薯 │成長度增加:2 ~ 5 │ │ ├───┬───┴───────────────┤ │ │ │成長度範圍:0 ~ 2 │ │ │可可豆│沒完整成長才會使用 │ │粉│ │成長度增加:1 │ │ ├───┼───────────────────┤ │ │草 磚│產生草(90%),黃花(6.67%),紅花(3.33%) │ └─┴───┴───────────────────┘ 一、首先一切都從骨粉開始 ItemDye.onItemUse 使用物品 ItemDye.applyBonemeal 如果是骨粉的時候呼叫這個 如果目標是樹苗 45%機率會呼叫(失敗骨粉也會減少) BlockSapling.func_96477_c 如果沒灑過(0x8 bit是0) 這次是第一次施肥 他會紀錄施肥一次(0x8 bit 設成1) 如果有施肥過(0x8 bit非0是1) 這時候才會成長呼叫(有可能長失敗) BlockSapling.growTree 來嚐試樹的生成(後述) 如果目標是香菇 有40%會呼叫(失敗骨粉也會減少) BlockMushroom.fertilizeMushroom 來嚐試巨大香菇的生成(後述) 如果目標是西瓜莖南瓜瓜莖(如果成長度已滿7不會使用) 會直接呼叫 BlockStem.fertilizeStem 成長度(0~7)會加上 2~5 如果目標是小麥馬鈴薯蘿蔔(如果成長度已滿7不會使用) 會直接呼叫 BlockCrops.fertilize 成長度(0~7)會加上 2~5 如果目標是可可豆(如果成長度已滿2不會使用) 成長度(0~2)會加上 1 如果目標是草磚(這部分沒變) 會在附近的草磚上生成花草 (因為是不斷隨機移動挑位置,而且嚐試很多次,這部份就不重要了) ┌ 1/3 生成紅花 3.33% ┌ 1/10 生成花│ │ └ 2/3 生成黃花 6.67% └ 9/10 生成草 90% 二、巨大香菇跟樹木的成長 成長檢查分成兩部分:(1)判斷能不能生成 (2)生成樹木 判斷能不能生成的範圍跟生成樹木的範圍是不同的 這裡主要是著重判斷範圍 所有檢查都會先把樹苗移除再來檢查 失敗再把樹苗放回去 巨大香菇 WorldGenBigMushroom(0); WorldGenBigMushroom(1); 檢查範圍內只能有空氣、樹葉 生成的時候只會生成在空氣、透明方塊 -3-2-1 0+1+2+3 不透明方塊會被吃掉(黑色框框部分) +7□□□□□□□ ↑(看這次選) -3-2-1 0+1+2+3 -3-2-1 0+1+2+3 +6□□□□□□□ ↑│(哪種高度) +6■■■■■■■+6■■■■■■■ +5□□□□□□□↑││三種高度的 +5■■□□□■■+5□□□□□□□ +4□□□□□□□│││的檢查範圍 +4■□■□■□■+4■■■□■■■ +3 │││分別是 +3 □ □ +3 +2 │││(1)藍 +2 □ □ +2 +1 │││(2)藍+青 +1 +1 0 ↓↓↓(3)藍+青+紫 0 0 -1 如果黑色框框部分已經有不透明方塊 ↑此處只能是泥土、草磚、菌土 則不會生成香菇磚,之後的樹木成長同不重複 只要藍色區域有的話就有可能生成最矮的巨大香菇(此部份一定都不能有東西) 針葉樹 WorldGenTaiga2(); 檢查範圍內只能有空氣、樹葉 ←───→ 樹葉區寬度 ←─────→ 5x5 7x7隨機 先生成樹葉 -3-2-1 0+1+2+3 只會生成在空氣、透明方塊 +9□□□□□ ↑ 不過針葉樹樹葉只會在檢查範圍內生成 +8□□□□□ ↑│有樹葉區 +7□□□□□ ↑││高度從 然後在中心生成原木 +6□□□□□ ↑│││+6~+9 只會生成在空氣、樹葉 +5□□□□□ ││││到 +4□□□□□ ││││+1~+2 +3□□□□□ ││││ +2□□□□□ ↓↓↓↓ +1□□□□ ↑只有樹幹區(只檢查樹幹) 0 ↓高度是1~2隨機 -1 ↑此處只能是泥土、草磚 只要藍色區域有的話就有可能生成最小的針葉樹(此部份一定都不能有東西) 白皮樹、黃皮樹、叢林樹 WorldGenForest(); WorldGenTrees(true); this(true, 4, 0, 0, false); WorldGenTrees(true, 4 + par5Random.nextInt(7), 3, 3, false); 由於這類樹的檢查範圍是依據樹高 所以先從樹木形狀跟檢查範圍(以特定高度為例子) -2-1 0+1+2 +7■■■■■ ↑總↑頂端 檢查範圍內 +6□□□ │檢│三格高 白皮樹:只能有空氣、樹葉 +5□□□ │查↓檢查5x5 黃皮樹、叢林樹: +4□□□□□ │範↑中間 只能有空氣、樹葉、草磚、泥土、原木 +3□□□□□ │圍│區域 +2 │ │檢查3x3 先生成樹葉 只會生成在空氣、透明方塊 +1 │ ↓ 然後在中心生成原木只會生成在空氣、樹葉 0 ↓ ←底層檢查1x1 -1 ↑此處只能是泥土、草磚 因此以下區域符合條件的時候最少可以生成一種高度的樹 -2-1 0+1+2 □□□ ↑最大 白皮樹是+8 □□□ │檢查 黃皮樹是+7 .......... │範圍 叢林樹是+13 +6 □□□ │ +5 □□□ │↑ +4 □□□ ││最小 白皮樹是+6 +3 □□□ ││檢查 黃皮樹叢林樹是+5 +2 □□□ ││範圍 +1 □□□ ││ 0 ↓↓ 不管怎樣中心區域(3x3)從+1到最大檢查範圍(+8/+7/+13) 不可以有東西(扣除例外) 外圈區域(5x5外圈)從最小樹高-2(+4/+3/+3)到最大檢查範圍之中 最少要有連續三層有都沒有東西,樹苗才有可能生成 叢林巨木 WorldGenHugeTrees(true, 10 + par5Random.nextInt(20), 3, 3); 由於樹幹是2x2 檢查中心是以西北方的那一塊 北 負向 西 ■□ 東 負向 □□ 正向 南 正向 檢查範圍如下 -2-1 0+1+2 檢查範圍內 +32□□□□□ ↑最高檢查範圍 只能有空氣、樹葉、草磚、泥土、原木、樹苗 .......... │最多+32 +11□□□□□ │↑ 先生成側枝 .......... ││最小檢查範圍 從頂端往下每2~5高度到一半高度 +3□□□□□ ││最多+11 隨機往某個方向生成側枝(含少數原木) +2□□□□□ ││ 樹葉只會生成在空氣、透明方塊 +1□□□□□ ↓↓ 然後在中心2x2生成主幹原木 0 □※※ ←底層檢查3X3 只會生成在空氣、樹葉 -1 ■■ 並且在原木周圍67%生成藤蔓(每一面,共八面) ↑↑此處只能是泥土、草磚 只會生成在空氣 只要藍色區域有的話就有可能生成最小的叢林巨木(此部份一定都不能有東西) 黃皮神木 WorldGenBigTree(true); 黃皮神木是黃皮樹10%機率會進行黃皮神木生成 只檢查中心主幹區域 他檢查跟生成的方式都是線性檢查看能檢查多遠或是生成多遠 0 他是先隨機一個樹高(+5~+16) +5 最少這樣就能生成 然後從樹苗往上方檢查,只能有空氣、樹葉 +4 只是長不出精美的樹型 看最高能長多高(最少要+5就是) +3 +2 然後之後依據樹高來生成樹木 +1 (過程複雜請忽略他) 0 ↑此處只能是泥土、草磚 -- 有問題請寄信(推文)大多人不在(???? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.39.137.238
organ63521:專業推 04/24 22:46
p3398530:專業認真樓上沒有推XD 04/24 22:47
jeffffliu:新內容其實只有骨粉 跟 香菇之前用純測試結果不對 04/24 22:51
organ63521:我來補推了 04/24 22:54
CP64:挖code推 04/25 00:27
diffusa:好專業 推推 04/25 11:47
jurian0101:推 04/25 13:27
mabikerry:那黑皮樹呢 04/25 14:52
jeffffliu:(就針葉樹吧 04/25 14:54
※ 編輯: jeffffliu 來自: 114.39.137.238 (04/25 14:54)
TheZeta:......... 對了 我的小麥澆水後長好了呢! 04/25 16:28
jeffffliu:不焦水也會長好! 04/25 17:25
gh0987:小麥澆水會直接流掉吧 04/25 19:14
jeffffliu:查這個只是要讓自己不要浪費骨粉 04/25 23:16