試合用と練習用で切り替えたい。

CS1.6をやってる時になかなか試合鯖が見つからないときがあったので、
せめて自分のとこが試合するための鯖を用意しようと思い、練習用の鯖と試合用の鯖を立てる事にしました。
しかし僕はケチなので、無駄に試合用の鯖を立てて放置しておきたくなかったのです。
普段は練習鯖、試合にするときだけ試合鯖に切り替える方法にしました。
練習鯖ではAMXを読み込みますが、試合鯖ではAMXは使わないようにしたいです。
2つ用意してもいいんですが、サーバリソースを食いつぶすし、切り替えで対応できるのでそっちにしました。
そんなわけでその切り替えを簡単にする、Linux向けのちょっとしたスクリプトをup



AMXはなぜ読み込まれるか

AMXはプラグインで機能を拡張できますが、AMXを使うためには、まずMetaModが読み込まれます。
起動プログラムからオリジナルとなるcs_i386.soというモジュールの処理を、
MetaModが間に入ることによって、その間の処理を奪っているに過ぎません。
図で示すとこんなかんじ?

 [起動プログラム] -----> [cs_i386.so]
 [起動プログラム] -----> [metamod] ----->[cs_i386.so]
                              └-------->[AMX]---->[Plugins]

どこで読み込まれるモジュールが決まるのか

HLDSではゲーム起動時にどのモジュールを使うのかという指定を、
liblist.gamのgamedllの項目で指定するすることができます。
なので、MetaModを読み込むliblist.gamと、cs_i386.soを読み込むliblist.gamを作って、
サーバ起動時にどっちかを選んで起動すればいいわけです。

シェルスクリプト

リネームが一番いいんですが、退避などの処理がめんどくさいので、
手軽にシンボリックリンクを使う方法でいきます。
ファイルサイズも少ないので、コピーでもいいでしょう。
Windowsにはシンボリックリンクの機能がないので、コピーで対応します。

名前は適当に choose.sh とでもします。
これを置く場所はcstrikeの中です。

#!/bin/sh
LIBLIST_GAM="liblist.gam"
MATCH_SERVER_LIBLIST_GAM="match_liblist.gam"
PRACTICE_SERVER_LIBLIST_GAM="practice_liblist.gam"

TYPE=$1;

if [ "${TYPE}" = "match" ]
then
	ln -fsv ${MATCH_SERVER_LIBLIST_GAM} ${LIBLIST_GAM} || exit 1
elif [ "${TYPE}" = "practice" ]
then
	ln -fsv ${PRACTICE_SERVER_LIBLIST_GAM} ${LIBLIST_GAM} || exit 1
else
	echo "'match' or 'practice'..."
	exit 1;
fi

"MATCH_SERVER_LIBLIST_GAM" と "PRACTICE_SERVER_LIBLIST_GAM" にはそれぞれのliblist.gamを指定します。


lnコマンドのオプションとしてf,s,vを指定しています


使い方は以下の感じです。

  • "./choose.sh match" ... 試合向けのliblist.gamを使う
  • "./choose.sh practice" ... 練習向けのliblist.gamを使う

match/practice以外の引数を与えた場合、動作は失敗になります。


これだけでは一々ファイルのある場所まで行く必要があるのでイマイチですが、
他のシェルスクリプトと組み合わせるといい感じに使えます。