Plugin作成方法 SourceMod プログラミング

SourceMod – プラグインを作成するには (実施編)

2016/07/13

20140402-1

すっかり忘れていました。僅かな人にも需要があったみたいなので
前回の記事「SourceMod – プラグインを作成するには (環境準備編)」の続きを書いておきます。

実施編ということで
1.「Source Pawn」という言語でプログラムを記述する
2.1で書いたソースをコンパイルし、プラグイン(smx)ファイルを出力する
3.2で出力したプラグインの動作を、前回構築したTF2サーバー内で確認する
というようなことをやっていきます。

「Source Pawn」はなんとなくC言語に近い記述をしますが、
非常に簡単なのでプログラミングが初めての方も、これを機会に
MOD作って遊びながら勉強してみてはいかがでしょうか。

前回に続き、Windows上のみでの解説となります。

1.「Source Pawn」でプログラムを記述する

まずは適当な所に新しくテキストファイルを作って、
ファイル名を「hello_world.sp」に変更してください。

次に、解説しやすいようにサンプルプログラムを用意したので
「hello_world.sp」内に以下のソースコードをコピペしてください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#pragma semicolon 1 // お約束の1文:とりあえず書いておこう
////////////////////////////////////////
//    使用するインクルードファイル
////////////////////////////////////////
#include sourcemod
////////////////////////////////////////
//       プラグインのバージョン
////////////////////////////////////////
#define PLUGIN_VERSION "1.0.0"
////////////////////////////////////////
//         プラグインの説明
////////////////////////////////////////
public Plugin:myinfo =
{
name = "Hello World",
author = "132 th",
description = "Hello World in SourceMod",
version = PLUGIN_VERSION,
url = "http://132th.net/"
};
////////////////////////////////////////
//        プラグインの初期設定
////////////////////////////////////////
public OnPluginStart()
{
// チャットに"/hello"と打たれたら「Command_Hello」関数を呼び出し
RegConsoleCmd("hello", Command_Hello);
// チャットに"/helloall"と打たれたら「Command_Hello_All」関数を呼び出し
RegConsoleCmd("helloall", Command_Hello_All);
}
////////////////////////////////////////
//       「Command_Hello」関数
////////////////////////////////////////
public Action:Command_Hello(client, args)
{
// 画面に表示する文字のパラメーターを設定
// 左右表示位置, 上下表示位置, 表示秒数, R, G, B, Alpha
SetHudTextParams(-1.0, 0.5, 10.0, 255, 255, 255, 255);
// 上記のパラメータ値で文字を画面に出力
// 表示するクライアント, ID, 表示する文字
ShowHudText(client, -1, "Hello, world!");
}
////////////////////////////////////////
//      「Command_Hello_All」関数
////////////////////////////////////////
public Action:Command_Hello_All(client, args)
{
// 全ての有効クライアントに「Hello World > ALL」を画面に表示
for (new i = 1; i <= MaxClients; i++)
{
// サーバーにいるクライアント かつ ボットではない場合
if (IsClientInGame(i) && !IsFakeClient(i))
{
// 画面に表示する文字のパラメーターを設定
// 左右表示位置, 上下表示位置, 表示秒数, R, G, B, Alpha
SetHudTextParams(-1.0, 0.5, 10.0, 255, 255, 255, 255);
// 上記のパラメータ値で文字を画面に出力
// 表示するクライアント, ID, 表示する文字
ShowHudText(i, -1, "Hello, world! > ALL");
}
}
}

 

ソース内に解説コメントが書いてありますので、何をどうしているのか
初心者の方でもなんとなく分かると思います。
さーっと読んで次の項目へ行きましょう。

2.「hello_world.sp」をコンパイルする

まずspファイルをコンパイルしてプラグイン(smx)を出力するには、コンパイラーが必要です。
コンパイラーは、前回の記事でダウンロードしたSourceModのファイルの中に付属されているので、
別の所から新たにダウンロードしたりする必要はありません。

前回の記事でサーバーを構築したディレクトリが「c:\srcds」であるならば
c:\srcds\server\tf\addons\sourcemod\scripting」のフォルダ内に
compile.exe」というコンパイラーがあります。 ※Linux版では「compile.sh」
20140613-1

コンパイルに必要なのは「scripting」フォルダ内の
・「compile.exe
・「spcomp.exe
・「include」フォルダ
だけです。他のファイルやフォルダは邪魔だったら削除してかまいません。

また、「scripting」フォルダ自体を
名前を変えて作業しやすいデスクトップとかに移動してもOK。
そこら辺はお好きなようにしてください。

これでコンパイルの準備は出来たと思いますので
早速「hello_world.sp」をコンパイルしてみましょう。

コンパイルするには
hello_world.sp」を「compile.exe」と同じディレクトリに入れて
compile.exe」を実行するだけです。

20140613-2

こんな感じで真っ黒なコンソール画面が出て
Warning」とか「Error」とかいう文字がない状態で
処理が終わっていれば、コンパイルは無事終了となります。

フォルダ内をよく見ると
・「compile.dat」(恐らくコンパイルの履歴ファイル)
・「compiled」フォルダ(プラグイン(smx)出力フォルダ)
が新しく生成されているのが分かると思います。

今回は「compiled」フォルダ内に「hello_world.smx」が生成されていればOKです!

日本語で解説してるサイトが殆どないため
プラグイン作成は敷居が高そうに思えますが、たったこれだけで作れます。
Linuxでも「compile.sh」を実行するだけで、やることはほぼ同じです。
※Windowsで出力したsmxファイルでも、Win&Linux両サーバーで動作します。

3.サーバー内でプラグインの動作確認をする

最後は当たり前ですが、作ったプラグインがきちんと動作するか
自分のサーバーに接続し、ゲーム上でデバッグ作業をしなければなりません。

まずは、さきほど作った「hello_world.smx」を
サーバーのプラグイン読み込み場所に入れてあげます。

前回の記事でサーバーを構築したディレクトリが「c:\srcds」であるならば
c:\srcds\server\tf\addons\sourcemod\plugins」に入れます。

プラグインを入れたら、サーバーを起動しましょう。
前回の記事で紹介した srcds_server_start.bat を使った起動方法でもなんでもいいので
とりあえずコンソールでサーバーを起動してください。

起動後の処理が終わり、画面が落ち着いたら

20140613-3

まずプラグインが正常に読み込まれているか確認します。
コンソールに「sm plugins list」と打ちます。

20140613-4

すると、読み込まれたプラグインがずら~っと表示されると思います。
そして上記のように、
今回作った「hello_world.smx」のプラグイン名がその中に表示されていればOKです。

↓↓↓

次にゲームを起動して自分のサーバーに入ります。
サーバーとゲームを同じパソコン上で実行するならばポートの解放は必要ありません。
もし別々にやるなら27015のポートをルーター側で解放してください。ここでは解説しません。

 

20140613-5ゲームトップ画面のサーバーメニューを選択

20140613-6

お気に入りタブから「サーバーを追加」を選択
サーバーのローカルIP:ポート番号(27015)

を入力し、「このアドレスをお気に入りに追加」を選択します。
※画像では192.168.0.20ですが、それぞれの環境によって違います。
詳しくは「Windows ローカルIP」でググってください

 

20140613-7すると、こんな感じで自分のサーバーが一覧に出てきます。
(追加後に反応がない場合は、「更新」を何度か押すと出ることもあります)
ポート解放してなければ、このサーバーは他の人からは見えないので安心してください。

↓↓↓

それでは最後にサーバーに入って、プラグインの動作を確認します。
※サーバーに接続後に「サーバーのバージョンが古いぞ」的なエラーが出る場合は
前回の記事から時間が経っているため、TF2サーバーのバージョンが古くなっています。

その場合は http://tfortress2.wikiwiki.jp/?WindowsXP を参考に更新してください。

 

20140613-8サーバーに入ったらチャット欄に「/hello」と打ちます

 

20140613-9上記のように画面中央に「Hello, world!」と表示されればOK!

次にチャット欄に「/helloall」と打ちます。

 

20140613-10上記のように「Hello, world! > ALL」と表示されればOK!
※/helloallの方は一応サーバーにいる全員にこのメッセージを表示しています。

これでプラグインの動作確認は終わりです!
もし面白いプラグイン(MOD)を作ったなら、この後は配布するなり自分で使うなりすればOK!

・・・以上初心者がみても分かるように、くどい感じで書いてみました。
最初からやってみてもらえば、プラグイン作成の流れがなんとなく分かってもらえたと思います。
このやり方はTF2に限らず、他のSourceMod対応ゲームでもほぼ同じだと思いますので、他ゲーのプラグインを作りたい場合は、これを参考に少し調べながらやればすぐ出来ると思います。

ただ初心者だとプラグイン作成方法が分かっても
~をやりたいんだけど、どういうソースコードを書けばいいのか分かんねーよ!
ということになると思います。最後にその部分を補足しときます。

最後に

SourceModのプラグインは配布する時に、
必ずソースコード(spファイル)も一緒に公開するよう定められています。
AlliedModdersで公開する場合のみ順守するべし、個人サイトなら守らなくても問題ない)

そのため、「~するプラグイン(MOD)を作りたい!」という場合は
作りたいものと近い&似てる動作をしているであろうプラグイン(MOD)を探して
その類似プラグインのソースコードを参考に、自分の作りたいものを仕上げていきましょう。

SourceModのプラグイン作成で使う様々な関数の使い方を解説してるサイトは
英語ページですら殆どのないので、他人のソースコードを参考にしたほうが早くて確実です。

公開されているプラグイン一覧は
SourceMod: Half-Life 2 Scripting
上記のページにすべてまとめられています。下に行くほど新しい。何千個とありますね・・・。

SourceModプラグインの主な公開先は
AlliedModders に会員登録して、「SourceMod」のフォーラムに英語で投稿すればOK

殆ど英語ですが、機械翻訳でもなんとなく分かるので大丈夫。
上記二つのサイトはプラグインを作る上で何度もお世話になると思います。

「Source Pawn」の基本的な記述ルールの解説ページまとめは以下です。
Category:SourceMod Scripting

上記をみると、SourceModでもテキストファイルを出力&読込したり
MySQLでデータベースを使ったりできることが分かります。
MySQLが使えれば、独自のランキングプラグインなど作ることも可能です。

基本的なAPIリファレンスはこちらで解説されています。
Main – SourceMod Scripting API Reference

・・・
英語ばっかで良く分かんねーよ!
と思うでしょうが、
海外ゲームのMODを作るならどちらにしても英語を読まないと話になりません。
初心者の方は慣れるまで気合をいれて頑張ってみてください。

・前回の記事
SourceMod – プラグインを作成するには (環境準備編)

スポンサーリンク

-Plugin作成方法, SourceMod, プログラミング
-, , , , , , , ,