Closed yokmama closed 3 years ago
試作中に問題が2つ発生しました。 ・1つ目 テレポートを使ってエンティティブロックを移動させると、サーバーの負荷とは関係なくカクカクした動きになる ・2つ目 プレイヤーの位置にブロックを発生させるとプレイヤーが押し出されてしまいMoveEventが発生する
1 えーと、テレポートではなく、Velocityだっけかな、加速度を設定してどっちのほうへ移動するっていうことをすれば、もっとスムーズにうごくとおもいます。
2 プレイヤーの当たり判定を0にする方法があったはず。
1は解決しそうですが、2は未だ解決せず。 そして新たな問題が発生しました。 エンティティーブロックが地面に触れた時、ブロック化してしまいます。
僕の環境では2は再現できませんでした。(Spigot 1.16.5です)
1は、テレポートがクライアント側に反映されるまでに時間がかかるのか、1秒間隔くらいでしか更新されませんでした。 加速度を使うことで多少ましになりました。
エンティティブロックがブロック化する問題については、
ことによって、ブロックを地面につけないようにすると回避できました。
ただし、歩き回っているとまれに、「ブロック化はしないが、アイテム化する」という現象が発生しました。 多分、ブロック化しようとしたときにブロックを設置できないためにアイテム化するのが原因です。
試した限りではブロック化はしなかったので、
という処理で一応対応できましたが、ブロック化する理由、ブロックが設置できない理由は特になさそうだったので、原因は不明です。
なので、一応対応法は見つかりましたが、これに関してはもう少し調査が必要かもしれないです。
...
[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回以上同じログが出たらブロックを作り直すというのが上で書いた解決策です。 アイテムがドロップしていました。
もしかしたら、FallingBlockがBlockになるという通信をProtocolLibで操作することで直せる可能性はあります 一旦上のやり方で作って、時間があればProtocolLibに置き換えるというのもありかもしれないです
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.
これかもしれないです
なるほど、地面につかなくても30秒したら強制的にアイテムに変換されちゃうのか、負荷をさげるための処置だろうね FallingBlockをつかわないといけないのかな? ほかに方法がないのかなとおもう。
テクスチャパックを使って、他のエンティティ(スライム?)をブロックの見た目にするというやり方ならできると思います テクスチャを使わない場合は、FallingBlock以外のブロックのエンティティがあればいいんですが、それは無さそうです
FallingBlockを偽装する手法がアイデアとして会話されているので、方向性としてはただしいかも このトピックが参考にならないかな? https://www.spigotmc.org/threads/rendering-custom-entities-as-blocks-any-ideas.114411/
カスタムEntityを作成する方法 動画では村人だけど、あとでなにかつかえるかも https://www.youtube.com/watch?v=B7fYVYYXkL4
エンティティブロックを続けて作り直すというアイデアはいいなと思います
プレイヤーが移動するときブロックに変身し移動できるようにみえる技術検証