#script-apiでパーティクルを表示させたい
1 messages · Page 1 of 1 (latest)
書くので少々お待ちを...
お願いします
import * as mc from '@minecraft/server'
mc.world.afterEvents.itemUse.subscribe(ev => {//アイテムを使ったとき
const { itemStack: IS, source: pl } = ev//プレイヤーとアイテムの取得
if (IS.typeId == 'minecraft:bow')//もし弓なら
{
//↓ (プレイヤーの頭の位置) から (地点Aから地点Bに向かって50進んだ座標を取得する関数(VectorForword) で取得した座標) まで 0.1ごとに座標を取得し、一つの座標を data に入れ、繰り返す
getPointToPoints(pl.getHeadLocation(), VectorForword(pl.getHeadLocation(), pl.getViewDirection(), 50), 0.1).forEach(data => {
pl.dimension.spawnParticle('minecraft:basic_flame_particle', data)//パーティクル召喚
})
}
})
function VectorForword(StartVec, DirectionVec, Step)//地点Aから地点Bに向かってStep進んだ座標を取得する関数
{
const Vec = new mc.Vector(StartVec.x, StartVec.y, StartVec.z).normalized()//地点Aを正規化(最大値を1にする的な) (1,2,3)だったら(1/6,2/6,3/6)になるはず。
return mc.Vector.add(StartVec, mc.Vector.multiply(mc.Vector.subtract(mc.Vector.add(DirectionVec, Vec), Vec).normalized(), Step))//地点A + (地点B - 地点A)のStep倍かけたやつ が返り値となる。
}
function getPointToPoints(StartPos, EndPos, Step)//地点Aから地点BまでStepごとに座標を取得する関数
{
const ret = []//空の配列ret(最終的に座標群が入る)
const distance = (Math.sqrt((Math.pow(StartPos.x - EndPos.x,2) + (Math.pow(StartPos.y - EndPos.y,2)) + (Math.pow(StartPos.z - EndPos.z,2))))) //三平方の定理を使い、地点Aから地点Bまでの距離を計算する
for (let i = 0; i < distance; i += Step) {// i(初期値は0) から (地点Aから地点Bまでの距離) まで繰り返す。一回終わったらiにStepを足す
ret.push(mc.Vector.add(StartPos, mc.Vector.multiply(mc.Vector.subtract(EndPos, StartPos).normalized(), i)))//地点Aから i 進んだ座標をretに追加する
}
return ret//ループされ沢山座標が追加された配列retが返り値となる。
}
たぶんこれで弓を引いたときにできるはずです
わざわざ分かりやすく書いていただいて本っ当にありがたいです!! こちらを参考にしつつ、自分でも書けるように頑張りたいと思います!!
こんな感じです
(最新バージョンがかわったので)下らへんの1.8.0を"1.10.0-beta"にする必要ありますね
あとはビヘイビアファイルにscriptsフォルダを作ってmain.jsの中にこれを書いたら動くはずです
//↓ (プレイヤーの頭の位置) から (地点Aから地点Bに向かって50進んだ座標を取得する関数(VectorForword) で取得した座標) まで 0.1ごとに座標を取得し、一つの座標を data に入れ、繰り返す
getPointToPoints(pl.getHeadLocation(), VectorForword(pl.getHeadLocation(), pl.getViewDirection(), 50), 0.1).forEach(data => {
const {x,y,z} = data//わかりやすいように座標を分裂させる(?)
//ここから下に処理を追加する
pl.dimension.spawnParticle('minecraft:basic_flame_particle', data)//script-apiでのパーティクル召喚方法
pl.runCommand(`particle minecraft:basic_flame_particle ${x} ${y} ${z}`)//あんまりお勧めしないけどコマンドを使う方法(コマンドを使う方が処理が重いらしい)
pl.dimension.getEntities({maxDistance:1}).forEach(entity=>{//座標から1ブロック離れたエンティティをすべて取得し、一体ごとに処理をする
entity.applyDamage(5)//5ダメージ与える
})
pl.runCommand(`execute as @e[x=${x},y=${y},z=${z},r=1] run damage @s 5`)//あんまりお勧めしないけどコマンドを使う方法(コマンドを使う方が処理が重いらしい)
//ここから上に処理を追加する
})
弓の場合を通った先の処理をこれにしてみてください
たぶんダメージが入るようになるはずです
何から何まで本当に感謝しかないです! これでアドオン製作が捗ります。自分でも色々試してみたいと思います!!
全体的な資料
https://learn.microsoft.com/ja-jp/minecraft/creator/scriptapi/minecraft/server/minecraft-server?view=minecraft-bedrock-experimental
プレイヤーに関する資料(pl.なんちゃら に続ける)
https://learn.microsoft.com/ja-jp/minecraft/creator/scriptapi/minecraft/server/player?view=minecraft-bedrock-experimental
イベントに関する資料(アイテムを使った時以外もあるよ)
(mc.world.afterEvents.なんちゃら.subscribe に続ける)
https://learn.microsoft.com/ja-jp/minecraft/creator/scriptapi/minecraft/server/worldafterevents?view=minecraft-bedrock-experimental
頑張ってください!!