プレイヤーごとにワールドをロードする方法

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