技術

    SourcePawn / Sourcemod プラグイン作成環境構築

    PAYDAY2 Blacklist Assist

    最近更新中のPAYDAY2のBlacklist MODの補助ツール
    ※特に理由が無い場合は最新バージョンを使用してください。


    ━━━━━━━━━━━━━━━━━━━━━━━━━━━

    17/08/04 - start_server.batの内容を修正しました。

    https://developer.valvesoftware.com/wiki/SteamCMD#Windows※このページの内容は以下2ページとほぼ同様です。
    非常に参考になるサイトです。
    SourcemodとはSource Engineで動くゲームの動作を拡張・修正・改造するためのMOD(以下plugin)作成環境です。
    Sourcemodで具体的にどのようなことができるのかですが、例えば
    1. マップのプレイ回数のカウント
    2. プレイヤーのキル・デスやスコアでランキング
    3. 味方の位置が壁透けて見えるようになる
    などなどいろいろなことができます。

    ゲームプレイ中に、「これがあれば・・・」のような悩みを解決するのに役立つかもしれません。
    そんなこんなで、開発環境を構築していきましょう。

    ここでは開発環境(エディタ)の都合上、Windowsのみを扱います。
    また、ゲームを実行しながらゲームサーバを実行するため若干コンピュータのスペックを必要とするかもしれません。(動かない環境で試したことがないのでどの程度が最低必要スペックかは書けません。)
    当方の環境は記事最下部に示します。


    開発環境構築目次

    1. ゲームクライアント実行環境構築(Team Fortress2など) 
    2. ゲームサーバ実行環境構築
    3. 開発環境構築
    4. 開発の流れ


    ゲームクライアント実行環境構築

    Source Engineで動いているゲームであれば大体動くと思いますが、今回はTeam Fortress2(以下TF2)を使用する。

    SteamのゲームストアからTF2をインストールする

    インストール先はデフォルトを使用しているものとして進める。


    ゲームサーバ実行環境構築

    SteamCMDのダウンロード

    上記サイトから「steamcmd.zip」をダウンロードする。

    SteamCMDの配置

    先ほどダウンロードしたzipファイルを解凍し、「steamcmd.exe」を「C:\srcds」に配置する。

    Create_server.batの配置

    create_server.batをダウンロードし、「C:\srcds」に配置する。
    ファイルの内容は以下の通りです。(TF2 Wikiより引用)
    なお、「set appid=232250」ここの数値を変えることにより、他のゲームサーバを構築可能である。
    appidはゲームのストアページの末尾の数値例えばARK「http://store.steampowered.com/app/346110/ARK_Survival_Evolved//」なら346110である。

    create_server.batファイルの内容
    :バッチファイルを実行したディレクトリ
    set runcmd=%~dp0
    :SteamCMDのログインユーザー
    set username=anonymous
    :SteamCMDのログインユーザーのパスワード
    set password=
    :アップデートするサーバーのゲームID
    :(Team Fortress 2 = 232250)
    set appid=232250
    :ディレクトリ移動
    cd %runcmd%
    :SteamCMDを実行
    start /wait steamcmd +login %username% %password% +force_install_dir %runcmd%server\ +app_update %appid% validate

    SteamCMDとCreate_server.batを用いたゲームサーバ構築

    先ほど配置した「create_server.bat」を実行する。
    サーバを構築するための基礎ファイル群をダウンロードする。
    改善環境によるが、5分程度で完了すると思う。

    srcds_01.jpg 

    このようなウィンドが表示され、最新行に「>Steam」と表示された後に「quit」または×ボタンでウィンドを閉じる。
    この状態での「C:\srcds」の様子は

    srcds_02.jpg 

    このようになっている。状態が異なる場合は手順を確認してほしい。

    さらに、もう一度「create_server.bat」を実行する。
    TF2サーバを構築するためのファイル群をダウンロードする。
    記事作成時点で7GB弱ある。

    srcds_03.jpg 

    このような画面でダウンロード状況が表示される。
    最新行に「>Steam」と表示された後に「quit」または×ボタンでウィンドを閉じる。

    なお、ゲームサーバにアップデートがあった場合は、「create_server.bat」を実行するとアップデートを適用することができる。
    また、ファイルが破損した、サーバを再構築したい場合は、「steamcmd.exe」と「create_server.bat」以外を削除し、上記作業を行えばよい。

    ゲームサーバの開始

    start_server.batをダウンロードし、「C:\srcds\server」に配置する。
    実行するとゲームサーバを開始する。

    start_server.batの内容
    srcds.exe -game tf -console -secure -port 27015 +map cp_dustbowl +maxplayers 20 +servercfgfile server_setting.cfg

    srcds_04.jpg 

    このようなウィンドが表示されれば成功である。
    なお、batファイルに使用できるオプションは多数あり下記を参考に用途に合わせて追記するとよい。

    ゲームサーバの設定

    server_setting.cfgをダウンロードし、「C:\srcds\server\tf\cfg」に配置する。
    plugin作成用の最低限の設定のみを記述した。
    • sv_lan 0 
    0だとサーバをウェブに公開する設定だが、ポート開放していなければ外部からは接続できない。
    今回はローカルでの運用を前提としているが、changelevel(マップ変更)コマンドを使用した際に、sv_lan 1にしているとサーバがクラッシュした経験があるため0を推奨する。
    • sm plugins load_unlock
    Pluginを読み込みやすくするための設定、本運用するサーバではこのコマンドを使用したのちにはsm plugins load_lockを使用するとよいだろう。

    server_setting.cfgの内容
    sv_lan 0 //1だと自分しか入れない、0だとウェブに公開
    mp_idlemaxtime "999"	//何分でAFKキックを発動させるか
    mp_timelimit "0"	//マップの有効時間(分)
    sm plugins load_unlock //プラグインロードロック解除
    

    なお、設定ファイルに使用できるオプションは多数あり下記を参考に用途に合わせて追記するとよい。

    Metamod導入

    pluginを動かすためのファイル群
    Metamod:Source - Newsこちらの左メニューの「Stable Builds」から最新BuildのWindowsバージョンをダウンロードする。
    解凍しフォルダ「addons」を「C:\srcds\server\tf」に配置する。

    Sourcemodの導入

    pluginを動かすためのファイル群
    SourceMod: Half-Life 2 Scriptingこちらの左メニューの「Stable Builds」から最新BuildのWindowsバージョンをダウンロードする。
    解凍しフォルダ「addons」と「cfg」を「C:\srcds\server\tf」に配置する。


    開発環境構築

    エディタの導入

    メモ帳などでも開発可能だが、関数名などをハイライトや入力を補完する機能を持つエディタが公開されているため、こちらを利用したほうが開発効率が良い。
    おすすめ順に列挙した。

    宣言関数一覧表示あり
    デバッガーあり
    Releases · Timocop/BasicPawn · GitHubダウンロードはこちらから

    ハイライトあり
    入力補完あり
    宣言関数一覧表示あり(行までジャンプあり)
    開発止まってる
    Pawn Studio download | SourceForge.netダウンロードはこちらから

    SPEditの導入

    上記リンクより最新のSPEditをダウンロードし「C:\spedit1.2.0.2」に配置したとして進める。

    Sourcemodの導入(オプション)

    SourceMod: Half-Life 2 Scriptingこちらの左メニューの「Stable Builds」から最新BuildのWindowsバージョンをダウンロードする。(サーバに導入したものと同じものでよいため、次指定フォルダをサーバフォルダ群からコピーしてもよい)

    「C:\spedit1.2.0.2\sourcepawn\configs」フォルダに、任意の名前のフォルダを作成する(ダウンロードしたSourcemodと同じバージョン名にしておくとわかりやすい。)
    例えば、ダウンロードしたファイルが「sourcemod-1.8.0-git6014-windows.zip」であれば、「1.8.0-git6014」とするとよい。

    sourcemod-1.8.0-git6014-windows.zipをダウンロード、解凍し
    addons => sourcemod => scripting => 「spcomp.exe」ファイルを先ほど作成した「1.8.0-git6014」フォルダに配置する。
    addons => sourcemod => scripting => 「include」フォルダを先ほど作成した「1.8.0-git6014」フォルダに配置する。

    導入したSourcemodを使用する設定(オプション)

    SPEditのメニュー Configuration => Edit Configuration => New
    • Name - 適当な名前(先ほど作成したフォルダ名「1.8.0-git6014」などとするとよい)。
    • Scription Directories - 先ほど作成した「1.8.0-git6014」フォルダを指定する。
    • Copy Directory - プログラムをコンパイルしてできたファイルをコピーする先 - 「C:\srcds\server\tf\addons\sourcemod\plugins」フォルダを指定する。
    • Server Executable - 「C:\srcds\server\start_server.bat」を指定する。

    上記赤文字はデフォルトの設定を変更しておくと作業効率が上がる。


    開発の流れ

    1. ゲームサーバ立ち上げ(ショートカットF9)
    2. ソースコード作成
    3. コンパイル(ショートカットF6)
    4. バグ取り、1に戻る
    5. コンパイルが通ればゲームサーバにpluginをアップロード(ショートカットF7)
    6. ゲームサーバに「sm plugins refresh」を入力しエンターで実行(プラグインファイルの再読み込み)


    コンパイルとファイルコピーがワンタッチで行えるので非常に効率よく動作確認が行える。
    コンパイルが正常に通っても、ゲーム内で動作確認中にバグが見つかる、意図したとおりに動作しないことは非常によくあるこのなので、必ずゲームサーバで動作を確認する必要がある。
    また、WindowsのゲームサーバとLinuxのゲームサーバでは若干挙動が異なり、Windowsゲームサーバで正しく動作している場合でも、Linuxで完全に同じ動作をするとは限らないことを知っておくとよいだろう。

    ーーーーーーーーーー

    当方PCスペック
    OS:Windows7 Home
    CPU:Intel Core i7 4790K
    RAM:16GB
    Storage:2TB程度
    Graphic:Radeon 7750HD
    スポンサーサイト

    SourcePawn / Sourcemodでsmlibを読み込んだ際のエラー回避

    PAYDAY2 Blacklist Assist

    最近更新中のPAYDAY2のBlacklist MODの補助ツール
    ※特に理由が無い場合は最新バージョンを使用してください。


    ━━━━━━━━━━━━━━━━━━━━━━━━━━━

    Sourcemodで書かれている複雑なpluginで何かと使われているsmlibだが、
    AlliedModdersからダウンロードしても、
    GitHubのリリースからダウンロードしても、

    const was specified twice」などのエラーが発生し、うまく動かない。
    (2017/06/29時点)

    回避方法は非常に簡単で、

    GitHub - bcserv/smlib: Function Stock Library for Sourcemod with over 350 new functions

    GitHubから最新のソースコード群をダウンロードし、導入する。

    GitHubリリースの最新バージョンでは上記バグが残った状態であるという落とし穴。

    Source Engine内臓のModelの見かた

    PAYDAY2 Blacklist Assist

    最近更新中のPAYDAY2のBlacklist MODの補助ツール
    ※特に理由が無い場合は最新バージョンを使用してください。


    ━━━━━━━━━━━━━━━━━━━━━━━━━━━

    Source Engine系のMAPやMODやらを作るときに使えるModelだが、その見かたが少しわかりづらかったので忘備録兼情報共有としてまとめる。

    まずは、Modelとはこういった人やらアイテムやらのこと。

    20170628103418_1.jpg 
    見かたは2通り(ほかにもあるかも?)あるが、おすすめ順で説明する。

    ツールを導入する

    SourceSDKは現状バグで使い勝手が悪いので今回は使わないこととする。

    TeamFortress2をインストールする

    無料なのでTeamFortress2を使用するが、Source Engineで動いているものであれば何でもよい。

    Hummer editor内臓のModel browserを使用する

    DirecyPlayを有効にする

    Hummer editorの正常動作に必要となるWindowsの機能、Win10ではデフォルトで無効になっているため、手動で有効にする必要がある。

    コントロールパネル => プログラムと機能 => (左側メニューの)Windowsの機能の有効化または無効化 => レガシーコンポーネント => DirectPlay

    sourcemod_winsetting.jpg 

    上記にチェックを入れ、OKで有効になる。
    再起動が必要となる可能性があるため、その旨が表示された場合は従うこと。

    Hummer editorを起動する

    Team Fortress 2\bin\hammer.exeを起動する。(地球?に緑のハンマーのようなアイコン)
    デフォルトのインストール場所を選択している場合は以下にある。
    C:\Program Files (x86)\Steam\steamapps\common\Team Fortress 2\bin

    Hummer editorでMapを開く

    Hummer editorの中央4パネルが真っ黒の場合は上記のDirectPlayを有効にする操作を行ってから再度Hummer editorを起動すること。

    左上メニュ File => New

    Entityを作成する

    左メニューのチェスのポーンのようなボタンを選択し、
    グリッド線の描かれている面いずれかで左クリック、
    緑色の四角を右クリックし、Create Object を選択する。

    成功すれば緑の人型のオブジェクトが作成される。

    sourcemod_hummer_create_entity.jpg 

    Entityのプロパティを表示する

    左メニューから矢印(先ほど選択したポーンの2つ上)を選択し、
    先ほど作成したオブジェクトを囲むようにドラッグアンドドロップで範囲を指定する。

    sourcemod_hummer_create_entity_edit.jpg 
     
    作成したオブジェクトを右クリックし、
    メニュー一番下の Properties を選択する。

    Entityのプロパティを変更する

    Classから prop_dynamic を選択し、
    右下の 適用(英語版であればApply) を選択する。

     sourcemod_hummer_create_entity_class.jpg

    Model browserを起動する

    「先ほどのEntityのプロパティを変更する」を実行すると Property Name などが変更されたと思う、
    その中の上から4番目の World Model をダブルクリックする。

    sourcemod_model_browser.jpg 
    こういう感じの画面が表示されれば成功。

    1. 赤枠はフォルダ一覧、
    2. 緑枠がフォルダ内のモデル(パス)一覧と、
    3. 青枠がモデルのプロパティ一覧
    • Render - 描写設定(あまり重要でない)
    • Sequences - 動き一覧
    • Activities - 動作一覧
    • Skins - スキン一覧
    • Info - Entityの種類
    • Screen Caps - スクリーンショット?

    Model viewerを使用する

    Model viewerを起動する

    Team Fortress 2\bin\hlmv.exeを起動する。(緑ぽい物体と黄色い球体のアイコン)
    デフォルトのインストール場所を選択している場合は以下にある。
    C:\Program Files (x86)\Steam\steamapps\common\Team Fortress 2\bin

    Modelを読み込む

    上メニュ File => (Steam) Load Model... => フォルダ群の中などからModelを選択する。
    (読み込めないフォルダが大量にあるので根気よく読み込めるフォルダとファイルを探す。)

    sourcemod_mode_viewer.jpg 

    読み込みに成功すると茶色っぽい中央にモデルが表示される。

    読み込めるファイルが少ない(バグ?)ので見るだけなら圧倒的にHummer editor内臓のModel browserがおすすめだが、もしかしてModel viewerでしかできないこともあるのかも。

    ーーーーーーーーーー
    参考にしたHP・ページ一覧
    Source SDK Wiki*
    http://wikiwiki.jp/sourcesdk/?FrontPage

    Prop Types Overview - Valve Developer Community
    https://developer.valvesoftware.com/wiki/Main_Page

    entities_list - Team Fortress 2 Wiki*
    Team Fortress 2 Wiki*
    http://tfortress2.wikiwiki.jp/

    Railsはちょっとお休みしてRubyを学んでいこう!

    PAYDAY2 Blacklist Assist

    最近更新中のPAYDAY2のBlacklist MODの補助ツール
    ※特に理由が無い場合は最新バージョンを使用してください。


    ━━━━━━━━━━━━━━━━━━━━━━━━━━━

    Rails難しくてあきたとかじゃな・・・ちょっとね。

    やはりRailsを学ぶにはRubyをおさえなくては!!(Rubyの本読んだだけで結局Rubyのプログラム書いてなかった)

    ということで、昔買った「Javaゲームプログラミングアルゴリズム」を引っ張り出してきた。

    中学生のころにこの本を買ってもらったものの、Javaのよく言われる「おまじない」に納得いかない、意味が分からなくて投げたことを思い出した。

    なのになぜC#をわりかしすんなり呑み込めたのだろうか・・・謎である。

    今思えばC#もおまじない系だと思うのだが・・・なぜか、そしていまJavaの本を読むとなぜ分からなかったのか分からない・・。

    何はともあれ、この本の最初に出てくるレースゲームもどきをRubyで書いてみた。

    一応できたものの、うーん。

    170408_Race1.png

    思っていたものと違う。

    そもそも、Rubyで書くべきではなかった。(今更)

    どうしても入力待ちが発生してしまう(スレッドはあきらめた)

    入力待ちになるため、考える時間がいくらでもあり、まー死なない。

    次はリアルタイム性の要求されない、ターン制のものを作ろう!

    初めてのRuby書いた学び!


    ・-- ++は使えない! += -=を使おう!
    ・偶数奇数の判定は % 2よりも even?を使うといいぽい!?(型の問題なのかな?%2だとうまくいかなかった)
    ・インスタンスメソッドとクラスメソッドの違いがよくわからないー


    一応ソースコードもあるよ。
    https://bitbucket.org/rinjugatla/race

    考えたことがあたってるとちょっとうれしくなるよね

    PAYDAY2 Blacklist Assist

    最近更新中のPAYDAY2のBlacklist MODの補助ツール
    ※特に理由が無い場合は最新バージョンを使用してください。


    ━━━━━━━━━━━━━━━━━━━━━━━━━━━

    ちょうど一年前くらいにとある理由でプログラムを書くことになった。

    ・読み込むデータは用意されている
    ・解析手法も用意されている
    ・結果の見せ方も大体既存の参考資料がある

    ・使用言語は自由
    ・とりあえず動けばいいらしい

    というゆるい開発だったので、これまでの趣味の延長で作り始めた。

    やはりGUIはあったほうが便利だろうということ、グラフや表で結果を示したかったこともあり、言語はC#を選んだ。
    (というより割とまともに扱えるものがC#以外にな・・・)

    読み込むデータは大体以下のようになっていた

    data.csv
    #ヘッダー開始(ない場合もあり、ない場合はヘッダー終わりもなし)
    #ヘッダー終わり
    日時,データ1-1,データ2-1,...(複数列)
    日時,データ1-2,データ2-2,...
    日時,データ1-3,データ2-3,...
    以下数千から数百万行

    ・解析手法でのちにデータを消すことが分かっている
    ・とりあえず動けばいいらしい

    ということから、今までの経験から得た技術のListを用いてデータを格納していることにした。

    Step0
    List1-1(データ1-1を格納)
    List1-2(データ1-2)
    List1-3(データ1-3)
    List1-4(データ1-4)
    List1-5(データ1-5)

    と順番に格納していくわけである。(データ2-は表記省略)

    解析する間に

    Step1
    List1-1(データ1-1)
    List1-2(データ1-2)
    List1-3(データ1-3)

    List1-4(データ1-5)

    Step1
    List1-1(データ1-1)

    List1-2(データ1-3)

    List1-3(データ1-5)

    と歯抜けになっていく。

    Forで回していたと思うので、ここはList.RemoveAt(Int32)でデータを抜いていった。

    しかし、遅い、遅い、待てども待てども終わらない。何が悪い?

    既存技術の組み合わせということがあって、同様の処理をするプログラムがフリーで公開されている。
    それらを用いると時間がかかるものでも1分程度、自作のものは1時間以上かかる。

    明らかにおかしい!
    いろいろな場所にブレークポイントを設置した結果、上記の箇所が原因であると特定された。
    (ここまでに一通り作ろうと思っていた機能をすべて盛り込み済みで、自分の開発した中では最大規模のプログラムになっており、特定作業も大変であった)

    どうやら、要素を削除するたびに、要素を前に詰めているようだった。
    言葉にすると伝わりづらいだろうか、昔作った画像が出てきたので参考に

    270407_prog.png

    数百万*数列あるデータに対して、列ごとにデータを一つ消すたびに後ろからデータを詰めていたらしく、計算量は莫大な量になっていたということである。

    今までは扱うデータ量が多くとも数千程度だったので、詰め詰めしても大して気にならなかったようだが、今回は数百万*十数と今までとは全く違う規模のデータ量なので問題が浮き彫りになった。

    消すとダメ・・・ダメ・・・なら飛ばせばいいじゃない!とひらめいた。
    お風呂に入っていた時だったような気がする。ぽけーっとしてるとひらめくことあるよね。

    270407_prog2.png

    要素を作成する際に、前後関係と要素データを合わせて持つようにする。

    Step0
    List1-1(データ1-1を格納、前なし、後1-2)
    List1-2(データ1-2、前1-1、後1-3)
    List1-3(データ1-3、前1-2、後1-4)
    List1-4(データ1-4、前1-3、後1-5)
    List1-5(データ1-5、前1-4、後なし)

    といった具合である。
    すると

    Step1
    List1-1(データ1-1を格納、前なし、後1-2)
    List1-2(データ1-1、前1-1、後1-3)
    List1-3(データ1-2、前1-1、後1-5)
    List1-4(データ1-4、前なし、後なし)
    List1-5(データ1-5、前1-3、後なし)

    といった具合になり、詰め詰めしなくともすむ。
    これは!すごいのでは!

    と、独自でクラスを作り始めたのだが、途中で「もしかして、自分が思いつくのなら既にあるのでは?」と考え、検索してみると

    「連結リスト(片方向リスト、双方向リスト)」

    というものが、これにあたるようで、C#にももちろん標準で実装されていると分かった。

    こちらを利用したところ、ほかのフリーソフト並みの爆速で処理が終わるようになった。
    今度のボトルネックはストレージからの読み込み速度だが、ここはいまだに難儀している。

    何はともあれ、

    「何が悪い?」

    から

    「消すとダメ・・・ダメ・・・なら飛ばせばいいじゃない!とひらめいた。」

    「もしかして、自分が思いつくのなら既にあるのでは?」


    やっとタイトルである、「考えたことがあたってるとちょっとうれしくなるよね」

    先人たちも同じところで躓いて、同じことを考えていたと分かるとうれしい!

    もちろん、そんなところで時間を(完全ではないにせよ)無駄にしないためにも基礎知識をきちんとつけておくべきではある。

    でも、うれしいよね。

    と、なぜ今更こういうことを書いたかというと、先ほども同じ経験をしたからである。

    ・ユーザ登録型
    ・ユーザごとに個人ページを持ち、ブログのようなことができる

    といったものをRailsの勉強で作ろうとしてるのだが、何分データベースもまともに触ったことがないので、データベースをどう作ればいいのかとここ数日悩んでいた。

    初期の想像

    Table ユーザ情報
    ID Name Password など
    1 Taro ababa
    2 Hana gegeg

    Table Taroさんのブログ
    記事ID Title Text など
    1 te fefef
    2 fdf fefe

    Table Hanaさんのブログ
    記事ID Title Text など
    1 te fefef
    2 fdf fefe

    これではユーザが増えるごとにテーブルが増える・・・テーブルが増えるとパフォーマンスが悪いと、ではどうすれば・・・。

    と先ほど思いついたのが

    Table ユーザ情報
    ID Name Password など
    1 Taro ababa
    2 Hana gegeg

    Table ブログ情報
    記事ID 投稿者ID Title Text など
    1 1 fefe cdcd
    2 2 df cece

    ブログ記事情報を一つのテーブルにまとめ、中に投稿者IDを作ればいいのだ!なるほど。

    これが正解らしい。

    と、いうことで、ふと前の経験を思い出したわけである。
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。