#スコアボードのスコア分のレベルのエフェクト付与させたい
1 messages · Page 1 of 1 (latest)
ちなみにScriptapiあり?
ありです
#1226102697451716681 message
#1242745758688743445 message
推奨はしませんがscriptapiでもコマンドを使いたい場合は
<Entity>.runCommand(`effect @s (エフェクト名) (秒数) ${取得したスコア}`)
ですね
自分で考えるのが面倒な場合のコード書いときました。
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});
}
})
ありがとうございます!!
試したのですが[スクリプト][エラー]-プラグイン [エフェクトをカスタマイズするためのアドオン スクリプト API (開発中) - 1.0.0] - [main.js] がエラーで実行されました: [ReferenceError: 'world' は <anonymous> で定義されていません (main.js:2)]とエラーが出てしまいました
[スクリプト][エラー]-プラグイン [エフェクト テスト アドオン sciptAPI - 1.0.0] - [main.js] がエラーで実行されました: [TypeError: <anonymous> の未定義のプロパティ 'worldInitialize' を読み取ることができません (main.js:2)
]
にかわりました
worldInitializeはworldではないのでmc.を付けません
直したら次は
[スクリプト][エラー]-ReferenceError: 'effect_po(スコアボードの名前)' は <anonymous> で定義されていません (main.js:136)
と永遠に出てきます
これですね
直してます
直したら直した後のものをお見せください
effect_spなどを直に書くとその名前の変数への参照だと解釈されます
オブジェクティブ名などの文字としてeffect_spを扱いたい場合には、"effect_sp"のように文字列として書く必要があります
effect名witherなども同様です
effect_spという変数に文字列を格納するのであれば今のような書き方でも良いですが
slownessなどのeffect名もすべて文字列に変えてください
はい、getScoreの返り値がそのスコアの値になるので、その数値が条件を満たすかを判断してifなんかで分岐してください
引き算ってできますか
スコアボードの値から一引いた値のレベルのエフェクトを付与させたいです
const effectAmplifier = mc.world.scoreboard.getObjective("effect_sl").getScore(player) - 1
```例えばこのようにするとスコアの値引く1となります
[スクリプト][エラー]-TypeError: ネイティブのオプション型変換に失敗しました。インターフェース プロパティ ['amplifier'] の予期される型: number | undefined (関数引数 [2] へのインターフェースの解析に失敗しました) <anonymous> (main.js:108)
と出てしまいます
試してないのでわからないですけど
もしプレイヤーが対応するスコアを持っていなかったら(0以前にスコアボードにない、resetの状態)
だったら NaN - 1 とか null - 1 とか undefined - 1 とかになっちゃってるんじゃないですかね
(すみません、雑でした
スコアボードを0にしたら治りました
ありがとうございました
あとスコアボードの値をファンクションで設定しようとしたらファンクションが反映されませんでした...
答えてくれるだけでありがたいですよ
前作ったけどどこにやったか(
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)
とかじゃないですかね(
その部分は完成してるんですが、今スコアをすべてリセットするファンクションが呼び出せなくて困ってます..
アドオン自体は動きますか?
""消しても変わりませんでした...
常にリセットしたいわけではないですよね?
はい ワールで生成時と任意のタイミングでのみ動作させたいです
お願いします...m(__)m
フォルダ名はfunctionsかと
うまくいきました!ありがとうございます!!
scriptAPIでファンクションの呼び出しはどういう構文なのでしょうか
runCommandを使うしかないと思いますが、あまり推奨されていません
runCommandはDimensionあるいはEntityのインスタンスに存在します。Cは大文字です
getAllPlayersはメソッドで、そういう書き方は(普通は)ありえません
たとえば```js
for (const player of mc.world.getAllPlayers()) {
player.runCommand("function effect_reset")
}
ちなみに初期値を0にしたい場合はスコアに0を加算するのが楽です
それとworldInitialize時にはプレイヤーはまだ存在しないのでプレイヤーに対してなにかすることはできません
結局ファンクションで常時0を足すことにしました
[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)
]
と出てしまいます
たぶん__i__temUseですね
なおりました
今度は
[Scripting][error]-TypeError: not a function at <anonymous> (main.js:52)
と表示されます
getAllPlayersですね
できました!