ほのぼの技術部

技術系記事

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言語で提供されているライブラリを使用する。

https://github.com/n0la/rcon

$ 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。

おわりに

定期的なシステムメッセージを送信する機能を実装した。

できれば日本語対応とかしたい。