Half-Lifeビルド情報

Half-Lifeサーバーサイドモジュールのプログラミングを始めるための準備について説明します。
Half-Lifeを最新バージョンにする

まずHalf-Lifeを最新バージョンにしてみましょう。1.1.0.6が最新です。

ここらへんに行ってパッチダウンロードしてパッチ当てちゃってください。

Planet Half-Life


スタンダードSDKソースコードセットの入手

スタンダードSDKは以下のとこからダウンロードしてきてくださいStandard SDKってのがそうです。 いつのまにかFull SDKまでタダで手に入る時代!?でも74メガです。でけー!

Planet Half-Life

ソースコードのビルドから起動まで(要VC++5.0もしくは6.0)

1.インストール
昔はZipだったのに今はインストーラがかってにやってくれるのね。 今回の焦点はdllsディレクトリ下にあるサーバープログラムのソースファイルとengineディレクトリ下のヘッダファイルです。 もっと調べてみた結果、\utils\common下のヘッダファイルも必要であることが判明しました。解凍したディレクトリそのままの状態で置いておけば問題ないでしょう。
\cl_dll
\dlls
\engine
\utils
2.ビルド
dllsディレクトリにはMicrosoftのVisualC++のプロジェクトファイル(VC++5.0以降のプロジェクトファイル)mp.dswがありますから、 そのプロジェクトファイルを開き、あとはビルドするだけで\dlls\Releasemp以下にmp.dllが出来上がります。

・他のコンパイラではDLLを生成できないのか?
できるはずです。基本的なC++をコンパイルできるコンパイラなら何でもいけるんじゃないでしょうか。 VC++4.0なら当然大丈夫でしょうし、BolandC++でもソッコーでいけそうです。近々BC++4のプロジェクトファイルを作ろうと思います。

3.Half-Lifeの新規モジュールのディレクトリ環境作成
Quake、QuakeII同様、HLもモジュールごとにディレクトリを作成し、ディレクトリ指定によって各モジュールを読み込んでゲームを実行する方式です。
HLのインストール先ディレクトリがC:\SIERRA\Half-Lifeであると仮定して話を進めます。

@C:\SIERRA\Half-Life下に自分の好きな名前のディレクトリを作成します。とりあえずMyGameとしておきましょう。 更にこのMyGameディレクトリ下にdllsディレクトリを作成してください(このdllsディレクトリ名もdllsである必要はありません)。

C:\SIERRA\Half-Life\MyGame
C:\SIERRA\Half-Life\MyGame\dlls

Adllsディレクトリ下に先ほど出来上がったサーバーモジュールmp.dllをコピーします。

Bショートカットを作成します。エクスプローラ等でC:\SIERRA\Half-Life\hl.exeのショートカットを作成し、ショートカットの内容へ以下のように記述を加えます。

C:\SIERRA\Half-Life\hl.exe -console -game MyGame

Cliblist.gamを作成します。面倒なのでベースディレクトリ(C:\SIERRA\Half-Life\valve)にあるliblist.gamMyGameディレクトリへコピーしちゃってください。
そしてliblist.gamをメモ帳等のテキストエディタで開き、内容を書き換えます。以下が書き換え例です。
// Valve Game Info file
//  These are key/value pairs.  Certain mods will use different settings.
//
game "Half-Life"
startmap "c0a0"
trainingmap "t0a0"
hlversion "1010"
mpentity "info_player_deathmatch"
gamedll "dlls\mp.dll"
上記を見ても分かる通り、書き換えが本当に必要なのはgamedllの項目だけです。 ここにはゲームディレクトリ(C:\SIERRA\Half-Life\MyGame)からmp.dllへの相対パスを記述しなければいけません。

D最後にautoexec.cfgを作成します。作成しなくともよいのですが、モジュールの動作確認でHLを起動する度に毎回チマチマとデスマッチを起動していてはウルトラ級に面倒なので作りましょう。
以下の内容のテキストファイルを作成し、ファイル名をautoexec.cfgとしてゲームディレクトリ(C:\SIERRA\Half-Life\MyGame)へ保存します。
deathmatch "1.0"
map "boot_camp"
4.Half-Lifeを起動
HLを起動してみます。作成したショートカットでHLを起動するといきなりメニュー画面になるのでメニュー最上段のConsoleをクリックします。 するとサササーっと色々表示されてマップboot_campでデスマッチがスタートします(項目3のDでautoexec.cfgを作成した場合)。
確認のため「半角/全角」キーを押してコンソールを開き、「PageUp」キーでコンソールのメッセージ履歴を遡って参照してみます。その履歴の中に

Adding: C:\SIERRA\HALF-LIFE\MyGame\dlls\mp.dll

というメッセージ('\'はバックスラッシュになっている)が表示されていればDLLの読み込みに成功していると思われます。もっとも、読み込みに失敗しているとすればデスマッチ起動時に「Can't get DLL API!」とメッセージボックスが表示されてHLが強制終了になるのですぐ分かります。

軽いソース書き換え

それではソースの一部を書き換えてみましょう。
ソースファイルclient.cpp中から関数ClientCommandを検索し、関数中の以下の青で示した部分を書き加えてください。
			・
			・
			・
	else if ( g_pGameRules->ClientCommand( GetClassPtr((CBasePlayer *)pev), pcmd ) )
	{
		// MenuSelect returns true only if the command is properly handled,  so don't print a warning
	}
//ponpoko
	else if ( FStrEq(pcmd, "ponko" ) )
	{
		char PON[255];		//バッファの確保
		GET_GAME_DIR(PON);		//ゲームディレクトリの取得
		ClientPrint( &pEntity->v, HUD_PRINTCONSOLE, PON );	//コンソールにゲームディレクトリを表示
	}
//ponpoko
	else
	{
		// tell the user they entered an unknown command
		ClientPrint( &pEntity->v, HUD_PRINTCONSOLE, UTIL_VarArgs( "Unknown command: %s\n", pcmd ) );
	}
}
書き加えたらビルドを実行し、出来上がったDLLで再びHLのデスマッチをスタートさせます(ビルドの度にDLLをコピーするのは面倒なのでビルドの設定で\MyGame\dllsディレクトリ下にDLLが作成されるようにした方が楽です)。
そして「半角/全角」キーを押してコンソールを開き、ponkoと入力してみましょう。コンソールに以下のメッセージが表示されるはずです。

C:\SIERRA\HALF-LIFE/MyGame

これでponkoというゲームディレクトリをフルパスで表示するクライアントコマンドを追加したことになります。コマンドが動作しなかった場合、何か不備があります。よく確認してください。

e-mail:ponpoko@axcx.com