#scriptapiを教えてほしい

1 messages · Page 1 of 1 (latest)

desert schooner
#

銃アドオンをscriptapi化したいのですが簡単な動作テストコードでさえ動かないのでわかりやすく教えてほしいです

#

いまは[scripting][error]-plugin[puchineko guns 2 -1.0.0] - does not contain main file [script/main.js].というエラーが出ています

vestal merlin
#

scriptsファイル内にmain.jsを作成してください

long path
#

sが抜けてるだけな気が

desert schooner
#

すでにmain.jsは存在しています(練習として銃を撃つと銃の名前をチャットに表示するようになっています)

long path
#

afterEventsのitemUseです

desert schooner
#

この鯖の過去ログやscriptapiについて書いてあるサイトなどあちこち見て見様見真似で組んだので怪しい部分もあります・・・(というか100%あってるのか怪しい)

long path
#

あとitemStackです

#

typeIdもですね

desert schooner
#

動作しました! ありがとうございます

#

(銃のシステム本体はscriptapi化前のものを流用しています)

vestal merlin
#

銃こだわっててすごいな

desert schooner
#

scriptapiを使って
右クリックで発射 スニーク左クリックでタクティカルリロード
左クリックでモード切替 って感じで作りたいです・・・

vestal merlin
#

左クリック検知は何かを殴ったとかじゃないと検知できません

#

右クリックはアイテム使用とかで検知できます

desert schooner
#

空振り検知は不可・・・って感じですか?

vestal merlin
#

そうですね

desert schooner
#

じゃああの鯖のアドオンはplayer.json使ったアドオン(操作系を参考にしようと思ってた)・・って感じですかね・・(ここでほかの鯖名・アドオン名を出すのはやめておきます)

vestal merlin
#

左クリック検知はできるのかな…🤔

#

でかいエンティティをプレイヤーのとこに常にTPさせて、倒されたことを検知とかなら出来そうだけど

desert schooner
#

銃弾が当たっちゃいますね・・・

vestal merlin
#

そしたら攻撃通らなくなっちゃいますよね

crisp sigil
#

空振りはアニコン使うしかないと思う

desert schooner
#

そうなんですか・・・

#

アニコンはplayer.json必須ですもんね・・

long path
#

ブロックかエンティティかどっちか殴れば動くようにはできるんだけどね

desert schooner
#

ブロックに殴りだとどんな感じになります?

long path
#

entityHitBlockで取れる

desert schooner
#

ありがとうございます 試してみます

desert schooner
#

source.runCommand
ここを変更して銃弾(プロジェクタイル)を飛ばしたいのですがどうすればいいでしょうか?

long path
#

アイテムのイベントを呼んでshootを起動するとかじゃないですかね

desert schooner
#

なるほどです

#

これを呼ぶ感じですか?

#

どうして・・・(翻訳が一瞬だけしかならない・・・)

long path
#

データが多すぎて翻訳に時間がかかることがある

desert schooner
#

なるほどです・・・

#

う~ん・・ 調べたけどイベント呼ぶ方法わかんない・・・・・

long path
#

triggerEventメソッドがあります

desert schooner
#

ありがとうございます!

#

さっきのはタイプミスです・・・

#

こんな感じのエラーが出ます・・

long path
#

ItemStackのtriggerEventを使ってますか?

desert schooner
#

あ・・・

#

sourceになってました・・・

#

[Scripting][warning]-[Watchdog] 129.349 ms script spike detected in behavior pack 'puchineko guns 2'
このエラーが出ます・・・

long path
#

watchdogなので程々に気にすればいいです

desert schooner
#

import { world } from "@minecraft/server";
world.afterEvents.itemUse.subscribe( m16a1=> {
const { source, itemStack} = m16a1;
if(itemStack.typeId==='ar:m16'){
const ze = world.getPlayers();
source.runCommand(me @a m16a1)
itemStack.triggerEvent('m16shoot')
}
});
コードはこんな感じです

desert schooner
long path
#

runCommandが割とステート食ってる可能性は高いです

desert schooner
long path
#

そのエラーと弾が出ないのは一切関係性はないですね

desert schooner
#

ええ・・・

long path
#

ちなみにですがgetPlayersはなぜ書いてあるのですか

#

あとイベントを呼んでも動かないのはconditionを通過できていないからな気がします

#

一度shootだけのイベントを用意してみて使ってみてください

desert schooner
#

おkです

#

あ・・・ テストコード書いた後の単純な消し忘れです

desert schooner
#

いくつか改良試したんですけどどれもダメでした・・

#

"testshoot":{
"sequence":[
{
"shoot":{
"projectile":"ar:m16bullet",
"launch_power":3
}
}
]
}
呼んでるイベントはこれです

#

パックの機能 'editorExtension' はサポートされていません。
エラーはパック画面でこれが出ています 実行時はエラー表示なしです

long path
#

manifestを見せてください

desert schooner
#

こんな感じです

long path
#

capabilitiesからeditorExtensionをお外し下さい

desert schooner
#

あ・・・ 見逃してた・・・

#

(多分ツール使ったときに変な設定した)

desert schooner
#

editorextansionのエラーが消えて現在はエラーなしで弾が出ない状態です

long path
#

ちなみにアイテムのイベントの方でsayコマンドとか実行した場合も動かないんでしたっけ?

desert schooner
#

動きませんね・・・

#

"testshoot":{
"sequence":[
{
"run_command":{
"command":[
"say @p"
],
"target":"holder"
}
}
]
}
eventの中身はこんな感じになってます

desert schooner
#

変更したらエラーが出るようになりました・・・

desert schooner
crisp sigil
#

triggerEventはItemStackに生えているメソッドなので必要ですね

desert schooner
#

そうすると今度はエラーないけど何も動かなくなっちゃうんですよね・・・

#

アイテムのjsonはこれですね・・・(m16shootイベントはscriptapi化前の残骸です)

desert schooner
#

色々いじってもイベント発動しないorエラーですね・・・

zenith orchid
#

ItemStackのtriggerEventメソッドは存在はしていますが、アイテムイベントは実行されず使えなかったはずです。

#

なのでアイテムイベントでやりたいこともスクリプト側で書いた方が良いかと

desert schooner
#

なるほどです・・・・

crisp sigil
#

まだ治ってなかったんだ

desert schooner
#

"shoot":{
"projectile":"ar:m16bullet",
"launch_power":3
}
これとまだ未実装ですがlore管理の銃の残弾を減らす処理ですね・・・

#

プロジェクタイルを飛ばす処理ってありますかね・・・(なんとなくだけどない気がする・・・)

zenith orchid
#

プロジェクタイルもエンティティなのでスポーンさせられます。<Entity>.applyImpulseなどで好きな方向に飛ばせます。

#

尚、この方法ではプロジェクタイルに誰が発射したかというデータがないため、キルログが「(プレイヤー名)に倒された」ではなく「(プロジェクタイル名)に倒された」になるなどの差はあります

#

ScriptAPIの開発者がプロジェクタイル関係でどんな機能があったら便利かを質問していたので、今後アイテムイベントの代わりにScriptでもプロジェクタイルを扱いやすくなるはずです

long path
#

Entityにshootメソッド生やしてくれ

desert schooner
long path
#

まあそれで良ければいいですが案件ですね(

#

他の方法があるとすれば発射したprojectileにタグ等を与えておきヒット時にダメージ処理をscriptAPI側で行うようにする とかですかね

#

scriptAPI側でダメージが自由にいじれる ダメージを与える際にタグを元に発射者を特定し発射者に攻撃されたことにできる等メリットもあります

#

アイテムのタグを使ってアイテムを追加するだけで弾の動作を設定する なんてこともできますね

#

弾丸自体の状態を変えようと思うといくつかのパターンを用意して…等にはなりますが

desert schooner
#

あー・・・・
実際突き詰めると銃弾は3種になりますね・・・・
1.普通の弾
2.グレネード弾
3.ロケット弾頭
(2と3は落下の仕方の違い)

long path
#

まあscriptAPIから制御出来ない可変要素と言うとサイズくらいですけどね

#

ちなみに処理を完全にscriptAPIにするメリットのひとつとしてアイテム自体に依存した動作設計をするのでアイテムを増やすだけで10の種類がふやせる = 追加コンテンツを簡単に増やせる
というものもあります

#

もちろん用意した範囲内で ではありますがダメージ量やら発射間隔やら弾数やらは自由に設定出来ますし

desert schooner
long path
#

そんな感じにも可能ですね

#

当たったら貫通しろ とかprojectile自体に影響するものはprojectileの情報をいくつか用意するかあるいは別のprojectileにしておくなどが必要ではありますがタグを元に出すエンティティを変える なんて容易ですので

#

銃を作る気はないけどそんな感じの設計がしたくなってきた

desert schooner
#

現在のイメージとしては
銃ごとに残弾とかのデータ持たせる=>右クリック検知=>プロジェクタイルスポーン=>残弾データー1
残弾データ=0or地面をスニーク左クリック=>インベントリにマガジンあること検知=>リロード(残弾を初期値or初期値+1に)
って感じですね

long path
#

アイテムにつけるタグですね

#

あそれはコマンドのタグですね

desert schooner
#

タグ≠データ値 で合ってますかね?・・・・

long path
#

desert schooner
#

アイテムに付けるタグとtagコマンドでこんがらがってますね・・・・

long path
#

projectileに与えるのはコマンドの方のタグで武器の動作分岐はアイテムにつけるタグですね

desert schooner
#

コマンドのほうのタグは発射したプレイヤー名を持たせる
アイテムのタグは銃の状態を持たせる
って感じで合ってます?

long path
#

銃の状態というか銃の設定ですかね

#

不変的な部分です

#

コマンドのタグは名前やidですね

desert schooner
#

例えば僕が撃った銃弾はDisloyalSquid93ってタグが付くってことですかね?

long path
#

例えばそんな感じですね

desert schooner
#

タグの内容を取得=>当たったプレイヤーに僕から相手へ飛び道具で与えたとしてダメージ処理
って感じですかね?

long path
#

そんな感じですね

desert schooner
long path
#

applyDamageで発射者を指定する感じですね

desert schooner
#

銃の種類も取得して (撃たれたプレイヤー)は(撃ったプレイヤー)の(銃の種類)で撃たれた ってのも可能ですか?
langもいじらないといけないし多分実装するのかなり先)

long path
#

キルログを消す必要がありますが消してしまえばあとは出したいように出すだけではありますね

desert schooner
#

||僕の場合はとりあえず発射とか残弾とかの基礎部分作るのが先ですね・・・||

desert schooner
#

scriptapiでエンティティをsummonごり押し以外で出す方法ってありますか?
(現在summonごり押し実装ですw)

crisp sigil
#

Dimension.spawnEntity()が使えます

desert schooner
crisp sigil
#

Dimensionにはエンティティを出したいディメンションを入れてください

desert schooner
#

全ディメンションで出したい場合は全ディメンション分やる感じですか?

crisp sigil
#

そうですね

#

この場合だと銃を使った人と同じディメンションに召喚でしょうか...?

desert schooner
#

そうですね

#

銃を使う=>目の前に弾を出す=>視点の方向に飛ばす って感じです

crisp sigil
#

イベントのsourceに入っているPlayerから source.dimension のようにして使った人のディメンションを取得できるので

#

そこからspawnEntityに繋げてみてください

desert schooner
#

world.afterEvents.itemUse.subscribe( ak47=> {
const { itemStack} = ak47;
const { source} = source.dimension;
if(itemStack.typeId==='ar:ak47'){
source.spawnEntity('ar:ak47bullet')
}

});
こんな感じですか?

crisp sigil
#

sourceはイベント変数のak47から取得します

desert schooner
#

const { source} = ak47 で合ってますか?

crisp sigil
#

desert schooner
#

エラー出ますね・・・
world.afterEvents.itemUse.subscribe( ak47=> {
const { itemStack} = ak47;
const { source} = ak47;
if(itemStack.typeId==='ar:ak47'){
const ze = world.getPlayers(source.dimension);
source.Dimension.spawnEntity('ar:ak47bullet')
}

});
コードこんな感じです

crisp sigil
#

dimensionのdは小文字です

desert schooner
#

この手のポカミス初めからめっちゃやってるな・・・

crisp sigil
desert schooner
#

またエラー出ました・・

#

world.afterEvents.itemUse.subscribe( ak47=> {
const { source,itemStack} = ak47;
if(itemStack.typeId==='ar:ak47'){
const ze = world.getPlayers(source.dimension);
source.dimension.spawnEntity('ar:ak47bullet')
}

});
今のコードです

crisp sigil
#

sourceがプレイヤーを指しているのでgetPlayersは不要です

desert schooner
#

const ze = world.getPlayers(source.dimension);
この行自体が不要ってことでおkですか?

crisp sigil
#

はい

desert schooner
#

そうするとこのエラーが出ますね・・・

#

world.afterEvents.itemUse.subscribe( ak47=> {
const { source,itemStack} = ak47;
if(itemStack.typeId==='ar:ak47'){
source.dimension.spawnEntity('ar:ak47bullet')
}
});

crisp sigil
#

spawnEntityの2つ目の引数に座標を渡さないとでした

desert schooner
#

自分の視点の先に出したいときはどうすればいいですか?

crisp sigil
#

source.getHeadLocation()で頭の座標を取れます

#

でもこれだと重なって自分に当たるかも...?

desert schooner
#

自分の座標にZ+1くらいのほうがいいかもですね・・・

crisp sigil
#

1回そのままで試してみてください

#

spawnEntity('id', source.getHeadLocation())

desert schooner
#

こうなりました

crisp sigil
#

あーだめですね()

desert schooner
#

そっこーで銃弾に視点の方向に加速度かければ行けますかね?・・・

crisp sigil
#

先に飛ばす処理書いてみますか

desert schooner
#

そうですね

#

<Entity>.applyImpulse
で合ってますか?(過去ログより)

crisp sigil
#

ですね

desert schooner
#

エンティティクラスで弾取得=><Entity>.applyImpulseで加速度かける でおkですか?

#

それとも発射のコードに追記ですか?

crisp sigil
#

spawnEntity()の返り値が出したエンティティになるので

#

このように変数に入れてあげましょう

const bullet = ...spawnEntity(...)
#

(...は略)

#

そうするとbullet.applyImpluse()のように書けます

desert schooner
#

world.afterEvents.itemUse.subscribe( ak47=> {
const { source,itemStack} = ak47;
if(itemStack.typeId==='ar:ak47'){
source.dimension.spawnEntity('ar:ak47bullet',source.getHeadLocation());
const bullet = source.dimension.spawnEntity('ar:ak47bullet',source.getHeadLocation());
bullet.applyImpluse(15)
}
});
こんな感じですね・・・

crisp sigil
#

16行目はどこですか?

tawny granite
#

impulse

crisp sigil
#

俺がみすってた

#

applyImpulseには数字ではなくVector3を渡します

long path
#

プレイヤー使えないからね しょうがないね

crisp sigil
#

こんな感じで見ている方向に速度を与えられます

const speed = 3;
const impulse = Vector.multiply(player.getViewDirection(), speed);
bullet.applyImpulse(impulse);
#

speedの値はいじってみてください

desert schooner
#
    const { source,itemStack} = ak47;
        if(itemStack.typeId==='ar:ak47'){
            source.dimension.spawnEntity('ar:ak47bullet',source.getHeadLocation());
            const bullet = source.dimension.spawnEntity('ar:ak47bullet',source.getHeadLocation());
            const speed = 3;
            const impulse = Vector.multiply(player.getViewDirection(), speed);
            bullet.applyImpulse(impulse);
        }
});```
エラー出てしまいますね・・・
long path
#

エンティティを2度召喚する必要は無いのでは?

#

それとplayerではなくsourceですね

desert schooner
#
    const { source,itemStack} = ak47;
        if(itemStack.typeId==='ar:ak47'){
            const bullet = source.dimension.spawnEntity('ar:ak47bullet', source.getHeadLocation());
            const speed = 5;
            const impulse = Vector.multiply(source.getViewDirection(), speed);
            bullet.applyImpulse(impulse);
        }
});```
こんな感じで合ってますか?
long path
#

そんな感じですかね

desert schooner
#

このエラーが出ていますね・・・

long path
#

importにVectorを追加してください

desert schooner
#

発射できました ありがとうございます

#

セミオートとフルオートの切り替え機能の実装って可能ですか?(地面を左クリックで切り替え)

long path
#

行けると思います

desert schooner
#

フルオートはifでアイテムに記録した射撃モードをチェック=>右クリック押しっぱなし検知=>発射コードをループ 
切り替えは左クリック検知=>アイテムに書き込み
ってできますか?

long path
#

実装方法は様々ですが私であれば発射処理部分を同一にするためイベントからプレイヤー等の情報を配列上に放り込み runIntervalからそのデータを参照 単発なら発射後削除 連射なら維持 離した際のイベントから削除 という形にしますね
まあやりやすいやり方でいいかと

desert schooner
#

この場合って持ってるすべての銃で射撃モードって共有になりますか?

#

(現状の計画だと6パターンくらい射撃モードのパターンあるので・・・)
・セミオートオンリー
・フルオートオンリー
・セミオート フルオート切り替え
・セミオート フルオート グレネードランチャー切り替え
・セミオート 3点バースト フルオート切り替え
・単発銃

long path
#

どうとでもなるかと

desert schooner
#

マルチで動作テストしたら自分に当たっちゃいますね・・・
(ソロだとちゃんと撃てます)

desert schooner
#

上のバグ修正しようとしたらエラー出ました・・・

vestal merlin
#

world.getPlayers()です

#

()にVectorが入っています

desert schooner
#

マルチだとVectorを2人分とっちゃうのか弾が飛ばないのでプレイヤーごとにとろうとしたんですが・・・

#

うまくいかなかったです・・・

crisp sigil
#

特にその必要はないです

#

スポーンさせる位置を視点方向に少しずらしてみましょう

const spawnLocation = Vector.add(source.getHeadLocation(), source.getViewDirection());
const bullet = source.dimension.spawnEntity('ar:ak47bullet', spawnLocation);
            
#

これでちょうど1ブロック先に出てくるはずです

desert schooner
#

マルチでもしっかり動作しました ありがとうございます!

desert schooner
#

今度はフルオート射撃オンリーにしてみたんですが・・・ また動作しなくなりました・・・

long path
#

setDynamicPropertyの返り値はvoidだしそこに代入しても意味はないかと

#

あとその程度ならタグでいい気がします

desert schooner
crisp sigil
#

setDynamicPropertyはこのように使います

<Player>.setDynamicProperty("キー", 値);
#

world.afterEvents.itemStopUse.subscribe
iは小文字です

#

runInterval内で未定義の変数が使われています

desert schooner
crisp sigil
#

消す時はundefined(=何も書かない)を入れます
<Player>.setDynamicProperty("キー");

#

<Player>の場所にはただplayerを入れるのではなく適切な変数名を入れる必要があります

#

itemUseイベント内では使ったプレイヤーをsourceプロパティから取得し変数に定義しているので、ここでは source.setDynamicProperty() のように書くのが適切です

desert schooner
#

なるほどです

crisp sigil
#

runInterval内でsourceが未定義なのが原因です

#

プレイヤーが渡されるイベント以外の場所でプレイヤーに処理をする場合は
world.getPlayers()world.getAllPlayers()などを使って全プレイヤーを取得し、for ofなどを使用してそれぞれに対して処理を行います

#

EX:```js
system.runInterval(() => {
for (const player of world.getPlayers()) { // 全プレイヤーを取得し、それぞれを"player"として定義
player.sendMessage('hi'); // 全プレイヤーにメッセージが送られる
}
});

desert schooner
#

なるほど・・・

#

銃を打ったプレイヤー だとどうなりますか?

desert schooner
#

エラーのほうは自己解決しましたが・・・ 射撃止まんなくなりました・・・

#

itemStopUseでダイナミックプロパティが変わって射撃止まるはずなんですが・・・

#

なぜか止まりません・・・

crisp sigil
#

それは謎🤔

desert schooner
#

uuid変えて入れなおしたら直りますかね?

crisp sigil
#

変えても同じことが起きる気はしますが...

long path
#

そもそもitemStopUseは発生しているのですか

desert schooner
#

ただこのコードに変えてから射撃止まったのでrunintervalはきちんと動作してるみたいです

long path
#

stopUseが発生していないならそれが原因でしょう

desert schooner
#

原因って何かありそうですか?

#

(全く思い当たらない)

long path
#

アイテムに使用する要素がなければストップもないと思います

desert schooner
#

アイテムにon use があったんですけど・・・ scriptapiに改造時に消しましたね・・・

#

アイテムのほうにfoodとかの右クリックで何か起きるコンポーネントつけとけばいい感じですか?

desert schooner
#

akが表示されない+アイコンが全部出てないですね・・・ あとは右クリックのコンポーネントが反応してないです・・・

long path
#

.50きたん

#

あれきてないな

desert schooner
#

1.20.41ですね・・・ (前のテストしてたバージョンは1.20.40ですね・・・)

long path
#

そんだけでかわらないとは思うけどな

#

チェンジログ見てないからわからんが

desert schooner
#

結構エラー吐いたりしてますし・・・(エラー出すぎて問題の部分が見えないレベル)

long path
#

アドオンに関する変更点皆無ですね チェンジログ上は ですが

#

41の変更点は
・realms関連のクラッシュバグ修正
・マケプレ関連のバグ修正
・PlayStationでデモからフルバージョンにアップグレードできない問題を修正
だけですね

desert schooner
#

manifestを作り直したら直りました・・・(たまにこれで治るけど普通に謎)

desert schooner
desert schooner
#

https://qiita.com/JUN-SUZU/items/bd8c13b4ebf5c600bc9b
これをベースに残弾システムを作ろうと思っているのですがプレイヤーの今持っているアイテムにloreを付ける部分と
scoreboardに今持ってるアイテムのloreに保存されてる残弾を代入する方法をおしえてもらえないでしょうか?

Qiita

2023/5/15更新Minecraft BE -v1.19.81{ "module_name": "@minecraft/server", "version": "1.2.0-beta" }…

desert schooner
#

現状は自力で切り替え機能作ろうとしてエラー吐いてる感じですね

zenith orchid
#

18行目で undefined に getDynamicProperty は存在しない、というエラーです。
(entityHitBlockイベントでの source.getDynamicProperty の source が undefined)

entityHitBlockイベントにはsourceプロパティはありません、あるのは blockFace、damagingEntity、hitBlockだけです。
https://learn.microsoft.com/ja-jp/minecraft/creator/scriptapi/minecraft/server/entityhitblockafterevent?view=minecraft-bedrock-stable

Contents of the @minecraft/server.EntityHitBlockAfterEvent class.

desert schooner
#

プレイヤーを取っていないのでエラー・・って感じですか?

desert schooner
#

今度はエラーなしで弾が出ない感じですね・・・

long path
#

sourceはないですがEntity自体はdamagingEntityにありますよ

crisp sigil
#

ここは値を持っていないことを条件にするなら!で反転させるかundefinedと比較ですね
source.getDynamicProperty("m16a1mode")===''

desert schooner
#

こんな感じですか?

long path
#

damagingEntityとかが無くなってるような

desert schooner
#
        if(damagingEntity.getDynamicProperty("m16a1mode")===undefined){
            source.setDynamicProperty("m16a1mode")
        }
        for(const source of world.getPlayers())
        if(source.getDynamicProperty("m16a1mode")===''){
            source.setDynamicProperty("m16a1mode",'auto')
        }```
ここですか?
long path
#

そこです

#

damagingEntityの定義がないですね

#

その下のsourceはまだ未定義ですね

#

その下のforは{}がないです

desert schooner
long path
#

damgingEntityが二重で存在するのと

#

ワールド内のプレイヤーを取得する必要があるのか という疑問があります

desert schooner
#

なるほどです・・・・

long path
#

2つ目のifをelse ifにしておかないとautoをセットした後にautoを比較してしまって消されてしまいますね

#

それと最初のifのせいでautoだった場合最初のifを通過しないのでその後のautoとの比較まで行かないかと

desert schooner
#
        const { damagingEntity} = m16;
        if(damagingEntity.getDynamicProperty("m16a1mode")===undefined){
            damagingEntity.setDynamicProperty("m16a1mode",'auto')
        }
        else if(damagingEntity.getDynamicProperty("m16a1mode")==='auto'){
            damagingEntity.setDynamicProperty("m16a1mode")
        }
});}```
こんな感じですか?
long path
#

最後のカッコが気になりますがそんな感じですね

desert schooner
#

現状はこんな感じになっていて
(残弾をアクションバーに表示する用の)スコアボードにloreの一部の行に保存した残弾を代入して残弾=0になるorスニーク右クリックで初期値に残弾を変える・・・って処理を考えたのですが・・・
addScore(participant: Entity | ScoreboardIdentity | string, scoreToAdd: number): number
これを使う・・・くらいしか・・・
教えてもらえると嬉しいです

long path
#

代入ならsetScoreでいいかと

desert schooner
long path
#
import { world, system, Vector } from "@minecraft/server";

world.afterEvents.itemUse.subscribe(m16 => {//射撃開始
  const { source, itemStack } = m16;
  
  if(itemStack.typeId === 'ar:m16') {
    source.setDynamicProperty("m16a1", 'fire');
  }
});

world.afterEvents.itemUse.subscribe(ak47=> {//後でセミ・フル切り替えに修正
  const { source, itemStack } = ak47;

  if(itemStack.typeId==='ar:ak47') {
    const spawnLocation = Vector.add(source.getHeadLocation(), source.getViewDirection());
    const bullet = source.dimension.spawnEntity('ar:ak47bullet', spawnLocation);
    const speed = 5;
    const impulse = Vector.multiply(source.getViewDirection(), speed);
    bullet.applyImpulse(impulse);
  }
});

world.afterEvents.itemUse.subscribe( m1911a1=> {//モード切替がないセミオートオンリー銃
  const { source, itemStack } = m1911a1;

  if(itemStack.typeId==='hg:m1911') {
    const spawnLocation = Vector.add(source.getHeadLocation(), source.getViewDirection());
    const bullet = source.dimension.spawnEntity('hg:m1911bullet', spawnLocation);
    const speed = 5;
    const impulse = Vector.multiply(source.getViewDirection(), speed);
    bullet.applyImpulse(impulse);
  }
});
world.afterEvents.itemStopUse.subscribe(m16 => {//射撃終了
  const { source, itemStack } = m16;
  
  if(itemStack.typeId === 'ar:m16') {
    source.setDynamicProperty("m16a1");
  }
});

world.afterEvents.entityHitBlock.subscribe(m16 => {//モード切替
  const { damagingEntity } = m16;
  
  switch(damagingEntity.getDynamicProperty("m16a1mode")) {
    case 'semi':
      damagingEntity.setDynamicProperty("m16a1mode", 'auto');
      break;
    case 'auto':
      damagingEntity.setDynamicProperty("m16a1mode", 'semi');
      break;
  }
});

system.runInterval(function() {
  for (const player of world.getPlayers()) {
    if(player.getDynamicProperty("m16a1") !== 'fire') continue;

    const spawnLocation = Vector.add(player.getHeadLocation(), player.getViewDirection());
    player.runCommand(`playanimation @s animation.item.m16a1.shoot`)
    const bullet = player.dimension.spawnEntity('ar:m16bullet', spawnLocation);
    const speed = 5;
    const impulse = Vector.multiply(player.getViewDirection(), speed);
    bullet.applyImpulse(impulse);

    if(player.getDynamicProperty("m16a1mode") === 'semi') {//セミオート
      player.setDynamicProperty("m16a1");
    }
  }
}, 5);
#

最低限の修正のみしました

long path
#

ちなみにですがLoreをスコアに入れたい理由は何ですか?

desert schooner
#

アクションバーに残弾を表示するためです
titlerawでスコアボードを表示する・・くらいしか思いつかなかったので・・・

long path
#

onScreenDisplayから直接アクションバーに書き込みができるのであとは残弾管理処理も混じえて表示でもいいとは思います

#

スコアで弾数管理したい とかならそれもありだとは思います

desert schooner
#

なるほど・・・・

#

(完全なる知識不足)

desert schooner
long path
#

処理の統一もしようかと思ったんですがまあどのような処理になるかとか今後どのような処理が増えるのかとかが不明なのでひとまずはこのくらいにしました

crisp sigil
#

質問とは関係ないですがitemUseイベントやgetPlayersの処理は一つにまとめた方がいいと思います

desert schooner
#

銃の種類があと60種ほど増える予定なので・・・ 銃ごとに処理分けてる感じです

#

↑参考資料

long path
#

60種類ある=60個の処理がある
では無いと思います

#

あくまで60パターンある であって
1パターン目とnパターン目が完全に別 ということはあまりないと思います

desert schooner
#

射撃モードの種類が同じ銃は同じ処理にまとめたほうがいい感じですか?

long path
#

銃器の処理を大雑把に捉えると基本的には
弾丸Aを速度BでC方向に飛ばす
といったふうに可変的な部分を持つ同一の表し方ができるものだと思います

#

↑射出の処理はこうまとめれると思います

#

あとは使用の仕方が違う 等がなければ銃nを使用しているなら使用しているフラグを立てる
使用を辞めたなら使用しているフラグを落とす といった部分は同一の処理でいいと思います

desert schooner
#

なるほど・・・

desert schooner
#

(もしアプデ待たないと使えないならアプデ待つつもりです)

long path
#

previewなら使えると思うよ

desert schooner
#

なるほど・・・

#

アプデ待ちます・・(マイクラ安定?版しかいれてない)

crisp sigil
#

少なくとも来るのは1月下旬らへんかなぁ

desert schooner
#

アプデ来たので速攻で
EntityProjectileComponent
を用いたコード改良をしてみましたが・・・
ItemStack Dynamic Propertyがよくわからない感じですね・・・

long path
#

基本的にはエンティティ等と動作に違いはありません

#

強いて言えばスタックが可能なアイテムには追加できないことくらいです

desert schooner
#

itemStack.setDynamicProperty(" ");
みたいに書けばいい感じですか?

long path
#

そんな感じです

desert schooner
#

なるほどです

#

すでに入ってる数値から-1したい場合は
itemStack.setDynamicProperty("m16a1ammo",'m16a1ammo'-1)
こんな感じで合っていますか?

long path
#

それはただ文字列から減算してるだけですね

#

予め取得し変数に数値を入れて置いて下さい

desert schooner
#
system.runInterval(function() {
  for (const player of world.getPlayers()) {
    if(player.getDynamicProperty("m16a1") !== 'fire') continue;

    const spawnLocation = Vector.add(player.getHeadLocation(), player.getViewDirection());
    player.runCommand(`playanimation @s animation.item.m16a1.shoot`)
    const m16a1bullet = player.dimension.spawnEntity("ar:m16bullet", spawnLocation);
    const projectile = m16a1bullet.getComponent("minecraft:projectile");
    const velocity = Vector.multiply(player.getViewDirection(), 5);
    projectile.shoot(velocity);
    const ammo =itemStack.getDynamicProperty("ammo")
    ammo = Number(ammo);
    itemStack.setDynamicProperty("ammo", ammo-1);

    if(player.getDynamicProperty("m16a1mode") === 'semi') {//セミオート
      player.setDynamicProperty("m16a1");
    }
  }
}, 5);

こんな感じですか?
(||僕の中途半端な||知識総動員して書きました)

crisp sigil
#

数字をsetDynamicPropertyした場合はNumber()は不要ですよ

#

その前にitemStackが未定義なので取得してくる必要がありますね

desert schooner
#

メインハンドののアイテムを取るにはどうすればいいですか?

long path
#

インベントリからselectedSlotのindexで取得するかequippableからMainhandを取得するかのどちらかです

desert schooner
#
system.runInterval(function() {
  for (const player of world.getPlayers()) {
    if(player.getDynamicProperty("m16a1") !== 'fire') continue;
    const spawnLocation = Vector.add(player.getHeadLocation(), player.getViewDirection());
    player.runCommand(`playanimation @s animation.item.m16a1.shoot`)
    const m16a1bullet = player.dimension.spawnEntity("ar:m16bullet", spawnLocation);
    const projectile = m16a1bullet.getComponent("minecraft:projectile");
    const velocity = Vector.multiply(player.getViewDirection(), 5);
    projectile.shoot(velocity);
    const itemStack = equipmentCompPlayer.getEquipment(EquipmentSlot.Mainhand, new ItemStack(MinecraftItemTypes.ar:m16));
    itemStack.setDynamicProperty("ammo", ammo-1);

    if(player.getDynamicProperty("m16a1mode") === 'semi') {//セミオート
      player.setDynamicProperty("m16a1");
      itemStack.setDynamicProperty("ammo", ammo-1);
    }
  }
}, 5);

これだとコードエディターの時点でエラー吐きますね・・
(銃のアイテムIDはar:m16です)

crisp sigil
#

既に手に持っているアイテムを取得するので新しくItemStackを作る必要はありません

#

...getEquipment(EquipmentSlot.Mainhand);でok

desert schooner
#

わかりました

crisp sigil
#

アイテムごとに処理を分岐させるのであればitemStack.typeIdを条件に分岐させてください

desert schooner
#

発射部分を共通化してアイテムidで分岐させるのと発射モードカテゴリ別にそれぞれに処理するのどっちがいいんでしょうか・・・
(銃としては大きくカテゴリ分けすると射撃モード別で5種あります セミ セミ・フル セミ・フル・バースト フル セミ・フル・ランチャー)

crisp sigil
#

射撃モードによって何が変わるんですか?

desert schooner
#

切り替えのパターンですね・・・

#

あとは弾の出かたです

crisp sigil
#

切り替えのパターン がよく分かりませんがオブジェクトで一括管理すると良さそうです
例えばこのように定義しておくと```js
const gunData = {
"ar:m16": {
animation: "animation.item.m16a1.shoot",
bullet: "ar:m16bullet",
propertyId: "m16a1mode",
modes: {
"auto": { speed: 5 },
"semi": { speed: 3 }
}
},
"アイテムID": { ... }
}

このように1つのコードで複数の銃に対応できます
```js
const data = gunData[item.typeId]; // IDに対応する銃のデータを取得
if (data) {
  player.runCommand(`playanimation @s ${data.animation}`);
  ...
  const bullet = player.dimension.spawnEntity(data.bullet, spawnLocation);
  ...
  const mode = player.getDynamicProperty(data.propertyId);
  const speed = data.modes[mode].speed;
  const velocity = Vector.multiply(..., speed);
  projectile.shoot(velocity);
}
desert schooner
#

semiモードが単発射撃 autoモードが連射ですね・・・

desert schooner
#

こんな感じになりました

crisp sigil
#

dataとmodeが未定義です

long path
#

これ前から思ってたけどfireをDPに保存する必要ってないよな

desert schooner
#

修正しました

desert schooner
#

銃のデータを別ファイルに置くことってできますか?
main.jsを処理 別ファイルをデータ置き場にしたいのですが・・・

zenith orchid
#

別のjsファイルを作りexportすることで、main.jsでimportして扱うことができます
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/export

MDN Web Docs

export 宣言は、JavaScript モジュールから値をエクスポートするために使用されます。エクスポートされた値は import 宣言やダイナミックインポートによって、他のプログラムにインポートすることができます。インポートされたバインディングの値は、それをエクスポートするモジュールの変更の対象となります。モジュールがエクスポートするバインディングの値を更新すると、その更新はインポートされた値として見えます。

desert schooner
#

現状こんな感じですね・・・ 弾の代わりにエラーが出ます・・・

#

[Scripting][error]-ReferenceError: 'item' is not defined at <anonymous> (main.js:49)
エラーはこんな感じです・・・

desert schooner
desert schooner
long path
#

このエラーはitemが未定義 というエラーです
使用している場所を見てきちんと定義されているか確認してみてください

desert schooner
long path
#

エラーが出ているのはこの部分では無いですね

#

可能性があるとすればconst dataのとこですかね

desert schooner
#

マイクラからitemをインポートすればいい感じですか?

long path
#

このitemはおそらく使用したアイテムのことだと思います

desert schooner
#

itemStackに書き換えたほうがいいですか?

long path
#

itemStackで定義されているならそういうことです

desert schooner
#

今度はエラーも弾も出なくなりました・・

long path
#

使用しているのは上のファイルですか

desert schooner
#

エラー見たら単純に書き間違いでした・・・

desert schooner
desert schooner
long path
#

const dataの後のif文を確認してください

#

同じDPに対して異なる種類の条件式になってます

desert schooner
#

あ・・・

#

コピーした時の変更忘れです・・・

#

修正しましたが動作しないですね・・・

long path
#

exportを後にしてください

#

定義前にexportしてしまっています

#

ammoの定義がないように見えます

desert schooner
#

ammoは現在の残弾ですね

#

53行目で定義してます

long path
#

定義する前に使用していますよね

#

明らかにエラーの出る状況なので出ていないということはifを通過していません

desert schooner
#

DPのammoの初期値は9行目で登録しているはずなんですが・・・

long path
#

52行目を見てください

tawny granite
#

detaとdataのタイポ

long path
#

52かどうかは知りませんが

#

定数ammoの定義が53なら52を見てください

desert schooner
#

定義しなおしましたがまだですね・・・

long path
#

data.jsは直しましたか

#

detaになっているのも気にはなりますが

#

まあ読み込みでそのまま指定されてるのでそれは良しとします

tawny granite
#

const ammo = itemStack.setDynamicProperty("ammo")//現在の装弾数を取得
setしてますね

long path
#

ただ、import文で相対パス指定をしないと参照する場所がズレた気がするので相対パス指定にした方がいい気がします

desert schooner
#

同じ回送なのでファイル名になってますが・・・ ../scripts/deta.jsにしたほうがいい感じですか?

long path
#

./deta.jsでいいです

#

dataに治した方がいい気もしますが

desert schooner
#

ただまだ動作しないままです・・・

long path
#

エラーは

desert schooner
#

なしです

long path
#

ならどこまで動いているかを確認してください

desert schooner
#

一切動いてない感じですね・・・
射撃処理で弾が入ってない場合はno ammo
弾がある場合は”残弾”/最大装弾数
とコマンドで出るはずなので・・・

long path
#

なのでどこまで動いているのかを確認してください

desert schooner
#

テスト用に各工程でno ammo表示するようにしたら・・・
常時no ammo表示になりました・・・

long path
#

メッセージを同じにしたらどこが出してるか分からないです…

desert schooner
#

あ・・・

#

こんな感じになりました・・・

long path
#

これで動いていないのはrunIntervalのどこかであることがわかったはずです

#

もっと細分化しどこまで動いているかを確認してください

#

ついでに使用している値も出力するといいでしょう

desert schooner
#

player.runcommand('say ${ammo}') がundifinedを返してますね・・・

long path
#

確認してないからあれだけどまさかItemStackのDPいじったらsetItemしなきゃいけないとか言わないよね

#

同期してない感あるな

desert schooner
long path
#

sourceにsetItemはありません

desert schooner
#

どうすればいいですか?

long path
#

個人的にはsetItemするよりContainerSlotを使った方がいい気がします

desert schooner
#
world.afterEvents.itemUse.subscribe(m16 => {//射撃開始
  const { itemStack,source } = m16;
  
  if(itemStack.typeId === 'ar:m16') {
    source.runCommand(`say start`)
    itemStack.setDynamicProperty("gun", 'fire');
    itemStack.setDynamicProperty("ammo", 30);
    ContainerSlot.setItem(itemStack?:m16);
  }
});

こんな感じですか?

long path
#

ContainerSlotはいったいどこから来たのですか

desert schooner
#

リファレンス見ながらやってみましたが・・・

#

書き方無かったので自分でやってみました

crisp sigil
#

<Container>.getSlot(index: number): ContainerSlotです

desert schooner
#

メインハンドのアイテムだとどうなりますか?

long path
#

<Player>.selectedSlotを使用してください

desert schooner
#
world.afterEvents.itemUse.subscribe(m16 => {//射撃開始
  const { itemStack,source } = m16;
  
  if(itemStack.typeId === 'ar:m16') {
    source.runCommand(`say start`)
    itemStack.setDynamicProperty("gun", 'fire');
    itemStack.setDynamicProperty("ammo", 30);
    source.setItem(index,m16:source.selectedSlot);
  }
});

これはコードエラー・・・

crisp sigil
#

m16:が余計です

#

んん

long path
#

indexの所にslectedSlotですね

#

setItemするのであれば

crisp sigil
#

ちなみにgetSlotならsetItemが不要になります

desert schooner
crisp sigil
#

イベントから取ってるのはItemStackなのでDPをセットしたあとsetItemが必要です

desert schooner
#

source.setItem(source.selectedSlot,itemStack);
これをDPいじった後すべてに入れる感じですか?

crisp sigil
#

ですね

#

runInterval内のgetEquipmentは getEquipmentSlot を使うことでMainhandのContainerSlotを取得できます

desert schooner
crisp sigil
#

DynamicPropertyの操作は全てContainerSlotから可能なので書き換えてあげましょう

#

そうすればgetEquipmentもsetItemも要らなくなります

desert schooner
#

ContainerSlot.setitem(slot.selectedSlot,itemStack);
みたいな感じですか?

long path
#

setしなくていいです

crisp sigil
#

ContainerSlotは書き換えるとすぐに値が反映されるものです

desert schooner
#

なるほどです

desert schooner
desert schooner
#

現在こんな感じですね・・・
エラーオンリーです・・・

long path
#

sourceにsetItemはありません

desert schooner
crisp sigil
#

ContainerSlot(slot.selectedSlot,itemStack);はいりません

#

runInterval内でしているItemStackの操作は全てContainerSlotで可能です
つまりitemStack.〇〇と書いているものはslot.〇〇と書き換えられます

crisp sigil
#

イベント内ではitemStackに対してDynamicPropertyの操作などをしているので、それらを保存するために<Container>.setItemが必要です

desert schooner
#

world.afterEvents.itemUse.subscribe(m16 => {//射撃開始
const { itemStack,source,ContainerSlot,slot } = m16;

if(itemStack.typeId === 'ar:m16') {
source.runCommand(say start)
itemStack.setDynamicProperty("gun", 'fire');
itemStack.setDynamicProperty("ammo", 30);
ContainerSlot.setItem(slot.selectedSlot,itemStack);
}
});
こっちはこんな感じですか?

crisp sigil
#

<Container>.setItemです

#

selectedSlotはPlayerのプロパティ(=source)です

#

Containerはインベントリコンポーネントを取得し、<InventoryComponent>.containerから取得します

desert schooner
#

world.afterEvents.itemUse.subscribe(m16 => {//射撃開始
const { itemStack,source,ContainerSlot } = m16;

if(itemStack.typeId === 'ar:m16') {
source.runCommand(say start)
itemStack.setDynamicProperty("gun", 'fire');
itemStack.setDynamicProperty("ammo", 30);
const inventory = player.getComponent(EntityInventoryComponent.componentId);
inventory.setItem(source.selectedSlot,itemStack);
}
});
こんな感じですか?

crisp sigil
#

inventory.container.setItemですね

desert schooner
#

world.afterEvents.itemUse.subscribe(m16 => {//射撃開始
const { itemStack,source,player } = m16;

if(itemStack.typeId === 'ar:m16') {
source.runCommand(say start)
itemStack.setDynamicProperty("gun", 'fire');
itemStack.setDynamicProperty("ammo", 30);
const inventory = player.getComponent(EntityInventoryComponent.componentId);
inventory.container.setItem(source.selectedSlot,itemStack);
}
});
こんなエラーが出てますね・・・
[Scripting][error]-TypeError: cannot read property 'getComponent' of undefined at <anonymous> (main.js:11)

crisp sigil
#

ItemUseイベントにplayerというプロパティはありません

#

sourceプロパティがPlayerクラスを指します

desert schooner
#

world.afterEvents.itemUse.subscribe(m16 => {//射撃開始
const { itemStack,source } = m16;

if(itemStack.typeId === 'ar:m16') {
source.runCommand(say start)
itemStack.setDynamicProperty("gun", 'fire');
itemStack.setDynamicProperty("ammo", 30);
const inventory = source.getComponent(EquipmentSlot.Mainhand);
inventory.container.setItem(source.selectedSlot,itemStack);
}
});
現在はこのエラーです・・・
[Scripting][error]-TypeError: cannot read property 'container' of undefined at <anonymous> (main.js:12)

crisp sigil
#

getComponentの引数は前のままで合ってますよ

#

Inventoryコンポーネントを取得するので

desert schooner
#

world.afterEvents.itemUse.subscribe(m16 => {//射撃開始
const { itemStack,source } = m16;

if(itemStack.typeId === 'ar:m16') {
source.runCommand(say start)
itemStack.setDynamicProperty("gun", 'fire');
itemStack.setDynamicProperty("ammo", 30);
const inventory = source.getComponent(EntityInventoryComponent.componentId);
inventory.container.setItem(source.selectedSlot,itemStack);
}
});
現状こんな感じですね・・・

crisp sigil
#

EntityInventoryComponentはインポートしてください

desert schooner
#

これまで教えてもらったこと+自分で調べたことで修正しましたが…まだエラー出ます・・

desert schooner
crisp sigil
#

PlayerはdamagingEntityから取ってください

#

アイテムについてはrunInterval内と同じくContainerSlotを取得してsetDynamicPropertyすると扱いやすいと思います

desert schooner
#

エラー出なくなりました!

desert schooner
#

world.afterEvents.entityHitBlock.subscribe(m16 => {//モード切替・リロード
const { damagingEntity } = m16;
const equipmentCompPlayer = damagingEntity.getComponent(EntityComponentTypes.Equippable);
const itemStack = equipmentCompPlayer.getEquipment(EquipmentSlot.Mainhand);
const inventory = damagingEntity.getComponent(EntityInventoryComponent.componentId);
const maxammo =gunData[itemStack.typeId.maxammo];
const isSneaking = damagingEntity.isSneaking; // スニークしているか(true/false)
if(isSneaking==true){
if(itemStack.getDynamicProperty("ammo") >=1){
itemStack.setDynamicProperty("ammo", maxammo+1);
}else{
itemStack.setDynamicProperty("ammo", maxammo);//スニーク左クリックでリロード
}
inventory.container.setItem(damagingEntity.selectedSlot,itemStack);
}else{
switch(itemStack.getDynamicProperty("mode")) {
case 'semi':
itemStack.setDynamicProperty("mode", 'auto');

  inventory.container.setItem(damagingEntity.selectedSlot,itemStack);
  break;
case 'auto':
  itemStack.setDynamicProperty("mode", 'semi');
  inventory.container.setItem(damagingEntity.selectedSlot,itemStack);
  break;
case 'undifined':
  itemStack.setDynamicProperty("mode", 'semi');
  const mode = itemStack.getDynamicProperty("mode")
  player.runCommand(`say ${mode}`)
  inventory.container.setItem(damagingEntity.selectedSlot,itemStack);
  break;

}
}
});
現在これと残弾減らす処理が動いてない感じですね・・・(しかもエラーなしで)

crisp sigil
#

ContainerSlotよりもItemStack使いたい感じですかね...?

long path
#

そういえばテストした時にアイテムが更新される関係かアニメーションに乱れがあったので気をつけてください

desert schooner
#

現状発射されたりされなかったり残弾減ったり減らなかったりですね・・・

long path
#

ItemStackとContainerSlotにそこまで大きな違いは無いと思いますけどね

crisp sigil
#

getItemがgetSlotになって後からsetItemする必要がなくなるだけではある()

#

ここはconst maxammo = gunData[itemStack.typeId].maxammo;です

desert schooner
#

これって最後のアイテム置き換えまで実行される前に次の処理動いてる感じですかね?

#

処理は問題ないはずなのに動かないので・・・

crisp sigil
#

case 'undifined':のところ
undefinedは文字ではないので case undefined: に変えてみてください

desert schooner
long path
#

完璧なものは結構面倒です

#

なぜなら終了が長押しをやめるだけでは無いからです

desert schooner
#

う~ん・・・

#

runinterval内でconstに書き込んでitemstopuseでrunintervalで設定したconstをsetdynamicpropertyでやる・・・っての思いついたんですが・・・

desert schooner
#

最後の円柱はconst ammoをDPammoに書き込みの間違いです

desert schooner
desert schooner
#

これの対処法ってありますか?

crisp sigil
#

runIntervalの処理が上手くいってない感じ...?

desert schooner
#

そうですかね・・・・・

desert schooner
#

とりあえず動作してないという事実だけが残ってますね・・・

desert schooner
#

射撃処理中はプレイヤーに残弾のデータ書き込む形で修正してみましたが・・・
なぜか動作しません・・

desert schooner
#

動作的には
射撃開始時にアイテムのDP ammoをプレイヤーのDP nowammoに書き込み
1発撃つごとにプレイヤーのDP nowammoを-1
射撃終了時にプレイヤーのDP nowammoをアイテムのDP ammoに書き込みです

long path
#

今ちょっと荷解き中なのであれですが後で確認してみます

desert schooner
#

射撃処理は直せたんですが・・・ 今度はリロードアニメーションが動かないですね・・・

tawny granite
#

ar:m16以外のデータにはreloadプロパティが存在していないですね。読んでないか。m16でもアニメーションが動きませんか?またエラーは出ていますか

desert schooner
#

エラーなしでM16でも動作してない感じですね

#

(ほかの銃に追加する前にM16にデータ追加してテストしてる感じですね・・・)

tawny granite
#

animation.item.m16a1.reloadは素で発動して動作しますか

desert schooner
#

あれ・・・ 動作しませんね・・・(scriptapi化する前の銃アドオンからモデルとかアニメーション周り全部移植したんですが・・・)

tawny granite
#

それを治したら動いてくれるんじゃないかなあと思います…アニメーションは私には分かりません

desert schooner
desert schooner
#

コード修正しましたがセミオート射撃が動作しません・・・

desert schooner
#

どう修正すればいい感じですか?

tawny granite
#

せめてエラーがあるのかと、どの段階の動作が機能していないのかくらいの情報を書いた方が良いと思います

desert schooner
#

一切エラーないですね・・・

#

おそらく if(itemStack.getDynamicProperty("mode") === 'semi') {//セミオート
player.setDynamicProperty("gun");
}
がどう出してない感じかと・・・

tawny granite
#

modeのセットが出来てないのかな

desert schooner
#

一応モードは表示されてるので・・・

#

(非常に見にくいですがmode semiって出ています)

tawny granite
#

そのときgunはfireですか?

long path
#

これ7行目のifが奇妙ですね

#

gunDataからtypeIdで取り出したdataとtypeIdを比較しても恐らく一致しないのでは?

tawny granite
#

19にも同じのがあるようですね

desert schooner
#

ええ・・・

long path
#

gunDataが不明なので憶測ですが

desert schooner
#

gunDataは銃のIDとか装弾数とかが記録されてるデータファイルです
data.jsに保存されています

long path
#

まあどちらにせよgunDataの中身が例えば

{
  "gun:gun_1": "gun:gun_1"
}

とでもなってない限りこのifは通れないです

long path
#

条件が無くなったのでスタックできるアイテムを持っていた場合エラーになりますね

desert schooner
long path
#

条件式を変えてください

#

typeIdとの比較ではなく変数 dataに中身があるかのifにしてください

desert schooner
long path
#

問題ないです

desert schooner
#

あと修正する場所ってありますか?

desert schooner
#

現在のコードです
現在セミオート射撃が動作していないバグとリロードアニメーションが再生されないバグがありますね・・・・

#

荒ぶる射撃バグは修正できました

desert schooner
#

不要コードのコメントアウトをしましたが・・・(コメントアウトなのは発射用の最低限のコードになっているため)
マルチで動作してません・・・

#

状況としてはは残弾表示が消えて銃弾も出なくなります・・・

zenith orchid
#

エラーは出ていませんか

#

残弾表示はrunInterval内の処理のようなので、全プレイヤーのループ処理中にエラーが出て止まっているのではないでしょうか→マルチだと動かない

#
system.runInterval(function(shoot) {//射撃処理
  for (const player of world.getPlayers()) {
    const equipmentCompPlayer = player.getComponent(EntityComponentTypes.Equippable);
    const itemStack = equipmentCompPlayer.getEquipment(EquipmentSlot.Mainhand);
    const maxammo = gunData[itemStack.typeId].maxammo;````gunData[itemStack.typeId]`が`undefined`の可能性があります、その状態で`gunData[itemStack.typeId].maxammo`とするとエラーになるでしょう。例えば銃を持っていないプレイヤーがいるとその人以降の処理がエラーで止まってしまいます。

`function (`~~shoot~~`) {` ~~shoot不要~~
desert schooner
#

なるほどです
プレイヤーごとに処理すればいい感じですか?

zenith orchid
#

そもそもエラーを出さないようにしてください

desert schooner
#

gundetaが未定義だとifを通過できないようにしました

tawny granite
#

何も変わっていないですね

desert schooner
#

ファイル間違えました

#

今PC触れないので後で修正後のファイル送ります

desert schooner
#

こっち修正後のファイルです・・・ ミスってごめんなさい・・・

tawny granite
desert schooner
#

なるほど・・・
constより前にif持ってくる感じですか?(マルチプレイの検証が相方の都合でできてないので・・・)

tawny granite
#

itemStackを得なければtypeIdも得られないのでそれより後ではあります。具体的にはdataを取得した直後にdataがあるかを確認するのが無難な気がしますが、maxammoを少し動かす必要がありますね

#

そういえば引数にshootが残ったままですね

desert schooner
#

なるほどです
修正してみます

desert schooner
zenith orchid
#
system.runInterval(function() {//射撃処理
  for (const player of world.getPlayers()) {
    const equipmentCompPlayer = player.getComponent(EntityComponentTypes.Equippable);
    const itemStack = equipmentCompPlayer.getEquipment(EquipmentSlot.Mainhand);
    if(gunData[itemStack.typeId]!=undefined){
    const maxammo = gunData[itemStack.typeId].maxammo;
    const data = gunData[itemStack.typeId]; // IDに対応する銃のデータを取得 ←ココ````const data`で`gunData[itemStack.typeId]`を代入しているなら
```js
system.runInterval(function() {//射撃処理
  for (const player of world.getPlayers()) {
    const equipmentCompPlayer = player.getComponent(EntityComponentTypes.Equippable);
    const itemStack = equipmentCompPlayer.getEquipment(EquipmentSlot.Mainhand);
    const data = gunData[itemStack.typeId]; // IDに対応する銃のデータを取得
    if(data!=undefined){
    const maxammo = data.maxammo; // gunData[itemStack.typeId]をdataと短く書ける```こうやって利用すればより良く書けるのではと思わなくもないですが、一応そのコードでその場所のエラーは無くなるのではないでしょうか
試してご確認してください
desert schooner
#

教えてくださりありがとうございます!
またバグったら質問すると思います…

desert schooner
#

リロード時にconst guntypeにリロードしている銃のデータを入れてリロード処理用の銃に置き換えた後にconst guntypeに記録したデータで元の銃に戻すって処理を書きたいのですが最後の部分が認識されません(constの表示部分が薄いままになります)

tawny granite
#

スコープの問題ですね。if内で宣言したGuntypeを外から参照はできません

desert schooner
#

機能追加後の修正の影響なのか追加でエラー出てますね・・

desert schooner
tawny granite
#

49行目closeが未定義といっています

desert schooner
#

gundetaにbolt_typeという指定があり
そこで銃のタイプごとに処理分けてる感じになります(クローズドボルトの銃は途中リロードで+1発の再現のためです

tawny granite
#

おそらく"close"と比較したいということですかね

desert schooner
#

gundetaのbolt_typeがcloseか比較したい感じです

tawny granite
#

bolt_typeは文字列ですから"close"と比較してください

desert schooner
#

わかりました
このような感じでいいでしょうか?

tawny granite
#

=1つは代入です。2つか3つにしてください

desert schooner
tawny granite
#

またsetDynamicPropertyに<ItemStack>を渡すことはできません

desert schooner
#

リロード処理用から普通のに戻す際はelse ifの繰り返しになるのでしょうか?

tawny granite
#

リロード処理用から普通のに戻す...というのがどこのどういうものなのか知らないので...
好きに実装してください

desert schooner
#

一旦アイテムを置き換えちゃうのでどこかに元のアイテムを保存しておかないといけないんですよね・・・

#

const itemstackを取った後プレイヤーのDPに保存してDPからデータを改修して・・・ってやろうとしたんですが・・・

tawny granite
#

DPにアイテムを直接保存することはできません。元のアイテムを完全に保存する必要があるのか、データさえ保存できればよいのか、などによっても対応は変わるかと思います

desert schooner
#

できれば元のアイテムを保存したいですね・・・

#

(カスタム機能実装予定のため)

#

すいません この後アルバイトがあるので7時まで戻れません… 回答ありがとうございました・・・

desert schooner
tawny granite
#

変数のまま保つか、チェストなどに保存する、ですかね

desert schooner
#

なるほどです

#

変数に入れる場合はカスタム機能のパラメーターをリロード中プレイヤーに移動させる・・・とかですかね?

tawny granite
#

とかですね
パラメータという形で分離できるのであればitemstackとして保存する必要はないとは思います

tawny granite
#

であれば分離して保存して復元することも可能ですね

desert schooner
#

そうですね

#

Items tack dynamic plopaty を取得してプレイヤーのDPに書き込むのをまとめた処理を呼び出して保存すればいい感じですかね?

desert schooner
tawny granite
#

行数を見てください

#

あるいは見せてください

desert schooner
#

エラー吐いてるとこが42行目になっただけでエラー内容は全く同じですね・・・

tawny granite
#

reloadfinishというのはDPに格納できないオブジェクトですね

desert schooner
#

手に持ってるアイテムのIDをDPに保存したい場合はどうすればいいですかね・・・・

tawny granite
#

手に持ってるアイテムのIDをsetDynamicPropertyに渡してください

desert schooner
#

メインハンドのアイテムID取得は過去ログにあった気がするので見て確認してきます

tawny granite
#

既にアイテム自体はitemStackという変数に取得していそうですね

desert schooner
#

はい

long path
#

いま修正点を修正しながら見ていってるのですがreloadgunはItemStackですか?

#

出来れば最新のdata.jsが見たいです

desert schooner
#

テストはm16だけでやっているためm16以外のデータフィールドは無視してもらっておkです

desert schooner
#

一応確認です

long path
#

アイテムの取得では無いです

#

アイテムのtypeIdですね

desert schooner
#

IDが抜けてました・・

#

deta.jsでitemstackにするにはどうすればいい感じですか?

desert schooner
#

って意味ですね

long path
#

ItemStackクラスを使用して下さい

desert schooner
#

しかもリロード処理用の銃に置き換わってない感じですね・・・

desert schooner
tawny granite
#

修正後はどうなりましたか

desert schooner
#

リロード処理用の銃に置き換わらないだけですね・・・

#

確認したところタイプミスあったのでそれだけ直しましたが・・・

#

今試してる最中です

#

エラーなし 動作なしですね・・

tawny granite
desert schooner
#

なるほどです
new ItemStack(reloadgun)
って感じですか?

tawny granite
#

はい

desert schooner
#

こんな感じのエラー吐いてますね・・・

tawny granite
#

ItemStackをimportしてください

desert schooner
#

new ItemStack(reloadgun)
の後にですか? それとも一番上にですか?

tawny granite
#

1番上です

desert schooner
#

プレイヤーからconstしてるitemstackは消す感じですか?

tawny granite
#

消しません

#

ItemStackの先頭は大文字です。itemStackと区別してください

#

またnew ItemStack()は生成した<ItemStack>を返すので返り値を変数に保持するか直接引数に渡すなどしてください。ただ書くだけでは無意味です

desert schooner
#

なるほどです

#

スニーク左クリックしたスロットって保持できますか?

#

リロード中に持ちかえるとバグってリロード処理用の銃だけ残るので・・・

tawny granite
#

その時のselectedSlotをどこかに保持すればよいかと

desert schooner
#

const slot = player.selectedSlot;
みたいな感じですか?

tawny granite
#

はい。それをrunTimeout内で参照すれば良いと思いますいえまあやりたいように実装してください

desert schooner
#

inventory.container.setItem(damagingEntity.slot,itemStack);
こんな感じでいいでしょうか?

tawny granite
desert schooner
#

const reloadslot = damagingEntity.selectedSlot; でスロットを取って
inventory.container.setItem(reloadslot,itemStack); で置き換えればいい感じですか?

#

できました!

#

回答ありがとうございました!

#

またエラーとかわからないところ出たら質問すると思います・・・

desert schooner
#

こちらの機体の武装である機銃が自機に当たってしまうのですがどうすればよろしいでしょうか?(アイテム発射方式です)

desert schooner
#

アップデートによりこちらのコードが動かなくなってしまいました

#

エラーには

#

[Scripting][error]-Plugin [puchineko guns 2 - 1.0.0] - [main.js] ran with error: [SyntaxError: Could not find export 'Vector' in module '@minecraft/server']

#

と出ています

tawny granite
#

#script-api message
Vectorは削除されました

desert schooner
#

なるほどです

#

インポート元をminecraft/mathにすればいい感じですか?

tawny granite
#

mathを使う場合math自体をアドオン内に複製しないといけないですね

desert schooner
#

なるほど・・・

#

マイクソクオリティってことか・・・

long path
#

正規実装されていない が正しいかと

desert schooner
#

なるほど

#

こんな感じ・・ですか?

long path
#

正規実装されたものでは無いのでそこで指定する必要はありません

#

というかできません

desert schooner
#

???

long path
#

mathモジュールはアドオン自体に入れるためimport文だけで大丈夫です

desert schooner
#

こんな感じですか?

long path
#

配置の仕方次第ですが基本的には'./math/index.js'になります

desert schooner
#

import { Vector }from "./math/index.js"

#

こうですか?

#

[Scripting][error]-Plugin [puchineko guns 2 - 1.0.0] - [main.js] ran with error: [ReferenceError: Module [math/index.js] not found. Native module error or file not found.]
このエラーが出ますね・・・

desert schooner
tawny granite
#

多分これがいいんじゃないでしょうか

desert schooner
#

なるほど(元となるファイルがどこにあるのかわかってない)

desert schooner
#

何とか自力で複製してvector3インポートできましたがこちらのエラーが出てしまいますね・・・

#

minecraft-math.jsはmain.jsと同階層に複製してあってコードはこんな感じです

long path
#

minecraft-math.jsのdefault exportは何になっていますか

#

まあそもそもdefault exportされているものはわざわざfromで名前を変える必要は無いんですけどね

desert schooner
#

コレ・・・ですか?

long path
#

なんだこれ

desert schooner
#

#

minecraft-mathのdefault exportの部分です・・・

#

これ貼るのもしかしたらルール違反かもです・・・

long path
#

リンクを貰えれば

desert schooner
#

たしか”これですね・・

#

ダウンロードしたとこうろ覚えです・・・

long path
#

元コードがcommonだから把握しずらいな

zenith orchid
#
import mcmath from './minecraft-math.js'; // mcmathは好きな名前に```のようにインポートして、```js
mcmath.Vector3Utils.add(a, b)```のように使えます
desert schooner
#

なるほどです

#

弾が飛ばずに落ちるようになりましたね・・・

zenith orchid
#

エラーの通りminecraft/mathにはmultiplyはありません

#

代わりにVector3Utils.scaleを使ってください

desert schooner
#

わかりました

desert schooner
#

動作しました!

#

でも別の場所がダメになりました・・・

#

スニーク殴りでリロードなんですがリロード時にアイテム戻す処理が残弾0の時に起こらないんですよ・・・

tawny granite
#

52行のif文で、setItemがelseの方の60行目にしかないせいかと

desert schooner
#

なるほどです・・・(ディスコード開く前に自己解決しました・・・)

#

解答していただいたのにすいません・・・

desert schooner
#

マルチプレイ時にほかプレイヤーが素手の時のみ[Scripting][error]-TypeError: cannot read property 'typeId' of undefined at <anonymous> (main.js:100)と出て銃のシステムが動作しません・・・

#

現在のコードです

long path
#

行100とはどこです

#

desert schooner
#

if(gunData[itemStack.typeId]!=undefined){
になります

long path
#

単純に装備していない時の処理がないからでは?

desert schooner
#

なるほど!

desert schooner
#

if(itemStack.typeId!=air){
こんな感じですか?

long path
#

itemStackとundefinedを比較してください

desert schooner
#

.typeIdは不要ですか?

long path
#

存在しない可能性があるので不要です

desert schooner
#

なるほどです

long path
#

それを検知しその後の処理をしないようにする必要があるので絶対に着けては行けません

#

オプショナルチェーンを使用する場合は問題ありませんが

desert schooner
#

if(itemStack?.typeId!=undifined){
こういう場合なら問題ないという認識で大丈夫ですか?

long path
#

はい

desert schooner
#

なるほどです

desert schooner
#

専用アイテムをオフハンドに持つと専用UIを開いて銃のカスタムをできるようにしたいのですが可能でしょうか?
イメージとしてはhttps://i.ytimg.com/vi/JXKN7Fg13EA/maxresdefault.jpg
のようなUIを開いてアイテムのDPに書き込んでカスタムをアイテムモデルに適用する感じです

#

(画像は拾い物です)

desert schooner
#

アプデ対応したのですがこのようなエラーをはいてしまいます
原因を教えて頂けないでしょうか?

#

自己解決しました

#

追加で質問なのですがインベントリ内に特定のアイテムを持っているときだけリロード処理を実行するというコードはどのようにすればいいのでしょうか?

#

やり方としては再起処理ですべてのスロット探査しかないのでしょうか?

zenith orchid
#

再帰処理というよりは普通にforループだと思いますが、それはさておきインベントリ全てを調べてください

pulsar sable
# desert schooner 追加で質問なのですがインベントリ内に特定のアイテムを持っているときだけリロード処理を実行するというコードはどのようにすればいいのでしょうか?
function hasItemInInventory(player, itemId) {
    const { container } = player.getComponent('inventory');
    for (let i = 0; i < container.size; i++) {
        const item = container.getItem(i);
        if (!item) continue;
        if (item.typeId === itemId) return true;
    }
    return false;
}

プレイヤーのインベントリ内に指定したアイテムと同じものがあればtrueを返し、無かったらfalseを返すコードです

desert schooner
#

ありがとうございます!

pulsar sable
zenith orchid
#

hasItemInInventory関数を他で使わないのなら定義(function has...(...) { ... })を書く場所はそこでいいと思いますが、問題なのはすぐ下のifに書いてある関数の呼び出しです

関数を呼び出すときはfunction は書きません
呼び出し方はhasItemInInventory(damagingEntity, 'アイテムID')のような感じになるはずです

pulsar sable
tawny granite
#

(mc.はないことに注意

desert schooner
#

なるほどです

desert schooner
#

多忙なためなかなか試せなくて結果だせず申し訳ありません

desert schooner
#

現在こちらのコードでエラーなし動作せずとなっております・・・・

tawny granite
#

何をする部分が動作していないのですか

desert schooner
#

モード切替・リロードの部分のfunction以下ですね・・

tawny granite
#

function hasItemInInventory(reloaditem) {この様に宣言してhasItemInInventory(damagingEntity, reloaditem)この様に呼び出すのはおかしいですね

desert schooner
#

hasItemInInventory( reloaditem,damagingEntity)

#

で合っていますか?

tawny granite
#

というよりそもそも関数の実装が正しくない...どうしよう

tawny granite
# pulsar sable ```js function hasItemInInventory(player, itemId) { const { container } = pl...

まず関数の宣言自体はこれをそのまま使って良いです
これはplayerがitemIdの指すアイテムをインベントリに所持しているかを返す関数で、例えば以下のように使います

hasItemInInventory(damagingEntity, "minecraft:diamond")```
これはdamagingEntity(の指すプレイヤー)がダイヤモンドを持っているかをtrue/falseで返します
#

で、今行いたいことはdamagingEntityがリロードアイテム(const reloadgun = gunData[itemStack.typeId].reloadgun;の指すIDのアイテム)を持っているかを確認したいということでよいですかね
(data.js見てないからわからん

desert schooner
#

はい

#

銃の弾速や装弾数などを定義しているファイルで数値と文字の羅列です

tawny granite
#

あ、ちなみに関数が何かわからない場合は調べてください

desert schooner
#

一応調べて見よう見まねでかいてみたのですが・・・

tawny granite
desert schooner
#

変数いれるとこうなっちゃいますね・・・

tawny granite
#

引数としてreloaditemを受けながら、関数内ではreloadを使っているためですね

#

薄くなるのは使われていない変数を表します

desert schooner
#

凡ミスですね・・・

desert schooner
#

動作しました!
ありがとうございました!

desert schooner
#

銃のブレってどう編集すれば実装可能でしょうか?

#

data.jsでブレの度合いの変数を追加してそれに応じて着弾点をずらしたい感じです

zenith orchid
#

projectile.shoot(velocity, { uncertainty: 10 });のようにuncertaintyの値を増やすとブレます、0だと全くブレずに飛んでいきます。

desert schooner
#

ありがとうございます
今夜試してみます(予定があるので今日夜まで試せません)

desert schooner
#

動作しました ありがとうございました!

desert schooner
#

dynamicplopatyを使ってアイテムのモデルを追加で表示することってできますか?
イメージとしては銃のモデルに追加でサイトなどのカスタムパーツ(別ファイル)を表示する感じです

#

イメージとしては旧ゲリラアドオンのカスタム機能をスプリクト化した感じです

long path
#

※propertyです
attachablesから検出可能なものに変換さえしてやれば可能かとは思います

desert schooner
#

アニコン...とかでしょうか?

desert schooner
#

蓮根か

desert schooner
#

カスタムパーツのモデルと銃ごとの位置指定のアニメーションを用意してdynamicpropertyを検出してスプリクトでアニメーションを実行する・・・とかですかね?

desert schooner
#

残弾がない時でも発射アニメーションが実行されるバグ対策として残弾ゼロの際に発射アニメーションに移行しない銃に持ってるアイテムを変更するようにしたのですがモードや残弾等がundefinedになってしまいます

#

どのようにすればよろしいでしょうか?

#

(置き換え自体は動作しています)

tawny granite
#

分かっていたら何行目らへんの処理の何がundefinedなのかも書いてほしいです

desert schooner
#

リロード処理の残弾書き換え部分ですね

#

リロード演出用のアイテムに置き換えがうまくってないのと

#

残弾がundefinedになる感じですね

tawny granite
#

言葉で言われても探すのが大変なので具体的なコードや行数も教えてくださいという意味です

desert schooner
#

71から78行目です

#

inventory.container.setItem(damagingEntity.selectedSlotIndex,reload);//リロード用銃に置き換え
system.runTimeout(() => {
inventory.container.setItem(reloadslot,finishgun);
const itemStack = equipmentCompPlayer.getEquipment(reloadslot.Mainhand);
itemStack.setDynamicProperty("ammo", maxammo);
},reloadtime);
inventory.container.setItem(reloadslot,itemStack);
この辺が怪しいです

#

本来は演出用の銃に置き換えた後

#

アニメーション終了のタイミングで最大装弾数書き込んだ銃に置き換えてます

tawny granite
#

おそらくrunTimeout内で変更されたItemStackをsetしていないせいかと思われます

#

元のほうだとfinishgun、今書かれたものだとitemStackですかね

desert schooner
#

setするとこのようなエラーが出ますね

#

現状のコードです

tawny granite
#

78…?
多分constに再代入しようとして怒られてるのかと思います

#

75に見えますね

desert schooner
#

itemStack = new equipmentCompPlayer.getEquipment(EquipmentSlot.Mainhand);
こんな感じで大丈夫でしょうか?

tawny granite
#

というかnew…?

#

んーと
そこにおいてitemStackは42らへんで宣言されたconstのitemStackを参照します
constは再代入できないのでエラーになります

そしてnewというのはクラスやコンストラクタにつけて新たなオブジェクトを生成する演算子です
なんであるのか分かりませんが要りません

desert schooner
#

constを消すだけで大丈夫な感じですか?

tawny granite
#

変数宣言を理解してください
constを消したら宣言がなくなってしまいます
42のitemStackを上書きしてもいいならletを使ってもいいし、75で新たなitemStackの宣言をしても良いです
被りが嫌なら変数名を変えてください

desert schooner
#

なるほどです

desert schooner
#

このような形で別宣言を用意するのもいい感じですか?

#

また80から88行目のコードで本来ならこのような形でリロードアニメーション処理用の銃に置き換えているのですがこちらでは動作しません

#

どのようにすればいいですか?

desert schooner
#

リロードアニメーションの件は自己解決しました

#

現状ではundefinedになる問題のみのこってますね・・・

desert schooner
#

すいません

#

写真添付を忘れていたうえ自己解決しました

desert schooner
desert schooner
#

自己解決しました

desert schooner
#

ありがとうございました

desert schooner
#

39行目のコードの書き方について教えてもらいたいです
やりたいことは射撃時に撃ったプレイヤーをソースにダメージを与えることと銃弾でプレイヤーをキルしたときに
キルしたプレイヤー名はキルされたプレイヤーを射殺した
とキルログを変更したいです

#

どのようにすればよろしいでしょうか?

reef willow
#

projectileHitEntityの各種プロパティについて
sourceで投擲物を当てた本人であるエンティティを返します。
projectileには発射した投擲物エンティティ(銃弾のEntityID)等を返します
getEntityHitを使うと当てられたエンティティを返します。

イメージ

world.afterEvents.projectileHitEntity.subscribe((ev) => {
  const { source, projectile } = ev;
  const hitEntity = ev.getEntityHit.entity; //ヒットされたエンティティオブジェクトを返した分を参照するように宣言する。
  const HP = hitEntity.getComponent('minecraft:health).currentValue;
  if(HP < 0 && hitEntity.typeId == 'minecraft:player' && source.typeId === 'minecraft:player') {
  world.sendMessage(`${hitEntity.name} は ${source.name} に射殺された。`);
  //ヒットした時体力0になった、尚且つプレイヤーにやられたら発火するようにする。
  }
});

私はこうしてます。
イメージはこんな感じなので、他の方だと多分全く違うかもしれません。
スマホで手打ちしてるので構文エラー出るかもしれません。
あとはキルログはバニラのものと独自のものが同時に出ますのでゲームルールで消すのもありです。
または、バニラのテキストを変えるならリソパの言語ファイル辺りになります。

desert schooner
#

回答ありがとうございます

#

バニラのキルログを銃のダメージの場合のみ消したいときはどうすればいいですか?
beforeeventから ev.cancel = true
というのは何とかわかったのですがキャンセルするために死亡時にログを出すイベントがわからないので質問させていただきました

desert schooner
#

どうすればいいでしょうか?

zenith orchid
desert schooner
#

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

desert schooner
#

すいません フレンドと試したらエラーなし動作なしでした...

zenith orchid
#

32行目当たりのsource.getEquipmentですが、sourceはPlayerです。PlayerにはgetEquipmentというメソッドはありません。
他のところと同じようにEquippableコンポーネントを使ってください

これ以外にもミスがあるかまでは調べてないですが誤字などは丁寧に見直してみてください

desert schooner
#

わかりました

desert schooner
#

プレイヤーが向いている向きに乗っているモブに加速度かける方法はありますあk?

#

乗り物の制御をscriptapi化したく質問させていただきました

long path
#

プレイヤーのviewDirectionを任意の値増やしてapplyImpluseで与えてやれば良いかと

desert schooner
#

乗っているエンティティの取得はどうすればいいでしょうか?

long path
#

近いエンティティ取得でいいかと

#

精度を高めたいなら取得したエンティティのrideableコンポーネントから乗ってるプレイヤーを取得してid比較でもすればいいですし

desert schooner
#

回答ありがとうございます
しばらくの間多忙なので少し解答空くかと思いますがこれからもよろしくお願いします・・・

desert schooner
#

アプデ対応したらエラーも出ずに動作しなくなってしまいました・・・

#

原因を教えてもらえないでしょうか?

zenith orchid
#

モジュールのタイプが"data"になっていますが、ScriptAPIを使用したいなら"script"である必要がありますよ

desert schooner
#

#

すいません

#

これpuchineko guns 1(サポート終了)のほうのmanifestでした

desert schooner
#

自己解決しました

#

(なぜかPC再起で治った)

desert schooner
#

質問すいません
アプデ後にアイテムをもって右クリをやめた際の処理が動作しなくなってしまいました

#

原因等わかりますでしょうか?

tawny granite
#

エラーは出ていますか

desert schooner
#

特に出ていないですね

#

DMで実際のアドオン送りましょうか?

#

(確かDMで送るのはよかったはず)

#

コード書きなおしたほうが早いですかね?

desert schooner
#

このような形で連射が起きてしまいどのような改良を行ってもうまく作動しません
原因や修正方法等教えていだ焚けないでしょうか?

#

エラーログです

long path
#

エラーを見て順番に潰していきましょう

desert schooner
#

アイテムへのDPの書き込みがうまく動いてないみたいです・・・

desert schooner
#

アイテムの使用をやめたって処理もうまく動いてないみたいです・・・

desert schooner
#

=マイクソ案件説出てきた

undone nova
#

コードが謎いのでマイクソ案件ではないと思います...

desert schooner
#

もともと1.19.x系で書いたコードで1.20.x系になってから動かなくなってるんですよね・・・

undone nova
#

まだ同じエラーが出てるんですか?

desert schooner
undone nova
#

動画見れないですね...

desert schooner
#

再アップしました

undone nova
#

動作順序が不安定なものに依存していた場合もあるので書き直した方が速いかもしれないです
(コードの全貌が見えづらいので何とも言えないです)

desert schooner
#

なるほど・・・

desert schooner