見出し画像

ドズル社キャラバンメイキング(システム編)

この記事は後編です。前編はこちら

こんにちは、ジョニキです。#ドズル社キャラバン もついに終わってしまいましたね。今日の記事は、今後ドズル社キャラバンのような大規模ワールドを作ってみたいシステム屋さんに向けて、裏で動いていたシステムをどうやって作っていけば良いのか、内容やその方針の紹介を少しだけしたいと思います。守秘義務的なものもあるので公表されている数字や見りゃ分かるよ、みたいな情報を上手く使って紹介していきます。
製作者以外の方が読んでも「???」な内容なのはご了承ください。私も設定年齢100歳のおじいちゃんなので早く後継者を探さないといけないのです。

1.ドズル社キャラバンとは?

ドズル社×JCU共同開発のJava版Minecraftの参加型有料ワールドです。
(JCUさんにて統合版の方も開発中みたいです。統合版の方は発売されるのを気長に待ちましょう。)

Minecraftを使用した新たな体験型イベントで、JAVA版限定の有料サーバーです。 チケットを購入していただくと、開催期間中ワールド内を自由に遊んでいただけます。 高みを目指して冒険するもよし、アイテムを集めるもよし、のんびり過ごすもよし、自由な体験が待っています!

https://www.dozle.jp/caravan_2/

2.まずは要件定義みたいなところから

前回の記事ではゲーム化するにあたっての「コンセプト」を決めましたが、そもそもは「ドズル社キャラバンをどうしたい」みたいなものを先に決めてもらう必要があります。分かりやすいところで言うと、ターゲット層がどれくらいで、同時接続(同接)どれくらいを見込んでいて、何時間オープンして、とかそんなやつです。
それを決めると「サーバーの台数」「ワールドの分割の仕方」「同接何人で動くコマンド」などの具体的な中身の話をすることができます。例えば、公表されている数字で言うと、昨年年末のドズル社神社や今年のドズル社ランドでは「同接1000人越え!」という話が出ています。それを踏まえると、ドズル社キャラバンも同じかそれ以上なんだろうな、という発想はすぐに想像できると思います。そういう話を何回かやっているうちに「ワールドの分割の仕方」みたいなものがどんどん明確になって行きます。例えばこんな感じ。

クエストをうろうろしてもらった人は、各エリアの同接の上限が100人になっていることに気づいたと思います。理由は感覚的なものだったりもしますが、過去に「100人でエンドラ討伐してみた」企画や、ドズル社ランドの「襲撃イベント」で 「Mob 討伐は数百人になると結構キツイ」ことが分かっていたので、ざっくり100人!みたいに決めています。そうするとそこからサーバーの台数なども逆算していくことができます。ベリンゲイは全てのエリアの中間地点になるので「1000人以上くるのかなぁ。」という感じです。

2.x 非機能要件みたいなもの

「要件定義」とは別腹で「非機能要件定義」というものがあります。ドズル社キャラバンではほとんどやっていませんが、例えば「どのぐらいカクカクしてもOK」「ベリンゲイのワールドが壊れたら何秒後に再ログインできる」「予備のサーバーを何台用意する」とかそういうやつです。この辺を決めていくと「コマンドでどのくらいカクカクするとまずいか」みたいな目標も決めることができます。議論はいっぱいしたものの今回の記事ではここは割愛します。

3.キャラバンを支えるシステム系の作り物

ワールドの構成などが決まったところで作り物の議論も同時に始まっていきます。それは前回の記事で紹介したとおりですが私は主にシステム関連に手を付けて、演出系は3歳児の qpPENGUINqp に全て任せました。qpPENGUINqp に課した任務は「コマンド数は10000以内目安で。」だけであとは自由にやってもらいました。10000コマンドというのは多いように見えるのですが、プレイヤー1人当たりに使える 1tick(50ミリ秒) 内のコマンド数がベリンゲイだと÷1000=10コマンド、クエストエリアでは÷100=100コマンドと尋常じゃないくらい少ないコマンド数で動かす必要があります。ほぼ「 tick は使うな。」というのと同義です。
ということで、システム系はデータパックで作ると無駄な tick 内のコマンドが増えてしまうため、イベントリスナー(プレイヤーが特定の行動をしたときのみサーバーの CPU が消費される)を使ったプラグインとして開発を行います。

3.1.各種便利機能やBAN機能

ドズル社キャラバンはエリア毎にできることが違います。例えば「金床を使えるワールド」「釣り竿が使えるワールド」「マイニングができるワールド」などです。スイッチのON/OFFで制御するようなプラグイン1つにまとめて開発して、あとはデータパックでそのスイッチを制御するようにすることで、ワールド内からコマンド1つでエリア毎の特色をON/OFFすることができるようにします。ということで、なんとなく必要になりそうな以下の機能を用意することでデータパックのコマンド数を節約することにしました。
 ・ログイン時処理
 ・ログアウト時処理
 ・右クリック処理
 ・左クリック処理
 ・アイテム泥棒の無効化
 ・レアアイテムポイ捨て無効化
 ・TNTの無効化
 ・釣りの無効化
 ・経験値オーブの無効化
 ・金床の無効化
 ・採掘の無効化
 ・クラフトの無効化
 ・チャットの無効化

3.2.role(権限)

ネコヘーヤでの採掘有効化を考えているときに副産物が生まれました。今回のワールドは JCU さんが作っていることもあって、ドズル社メンバーや我々がクリエイティブモードでワールドを破壊するとだいぶ悲しいことになります。そこでクリエイティブモードでの採掘をBANして、特殊な権限を持ったメンバーだけがクリエイティブモードで破壊行為をできるようにしました。結果的に role は以下の5種類になりました。
 ・ドズル社メンバー
 ・ドズル社キャラバンを宣伝するインフルエンサーの皆様
 ・JCUメンバー
 ・スタッフ
 ・冒険者達

3.3.スコアボードと進捗

既に説明したとおりでドズル社キャラバンは複数のサーバー、ワールドで動いています。各ワールドで同じようにコマンドを動かすためには、各ワールドのスコアボードと進捗を全部のワールドで共有する必要があります。そのようなプラグインはこの世に存在してなさそう(公開されてなさそう)だったので自分で作る必要がありました。なので作りました。

ドズル社ランドでは一部のワールドでインベントリが共有されており、今回もその要件がありました。なのでその機能を流用して、各プレイヤーのスコアボードと進捗をエンダーチェストの「ぼんじゅうる人形」に紛れ込ませました。採掘したブロックの数や、アスレチックの記録などのスコアボードから、クエスト受注/達成などの進捗情報が実は「ぼんじゅうる人形」の中に埋め込まれていました(一部バグがあってクエスト情報は消失してしまいましたが・・・)。

それとは別で一部のスコアボードはプレイヤーを介していないのでプレイヤーのインベントリを使うことができませんでした。苦肉の策で、マインクラフト外のデータストアに書き出して、別のワールドでそれを読みこむことで疑似的にスコアボードを共有しました。定期的に更新されるドズコインのレートや各ワールドのログイン人数などの情報です。更新頻度が多い時にはデータベースを用意した方が良いかも知れませんが今回はこれで十分でした。

3.4.リアルタイム連動

おなじみのリアルタイム連動です。現実の時間と連動してドズル社キャラバンの時間も経過させています。この後説明する負荷を計測するために1ナノ秒精度で時間が測れるようにしました。私の配信のサムネは11月13日5時8分59秒に撮られたスクリーンショットで現実世界の時間と連動しています。朝日がまぶしかったです。

3.5.負荷、負荷、とにもかくにも負荷

100人、1000人で動くコマンドを書くにはほんのちょっとの重たいコマンドが命とりになります。1人あたり1マイクロ秒かかるコマンドを書いたものならその時点で×1000=1ミリ秒・・・うーん、みたいなことが起きます。ということで、コマンドの負荷を計測するプラグインを作って qpPENGUINqp に渡して「重くなったら要相談。あとは自由にやってくれ。」とほぼ放任主義で頑張ってもらいました。

3.5.1.マルガリタ迷宮

マルガリタ迷宮の迷路は全部で4ステージありますが、1ステージ当たりのブロック数は最大で 73,728 ブロックあり、マインクラフトの fill コマンドなどの上限 32,768 ブロックを超えています。ようするにその数以上を fill しちゃダメってことです。ということで、1 tick でパチッと切り替えることができません。なので1ステージごとに、裏/表の2面を用意して、合計8個の迷路のうちみんなが遊んでいない方、半分の4つの迷路を裏でこっそりと作る作戦にしました。1tick で設置するブロックの数を1区画: 12×12×8=1,152 ブロックに分割して最大で 64 tick かけて1ステージ(64区画)を作るイメージです。これを各ステージ毎にずらして4つ作成すれば、サーバーに大きな負荷をかけずに迷路を作ることが出来ます。最初は何も考えずに4ステージ作ったところ、迷宮崩壊とともにピクリとも動かなくなったので深夜に1人で白目をむいてました。

3.5.2.スコアボードと進捗の共有

マインクラフトの外にあるデータストアと情報を読み書きすることになるので、マインクラフトのゲーム内時間とは非同期な時間で動く必要があります。プラグインにはこれを実現するための非同期処理というものがあります。マインクラフトと同期するイベントリスナーは同期処理、同期しないもの(現実世界の時間で動くもの)は非同期処理と2つを分けてプラグインを作ることで、現実世界のサーバーの負荷でマインクラフトの中の tick が遅れることを防ぎます。社内プレオープンのときには人が数人でもクエストでモブが一定時間ごとにカクッ、カクッと不自然な動きをしていたんですが、みんなからの問い合わせが多かったので直しました。お問い合わせは大事です。

4.おわりに

色々書いたところで力尽きました。帰省の時間になったのでここで終わります。ドズル社キャラバンを作りたいシステム屋さんはプラグインが書けるように Java 言語と、システム作りのための要件定義/非機能要件定義の勉強をしましょう。

おわり。

この記事が気に入ったらサポートをしてみませんか?