この記事はMinecraft Java Edition ver.1.21.3 時点の情報を元に執筆しています。
本記事では、配布マップやデータパックを製作する中で知っておいた方が良さそうな情報やテクニックを雑多に書き出していきます。
Minecraft Command Advent Calendarで既に出ている記事と重複しているものもあります。この記事では簡単な概要のみを説明していくので、ぜひ興味のあるトピックは他の記事がないか探してみてください。
また、あくまで私流の使い方であり、最適な方法ではないかもしれません。本記事を足がかりとして、他の情報も探してみると良いと思います。
バニラのリソースパック・データパックの中身を見る
詳細
.minecraft/versions/<version>/<version>.jar
にバニラのリソースパック・データパックが格納されています。
「名前を変更」でファイルの拡張子を.jar
から.zip
に変更し、zipファイルとして展開することで簡単に中を覗くことができます。(大量のファイルが出てくるので注意)
その中にあるassets
フォルダにはリソースパック、data
フォルダにはデータパックのファイルが入っています。
データパックやリソースパックの構成・形式の見本としてや、バージョンアップ時の変更点の確認など、さまざまな時に参考にできます。
translate・カスタムフォント
langファイル/translateの活用
(こちらの部分は、昨年のアドカレの記事ですでに詳しく解説されております。詳しく知りたい方はこちらの記事がおすすめです。)
詳細
バニラのlangファイル(assets/minecraft/lang/*.json
)には各言語のゲーム内テキストが羅列されています。
日本語ならja_jp.json
, 英語ならen_us.json
です。
{
"accessibility.onboarding.accessibility.button": "Accessibility Settings...",
"accessibility.onboarding.screen.narrator": "Press enter to enable the narrator",
"accessibility.onboarding.screen.title": "Welcome to Minecraft!\n\nWould you like to enable the Narrator or visit the Accessibility Settings?",
"addServer.add": "Done",
"addServer.enterIp": "Server Address",
"addServer.enterName": "Server Name",
...
}
例えば、自作のリソースパックのlangファイルで下のように記述すると、その言語を選択したときにゲーム内で表示されるレシピ解禁テキストが変更されます。
{
"recipe.toast.title": "図鑑が更新されました",
"recipe.toast.description": ""
}
配布マップ内で表示されるゲームテキストを変更したい場合は、このように対応する箇所を探して変更しましょう。
また、自分で好きなtranslate
を追加することもできます。
チャットコンポーネントでtranslate
を指定し、設定したテキストを表示することができます。言語ごとに設定すれば、選択した言語に応じてテキストが変わります。
{
"sample_translate": "sample"
}
{
"sample_translate": "サンプル"
}
配布マップを多言語対応させたい場合はこの機能を活用しましょう。
カスタムフォント × translate
カスタムフォントについてはこちらの記事がおすすめです。
詳細
カスタムフォントをユニコードに対応付けたあと、カスタムフォントを表示する際に毎回「あの画像はどのユニコードに対応させたっけ...?」と確認するのは面倒です。
そんなときに、カスタムフォントにtranslate
を設定すると便利です。
{
"character.girl1.normal":"\ue200",
"character.girl1.smile":"\ue201",
"space.-1": "\uef00",
"space.-2": "\uef01",
"space.-3": "\uef01\uef00",
"space.-4": "\uef02",
"space.-5": "\uef02\uef00",
"space.-6": "\uef02\uef01",
"space.-7": "\uef02\uef01\uef00",
"space.-8": "\uef03",
"space.-9": "\uef03\uef00",
"space.-10": "\uef03\uef01"
}
さまざまなカスタムメニュー
テキスト系
チャット欄 (/tellraw など)
例: 昔作っていたボス角度調整システム関節角度情報は、画面でポーズを確認しながらスコアボードで設定した後に、storageに保存しておこうかなって感じ
— Keeema (キーマ) (@keeema_1) November 10, 2021
今後のためにできるだけテンプレ化していきたい pic.twitter.com/AkcMPQqWCu
(このボスもようやく配布マップで登場させられました。この時から丸3年かかってるってマジかよ...。ちなみに今はボスのアニメーションをAnimatedJavaで作っているので、この例のシステムはもう使ってません。)
/tellraw
コマンド等を使い、チャット欄にテキストを表示させるメニューです。clickEvent
でクリック時の処理を追加したり、リソースパックのカスタムフォントを使って画像を表示することが可能です。
チャット欄を占有するというデメリットがあり、チャットで会話しながらマルチプレイをしている人にとっては邪魔になってしまうかもしれません。
本/書見台/看板
例:配布マップ「AnemoLand」ベータ版のショップ
本や看板を使ったメニューです。
clickEvent
でクリック時の処理を追加したり、リソースパックのカスタムフォントを使って画像を表示することが可能です。
タイトル/アクションバー表示 (/title)
例1:データパック「MobTamer」のペット操作用メニュー (6:02~)
/title
コマンドでタイトルやアクションバーを表示させるメニューです。
タイトルやアクションバーはクリック操作が使えないため、他の操作が必要になります。
例では視点・スニーク・右クリック・ドロップを使って操作していました。
例2:昔作っていたカスタムHP/スタミナバー
HP/スタミナバーのテスト
— Keeema (キーマ) (@keeema_1) February 19, 2022
バニラ準拠でハート式の方が好きって人もいるかも知れないけど、こういう感じにする…かも?(わからん) pic.twitter.com/IFq4RH37b3
(これは2年前くらいまで作っていた配布マップです。約2年放置したのち作り直したため、現在はかなりシステムが変わってます。懐かしい。昔の方が凝ってないか?)
/title
コマンドでカスタムフォントを表示させ、このようなゲージ・マップなどを作ることも可能です。
現バージョンで/title
コマンドで自由な位置に画像やテキストを配置するためには、リソースパックでフォント(+場合によってはシェーダー)をいじる必要があります。
詳細は省きますが、ネガティブスペースで左右の位置を調整したり、フォントをいじって上下に動かしたりします。アドカレでも取り上げられるテーマなので、興味があれば他の記事も探してみてください。
このようなメニューは実装が難しいですが、工夫次第で面白いことができます。
アイテム系
チェスト等のインベントリ
例:昔作っていた加工システム
【素材チェストと加工台】
— Keeema (キーマ) (@keeema_1) September 26, 2022
手に入れた素材は素材チェストに格納されます。
加工台では、素材チェストの素材を消費して武器や防具を作成することができます。 pic.twitter.com/74I7H2Ok9A
(これは2年前くらいまで作っていた配布マップです。約2年放置したのち作り直したため、現在はかなりシステムが変わってます。懐かしい。昔の方が凝ってないか?)
チェストなどのインベントリ付きブロック・エンティティを使ったメニューです。
/item
, /clear
, /data modify
などのコマンドを使ってインベントリのアイテムを操作します。
アイテムのクリックや設置を検知し、設置アイテムを切り替えることでメニューを実装します。
プレイヤーのインベントリ
例:配布マップ「AnemoLand」ベータ版の装備変更システム
#AnemoLand
— Keeema (キーマ) (@keeema_1) November 9, 2024
外見装備システムが壊れてたので、直したついでに紹介!
・3セットの防具を登録可能
・簡単にセットを切り替え可能
・外見のみ他の装備を反映させられる
・防具の効果を得ながら非表示にもできる
(けっこう気に入っている。) pic.twitter.com/oJyzxN0JY5
プレイヤーインベントリを使ったメニューです。
/item
, /clear
, /data modify
などのコマンドを使ってインベントリのアイテムを操作します。
アイテムのクリックや設置を検知し、設置アイテムを切り替えることでメニューを実装します。
チェストメニューと異なる部分は、プレイヤーインベントリを/data
コマンドで直接編集できないことです。/item replace
や/item modify
を活用してアイテムを設置・編集する必要があります。
プレイヤーがどの場所でも、個別のメニューを閲覧・操作できることがメリットです。
ただし、インベントリの一部を占有してしまうというデメリットも存在します。
エンティティ系
エンティティ
例:データパック「MobTamer」の強化システム (7:20~)
display entity
, interaction
などを使ったメニューです。
item display
やtext display
でメニューを表示し、クリック判定を出現させたい場所にinteraction
などを配置して実装します。
interaction
は視点を合わせてクリックしたときに記録が残るエンティティです。その記録からクリックを検知することができます。
実際にエンティティを配置するので立体的な表現が可能であり、カスタムフォントやアイテムモデルを活用したメニューが作れます。
表現力や実装・演出の自由度がとても高く、面白いメニューを作ることができそうです。
いろいろ
インベントリのステータス効果一覧を見えなくする
詳細
インベントリの右側にはこのようにステータス効果が表示されます。
リソースパックを使い、これをこのように非表示にしてみます。
-
テキストを非表示に
言語ファイルの対応部分を消してしまいましょう。lang/en_us.json{ "enchantment.level.1": "", "enchantment.level.2": "", "enchantment.level.3": "", "enchantment.level.4": "", "enchantment.level.5": "", "enchantment.level.6": "", "enchantment.level.7": "", "enchantment.level.8": "", "enchantment.level.9": "", "enchantment.level.10": "", "effect.duration.infinite": "", "effect.minecraft.speed": "", "effect.minecraft.resistance": "", "effect.minecraft.night_vision": "" }
対応言語全てのファイルで同様に行いましょう。
効果時間が無限ではない場合、効果時間だけが表示されてしまいます。
(もし解決方法があれば教えてください🙇♂️) -
アイコンを非表示に
例えばspeed
エフェクトのアイコンを非表示にしたい時には、textures/mob_effect/speed.png
を透明な画像にします。
← これは16×16サイズの透明な画像です。「リンク先を保存」で保存できます。 -
ウィンドウを非表示に
textures/gui/sprites/container/inventory/effect_background_large.png
,(同ディレクトリ)/effect_background_small.png
を透明な画像にします。
元のレシピや進捗を無効化する
詳細
pack.mcmeta
のfilter
機能を使えば、バニラのレシピ・進捗を無効化できます。
{
"pack": {
/* 略 */
},
"filter": {
"block": [
{
"namespace": "minecraft",
"path": "recipe"
},
{
"namespace": "minecraft",
"path": "advancement"
}
]
}
}
インベントリのレシピブックに図鑑を作る
詳細
配布マップで本来のレシピ機能が必要なければ、インベントリのレシピブックを思い切って図鑑などにしてしまうのも良いかもしれません。
サンプル:
{
"type": "minecraft:crafting_shaped",
"category": "building",
"key": {
"#": "minecraft:light_gray_stained_glass_pane"
},
"pattern": [
"#"
],
"result": {
"count": 1,
"id": "minecraft:green_dye",
"components": {
"item_name": "【No.01-01】歩き茸",
"custom_model_data": 10,
"lore": [
"{\"text\":\" 進化の過程で歩行機能を獲得した茸。\",\"italic\":false,\"color\":\"yellow\"}",
]
}
}
}
- 1.21.3時点では、ファイル名の順でレシピブックにレシピが並ぶようです。
- プレイヤーがインベントリから確認できる図鑑を作るには、2×2で作れるレシピである必要があります。
- 1.21.2でレシピの原料にairが使えなくなりました。そのため、テクスチャを消したアイテムを原料としています。
- 図鑑用アイテムを作成できてしまわないように、配布マップ内で入手可能なアイテムを原料に使用しないようにしましょう。
- レシピをクリックした際にインベントリのクラフト欄に図鑑アイテムが表示されてしまいます。回避方法があったら教えてくれ!
タブについて:
タブは上から順に
- すべて
- タブアイコンはテクスチャ
minecraft/textures/item/compass_16.png
またはモデルminecraft/models/item/compass.json
から変更
- タブアイコンはテクスチャ
- 装備
"category": "equipment"
- タブアイコンはテクスチャ
minecraft/textures/item/iron_axe.png
,minecraft/textures/item/golden_sword.png
またはモデルminecraft/models/item/iron_axe.json
,minecraft/models/item/golden_sword.json
から変更
- 建材
"category": "building"
- タブアイコンはモデル
minecraft/models/block/bricks.json
から変更
- その他
"category": "misc"
- タブアイコンはテクスチャ
minecraft/textures/item/lava_bucket.png
,minecraft/textures/item/apple.png
またはモデルminecraft/models/item/lava_bucket.json
,minecraft/models/item/apple.json
から変更
- レッドストーン
"category": "redstone"
- タブアイコンはテクスチャ
minecraft/textures/item/redstone.png
またはモデルminecraft/models/item/redstone.json
から変更
好きな音楽を流す
詳細
リソースパックのminecraft/sounds/records/<record_id>.ogg
を上書きすることで、レコードの音楽を変えることができます。
<record_id>
は/playsound minecraft:music_disc.
の後に予測変換で出てくるidのいずれかです。
リソースパックでレコードの音楽を変えた後、/playsound minecraft:music_disc.<music_id>
で変更後の音楽が流れます。
/playsound minecraft:music_disc.<music_id> record
のようにサウンドカテゴリをレコードに設定するのがおすすめです。
カテゴリをレコードにした音は、「サウンド設定」の「ジュークボックス/音符ブロック」から音量調整ができるようになります。
配布マップのプレイヤーに「BGM音量を0にする」「レコード音量を調整する」ことをお願いした上で、自分で決めた音楽だけを好きなタイミングで流すこともできます。
配布マップでフリー音源を使用する場合、規約で「2次配布が許されている」または「暗号化されていない音源データを含んだ形式でデータを配布しても、ゲームが主体であれば2次配布にはあたらない」とされているか確認しましょう。
ログイン・初ログインしたプレイヤーを検知する&プレイヤーidスコアを割り当てる
詳細
scoreboard players
では、スコアホルダーに@a
を指定した際は「ログイン中のすべてのプレイヤー」が対象となり、*
を指定した際は「ログアウト中のプレイヤーを含むすべてのスコアホルダー」が対象となります。この差を利用し、ログインしたプレイヤーを検知することができます。
例えば、プレイヤーが存在するかどうかを管理するスコアexist
で以下のようにログイン検知を行うことができます。
tick関数:
execute as @a unless score @s exist matches 1 run function <ログイン関数>
scoreboard players reset * exist
scoreboard players set @a exist 1
私の場合は、初ログイン時にはプレイヤーid管理スコアplayer_id
を割り当てるようにし、このスコアが設定されていなければ初ログイン処理を行うようにしています。
ログイン関数:
execute unless score @s player_id matches 0.. run function <初ログイン関数>
初ログイン関数:
scoreboard players operation @s player_id = #new_player_id player_id
scoreboard players add #new_player_id player_id 1
コマンド権限無しでも使えるクリックイベント
詳細
チャット欄や本に表示するテキストに「クリックイベント」を設定すると、テキストをクリックした際にコマンドを実行させることができます。
しかし、そのコマンドはクリックしたプレイヤーを実行者とするので、コマンド権限がないと実行できない場合があります。
コマンド権限が無くても実行可能なコマンドに/trigger
コマンドがあります。
/trigger
コマンドではtrigger型で定義したスコアの値をセットできます。セットした値に応じて関数を実行するということをシステム側で行えば、権限が無くても擬似的に任意の関数を実行することができます。
trigger用のスコアを定義:
scoreboard objectives add <score_id> trigger
クリックイベントに設定するコマンド:
trigger <score_id> set <value>
tick関数内でexecute as @a if score @s <score_id> matches <range> run function
で、スコアに値がセットされた時を検知して以下の関数を実行:
execute if score @s <score_id> matches <value1> run <function1>
execute if score @s <score_id> matches <value2> run <function2>
…
scoreboard players reset @s <score_id>
scoreboard players enable @s <score_id>
triggerスコアを一度セットした後は、enableするまで再セットすることができません。
追記:記事執筆中にちょうど便利なライブラリが出ていました!
権限のないプレイヤーにも好きなコマンドを許可できるデータパックを公開しました。
— 赤石愛 (@AiAkaishi) December 9, 2024
(コマンド勢向け:triggerが超簡単に追加/削除できるライブラリです)https://t.co/LqQfYv04ml#Minecraft #マイクラ https://t.co/bXBtktrBSR
ワールドデータにリソースパックを同梱する(シングルプレイ向け)&ワールド・リソースパックのアイコンを設定する
詳細
リソースパックをzip圧縮したresources.zip
をワールドフォルダ内に入れることで、ワールド固有のリソースパックを設定することができます。
また、上のgifのように、リソースパック内にpack.png
、ワールドフォルダ内にicon.png
を置くことでリソースパック・ワールド選択画面のアイコンを設定することができます。データパックアイコンも同様にpack.png
で設定が可能です。
ワールドアイコンのサイズは64×64である必要があります。
マルチプレイの場合はサーバーリソースパックを設定するか、各プレイヤーがリソースパックを導入する必要があります。
さいごに
ボスバトル系配布マップ「AnemoLand」ベータ版を配布中です!(ダイレクト宣伝)
初めてマップを配布できたということで、流れでこんな記事を書いてみました。
私もこの配布マップを製作するにあたって、さまざまなコマンド勢の情報や実装を参考にしています。もし私の作品でも真似したい所があったら、遠慮なく参考にしてくれ!
それでは、良きコマンドライフを!