Skip to content

create artifact

Ella-AWS edited this page May 16, 2026 · 20 revisions

1. 事前に済ませてね

2. テンプレートを作成する

まずはMCDatapackUtilityを利用して神器アセットのテンプレートを作成するよ。
Datapack: Create Datapack templateを実行してね。デフォルトだとShift + Alt + D -> Shift + Alt + Tを押すと動作するよ。
すると下記の画像みたいなメニューが出てくるからデータパックにテンプレートを追加するを選択してね。

image

出てきたダイアログでデータパックを選択できるからAssetフォルダを指定するよ。

次にテンプレートを生成する名前空間を選択できるから下記の命名規則に沿って名前を入力してね。

神器名の命名規則

  • <四桁のID>.<神器名(snake_case)>で名前を記述してね

  • 神器名は基本的に英語に翻訳したものを使うよ (英語が出来ない場合はGoogle翻訳みらい翻訳, DeepLとか使ってみてね)

  • 各単語を_区切ってね

  • 英語に翻訳できないような物はローマ字にしてね

    ローマ字にしたときに表記ゆれがあるような物はヘボン式に従ってね

神器名を入力すると生成するテンプレートを選ぶメニューが出るから、神器に合わせたトリガーにチェックを付けてOKを押してね。

image

これでテンプレートがAsset/data/asset/functions/artifact/<神器名>/~に生成されてるはずだよ。

note: slot が hotbar の神器を作る場合は「神器/テンプレート」は選択せず「神器/テンプレート(hotbar)」を選択してね。

note: tick を跨ぐスコアを使いたい場合は、テンプレート生成時に神器/テンプレート: 初期化処理もチェックを付けてね。~/0.load.mcfunctionが一緒に生成されて、そこで objective を定義できるよ。

3. 神器の基本情報の設定

注: ここから先基本的に function 名は下記のような省略した形で記載するよ

Asset/data/asset/functions/artifact/<神器名>/give/2.give.mcfunction -> ~/give/2.give.mcf

生成されたテンプレートの中に~/give/2.give.mcfって function があるはずだよ。多分画像みたいになってるはずなんだけど。

image

下記の説明を読みながら… set value ~の部分を記載してね。テンプレートに書かれていない項目もあるから、必要なものは自分で行を追加することになるよ。

設定名 必須 設定する型 説明
ID o Integer 神器の ID
スプレッドシートの ID 欄の物をそのまま入れてね
… value 1
Item o ItemID 元となるアイテムの ID … value "minecraft:glass"
Name o TextComponent 神器の名前
default で italic は設定されるよ
… value '{"text":"神器名","color":"green"}'
Lore o TextComponent[] 神器の説明文
default で italic と color は設定されるよ
… value ['{"text":"1行目"}','{"text":"2行目"}']
CostText × TextComponent 消費アイテムに関する説明
表記については下記参照
… value '[{"translate":"item.minecraft.gunpower"},{"text":" x3"}]'
RemainingCount × Integer 使用回数
ここに書いた回数がそのまま使える回数だよ
… value 5
Slot o String(下記参照) 発動する際のスロット
記述は SlotID について参照
… value "auto"
Trigger o String(下記参照) 発動するトリガー
記述はトリガーのリスト参照
… value "onClick"
Condition × TextComponent トリガー以外に発動条件がある場合、 Lore に追記される条件説明文
(右クリック・スニーク等トリガーで表現できる条件は不要)
… value '{"text":"自身の体力が30%以下の時"}'
AttackInfo × Component 攻撃に関する情報
下記 6 つのサブキーごとに data modify で個別設定する形式
(攻撃情報の書式参照)
data modify storage asset:artifact AttackInfo.Damage set value [10,20]
MPCost o Integer MP 消費量 … value 10
MPRequire × Integer MP 必要量
設定しなかった場合消費量と同じになるよ
… value 50
MPHealWhenHit × Integer 攻撃を当てる毎に回復する MP 量
DamageAPI で攻撃した分だけ加算されるよ
… value 2
LocalCooldown × Integer 神器のクールダウン
tick で指定してね
… value 80
TypeCooldown × {Type: String, Duration: int} 種別クールダウン
同じ Type の神器同士で CoolDown を共有するよ
data modify storage asset:artifact TypeCooldown.Type set value "shortRange"
SecondaryTypeCooldown × {Type: String, Duration: int} 第二の種別クールダウン
TypeCooldown と同じ Type の候補から任意で指定可能
TypeCooldown と組み合わせて 2 系統の CD を同時に効かせたい時に使う
data modify storage asset:artifact SecondaryTypeCooldown.Type set value "longRange"
SpecialCooldown × Integer 特殊クールダウン
これが設定されている神器は共通のクールダウンを持つよ
tick で指定してね
… value 20
DisableCooldownMessage × Boolean 神器のクールダウンが未終了状態で使用時
出てくるメッセージを無効化するか否か
… value true
DisableMPMessage × Boolean MP 不足時のメッセージを無効化するか否か … value true
DisableBreakSound × Boolean RemainingCount を使い切った時の破壊音を鳴らさないか否か … value true
CanUsedGod o String[](下記参照) 使用することのできる信仰
記述は信仰のリスト参照
… value ["Flora","Nyaptov","Wi-ki"]
Equipment × Component 装備時の効果・補正(装備系神器のみ)
詳細は6章参照
… value {Effects:[{ID:1,Visible:true,IsSetEffect:true}],Modifiers:[…]}
DisabledFlag × Component 各種チェック・処理の無効化フラグ
詳細はDisabledFlag参照
… value {Check:{Believe:true}}
CustomNBT × NBTCompound 追加でアイテムに指定したい NBT
エンチャント等に使うよ
… value {tag:{Enchantments:[{id:"sharpness",lvl:1s}]}}

SlotID について

他の場所でも使われるけど ID はこの 9 つだよ

ID 対応する場所 実装済
mainhand メインハンド o
offhand オフハンド o
feet 足防具 o
legs 脚防具 o
chest 胸防具 o
head 頭防具 o
inventory インベントリ x
hotbar ホットバー o
auto 自動判定 o

slot: auto について

auto は以下のトリガーが指定されてるとき、神器のスロットを自動で判別してくれるよ
その他のトリガーを指定した時はエラーを出力するから気を付けてね。

  • 人参棒クリック
  • 飲食

トリガーのリスト

ID トリガー 実装済 ID トリガー 実装済
onClick 右クリック o sneak スニーク o
shot 発射 × sneak1s 1 秒間スニーク o
itemUse 使用 o sneak2s 2 秒間スニーク o
onAttack Entity を攻撃 o sneak3s 3 秒間スニーク o
onAttackByMelee Entity を近接攻撃 o sneak4s 4 秒間スニーク o
onAttackByProjectile Entity を遠距離攻撃 o sneak5s 5 秒間スニーク o
onDamage 被ダメージ o sneak10s 10 秒間スニーク o
onDamageFromExplode 被爆発ダメージ o keepSneak 0 秒以上スニーク o
onDamageFromBurn 被延焼ダメージ o keepSneak1s 1 秒間以上スニーク o
onDamageFromEntity 被攻撃ダメージ o keepSneak2s 2 秒間以上スニーク o
onDamageFromMelee 被近接ダメージ o keepSneak3s 3 秒間以上スニーク o
onDamageFromProjectile 被遠距離ダメージ o keepSneak4s 4 秒間以上スニーク o
onKilled Entity を殺害 o keepSneak5s 5 秒間以上スニーク o
onKilledByMelee Entity を近接攻撃で殺害 o keepSneak10s 10 秒間以上スニーク o
onKilledByProjectile Entity を遠距離攻撃で殺害 o passive 常時 o
equipping 装備の着脱時 o rejoin プレイヤーの再 join 時
必ずここを読んで使用すること
o

note: Triggerの値はあくまでLore 表示用だよ。実際にどのイベントで処理が動くかは、関数 tag(#asset:artifact/attack等)に登録した 1.trigger によって決まるから、ここの値と実装が必ずしも一致しなくても問題ないよ。
1 個の神器で複数のトリガーを使いたい時はマルチトリガー神器の作り方を参照。

信仰のリスト

ID
Flora フローラ
Urban ウルバン
Nyaptov ニャプトフ
Wi-ki ウィ=キ
Rumor ルーモア

… value "ALL"と書くことで… value ["Flora","Urban","Nyaptov","Wi-ki","Rumor"]を省略可能

消費アイテムに関する説明の形式

アイテム x個数の形式で書いてね
要求するアイテムがバニラアイテムの場合、 translate を使って記載してね

アイテム: {"translate":"item.minecraft.<itemID>"}

ブロック: {"translate":"block.minecraft.<itemID>"}

例: '[{"translate":"item.minecraft.gunpower"},{"text":" x3"}]'

攻撃情報の書式

AttackInfo はサブキーごとに個別に data modify storage asset:artifact AttackInfo.<キー> set value <値> の形式で設定してね。テンプレート生成時にも各キーのdata modify行がコメント付きで用意されているから、必要な行だけ有効化していく。

以下のうち 1 つでも設定されていたら残りは初期値が設定されるよ。

設定 パス例 (data modify) 説明 未設定時の値
Damage AttackInfo.Damage Literal/[Literal, Literal] ダメージ量
そのまま値(文字列も可)を入れるか
[<最小>, <最大>]の List にしてね
List を使う場合は List 内の型をそろえてね
"???"
AttackType AttackInfo.AttackType String[] AttackType
[Physical,Magic]の List にしてね
[Physical]
ElementType AttackInfo.ElementType String[] ElementType
[Fire,Water,Thunder,None]の List にしてね
[None]
BypassResist AttackInfo.BypassResist Boolean 防御を貫通するか否か 0b
IsRangeAttack AttackInfo.IsRangeAttack String 範囲攻撃/単体攻撃の種類
'never','probability','condition','every'
のいずれかを設定してね、それぞれ
単体,確率範囲,条件範囲,常時範囲をしめすよ
secret(範囲-不明 と表示)
AttackRange AttackInfo.AttackRange Literal 攻撃範囲
お好みの値を入れてね
不明

例:

  • 固定 100 ダメージの火属性魔法非貫通ダメージ:
data modify storage asset:artifact AttackInfo.Damage set value 100.0
data modify storage asset:artifact AttackInfo.AttackType set value [Magic]
data modify storage asset:artifact AttackInfo.ElementType set value [Fire]
data modify storage asset:artifact AttackInfo.BypassResist set value 0b
  • 範囲 12.31~31.27 の火・水属性魔法貫通ダメージ:
data modify storage asset:artifact AttackInfo.Damage set value [12.31,31.27]
data modify storage asset:artifact AttackInfo.AttackType set value [Magic]
data modify storage asset:artifact AttackInfo.ElementType set value [Fire,Water]
data modify storage asset:artifact AttackInfo.BypassResist set value 1b
  • 範囲 5 ~ ∞の物理・火・雷属性貫通ダメージ:
data modify storage asset:artifact AttackInfo.Damage set value ["5",""]
data modify storage asset:artifact AttackInfo.AttackType set value [Physical]
data modify storage asset:artifact AttackInfo.ElementType set value [Fire,Thunder]
data modify storage asset:artifact AttackInfo.BypassResist set value 1b

CoolDown の種類

神器の発動間隔を制御できるクールダウンには 4 種類あるよ。組み合わせて使うことも可能。

  • LocalCooldown
    そのアイテム個体にのみ CoolDown がかかるよ。同じ神器を 2 個持っていても別々の CoolDown になる。
    … value <tick数>の形式で指定してね。

  • TypeCooldown (種別クールダウン)
    同じTypeを持つ神器同士で CoolDown を共有するよ。例えばshortRangeを指定した A 神器を使うと、shortRangeを指定した B 神器も CoolDown に入る。

    data modify storage asset:artifact TypeCooldown.Type set value "shortRange"
    data modify storage asset:artifact TypeCooldown.Duration set value 10

    種別の選択肢: "shortRange" (近接系) / "longRange" (遠距離系) / "summon" (召喚系) / "heal" (回復系)

  • SecondaryTypeCooldown (第二の種別クールダウン)
    TypeCooldown と同じ仕組みの第二の種別 CD 。同じ種別の選択肢 (shortRange/longRange/summon/heal) から任意で指定可能。 TypeCooldown と組み合わせて、 1 つの神器に 2 系統の CD を同時に効かせたい時に使う。

    data modify storage asset:artifact SecondaryTypeCooldown.Type set value "longRange"
    data modify storage asset:artifact SecondaryTypeCooldown.Duration set value 80

    例: 0295.call_elemental_familiar (エレメンタル・ファミリア召喚) では、主 CD でsummon 600tick (他の召喚系神器の長 CD)、副 CD でlongRange 80tick (他の遠距離系神器の短 CD) を併用している。

  • SpecialCooldown
    そのワールド全体で、 SpecialCooldown を持つ神器全てに同時に CoolDown がかかるよ。プレイヤー単位ではなくサーバー単位。
    bossbar で残り時間が表示される。
    … value <tick数>の形式で指定してね。

AttributeModifiers の UUID の形式

UUID:[I;1,1,神器ID,Attributeの対応SlotNo]の形式で書いてね

Slot SlotNo
mainhand 1
offhand 2
feet 3
legs 4
chest 5
head 6
hotbar 7

例: '{…,UUID:[I;1,1,164,2],Slot:"offhand"}'

Slot 指定なし(Any)は干渉するから使わないでね

複数のスロットに効果を適用したい場合は、個別にスロット指定してね

Equipment.Effects / Equipment.Modifiers (装備時効果)

装備系神器(equippingを主トリガーとする神器)では、Equipmentフィールドで装備中の効果と能力補正を定義できるよ。詳しい使い方は6章を見てね。ここではフィールドの形式だけ紹介。

Equipment.Effects

装備中に付与する EffectAsset の ID 一覧。

data modify storage asset:artifact Equipment.Effects set value [{ID:233,Visible:true,IsSetEffect:true}]
キー 必須 意味
ID int o 装備時に付与する EffectAsset の ID
Visible boolean o エフェクト一覧 UI に表示するかどうか
IsSetEffect boolean × Lore に「[セット効果]」のラベルを表示するかのフラグ
表示用なのでセット成立判定とは独立だよ
Equipment.Modifiers

装備中に付与する能力補正の配列。Equipment.Effectsと違って、こっちは即座に補正値として加算されるよ。

data modify storage asset:artifact Equipment.Modifiers set value []
data modify storage asset:artifact Equipment.Modifiers append value {Type:"attack/thunder",Amount:0.01d,Operation:"multiply_base"}
data modify storage asset:artifact Equipment.Modifiers append value {Type:"defense/thunder",Amount:0.02d,Operation:"multiply_base"}
キー 必須 意味
Type string o 補正対象 (下記参照)
Amount double o 補正値
Operation string o "add" / "multiply_base" / "multiply" のいずれか
StackReduction double × スタック時の減衰率
フルセット時に補正が単純 4 倍になるのを抑制する用

Typeに指定できる値はModifierAPIの「補正対象」と同じだよ。例: attack/baseattack/physicaldefense/thunderhealmp_regenmax_healthmax_mp 等。

Operationの使い分けはOperationの注意点を参照。

DisabledFlag (各種チェックの無効化)

通常、神器の使用時には信仰・ CD ・ MP が自動でチェックされて、引っかかると失敗メッセージが表示されるよ。これを神器単位で個別に無効化したい時はDisabledFlagを使ってね。

形式:

data modify storage asset:artifact DisabledFlag set value {Check:{Believe:true,BelieveMessage:true},Use:{ItemUpdate:true}}
Check 側 (DisabledFlag.Check)

発動条件チェック (common/check_condition/<slot>) の各検査を無効化する。

キー 効果
Believe 信仰チェックをスキップ
BelieveMessage 信仰チェック失敗時の「現在の信仰では使えないようだ...」メッセージを非表示
LocalCooldown LocalCooldown チェックをスキップ
CDMessage CD チェック失敗時の「クールダウンが終わっていません。」メッセージを非表示
SpecialCooldown SpecialCooldown チェックをスキップ
TypeCooldown TypeCooldown チェックをスキップ
SecondaryTypeCooldown SecondaryTypeCooldown チェックをスキップ
MPRequire MP チェックをスキップ
MPMessage MP チェック失敗時の「 MP が足りない!」メッセージを非表示
Use 側 (DisabledFlag.Use)

使用時処理 (common/use/<slot>) の挙動を抑制する。

キー 効果
ItemUpdate アイテム NBT の更新(Lore 再生成・ LatestUsedTick 更新等)をスキップ
よくある使い方
  • セット効果用の副神器で、本体側で CD/MP 管理してるからこの神器ではチェック不要 → Checkを全部true
  • 通常のメッセージは出したくないけど挙動は通常通り → BelieveMessage/CDMessage/MPMessagetrueに (DisableCooldownMessage / DisableMPMessageの上位互換と思っていいよ)
  • アイテム更新でちらつく演出を避けたい → Use.ItemUpdate:true

4. 神器の処理の記述

4.1. トリガーのイベントを受け取る

神器のトリガーには専用の関数 tag(#asset:artifact/attack等)があって、 トリガーが発火するとそのトリガーを使う全ての神器の1.triggerが一斉に呼ばれる仕組みになっているよ。だから「今は自分の神器の番か」を最初にチェックして、該当する時だけ次の処理(2.check_condition)に進める必要がある。

テンプレート生成で作られた~/trigger/1.trigger.mcfがそれ。中身はこんな感じ:

#> asset:artifact/<神器名>/trigger/1.trigger
#
# 指定したイベントタイミングで実行されるfunction
#
# @within tag/function asset:artifact/**

# storage asset:contextの<slot>に装備している神器のIDが入っているので比較し、~/2.check_condition.mcfunctionを実行する
    execute if data storage asset:context id{<slot>:<神器ID>} run function asset:artifact/<神器名>/trigger/2.check_condition

<slot><神器ID>は、テンプレート生成時に入力した値が自動的に埋め込まれているから、基本的にここを手動で触る必要はないよ。

手動編集が必要になるケース

  • 2.giveで設定した ID を後から変更した → 1.triggerid{...}内の ID も忘れずに合わせて修正
  • マルチトリガーで追加の1.triggerを自分で書く → マルチトリガー神器の作り方参照

4.2. 発動条件をチェックする

1.triggerで自分の神器の番だと確認したら、次は「今この神器を発動できる状態か」を検査するのがこの2.check_conditionの役割。 MP は足りているか、 CD が終わっているか、信仰条件を満たしているか、 アイテム残量はあるか…といった発動可否の判定をここでまとめてやるよ。

テンプレート生成で作られた~/trigger/2.check_condition.mcfの中身はこんな感じ:

#> asset:artifact/<神器名>/trigger/2.check_condition
#
# 神器の発動条件をチェックします
#
# @within function asset:artifact/<神器名>/trigger/1.trigger

# 神器の基本的な条件の確認を行うfunction、成功している場合CanUsedタグが付く
    function asset:artifact/common/check_condition/<slot>
# 他にアイテム等確認する場合はここに書く
    
# CanUsedタグをチェックして3.main.mcfunctionを実行する
    execute if entity @s[tag=CanUsed] run function asset:artifact/<神器名>/trigger/3.main

<slot>テンプレート生成時に自動で埋め込まれているから、基本的にここを手動で触る必要はないよ。

自動チェックの流れ

common/check_condition/<slot>が呼ばれると、 内部で以下が順番にチェックされる:

  1. 信仰チェック (CanUsedGod と現在の信仰の一致)
  2. LocalCooldown (個体 CD)
  3. SpecialCooldown (グローバル CD)
  4. TypeCooldown / SecondaryTypeCooldown (種別 CD)
  5. MPRequire (MP 不足)

全部通れば@sCanUsedタグが付与される。 どれかで失敗すればCanUsedタグは付かず、 同時に「現在の信仰では使えないようだ...」「クールダウンが終わっていません。」「 MP が足りない!」 等のメッセージがtellrawで表示される (失敗種別ごとにレート制限あり)。

各チェックを個別に無効化したい時はDisabledFlagを参照。

追加のチェックを書きたい時

信仰・ CD ・ MP 以外の独自の発動条件 (例: 雨が降ってる時のみ、 特定アイテムを持っている時のみ等) を加えたい場合は、 テンプレートのコメント # 他にアイテム等確認する場合はここに書く の下に書いていく。

書き方の鉄則 :

  • common/check_condition/<slot> に書く (= 既にCanUsedタグが付いている前提で動かす)
  • 追加条件を満たさない場合はtag @s remove CanUsedCanUsedタグを剥がす
  • execute if entity @s[tag=CanUsed] ...で条件を絞ることで、 すでに失敗判定されている時の余計な検査を避けられる

例: 雨が降ってる時しか使えない神器

# 基本チェック (信仰・CD・MP)
    function asset:artifact/common/check_condition/mainhand

# 追加チェック: 雨が降ってないなら CanUsed をはがす
    execute if entity @s[tag=CanUsed] unless predicate lib:weather/is_raining run tag @s remove CanUsed

# CanUsedが残っていれば3.mainへ
    execute if entity @s[tag=CanUsed] run function asset:artifact/<神器名>/trigger/3.main

自動チェックを部分的にスキップしたい時

DisabledFlagで個別の検査を無効化できるよ。2.check_conditionの中で動的にフラグを立てて、common/check_condition/<slot>に渡すこともできる。

# このトリガーに限り信仰チェックだけスキップしたい
    data modify storage asset:artifact DisabledCheckFlag set value {Believe:true}
    function asset:artifact/common/check_condition/mainhand

4.3. 神器の効果を作る

2.check_conditionを通過した = 発動可と判定された後に呼ばれるのがこの3.main。 ここに 神器の実際の効果 (ダメージを与える、 召喚する、 演出を出す等) を書いていくよ。

テンプレート生成で作られた~/trigger/3.main.mcfの中身はこんな感じ:

#> asset:artifact/<神器名>/trigger/3.main
#
# 神器のメイン処理部
#
# @within function asset:artifact/<神器名>/trigger/2.check_condition

# 基本的な使用時の処理(MP消費や使用回数の処理など)を行う
    function asset:artifact/common/use/<slot>

# ここから先は神器側の効果の処理を書く
    say test: <神器名>

<slot>テンプレート生成時に自動で埋め込まれているから、基本的にここを手動で触る必要はないよ。

common/use/<slot>がやってくれること

冒頭で呼んでいるcommon/use/<slot>が、 神器使用時の「消費系の後片付け」 を全部まとめて引き受けてくれる :

  • MPCost ぶんの MP 消費
  • LocalCooldown / TypeCooldown / SecondaryTypeCooldown / SpecialCooldown の開始
  • RemainingCount のデクリメント (残り使用回数を減らす)
  • LatestUsedTick の更新 (= 個体の最終使用 tick を記録、 LocalCD 判定で使う)
  • アイテム本体の NBT 更新 (Lore 再生成等)

つまり制作者は、 common/use/<slot>後ろ に「神器が何をするか」 だけ書けば、 消費周りは勝手に管理されるってこと。

制作者が書くのは「ここから下」

テンプレートで say test: <神器名> が仮置きされている行を消して、 自分の神器の効果に置き換えていく。 ダメージを与える、 エンティティを召喚する、 particle や playsound で演出を出す、 等々。 ライブラリや API を使う時は :

重要な注意点

  • common/use/<slot>呼び忘れると MP/CD が消費されずに無限連打できる ので、 通常は3.mainの冒頭で必ず呼ぶこと。 テンプレートには最初から書いてあるので消さないように
  • 副トリガー (マルチトリガー神器の追加効果側) で、 すでに主トリガーで消費が済んでいる場合は意図的にcommon/use/<slot>を呼ばずに書く設計もあるよ。 詳しくはマルチトリガー神器の作り方参照
  • tick を跨ぐ処理 (持続効果・遅延発動など) を書きたい時は5.tickをまたぐ処理の実装の仕方を参照

5. 基本的な情報

  • コーディング規則にしたがってね

  • 一時的にスコアを扱いたいときは objective: Temporaryを使ってね。
    ※最後に reset を必ずしてね

  • 一時的に storage を扱いたいときは storage: asset:tempを使ってね。
    ※これも最後に remove を必ずしてね

  • tick を跨ぐスコアを使いたい場合はテンプレート生成時に神器/テンプレート: 初期化処理を選択してスコアボードを追加してね

  • 神器で object, tag, score_holder を定義する際はほかの神器と干渉しないように、名前の先頭に${神器IDを36進数に変換した値}.をつけてね
    神器 ID が 123 の場合: 123 の 36 進数 = 3f なので、3f.Owner3f.Hitなどの命名にする
    36 進数への変換はここでできるよ

  • 何らかの要因で forceload チャンクを利用したい場合、 10000 2 10000 ~ 10016 255 10016 の範囲を使ってね。
    10000 0(1) 10000 にはシャルカーボックスがあるので注意。

  • -1 -1 ~ 0 0 は常にロードされてるけど描画に影響する物には使わないでね

tick をまたぐ処理の実装の仕方

tick をまたぐ処理を実装したくなることがあると思うんだけど、そういう時は必ず 1tick ループの schedule を使用してね

例:

#> asset:artifact/example/trigger/3.main
#
# 神器のメイン処理部
#
# @within function asset:artifact/example/trigger/2.check_condition

# 基本的な使用時の処理(MP消費や使用回数の処理など)を行う
    function asset:artifact/common/use/auto

# ここから先は神器側の効果の処理を書く
    summon falling_block ~ ~ ~ {Tags:["example"],BlockState:{Name:"minecraft:smoker",Properties:{lit:"true"}},Time:1}
# 煙を吐く
    function asset:artifact/example/trigger/3.1.smoke
#> asset:artifact/example/trigger/3.1.smoke
#
# 煙を吐く
#
# @within function
#   asset:artifact/example/trigger/3.main
#   asset:artifact/example/trigger/3.1.smoke

# 喫煙者から煙を吐く
    execute as @e[type=falling_block,tag=example] at @s run particle smoke ~ ~ ~ 1 1 1 0.5 50
# 次tickの予約 //limit=1を付けることでif entityは軽量化が可能
    execute if entity @e[type=falling_block,tag=example,limit=1] run schedule function asset:artifact/example/trigger/3.1.smoke 1t

storage: asset:contextに入っている情報

神器の処理中に参照できるコンテキスト情報。一部はトリガーが該当する時のみセットされるよ。

全トリガー共通

asset:context
├ id
│ ├ auto : int | null
│ ├ mainhand : int | null
│ ├ offhand : int | null
│ ├ head : int | null
│ ├ chest : int | null
│ ├ legs : int | null
│ ├ feet : int | null
│ └ all (trigger equip/dis_equip限定)
│    ├ auto : int | null
│    ├ mainhand : int | null
│    ├ offhand : int | null
│    ├ head : int | null
│    ├ chest : int | null
│    ├ legs : int | null
│    └ feet : int | null
│
├ Items
│ ├ AutoSlot : string('mainhand' | 'offhand' | 'head' | 'chest' | 'legs' | 'feet') | null
│ ├ mainhand : Item | null
│ ├ offhand : Item | null
│ ├ head : Item | null
│ ├ chest : Item | null
│ ├ legs : Item | null
│ └ feet : Item | null
│
└ Inventory : Readonly Item[]

asset:context Items.…を書き換えることでプレイヤーの神器の情報を書き換えることが可能だよ、必要に応じて使用してね。

トリガー別の追加情報

該当トリガーが発火している間だけ存在するフィールド。

attack/* トリガー
asset:context Attack : {
    From    : int | null,     # 攻撃者の MobUUID (プレイヤーの時は null)
    To      : int[],          # 攻撃対象の MobUUID 配列
    Amounts : double[],       # 各対象に与えるダメージ
    Amount  : double,         # Amountsの最大値 (foreachで自動計算される)
    Type    : string,         # "vanilla_melee" / "vanilla_projectile" / "vanilla_explosion"
    IsDoT   : boolean         # 継続ダメージ判定 (詳細は IsDoT / IsHoT のルール節参照)
}
damage/* トリガー
asset:context Damage : {
    From    : int | null,     # 攻撃元の MobUUID (奈落・落下等は null)
    Type    : string,         # "vanilla_melee" / "vanilla_drowning" / "vanilla_projectile"
                              # "vanilla_explosion" / "vanilla_fire" / "vanilla_freezing"
                              # "vanilla_lightning" / "vanilla_other"
    Amount  : double,         # 受けたダメージ量
    Blocked : boolean,        # シールド等でブロックしたか
    IsDoT   : boolean
}
heal トリガー
asset:context Heal : {
    From    : int,            # 回復元のUserID
    To      : int[],          # 回復対象のUserID配列
    Amounts : double[],
    Amount  : double,         # Amountsの最大値
    IsHoT   : boolean
}
receive_heal トリガー
asset:context ReceiveHeal : {
    From    : int | null,     # 回復元のUserID (環境効果等はnull)
    Amount  : double,
    IsHoT   : boolean
}
killed/* トリガー
asset:context Killed : {
    Target : Entity関連の情報 (詳細は実装側で参照)
}
shot トリガー
asset:context Shot : {
    Arrow : Entity関連の情報
}

テスト方法

  1. ワールドに入ってfunction asset:artifact/<神器名>/give/2.giveを実行してね。

  2. function debug/change_believe/<対応する神の名前>を実行して対応する神への信仰を得てね。

その他の方法: function debug/debug_privilege/を実行してね。 MP と信仰を無視して神器が使えるよ。

  1. 本来の方法で神器を使ってね。

対象に~する

APIのページを参照してね。

いろいろ作りたくない! core になんかないの?

Librariesのページを参照してみてね。無かったら質問してくれたら実装するかも。

6. 装備系神器・フルセット防具の作り方

Trigger:"equipping"を指定する装備系神器は、Equipmentフィールドを使って装備中の効果と能力補正を表現するよ。 1 部位だけの単発装備でも、 4 部位そろえてフルセットにするのでも、書き方の基本は同じ。

6.1. 単発の装備神器

1 部位の装備で完結する神器の例。Equipment.Effectsで装備中エフェクトを付与、Equipment.Modifiersで能力補正を加算するパターン。

例: 雷の腕輪 (head 装備、雷属性攻防+1%)

# 神器のID
    data modify storage asset:artifact ID set value 632
# 元アイテム
    data modify storage asset:artifact Item set value "minecraft:leather_helmet"
# 名前
    data modify storage asset:artifact Name set value '{"text":"雷の腕輪","color":"yellow"}'
# Lore
    data modify storage asset:artifact Lore set value []
# スロット & トリガー
    data modify storage asset:artifact Slot set value "head"
    data modify storage asset:artifact Trigger set value "equipping"
# MP (装備時のコストは0でOK)
    data modify storage asset:artifact MPCost set value 0
# 装備時効果 (EffectAssetを付与)
    data modify storage asset:artifact Equipment.Effects set value [{ID:235,Visible:true,IsSetEffect:false}]
# 装備時補正 (与雷ダメージ+1%、被雷ダメージ-2%)
    data modify storage asset:artifact Equipment.Modifiers set value []
    data modify storage asset:artifact Equipment.Modifiers append value {Type:"attack/thunder",Amount:0.01d,Operation:"multiply_base"}
    data modify storage asset:artifact Equipment.Modifiers append value {Type:"defense/thunder",Amount:0.02d,Operation:"multiply_base"}
# 信仰
    data modify storage asset:artifact CanUsedGod set value "ALL"
# 防具系はAttributeModifiersでarmor値も指定する
    data modify storage asset:artifact CustomNBT set value {Unbreakable:1b,AttributeModifiers:[{AttributeName:"generic.armor",Name:"generic.armor",Amount:2,Operation:0,UUID:[I;1,1,632,6],Slot:"head"}]}

    function asset:artifact/common/give

equipping時の 3.main の書き方

Trigger:"equipping"の神器は、Equipmentの効果(Effects/Modifiers)が自動で適用されるので、3.mainに何も書かなくていい場合が多いよ。装着時の SE 再生や特殊な初期化処理がある時だけ書く。

#> asset:artifact/0632.elec_helm/trigger/3.main
#
# @within function asset:artifact/0632.elec_helm/trigger/2.check_condition

# 装着SE
    playsound block.beacon.activate player @s ~ ~ ~ 0.5 1.5

6.2. フルセット防具

頭・胴・脚・足の 4 部位そろえた時だけ追加効果が発動する「フルセット効果」を作る場合は、神器側だけじゃなくてEffectAsset の仕組みを組み合わせて実現するよ。

仕組みの概要

  1. 4 部位それぞれのEquipment.Effects[].ID同じ EffectAsset の IDにする
  2. 対応する EffectAsset のMaxStack4に設定する
  3. EffectAsset のgiven/.mcfunctionで「Stack:4なら追加処理」を書く

これでプレイヤーが装備するたびに Effect の Stack が+1 され、 4 になった瞬間にフルセット効果が発動。 1 部位脱げば Stack が減ってフルセット効果も解除される、という流れ。

例: フレイムアーマーセット (EffectAsset ID 233 / 神器 624,625,626,627)

4 部位の神器側 (asset:artifact/0624.flame_helm0627.flame_boots)

それぞれのgive/2.giveで、同じEquipment.Effects[].IDを指定する。

# head側 (0624.flame_helm)
    data modify storage asset:artifact Slot set value "head"
    data modify storage asset:artifact Trigger set value "equipping"
    data modify storage asset:artifact Equipment.Effects set value [{ID:233,Visible:true,IsSetEffect:true}]
    data modify storage asset:artifact Equipment.Modifiers set value []
    data modify storage asset:artifact Equipment.Modifiers append value {Type:"defense/fire",Amount:0.075d,Operation:"multiply_base"}
    # … 4部位とも同じ ID:233 を使う
# chest側 (0625.flame_armor)
    data modify storage asset:artifact Slot set value "chest"
    data modify storage asset:artifact Equipment.Effects set value [{ID:233,Visible:true,IsSetEffect:true}]
    data modify storage asset:artifact Equipment.Modifiers set value []
    data modify storage asset:artifact Equipment.Modifiers append value {Type:"defense/fire",Amount:0.075d,Operation:"multiply_base"}

legs / feet も同じ要領で書いてね。

EffectAsset 側 (asset:effect/0233.flame_armor)

4 部位の集計を担当する EffectAsset 。MaxStack4にすることで、装備数=Stack 数で自動カウントできる。

#> asset:effect/0233.flame_armor/register
data modify storage asset:effect ID set value 233
data modify storage asset:effect Name set value '{"text":"フレイムアーマー","color":"red"}'
data modify storage asset:effect Description set value ['{"text":"火属性ダメージカット"}']
data modify storage asset:effect Duration set value -1
data modify storage asset:effect MaxStack set value 4
data modify storage asset:effect IsBadEffect set value false
data modify storage asset:effect RequireClearLv set value 4
EffectAsset のgiven/.mcfunction でフルセット判定
#> asset:effect/0233.flame_armor/given/
# Stack=4 のとき = 4部位全装備済み のときのみフルセット効果発動
    execute if data storage asset:context {Stack:4} run function asset:effect/0233.flame_armor/fullset/equip
re-given/.mcfunction で監視

スタック変化のたびに呼ばれるので、ここで「装備が崩れたら解除」も忘れずに。

#> asset:effect/0233.flame_armor/re-given/
    execute if data storage asset:context {Stack:4} run function asset:effect/0233.flame_armor/fullset/equip
    execute unless data storage asset:context {Stack:4} run function asset:effect/0233.flame_armor/fullset/dis_equip
fullset/equip.mcfunction / fullset/dis_equip.mcfunction

セット成立時の追加効果はここに書く。api:modifier/<対象>/addで補正追加 → dis_equipremove、が定型パターン。

#> asset:effect/0233.flame_armor/fullset/equip
# 追加で 火耐性+20% を付与
    data modify storage api: Argument.UUID set value [I;0,233,0,1]
    data modify storage api: Argument.Amount set value 0.2d
    data modify storage api: Argument.Operation set value "multiply_base"
    function api:modifier/defense/fire/add
# 演出
    playsound minecraft:block.fire.ambient player @s ~ ~ ~ 0.5 1.2
#> asset:effect/0233.flame_armor/fullset/dis_equip
# 追加補正の削除
    data modify storage api: Argument.UUID set value [I;0,233,0,1]
    function api:modifier/defense/fire/remove

既存のフルセット実装の例

  • flame_armor (EffectID 233 / Artifact 624,625,626,627)
  • flame_devil_armor (EffectID 246 / Artifact 1038,1039,1040 ※boots なし)
  • hardened_leather_* hardened_iron_* hardened_golden_* hardened_diamond_* hardened_netherite_* シリーズ

実装に迷ったらこれらを読むと参考になるよ。

6.3. Modifier の注意点

Operation の使い分け

Operation 計算式 用途
add ベース値 + Amount 固定値加算 (例: 最大 HP+10)
multiply_base ベース値 × (1 + Amount) 倍率増減の基本。 +10%は0.1d
multiply 前段の結果 × (1 + Amount) 多段重複の乗算。 Modifier が複数あると順番に適用

詳しい挙動はGamepedia参照。

フルセット時の重複加算に注意

4 部位それぞれのEquipment.Modifiers重複加算されるよ。例えば全部位で{Type:"defense/fire",Amount:0.1d,Operation:"multiply_base"}を指定すると、フルセットで火耐性+40%が掛かる。

意図しない倍率になるのを避ける方法:

  • 各部位で 1/4 ずつ書いて合計 100%にする (例: 0.025d を 4 部位で合計 0.1d 相当)
  • StackReductionで減衰させる
  • フルセット時のみ追加効果を出したい場合は、上記 6.2 のfullset/equipapi:modifier/<Type>/addを呼ぶ方式に統一する

7. 高度なトピック

ここから先は応用編。普通の神器を作る分には知らなくても困らないけど、込み入った神器を書こうとすると必要になってくるよ。

7.1. マルチトリガー神器の作り方

1 個の神器で複数のトリガー(例: 近接攻撃時とキル時の両方で効果を出す)を使いたい時は、ディレクトリと関数 tag 登録を増やして実現するよ。

大事なこと

  • TriggerフィールドはLore 表示用の主トリガーを 1 個書くだけ。実際の挙動とは独立。
  • 副トリガーは、<神器名>/<副トリガー名>/{1.trigger,2.check_condition,3.main}.mcfunctionの 3 点セットを別ディレクトリに作って、対応する tag ファイル(attack/melee.json等)に登録する。
  • 副トリガーでcommon/use/<slot>を呼ぶかどうかは設計者次第。主側で MP/CD を管理してるなら副側では呼ばずに、演出と効果だけ書くパターンが多いよ。

例: 渇望の剣 (0292.craving_sword)

  • Trigger:"onAttackByMelee" (主) - 近接攻撃時に魔法ダメージ
  • キル時の追加効果 (副) - 撃破時に HP 回復
ディレクトリ構成
asset/functions/artifact/0292.craving_sword/
    register.mcfunction
    give/
        1.trigger.mcfunction
        2.give.mcfunction         # Trigger:"onAttackByMelee" (主、表示用)
    melee/                         # 近接攻撃時の処理
        1.trigger.mcfunction       # → tags/.../attack/melee.json に登録
        2.check_condition.mcfunction
        3.main.mcfunction          # MP消費 + ダメージ加算 + 演出
    kill/                          # キル時の処理 (副)
        1.trigger.mcfunction       # → tags/.../killed.json に登録
        2.check_condition.mcfunction
        3.main.mcfunction          # 副なのでMP/CDは消費しない、 HP回復のみ
副トリガーの1.trigger.mcfunction

中身は主トリガーと全く同じパターン。ファイルパスだけが違う。

#> asset:artifact/0292.craving_sword/kill/1.trigger
#
# @within tag/function asset:artifact/killed
    execute if data storage asset:context id{mainhand:292} run function asset:artifact/0292.craving_sword/kill/2.check_condition
副トリガーの3.main.mcfunction (MP 消費なし ver)
#> asset:artifact/0292.craving_sword/kill/3.main
#
# @within function asset:artifact/0292.craving_sword/kill/2.check_condition

# common/use/<slot> を呼ばない (主側でCD/MP消費済み)

# 演出
    particle minecraft:composter ~ ~1 ~ 0.5 0.5 0.5 1 20 force @s
    playsound minecraft:entity.arrow.hit_player player @s ~ ~ ~ 1 1

# HP回復
    data modify storage api: Argument.Heal set value 5f
    function api:heal/modifier
    function api:heal/
    function api:heal/reset
関数 tag への登録
// data/asset/tags/functions/artifact/attack/melee.json
{
    "values": [
        "asset:artifact/0292.craving_sword/melee/1.trigger"
    ]
}

// data/asset/tags/functions/artifact/killed.json
{
    "values": [
        "asset:artifact/0292.craving_sword/kill/1.trigger"
    ]
}

ディレクトリ名の付け方

  • trigger/ (1 個しかトリガーがない時のデフォルト)
  • melee/ projectile/ explosion/ (攻撃種別ごと)
  • kill/ (キル時)
  • equip/ dis_equip/ (装備変化時)
  • tick/ (毎 tick)

読み手にわかりやすければ自由に命名して OK 。

7.2. トリガーで使えるタグ (Victim/Attacker/Healer/Receiver)

attack / damage / heal / receive_heal の各トリガーが発火している時、関連する Entity に自動でタグが付与されるよ。神器の処理中だけ存在する一時タグで、トリガー処理が終わったら自動で外される。

タグ 付与対象 付与条件 距離制限 使えるトリガー
Victim @e[type=#lib:living_without_player] MobUUID = Attack.To[i] ..150 attack/* (melee/projectile/explosion 全種)
Attacker @e[type=#lib:living_without_player] MobUUID = Damage.From ..150 damage/* (melee/drowning/projectile/explosion/fire/freezing/lightning/other + from_entity/*)
Receiver @a (プレイヤーのみ) UserID = Heal.To[i] なし heal
Healer @a (プレイヤーのみ) UserID = ReceiveHeal.From なし receive_heal

使い方

攻撃対象に追撃ダメージを与える例:

#> asset:artifact/<name>/melee/3.main
    function asset:artifact/common/use/mainhand

# 攻撃したEntity (Victimタグ持ち) に追加ダメージ
    execute as @e[tag=Victim,distance=..8] at @s run function <追加ダメージfunction>

被弾時に攻撃元にカウンターする例:

#> asset:artifact/<name>/damage/3.main
    function asset:artifact/common/use/<slot>

# 攻撃元 (Attackerタグ持ち) にカウンター
    execute as @e[tag=Attacker,distance=..150] at @s run function <カウンターfunction>

回復してくれたプレイヤーに感謝を返す例:

#> asset:artifact/<name>/receive_heal/3.main
# 回復元 (Healerタグ持ち) にお返しのバフ
    execute as @a[tag=Healer] run function <バフ付与function>

注意点

  • Victim / Attackerプレイヤーには付かない (#lib:living_without_player限定)。プレイヤー対プレイヤーの状況では使えない。
  • Receiver / Healerは逆にプレイヤーにしか付かない (@a)。 Mob を回復しても Mob には付かないので、神器の効果として Mob を回復した場合、ターゲット側に付与する処理は自前で書く必要があるよ。
  • 150m の距離制限がある (Victim/Attacker)。遠距離攻撃で遠くから飛んできた弾で被弾した場合、 150m 超だと Attacker タグが付かないことがある。

7.3. IsDoT / IsHoT のルール

継続ダメージ (DoT = Damage over Time) や継続回復 (HoT = Heal over Time) のたびに神器トリガーが発火すると、毒や燃焼で神器が連発される困ったことになるよね。なので TSB にはこれを抑止する仕組みがあるよ。

仕組み

api:damage/api:heal/を呼ぶ前にArgument.ApplyTriggerfalseにしておくと、そのダメージ/回復は神器のトリガーを発火させない継続効果として扱われる。

# DoT扱いのダメージを与える側
    data modify storage api: Argument.Damage set value 2.0f
    data modify storage api: Argument.AttackType set value "Magic"
    data modify storage api: Argument.ApplyTrigger set value false   # ← これがDoTの宣言
    function api:damage/
    function api:damage/reset

これにより:

  • asset:context.Attack.IsDoT (or Damage.IsDoT) がtrueにセットされる
  • 神器側の2.check_conditionIsDoT:trueを弾く処理が一般的

神器側で除外する書き方

攻撃系の神器で「 DoT では発動したくない」場合は、2.check_conditionにこの一行を入れておくと安心。

#> asset:artifact/<name>/melee/2.check_condition
    function asset:artifact/common/check_condition/mainhand

# 通常チェックは通っても、DoTダメージのときはキャンセル
    execute if entity @s[tag=CanUsed] if data storage asset:context Attack{IsDoT:true} run tag @s remove CanUsed

    execute if entity @s[tag=CanUsed] run function asset:artifact/<name>/melee/3.main

HoT 側も同じ要領。Heal{IsHoT:true} / ReceiveHeal{IsHoT:true} で判定する。

制作者がApplyTrigger:falseを指定する場面

  • 自分の神器が DoT エフェクト(毒・出血・延焼など)を放つ時 → 継続ダメージで自身のトリガーを再帰発火させないため
  • 治癒系の tick 内回復を作る時 → 毎 tick の回復で別の神器が連鎖発火しないように

エフェクト側 (例: asset:effect/0307.bleeding/tick/damage) ではApplyTrigger:falseを指定して、神器側では DoT を弾く、というのが定型のペア。

Vanilla ダメージの扱い

バニラ由来のダメージ(火・毒・落下・奈落 等)は実装上すべてIsDoT:false扱いになってるよ。本来は毒はtrueにしたいけど判定が技術的に難しいので、現状全部false
→ つまり、神器側でIsDoTを見て弾く設計にすれば、自前で立てた DoT だけを除外できる。

8. Q & A

Q. 神器が動かないんだけど:anger:

A. いろいろな理由があるけど、とりあえず game output を確認してみて

game output はランチャーの設定からゲーム開始時に出力ログを開く(en: Open output log when games start)にチェックをつけることで確認できるよ。

エラーが出てたらそれの通りに従ってみてね。エラーが出てなかったり、エラーの意味が分からないときは質問用のチャンネルで聞いてみてね。

よくあるハマりポイントもまとめておくよ:

  • MP/CD が消費されない3.mainの冒頭でcommon/use/<slot>を呼んでない可能性
  • 常に発動できる/全然発動できない1.triggerid{<slot>:<id>}<slot><id>2.giveと一致してるか確認
  • Equipment.Modifiers が想定の 4 倍効いてる → フルセットで全部位に同じ補正を書いた結果。 1/4 にするか、fullset/equip方式に変える (Modifier の注意点参照)
  • DoT で神器が連発される2.check_conditionIsDoT:true/IsHoT:trueを弾く (IsDoT / IsHoT のルール参照)
  • 副トリガーの神器が誤発動する1.triggerid{<slot>:<id>}が正しいか、副トリガー用の2.check_conditionDisabledCheckFlagを意図通りに設定しているか

Q. GitEmoji の使い方わからない><

A. PullRequest を master に merge するときにこっちでつけるから使わなくても大丈夫。

Q. この音だけ Playsound で鳴らないんだけど?

A. 一部の SoundEvent はリソースパックで無効化されています。
代わりに音源ファイルを指定できるようになっているので、そちらに置き換えてください。

無効化されている SoundEvent 置き換え先
minecraft:entity.player.levelup ogg:random.levelup

Q. 情報が足りないんだけど:anger:

A. いや本当にごめんなさい。足りない部分教えてくれたら優先して記述します。

Clone this wiki locally