Add-On開發教學 #1 安裝bridge. & 新增自訂物品和方塊

上一篇:

下一篇:


最後更新:2021/07/22

Minecraft版本: 1.17.2 (Add-on比較不會有版本問題)

想要自訂武器,或者是自訂方塊嗎?

基岩版Add-on還有一個特色: 方塊可以不是方形的,可以直接套用實體的模型檔案!



影片教學:
影片使用bridge.示範,不用像下文一樣手動輸入程式碼。



文字版教學:

基本環境設定: 建議安裝Visual Studio Code和Photoshop,有Win10版Minecraft比較方便。以及將com.mojang加入捷徑,最後安裝bridge.。

Visual Studio Code建議開啟允許註解的JSONC(看這裡),才不會報錯。


這裡使用bridge. v2

建議使用Edge瀏覽器開啟。


文章目標: 製作一把能夠合成的「超級劍」,使用會召喚閃電 ,並且只要拿在手上,玩家會持續獲得回復的狀態效果。並且,新增一個能合成的「苦力怕方塊」,挖掉後會生成TNT。製作方形與不規則形狀的二種方塊,雖外形不同但二者功能一樣。

影片沒說到的額外補充: 透過animation_controller,來「土砲」一些功能 。此外範本的內容可能跟影片教的有細微差異,但不影響功能。


  • 這篇文章資訊參考自Bedrock Dev Wiki。這個新增物品的方法是1.16.100加入的,format_version就必須是這個或者更高版本。由於新增物品和方塊還是實驗性功能且更新很快速,啟用Add-on前,必須在世界選項裡把測試版功能全部開啟。



    第一部分: 物品

    這個超級劍的ID為newitem:supersword

    1.註冊物品

    行為包新增items資料夾,新增以下檔案supersword.json,填入:

    {
    	"format_version": "1.16.100",
    	"minecraft:item": {
    		"description": {
    			//物品ID
    			"identifier": "newitem:supersword",
    			//分類
    			"category": "items"
    		},
    		"components": {
    			//物品名稱,要在資源包的/texts/zh_TW.json編輯
    			"minecraft:display_name": {
    				"value": "item.newitem:supersword.name"
    			},
    			//創造背包中物品的分類
    			"minecraft:creative_category": {
    				"parent": "itemGroup.name.items"
    			},
    			//物品在手上的位置,圖片像素16x16以上就要重新設定座標。
    			"minecraft:render_offsets": "tools",
    			//物品材質名稱(參照資源包/textures/item_texture所定義的)
    			"minecraft:icon": {
    				"texture": "supersword"
    			},
    			//使用物品觸發事件
    			"minecraft:on_use": {
    				"on_use": {
    					"event": "use"
    				}
    			},
    			//攻擊傷害
    			"minecraft:damage": 20,
    			//一組數量
    			"minecraft:max_stack_size": 1,
    			//冷卻時間
    			"minecraft:cooldown": {
    				"category": "chorus_fruit",
    				"duration": 5
    			}
    		},
    		//事件
    		"events": {
    			"use": {
    				//發射物品
    				"shoot": {
    					"projectile": "minecraft:snowball",
    					"launch_power": 5,
    					"angle_offset": 20
    				},
    				//執行指令
    				"run_command": {
    					"command": [
    						"summon lightning_bolt"
    					],
    					"target": "holder"
    				}
    			}
    		}
    	}
    }
    


    2. 這裡添加on_use這個組件,於是在玩家使用物品(點螢幕)時會執行events裡所寫的run_command。

    Events區塊不只可以執行指令,也能修改為「添加狀態效果」或者「發射投射物」

    例如再加一個發射雪球,並且設定成和召喚閃電這個功能同時執行。

    如果材質解析度大於16x16,物品會偏移手中,就必

    須從render_offset這裡調整。可以自由設定物品在手中的位置以及縮放大小,可參考這篇文章解決。


    3. 大部分的程式是在行為包,資源包只用來註冊材質。

    資源包的textures/的item_textures.json,用於註冊顯示物品的圖示路徑:

    {
    	"resource_pack_name": "超級劍與苦力怕方塊資源包",
    	"texture_name": "atlas.items",
    	"texture_data": {
    		"supersword": {
    			"textures": "textures/items/supersword"
    		}
    	}
    }

    將物品的材質放到/textures/items/下面,取名為supersword.png


    至此物品的基本功能完成。



    第二部分: 方塊

    目前除非使用實體模型,否則方塊不會在創造背包出現。要用/give指令獲取。


    一、傳統方形方塊

    這個方塊的ID為: newblock:creeperblock


    1. 到行為包,blocks/下面新增creeprblock.json

    輸入程式,設定玩家破壞後執行生成tnt的指令:

    {
        "format_version": "1.16.100",
        "minecraft:block": {
            "description": {
            //方塊ID
                "identifier": "newblock:creeperblock"
            },
            "components": {
                //當玩家敲碎方塊(生存模式)執行事件
                "minecraft:on_player_destroyed": {
                    "event": "spawn_tnt",
                    "target": "self"
                }
            },
            "events": {
                //執行指令
                "spawn_tnt": {
                    "run_command": {
                        "command": [
                            "summon tnt",
                            "summon tnt",
                            "summon tnt"
                        ]
                    }
                }
            }
        }
    }


    2.這裡要做一個傳統方形方塊,

    跟實體不一樣,所有新增的方形方塊都在資源包的blocks.json裡面註冊。

    資源包的blocks.json寫上各個面的材質名稱。這個檔案裡面也可以註明方塊取用的聲音。

    {
        "format_version": [
            1,
            1,
            0
        ],
        //方形苦力怕方塊
        "newblock:creeperblock": {
            "textures": {
                "up": "creeperblock_up",
                "down": "creeperblock_down",
                "north": "creeperblock_north",
                "south": "creeperblock_south",
                "west": "creeperblock_west",
                "east": "creeperblock_east"
            },
            "sound": "tnt"
        }
    }


    3. 註明材質路徑。textures/terrain_textures.json這個檔案就是記載方塊的材質路徑。

    {
    	"resource_pack_name": "超級劍與苦力怕方塊資源包",
    	"texture_name": "atlas.terrain",
    	"padding": 8,
    	"num_mip_levels": 4,
    	"texture_data": {
    		//方形苦力怕方塊
    		"creeperblock_north": {
    			"textures": "textures/blocks/creeperblock/north"
    		},
    		"creeperblock_east": {
    			"textures": "textures/blocks/creeperblock/east"
    		},
    		"creeperblock_west": {
    			"textures": "textures/blocks/creeperblock/west"
    		},
    		"creeperblock_south": {
    			"textures": "textures/blocks/creeperblock/south"
    		},
    		"creeperblock_up": {
    			"textures": "textures/blocks/creeperblock/up"
    		},
    		"creeperblock_down": {
    			"textures": "textures/blocks/creeperblock/down"
    		}
    	}
    }


    一般來說方塊的材質是放在資源包/textures/blocks/裡面。


    二、不規則形狀的方塊

    這個不規則的方塊ID為: newblock:creeperblock_u


    1.行為包/blocks/新增creeperblock_u.json,填入以下程式,只是這裡還要註明使用的模型以及材質,其餘功能則和上面的傳統方塊一樣。

    {
        "format_version": "1.16.100",
        "minecraft:block": {
            "description": {
                //方塊ID
                "identifier": "newblock:creeperblock_u"
            },
            "components": {
                //當玩家敲碎方塊(生存模式)執行事件
                "minecraft:on_player_destroyed": {
                    "event": "spawn_tnt",
                    "target": "self"
                },
            //指定使用實體模型
                "minecraft:geometry": "geometry.creeperblock_u",
                //texture為資源包textures/terrain_texture.json裡面定義
                "minecraft:material_instances": {
                    "*": {
                        "texture": "creeperblock_u",
                        "render_method": "blend",
                        "face_dimming": true,
                        "ambient_occlusion": true
                    }
                }
            },
            "events": {
                //執行指令
                "spawn_tnt": {
                    "run_command": {
                        "command": [
                            "summon tnt",
                            "summon tnt",
                            "summon tnt"
                        ]
                    }
                }
            }
        }
    }


    若是不規則形狀的方塊就不用在資源包的blocks註冊方塊了,blocks.json的功用只剩下使用音效。

    {
        "format_version": [
            1,
            1,
            0
        ],
        //方形苦力怕方塊
        "newblock:creeperblock": {
            "textures": {
                "up": "creeperblock_up",
                "down": "creeperblock_down",
                "north": "creeperblock_north",
                "south": "creeperblock_south",
                "west": "creeperblock_west",
                "east": "creeperblock_east"
            },
            "sound": "tnt"
        },
        //不規則形狀苦力怕方塊
        "newblock:creeperblock_u": {
            "sound": "anvil"
        }
    }


    2. 在textures/terrain_textures.json註明材質路徑。



    3.跟實體一樣,在資源包/models/entities/裡面放入模型檔案。取名為creeperblock_u.json,geometry的ID是geometry.creeperblock_u,但不需要註冊實體。


    4.材質就按慣例放/textures/entity/creeperblock_u.png



    第三部分: 為物品和方塊添加合成表 & 設定語言檔案

    在行為包/recipes資料夾下建立三個檔案:

    supersword.json

    creeperblock.json

    creeperblock_u.json


    Identifier是物品或方塊的ID。

    tag代表要在合成台進行。

    設定有序合成,"key"對應的是物品/方塊ID。透過key和空格組成九宮格合成表,最下面"result"是合成結果。


    超級劍的配方為鑽石劍x3。

    {
      "format_version": "1.12",
      "minecraft:recipe_shaped": {
        "description": {
          "identifier": "newitem:supersword"
        },
        "tags": [
          "crafting_table"
        ],
        "pattern": [
          " # ",
          " # ",
          " # "
        ],
        "key": {
          "#": {
            "item": "minecraft:diamond_sword"
          }
        },
        "result": {
          "item": "newitem:supersword",
          "count": 1
        }
      }
    }


    苦力怕方塊的配方是tnt x3。

    {
      "format_version": "1.12",
      "minecraft:recipe_shaped": {
        "description": {
          "identifier": "newblock:creeperblock"
        },
        "tags": [
          "crafting_table"
        ],
        "pattern": [
          " ##",
          " # ",
          "   "
        ],
        "key": {
          "#": {
            "item": "minecraft:tnt"
          }
        },
        "result": {
          "item": "newblock:creeperblock",
          "count": 1
        }
      }
    }


    不規則苦力怕方塊的配方是tnt x4。

    {
      "format_version": "1.12",
      "minecraft:recipe_shaped": {
        "description": {
          "identifier": "newblock:creeperblock_u"
        },
        "tags": [
          "crafting_table"
        ],
        "pattern": [
          " ##",
          " ##",
          "   "
        ],
        "key": {
          "#": {
            "item": "minecraft:tnt"
          }
        },
        "result": {
          "item": "newblock:creeperblock_u",
          "count": 1
        }
      }
    }


    在資源包/texts/資料夾新增zh_TW.lang,開始編輯物品和方塊的顯示名稱。

    item.newitem:supersword.name=超級劍
    tile.newblock:creeperblock.name=苦力怕方塊
    tile.newblock:creeperblock_u.name=不規則形狀苦力怕方塊



    第四部分: 使用animation_controller製作連閃器,重複執行指令。


    雖然使用物品可以執行指令,但是如果要在背景偵測手上物品,並重複執行「給予狀態效果的」指令呢?


    1.這裡要複製官方範本行為包/entities/player.json 過來


    2. 在player.json插入一個"animation_controller"。

    {
      "format_version": "1.16.0",
      "minecraft:entity": {
        "description": {
          "identifier": "minecraft:player",
          "is_spawnable": false,
          "is_summonable": false,
          "is_experimental": false,
          //插入動畫
          "animations": {
            "command": "controller.animation.command"
          },
          "scripts": {
            "animate": [
              "command"
            ]
          }
        },
        //(下略)


    3.行為包/animation_controllers/,新增command.json

    裡面開始撰寫指令。

    這個動畫裡面有二個state,一旦transition裡面條件符合,就會切換到另一個state。如果填1.0的話就是執行完on_entry之後無條件切換。

    每個state都有on_entry區塊,裡面可以填入指令,或者對實體執行事件。


    {
      "format_version": "1.10.0",
      "animation_controllers": {
        "controller.animation.command": {
          "states": {
            //default,預設的state
            "default": {
              "transitions": [
                //手上拿著超級劍,切換到run_command的state
                {
                  "run_command": "(query.get_equipped_item_name=='supersword') "
                }
              ]
            },
            "run_command": {
              //一進入這個state就執行指令
              "on_entry": [
                "/execute @p ~ ~ ~ effect @s regeneration 1 1 true"
              ],
              "transitions": [
                //無條件返回default state
                {
                  "default": "(1.0)"
                }
              ]
            }
          }
        }
      }
    }


    這裡我寫切換到run_command的state的條件是query.get_equipped_item_name,偵測玩家手上的物品ID,命名空間可以省去。


    4. 因此,當玩家拿著「超級劍」,就會一直獲得回復效果。

    也可以把指令寫成一個.mcfunction檔案,放在行為包/functions/下,再用/function 指令喚出。


    第五部分: 編譯和打包分享

    將com.mojang資源包和行為包的資料夾壓縮成zip,檔名改成.mcaddon。

    可以選擇發表到巴哈姆特或者MCPEDL討論區。


    這裡下載這篇教學的範本檔案,檔案皆含有註解。

    也可於Github檢視原始碼。

    留言

    發佈留言

    此網誌的熱門文章

    Minecraft基岩版多人連線教學: 方法一覽

    【詳細解說】什麼是Minecraft基岩版,跟Java版有什麼差?

    Minecraft基岩版安裝模組(Add-On)&資源包&光影教學