Skip to content

create artifact

Ella-AWS edited this page May 17, 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 があるはずだよ。中身はこんな感じ:

#> asset:artifact/<神器名>/give/2.give
#
# 神器の作成部 ここでID等を定義する
#
# @user
# @within function asset:artifact/<神器名>/give/1.trigger

# 神器の説明や消費MPなどをここで設定する。
# 最後にasset:artifact/common/giveを実行することで入手可能。

# 神器のID (int) スプレッドシートの値を入れる
    data modify storage asset:artifact ID set value <神器ID>
# 神器のベースアイテム
    data modify storage asset:artifact Item set value 
# 神器の名前 (TextComponentString)
    data modify storage asset:artifact Name set value 
# 神器の説明文 (TextComponentString[])
    data modify storage asset:artifact Lore set value []
# 消費アイテム ({Item: TextComponent, Count: int, Extra?: TextComponent}) (オプション)
    # data modify storage asset:artifact ConsumeItem.Item set value '{"translate":"item.minecraft.stick"}'
    # data modify storage asset:artifact ConsumeItem.Count set value 1
    # data modify storage asset:artifact ConsumeItem.Extra set value 
# 使用回数 (int) (オプション)
    # data modify storage asset:artifact RemainingCount set value 
# 神器を発動できるスロット (string) Wikiを参照
    data modify storage asset:artifact Slot set value "<slot>"
# 神器のトリガー (string) Wikiを参照
    data modify storage asset:artifact Trigger set value 
# 神器の発動条件 (TextComponentString) (オプション)
    # data modify storage asset:artifact Condition set value 
# 攻撃に関する情報 -Damage量 (literal[]/literal) Wikiを参照 (オプション)
    # data modify storage asset:artifact AttackInfo.Damage set value [0,0]
# 攻撃に関する情報 -攻撃タイプ (string[]) Wikiを参照 (オプション)
    # data modify storage asset:artifact AttackInfo.AttackType set value [Physical,Magic]
# 攻撃に関する情報 -攻撃属性 (string[]) Wikiを参照 (オプション)
    # data modify storage asset:artifact AttackInfo.ElementType set value [Fire,Water,Thunder,None]
# 攻撃に関する情報 -防御無視 (boolean) Wikiを参照 (オプション)
    # data modify storage asset:artifact AttackInfo.BypassResist set value 
# 攻撃に関する情報 -範囲攻撃 (string) Wikiを参照 (オプション)
    # data modify storage asset:artifact AttackInfo.IsRangeAttack set value 
# 攻撃に関する情報 -攻撃範囲 (literal) Wikiを参照 (オプション)
    # data modify storage asset:artifact AttackInfo.AttackRange set value 
# MP消費量 (int) 
    # data modify storage asset:artifact MPCost set value 
# MP必要量 (int) (オプション)
    # data modify storage asset:artifact MPRequire set value 
# MP回復量 (int) 
    # data modify storage asset:artifact MPHealWhenHit set value 
# 神器のクールダウン (int) (オプション)
    # data modify storage asset:artifact LocalCooldown set value 
# 種別クールダウン ({Type: string, Duration: int}) (オプション)
    # data modify storage asset:artifact TypeCooldown.Type set value 
    # data modify storage asset:artifact TypeCooldown.Duration set value
# グローバルクールダウン (int) (オプション)
    # data modify storage asset:artifact SpecialCooldown set value 
# 扱える神 (string[]) Wikiを参照
    data modify storage asset:artifact CanUsedGod set value []
# カスタムNBT (NBTCompound) 追加で指定したいNBT (オプション)
    # data modify storage asset:artifact CustomNBT set value {}

# 神器の入手用function
    function asset:artifact/common/give

<神器ID><slot> はテンプレート生成時に自動で埋め込まれている。その他の … 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
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 発射 o 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"]を省略可能

消費アイテムの設定 (ConsumeItem)

神器の使用時に消費するアイテムは ConsumeItem フィールドで指定する。Lore には自動で 消費アイテム: <アイテム名> x <個数> (<追加表記>) の形式で表示されるよ。

キー 必須 意味
ConsumeItem.Item TextComponent o 表示するアイテム名 (translate 形式で書く)
ConsumeItem.Count int o 消費する個数 (Lore 表示用)
ConsumeItem.Extra TextComponent × 追加表記 (例:「25%」「矢 x 1」等)。ある時だけ Lore に括弧付きで併記される

Item は TextComponent なので、バニラアイテムは translate を使って書いてね :

  • アイテム: {"translate":"item.minecraft.<itemID>"}
  • ブロック: {"translate":"block.minecraft.<itemID>"}
例: 骨粉 x 8 を消費するクワ (0088.fertility_hoe)
data modify storage asset:artifact ConsumeItem.Item set value '{"translate":"item.minecraft.bone_meal"}'
data modify storage asset:artifact ConsumeItem.Count set value 8
例: Extra に確率表記を追加 (0005.musket_matchlock の「25%」表示)
data modify storage asset:artifact ConsumeItem.Item set value '{"translate":"item.minecraft.gunpowder"}'
data modify storage asset:artifact ConsumeItem.Count set value 1
data modify storage asset:artifact ConsumeItem.Extra set value '"25%"'
実際の消費処理

ConsumeItemLore 表示専用 だよ。実際にプレイヤーのインベントリからアイテムを引く処理は 3.main 側で api:inventory/clear を呼んで自分で行う必要がある。

# 骨粉を 8 個消費する
data modify storage api: Argument.Target set value {id:"minecraft:bone_meal"}
data modify storage api: Argument.Amount set value 8
function api:inventory/clear

「個数が足りるかどうかだけチェック」したい時は Argument.Amount0 で呼ぶ。これを 2.check_condition で使えば「アイテム不足なら発動失敗」のロジックが組める。

攻撃情報の書式

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

クールダウンの種類

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

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

  • TypeCooldown (種別クールダウン)
    同じ Type を持つ神器同士でクールダウンを共有するよ。例えば 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 と同じ仕組みの第二の種別クールダウン。同じ種別の選択肢 (shortRange/longRange/summon/heal) から任意で指定可能。TypeCooldown と組み合わせて、1 つの神器に 2 系統のクールダウンを同時に効かせたい時に使う。

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

    例: 0295.call_elemental_familiar (エレメンタル・ファミリア召喚) では、第一の種別クールダウンで summon 600tick、第二の種別クールダウンで longRange 80tick を併用している。

  • SpecialCooldown
    SpecialCooldown を持つ神器を使用すると、そのワールドで該当のクールダウンを持つ神器全てにクールダウンがかかるよ。プレイヤー単位ではなくワールド単位。
    bossbar で残り時間が表示される。

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 と Modifiers が自動で適用されるよ。対象スロットは Equipment.Slot で指定する (省略時は Slot の値が使われる)。詳しい使い方は装備系神器・フルセット防具の作り方を見てね。ここではフィールドの形式だけ紹介。

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_healmax_mp 等。

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

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

通常、神器の使用時には信仰・クールダウン・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 更新等)をスキップ
BreakSound RemainingCount を使い切った時の破壊音 (entity.item.break) を鳴らさない
よくある使い方
  • セット効果のあるサブ神器で、本体側で CD/MP 管理してるからこの神器ではチェック不要 → Checkを全部true
  • 通常のメッセージは出したくないけど挙動は通常通り → BelieveMessage/CDMessage/MPMessagetrue
  • アイテム更新でちらつく演出を避けたい → Use.ItemUpdate:true
  • 使用回数切れの破壊音を消したい → Use.BreakSound: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 は足りているか、クールダウンが終わっているか、信仰条件を満たしているか、アイテム残量はあるか…といった発動可否の判定をここでまとめてやるよ。

テンプレート生成で作られた~/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 (個別クールダウン)
  3. SpecialCooldown (グローバルクールダウン)
  4. TypeCooldown / SecondaryTypeCooldown (種別クールダウン)
  5. MPRequire (MP 不足)

全部通れば@sCanUsedタグが付与される。どれかで失敗すればCanUsedタグは付かず、失敗時のメッセージが tellraw で表示される。

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

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

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

書き方の鉄則 :

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

例: 晴れの時しか使えない神器

# 基本チェック (信仰・クールダウン・MP)
    function asset:artifact/common/check_condition/mainhand

# 追加チェック: 晴れていないなら CanUsed をはがす
    execute if entity @s[tag=CanUsed] unless predicate lib:weather/is_sunny 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>が、神器使用時の「消費系の後片付け」を全部まとめて引き受けてくれる :

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

  • 神器で tag, score_holder, objective を定義する際はほかの神器と干渉しないように、名前の先頭に神器 ID 等の識別子を入れてね

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

持続エフェクトや弾・トラップみたいに複数 tick にわたる処理は、ObjectAssetを使うのを推奨するよ。個体ごとの状態保持や tick ループの仕組みが asset_manager 側に用意されてるから、神器側は api:object/summon を呼ぶだけで済む。

例: 神器 (0355.barrel) の召喚部

#> asset:artifact/0355.barrel/trigger/summon_barrel
#
# 樽を召喚する
#
# @within function asset:artifact/0355.barrel/trigger/3.main

# 召喚パラメータをセット
    data modify storage api: Argument.ID set value 1081
    data modify storage api: Argument.FieldOverride.Damage set value 75.0f
    execute store result storage api: Argument.FieldOverride.UserID int 1 run scoreboard players get @s UserID
# 神器使用者の少し上に召喚
    execute positioned ~ ~3.6 ~ run function api:object/summon

ObjectAsset 側 (register / summon / tick) の書き方はObjectAsset の作り方を参照。

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 : {
    To        : int[],        # 攻撃対象の MobUUID 配列
    Amounts   : double[],     # 各対象に与えるダメージ
    Amount    : double,       # Amounts の最大値 (foreach で自動計算される)
    Type      : string,       # "vanilla_melee" / "vanilla_projectile" / "vanilla_explosion"
    IsVanilla : boolean,      # バニラ起因の攻撃か (api:damage/ 経由なら false)
    IsDoT     : boolean       # 継続ダメージ判定
}

IsDoT の詳細は IsDoT / IsHoT のルール を参照。

damage/* トリガー
asset:context Damage : {
    From?     : int,          # 攻撃元の MobUUID (Mob から受けたダメージの時のみ)
    Type      : string,       # "vanilla_melee" / "vanilla_drowning" / "vanilla_projectile"
                              # "vanilla_explosion" / "vanilla_fire" / "vanilla_freezing"
                              # "vanilla_lightning" / "vanilla_other"
    Amount    : double,       # 受けたダメージ量
    Blocked   : boolean,      # 盾でブロックしたか
    IsVanilla : boolean,      # バニラ起因か (api:damage/ 経由なら false)
    IsDoT     : boolean
}
heal トリガー
asset:context Heal : {
    To      : int[],          # 回復対象の UserID 配列
    Amounts : double[],       # 各対象への回復量
    Amount  : double,         # Amounts の最大値 (foreach で自動計算)
    IsHoT   : boolean         # 継続回復判定
}
receive_heal トリガー
asset:context ReceiveHeal : {
    From?   : int,            # 回復元プレイヤーの UserID (プレイヤーからの回復のみ)
    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. 装備系神器・フルセット防具の作り方

装備中の効果や能力補正を持たせたい神器は、Equipmentフィールドで表現するよ。1 部位だけの単発装備でも、4 部位そろえてフルセットにするのでも、書き方の基本は同じ。

6.1. 単発の装備神器

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

例: エレキヘルム (0632.elec_helm、head 装備、雷属性攻防+1%)

#> asset:artifact/0632.elec_helm/give/2.give
#
# 神器の作成部 ここでID等を定義する
#
# @user
# @within function asset:artifact/0632.elec_helm/give/1.trigger

# 神器の説明や消費MPなどをここで設定する。
# 最後にasset:artifact/common/giveを実行することで入手可能。

# 神器のID (int) スプレッドシートの値を入れる
    data modify storage asset:artifact ID set value 632
# 神器のベースアイテム
    data modify storage asset:artifact Item set value "minecraft:leather_helmet"
# 神器の名前 (TextComponentString)
    data modify storage asset:artifact Name set value '{"text":"エレキヘルム","color":"yellow"}'
# 神器の説明文 (TextComponentString[])
    data modify storage asset:artifact Lore set value []
# 消費アイテム ({Item: TextComponent, Count: int, Extra?: TextComponent}) (オプション)
    # data modify storage asset:artifact ConsumeItem.Item set value
    # data modify storage asset:artifact ConsumeItem.Count set value
    # data modify storage asset:artifact ConsumeItem.Extra set value
# 使用回数 (int) (オプション)
    # data modify storage asset:artifact RemainingCount set value
# 神器を発動できるスロット (string) Wikiを参照
    data modify storage asset:artifact Slot set value "head"
# 神器のトリガー (string) Wikiを参照
    data modify storage asset:artifact Trigger set value "equipping"
# 神器の発動条件 (TextComponentString) (オプション)
    # data modify storage asset:artifact Condition set value
# 攻撃に関する情報 -Damage量 (literal[]/literal) Wikiを参照 (オプション)
    # data modify storage asset:artifact AttackInfo.Damage set value [0,0]
# 攻撃に関する情報 -攻撃タイプ (string[]) Wikiを参照 (オプション)
    # data modify storage asset:artifact AttackInfo.AttackType set value [Physical,Magic]
# 攻撃に関する情報 -攻撃属性 (string[]) Wikiを参照 (オプション)
    # data modify storage asset:artifact AttackInfo.ElementType set value [Fire,Water,Thunder,None]
# 攻撃に関する情報 -防御無視 (boolean) Wikiを参照 (オプション)
    # data modify storage asset:artifact AttackInfo.BypassResist set value
# 攻撃に関する情報 -範囲攻撃 (string) Wikiを参照 (オプション)
    # data modify storage asset:artifact AttackInfo.IsRangeAttack set value
# 攻撃に関する情報 -攻撃範囲 (literal) Wikiを参照 (オプション)
    # data modify storage asset:artifact AttackInfo.AttackRange set value
# MP消費量 (int)
    data modify storage asset:artifact MPCost set value 0
# MP必要量 (int) (オプション)
    # data modify storage asset:artifact MPRequire set value
# 神器のクールダウン (int) (オプション)
    # data modify storage asset:artifact LocalCooldown set value
# 種別クールダウン ({Type: string, Duration: int}) (オプション)
    # data modify storage asset:artifact TypeCooldown.Type set value
    # data modify storage asset:artifact TypeCooldown.Duration set value
# グローバルクールダウン (int) (オプション)
    # data modify storage asset:artifact SpecialCooldown set value
# 装備時効果 ({ID: int, Visible: boolean}[]) (オプション)
    data modify storage asset:artifact Equipment.Effects set value [{ID:235,Visible:true,IsSetEffect:true}]
# 装備時ステータス補正 ({Type: string, Amount: double, Operation: string, StackReduction?: double}[]) (オプション)
    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"}
# 扱える神 (string[]) Wikiを参照
    data modify storage asset:artifact CanUsedGod set value ["Flora", "Urban", "Nyaptov", "Wi-ki"]
# カスタムNBT (NBTCompound) 追加で指定したいNBT (オプション)
    data modify storage asset:artifact CustomNBT set value {HideFlags:68,display:{color:16776960},Unbreakable:1b,AttributeModifiers:[{AttributeName:"generic.armor",Name:"generic.armor",Amount:2,Operation:0,UUID:[I;1,1,632,6],Slot:"head"},{AttributeName:"generic.armor_toughness",Name:"generic.armor_toughness",Amount:0.5,Operation:0,UUID:[I;1,1,632,6],Slot:"head"}]}

# 神器の入手用function
    function asset:artifact/common/give

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 側の実物がこれ:

#> asset:artifact/0624.flame_helm/give/2.give
#
# 神器の作成部 ここでID等を定義する
#
# @user
# @within function asset:artifact/0624.flame_helm/give/1.trigger

# 神器の説明や消費MPなどをここで設定する。
# 最後にasset:artifact/common/giveを実行することで入手可能。

# 神器のID (int) スプレッドシートの値を入れる
    data modify storage asset:artifact ID set value 624
# 神器のベースアイテム
    data modify storage asset:artifact Item set value "minecraft:leather_helmet"
# 神器の名前 (TextComponentString)
    data modify storage asset:artifact Name set value '{"text":"フレイムヘルム","color":"red"}'
# 神器の説明文 (TextComponentString[])
    data modify storage asset:artifact Lore set value []
# 神器を発動できるスロット (string) Wikiを参照
    data modify storage asset:artifact Slot set value "head"
# 神器のトリガー (string) Wikiを参照
    data modify storage asset:artifact Trigger set value "equipping"
# MP消費量 (int)
    data modify storage asset:artifact MPCost set value 0
# 装備時効果 ({ID: int, Visible: boolean}[]) (オプション)
    data modify storage asset:artifact Equipment.Effects set value [{ID:233,Visible:true,IsSetEffect:true}]
# 装備時ステータス補正 ({Type: string, Amount: double, Operation: string, StackReduction?: double}[]) (オプション)
    data modify storage asset:artifact Equipment.Modifiers set value []
    data modify storage asset:artifact Equipment.Modifiers append value {Type:"attack/fire",Amount:0.01d,Operation:"multiply_base"}
    data modify storage asset:artifact Equipment.Modifiers append value {Type:"defense/fire",Amount:0.02d,Operation:"multiply_base"}
# 扱える神 (string[]) Wikiを参照
    data modify storage asset:artifact CanUsedGod set value ["Urban", "Nyaptov", "Rumor"]
# カスタムNBT (NBTCompound) 追加で指定したいNBT (オプション)
    data modify storage asset:artifact CustomNBT set value {HideFlags:68,display:{color:16720899},Unbreakable:1b,AttributeModifiers:[{AttributeName:"generic.armor",Name:"generic.armor",Amount:2,Operation:0,UUID:[I;1,1,624,6],Slot:"head"},{AttributeName:"generic.armor_toughness",Name:"generic.armor_toughness",Amount:0.5,Operation:0,UUID:[I;1,1,624,6],Slot:"head"}]}

# 神器の入手用function
    function asset:artifact/common/give

0625.flame_armor (chest) / 0626.flame_leggings (legs) / 0627.flame_boots (feet) も同じ要領で書く。各部位で SlotCustomNBTSlot/UUID[3] (神器 ID) は変える必要があるけど、Equipment.Effects[].ID は 4 部位とも同じ 233 にすること。

EffectAsset 側 (asset:effect/0233.flame_armor)

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

#> asset:effect/0233.flame_armor/register
#
# Effectのデータを指定
#
# @within function asset:effect/0233.flame_armor/_/register

# ExtendsSafe (boolean) (default = false)
    # data modify storage asset:effect ExtendsSafe set value true
# ID (int)
    data modify storage asset:effect ID set value 233
# 名前 (TextComponentString)
    data modify storage asset:effect Name set value '{"text":"フレイムアーマー","color":"red"}'
# 説明文 (TextComponentString[])
    data modify storage asset:effect Description set value ['{"text":"火攻撃 +2%","color":"green"}','{"text":"火耐性 +2%","color":"green"}']
# 効果時間 (int) (default = API || error)
    data modify storage asset:effect Duration set value 2147483647
# スタックの操作方法 (default = API || "replace")
    data modify storage asset:effect StackOperation set value "forceReplace"
# 最大スタック (int) (default = 2147483647)
    data modify storage asset:effect MaxStack set value 4
# 悪い効果か否か (boolean)
    data modify storage asset:effect IsBadEffect set value false
# 死亡時のエフェクトの処理 (default = "remove")
    data modify storage asset:effect ProcessOnDied set value "keep"
# 消すのに必要なレベル (int) (default = 1)
    data modify storage asset:effect RequireClearLv set value 3
# エフェクトをUIに表示するか (boolean) (default = true)
    data modify storage asset:effect Visible set value false
EffectAsset のgiven/.mcfunction でフルセット判定

初回付与時。Stack:4 (= 4 部位全装備済み) のときのみフルセット効果発動 + 次回 re-given のために PrevStack を Field に保存する。

#> asset:effect/0233.flame_armor/given/
#
# Effectが付与された時の処理
#
# @within function asset:effect/0233.flame_armor/_/given

# フルセット効果を付与
    execute if data storage asset:context {Stack:4} run function asset:effect/0233.flame_armor/fullset/equip

# スタックを記録
    data modify storage asset:context this.PrevStack set from storage asset:context Stack
re-given/.mcfunction で監視

スタック変化のたびに呼ばれる。PreviousField.PrevStack (前回保存した値) と現在の Stack を比較して、フルセット成立 / 崩壊のエッジを検出する。

#> asset:effect/0233.flame_armor/re-given/
#
# Effectが上書きされた時の処理
#
# @within function asset:effect/0233.flame_armor/_/re-given

# フルセット効果を削除
    execute if data storage asset:context PreviousField{PrevStack:4} unless data storage asset:context {Stack:4} run function asset:effect/0233.flame_armor/fullset/dis_equip

# フルセット効果を付与
    execute unless data storage asset:context PreviousField{PrevStack:4} if data storage asset:context {Stack:4} run function asset:effect/0233.flame_armor/fullset/equip

# スタックを記録
    data modify storage asset:context this.PrevStack set from storage asset:context Stack
fullset/equip.mcfunction / fullset/dis_equip.mcfunction

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

#> asset:effect/0233.flame_armor/fullset/equip
# @within function asset:effect/0233.flame_armor/*given/

# 火攻撃
    data modify storage api: Argument.UUID set value [I;1,3,233,0]
    data modify storage api: Argument.Amount set value 0.02
    data modify storage api: Argument.Operation set value "multiply_base"
    function api:modifier/attack/fire/add

# 火耐性
    data modify storage api: Argument.UUID set value [I;1,3,233,0]
    data modify storage api: Argument.Amount set value 0.02
    data modify storage api: Argument.Operation set value "multiply_base"
    function api:modifier/defense/fire/add

# 演出
    particle flame ~ ~1.2 ~ 0.4 0.5 0.4 0 20 normal @a
    playsound minecraft:entity.blaze.shoot player @a ~ ~ ~ 1 0.2 0
#> asset:effect/0233.flame_armor/fullset/dis_equip
# @within function
#   asset:effect/0233.flame_armor/re-given/
#   asset:effect/0233.flame_armor/remove/

# 火攻撃
    data modify storage api: Argument.UUID set value [I;1,3,233,0]
    function api:modifier/attack/fire/remove

# 火耐性
    data modify storage api: Argument.UUID set value [I;1,3,233,0]
    function api:modifier/defense/fire/remove

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

  • flame_armor (EffectID 233 / Artifact 624,625,626,627)
  • flame_devil_armor (EffectID 246 / Artifact 1038,1039,1040,1041)
  • aurora_armor (EffectID 244 / Artifact 787,788,789,790)

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

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. 神器が動かないんだけど

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
minecraft:item.armor.equip_chain ogg:item.armor.equip_chain1 〜 equip_chain6
minecraft:item.armor.equip_diamond ogg:item.armor.equip_diamond1 〜 equip_diamond6
minecraft:item.armor.equip_elytra ogg:item.armor.equip_leather1 〜 equip_leather6
minecraft:item.armor.equip_gold ogg:item.armor.equip_gold1 〜 equip_gold6
minecraft:item.armor.equip_iron ogg:item.armor.equip_iron1 〜 equip_iron6
minecraft:item.armor.equip_leather ogg:item.armor.equip_leather1 〜 equip_leather6
minecraft:item.armor.equip_netherite ogg:item.armor.equip_netherite1 〜 equip_netherite4
minecraft:item.armor.equip_turtle ogg:mob.turtle.armor

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

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

Clone this wiki locally