#ScriptAPI 検知されない
1 messages · Page 1 of 1 (latest)
どういうコードを書いたのか教えてください
今貼ります。少々お待ちくださいー
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")
}})
;
プレイヤーにタグを追加する目的ならplayer.addTag("タグ名")でokです
それと
orの使い方が違います
ev.itemStack.typeID == "test:switch_axe" || ev.itemStack.typeID == "test:switch_sword"か
if((条件式1) || (条件式2)){こんな感じだね
御三方ありがとうございます!
orの使い方が違ったのか…そこ修正してやってみます!
それとplayer.addTagでやってみます
あと@pでいいならいいけど@sの方がいい気がする
@sでやってみます
entityHurtEntity → entityHurt ``````ev.itemStack.typeID → ev.itemStack.typeIdじゃない?
よくよく見たら最初はあってるのに後のif文全部大文字じゃん書いてる時にテンション上がっちゃった?
なんとなくIdよりもIDって書いたほうがしっくりくるのはわかる
キャメルケースに慣れる
酔ってる?
今日嫌なことありすぎてなんかもうテンションバグった
const player = ev.damagingEntity; → const player = ev.damageSource.damagingEntity;これもだ
もうめんどくさいから日本語でいいや…()
日本語のキャメルケース
どうやるんだ…?
ぁぁぁいぃぃぃうぅぅ
ツクルアカウント
色々間違ってるのか、
上で貼ってくれたリンク先見たりして直してみます!
orの使い方と命名規則について知れて良かったです!明日試しにゲーム内で動かしてみます!
アイテム使用の部分は上手く動きました!
entityHitEntityとentityHurtにitemStackが無い?みたいでエラーが出てしまうのですが他にプレイヤーの所持しているアイテムを条件にできるものってあるのでしょうか…?
素手のときitemStackはundefinedになります
その状態でtypeId等プロパティやメソッドにアクセスしようとするとエラーになるので回避してあげる必要があります
上のコードを見る限りev.itemStack?.typeIdにするだけで直ります
ev.source.getComponentでインベントリ取得するとか?
アドオンで新しく追加したアイテムって素手判定されてたりします…?
そんなばなな
entityHitEntityにはdamagingEntityとhitEntityしかないよ!どうしよう?ってこと?
それです!
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が今選択中のアイテム
function getSelectedItem(player) {
const inventory = player.getComponent("inventory");
const item = inventory.container.getItem(player.selectedSlotIndex);
return item;
}
うちが昔使ってたものです
-# 思いっきり素人だからあんまり確かなことは言えない…
ありがとうございます!
関数入れてやってみます
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とエラーが出るのですが関数の入れ方どの辺が違いますか?
これに変えていないからかと
entityHitEntityの中にdamageSourceが無い?みたいで変えるとdamagingEntityの部分がエラーになるのですが対処法等ありますか?
定数名がplayerになっていますがplayerかどうかは確定では無いのでif等でplayer以外だった場合に処理を弾いたらどうでしゃう
確かにです。
const item = getSelectedItem(player)の部分をifに入れてplayer.typeIdでやれば大丈夫ですかね…?
失礼、damagingEntityで合ってました
<関数実行>
}```
助かります!
instanceofって演算子があるんですね…便利
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")}})
;
Playerクラスをインポートしてください
了解です!やってみます
Playerは上手くいったのですが30,41行目( if (item = ) )部分のitemが定義されないですね…
ReferenceError: 'item' is not definedとエラーが出てるのですが何処が間違っているのか教えて頂けると嬉しいです。
詳しくはjs スコープなどで調べていただければ解説も出ると思いますが
変数が定義されている波括弧{}の外側ではその変数は使えません```js
if (true) {
const msg = "Hello, world!";
// 使える
world.sendMessage(msg);
for (let i = 0; i < 3; i++) {
// 使える
world.sendMessage(msg);
}
}
// 外側なので使えない
world.sendMessage(msg);```
ありがとうございます!
変数の使える範囲が決まってるのか…
今回の場合はitemを定義したifの中にidを含むifを入れる感じですかね…(?)
jsスコープで調べて頑張ってみます!
itemを定義したifの中にidを含むifを入れる > 今回の例だとその対処法で大丈夫だと思います
今やってみたら取り敢えずエラーは出なくなりました!ありがとうございます!
今ゲーム内で試してみて全て上手く行きました
最後idの方のifがtrueにならなかったのですがtypeId付け加えたら問題なかったです!