はじめに
このブログは、【RPG Asstes】を使っているクリエイターの方々に向けたより自由度の高い設定を行うための手順を記したものです。
アップデートや要望に合わせて随時更新していきます。
初期設定 環境構築
まず、より自由度の高い設定を行うためには【RPG Assets】の内部ファイルをいじる必要があります。
そのためには、jsonファイル等を開くことができるソフトが必要です。おすすめソフト:VScode等
ダウンロードし、起動すると内部ファイルを開けるようになります。
ファイルを開くためには、以下のステップが必要です。①アドオン(○○.mcaddon)の名前を「○○.zip」に変更し、解凍してください。②「△△.mcpack」というファイルが入っているので、それも「△△.zip」に変更し解凍します。
戻すときは、逆の手順を行います。
HP・MPボトルのクールダウン
まず、仕組みについてです。
ボトル系アイテムは右クリックしたときに特定の条件を満たしているかどうかで使えるか使えないかを決めています。
デフォルトだと「そのアイテムかどうか(HPボトルorMPボトル)」と「tag=playを持っているか」の2つです。
この条件に、「クールタイムが終わっているかどうか」を加えていきます。
方法としては
①クールタイム用のスコアボードを用意する
②右クリックしたときにクールタイムスコアを増加させる(徐々に減少)
③クールタイムが終わっていなければ使えないようにする
では、実際にコードを書いていきましょう。
behaviorのscriptsフォルダに入っている「item.js」というファイルを書き換えていきます。
<デフォルト>
world.afterEvents.itemUse.subscribe(ev => { //HPボトル
const source = ev.source;
const itemStack = ev.itemStack;
if(itemStack.typeId === "rpg:hp_bottle1" && source.hasTag("play")) {
source.runCommand(`effect @s instant_health 1 0`)
source.runCommand(`playsound random.drink @s ~ ~ ~`);
source.runCommand(`clear @s rpg:hp_bottle1 0 1`);
}else if(itemStack.typeId === "rpg:hp_bottle2" && source.hasTag("play")) {
source.runCommand(`effect @s instant_health 1 1`)
source.runCommand(`playsound random.drink @s ~ ~ ~`);
source.runCommand(`clear @s rpg:hp_bottle2 0 1`);
}else if(itemStack.typeId === "rpg:hp_bottle3" && source.hasTag("play")) {
source.runCommand(`effect @s instant_health 1 2`)
source.runCommand(`playsound random.drink @s ~ ~ ~`);
source.runCommand(`clear @s rpg:hp_bottle3 0 1`);
}})
まず、①はワールド内でコマンドを使い「ct」というスコアボードを作ってあげてください。
HPボトル、MPボトルのクールタイムが同じ場合で考えます。(コードはHPボトルのみですが、MPボトルも同様にやればOKです)
<変更後>
world.afterEvents.itemUse.subscribe(ev => { //HPボトル(ctあり)
const source = ev.source;
const itemStack = ev.itemStack;
const ct = world.scoreboard.getObjective("ct")?.getScore(source); //追加部分①
if(itemStack.typeId === "rpg:hp_bottle1" && source.hasTag("play") && ct === 0) { //変更部分①
source.runCommand(`effect @s instant_health 1 0`)
source.runCommand(`playsound random.drink @s ~ ~ ~`);
source.runCommand(`clear @s rpg:hp_bottle1 0 1`);
world.scoreboard.getObjective("ct")?.setScore(source,20); //追加部分②
}else if(itemStack.typeId === "rpg:hp_bottle2" && source.hasTag("play") && ct === 0) { //変更部分②
source.runCommand(`effect @s instant_health 1 1`)
source.runCommand(`playsound random.drink @s ~ ~ ~`);
source.runCommand(`clear @s rpg:hp_bottle2 0 1`);
world.scoreboard.getObjective("ct")?.setScore(source,40); //追加部分③
}else if(itemStack.typeId === "rpg:hp_bottle3" && source.hasTag("play") && ct === 0) { //変更部分③
source.runCommand(`effect @s instant_health 1 2`)
source.runCommand(`playsound random.drink @s ~ ~ ~`);
source.runCommand(`clear @s rpg:hp_bottle3 0 1`);
world.scoreboard.getObjective("ct")?.setScore(source,60); //追加部分④
}})
上記のコードの「追加部分」が元のコードに追加したもので、「変更部分」が元のコードを少し書き換えた部分です
追加部分①は右クリックしたプレイヤーのctを取得する部分
追加部分②~④はctを増加させる部分(20,40,60がクールタイムの長さ 20で1秒)
変更部分①~③は「&& ct === 0」が足されている。これはctが0かどうかを判定する部分
では次に、クールタイムを減少させる機構を作ります。
behaviorのfunctionsフォルダにある「tick.mcfunction」の中身に以下のコードを追加してください
scoreboard players remove @a[tag=play,scores={ct=1..}] ct 1
これで、ctが0より大きいプレイヤーのctを減少させることができる。
ここまでお疲れさまでした。
HPボトルとMPボトルのクールタイムを分けたい場合は、「ct1」「ct2」などのようにスコアボードを区別し、それぞれ追加部分・変更部分のように作成してあげればOKです。
何かご質問等あれば遠慮なくコメントにお書きください。できる限り対応します。
コメント