Palworldサーバーにシステムメッセージを送る機能を追加する
概要
Palworldサーバーにシステムメッセージを送る機能を構築する。
- RCONのシステムを構築する。
- cronを使用した定期実行化。
背景
現状、サーバーは夜稼働しているが、稼働終了時刻になるとなんの前触れもなくサーバーが落ちる。
時間を忘れて熱中していたら、いきなり落ちてびっくりするので、時報のシステムがあれば、プレイヤーに優しい。
目的
サーバーが落ちる数分前に、システムメッセージの時報を定期的に送りたい。
環境
Ubuntu Server 20.04 LTS x64
調査
RCON(Remote Console)というプロトコルを使用すれば実現できるらしい。
https://developer.valvesoftware.com/wiki/Source_RCON_Protocol
ライブラリは様々な言語で提供されていた。
準備
Palworldのワールド設定ファイルの必要項目を設定しておく。
- RCONEnabled:True
- RCONPort:25575(初期値)
- AdminPassword:<password>
RCONクライアントの導入
今回はC言語で提供されているライブラリを使用する。
$ apt-get install build-essential cmake check libbsd-dev libglib2.0-dev $ mkdir build $ cd build $ cmake .. -DCMAKE_INSTALL_PREFIX=/usr $ make $ sudo make install
コマンドテスト
Palworldのコマンドを実際に実行して疎通確認をする。
https://tech.palworldgame.com/server-commands
コマンドは、チャット時のコマンドのように、頭に「/」は付けない。
ここのパスワードはワールド設定のAdminPasswordを指す。
- 構文
$ rcon -H <hostip> -p <port> -P <password> <コマンド>
- テスト
$ rcon -H localhost -p 25575 -P <password> Broadcast "go_to_bed"
メッセージテキストは、空白の手前までしか送信できなかったので、仕方なく「_」で繋ぐことにした。後、日本語を書くと文字化けする。
また、このコマンドだけだと動作はするが、謎のエラーが発生した。
(process:1283): GLib-CRITICAL **: 17:03:16.615: g_byte_array_remove_range: assertion 'index_ + length <= array->len' failed
これを解決するためには、timeoutコマンドで、コマンドに制限時間を短時間付けると解消できる。
- 参考
$ timeout 2 rcon -H localhost -p 25575 -P <password> Broadcast "go_to_bed"
cronで定期実行化
RCON実行スクリプトの作成
RCONのコマンドを実行するスクリプトを作成する。
$ sudo -u steam -s $ cd /home/steam/scripts $ vi pal-server-command.sh
#!/bin/sh MESSAGE="go_to_bed" timeout 2 rcon -H localhost -p 25575 -P <password> Broadcast $MESSAGE
$ chmod u+x pal-server-command.sh
cronの設定
https://qiita.com/hikouki/items/e744b3a4d356d2af12cf
先ほどの実行スクリプトを2:20に実行するように設定してみる。
$ EDITOR=vi crontab -e
20 2 * * * /home/steam/scripts/pal-server-command.sh
cronサービスの再起動
$ sudo systemctl restart cron
動作確認
ゲーム内で指定した時間に、設定したシステムメッセージが来ればOK。
おわりに
定期的なシステムメッセージを送信する機能を実装した。
できれば日本語対応とかしたい。