4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Minecraft CommandAdvent Calendar 2024

Day 11

配布マップに使えそうなTips 2024

Last updated at Posted at 2024-12-10

この記事は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です。

assets/minecraft/lang/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ファイルで下のように記述すると、その言語を選択したときにゲーム内で表示されるレシピ解禁テキストが変更されます。

assets/minecraft/lang/ja_jp.json
{
    "recipe.toast.title": "図鑑が更新されました",
    "recipe.toast.description": ""
}

スクリーンショット 2024-11-15 13.04.59.png

スクリーンショット 2024-11-15 13.05.49.png

配布マップ内で表示されるゲームテキストを変更したい場合は、このように対応する箇所を探して変更しましょう。

また、自分で好きなtranslateを追加することもできます。
チャットコンポーネントでtranslateを指定し、設定したテキストを表示することができます。言語ごとに設定すれば、選択した言語に応じてテキストが変わります。

assets/minecraft/lang/en_us.json
{
    "sample_translate": "sample"
}
assets/minecraft/lang/ja_jp.json
{
    "sample_translate": "サンプル"
}

スクリーンショット 2024-11-15 13.19.57.png

スクリーンショット 2024-11-15 13.20.21.png

配布マップを多言語対応させたい場合はこの機能を活用しましょう。

カスタムフォント × translate

カスタムフォントについてはこちらの記事がおすすめです。

詳細

カスタムフォントをユニコードに対応付けたあと、カスタムフォントを表示する際に毎回「あの画像はどのユニコードに対応させたっけ...?」と確認するのは面倒です。

そんなときに、カスタムフォントにtranslateを設定すると便利です。

assets/minecraft/lang/en_us.json
{
    "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"
}

スクリーンショット 2024-11-15 14.32.25.png

さまざまなカスタムメニュー

テキスト系

チャット欄 (/tellraw など) 例: 昔作っていたボス角度調整システム

(このボスもようやく配布マップで登場させられました。この時から丸3年かかってるってマジかよ...。ちなみに今はボスのアニメーションをAnimatedJavaで作っているので、この例のシステムはもう使ってません。)

/tellrawコマンド等を使い、チャット欄にテキストを表示させるメニューです。clickEventでクリック時の処理を追加したり、リソースパックのカスタムフォントを使って画像を表示することが可能です。

チャット欄を占有するというデメリットがあり、チャットで会話しながらマルチプレイをしている人にとっては邪魔になってしまうかもしれません。

本/書見台/看板

例:配布マップ「AnemoLand」ベータ版のショップ

output5.gif

本や看板を使ったメニューです。
clickEventでクリック時の処理を追加したり、リソースパックのカスタムフォントを使って画像を表示することが可能です。

タイトル/アクションバー表示 (/title)

例1:データパック「MobTamer」のペット操作用メニュー (6:02~)

/titleコマンドでタイトルやアクションバーを表示させるメニューです。
タイトルやアクションバーはクリック操作が使えないため、他の操作が必要になります。
例では視点・スニーク・右クリック・ドロップを使って操作していました。

例2:昔作っていたカスタムHP/スタミナバー

(これは2年前くらいまで作っていた配布マップです。約2年放置したのち作り直したため、現在はかなりシステムが変わってます。懐かしい。昔の方が凝ってないか?

/titleコマンドでカスタムフォントを表示させ、このようなゲージ・マップなどを作ることも可能です。

現バージョンで/titleコマンドで自由な位置に画像やテキストを配置するためには、リソースパックでフォント(+場合によってはシェーダー)をいじる必要があります。
詳細は省きますが、ネガティブスペースで左右の位置を調整したり、フォントをいじって上下に動かしたりします。アドカレでも取り上げられるテーマなので、興味があれば他の記事も探してみてください。

このようなメニューは実装が難しいですが、工夫次第で面白いことができます。

アイテム系

チェスト等のインベントリ

例:昔作っていた加工システム

(これは2年前くらいまで作っていた配布マップです。約2年放置したのち作り直したため、現在はかなりシステムが変わってます。懐かしい。昔の方が凝ってないか?

チェストなどのインベントリ付きブロック・エンティティを使ったメニューです。
/item, /clear, /data modifyなどのコマンドを使ってインベントリのアイテムを操作します。
アイテムのクリックや設置を検知し、設置アイテムを切り替えることでメニューを実装します。

プレイヤーのインベントリ

例:配布マップ「AnemoLand」ベータ版の装備変更システム

プレイヤーインベントリを使ったメニューです。
/item, /clear, /data modifyなどのコマンドを使ってインベントリのアイテムを操作します。
アイテムのクリックや設置を検知し、設置アイテムを切り替えることでメニューを実装します。
チェストメニューと異なる部分は、プレイヤーインベントリを/dataコマンドで直接編集できないことです。/item replace/item modifyを活用してアイテムを設置・編集する必要があります。

プレイヤーがどの場所でも個別のメニューを閲覧・操作できることがメリットです。
ただし、インベントリの一部を占有してしまうというデメリットも存在します。

エンティティ系

エンティティ

例:データパック「MobTamer」の強化システム (7:20~)

display entity, interactionなどを使ったメニューです。
item displaytext displayでメニューを表示し、クリック判定を出現させたい場所にinteractionなどを配置して実装します。
interactionは視点を合わせてクリックしたときに記録が残るエンティティです。その記録からクリックを検知することができます。

実際にエンティティを配置するので立体的な表現が可能であり、カスタムフォントやアイテムモデルを活用したメニューが作れます。
表現力や実装・演出の自由度がとても高く、面白いメニューを作ることができそうです。

いろいろ

インベントリのステータス効果一覧を見えなくする

詳細

インベントリの右側にはこのようにステータス効果が表示されます。

スクリーンショット 2024-11-19 16.48.03.png

リソースパックを使い、これをこのように非表示にしてみます。

スクリーンショット 2024-11-19 17.09.34.png

  • テキストを非表示に
    言語ファイルの対応部分を消してしまいましょう。

    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を透明な画像にします。
    image.png ← これは16×16サイズの透明な画像です。「リンク先を保存」で保存できます。

  • ウィンドウを非表示に
    textures/gui/sprites/container/inventory/effect_background_large.png, (同ディレクトリ)/effect_background_small.pngを透明な画像にします。

元のレシピや進捗を無効化する

詳細

pack.mcmetafilter機能を使えば、バニラのレシピ・進捗を無効化できます。

pack.mcmeta
{
  "pack": {
    /* 略 */
  },
  "filter": {
    "block": [
      {
        "namespace": "minecraft",
        "path": "recipe"
      },
      {
        "namespace": "minecraft",
        "path": "advancement"
      }
    ]
  }
}

インベントリのレシピブックに図鑑を作る

詳細

output5.gif

配布マップで本来のレシピ機能が必要なければ、インベントリのレシピブックを思い切って図鑑などにしてしまうのも良いかもしれません。

サンプル:

recipe/0101_walking_mushroom.json
{
	"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が使えなくなりました。そのため、テクスチャを消したアイテムを原料としています。
  • 図鑑用アイテムを作成できてしまわないように、配布マップ内で入手可能なアイテムを原料に使用しないようにしましょう。
  • レシピをクリックした際にインベントリのクラフト欄に図鑑アイテムが表示されてしまいます。回避方法があったら教えてくれ!

タブについて:

スクリーンショット 2024-11-13 0.28.48.png

タブは上から順に

  • すべて
    • タブアイコンはテクスチャ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関数:

tick.mcfunction
execute as @a unless score @s exist matches 1 run function <ログイン関数>
scoreboard players reset * exist
scoreboard players set @a exist 1

私の場合は、初ログイン時にはプレイヤーid管理スコアplayer_idを割り当てるようにし、このスコアが設定されていなければ初ログイン処理を行うようにしています。

ログイン関数:

login.mcfunction
execute unless score @s player_id matches 0.. run function <初ログイン関数>

初ログイン関数:

first_login.mcfunction
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するまで再セットすることができません。

追記:記事執筆中にちょうど便利なライブラリが出ていました!

ワールドデータにリソースパックを同梱する(シングルプレイ向け)&ワールド・リソースパックのアイコンを設定する

詳細

リソースパックをzip圧縮したresources.zipをワールドフォルダ内に入れることで、ワールド固有のリソースパックを設定することができます。

また、上のgifのように、リソースパック内にpack.png、ワールドフォルダ内にicon.pngを置くことでリソースパック・ワールド選択画面のアイコンを設定することができます。データパックアイコンも同様にpack.pngで設定が可能です。
ワールドアイコンのサイズは64×64である必要があります。

マルチプレイの場合はサーバーリソースパックを設定するか、各プレイヤーがリソースパックを導入する必要があります。

さいごに

ボスバトル系配布マップ「AnemoLand」ベータ版を配布中です!(ダイレクト宣伝)

初めてマップを配布できたということで、流れでこんな記事を書いてみました。
私もこの配布マップを製作するにあたって、さまざまなコマンド勢の情報や実装を参考にしています。もし私の作品でも真似したい所があったら、遠慮なく参考にしてくれ!

それでは、良きコマンドライフを!

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?