カスタムディメンジョンについてメモ書き

カスタムディメンジョンとは

ネザーやエンドのような、別の世界(ディメンジョン)を追加できる1.16.2以降で追加されるdatapackの新要素。バイオームや地形のカスタマイズは、複雑なのでまた別途、記事にすると思います。

参考 : Custom dimension – Official Minecraft Wiki

● 注意 ●
この記事はSnapshotをベースに書いています。なので、内容に正確性はありません。
また、かなり複雑な機能のため、初心者バイバイとなっております。

配置場所

カスタムディメンジョンを生成するためには、次にファイルを作成する必要があります。

● ディメンジョンの基本設定 (バニラの設定を使うなら不要)
saves/datapacks/(データパック名)/data/(名前空間)/dimension_type/(ディメンジョン).json

● ディメンジョンの詳細設定
saves/datapacks/(データパック名)/data/(名前空間)/dimension/(ディメンジョン).json

ディメンジョンの基本設定

バニラで用意されている定義を使う場合は、この設定は不要です。

{
    "has_raids": false,
    "logical_height": 256,
    "infiniburn": "minecraft:infiniburn_overworld",
    "ambient_light": 0.0,
    "piglin_safe": false,
    "bed_works": true,
    "respawn_anchor_works": false,
    "ultrawarm": false,
    "natural": true,
    "shrunk": false,
    "has_skylight": true,
    "has_ceiling": false
}
パラメータ 内容
has_raids 不吉な予感のエフェクトで襲撃が発生するか bool
logical_height プレイヤーが移動できる最大の高さ number
infiniburn 燃え続けるブロックのタグ
minecraft/tags/blocks/infiniburn_overworld.json のこと
string
ambient_light ディメンジョンの明るさ (デフォルトは0.5) number
piglin_safe ピグリンがゾンビ化するか bool
bed_works ベッドが機能するか bool
respawn_anchor_works リスポーンアンカーが機能するか bool
ultrawarm ネザーのように水が蒸発し、スポンジが乾き、溶岩が流れやすくなるか bool
natural コンパスなど通常世界で機能する内容を有効にするか bool
shrunk ネザーのようにポータル間の距離を1ブロック8mとして扱うか bool
has_skylight ディメンジョンに空があるか bool
has_ceiling ディメンジョンに天井があるか bool

バニラで用意されている定義

ディメンジョンの詳細設定

{
    "type": "custom:original",
    "generator": {
        (ディメンジョンの生成設定)
    }
}
パラメータ 説明
type ディメンジョンのタイプ
(名前空間)/dimension_type/に配置したファイル名かデフォルトのもの。
string
generator ディメンジョンの生成設定 object

ディメンジョンの生成設定

{
    "seed": 0,
    "type": "minecraft:noise", ★ 凸凹の地形を作る場合は"minecraft:noise"を指定
    "settings": "minecraft:overworld",
    "biome_source": {
        (バイオームの生成設定)
    }
}
パラメータ 説明
seed ワールドのシード値 number
type ディメンジョンのタイプ (minecraft:noise か minecraft:flat)
- noise : 通常のワールドのような凸凹の地形を作る
- flat : フラットワールドのような平面の地形を作る
string
settings ディメンジョンの生成ルール。
settingsで指定できる内容は後述。
string / object
biome_source バイオームの生成設定 object

settings でテンプレートのような地形を設定する

設定できる値 内容
minecraft:overworld 通常のワールドのような地形にする
minecraft:amplified 高低差をかなりつけた通常のワールドのような地形にする
minecraft:nether ネザーのような地形にする
minecraft:caves 地下世界のような地形にする
minecraft:end エンドのような地形にする
minecraft:floating_islands 浮島が複数あるような地形にする

任意の地形も生成できるけども、それはまた今度書きます。

バイオームの生成設定

バニラのようなバイオームを設定する

{
    "seed": 0,
    "type": "minecraft:vanilla_layered",
    "large_biomes": false
}
パラメータ 内容
large_biomes 各バイオームを広くするかどうか
- true: 広くする
- false: 通常通り
bool

エンドのようなバイオームを生成する

{
    "seed": 0,
    "type": "minecraft:the_end"
}

1つだけのバイオームを生成する

{
    "seed": 0,
    "type": "minecraft:fixed",
    "biome": "minecraft:plains"
}
パラメータ 内容
biome バイオームの種類
F3で出てくるBiomeを指定すれば良い
string

バイオームを正方形で生成する

{
    "seed": 0,
    "type": "minecraft:checkerboad",
    "biomes": [
        "minecraft:plains",
        "minecraft:jungle",
        "minecraft:desert"
    ],
    "scale": 2
}
パラメータ 内容
biomes バイオームの種類 (3つ以上)
F3で出てくるBiomeを指定すれば良い
array( string )
scale 各バイオームのサイズ(指定した値 x 2チャンク)
1なら2チャンク、8なら16チャンク
number

バイオームを好き勝手に生成する

{
    "seed": 0,
    "type": "minecraft:multi_noise",
    "biomes": [
        {
            "biome": "minecraft:plains",
            "parameters": {
                "altitude": 0.00,
                "temperature": 0.00,
                "humidity": 0.00,
                "weirdness": 0.00,
                "offset": 0.00
            }
        }
    ]
}
パラメータ 内容
biomes バイオームのリスト array( object )
biome バイオームの種類
F3で出てくるBiomeを指定すれば良い
string
parameters バイオームが適用される条件
生成されたワールドの各ポイントで、
最も条件に近いバイオームが選択される
object
parameters.altitude 高さ (-1.0 ~ 1.0)
1.0 に値が近ければ近いほど高い位置に生成される
バニラの山なら0.7、-0.45なら海
number
parameters.temperature 温度 (-1.0 ~ 1.0)
1.0 に値が近ければ近いほど温度の高い場所に生成される
バニラのサバンナなら0.6、タイガなら-0.6
number
parameters.humidity 湿度 (-1.0 ~ 1.0)
1.0 に値が近ければ近いほど湿度の高い場所に生成される
バニラのジャングルなら0.75、砂漠なら-0.75
number
parameters.weirdness 生成されにくさ (-1.0 ~ 1.0)
1.0 に値が近ければ近いほど生成されにくい
バニラのキノコ島なら0.8、平原なら-0.2
number
parameters.offset 他のバイオームとの重なり具合 (0.0 ~ 1.0)
1.0 に値が近ければ近いほど他のバイオームと重なる
バニラは基本0.0、ジャングルの端なら0.1
number

ディメンジョンに移動する方法

直接ディメンジョンには行けないので、コマンドで移動する必要がある。

/execute in (名前空間):(ディメンジョン) run tp @s ~ ~ ~

dataコマンドについてのざっくり?解説

dataコマンドとは

エンティティ、ブロック、ストレージなどのNBTデータを書き換えるコマンドです。

NBTデータってなに?って人はWikiを見てね。

NBTフォーマット - Minecraft Wiki

今回はdataコマンドがメインなので、どのエンティティに何のNBTが指定できるかとか、そういうのは無しでやります。

むしろそういうのが知りたいんだよ!って人はここを見てね。(更新されてるのかどうか知らないけども)

コマンド/データタグ - Minecraft Japan Wiki - アットウィキ

そして、dataコマンドの日本語のWikiを見たら、めっちゃ情報が古くてびっくりしたよ。ちょっと今回は詳しめに書いていくので、長くなります。

dataコマンドの形

では、はじめに、dataコマンドを1つにすると下みたいになります。

data <get|merge|modify|remove> <entity|block|storage> <target> <targetPath> 
  (append|insert <index>|merge|prepend|set)
  <from <entity|block|storage> <target> <targetPath>|value <value>>

まだ逃げないでください!ここから簡単に説明していきますから!

まず、dataコマンドで「やること」は4つに分かれます。

  • data get
    → 指定した(NBT)データを表示!
  • data merge
    → 指定した(NBT)データと合体!
  • data modify
    → 指定した(NBT)データを変更!
  • data remove
    → 指定した(NBT)データを削除!

ざっくりと説明するとこんな感じです。

さらにその後に下のような感じで「対象」がくっついてきます。

  • data <やること> entity <対象のエンティティ>
    → エンティティの(NBT)データに何かする! (ただし、1人限定なので、@pや[limit=1]を使おう)

  • data <やること> block <対象のブロックの座標>
    → ブロックの(NBT)データに何かする! (ただし、ブロックエンティティにしか使えません)

  • data <やること> storage <対象のストレージ名(好きな名前)>
    → ストレージの(NBT)データに何かする!

そして「何に対して」操作をするかをくっつけます。

  • data <やること> <対象> <このデータ!>

例えば、「自分」の「インベントリ」を全部「表示」したいなら、こんな感じ!

data get entity @p Inventory

基本はこれだけなので、それぞれの「やること」について説明していきましょう。

data get ~ (データを表示する)

まずは何をするにも、どんな風に反映されたか確認したいですよね。というわけで、getから。

※ 必ず /gamerule sendCommandFeedback true にしておいてください。

※ 詳しく知りたい方は、この手順通りに実際にためしてください。

表示するのはシンプルです。

data get <対象> (データ)

ちなみに、全表示したい場合は(データ)は書かなくてもOKです。

例えば、シンプルなチェストとかでやってみましょうか。

data get block <チェストのある座標>

こうすると下みたいな情報が取れましたかね?

{
    id: "minecraft:chest",
    x: -100,
    y: 60,
    z: 100,
    Items: []
}

例えば、idだけほしい!って時は下で取れます。

data get block <看板のある座標> id

さらに詳しく表示してみる

では、チェストの中に石をど真ん中に置いてみましょう。

そして、またgetしてみてください。そうするとItemsが下みたいになってると思います。

{
    Items: [
        {
            Slot: 13b,
            id: "minecraft:stone",
            Count: 1b
        }
    ]
}

追加されたみたいです!では、ピンポイントでこの情報だけを取りましょう。

Items[0]を指定するとチェストの左上から数えて0番目(実質1番目)のアイテム情報が取れます。

data get block <看板のある座標> Items[0]

そうすると、下のように取れましたかね?

{
    Slot: 13b,
    id: "minecraft:stone",
    Count: 1b
}

さらにさらに詳しく表示してみる

では、もっと深く、13番目にあるアイテムのidを表示してみましょう。こうします!

data get block <看板のある座標> Items[{Slot:13b}].id

うまく行けば、"minecraft:stone"が表示されたと思います。

ちょっと大雑把に説明するとこういうことができます。

Items ← チェストのアイテムリストをください
Items[0] ← チェストの左上から0番目のアイテムをください
Items[-1] ← チェストの最後(右下)から1番目のアイテムをください
Items[0].id ← チェストの0番目のアイテムのidをください
Items[{Slot:13b}] ← チェストの{Slot:13b}と書いているアイテムをください
Items[{Slot:13b}].id ← チェストの{Slot:13b}と書いているアイテムのidをください

ここまででなーんとなくふーんってなったらOKです!

data merge ~ (データを合体する)

!! \合体/ !! ということでmergeです。上で説明したチェストを使います。

まずはこうしてみましょう。

data merge block <チェストの座標> {Items:[{id:"minecraft:stone",Count:1b}]}

チェストの左上に石が出現しましたでしょうか?では、続いて。

data merge block <チェストの座標> {Items:[{Slot:8b,id:"minecraft:stone",Count:1b}]}

今度はチェストの右上に石が出現しましたでしょうか?

というわけで、mergeはもともとのデータと合体させるんですけど、他のget, modify, removeと違って、<データ>のところは合体させるNBTを書く必要があるんです。

ただ、mergeはちょっと使いづらいんですよね。全部書き換えちゃうから。

ストレージで効果を発揮するmerge

mergeはストレージを使うと一気に使い始めます。

ストレージは形式さえ守っていれば、自由にかけるので、こういうこともできます。

data merge storage test {id:101,aaa:"わーい",bbb:true}

そうして設定したものに、下のコマンドを実行します。

data merge storage test {aaa:"やーい",ccc:110}

そして、getで全部表示してみると、こんな感じになります。

{
    id: 101,
    aaa: "やーい",
    bbb: true,
    ccc: 110
}

もともとあったデータ同士で合体するのです!

ストレージに関しては過去のブログで詳しく書いてるので、気になる方はそちらを見てね。

keiduki.hatenablog.com

data modify ~ (データを変更する)

私の中で最も使うdataコマンドmodify。ただし、こいつだけやたらめったら長くなる!

modifyはNBTの後に、さらに下がくっついてきます。

  • data modify <対象> <データ> prepend ~

    → <データ>がリストなら、リストの一番最初に追加する

  • data modify <対象> <データ> append ~

    → <データ>がリストなら、リストの一番最後に追加する

  • data modify <対象> <データ> insert <番号> ~

    → <データ>がリストなら、リストの?番目に追加する(0番目が一番最初です)

  • data modify <対象> <データ> merge ~

    → <データ>がオブジェクトなら、合体する

  • data modify <対象> <データ> set ~

    → <データ>を書き換える

変更方法は5種類ありますが、私はsetを使うことがほとんどです。

ちなみにリストは [ ] のことで、オブジェクトは { } のことです。

そして、さらにこれらの後に、どういうデータで変更するのかがくっつきます。

  • data modify <対象> <データ> <変更内容> from <対象> <データ>

    → fromの後の<対象>の<データ>を追加、もしくは<対象>の<データ>に変更する

  • data modify <対象> <データ> <変更内容> value <値>

    valueの後の<値>に変更する

fromの方は他のNBTをコピー!valueの方は好きな内容に変更!って感じです。

modifyを一通り試してみる

ストレージで、実際にやってみます。まずはストレージを用意します。

data merge storage test {aaa:[2,3,4],bbb:{n:10,m:100},ccc:0}

まずは先頭に追加しましょう。aaaは [ ] なので、リストです。なので、prepend, append, insertが使えます。

data modify storage test aaa prepend value 100

そしたらgetで表示してみましょう。[100, 2, 3, 4] が表示されたらOK!

data get storage test aaa

次は最後に追加しましょう。

data modify storage test aaa append value -100

そして、getで表示すると、[100, 2, 3, 4, -100] が表示されるはず!


次は途中に追加しましょう。100が0番目なので、3番目になる位置(3の後)に追加しましょう。

data modify storage test aaa insert 3 value 9999

getで表示すると、[100, 2, 3, 9999, 4, -100] が表示されましたかね?


では、合体を試しましょう。基本はdata mergeと同じです。

最初に用意したストレージのbbbはオブジェクトなので、そこにマージしましょう。

data modify storage test bbb merge value {n:200,abc:"あいう"}

getで表示してみましょう。{n: 200, m: 100, abc: "あいう"} になりましたかね?

data get storage test bbb

最後に、変更を試しましょう。

data modify storage test ccc set value 0

getで表示すると、0 になりましたよね?

data get storage test ccc

ちなみにsetに関しては新規追加もいけるので、下みたいに値を追加できます。

data modify storage test new set value "新しい!"

valueばっかりだったので、fromの方も一つだけ。チェストにアイテムをいれて下のコマンドをやってみよう!

data modify storage test ccc set from block <チェストの座標> Items

getするとチェストのアイテムリストが表示されるはず!

data remove ~ (データを削除する)

ようやく最後のやつです。さっくり流します。remove

使い方はgetと同じような感じになります。表示する代わりに削除ってことですね。

data remove <対象> <データ>

では、さっきまで使っていたストレージのaaaを削除しましょう。

data remove storage test aaa

getしてみてください。消えましたかね?

まとめ

dataコマンドはNBTデータをアレコレするやつ!

dataコマンドは大きく分けて4種類!

  • 表示する get
  • 合体する merge
  • 変更する modify
  • 削除する remove

dataコマンドは複雑で難しい!!!

Advancementを使ったイベント検知のサンプル集

Advancement とは

イクラの進捗のことですね。

何らかのプレイヤーが行った動き(トリガー)によって、進捗が開放されるアレです。

今回はそれを使って、イベント検知しちゃおうってブログです。

基本的な処理の流れ

こんな感じでやっていきます。

  1. Advancementでトリガーを設定!
  2. 勝手にトリガーが検知!
  3. functionを呼び出す!
  4. /advancement コマンドで取得した進捗をなかったことにする!
  5. やりたいことをやる!

では、まずはAdvancementファイルを作っていきましょう。

root.jsonを追加する

まずは準備として、以下にファイルを作りましょう。

datapacks/<データパック>/data/<パック>/advancements/<名前>/root.json

そして、root.jsonはこんな感じで書いちゃいましょう。ちなみにroot.jsonは必須ファイルです。

※ プレイヤーが見ない部分なので極限まで削ってます。こだわりたい方はこだわってください。

{
    "display": {
        "title": "",
        "description": "",
        "icon": {
            "item": "air"
        }
    },
    "criteria": {
        "": {
            "trigger": "impossible"
        }
    }
}

進捗を追加する

では、イベント取得用の進捗を追加しちゃいましょう。

datapacks/<データパック>/data/<パック>/advancements/<名前>/<イベント>.json

そして中身はこちら。

※ 極限まで削ってます。以下略。

{
    "parent": "<パック>:<名前>/root",
    "display": {
        "title": "",
        "description": "",
        "icon": {
            "item": "air"
        },
        "show_toast": false,
        "announce_to_chat": false,
    },
    "criteria": {
        ★ ここは後で説明します。
    },
    "rewards": {
        "function": "★ 呼び出したいfunctionファイル(x:exec みたいな)"
    }
}

何を追加したのかをざっと説明。

  • parent: この進捗の一つ前の進捗を指定。今回は全部rootにつなげます。
  • display.show_toast: 右上に表示するかどうか。もちろん表示しないので、false。
  • display.announce_to_chat: チャットに表示するかどうか。もちろん表示しないので、false。
  • rewards.function: 進捗が達成されたときに呼び出すfunctionファイル。

トリガーを書く

はい。今回のメインです。前のcriteriaに指定するのですが、詳しく説明を始めると膨大なので、私が使いそうなやつだけピックアップ!

他のトリガーや詳しい条件など見たい方はこちらを見てね。

https://minecraft-ja.gamepedia.com/%E9%80%B2%E6%8D%97/JSON%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88

https://minecraft.gamepedia.com/Advancement/JSON_format

特定の村人に話しかけた

「村人A」という名前がついた村人に話しかけたときにイベント発生させる例。

1.16で追加されたトリガー。

{
    "criteria": {
        "": {
            "trigger": "player_interacted_with_entity",
            "conditions": {
                "entity": {
                    "type": "villager",
                    "nbt": "{CustomName:'{\"text\":\"村人A\"}'}"
                }
            }
        }
    }
}

ちなみに村人は下のコマンドで召喚すると、取引画面が出ません。

summon villager ~ ~ ~ {NoAI:true,Offers:[],CustomName:'"村人A"'}

特定のアイテムを使った

event:special というタグがついたリンゴを食べたときにイベント発生させる例。

{
    "criteria": {
        "": {
            "trigger": "consume_item",
            "conditions": {
                "item": {
                    "item": "apple",
                    "nbt": "{event:special}"
                }
            }
        }
    }
}

ちなみに上のアイテムは下のコマンドで手に入ります。(アイテムなら任意のタグがつけられます)

give @p apple{event:special}

特定のモブにダメージを受けた

ケルトンが打った矢でダメージ受けたときにイベント発生させる例。

{
    "criteria": {
        "": {
            "trigger": "entity_hurt_player",
            "conditions": {
                "damage": {
                    "source_entity": {
                        "type": "skeleton",
                        "direct_entity": {
                            "type": "arrow"
                        }
                    }
                }
            }
        }
    }
}

特定のモブに倒された

クリーパーの爆発で倒されたときにイベント発生させる例。

{
    "criteria": {
        "": {
            "trigger": "entity_killed_player",
            "conditions": {
                "entity": {
                    "type": "creeper"
                },
                "killing_blow": {
                    "is_explosion": true
                }
            }
        }
    }
}

特定のモブにダメージを与えた

プレイヤーにダメージを与えたときにイベント発生させる例。

{
    "criteria": {
        "": {
            "trigger": "player_hurt_entity",
            "conditions": {
                "entity": {
                    "type": "player"
                }
            }
        }
    }
}

特定のモブを倒した

ダイヤ剣でモブを倒したときにイベント発生させる例。

{
    "criteria": {
        "": {
            "trigger": "player_killed_entity",
            "conditions": {
                "killing_blow": {
                    "source_entity": {
                        "nbt": "{SelectedItem:{id:\"minecraft:diamond_sword\"}}"
                    }
                }
            }
        }
    }
}

特定のブロックを置いた

石をxが-100、yが1~10の間、zが100~110の間に置いたときにイベント発生させる例。

{
    "criteria": {
        "": {
            "trigger": "placed_block",
            "conditions": {
                "item": {
                    "item": "stone"
                },
                "location": {
                    "position": {
                        "x": -100,
                        "y": {
                            "max": 10,
                            "min": 1
                        },
                        "z": {
                            "max": 110,
                            "min": 100
                        }
                    }
                }
            }
        }
    }
}

functionファイルで進捗を消す

イベントが一回しか取得できないのは困りますよね。

ということで、呼び出された瞬間に進捗をなかったことにしちゃいましょう。

# 呼び出されたので進捗を消す
advancement revoke @s only <パック>:<名前>/<イベント>

# 消したらなにかする
tellraw @s "Hello World!"

@sを使っていますね。そうです。進捗を達成したプレイヤーがfunctionファイルを呼び出したことになるので、@sが使えちゃいます!

トリガーの種類も条件もいっぱいある

ということで、進捗でイベントを取得してコマンドを実行する方法でした。

トリガーは数十種類ありますし、条件もかなり大量にあります。あなたがやりたいことが見つかるかも?

1.16について私目線でざっくり見ていく

Minecraft JE ver1.16が来ましたね

ということで、私が気になったポイントにのみ絞り込んでざっくり、コメントしながら書き上げていく誰得ブログ始まります。

[注意]
全部の変更点を上げたりしません。気になったところだけです。
正確性もありません。キノミキノママ、書いていきます。
詳しいことを知りたい方は、ご自身で調べることを推奨します。

参考

https://minecraft-ja.gamepedia.com/Java_Edition_1.16

https://minecraft.gamepedia.com/Java_Edition_1.16

追加要素

追加部分は基本的に全部あげます。ちなみにイチオシポイントは太字にしてます。

ブロック

  • 古代の残骸:ほぼ新しい原木にしか見えない
  • 玄武岩:いい石床模様
  • 磨かれた玄武岩:ちょっと変わった原木に見える
  • ブラックストーン関係:建材いっぱい増えた!
  • :これ、建材にめっちゃ使えそう
  • ネザーレンガ新種:ちょっと足りていなかった建材が増えた!
  • 真紅のキノコ・歪んだキノコ:キノコ増えたね
  • 真紅のナイリウム・歪んだナイリウム:めっちゃきもい草ブロック
  • その他真紅&歪んだナイリウム系:オークの原木などと同様に大量に木造建材が増えたね! テクスチャいっぱい割当放題!
  • 泣く黒曜石:パーティクルの出る光源ブロック
  • 菌糸:見た目めっちゃきもいけど建材が増えた!
  • ロードストーン: コンパスを使うとコンパスがそこを指すようになる、配布マップで使えそう
  • ネザー金鉱石:ネザーで金塊拾えるよ
  • ネザー系の草:しだれツタねじれツタは地味に有能。はしごやツタみたいに壁に沿わせなくても上り下りできるようになった!
  • クォーツレンガ:これが欲しかったんでしょ?ってやつ
  • リスポーンアンカー:ネザーでのベッド的役割。ネザー以外で使うと爆発するぜ
  • シュルームライト:光源がふえたぞ!
  • 魂(ソウル)系:光源がなんかめっちゃ増えたぞ!
  • ソウルソイル:着火すると青い炎がつくので、なにかに使えそう
  • :見た目がアレだけど、マトだよ。矢を打ち込むとレッドストーン信号がでるのは強い!

ブロックめっちゃ増えてない?

アイテム

  • ロードストーンコンパス:ロードストーンを指し示すコンパス。これは使えそうですぞ
  • Pigstep レコード:久々の新曲?
  • ネザライト系装備&ツール:装備とツールが増えた!しかもダイヤモンドよりも強い!しかも溶岩で燃えない!
  • ネザライトインゴット:溶岩で燃えないインゴット!
  • ネザライトの欠片:溶岩で燃え(略
  • ブタの旗の模様:春の新色でました
  • スポーンエッグ:ホグリン・ピグリン・ストライダー・ゾグリンが仲間入り
  • 歪んだキノコ付きの棒ストライダーを操作できる棒だが、きっとニンジン棒と同じ使われ方をするでしょう

モブ

  • ホグリン:敵モブ。子供アリ。通常ワールドに来るとゾグリン(ゾンビホグリン)に変化!
  • ピグリン:大人は敵モブ。子供は友好モブ。通常ワールドに来るとゾンビピッグマン(ゾンビピグリン)に変化!ピグリンの前に金インゴットを落としたり、持って右クリックするとアイテムをくれる。
  • ストライダ:友好モブ。水や雨でダメージを受ける。溶岩の「上」を移動する。
  • ゾグリン:ホグリンゾンビ。

エンチャント

  • ソウルスピード:ソウルサンドやソウルソイルの上ならスピードアップ!

変更要素

ブロック

  • 鐘:いろんな発射物で当たるとなるようになった
  • 焚き火:発射物が炎を通過すると着火するようになった。火がついてないときでも食べ物をおけるようになった
  • ディスペンサー:鞍や馬鎧をつけられるようになり、ラマにはカーペットをつけられるようになり、ムーシュルームやスノーゴーレムにハサミを使えるようになった
  • 炎:ルートテーブルが追加された。炎を消すとアイテムドロップさせられるようになったみたい
  • レッドストーンダスト:これは別枠で。
  • ストラクチャーブロック:最大サイズが各軸32から48に拡張された。やったぜ!
  • TNT:燃えた着火物が当たると着火するようになった。ギミックに使えるやも?
  • 塀:板ガラスと鉄格子がつながるようになった。縦方向に柱があるところは全部柱になった

アイテム

  • クワ:効率強化・幸運・シルクタッチがつけられるようになった。 スポンジ、濡れたスポンジ、葉などなどいくつかのブロックで効果あり。
  • 時計とコンパス:レシピブックや村人の取引画面で、機能が無効化された。要するに正確な時間と場所を示さなくなった。

モブ

  • アイアンゴーレム:村人の職業や労働時間に関係なくスポーンするようになった
  • ケルトンホース・ゾンビホース:リードでつなげられるようになった
  • 中立モブ:「AngryAt」のデータタグで誰を対象に起こるのか設定できるようになった。

エンティティ

  • 全エンティティ:UUIDがUUIDMost & UUIDLeastから、{UUID:[I;000000,000000,000000,000000]}みたいな形式になった。これでUUIDを取り出しやすくなるね!

  • 額縁:「Invisible」額縁を透明にするデータタグと「Fixed」額縁を壊せなく、中のアイテムを削除できなくなるデータタグが追加された!!

レッドストーンダスト(要点をまとめると)

  • 1つだけ置いた場合は十字で設置され、右クリックすると点になる。
  • レッドストーンダストは直接、線がつながったブロックと真下にあるブロックにだけレッドストーン信号を送る。

コマンド

追加コマンド

今回はコマンドの追加が少なくて、製作中の配布マップに優しい仕様!

/attribute

面倒くさいattributeがコマンドになったぞ!

詳細は、また別でいつか書くかな。

/locatebiome

特定のバイオームを探すコマンド。

/gamerule forgiveDeadPlayers

敵視されている状態でプレイヤーが死んだときに、敵視を解除するかどうか設定。

/gamerule universalAnger

キレてるモブがキレさせたプレイヤーだけでなく、全プレイヤーにキレはじめる設定。

変更コマンド

/spawnpoint

全ディメンジョンで実行できるようになった

/summon

attributeの属性の名前が全部変更になっているので、正しい名前にしないと召喚できなくなった

/clear

インベントリのクラフト部分でもアイテムを削除するようになった!!!

/spreadplayers

高さ制限を付ける機能が追加された

/spreadplayers <center> <spreadDistance> <maxRange> under <maxHeight> <respectTeams> <target>

追加オブジェクト種別

custom:strider_one_cm

ストライダーで移動した距離。使い所は限られそう。

追加パーティクル

  • ash: 垂れてくる黒い点
  • crimson_spore:めっちゃ散らばる赤い点
  • soul_fire_flame:青い火
  • warped_spore:めっちゃ散らばる黒い点
  • dripping_obsidian_tear:垂れてくる紫の点
  • falling_obsidian_tear:垂れてくる紫の点
  • landing_obsidian_tear:垂れてくる紫の点
  • soul:青い魂がくるっと回って消えていく(かわいい)

進捗

追加トリガー

え?今回、使えるトリガーめっちゃ多くないですか?

smokey

焚き火の煙にあたったら作動!

なんか呪い解除とかそういうイベントに使えそう?

thrown_item_picked_up_by_entity

プレイヤーが投げたアイテムを別のプレイヤーが拾ったときに作動!

マルチゲーム関係のイベントに使えそう

player_generates_container_loot

プレイヤーがルートテーブルが設定されてるコンテナを開いたときに作動!

特定のチェストを開いたらイベントとかよくあるよね。使えそう

item_used_on_block

プレイヤーがブロックを操作したときに作動!

ドアを開閉したり、レバー起動したりでも発動するようなので、使えそう

player_interacted_with_entity

プレイヤーがエンティティになにかしたときに作動!

よくある村人に話しかけたら、セリフが出るコマンドに革命が起こる!しかもどのエンティティにやったのか、どういうアイテムを持ってやったのかも含められるから、使いどころしか無い!

Predicate

entity_properties

エンティティ関係の条件に以下の2つが追加されたよ!

  • vehicle:なにかに乗っている。馬やボートに乗ってる、降りてるが判断できるのはありがたい!
  • target:モブが他のエンティティを敵視しているか判定できるよ!
  • fishing_hook:どこで釣りをしていたのか判定できるのかな?

リスト指定

下のようにすると全条件を達成しているかどうかを判定できるようになった!!!(AND判定)

[ ★ トップがリストになっている
    {
        "condition": "minecraft:entity_properties",
        :
        :
    },
    {
        "condition": "minecraft:random_chance",
        :
        :
    }
]

タグ

追加ブロック&アイテムタグ

  • crimson_stems:真紅系のブロック・アイテム
  • gold_ores:金鉱石関係のブロック・アイテム
  • logs_that_burn:木炭を作れるブロック・アイテム
  • non_flammable_wood:かまどの燃料に使えない木材
  • piglin_repellents:ピグリンが拾わないブロック・アイテム
  • soul_fire_base_blocks:魂の火が着くブロック・アイテム
  • warped_stems:歪んだ系のブロック

追加ブロックタグ

  • beacon_base_blocks:ビーコンの下に置いて作動するブロック
  • campfires:焚き火関係
  • climbable:登れるブロック
  • fence_gates:フェンスゲート
  • fire:炎
  • guarded_by_piglins:プレイヤーが壊すとピグリンがキレるブロック
  • hoglin_repellents:ホグリンが避けるブロック
  • infiniburn_end:エンドで炎が燃え続けるブロック
  • infiniburn_nether:ネザーで炎が燃え続けるブロック
  • infiniburn_overworld:通常世界で炎が燃え続けるブロック
  • nylium:ナイリウム
  • pressure_plates:感圧板
  • prevent_mob_spawning_inside:モブがスポーン出来ないブロック
  • soul_speed_blocks:ソウルスピードのエンチャントで加速するブロック
  • stone_pressure_plates:石関係の感圧板
  • strider_warm_blocks:このブロック以外の場所にいるとストライダーは紫色になる
  • wall_post_override:塀の上に置くと、塀に柱を追加するブロック
  • wart_blocks:ウォート系のブロック
  • wither_summon_base_blocks:ウィザー召喚に使えるブロック

追加アイテムタグ

  • beacon_payment_items:ビーコンを起動するためのアイテム
  • creeper_drop_music_discs:クリーパーがドロップするアイテム
  • furnace_materials:かまどを作るために使えるアイテム
  • piglin_loved:ピグリンが好きなアイテム
  • stone_tool_materials:石ツールを作るために使えるアイテム

追加エンティティタグ

  • impact_projectiles:コーラスフルーツなどを遠隔で壊せるエンティティ

テキストJSON

テキスト関係のJSONの変更点です。

色がカラーコードで指定できる用意なった!!!

/tellraw @p {"text":"test","color":"#FF00FF"}

フォント

リソースパックに入れた好きなフォントを使えるようになった!!!

/tellraw @p {"text":"test","font":"emoji"} ★ emojiはリソースパックに追加してね

hoverEvent

valueの代わりにcontentsが使えるようになった。

/tellraw @p {
    "text": "test",
    "hoverEvent": {
        "action": "show_text",
        "contents": {
            "text": "見たことのないアイテムだ!",
            "bold": true
        }
    }
}

カスタムディメンジョン (実験段階)

ついにディメンジョンをカスタムできるようになった!強い!!!

ただし、まだ実験段階なので、ワールド読み込み時に警告がでます。

ファイルの設定内容はこちらを見てね。

https://minecraft.gamepedia.com/Custom

サンプルはここでいっぱいダウンロードして見ることができそう。

datapacks/data/minecraft/dimension/<名前>/<ディメンジョン名>.json がそのファイルだよ。

https://www.planetminecraft.com/data-packs/world-generation/?op1=50

ちなみにそのディメンジョンに行くには、下のコマンドで移動できます。

/execute in <名前>:<ディメンジョン名> run tp @p ~ ~ ~

ゲームシステム

ワールド生成

難易度やゲームルール、データパックの追加などを行えるようになった!

ゲームモードの切り替え

「F3 + F4」でゲームモードが簡単に切り替えられるようになった!素晴らしい!

エンティティの描画距離

50%~500%でモブが描画されるかどうか設定できるようになった。軽量化に役立つね!

釣り

宝物は浮きの周り、5 x 4 x 5以内が水源と空気(スイレンの葉はOK)しかない場所じゃないと釣れなくなった。

ルートテーブルで何かしら指定していた方は要注意!

個人的に熱い!と思った追加・変更点

  • ネザライト系装備&ツールの追加
  • 額縁の「Invisible」と「Fixed」タグの追加
  • /attributeコマンドの追加
  • /clearコマンドでインベントリのクラフト部分からも削除
  • 進捗のplayer_interacted_with_entityのトリガー追加
  • PredicateのAND判定
  • カスタムディメンジョン

ってところですかね?

Attribute(属性)のメモ書き

Attribute(属性)とは

プレイヤーやモブなどのエンティティが、特定箇所に装備しているときだけ発動する効果のこと。

装備しているとは以下のときなので、インベントリに入れているだけでは発動しません。

  • メインハンドに持っている
  • オフハンドに持っている
  • 頭に装備している
  • 胴に装備している
  • 腰に装備している
  • 脚に装備している

ここ以降はAttributeは属性と言い換えてメモしていきます。

属性の基本形

装備品に指定する場合

{
    AttributeModifiers:[
        {
            Slot: "mainhand",
            AttributeName: "generic.attackDamage",
            Amount: 20.0,
            Operation: 0,
            UUIDMost: 1L,
            UUIDLeast: 1L
        }
    ]
}
パラメータ 説明 定義 必須
Slot 効果を発動させる装備場所
- メインハンド : mainhand
- オフハンド : offhand
- 頭 : head
- 胴 : chest
- 腰 : feet
- 脚 : legs
string
AttributeName 発動する効果 string
Amount 発動する効果の値・倍率 number
Operation Amountの計算方法 number
UUIDMost / UUIDLeast 属性の固有の値 number(Long)

モブ側のデフォルト値を変更する場合

{
    Attributes:[
        {
            Name: "generic.attackDamage",
            Base: 1.0
        }
    ]
}
パラメータ 説明 定義 必須
Name 発動する効果 string
Base 基本となる値 number

Attribute NameとNameに指定できる属性

各属性には最小値と最大値が設定されており、それを超える値は最大値(最小値)に設定されるので注意。

AttributeName / Name 効果 デフォルト値
generic.maxHealth ハートを増減させる(1につき0.5個) 20.0
generic.followRange モブの攻撃対象の検出距離 32.0
generic.knockbackResistance ノックバックの抵抗確率 0.0
generic.movementSpeed 移動速度 0.7
generic.attackDamage 攻撃ダメージ(1につき0.5個) 1.0
generic.armor 防御ダメージ 0.0
generic.armorToughness 防具の耐久力 0.0
generic.attackKnockback ノックバック 0.0
generic.attackSpeed プレイヤーの攻撃クールダウンの時間(秒) 4.0
generic.luck プレイヤーの運。ルートテーブルなどで使用 0.0
horse.jumpStrength 馬のジャンプ力 0.7
generic.flyingSpeed オウムの飛行速度 0.4
zombie.spawnReinforcements ゾンビ攻撃時に別のゾンビを召喚する確率 0.0

Amount と Operation について

Attributeを計算する場合にどのような計算方法を使うかを選択できます。

デフォルトは0。

例として、以下の属性を与えた場合の説明をします。

// アイテムA (メインハンドに持つ)
{
    AttributeModifiers:[
        {
            AttributeName: "generic.maxHealth",
            Amount: 1.0,
            Operation: ???,
            UUIDMost: 1L,
            UUIDLeast: 1L
        }
    ]
}
// アイテムB (オフハンドに持つ)
{
    AttributeModifiers:[
        {
            AttributeName: "generic.maxHealth",
            Amount: 2.0,
            Operation: ???,
            UUIDMost: 2L,
            UUIDLeast: 2L
        }
    ]
}

単純に値を追加する : 0

プレイヤーの最大体力のデフォルト値が20なので、

20 (デフォルト) + 1 (アイテムA) + 2 (アイテムB)

の合計値、23(ハート11.5個)が最大体力になります。

元の値に掛けてから足す : 1

プレイヤーの最大体力をベースとすると、

20 (デフォルト) + (20 x 1 (アイテムA)) + (20 x 2 (アイテムB))

となるので、

20 + 20 + 40

の合計値、80(ハート40個)が最大体力になります。

アイテムの説明文としては、+100%などのパーセント表記で表されます。

値に1を足してから掛ける : 2

またもプレイヤーの最大体力をベースとすると、

20 (デフォルト) x (1 + 1 (アイテムA)) x (1 + 2 (アイテムB))

という感じで計算されます。つまり、

=> 20 x 2 x 3
=> 20 x 6
=> 120

ということで、合計値の120(ハート60個)が最大体力になります。

こちらもアイテムの説明文としては、+100%などのパーセント表記で表されます。

UUID Most / Least について

UUIDとはなにか?

=>たった一つしか存在しないIDのこと

ということで、UUID Most/Least です。この2つはペアになっており、MostとLeastの組み合わせてIDが作られています。例えば、Mostが1L、Leastが2Lならばマイクラ上では下のようなUUIDが作り上げられます。

UUID : 00000000-0000-0001-0000-000000000002

UUIDの制限

UUID Most/Leastはマイナス値だとうまく反映されません。

正確には、反映されるのですがオーバーフローします。要するにバグります。

UUID Most/Leastは-9223372036854775808~9223372036854775807の間で指定できますが、UUID Leastが0だと属性の効果が反映されませんので、注意しましょう。

UUIDは同じ属性の中でぶつかり合う

さて、このUUID。同じ属性同士で同じUUIDを使って両方装備してしまうとどうなるのか。

効果が反映されたり、されなかったりして、バグります。

UUIDさえ異なれば良いので、UUID Mostが一緒でもUUID Leastが異なるなら、セーフです。

逆にUUID Leastが一緒でもUUID Mostが異なるなら、セーフです。

データパックの配布を行う場合は気をつけよう

データパック同士が同じUUIDを使っているとどうなるか。

バグります。ちゃんとIDを決めてあげましょう。

マイクラのテキスト表示のJSONを整理する

普通のJSONとマイクラJSONの違い

まずは、テキスト表示の前にこちらを見てJSONについて理解をちょっとしておきましょう。

keiduki.hatenablog.com

テキスト表示する基本パターン

まず、JSONの話を始める前に表示パターンがいくつかあるので、見ていきましょう。

これらは全てABCDと表示されます。

  • 文字列だけで表示するパターン
tellraw @p "ABCD"
  • リストに入れて、文字列を複数、表示するパターン
tellraw @p ["AB","CD"]
  • オブジェクトに入れて表示するパターン
tellraw @p {"text":"ABCD"}
  • リストに入れて、オブジェクトを複数、表示するパターン
tellraw @p [{"text":"AB"},{"text":"CD"}]

基本的には、文字列かオブジェクトで内容を決めて、複数指定したい場合は、リストって感じですね。

テキスト表示の「内容関係」のJSON

それでは、オブジェクトに指定できるJSONをまとめていきましょう。1つのオブジェクトに「内容関係」のJSONは1つだけ指定できます。

ちなみにJSONの内容は見やすいように書き換えてますので、使うときは改行や空白を削除するように切り替えてくださいね。

プレイヤー名、エンティティ名を表示する

シンプルにエンティティの名前を表示できます。対象が複数いる場合は、クリーパー, ゾンビ, スケルトンみたいに表記されます。

{
    "selector": "@a[team=red]"
}

スコアボードの値を表示する

例えば、SCOREというオブジェクトにtestっていうスコアを作った場合は、こんな感じ。

{
    "score": {
        "name": "test",
        "objective": "SCORE"
    }
}

NBTの値を表示する

ちょっと量が多いので、一覧で見せますね。

{
    "nbt": "Inventory[0].id",
    "entity": "@p",
    "block": "0 60 0",
    "storage": "main",
    "interpret": true
}
プロパティ 説明 定義 必須
nbt NBTのパス。 string
entity NBTのパスを持っている、エンティティのセレクター。
blockstorageと一緒に指定はできない。
string
block NBTのパスを持っている、ブロックの座標。
entitystorageと一緒に指定はできない。
string
storage NBTのパスを持っている、ストレージ。
entityblockと一緒に指定はできない。
string
interpret 表示されるテキストが「テキスト表示のJSON」だった場合に、
そのままのJSONではなく、解析後のテキストとして表示される。
bool

基本はdataのgetと同じような使い方ですね。

interpretについて

さて、一見、読んでもよくわからないinterpret。

例えばこういうテキストのJSONがあったとしましょう。

{
    "text":"test"
}

それをNBTで指定する場合は、以下のような感じで指定します。

data merge storage aaa {hogehoge:"{\"text\":\"test\"}"}
もしくは
data merge storage aaa {hogehoge:'{"text":"test"}'}

このhogehogeを表示させたい場合、以下のように書くと{"text":"test"}が表示されてしまいます。

{
    "nbt": "hogehoge",
    "storage": "aaa"
}

できればtestと表示させたい。そういう時にinterpretを使います。

{
    "nbt": "hogehoge",
    "storage": "aaa",
    "interpret": true
}

割り当てられているキーを表示する

例えば操作説明する際に、プレイヤーごとに使っているキーが違うときがありますよね。

そういうときにコレを使います。

{
    "keybind": "key.inventory"
}

右側の値部分の一覧はこちら。

Controls – Official Minecraft Wiki

言語ファイルの内容を表示する

バニラやリソースパックに含まれている言語ファイルの内容を表示します。

例えば、以下の用に指定すれば、言語設定が日本語なら目標達成!が表示され、英語ならGoal Reached!が表示されます。

{
    "translate": "advancements.toast.goal"
}

言語ファイルの中身やwithなどを知りたい方はこちら。

keiduki.hatenablog.com

テキスト表示の「見た目関係」のJSON

こちらは一気に並べて見てみましょう。「見た目関係」は1つのオブジェクトに全部指定してもOKです。

{
    "color": "red",
    "bold": true,
    "italic": true,
    "underlined": true,
    "strikethrough": true,
    "obfuscated": true,
    "font": "minecraft:default" // ver1.16から導入予定
}
プロパティ 説明 定義
color 文字の色を指定する。指定できる色はこちら。
"black","dark_blue", "dark_green", "dark_aqua", "dark_red", "dark_purple", "gold", "gray", "dark_gray", "blue", "green", "aqua", "red", "light_purple", "yellow", "white"
ver 1.16からはカラーコード#ffffffとかで指定できるようになるみたいですね。
string
bold 文字を太字にする。 bool
italic 文字を斜めにする。 bool
underlined 文字にアンダーライン(下線)を引く。 bool
strikethrough 文字に打ち消し線(中線)を引く。 bool
obfuscated 文字を難読化する。 bool
font リソースパックのフォントを参照する。 string

テキスト表示の「マウスアクション関係」のJSON

テキストをクリックしたり、マウスカーソルを当てたりすることで動作させるJSONです。「マウスアクション関係」は1つのオブジェクトに全部指定してもOKです。

テキストをクリックした時のアクション

{
    "clickEvent": {
        "action": "run_command",
        "value": "/say test"
    }
}

テキストをクリックした時のアクションactionはいくつか種類があります。

actionに合わせてvalueを決めましょう。

action アクションの内容 valueの例
open_url valueで指定したURLを開く。
開こうとすると、注意画面が出てくる。
"https://www.google.com/"
run_command valueで指定したコマンドを実行する。
先頭に/が必要なので注意。
"/say test"
suggest_command チャット欄にvalueを入力する。 "テキスト"
change_page 本でのみ使えます。
valueで指定したページに移動します。
"3"
copy_to_clipboard クリップボード(Ctrl+C のコピーで一時保存される場所)にvalueで指定した内容をコピーします。 "コピー"

テキストにカーソルを当てた時のアクション

  • 普通にテキストを表示する (show_text)

    テキストだけを表示します。

    このブログで説明している「内容関係」と「見た目関係」のJSONを指定できますよ。

{
    "hoverEvent": {
        "action": "show_text",
        "value": {"text": "say"}, // ver 1.16以降で廃止(使えはする)
        "contents": {"text": "say"} // ver 1.16以降で追加
    }
}
  • アイテム説明っぽく表示する (show_item)

    インベントリのアイテムにマウスカーソルを当てたような感じの表示を行います。

    valueのパラメータはidCountは必須です。その他はアイテムのNBTを参考にするといいよ。

{
    "hoverEvent": {
        "action": "show_item",
        "value": "{id:\"minecraft:stone\",Count:1b}", // ver 1.16以降で廃止(使えはする)
        "contents": { // ver 1.16以降で追加
            "id": "minecraft:stone"
        }
    }
}
  • エンティティ情報っぽく表示する (show_entity)

    /say @pとかでエンティティ名にマウスカーソルを当てたような感じの表示を行います。

{
    "hoverEvent": {
        "action": "show_entity",
        "value": "{name:\"CustomName\"}", // ver 1.16以降で廃止(使えはする)
        "contents": { // ver 1.16以降で追加
            "name": "CustomName"
        }
    }
}
プロパティ 説明 定義 必須
name エンティティの名前として表示します。 \"string\"
type エンティティのタイプとして表示します。
minecraft:player など。
\"string\"
id エンティティのUUIDとして表示します。
00000000-0000-0000-0000-000000000000 みたいなやつ。
\"string\"

value と contents の違いについて

内容的にはほとんど一緒です。テキスト表示で使うJSONはマイクラJSONではないので、

{"value": '{name:"CustomName"}'}

みたいには書けません。

なので、contentsを新たに用意して、文字列じゃなくてオブジェクトで認識できるようにしようってことみたいです。

テキストをSHIFT + 左クリックした時のアクション

{
    "insertion": "/say test"
}

すごくシンプルですね。こちらをテキストに含めるとチャット欄に/say testを入力してくれます。

clickEventsuggest_commandのSHIFT + 左クリック版ですね。

テキスト表示の「連結関係」のJSON

ここまで、「内容」「見た目」「マウスアクション」を書いてきました。

これらは1つのオブジェクトにまとめることができます。例としてはこんな感じ。

{"text":"test","underlined":true,"insertion":"/say test"}

さて、一部だけ「内容」「見た目」「マウスアクション」を変更したい!って場合はどうすればよいのでしょうか。

リストで並べる

最初の例でお見せしたように、以下のように書くことができます。

シンプルなやり方ですね。

["私は",{"text":"赤チーム","color":"red"},"です。"]

ちなみに先頭で指定した場合は、全部に適用されるので注意が必要です。

下の場合は、「私は」だけ太字と見せかけて、全部太字になります。

[{"text":"私は","bold":true},{"text":"赤チーム","color":"red"},"です。"]

translateの機能を使って並べる

translateを使うと複数を指定することができます。

{"translate":"私は%sです。","with":[{"text":"赤チーム","color":"red"}]}

これだけ見るとリストで書くよりも長くなってしまいましたが、場合によっては見やすくなる可能性もあります。

{"bold":true,"translate":"私は%sです。","with":[{"text":"赤チーム","color":"red"}]}

例えばこういう書き方だと、全部に太字が適用されます。リストと違って全部に適用されるということがわかりやすいです。

extraで並べる

extratranslateとリストを組み合わせた用な感じです。

extraの外側で指定された「見た目」などは、extraの内側に適用されます。

{"text":"私は","extra":[{"text":"赤チーム","color":"red"},"です。"]}

全部に太字を適用する場合はこう言うふうにかけば見やすいですかね。

最初に何も書かないテキストを用意することで、文章を全部extraの中に移動させているわけですね。

{"text":"","bold":true,"extra":["私は",{"text":"赤チーム","color":"red"},"です。"]}

テキスト表示は面倒

さて、おわかりの通り、テキスト表示は種類が多くて面倒です。

なので、他のサイトを使うというのも一つの手かも知れませんね。おすすめサイトはこちら。

minecraft.tools

まとめ

ながながと書いてきましたが、まとめるとこんな感じ。

  • テキスト表示には「内容」1つに対して、「見た目」「マウスアクション」を複数付けられるよ
  • テキストの「内容」はリスト、translate、extraで「連結」できるよ

って感じでした。

何を表示させたい、どういうふうに見せたい、何をさせたい、といったことを考えて作っていきましょう。

マイクラの言語ファイルの中身を見る

英語以外の言語ファイルは一体どこにあるのか

いつもの.minecraft/versions/<バージョン>.jarの中にあるのかと思ったら、存在しなかった。 で、よくよく調べてみると以下にあるとのことだった。

  • .minecraft/assets/indexes/<バージョン>.jsonを開く
  • 中に以下のような記述がある場所を探す (日本語の例)
:
"minecraft/lang/ja_jp.json": {
  "hash": "efd2cd466ec340e9a33980e4429cf02152c2c6bb",
  "size": 474708
},
:
  • hashの内容を覚える(どこかにメモする)
  • .minecraft/assets/objects/を開く
  • フォルダがいっぱいあるので、hashの先頭2文字(上の場合はef)のフォルダを開く
  • hashと同じファイル名を「テキストファイル」として開く (中身はJSON)

日本語の言語ファイルはUnicodeで書かれている

ファイルを開くと大量の\u7171みたいな文字がいっぱい並んでます。

なので、読める形に変換しましょう。

私はここのサイトを使ってます。

Unicode Escape Sequence | KWONLINE.ORG

1.15.2の日本語の言語ファイルの中身

どういうものがあるのか。

こんな感じになってます。長いので、適当に省略します。

{
    "addServer.add": "完了",
    "addServer.enterIp": "サーバーアドレス",
    "addServer.enterName": "サーバー名",
    "addServer.hideAddress": "アドレスを隠す",
    "addServer.resourcePack": "サーバーリソースパック",
    "addServer.resourcePack.disabled": "無効",
    "addServer.resourcePack.enabled": "有効",
    :
    "advancements.story.upgrade_tools.description": "より良いツルハシをつくる",
    "advancements.story.upgrade_tools.title": "アップグレード",
    "advancements.toast.challenge": "挑戦完了!",
    "advancements.toast.goal": "目標達成!",
    "advancements.toast.task": "進捗達成!",
    "argument.anchor.invalid": "無効なエンティティのアンカー位置 %s です",
    "argument.block.id.invalid": "「%s」は不明なブロックの種類です",
    :
    "commands.scoreboard.players.set.success.single": "%2$s の %1$s を %3$s に設定しました",
    "commands.seed.success": "シード値:%s",
    "commands.setblock.failed": "ブロックを設置できませんでした",
    "commands.setblock.success": "%s, %s, %s におけるブロックを変更しました",
    :
    "subtitles.entity.dolphin.ambient": "イルカが鳴く",
    "subtitles.entity.dolphin.ambient_water": "イルカが鳴く",
    "subtitles.entity.dolphin.attack": "イルカが攻撃をする",
    "subtitles.entity.dolphin.death": "イルカが死ぬ",
    "subtitles.entity.dolphin.eat": "イルカが食べる",
    "subtitles.entity.dolphin.hurt": "イルカがダメージを受ける",
    "subtitles.entity.dolphin.jump": "イルカがジャンプをする",
    "subtitles.entity.dolphin.play": "イルカが遊ぶ",
    "subtitles.entity.dolphin.splash": "イルカが飛び込む",
    "subtitles.entity.dolphin.swim": "イルカが泳ぐ",
    :
    "title.singleplayer": "シングルプレイ",
    "translation.test.args": "%s %s",
    "translation.test.complex": "Prefix, %s%2$s again %s and %1$s lastly %s and also %1$s again!",
    "translation.test.escape": "%%s %%%s %%%%s %%%%%s",
    "translation.test.invalid": "hi %",
    "translation.test.invalid2": "hi %s",
    "translation.test.none": "Hello, world!",
    "translation.test.world": "world",
    :
}

%s とか %1$s とかってなによ?

これは、言語ファイルで決められないパラメータが入ります。

例えばcommands.seed.successシード値 : %sですが、実際に表示されるものは%sのところに別の値が入って表示されます。

%1$sも似たようなもので、1番目のパラメータを使いますよってことです。

どうやって使うのか

tellrawで表示させたい場合は、こんな感じで使います。

tellraw @p {"translate":"title.singleplayer"}

もしも%sになにか指定したいなら

tellraw @p {"translate":"commands.seed.success","with":["この辺"]}

とかで指定できます。

%sが複数ある場合も

tellraw @p {"translate":"commands.setblock.success","with":["0","60","15"]}

と書くと、頭から順番に使われます。 何番目っていうのかこういう書き方をした時に、指定するやつですね。

言語ファイルを変更して反映させるには

リソースパックに入れましょう。

<リソースパック名>/assets/minecraft/lang/<言語名>.jsonに配置すればOKです。

全部書かなくても一部だけ変更でもOKです。

<言語名>のところは日本語ならja_jpですね。