ZOIChannel / HideAndSeekPlugin

Apache License 2.0
0 stars 0 forks source link

ブロックが足元についてくるギミックの検証 #1

Closed yokmama closed 3 years ago

yokmama commented 3 years ago

プレイヤーが移動するときブロックに変身し移動できるようにみえる技術検証

ryosuke0818 commented 3 years ago

試作中に問題が2つ発生しました。 ・1つ目 テレポートを使ってエンティティブロックを移動させると、サーバーの負荷とは関係なくカクカクした動きになる ・2つ目 プレイヤーの位置にブロックを発生させるとプレイヤーが押し出されてしまいMoveEventが発生する

yokmama commented 3 years ago

1 えーと、テレポートではなく、Velocityだっけかな、加速度を設定してどっちのほうへ移動するっていうことをすれば、もっとスムーズにうごくとおもいます。

2 プレイヤーの当たり判定を0にする方法があったはず。

ryosuke0818 commented 3 years ago

1は解決しそうですが、2は未だ解決せず。 そして新たな問題が発生しました。 エンティティーブロックが地面に触れた時、ブロック化してしまいます。

ZOI-dayo commented 3 years ago

僕の環境では2は再現できませんでした。(Spigot 1.16.5です)

1は、テレポートがクライアント側に反映されるまでに時間がかかるのか、1秒間隔くらいでしか更新されませんでした。 加速度を使うことで多少ましになりました。

エンティティブロックがブロック化する問題については、

ことによって、ブロックを地面につけないようにすると回避できました。

ただし、歩き回っているとまれに、「ブロック化はしないが、アイテム化する」という現象が発生しました。 多分、ブロック化しようとしたときにブロックを設置できないためにアイテム化するのが原因です。

試した限りではブロック化はしなかったので、

という処理で一応対応できましたが、ブロック化する理由、ブロックが設置できない理由は特になさそうだったので、原因は不明です。

なので、一応対応法は見つかりましたが、これに関してはもう少し調査が必要かもしれないです。

ZOI-dayo commented 3 years ago
...
[14:22:49] [Server thread/INFO]: Location{world=CraftWorld{name=world_1},x=192.94810162460803,y=68.18675927506425,z=258.55339712580803,pitch=49.499657,yaw=-336.4265}
[14:22:50] [Server thread/INFO]: Location{world=CraftWorld{name=world_1},x=192.94810162460803,y=68.18675927506425,z=258.55339712580803,pitch=49.499657,yaw=-336.4265}
...
...
[14:21:25] [Server thread/INFO]: Location{world=CraftWorld{name=world_1},x=230.15356107094257,y=70.25918707874469,z=251.8425678735416,pitch=63.14988,yaw=-304.92838}
[14:21:26] [Server thread/INFO]: Location{world=CraftWorld{name=world_1},x=230.15356107094257,y=70.25918707874469,z=251.8425678735416,pitch=63.14988,yaw=-304.92838}
[14:21:26] [Server thread/INFO]: Location{world=CraftWorld{name=world_1},x=230.15356107094257,y=70.25918707874469,z=251.8425678735416,pitch=63.14988,yaw=-304.92838}
...

現象発生時の、PlayerMoveごとにFallingBlockの座標を出力したログです。(プレイヤーは全く別の場所にいます) ここで、2回以上同じログが出たらブロックを作り直すというのが上で書いた解決策です。 アイテムがドロップしていました。

ZOI-dayo commented 3 years ago

もしかしたら、FallingBlockがBlockになるという通信をProtocolLibで操作することで直せる可能性はあります 一旦上のやり方で作って、時間があればProtocolLibに置き換えるというのもありかもしれないです

ZOI-dayo commented 3 years ago

https://minecraft.fandom.com/wiki/Falling_Block

A falling block that has existed for more than 600 ticks (30 seconds) will destroy itself and drop as an item.

これかもしれないです

yokmama commented 3 years ago

なるほど、地面につかなくても30秒したら強制的にアイテムに変換されちゃうのか、負荷をさげるための処置だろうね FallingBlockをつかわないといけないのかな? ほかに方法がないのかなとおもう。

ZOI-dayo commented 3 years ago

テクスチャパックを使って、他のエンティティ(スライム?)をブロックの見た目にするというやり方ならできると思います テクスチャを使わない場合は、FallingBlock以外のブロックのエンティティがあればいいんですが、それは無さそうです

yokmama commented 3 years ago

FallingBlockを偽装する手法がアイデアとして会話されているので、方向性としてはただしいかも このトピックが参考にならないかな? https://www.spigotmc.org/threads/rendering-custom-entities-as-blocks-any-ideas.114411/

yokmama commented 3 years ago

カスタムEntityを作成する方法 動画では村人だけど、あとでなにかつかえるかも https://www.youtube.com/watch?v=B7fYVYYXkL4

ryosuke0818 commented 3 years ago

エンティティブロックを続けて作り直すというアイデアはいいなと思います