Skip to content

プレイヤースキルの作り方

Ponpon edited this page Mar 3, 2024 · 9 revisions

プレイヤースキルの作り方

職業スキル・TUSBメモリーの実行内容の作り方についてまとめる

目次

1. スキルを追加するフォルダの位置

データパックのskill名前空間内にスキルの内容が格納されている。

skill
└ fuctions
  └ act
    └ <job>
      └ <skill_name>
        └ act0.mcfunction

1. スキルのフォルダ
各トリガーからスキルが実行されたときに、最初に呼び出されるファイルは上の図のact0.mcfunctionである。<job><skill_name>については v13アイテム - スキル比較New Job列やSkill列から引用すること。
<skill_name>以下には自由にファイルやフォルダを追加してよい。

2. スキルを作るうえで把握すること

2-1. 禁止事項

以下のスコアボードの値を変更してはいけない。
スキルの効果で変更する必要があればこの限りではない。

スコアホルダー オブジェクト 使用用途
_ MP 減少MP値
_ Interval 次のインターバル値

基本情報

スキル発動時に持っているアイテムはitem: Itemに保存されている。
発動するスキルのレベルは_ Levelスコアに保存されている。

スキルで使用するエンティティにはNativeTask,Skillタグの付与が必要。

3. スキル作成に使える具体例

ダメージを与える

説明を表示

他のモブに対してダメージを与えることは多用される効果だが、与えるまでが少し複雑である。

  • ダメージ値を取得する
    各スキルに登録されているダメージ値を取得する。
    skill: Data.<Job>[{Name:"<スキルの名前>",Level:x}].Damageを参照し、skill: Damageへ保存する。

忍者 - 手裏剣

execute if score _ Level matches 1 run data modify storage skill: Damage set from storage skill: Data.Ninja[{Name:"手裏剣",Level:1}].Damage
execute if score _ Level matches 2 run data modify storage skill: Damage set from storage skill: Data.Ninja[{Name:"手裏剣",Level:2}].Damage
execute if score _ Level matches 3 run data modify storage skill: Damage set from storage skill: Data.Ninja[{Name:"手裏剣",Level:3}].Damage
execute if score _ Level matches 4 run data modify storage skill: Damage set from storage skill: Data.Ninja[{Name:"手裏剣",Level:4}].Damage
execute if score _ Level matches 5 run data modify storage skill: Damage set from storage skill: Data.Ninja[{Name:"手裏剣",Level:5}].Damage

<Job>の職業名には、 v13アイテム - スキル比較New Job列の最初を大文字にしたものを記入、Name:"<スキルの名前>"には、 v13アイテム - スキル比較New スキル列のものを記入する。ⅠⅡなどのレベル表示は記入してはいけない。execute if score _ Level matches x run ...のxとData.<Job>[{Name:"<スキルの名前>",Level:x}]のxを同じものにし、スキルレベルに合ったダメージ値を取得する。

  • ダメージ値を補正する
    各属性のダメージ値に、エンチャントでの補正やアイテムダメージの加算補正をする。
    Effectivenessを指定しているスキルの場合、アイテムによるダメージを加算しなければいけないため
function skill:damage/add/skill/weapon

を実行する。
スキルに登録されているダメージのみを補正する場合

function skill:damage/add/skill/magic

を実行する。

  • ダメージを与える
    Mobタグを持ったエンティティに対してfunction skill:damage/apply/を実行する。

例 半径6m以内のMobにダメージを与える。

execute as @e[tag=Mob,distance=..6] run function skill:damage/apply/

投てき物を使用する

説明を表示

スキルの中には手裏剣のような何かを投てきしてそれが当たればダメージを与えるといったものがある。

  • ダメージ値の取得・補正
    こちらは「ダメージを与える」で解説したものと同じになる。
  • 投てき物を召喚する
    コマンドの実行位置を目線の高さに合わせたうえで、目線の少し前に矢を召喚する。

忍者 - 手裏剣

execute anchored eyes run summon arrow ^ ^ ^0.5 {Tags:[Skill,Shuriken,NativeTask,FlyingRequired,KillInGround,HasSkillDisplay],NoGravity:1b,damage:1,Color:3752270,SoundEvent:"minecraft:item.trident.hit",Passengers:[{id:"minecraft:item_display",Tags:[SkillDisplay],item:{id:"minecraft:firework_star",Count:1b,tag:{CustomModelData:122,Explosion:{Type:0b,Colors:[I;16777215]}}},billboard:"center"}]}

必要なTagsについて解説。

Tags 用途
Skill スキルに使用するエンティティに付与
(Shuriken) スキルを判別するためのタグ
NativeTask NativeTaskの処理を実行する
KillInGround 地面に刺さったときに自身をkillする
HasSkillDisplay 見た目用のitem_displayを持っているときに付与

※あくまで手裏剣のTagsであり、一例である。
NoGravityのNBTタグをつけることで、投てき物の挙動が変化する。NoGravity:trueにすることで直線状に飛ばすことができる。NoGravity:falseもしくは未指定にすることで放物線を描いて飛ばすことができる。
Passengersで見た目用のアイテムディスプレイを乗せることができる。アイテムディスプレイにはSkillDisplayタグを付与する必要がある。

  • 投てき物にダメージを保存
    投てき物がMobに当たったときに与えるダメージ値を保存する。
    投てき物に対して実行する。召喚直後のエンティティにはInitializedタグが付与されていないため、[tag=!Initialize]のセレクター引数が使える。

忍者 - 手裏剣

execute as @e[tag=Shuriken,tag=!Initialized,distance=..3] run function skill:damage/save
  • 投てき物にOwnerを設定
    投てき物を飛ばしたプレイヤーのUUIDを投てき物のOwnerに指定する。これにより、プレイヤーが直接投てきしたのと同じことになる。

忍者 - 手裏剣

data modify entity @e[tag=Shuriken,tag=!Initialized,distance=..3,limit=1] Owner set from entity @s UUID
  • 投てき物を飛ばす
    投てき物に対してベクトルと速度を指定して飛ばす。投てき物に対して実行する。

忍者 - 手裏剣

execute as @e[tag=Shuriken,tag=!Initialized,distance=..3] positioned 0.0 0.0 0.0 positioned ^ ^ ^1.55 run function calc:throw_projectile/

上のコマンドのpositioned ^ ^ ^でベクトルと速度を指定する。3つ目の^が視線方向へのベクトルとなる。

  • Mobに当たったときの動作を追加する
    ダメージを与えるだけなら追加する必要はないが、当たったときに演出を表示したいときなどはここの手順に従って追加する必要がある。
    playr:trigger/projectile/skillのfunctionがMobに当たった直後に実行される。これはダメージ値を投てき物から読み込んだ後でMobにダメージを与える前である。
    ここにスキルごとに実行したいfunctionに分岐させる。
  • 地面に刺さったときの動作を追加する
    Mobに当たらず、地面や壁に刺さったときに動作するものを追加する。
    entity:in_groundのfunctionが地面に刺さったときに実行される。
    ここにスキルごとに実行したいfuncitonに分岐させる。

エンティティを召喚する

説明を表示
  • 召喚する
    シートのMobを召喚する場合、v13Mob - スポナー管理シートsummon列からコピペ。もしくはMOBのsummonコマンドの作り方を参考にsummonコマンドを作成する。
    シートのMobの場合、1tick後にワールドに現れるためMobへ何かを実行することはできない。
    普通のsummonコマンドで召喚したエンティティには何かを実行することができる。

  • 召喚位置を調整する
    calc:geometry/search_forward/のfunctionを使うことで、指定距離までの位置を探索・設定する。詳しい使用方法はCalcファンクションの使い方#前方探索を参照。
    0-0-0-0-0の位置を基準に以降のコマンドを実行していく。

0-0-0-0-0 基準にfunction実行

execute at 0-0-0-0-0 run function

プレイヤーを回復させる

  • プレイヤーを回復させる方法
    effectで回復させても良いし、HealthHealingを用いて回復させても良い。
    HealthHealingには回復させる体力量を指定する。これは病気デバフで阻害される可能性がある。

演出を追加する

演出コマンドの管理方法を参考に、演出用のfunctionファイルを用意し、それを実行する。


その他追加してほしい具体例があれば教えてね。


スキルのデータベース追加方法

v13 アイテム - スキル比較Newの一番下の行に追加していく。職業スキルの場合は、各職業の適切な行に挿入する。
TUSBスプレッドシートの見方#スキル比較newも参照するとよい。

シートに追加できたら、exportツールの使い方を参考に、データパックへ反映する。

製作手引き
重要
仕様
定義
便利なページ
Clone this wiki locally