RustのPlusUltraサーバではOxide Modを使用して接続後にパスワード入力を必須にしたり資材の再収量を増やしたりしています。これらの昨日はそれぞれプラグインとして作られていて、サーバ管理者はOxideのサイトからプラグインのソースコード(今はだいたいC#製)をダウンロードし、指定の場所に設置して使います。

先日のサーバを一般公開にするかどうかで悩んでいた時に、一般公開にするけどPlusUltraのメンバーは優先的にログインできるようにしたかったのですが、それに該当しそうなプラグインはReservedくらいで、このプラグインには優先プレイヤーが接続するために一般メンバーを自動でキックするような機能はなく、ちょっと物足りない感じでした。

自分で書いてみた

GitHubにPrioritySlotという名前で置きました。

C#は使ったことがなかったので悩みましたが、他のプラグインのソースコードとかを参考にしながらとりあえず動くかなレベルまではもってこれたように思います。最初はReservedプラグインをちょっといじる程度のつもりでしたが、色々書いているうちにほとんどの箇所を書き換えてしまっていたので別プラグインという扱いにしています。

特徴(Reservedプラグインとの相違点)

  • 優先枠、一般枠を超えるプレイヤー数になったときの挙動を設定できるようにしています。初期設定では優先プレイヤーが優先枠を超えた場合、一般枠に空きがあれば接続が可能です。一般プレイヤーが一般枠を超える場合は優先枠に余裕があっても接続はできません。これらの挙動については[oxide_dir]/config/PrioritySlot.jsonファイルを編集し、プラグインをリロードすることで変更が可能です。
  • 満員状態で優先プレイヤーが接続してきた場合、一般プレイヤーをキックすることができます。キックされるプレイヤーは一般プレイヤーの中からランダムで選ばれ、寝袋やベッドを設置している場合はその位置にテレポートした上でキックされます。キックする/しない、キックする際にテレポートする/しない、キックまでの猶予時間は設定変更が可能です。
  • チャット欄に/slotstatsと入力すると現在の枠ごとの接続数などを返します。

こんなところです。

まだテスト中

ローカルでRust Dedicated Serverを起動して動作試験をしていますが、これだと接続数が1にしかならないのでちゃんとしたテストはできていなかったりします。ロールを付けたり外したりして一般枠、優先枠に割り振られるか、最大接続数を1、優先枠を0や1にしてロールの有無で接続できる/できないが変わるか、テスト用コマンドを作って自動キックが働くかくらいは確認するのが限度です。

接続時の人数調整のうち判定部分(接続可否や自動キック対象者選定)は関数に切り出しているので、C#(Visual Studio)でのテストコードの書き方がわかればなんとかシミュレートできるかもしれないんですが、「単体テストの作成」をしようとすると「パブリッククラスかパブリックメソッド内の非テストプロジェクトでのみサポート云々」と怒られてしまうので結局書けず。実際に3~5人くらいで実地試験するしかないかな~

もしこのプラグインを使ってみようとかいう酔狂な方がいらっしゃいましたら、ちゃんと動くかどうか教えていただけるとありがたいです。