プレイヤーごとにワールドをロードする方法
題名がかなりざっくりしててすみません
skriptではないく、plugin自体作ってます
大規模サーバーではよく、プレイヤーごとに自由に建築できるスペースを用意しているのを見かけます
ほとんどの場合、みんながいるグローバルなワールドから、各プレイヤーごとの建築スペースに移動する場合、ロードが入っているので、ワールド自体を作っていると思うのですが、どのように実現しているのでしょうか?
本当にプレイヤーごとにワールドを作成しているのであれば、サーバーが起動するたびにロードしなければいけないworldがかなり多くなってしまい、起動時間はもちろん、容量とラグの面においてきついと思います
ワールドの必要な情報をDBで保存して、プレイヤーが入る際にそのデータを使用してワールドを作成し、抜ける際にまたDBの情報を上書きして、world消してる的なことをしてるんですかね?
24 Replies
Wynncraftの場合おそらく特定の座標(例えばx+100000など)にストラクチャをペーストしている感じかと。
かぶる場合は座標をずらす形で実装していそうです。
(ロードも入らないので多分同一ワールドで行ってるのかな)
Hypixelの場合は多分個別でサーバー作ってます
あれでいいんじゃないの
なんだっけ
こんな感じで。
ただこの機能使ってる人割と多いはずなんですけど毎回座標65536周辺な気がするのでもしかしたらghost blockとプレイヤーの非表示使って実装してる可能性はあります。
さすがにないとは思いますしそうするにしてもコストが高すぎるので座標分割したほうが早いかと
一つだけワールド作成して座標割り当てて終わりでも一応いい感じはしますね。さすがに大規模鯖だと厳しいとは思いますけど
ワールドいっぱい作れるプラグイン
読めよ
本当にプレイヤーごとにワールドを作成しているのであれば、サーバーが起動するたびにロードしなければいけないworldがかなり多くなってしまい、起動時間はもちろん、容量とラグの面においてきついと思います
あは
この方法を使用する場合、プレイヤーの島のようなテーマの小さいストラクチャであればいいと思うんですけど、大きめの構造物をプレイヤーごとに作りたい場合や、スカイブロックのようにプレイヤーの行動範囲が理論的には無限の場合などに問題が発生してしまうとおもうんですよね
一つのワールドをかなり広い規模でロードするよりも、複数ワールド作って、それぞれで処理を行った方が軽いというのもよく耳にするのですがそのようなことも踏まえると、ワールドを作成しているアルゴリズムを大体知りたいと思いました
なるほど。
ASkyblock プラグインとかちょっと見てきます。 プレイヤーごとにスカイブロックを作るようなプラグインなので参考になりそう
ASkyblockは座標での実装してますね...うーん。
そうっぽいですね
使用していないワールドをzip圧縮するとか方法はある気がしますけど容量問題はいずれ起きますし... 実装したことがないので僕だと厳しいかもです...
unload->圧縮
解凍->load
的な手順で
なるほど
そのような方法もあるのですね。わざわざ意見を下さりありがとうございました。
参考になるかはわかりませんけどお役に立てたなら幸いです
ちなみにだけど
mv coreは
ワールドのunloadとかできるからね
そもそもBukkitにunloadWorldってメソッドある
プレイヤーがそのワールドに入りたいって行った時にPRみたいに少し待ち時間設けてloadすればいい
あ
そっか
pluginつくってるのか
マジで説明読め
Threads Moderatorだろお前
unloadWorldってすでにloadしているworldをunloadするんですよね?
起動時にworld load
↓
プレイヤーごとのworldをunload
↓
プレイヤーが参加するworldをload
みたいな手順になるってことですかね?
bukkit.ymlでloadするかどうかをworldごとに指定できるのか
参加時に解凍してloadでいいかと。フォルダからワールドインスタンスが生成できるならですけど
この方法は一応可能なんですかね?
自分の技術ではバグだらけになりそう
本当にpacketとか使える人ならたぶんできなくはないんでしょうけど正直僕も実装できる自信ないです
mv-coreだと"configにワールドが存在すれば"フォルダーを消したり戻したりしてもload unloadが起動中にできるみたいです。
日本語おかしいな
load unloadを起動中に実施してフォルダーを消したり戻した理ができるみたいです。
BukkitのServer#getWorld(String)とか使えそうな感じしますけどどうですか
getWorldってすでにloadされてるworldを指定する際に使用されるメゾットであるように思います
とりあえず、
plugin起動
グローバルワールドのみ起動
↓
プレイヤーが自身のワールドに参加
プレイヤーのworldデータを解凍
worldCreatorでload
getWorldでworldの操作
↓
プレイヤーが自身のワールドから退出
worldデータをsave
worldをunload
ワールドデータを圧縮という形で実装してみます
getWorldってすでにloadされてるworldを指定する際に使用されるメゾットであるように思いますですよね... 了解です。実装がんばってください!
Solution
ありがとうございました。