#スコアボードのスコア分のレベルのエフェクト付与させたい

1 messages · Page 1 of 1 (latest)

stiff coral
#

コマンドの中にスコアボードから数を取得した数で実行したい

kindred anvil
#

ちなみにScriptapiあり?

stiff coral
#

ありです

wind whale
#

#1226102697451716681 message

#1242745758688743445 message

#

推奨はしませんがscriptapiでもコマンドを使いたい場合は
<Entity>.runCommand(`effect @s (エフェクト名) (秒数) ${取得したスコア}`)
ですね

wind whale
#

自分で考えるのが面倒な場合のコード書いときました。
effectScoreという名前のスコアボードのスコアの値のスピードエフェクトが常に30秒付きます。
||```
import * as mc from "@minecraft/server"; //魔法の言葉(ただのインポートだけど。)
const EFFECT_NAME = 'speed'; //スピード
const EFFECT_DURATION = 20 * 30; //30秒{20tick(1秒) * 30}
const EFFECT_SHOW_PARTICLES = true; //パーティクルの表示
const SCOREBOARD_NAME = 'effectScore'; //スコアボードの名前
mc.system.runInterval(()=>{
for(let player of mc.world.getAllPlayers())
{
const effectAmplifier = mc.world.scoreboard.getObjective(SCOREBOARD_NAME).getScore(player); //プレイヤーのスコアの値
player.addEffect(EFFECT_NAME,EFFECT_DURATION,{amplifier:effectAmplifier ,showParticles:EFFECT_SHOW_PARTICLES});
}
})

stiff coral
#

ありがとうございます!!

stiff coral
#

試したのですが[スクリプト][エラー]-プラグイン [エフェクトをカスタマイズするためのアドオン スクリプト API (開発中) - 1.0.0] - [main.js] がエラーで実行されました: [ReferenceError: 'world' は <anonymous> で定義されていません (main.js:2)]とエラーが出てしまいました

daring mulch
#

今回のようなimportをした場合はmc.worldとする必要があります

#

周りの部分に合わせてただのworldになっている所をmc.worldに変えてください

stiff coral
#

[スクリプト][エラー]-プラグイン [エフェクト テスト アドオン sciptAPI - 1.0.0] - [main.js] がエラーで実行されました: [TypeError: <anonymous> の未定義のプロパティ 'worldInitialize' を読み取ることができません (main.js:2)
]

#

にかわりました

wind whale
#

今どんな感じのコードになってます?

#

ちなみに10行目、17行目などのspeed,slownessや、9行目、16行目などのスコアボード名も文字列型にしなければなりません

stiff coral
daring mulch
#

worldInitializeはworldではないのでmc.を付けません

stiff coral
#

直したら次は
[スクリプト][エラー]-ReferenceError: 'effect_po(スコアボードの名前)' は <anonymous> で定義されていません (main.js:136)
と永遠に出てきます

stiff coral
#

直してます

daring mulch
#

直したら直した後のものをお見せください

stiff coral
daring mulch
#

effect_spなどを直に書くとその名前の変数への参照だと解釈されます
オブジェクティブ名などの文字としてeffect_spを扱いたい場合には、"effect_sp"のように文字列として書く必要があります
effect名witherなども同様です

#

effect_spという変数に文字列を格納するのであれば今のような書き方でも良いですが

stiff coral
#

なるほど

daring mulch
#

slownessなどのeffect名もすべて文字列に変えてください

stiff coral
#

できました!

#

これってスコアボードの値-1とか値が1以上の時だけとかできますか

daring mulch
#

はい、getScoreの返り値がそのスコアの値になるので、その数値が条件を満たすかを判断してifなんかで分岐してください

stiff coral
#

引き算ってできますか

daring mulch
#

引き算…ですか?
-演算子のことです?

#

何をしたいのかよく分からないので詳しくお願いします

stiff coral
#

スコアボードの値から一引いた値のレベルのエフェクトを付与させたいです

daring mulch
#
const effectAmplifier = mc.world.scoreboard.getObjective("effect_sl").getScore(player) - 1
```例えばこのようにするとスコアの値引く1となります
stiff coral
#

なるほど...

#

あとif文ってどうやって作るんでしょうか

daring mulch
#

調べるといいと思います

#

適当にjs ifとか調べればいくらでもでてきます

stiff coral
#

[スクリプト][エラー]-TypeError: ネイティブのオプション型変換に失敗しました。インターフェース プロパティ ['amplifier'] の予期される型: number | undefined (関数引数 [2] へのインターフェースの解析に失敗しました) <anonymous> (main.js:108)
と出てしまいます

wind whale
#

試してないのでわからないですけど
もしプレイヤーが対応するスコアを持っていなかったら(0以前にスコアボードにない、resetの状態)
だったら NaN - 1 とか null - 1 とか undefined - 1 とかになっちゃってるんじゃないですかね

daring mulch
#

(すみません、雑でした

stiff coral
#

あとスコアボードの値をファンクションで設定しようとしたらファンクションが反映されませんでした...

stiff coral
light pewter
#

前作ったけどどこにやったか(

#

mc.world.afterEvents.itemUse.subscribe(ev => {
const score = mc.world.scoreboard.getObjective('test');
const scores = score.getScore(ev.source);
if (ev.itemStack.typeId === "minecraft:stick") ev.source.addEffect('health_boost', 100, { amplifier: scores, showParticles: false });
});

#

これは動いたはず

#

import { world, system } from "@minecraft/server";
system.runInterval(() => {
const players = world.getPlayers()

players.forEach(player => {
    const score = world.scoreboard.getObjective('test').getScore(player.scoreboardIdentity) - 1;
    player..addEffect('health_boost', 100, { amplifier: score, showParticles: false })
});

}, 1)

#

とかじゃないですかね(

stiff coral
#

その部分は完成してるんですが、今スコアをすべてリセットするファンクションが呼び出せなくて困ってます..

light pewter
#

アドオン自体は動きますか?

stiff coral
#

アドオン自体は認識してるんですがファンクションだけ認識しません

#

こんな感じでスコアボードの名前のところに波線が出ています...

light pewter
#

#

””は要らないですよ

stiff coral
#

""消しても変わりませんでした...

light pewter
#

常にリセットしたいわけではないですよね?

stiff coral
#

はい ワールで生成時と任意のタイミングでのみ動作させたいです

light pewter
#

ファンクション使い始めのときはよく起きてたな…なんだっけ

#

思い出したらまた伝えますー

stiff coral
#

お願いします...m(__)m

daring mulch
#

フォルダ名はfunctionsかと

stiff coral
#

うまくいきました!ありがとうございます!!

stiff coral
#

scriptAPIでファンクションの呼び出しはどういう構文なのでしょうか

daring mulch
#

runCommandを使うしかないと思いますが、あまり推奨されていません

stiff coral
daring mulch
#

runCommandはDimensionあるいはEntityのインスタンスに存在します。Cは大文字です
getAllPlayersはメソッドで、そういう書き方は(普通は)ありえません

#

たとえば```js
for (const player of mc.world.getAllPlayers()) {
player.runCommand("function effect_reset")
}

#

ちなみに初期値を0にしたい場合はスコアに0を加算するのが楽です

#

それとworldInitialize時にはプレイヤーはまだ存在しないのでプレイヤーに対してなにかすることはできません

stiff coral
#

結局ファンクションで常時0を足すことにしました

stiff coral
#

[Scripting][error]-Plugin [effect set apiI - 1.0.0] - [main.js] ran with error: [TypeError: cannot read property 'subscribe' of undefined at <anonymous> (main.js:13)
]

#

と出てしまいます

wind whale
#

たぶん__i__temUseですね

stiff coral
#

なおりました

#

今度は
[Scripting][error]-TypeError: not a function at <anonymous> (main.js:52)
と表示されます

daring mulch
#

getAllPlayersですね

stiff coral
#

できました!