Skip to content

Tutorial

rarula edited this page Apr 6, 2023 · 3 revisions

概要

Sketch とは?

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.isGlobaltrue を指定しています。

メニューを再設定する動作を作る

このままではメニューに変更があってもメニューが再設定されないので、メニューが再設定されるようにしてみましょう。

// #> #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やイベントなどの詳細を含んだ完全な説明は、こちらを参照してください。

Clone this wiki locally