BF2142 dedicated server revive

ただし今度はWindows版ですねん 

以前にGameSpy滅亡後GameSpy互換サーバーとしてOpenSpyが動いている件について書きましたが、それはクライアント側の話でした。

BF2142のdedicated serverをしばらくLinux版として動かしていましたが、今回久しぶりに動かそうとすると、動きそうに見えますが実際にはJoin直後にWindows版クライアント側が落ちる不具合が発生しました。Debian Bookwormでは動いていたのですがね。Trixieでは、最初の

nao@ghost:~$ ./rerun.sh
##########################
# Bf2142 Server Starting #
##########################
To stop the restarting press Ctrl+C when the server is being restarted

/home/nao/bf2142/bf2142/bin/amd-64/bf2142: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
/home/nao/bf2142/bf2142/bin/amd-64/bf2142: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
/home/nao/bf2142/bf2142/bin/amd-64/bf2142: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory

をまず回避しないと動きません。ま、手はあるので、

root@ghost:/usr/lib/x86_64-linux-gnu# ln -s libncurses.so.6.5 libncurses.so.5
root@ghost:/usr/lib/x86_64-linux-gnu# ls -alt libncurses*
lrwxrwxrwx 1 root root     17 Mar  3 11:11 libncurses.so.5 -> libncurses.so.6.5
-rw-r--r-- 1 root root 164372 Mar  7  2025 libncurses++.a
-rw-r--r-- 1 root root 164372 Mar  7  2025 libncurses++w.a
-rw-r--r-- 1 root root 323252 Mar  7  2025 libncurses.a
-rw-r--r-- 1 root root     31 Mar  7  2025 libncurses.so
lrwxrwxrwx 1 root root     17 Mar  7  2025 libncurses.so.6 -> libncurses.so.6.5
-rw-r--r-- 1 root root 169984 Mar  7  2025 libncurses.so.6.5
-rw-r--r-- 1 root root 442302 Mar  7  2025 libncursesw.a
-rw-r--r-- 1 root root     32 Mar  7  2025 libncursesw.so
lrwxrwxrwx 1 root root     18 Mar  7  2025 libncursesw.so.6 -> libncursesw.so.6.5
-rw-r--r-- 1 root root 235520 Mar  7  2025 libncursesw.so.6.5

というように偽装すれば一応通ります。が、上に書いた不具合が発生したので、アボートしました。で、Windows版のdedicated serverを使うことにしました。

ここからダウンロードします。server本体Gamespy->Openspyのパッチを当てるプログラムの両者をゲットします。

patchの方は、

比較的丁寧な手順が示されているので、大丈夫でしょう。サーバーの設定は、

に習いますが、maplist.conとserversettings.conは最低限手を入れる他、

上記の

というRouterないしHGW(Home Gate Way)のPort Forwardの設定だけでは不十分です。以前は面倒なのでDMZにしていましたが、Security上好ましくはないので、以下のような設定で一応動いています。つまり自分自身もJoinできるし他のプレイヤーが外部からJoinできます。

192.168.0.201がWindows版bf2142サーバーが動いているマシンのローカルIPアドレスです。なんでPort Forwardが必要なのかは、

を参考にしてください。また上に掲載した設定は、“必要かつ充分である”とは限りません。冗長な部分があるかもしれませんし、逆にVoIP関係は振っていません。また、LANからサーバーにJoinするためには、”local”でリストしないと出てきません。外からならば見えてJoinできるようです。(ここが一番重要な点ですね。)それを検証するために、

のGamedigを使いました。cronで定期的に駆動するスクリプトは、Debian Trixieから、

#!/bin/bash

first=`date '+%Y/%m/%d %H:%M:%S'`
second=`/usr/local/bin/gamedig --type battlefield2142  192.168.0.201:29900 | /usr/bin/jq  -r '[.map,.numplayers] | join(",")'`
third=`/usr/local/bin/gamedig --type battlefield2142  192.168.0.201:29900  | /usr/bin/jq -r '.players[] | select(.raw.pid != 0)' | jq -r '.name' `

if [ -n "$third" ]; then
        echo $first,$second,$third
else
        echo $first,$second
fi

出力例は、

2026/03/06 02:50:01,Highway_Tampa_coop,1, HanzSoloo
2026/03/06 03:00:01,Highway_Tampa_coop,2, RSlicker HanzSoloo
2026/03/06 03:10:02,Highway_Tampa_coop,1, HanzSoloo
2026/03/06 03:20:01,Suez_Canal_coop,2, pietko HanzSoloo
2026/03/06 03:30:01,Suez_Canal_coop,2, pietko HanzSoloo
2026/03/06 03:40:01,Suez_Canal_coop,2, HanzSoloo pietko
2026/03/06 03:50:01,Sidi_Power_Plant_coop,2, pietko HanzSoloo
2026/03/06 04:00:01,Sidi_Power_Plant_coop,1, HanzSoloo
2026/03/06 04:10:01,Sidi_Power_Plant_coop,2, HanzSoloo agathyus
2026/03/06 04:20:01,Liberation_of_Leipzig_coop,0
2026/03/06 04:30:02,Liberation_of_Leipzig_coop,0
2026/03/06 04:40:01,Liberation_of_Leipzig_coop,0
2026/03/06 04:50:01,Liberation_of_Leipzig_coop,0
2026/03/06 05:00:01,Liberation_of_Leipzig_coop,0
2026/03/06 05:10:01,Liberation_of_Leipzig_coop,0
2026/03/06 05:20:01,Liberation_of_Leipzig_coop,0
2026/03/06 05:30:01,Liberation_of_Leipzig_coop,0
2026/03/06 05:40:01,Liberation_of_Leipzig_coop,0
2026/03/06 05:50:01,Liberation_of_Leipzig_coop,0
2026/03/06 06:00:02,Liberation_of_Leipzig_coop,0
2026/03/06 06:10:01,Liberation_of_Leipzig_coop,0
2026/03/06 06:20:01,Liberation_of_Leipzig_coop,0
2026/03/06 06:30:01,Liberation_of_Leipzig_coop,0
2026/03/06 06:40:01,Liberation_of_Leipzig_coop,0
2026/03/06 06:50:01,Liberation_of_Leipzig_coop,0
2026/03/06 07:00:01,Liberation_of_Leipzig_coop,1, agathyus
2026/03/06 07:10:01,Liberation_of_Leipzig_coop,1, agathyus
2026/03/06 07:20:01,Liberation_of_Leipzig_coop,1, agathyus

このようでしたが、無人期間のエントリーがうざいので、少しスクリプトをいじって、

#!/bin/bash

first=`date '+%Y/%m/%d %H:%M:%S'`
zero=`/usr/local/bin/gamedig --type battlefield2142 192.168.0.201:29900 | jq -r '.numplayers'`

if [ $zero != "0" ]; then

second=`/usr/local/bin/gamedig --type battlefield2142  192.168.0.201:29900 | /usr/bin/jq  -r '[.map,.numplayers] | join(",")'`
third=`/usr/local/bin/gamedig --type battlefield2142  192.168.0.201:29900  | /usr/bin/jq -r '.players[] | select(.raw.pid != 0)' | jq -r '.name' `

if [ -n "$third" ]; then
        echo $first,$second,$third
else
        echo $first,$second
fi

fi

としました、結果は、

2026/03/08 03:15:01,Suez_Canal_coop,1, do4m
2026/03/08 03:20:01,Suez_Canal_coop,2, do4m agathyus
2026/03/08 03:25:01,Suez_Canal_coop,2, do4m agathyus
2026/03/08 03:30:01,Suez_Canal_coop,1, do4m
2026/03/08 03:35:01,Suez_Canal_coop,1, do4m
2026/03/08 03:40:01,Suez_Canal_coop,1, do4m
2026/03/08 03:45:01,Sidi_Power_Plant_coop,1, do4m
2026/03/08 03:50:01,Sidi_Power_Plant_coop,1, do4m
2026/03/08 11:05:02,Liberation_of_Leipzig_coop,1, jake_burst
2026/03/08 11:10:01,Liberation_of_Leipzig_coop,1, jake_burst
2026/03/08 11:15:01,Liberation_of_Leipzig_coop,1, jake_burst
2026/03/08 11:20:01,Liberation_of_Leipzig_coop,1, jake_burst
2026/03/08 11:25:01,Liberation_of_Leipzig_coop,1, jake_burst
2026/03/08 11:30:01,Camp_Gibraltar_coop,1, jake_burst
2026/03/08 15:30:01,Minsk_coop,1, waltersljw
2026/03/08 15:35:01,Minsk_coop,1, waltersljw
2026/03/08 15:40:01,Minsk_coop,1, waltersljw
2026/03/08 15:45:01,Minsk_coop,1, waltersljw
2026/03/08 15:50:01,Tunis_Harbor_coop,1, waltersljw
2026/03/08 15:55:01,Tunis_Harbor_coop,1, waltersljw
2026/03/08 16:00:01,Tunis_Harbor_coop,1, waltersljw
2026/03/08 16:05:01,Tunis_Harbor_coop,1, waltersljw

のように無駄な行を省くことができました。サーバー側の負荷を気にせずバッファリングもせずに動かしていますが、自前サーバーだがらいいんじゃないの。(笑)Linux版はサーバーが落ちたら自動的に再起動していましたが、Windows版で同様な機構をどうするか思案中です。上記のスクリプトでサーバーが落ちていることは検出できますから、メールで通知するなり自分で再起動できるかも知れません。DebianからWindows(別マシン)上のプログラムを起動すればいいわけですが、sshは使えないです。rpcですか?うまい手があったら是非コメントお願いします。Windows版は頻繁に落ちると思っていましたが、意外に落ちないようです。むしろLinux版より安定しています。今のところ。Git for Windows付属のbashでrerun.shを動かすというのが一番簡単な気もします。Windowsからrpcで別Windowsマシン上のサーバープロセスを起動するというのが面白いかもね。

コメント