移動中にブロックの側面にぶつかった判定方法

移動中にブロックの側面にぶつかった判定方法を知りたいです。 Purpur #2001 MC 1.20.1 Skript 2.7.0-beta3 『バニーホップ』が使えるSKを作っています。バニーホップとはダッシュ状態でジャンプし続けると通常より加速する現象を利用した移動方法です。 大枠はできたのですが、MCの場合、段差にぶつかって止まってしまうことが多いです。これを解消するために、ブロックの側面にぶつかったときに強制ジャンプをさせるような挙動にしたいです。 ブロックの側面にぶつかった判定の取り方がわかりません。ご存じの方は教えていただければ幸いです。 また、同様の挙動を実装する別の実装方法のアイデアなどありましたらご教授ください。 よろしくお願い致します。
4 Replies
Tsukineko(月雲)
役に立つかはわかりませんが こちら、『走って板ガラスにぶつかったら勢いそのまま貫通する』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』を取得すれば 疑似的にぶつかるブロックを取得できるってことです
unnnnnnnnnnn
unnnnnnnnnnn12mo ago
ブロックにぶつかったとき、velocityが0,0,0になることを使えるかも yは0.8だったかも
Tsukineko(月雲)
yには常に重力(なぜか8)がかかる
ゆきあ
ゆきあ12mo ago
お二方ありがとうございます。参考にしてやってみます・・・!! 直接壁にぶつかった判定って無いんですね。エリトラで壁にぶつかるとダメージ入るので似たような判定があるのかと思ってました。 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 とりあえず一段落するまでコードができました。ありがとうございました。
Want results from more Discord servers?
Add your server
More Posts
SkrayfallとかSkellett入れた状態でのチームSkrayfallのfastscoreboadみたいなのはオフにしたんですけど それでもチームの色とか当たり判定、ネームタグの設定とかが使えないです たすけてlistからランダムにn個取得`{tasks::*}`というオブジェクトからn個ランダム取得を実装するために `set {_taskList::*} to shuffled {tasks::*}` して、__最初のn個を取得__とskRayFall以外でscoreboardのsidebarをいじる方法コマンド以外でどなたか方法知りませんか ※skrayfall入れると他のアドオンと競合して死ぬため入れられませんデフォルトskriptの構文がなぜか[cant understand this conditions]https://skripthub.net/docs/?id=3738 ↑これがなぜか使えないです ``` on load: set {space2} to "&f&m&n "やったぜ。千束「たきながぁ、たきなが怖いぃ!」ガタガタ  たきな「誤解です!誤解ですから!」  千束「たきなに犯されるぅ!」ブルブル  たきな「やめてください!」  たきな「本当に誤解なんで死んだらダウン状態になるSkriptをつくりたい!死んだらその場で寝転がる状態になり、自分の視点では回りが赤くなるエフェクトなどを入れてみたいです。 ダウンしているplayerを何回か殴ると蘇生される仕組みにもしたい。tablistのplayer nameの変更``` every 5 tick: loop all players: set scaled health of loop-player to 10 set lCSPのトレイルをskriptで作りたいCS,CSPをskriptで再現したいのですが、CSPのtrailは「~ブロックごと」というのがあります。 矢をかなりの速度で飛ばすため、Skriptの「1tickごと」だとかなりの間隔が空いてしまいlocationA ~ locationBのエリアにplayerが入っていることを検知するために、以下のコードを書きました ``` every 5 tick: #broadcast "%blocks within location(-1000.5,4.5,3.5) and l半円の回転正面に斬撃を出す、っていうことをしたいんですが この半円をどうやって向いている方向に出すか(回転させる?)かが分かりません