アドオン作りの基礎 - エンティティのカスタマイズ
目次は右上の「≡」から!
オリジナルのエンティティを作るのは難しいので、まずはバニラのモブのカスタマイズについて解説します!
前回の記事(アドオンづくりの基礎#2)の
「追加するコンテンツのフォルダ」まで手順を進めているのが前提です。
主な手順
● バニラのJSONをコピーしてくる
前々回の記事(アドオンづくりの基礎#1)で説明した「テンプレート」のビヘイビアパックから
今回は試しにエンダーマンのJSONをコピーして今回作るパックの中に入れます。
場所はどちらも「ビヘイビアパック/entities/endeman.json」です。
ビヘイビア
┣ manifest.json
┣ pack_icon.png
┗ entities
┗ enderman.json
エンダーマンにしたのは、他のモブだとファイルの中身が多かったり複雑だったりしたからです......
● 中身を変えてみる
わかりやすい変化をする数値にマーカーをしてみました(半分より下にはないです)。
もともと整数のところは小数にできないので注意してください!
Dat
entities/enderman.json
{
"format_version": "1.16.0",
"minecraft:entity": {
"description": {
"identifier": "minecraft:enderman",
"is_spawnable": true,
"is_summonable": true,
"is_experimental": false
},
"component_groups": {
"minecraft:enderman_calm": { // 怒っていないときの性質
"minecraft:on_target_acquired": {
"event": "minecraft:become_angry",
"target": "self"
},
"minecraft:movement": {
"value": ~#M(83ffd9)0.3M#~ // 通常時の移動速度
}
},
"minecraft:enderman_angry": { // 怒っているときの性質
"minecraft:angry": {
"duration": 25,
"calm_event": {
"event": "minecraft:on_calm",
"target": "self"
}
},
"minecraft:movement": {
"value": ~#M(83ffd9)0.45M#~ // 怒っている時の移動速度
},
"minecraft:behavior.melee_attack": {
"priority": 2
}
}
},
"components": { // メインの性質
"minecraft:is_hidden_when_invisible": {
},
"minecraft:experience_reward": {
"on_death": "query.last_hit_by_player ? ~#M(83ffd9)5M#~ : 0" // 落とす経験値の量
},
"minecraft:type_family": {
"family": [ "enderman", "monster", "mob" ]
},
"minecraft:breathable": {
"total_supply": 15,
"suffocate_time": 0
},
"minecraft:nameable": {
},
"minecraft:loot": {
"table": "loot_tables/entities/enderman.json"
},
"minecraft:health": {
"value": 40,
"max": ~#M(83ffd9)40M#~ // 最大HP(ハート1つで2)
},
"minecraft:hurt_on_condition": {
"damage_conditions": [
{
"filters": { "test": "in_lava", "subject": "self", "operator": "==", "value": true },
"cause": "lava",
"damage_per_tick": 4
},
{
"filters": { "test": "in_contact_with_water", "operator": "==", "value": true },
"cause": "drowning",
"damage_per_tick": 1
}
]
},
"minecraft:attack": {
"damage": ~#M(83ffd9)7M#~ // 攻撃力(ハート1つで2)
},
"minecraft:follow_range": {
"value": 32,
"max": 32
},
"minecraft:collision_box": {
"width": 0.6,
"height": 2.9
},
"minecraft:teleport": {
"random_teleports": true,
"max_random_teleport_time": 30,
"random_teleport_cube": [ ~#M(83ffd9)32M#~, ~#M(83ffd9)32M#~, ~#M(83ffd9)32M#~ ], // テレポートする範囲
"target_distance": 16,
"target_teleport_chance": 0.05,
"light_teleport_chance": 0.05
},
"minecraft:lookat": {
"search_radius": 64.0,
"set_target": true,
"look_cooldown": 5.0,
"filters": {
"all_of": [
{
"subject": "other",
"test": "is_family",
"value": "player"
},
{
"test": "has_equipment",
"domain": "head",
"subject": "other",
"operator": "not",
"value": "carved_pumpkin"
}
]
}
},
"minecraft:despawn": {
"despawn_from_distance": {}
},
"minecraft:behavior.nearest_attackable_target": {
"priority": 5,
"must_see": true,
"attack_interval": 10,
"entity_types": [
{
"filters": {
"test": "is_family",
"subject": "other",
"value": "endermite"
},
"max_dist": 64
}
]
},
"minecraft:navigation.walk": {
"can_path_over_water": false,
"avoid_water": true
},
"minecraft:movement.basic": {
},
"minecraft:jump.static": {
},
"minecraft:can_climb": {
},
"minecraft:behavior.float": {
"priority": 0
},
"minecraft:behavior.random_stroll": {
"priority": 7,
"speed_multiplier": 1.0
},
"minecraft:behavior.look_at_player": {
"priority": 8,
"look_distance": 8.0,
"probability": 8.0
},
"minecraft:behavior.random_look_around": {
"priority": 8
},
"minecraft:behavior.hurt_by_target": {
"priority": 3
},
"minecraft:behavior.enderman_leave_block": {
"priority": 10
},
"minecraft:behavior.enderman_take_block": {
"priority": 11
},
"minecraft:physics": {
},
"minecraft:pushable": {
"is_pushable": true,
"is_pushable_by_piston": true
},
"minecraft:conditional_bandwidth_optimization": {
"default_values": {
"max_optimized_distance": 80.0,
"max_dropped_ticks": 10,
"use_motion_prediction_hints": true
}
}
},
"events": {
"minecraft:entity_spawned": {
"remove": {
},
"add": {
"component_groups": [
"minecraft:enderman_calm"
]
}
},
"minecraft:become_angry": {
"remove": {
"component_groups": [
"minecraft:enderman_calm"
]
},
"add": {
"component_groups": [
"minecraft:enderman_angry"
]
}
},
"minecraft:on_calm": {
"remove": {
"component_groups": [
"minecraft:enderman_angry"
]
},
"add": {
"component_groups": [
"minecraft:enderman_calm"
]
}
}
}
}
}
ただ値を変えて楽しむだけでなく、この数値はここで変えられるんだというのを少しでいいのでなんとなく把握できたらいいと思います。
● 完成
あとはこの記事(アドオンづくりの基礎#2)の
「圧縮」以降の手順になります。
おかわり!
他のモブで他の性質もいじってみたいと思うので、またいくつかわかりやすいものを挙げます。
──その前に、数値をいじる以外の変更方法を追加で紹介したいと思います。
● 真偽値を変える
真偽値とは「true(はい)」か「false(いいえ)」の二択のことです。
"minecraft:behavior.nearest_attackable_target": {
"priority": 5,
"must_see": ~#M(83ffd9)trueM#~,
"attack_interval": 10,
"entity_types": [
{
"filters": {
"test": "is_family",
"subject": "other",
"value": "endermite" // 近くのエンダーマイトに敵対
},
"max_dist": 64 //「近く」の限界
}
]
}
たとえば、エンダーマンのこの部分は「敵対するために相手が物陰に隠れていない必要があるか」を示すので、
ここをfalseに変えると壁越しにでもエンダーマイトの気配を感じ取って敵対します。
● 文字列を変える
例えばブロックやアイテムを指定するときにそれらのIDが使われます。
"minecraft:breedable": {
"require_tame": false, // 手なずけている必要があるかどうか
"breed_items": ~#M(83ffd9)"wheat"M#~,
"breeds_with": {
"mate_type": "minecraft:cow", // 繁殖する相手
"baby_type": "minecraft:cow", // 生まれるこども
"breed_event": {
"event": "minecraft:entity_born",
"target": "baby"
}
}
}
たとえば、牛のこの部分は「繁殖に使用するアイテム」を示すので、例として"apple"にすればリンゴで繁殖するようになります。
ちなみにバニラのアイテムのIDの「minecraft:」は省略できるので、今回は省略してありますね。
● 「コンポーネント」を変更
"components": {}や
"component_groups": {}のカッコの中身にある、
"minecraft:〇〇": {
// 中身はいろいろ
}
というようなカタマリをコンポーネントといい、エンティティの性質を決めます。
一つのコンポーネント全体を消してエンティティからその性質をなくすことができたり、
他のモブからコンポーネントをコピペして性質を移植することができます。
"minecraft:teleport": {
"random_teleports": true,
"max_random_teleport_time": 30,
"random_teleport_cube": [ 32, 32, 32 ], // テレポートする範囲
"target_distance": 16,
"target_teleport_chance": 0.05,
"light_teleport_chance": 0.05
}
たとえば、エンダーマンのこのコンポーネントを丸ごと消すとテレポートしなくなります。
"minecraft:knockback_resistance": {
"value": 100,
"max": 100
}
また、エンダードラゴンのこのコンポーネントを追加すると、ノックバックしなくなります。
注意!
コンポーネントを追加・削除するときにはカンマ( , )の有無に気をつけてください。
"minecraft:〇〇": {
}~#M(83ffd9),M#~
"minecraft:△△": {
}
コンポーネントが下に続くときだけカンマを閉じカッコにつけます。
カンマの有無を間違えるとこのファイルのすべての変更が適用されなくなります。