#ScriptAPI 検知されない

1 messages · Page 1 of 1 (latest)

neon coyote
#

アイテム使用,攻撃,被ダメそれぞれにTagを付与したいのですが上手く動作しません。理由がわかる方教えて欲しいです!

ionic cobalt
#

どういうコードを書いたのか教えてください

neon coyote
#

今貼ります。少々お待ちくださいー

#
    const player = ev.source;

    if (ev.itemStack.typeId == "test:switch_axe" || "test:switch_sword") {
        player.runCommand("tag @p add sas")
    }})

world.afterEvents.entityHitEntity.subscribe(ev => {
    const player = ev.damagingEntity;

    if (ev.itemStack.typeID == "test:switch_axe" || "test:switch_sword") {
        player.runCommand("tag @p add saa")
    }})

world.afterEvents.entityHurtEntity.subscribe(ev => {
    const player = ev.hurtEntity;

    if (ev.itemStack.typeID == "test:switch_axe" || "test:switch_sword") {
        player.runCommand("tag @p add sac")
    }})
;
hollow walrus
#

それと

#

orの使い方が違います

ionic cobalt
#

ev.itemStack.typeID == "test:switch_axe" || ev.itemStack.typeID == "test:switch_sword"

hollow kelp
#

if((条件式1) || (条件式2)){こんな感じだね

hollow walrus
#

カッコつけるカッコいい!!!すると読みやすくてカッコいいね

#

↑ばか

neon coyote
#

御三方ありがとうございます!
orの使い方が違ったのか…そこ修正してやってみます!
それとplayer.addTagでやってみます

mellow geode
#

あと@pでいいならいいけど@sの方がいい気がする

neon coyote
#

@sでやってみます

hollow kelp
#

entityHurtEntity → entityHurt ``````ev.itemStack.typeID → ev.itemStack.typeIdじゃない?

hollow walrus
#

よくよく見たら最初はあってるのに後のif文全部大文字じゃん書いてる時にテンション上がっちゃった?

ionic cobalt
#

なんとなくIdよりもIDって書いたほうがしっくりくるのはわかる

hollow walrus
#

キャメルケースに慣れる

hollow walrus
#

今日嫌なことありすぎてなんかもうテンションバグった

mellow geode
# hollow walrus キャメルケースに慣れる
Qiita

はじめにとにかくコードを書くことが勉強の始まりですが、コードを書くのに慣れてきたら「より良いコードを書く」ことも意識するようにしましょう。もっとも簡単に意識して覚えられるのが命名規則で、いくつも…

hollow kelp
#

const player = ev.damagingEntity; → const player = ev.damageSource.damagingEntity;これもだ

ionic cobalt
#

もうめんどくさいから日本語でいいや…()

hollow walrus
#

日本語のキャメルケース

ionic cobalt
#

どうやるんだ…?

hollow walrus
#

ぁぁぁいぃぃぃうぅぅ

mellow geode
#

ツクルアカウント

ionic cobalt
#

ァィテㇺ(なんでそこで切った)

#

せんたくしているアいてむ

#

const プれいや = ...

#

でも最初は小文字か

#

[ v]を[ ]にする

neon coyote
#

色々間違ってるのか、
上で貼ってくれたリンク先見たりして直してみます!

neon coyote
#

orの使い方と命名規則について知れて良かったです!明日試しにゲーム内で動かしてみます!

neon coyote
#

アイテム使用の部分は上手く動きました!
entityHitEntityとentityHurtにitemStackが無い?みたいでエラーが出てしまうのですが他にプレイヤーの所持しているアイテムを条件にできるものってあるのでしょうか…?

hollow walrus
#

素手のときitemStackはundefinedになります

#

その状態でtypeId等プロパティやメソッドにアクセスしようとするとエラーになるので回避してあげる必要があります

#

上のコードを見る限りev.itemStack?.typeIdにするだけで直ります

ionic cobalt
#

ev.source.getComponentでインベントリ取得するとか?

neon coyote
#

アドオンで新しく追加したアイテムって素手判定されてたりします…?

hollow walrus
#

そんなばなな

ionic cobalt
#

entityHitEntityにはdamagingEntityとhitEntityしかないよ!どうしよう?ってこと?

hollow walrus
#

何のアイテムで攻撃したかは含まれていないので取得してあげる必要がありましたね

#

メインハンドのアイテムを取得する関数を作れば解決できそう

ionic cobalt
#

world.events.entityHitEntity.subscribe((event: EntityHitEntityEvent) => {
    const attacker = event.entity as Player;

    if (attacker instanceof Player) {
        const inventory = attacker.getComponent('minecraft:inventory') as EntityInventoryComponent;
        const itemInHand = inventory.container.getItem(attacker.selectedSlot);

        if (itemInHand) {
            attacker.sendMessage(`You hit with: ${itemInHand.id}`);
        } else {
            attacker.sendMessage("You hit with an empty hand.");
        }
    }
});```

今Copilotに聞いたらこう返ってきました。合ってるかはわかりません
#

itemInHandが今選択中のアイテム

hollow walrus
#
function getSelectedItem(player) {
    const inventory = player.getComponent("inventory");
    const item = inventory.container.getItem(player.selectedSlotIndex);
    return item;
}
#

うちが昔使ってたものです

ionic cobalt
#

-# 思いっきり素人だからあんまり確かなことは言えない…

neon coyote
#

ありがとうございます!
関数入れてやってみます

neon coyote
#
import {
    world,
    system
} from "@minecraft/server";

world.afterEvents.itemUse.subscribe(ev => {
    const player = ev.source;

    if (ev.itemStack.typeId == "test:switch_axe" || ev.itemStack.typeId == "test:switch_sword") {
        player.addTag("sas")}})

function getSelectedItem(player) {
    const inventory = player.getComponent("inventory");
    const item = inventory.container.getItem(player.selectedSlotIndex);
    return item;
}

world.afterEvents.entityHitEntity.subscribe(ev => {
    const player = ev.damagingEntity;
    const item = getSelectedItem(player)

    if (item == "test:switch_axe" || item == "test:switch_sword") {
        player.addTag("saa")}})

world.afterEvents.entityHurt.subscribe(ev => {
    const player = ev.hurtEntity;
    const item = getSelectedItem(player)

    if (item == "test:switch_axe" || item == "test:switch_sword") {
        player.addTag("sac")}})
;```

これでやってみました
 cannot read property 'container' of undefined at getSelectedItemとエラーが出るのですが関数の入れ方どの辺が違いますか?
hollow kelp
neon coyote
mellow geode
neon coyote
neon coyote
neon coyote
#
import {
    world,
    system,
    Player
} from "@minecraft/server";

world.afterEvents.itemUse.subscribe(ev => {
    const player = ev.source;

    if (ev.itemStack.typeId == "test:switch_axe" || ev.itemStack.typeId == "test:switch_sword") {
        player.addTag("sas")}})

function getSelectedItem(player) {
    const inventory = player.getComponent("inventory");
    const item = inventory.container.getItem(player.selectedSlotIndex);
    return item;
}

world.afterEvents.entityHitEntity.subscribe(ev => {
    const player = ev.damagingEntity;
    if (player instanceof Player) {
        const item = getSelectedItem(player)}

    if (item == "test:switch_axe" || item == "test:switch_sword") {
        player.addTag("saa")}})

world.afterEvents.entityHurt.subscribe(ev => {
    const player = ev.hurtEntity;
    if (player instanceof Player) {
        const item = getSelectedItem(player)}

    if (item == "test:switch_axe" || item == "test:switch_sword") {
        player.addTag("sac")}})
;
spark bane
#

Playerクラスをインポートしてください

neon coyote
#

了解です!やってみます

neon coyote
spark bane
#

詳しくはjs スコープなどで調べていただければ解説も出ると思いますが
変数が定義されている波括弧{}の外側ではその変数は使えません```js
if (true) {
const msg = "Hello, world!";

// 使える
world.sendMessage(msg);

for (let i = 0; i < 3; i++) {
// 使える
world.sendMessage(msg);
}
}

// 外側なので使えない
world.sendMessage(msg);```

neon coyote
#

ありがとうございます!
変数の使える範囲が決まってるのか…
今回の場合はitemを定義したifの中にidを含むifを入れる感じですかね…(?)
jsスコープで調べて頑張ってみます!

spark bane
#

itemを定義したifの中にidを含むifを入れる > 今回の例だとその対処法で大丈夫だと思います

neon coyote
#

今やってみたら取り敢えずエラーは出なくなりました!ありがとうございます!

neon coyote
#

今ゲーム内で試してみて全て上手く行きました
最後idの方のifがtrueにならなかったのですがtypeId付け加えたら問題なかったです!