-
Notifications
You must be signed in to change notification settings - Fork 7
create artifact
- 1. 事前に済ませてね
- 2. テンプレートを作成する
- 3. 神器の基本情報の設定
- 4. 神器の処理の記述
- 5. 基本的な情報
- 6. 装備系神器・フルセット防具の作り方
- 7. 高度なトピック
- 8. Q & A
- TSBリポジトリのクローン, ブランチを切っている状態
- 推奨拡張機能の導入
まずはMCDatapackUtilityを利用して神器アセットのテンプレートを作成するよ。
Datapack: Create Datapack templateを実行してね。デフォルトだとShift + Alt + D -> Shift + Alt + Tを押すと動作するよ。
すると下記の画像みたいなメニューが出てくるからデータパックにテンプレートを追加するを選択してね。

出てきたダイアログでデータパックを選択できるからAssetフォルダを指定するよ。
次にテンプレートを生成する名前空間を選択できるから下記の命名規則に沿って名前を入力してね。
神器名を入力すると生成するテンプレートを選ぶメニューが出るから、神器に合わせたトリガーにチェックを付けてOKを押してね。

これでテンプレートがAsset/data/asset/functions/artifact/<神器名>/~に生成されてるはずだよ。
note: slot が hotbar の神器を作る場合は「神器/テンプレート」は選択せず「神器/テンプレート(hotbar)」を選択してね。
note: tick を跨ぐスコアを使いたい場合は、テンプレート生成時に
神器/テンプレート: 初期化処理もチェックを付けてね。~/0.load.mcfunctionが一緒に生成されて、そこで objective を定義できるよ。
注: ここから先基本的に 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}]}} |
他の場所でも使われるけど ID はこの 9 つだよ
| ID | 対応する場所 | 実装済 |
|---|---|---|
| mainhand | メインハンド | o |
| offhand | オフハンド | o |
| feet | 足防具 | o |
| legs | 脚防具 | o |
| chest | 胸防具 | o |
| head | 頭防具 | o |
| inventory | インベントリ | x |
| hotbar | ホットバー | o |
| auto | 自動判定 | o |
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 フィールドで指定する。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>"}
data modify storage asset:artifact ConsumeItem.Item set value '{"translate":"item.minecraft.bone_meal"}'
data modify storage asset:artifact ConsumeItem.Count set value 8data 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%"'ConsumeItem は Lore 表示専用 だよ。実際にプレイヤーのインベントリからアイテムを引く処理は 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.Amount を 0 で呼ぶ。これを 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(エレメンタル・ファミリア召喚) では、第一の種別クールダウンでsummon600tick、第二の種別クールダウンでlongRange80tick を併用している。 -
SpecialCooldown
SpecialCooldown を持つ神器を使用すると、そのワールドで該当のクールダウンを持つ神器全てにクールダウンがかかるよ。プレイヤー単位ではなくワールド単位。
bossbar で残り時間が表示される。
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 の値が使われる)。詳しい使い方は装備系神器・フルセット防具の作り方を見てね。ここではフィールドの形式だけ紹介。
装備中に付与する 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.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/base、attack/physical、defense/thunder、heal、mp_heal、max_mp 等。
Operationの使い分けはOperationの注意点を参照。
通常、神器の使用時には信仰・クールダウン・MP が自動でチェックされて、引っかかると失敗メッセージが表示されるよ。これを神器単位で個別に無効化したい時は DisabledFlag を使ってね。
形式:
data modify storage asset:artifact DisabledFlag set value {Check:{Believe:true,BelieveMessage:true},Use:{ItemUpdate:true}}発動条件チェック (common/check_condition/<slot>) の各検査を無効化する。
| キー | 効果 |
|---|---|
Believe |
信仰チェックをスキップ |
BelieveMessage |
信仰チェック失敗時の「現在の信仰では使えないようだ...」メッセージを非表示 |
LocalCooldown |
LocalCooldown チェックをスキップ |
CDMessage |
CD チェック失敗時の「クールダウンが終わっていません。」メッセージを非表示 |
SpecialCooldown |
SpecialCooldown チェックをスキップ |
TypeCooldown |
TypeCooldown チェックをスキップ |
SecondaryTypeCooldown |
SecondaryTypeCooldown チェックをスキップ |
MPRequire |
MP チェックをスキップ |
MPMessage |
MP チェック失敗時の「MP が足りない!」メッセージを非表示 |
使用時処理 (common/use/<slot>) の挙動を抑制する。
| キー | 効果 |
|---|---|
ItemUpdate |
アイテム NBT の更新(Lore 再生成・LatestUsedTick 更新等)をスキップ |
BreakSound |
RemainingCount を使い切った時の破壊音 (entity.item.break) を鳴らさない |
- セット効果のあるサブ神器で、本体側で CD/MP 管理してるからこの神器ではチェック不要 →
Checkを全部trueに - 通常のメッセージは出したくないけど挙動は通常通り →
BelieveMessage/CDMessage/MPMessageをtrueに - アイテム更新でちらつく演出を避けたい →
Use.ItemUpdate:true - 使用回数切れの破壊音を消したい →
Use.BreakSound:true
神器のトリガーには専用の関数 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.triggerのid{...}内の ID も忘れずに合わせて修正 - マルチトリガーで追加の
1.triggerを自分で書く → マルチトリガー神器の作り方参照
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>が呼ばれると、内部で以下が順番にチェックされる:
- 信仰チェック (
CanUsedGodと現在の信仰の一致) - LocalCooldown (個別クールダウン)
- SpecialCooldown (グローバルクールダウン)
- TypeCooldown / SecondaryTypeCooldown (種別クールダウン)
- MPRequire (MP 不足)
全部通れば@sにCanUsedタグが付与される。どれかで失敗すればCanUsedタグは付かず、失敗時のメッセージが tellraw で表示される。
各チェックを個別に無効化したい時はDisabledFlagを参照。
信仰・クールダウン・MP 以外の独自の発動条件 (例: 晴れの時のみ、特定アイテムを持っている時のみ等) を加えたい場合は、テンプレートのコメント # 他にアイテム等確認する場合はここに書く の下に書いていく。
書き方の鉄則 :
-
common/check_condition/<slot>の後に書く (= 既にCanUsedタグが付いている前提で動かす) - 追加条件を満たさない場合は
tag @s remove CanUsedでCanUsedタグを剥がす -
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.mainDisabledFlagで個別の検査を無効化できるよ。2.check_conditionの中で動的にフラグを立てて、common/check_condition/<slot>に渡すこともできる。
# このトリガーに限り信仰チェックだけスキップしたい
data modify storage asset:artifact DisabledCheckFlag set value {Believe:true}
function asset:artifact/common/check_condition/mainhand2.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>が、神器使用時の「消費系の後片付け」を全部まとめて引き受けてくれる :
- MP 消費
- LocalCooldown / TypeCooldown / SecondaryTypeCooldown / SpecialCooldown の開始
- RemainingCount のデクリメント (残り使用回数を減らす)
-
LatestUsedTickの更新 (= 個体の最終使用 tick を記録、LocalCD 判定で使う) - アイテム本体の NBT 更新 (Lore 再生成等)
つまり制作者は、common/use/<slot>の 後ろ に「神器が何をするか」だけ書けば、消費周りは勝手に管理されるってこと。
テンプレートで say test: <神器名> が仮置きされている行を消して、自分の神器の効果に置き換えていく。ダメージを与える、エンティティを召喚する、particle や playsound で演出を出す、等々。ライブラリや API を使う時は :
- ダメージ : DamageAPI
- 回復 : HealAPI
- 召喚 : Mob召喚 / Object召喚
- 補正の追加 : ModifierAPI
- よく使う処理 (乱数、当たり判定、移動等) : Libraries
-
common/use/<slot>を 呼び忘れると MP/CD が消費されずに無限連打できる ので、通常は3.mainの冒頭で必ず呼ぶこと。テンプレートには最初から書いてあるので消さないように - 副トリガー (マルチトリガー神器の追加効果側) で、すでに主トリガーで消費が済んでいる場合は意図的に
common/use/<slot>を呼ばずに書く設計もあるよ。詳しくはマルチトリガー神器の作り方参照 - tick を跨ぐ処理 (持続効果・遅延発動など) を書きたい時は5.tickをまたぐ処理の実装の仕方を参照
-
コーディング規則にしたがってね
-
一時的にスコアを扱いたいときは objective:
Temporaryを使ってね。
※最後に reset を必ずしてね -
一時的に storage を扱いたいときは storage:
asset:tempを使ってね。
※これも最後に remove を必ずしてね -
tick を跨ぐスコアを使いたい場合はテンプレート生成時に
神器/テンプレート: 初期化処理を選択してスコアボードを追加してね -
神器で tag, score_holder, objective を定義する際はほかの神器と干渉しないように、名前の先頭に神器 ID 等の識別子を入れてね
持続エフェクトや弾・トラップみたいに複数 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/summonObjectAsset 側 (register / summon / tick) の書き方はObjectAsset の作り方を参照。
神器の処理中に参照できるコンテキスト情報。一部はトリガーが該当する時のみセットされるよ。
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.…を書き換えることで、プレイヤーが装備中の神器の情報を変更できるよ。必要に応じて使用してね。
該当トリガーが発火している間だけ存在するフィールド。
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 のルール を参照。
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
}
asset:context Heal : {
To : int[], # 回復対象の UserID 配列
Amounts : double[], # 各対象への回復量
Amount : double, # Amounts の最大値 (foreach で自動計算)
IsHoT : boolean # 継続回復判定
}
asset:context ReceiveHeal : {
From? : int, # 回復元プレイヤーの UserID (プレイヤーからの回復のみ)
Amount : double,
IsHoT : boolean
}
asset:context Killed : {
Target : Entity関連の情報 (詳細は実装側で参照)
}
asset:context Shot : {
Arrow : Entity関連の情報
}
-
ワールドに入って
function asset:artifact/<神器名>/give/2.giveを実行してね。 -
function debug/change_believe/<対応する神の名前>を実行して対応する神への信仰を得てね。
その他の方法: function debug/debug_privilege/を実行してね。MP と信仰を無視して神器が使えるよ。
- 本来の方法で神器を使ってね。
APIのページを参照してね。
Librariesのページを参照してみてね。無かったら質問してくれたら実装するかも。
装備中の効果や能力補正を持たせたい神器は、Equipmentフィールドで表現するよ。1 部位だけの単発装備でも、4 部位そろえてフルセットにするのでも、書き方の基本は同じ。
1 部位の装備で完結する神器の例。Equipment.Effectsで装備中エフェクトを付与、Equipment.Modifiersで能力補正を加算するパターン。
#> 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頭・胴・脚・足の 4 部位そろえた時だけ追加効果が発動する「フルセット効果」を作る場合は、神器側だけじゃなくてEffectAsset の仕組みを組み合わせて実現するよ。
- 4 部位それぞれの
Equipment.Effects[].IDを同じ EffectAsset の IDにする - 対応する EffectAsset の
MaxStackを4に設定する - EffectAsset の
given/.mcfunctionで「Stack:4なら追加処理」を書く
これでプレイヤーが装備するたびに Effect の Stack が +1 され、4 になった瞬間にフルセット効果が発動する。1 部位脱げば Stack が減ってフルセット効果も解除される、という流れ。
それぞれの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/give0625.flame_armor (chest) / 0626.flame_leggings (legs) / 0627.flame_boots (feet) も同じ要領で書く。各部位で Slot と CustomNBT の Slot/UUID[3] (神器 ID) は変える必要があるけど、Equipment.Effects[].ID は 4 部位とも同じ 233 にすること。
4 部位の集計を担当する EffectAsset。MaxStackを4にすることで、装備数=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初回付与時。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スタック変化のたびに呼ばれる。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セット成立時の追加効果はここに書く。api:modifier/<対象>/addで補正追加 → dis_equipでremove、が定型パターン。
#> 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)
実装に迷ったらこれらを読むと参考になるよ。
| 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/equipでapi:modifier/<Type>/addを呼ぶ方式に統一する
ここから先は応用編。普通の神器を作る分には知らなくても困らないけど、込み入った神器を書こうとすると必要になってくるよ。
1 個の神器で複数のトリガー(例: 近接攻撃時とキル時の両方で効果を出す)を使いたい時は、ディレクトリと関数 tag 登録を増やして実現するよ。
-
TriggerフィールドはLore 表示用の主トリガーを 1 個書くだけ。実際の挙動とは独立。 - 副トリガーは、
<神器名>/<副トリガー名>/{1.trigger,2.check_condition,3.main}.mcfunctionの 3 点セットを別ディレクトリに作って、対応する tag ファイル(attack/melee.json等)に登録する。 - 副トリガーで
common/use/<slot>を呼ぶかどうかは設計者次第。主側で MP/CD を管理してるなら副側では呼ばずに、演出と効果だけ書くパターンが多いよ。
-
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回復のみ
中身は主トリガーと全く同じパターン。ファイルパスだけが違う。
#> 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#> 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// 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。
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 タグが付かないことがある。
継続ダメージ (DoT = Damage over Time) や継続回復 (HoT = Heal over Time) のたびに神器トリガーが発火すると、毒や燃焼で神器が連発されて困ったことになるよね。なので TSB にはこれを抑止する仕組みがあるよ。
api:damage/やapi:heal/を呼ぶ前にArgument.ApplyTriggerをfalseにしておくと、そのダメージ/回復は神器のトリガーを発火させない継続効果として扱われる。
# 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(orDamage.IsDoT) がtrueにセットされる - 神器側の
2.check_conditionでIsDoT: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.mainHoT 側も同じ要領。Heal{IsHoT:true} / ReceiveHeal{IsHoT:true} で判定する。
- 自分の神器が DoT エフェクト(毒・出血・延焼など)を放つ時 → 継続ダメージで自身のトリガーを再帰発火させないため
- 治癒系の tick 内回復を作る時 → 毎 tick の回復で別の神器が連鎖発火しないように
エフェクト側 (例: asset:effect/0307.bleeding/tick/damage) ではApplyTrigger:falseを指定して、神器側では DoT を弾く、というのが定型のペア。
バニラ由来のダメージ(火・毒・落下・奈落 等)は実装上 すべて IsDoT:false 扱い になってるよ。本来は毒はtrueにしたいけど判定が技術的に難しいので、現状全部false。
→ つまり、神器側でIsDoTを見て弾く設計にすれば、自前で立てた DoT だけを除外できる。
A. いろいろな理由があるけど、とりあえず game output を確認してみて
game output はランチャーの設定からゲーム開始時に出力ログを開く(en: Open output log when games start)にチェックをつけることで確認できるよ。
エラーが出てたらそれの通りに従ってみてね。エラーが出てなかったり、エラーの意味が分からないときは質問用のチャンネルで聞いてみてね。
よくあるハマりポイントもまとめておくよ:
-
MP/CD が消費されない →
3.mainの冒頭でcommon/use/<slot>を呼んでない可能性 -
常に発動できる/全然発動できない →
1.triggerでid{<slot>:<id>}の<slot>と<id>が2.giveと一致してるか確認 -
Equipment.Modifiers が想定の 4 倍効いてる → フルセットで全部位に同じ補正を書いた結果。1/4 にするか、
fullset/equip方式に変える (Modifier の注意点参照) -
DoT で神器が連発される →
2.check_conditionでIsDoT:true/IsHoT:trueを弾く (IsDoT / IsHoT のルール参照) -
副トリガーの神器が誤発動する →
1.triggerのid{<slot>:<id>}が正しいか、副トリガー用の2.check_conditionでDisabledCheckFlagを意図通りに設定しているか
A. PullRequest を master に merge するときにこっちでつけるから使わなくても大丈夫。
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 |
A. いや本当にごめんなさい。足りない部分教えてくれたら優先して記述します。