移動中にブロックの側面にぶつかった判定方法
移動中にブロックの側面にぶつかった判定方法を知りたいです。
Purpur #2001 MC 1.20.1
Skript 2.7.0-beta3
『バニーホップ』が使えるSKを作っています。バニーホップとはダッシュ状態でジャンプし続けると通常より加速する現象を利用した移動方法です。
大枠はできたのですが、MCの場合、段差にぶつかって止まってしまうことが多いです。これを解消するために、ブロックの側面にぶつかったときに強制ジャンプをさせるような挙動にしたいです。
ブロックの側面にぶつかった判定の取り方がわかりません。ご存じの方は教えていただければ幸いです。
また、同様の挙動を実装する別の実装方法のアイデアなどありましたらご教授ください。
よろしくお願い致します。
4 Replies
役に立つかはわかりませんが
こちら、『走って板ガラスにぶつかったら勢いそのまま貫通する』skriptです
ざっくり説明すると,
while player is online
で1 tick毎にplayerの位置を比べ、その差をvelocityとして保存し
every 2 tick
でplayerからvelocity分先にブロックがあるかどうか確認し
そのブロックがガラスならvelocity x2 分tpして疑似貫通させる構造です
https://discord.com/channels/545926404785569793/625599177895968768/1128620708642172928
要するに『playerのvelocity分先のlocationのblock』を取得すれば
疑似的にぶつかるブロックを取得できるってことですブロックにぶつかったとき、velocityが0,0,0になることを使えるかも
yは0.8だったかも
yには常に重力(なぜか8)がかかる
お二方ありがとうございます。参考にしてやってみます・・・!!
直接壁にぶつかった判定って無いんですね。エリトラで壁にぶつかるとダメージ入るので似たような判定があるのかと思ってました。
set {loc.2.%player's uuid%} to location at player's head ~ {velocity.%player's uuid%}
set {_block} to block at {loc.2.%player's uuid%}
"%type of {_block}%" contains "grass_block"
send "HIT!!"
判定部分を真似てコード書いてみているんですが、なかなかうまくいきませんね・・・
head削ったけどだめだな・・・
set {block.%player's uuid%} to block at location at player ~ {velocity.%player's uuid%}
send "%type of {block.%player's uuid%}% HIT!!"
🤔
on player move:
player has permission "bunnyhop.use"
set {loc1.%player's uuid%} to player's location
wait 1 tick
set {velocity.%player's uuid%} to vector from {loc1.%player's uuid%} to player's location
# normal length of {velocity.%player's uuid%} > 0
# player is not on ground
set y component of {velocity.%player's uuid%} to 0
set {hitblock.%player's uuid%} to type of block at location at player ~ {velocity.%player's uuid%}
{hitblock.%player's uuid%} is grass block
send "%{hitblock.%player's uuid%}% HIT!!"
なんとなく動くものができました。
set {loc1.%player's uuid%} to player's location
wait 1 tick
set {velocity.%player's uuid%} to vector from {loc1.%player's uuid%} to player's location
normal length of {velocity.%player's uuid%} > 0
player is not on ground
set y component of {velocity.%player's uuid%} to 0
set {hitblock.%player's uuid%} to type of block at location at player ~ {velocity.%player's uuid%}
{hitblock.%player's uuid%} is not air
{hitblock.%player's uuid%} is grass block
とりあえず一段落するまでコードができました。ありがとうございました。