-
Notifications
You must be signed in to change notification settings - Fork 0
Tutorial
Sketch は、インベントリメニューを簡単に構築するための mcfunction フレームワークです。 インベントリメニューは、Sketch から提供されるAPIやイベントから構築することができます。
はじめに、メニューを作成するための準備をしましょう。
#> menu:init
execute in minecraft:overworld run function sketch:api/setup
sketch:api/setup
は、実行地点のディメンションで Sketch を正常に動作させるためのセットアップを行う関数です。
準備が完了したので、簡単なメニューを作成してみましょう。
#> menu:main/
item replace block 10000 0 10000 container.0 with minecraft:gray_stained_glass_pane{display:{Name:'""'}}
data modify storage sketch: in.key set value "f"
function sketch:api/register_item/button
data modify storage sketch: in.contents append value [f, f, f, f, f, f, f, f, f]
data modify storage sketch: in.contents append value [f, -, -, -, -, -, -, -, f]
data modify storage sketch: in.contents append value [f, f, f, f, f, f, f, f, f]
data modify storage sketch: in.id set value "main"
function sketch:api/build/auto
sketch:api/register_item/button
は、アイテムをボタンとして登録する関数です。
この場合では、アイテムに minecraft:gray_stained_glass_pane
、 アイテムのキーに "f"
を指定しています。
sketch:api/build/auto
は、実行者のプレイヤーが開いている チェスト付きトロッコ または エンダーチェスト にメニューを作成する関数です。
この場合では、メニューのidに "main"
を指定しています。
メニューの内容を指定する際、Sketch では配列によってチェストを視覚的に表現することができます。
ここでは、先ほど登録したキー "f"
と未登録のキー "-"
が指定されています。
このままではメニューが不完全なので、未登録のキーを登録しましょう。
#> menu:init
を、次の内容に更新します。
#> menu:init
execute in minecraft:overworld run function sketch:api/setup
item replace block 10000 0 10000 container.0 with minecraft:air
data modify storage sketch: in.key set value "-"
data modify storage sketch: in.isGlobal set value true
function sketch:api/register_item/normal
sketch:api/register_item/normal
は、アイテムを通常のまま登録する関数です。
この場合では、アイテムに minecraft:air
、 アイテムのキーに "-"
を指定しています。
すべてのメニューの作成に使われるような汎用的なアイテムには in.isGlobal
を指定することで、どの場所からでも参照することができます。
ここでは、in.isGlobal
に true
を指定しています。
このままではメニューに変更があってもメニューが再設定されないので、メニューが再設定されるようにしてみましょう。
// #> #sketch:set_menu/chest_minecart
{
"values": [
"menu_manager:set_menu"
]
}
// #> #sketch:set_menu/ender_chest
{
"values": [
"menu_manager:set_menu"
]
}
#sketch:set_menu/chest_minecart
は、チェスト付きトロッコにメニューを再設定する時に呼び出されるイベントです。
#sketch:set_menu/ender_chest
は、エンダーチェストにメニューを再設定する時に呼び出されるイベントです。
#> menu_manager:set_menu
execute if data storage sketch: callback{id:"main"} run function menu:main/
イベントの戻り値として、再設定するメニューのidが返ってきます。 同じidのメニューを作成することで、メニューに変更があった時に再設定されるようになります。
最後に、チェストを開いた時に作ったメニューが表示されるようにしてみましょう。
チェスト付きトロッコにメニューを表示する場合、あらかじめチェスト付きトロッコを登録しておく必要があります。
execute summon minecraft:chest_minecart run function sketch:api/register_chest_minecart
sketch:api/register_chest_minecart
は、実行者のチェスト付きトロッコを登録する関数です。
// #> #sketch:handler/on_open/chest_minecart
{
"values": [
"menu_manager:handler/on_open"
]
}
// #> #sketch:handler/on_open/ender_chest
{
"values": [
"menu_manager:handler/on_open"
]
}
#sketch:handler/on_open/chest_minecart
は、プレイヤーが登録済みのチェスト付きトロッコを開いた時に呼び出されるイベントです。
#sketch:handler/on_open/ender_chest
は、プレイヤーがエンダーチェストを開いた時に呼び出されるイベントです。
#> menu_manager:handler/on_open
function menu:main/
チェストを開いた時にメニューを作成することで、開いたチェストにメニューが表示されるようになります。
ここまででメニューの基本的な動作を作りましたが、このメニューにはまだ機能がありません。 インタラクティブなメニューを作る場合は、ここからメニューに機能を追加する必要があります。
ボタンが選択された場合に "select" と表示されるようにしてみましょう。
まずは #> menu:main/
を、次の内容に更新します。
#> menu:main/
item replace block 10000 0 10000 container.0 with minecraft:gray_stained_glass_pane{display:{Name:'""'}}
data modify storage sketch: in.key set value "f"
data modify storage sketch: in.listener set value "frame"
function sketch:api/register_item/button
data modify storage sketch: in.contents append value [f, f, f, f, f, f, f, f, f]
data modify storage sketch: in.contents append value [f, -, -, -, -, -, -, -, f]
data modify storage sketch: in.contents append value [f, f, f, f, f, f, f, f, f]
data modify storage sketch: in.id set value "main"
function sketch:api/build/auto
sketch:api/register_item/button
の引数に in.listener
を追加しました。in.listener
には、登録するアイテムのイベントリスナーを指定します。
この場合ではイベントリスナーに "frame"
を指定しています。
次に、ボタンを選択した時に呼び出されるファイルを設定します。
// #> #sketch:handler/on_select/chest_minecart
{
"values": [
"menu_manager:handler/on_select"
]
}
// #> #sketch:handler/on_select/ender_chest
{
"values": [
"menu_manager:handler/on_select"
]
}
#sketch:handler/on_select/chest_minecart
は、プレイヤーがチェスト付きトロッコのメニューでボタンを選択した時に呼び出されるイベントです。
#sketch:handler/on_select/ender_chest
は、プレイヤーがエンダーチェストのメニューでボタンを選択した時に呼び出されるイベントです。
#> menu_manager:handler/on_select
execute if data storage sketch: callback{id:"main"} if data storage sketch: callback{listener:"frame"} run say select
イベントの戻り値として、選択したボタンのイベントリスナーが返ってくるので、ボタンごとに選択時の動作を作ることができます。
ボタンが選択された場合に、別のメニューを表示するようにしてみましょう。
まずは新しいメニューを作成します。
#> menu:sub/
item replace block 10000 0 10000 container.0 with minecraft:light_blue_stained_glass_pane{display:{Name:'""'}}
data modify storage sketch: in.key set value "f"
function sketch:api/register_item/button
data modify storage sketch: in.contents append value [f, f, f, f, f, f, f, f, f]
data modify storage sketch: in.contents append value [f, -, -, -, -, -, -, -, f]
data modify storage sketch: in.contents append value [f, f, f, f, f, f, f, f, f]
data modify storage sketch: in.id set value "sub"
function sketch:api/build/auto
#> menu_manager:set_menu
execute if data storage sketch: callback{id:"main"} run function menu:main/
execute if data storage sketch: callback{id:"sub"} run function menu:sub/
次に、ボタンを選択した時に呼び出されるファイルを設定します。
#> menu_manager:handler/on_select
execute if data storage sketch: callback{id:"main"} if data storage sketch: callback{listener:"frame"} run say select
execute if data storage sketch: callback{id:"main"} if data storage sketch: callback{listener:"frame"} run function menu:sub/
先ほどのボタンを選択した時に、function menu:sub/
を実行するようにしました。
ボタンを選択した時にメニューを作成することで、開いているチェストに作成したメニューが表示されるようになります。
条件によって配置するアイテムが変わるような場合、アイテムを仮のものとして登録して、後から置き換えることができます。
クリエイティブモードなら minecraft:light_blue_stained_glass_pane
、それ以外なら minecraft:red_stained_glass_pane
のボタンを作ってみましょう。
まずは #> menu:sub/
を、次の内容に更新します。
#> menu:sub/
data modify storage sketch: in.key set value "f"
function sketch:api/register_item/variable
data modify storage sketch: in.contents append value [f, f, f, f, f, f, f, f, f]
data modify storage sketch: in.contents append value [f, -, -, -, -, -, -, -, f]
data modify storage sketch: in.contents append value [f, f, f, f, f, f, f, f, f]
data modify storage sketch: in.id set value "sub"
function sketch:api/build/auto
sketch:api/register_item/variable
は、アイテムを仮のものとして登録する関数です。
この場合ではアイテムを指定せず、アイテムのキーのみを指定しています。
仮のものとして登録したアイテムは、アイテム配置時に呼び出されるイベントで置き換えるアイテムを指定する必要があります。
// #> #sketch:set_variable/chest_minecart
{
"values": [
"menu_manager:set_variable"
]
}
// #> #sketch:set_variable/ender_chest
{
"values": [
"menu_manager:set_variable"
]
}
#sketch:set_variable/chest_minecart
は、チェスト付きトロッコに仮のアイテムを配置する時に呼び出されるイベントです。
#sketch:set_variable/ender_chest
は、エンダーチェストに仮のアイテムを配置する時に呼び出されるイベントです。
#> menu_manager:set_variable
execute if data storage sketch: callback{id:"sub"} run function menu:sub/variable
#> menu:sub/variable
execute if entity @a[gamemode=creative, tag=Sketch.Player] run item replace block 10000 0 10000 container.0 with minecraft:light_blue_stained_glass_pane{display:{Name:'""'}}
execute if entity @a[gamemode=creative, tag=Sketch.Player] run item modify block 10000 0 10000 container.0 sketch:register_item/button
execute if entity @a[gamemode=!creative, tag=Sketch.Player] run item replace block 10000 0 10000 container.0 with minecraft:red_stained_glass_pane{display:{Name:'""'}}
execute if entity @a[gamemode=!creative, tag=Sketch.Player] run item modify block 10000 0 10000 container.0 sketch:register_item/button
イベントの戻り値として、チェストを開いているプレイヤーには Sketch.Player
タグが設定されます。
ここでは、チェストを開いているプレイヤーのゲームモードによって配置するアイテムが変わるようにしています。
仮のアイテムを配置する際、アイテムの種類を指定するために、次のうちから一つのitem_modifierを適用する必要があります。
- sketch:register_item/normal (通常のアイテムとして指定)
- sketch:register_item/button (ボタンとして指定)
このチュートリアルでは、Sketch でインベントリメニューを構築するための基本的な仕組みについて触れてきました。
チュートリアルでは説明されていないAPIやイベントなどの詳細を含んだ完全な説明は、こちらを参照してください。