SourceModとは?

こんにちは!EruFFA AdminのEruです。
皆さんはUTAGEの試合を見たことはありますか?
チャット欄に出てくる試合の情報や試合を円滑に進めるために
SourceModというサードパーティ制のサーバーアドオンが使用されています。
今回はこのSourceModというサードパーティ制のアドオンの入れ方からプラグインの作り方まで
順を追って紹介してみたいと思います。

SourceModとは

SourceModはC++をベースとしたSourceエンジンとSourceSDKを使用して書かれた
MODのためのスクリプト言語です。
管理システムやコマンド、イベント、コンソール変数、ネットワークメッセージなどをSourceModから
拡張できるようにした言語です。

また、SourceModスクリプトはPawnから派生したSourcePawn言語で書かれています。

詳しくはSourceMod Wikiをご覧ください。

MetaMod導入について

SourceMod(並びにMetamod)導入について、ここではsteamcmdからのCSGOサーバーのインストール、セットアップは
完了しているもののとし、話を進めていきます。

SourceModはMetamod:Sourceが前提として必要です。
まずはMetamod:Sourceをサーバーにインストールしていきます。
Metamod:Sourceを開き左側のStable Buildsから
自分のOSにあったボタンをクリックします。
ここではWindows版をダウンロードしました。

I1

さらに、ダウンロードしたファイルの中身のaddonsフォルダを
CSGOサーバーディレクトリ/csgo/
に移動します。
(画像ではすでにaddonsフォルダが存在しますが
最初からは存在しません。)

I2

下記の画像の通り
CSGOサーバーディレクトリ/csgo/addons
という配置になっていれば成功です。

I3

SourceMod導入について

次にSourceModをサーバーにインストールしていきます。
まず、SourceModの左側のDownloadsから
Stable Buildsをクリックし、自分のOSにあったボタンをクリックします。
ここではWindows版をダウンロードしました。

K1

次にMetaModと同じ要領で、ファイルの中身のフォルダをすべて移動します。
CSGOサーバーディレクトリ/csgo/addons
CSGOサーバーディレクトリ/csgo/cfg
となるように移動します。
このときに上書きの確認が出た場合は上書きします。

K2

これでSourceMod並びにMetaMod:Sourceのインストールは完了しました。

確認方法について

最後にサーバーを起動して、コンソールに
sm versionと打ち、しっかりとインストールされているか
確認してください。この際、何も出てこない場合はどこかでインストール工程を飛ばしている、または間違えている可能性があります。
正しくインストールされていない場合はプラグインを有効化できません。
もう一度最初から確認してください。

L1

最後に

SourceModはCSGOでサーバーを稼働させるには便利なアドオンですが、
プラグインを作成できる人が少なく、日本でもSourceMod/SourcePawnの
コミュニティが少ないのが現状です。
これらのことから今回の記事を作成しています。
もし、興味を持ってもらえたら次の記事でもお会いしましょう!
以上、EruによるSourceModの導入方法の説明でした!

UTAGE BROADCASTについて

こんにちは!テクニカルエンジニアのFlowingです。
突然ですが皆さんはUTAGE BROADCASTについてご存知でしょうか?
このサービスはUTAGEの予選試合を自動的にTwitch.tvへ配信するサービスです。
ミラー配信も許可しているため、一か月に行われる宴の試合を簡単に観戦・実況することが出来ます!

今回は、このサービスの構成・仕組みや、技術的な部分について説明して行こうと思います。

企画段階

UTAGE BROADCASTは、数あるUTAGEの予選を誰でも簡単に観戦でき、ミラー配信を行えるシステムとして開発しました。
その為手動での操作を可能な限り省き、メイン部分である配信ソフトウェアの操作・CSGOサーバーへの接続は
全て全自動で行えるよう構成しました。
そのため、これまで手動で行っていた作業をどこまで自動化出来るかが構築時の焦点となりました。

構成

バックエンド部分はTypeScript(NodeJS)で記述してあります。
最初は純正NodeJSで記述していたのですが、実行時エラーが発生すると配信垂れ流しになってしまう危険性を孕んでいた為、事前コンパイルがあるTypeScriptを選びました。
フロントエンドはjQueryで記述してありますが、フロントエンドは後述する”Project Talos”の時しか公開していないので実質サービスの根幹には関わっていないと考えて構いません。

バックエンド側の処理としては、NodeJSに備わっているexpressモジュールを使いHTTPサーバーを立ち上げ、REST API経由で様々な操作を行えます。
CSGO側の状況確認はGameStateIntegration(以下GSI)とexpressを使い、CSGOへのコマンド送信はHLAEのコマンドとwebsocketサーバーをを活用する事で実装しています。
配信ソフトへの操作制御は、obs-websocket,obs-websocket-jsを使っています。
因みにvmixの方がREST APIが使える為より直感的に操作を行えそうな印象はあったのですが、コストの関係もありOBSに落ち着きました。

上記三つの技術を組み合わせ、「buytimeになったらエフェクト作動」や、「warmup時はシーンを変える」などの制御を行っています。

構築自体はは約二週間程度で動くレベルまで到達しました(その後Twitchチャンネルの取得・試運転などを入れると本番運用までは一か月程度かかりました)。

構築

試合サーバーののホスティングサービスである”Project Hypnos”のコードを少し改造し
サーバー起動時にHTTPリクエストを送れるようにしました。(Hypnosの技術説明記事もいつか公開します。お楽しみに!)
また、REST APIを公開するのはセキュリティ面に不安があった為
上記HypnosとUTAGE BROADCASTを同一PCに共存させ、localhost経由でRESTを叩けるようにしました。

各ソフトウェアが踏む手順としては以下の通りです。

  1. ユーザーが”.create-get5”と発言し、Hypnosがサーバー作成準備に入る。
  2. Hypnosがリーグサーバーが作成すると、UTAGE BROADCASTのREST APIへPOSTでIP,ポート,パスワードが入る(localhost経由)。この時点で配信が開始される。
  3. UTAGE BROADCAST側でCSGOを起動、起動オプションに+connect ipコマンドを挿入し、起動と同時にサーバーに接続するように。
  4. CSGOクライアントとUTAGE BROADCASTをHLAEとGSI経由でリンク。OBSへの操作を行い始める。
  5. CSGOクライアントの状況に応じて様々なアクションが実行される。
  6. 試合終了を検知すると自動的にCSGOがシャットダウンされ、配信が終了する。

以上がおおまかな流れです。

リリース

リリースする前に、”Project Talos”という名前で、オンラインでdemoを見れるサービスを仮公開しました。
これはngrok.io 経由でdemファイルをアップロードし、アップロードを検知したらdemファイルを再生するごく簡単なシステムです。
メイン部分(CSGO・配信ソフトの制御)は殆ど書き換える必要なく使いまわせたため、このサービスをUTAGE BROADCASTのベータ版として仮運用することにしました。

予選開始期間一週間前になり、前述した”Project Talos”ではなく、直接GOTVの試合を配信できるサービスをして”UTAGE BROADCAST”の発表・仮運用を開始しました。
これはUTAGE Discordの鯖レンタルチャンネルから起動されたGOTVを自動的に観戦するサービスです(これは告知が前後した関係と、戦術のリークにより不評を招いた為、想定よりも早くテストを終了しました)。

予選開始一日目にはサーバートラブルがありうまく作動しませんでしたが、2日目には通常通り稼働していました。

まとめ?

以上がUTAGE BROADCASTのおおまかな技術説明です。
技術関連の記事を書くのは初めてなので拙い部分もあると思いますが何か役に立てれば幸いです!
良かったら”UTAGE BROADCAST“、使って頂けたら嬉しいです。
以上、FlowingSPDGによるUTAGE BROADCASTの技術説明でした!

WE WANT YOU!

UTAGE-Techではエンジニア・デザイナー・ライターを募集中です!
興味のある方は flowing[a]utage-csgo.com までメール下さいませ!

GOTV+について

こんにちは!テクニカルエンジニアのFlowingです。
皆さんはメジャー大会のGOTVを見た事がありますか?
実は、メジャー大会のGOTVは通常のGOTVではなく、GOTV+(Official GOTV+)という特別なGOTVが使われています。
今回これを公開し、誰でも使えるようにしたバージョンを用意したので、簡単に説明して見ようと思います。

純正GOTVの説明

始めに、GOTVはゲームサーバー内の情報を、一定の遅延と共に観戦者に届けるシステムです。
これを利用することで、ゴースティングや外部からの干渉を防ぎ、プレイヤーに影響を与えず観戦を行うことが出来ます。
ただこのGOTVにはいくつか問題点があります。

  1. サーバーが重くなる
    一つ目の問題は、大人数の観戦者が繋ぐとサーバーが重くなることがある事です。
    サーバーのスペックが良ければ抑制することは出来ますが、完全にラグを消すことは難しく、一定のパフォーマンスを失います。

  2. 最大人数が64人
    二つ目の問題は、最大人数が64人です。
    コミュニティ大会規模であれば問題はありませんが
    メジャー大会など数万人が観戦するレベルになるとこれはどう頑張っても収容しきれません。
    これを解決する為にtv_relayというリレーコマンドがありますが
    それを用いても最大人数は64-1人をネズミ算式にしか増やすことが出来ず、更にリレーサーバー自体も一つのサーバーなのでコストパフォーマンスが良くありません。

  3. 回線がシビア
    三つ目の問題は、同じく通常のゲームサーバーと同じく
    UDPプロトコルを使用している為パケットロスが発生しやすいです。
    またVPNなどを利用しても、ヨーロッパ圏など遠隔地のパケットはどうしてもロスが発生してしまい、スムーズに観戦することが出来ません。(2014,2015年頃にメジャー大会を観戦した方ならわかるのではないでしょうか?)

これら三つの問題を解決するべく生み出されたのが、GOTV+です。

これは上記三つの問題を完璧に解決しているシステムです。

GOTV+の説明

GOTV+は、HTTPの通信技術と、demのシステムをベースに開発されたAPIです。
通常のホームページをホストするようなソフトウェア(NodeJS,GoLANG)を使いホストする事が出来るので
多人数から同時に接続されても安定して処理が可能です。(問題1,2解決)
また、GOTV+はCDNというHTTP通信のキャッシュ技術を活用することで、世界中どのような場所に居ても安定した通信を行うことが出来ます(GoogleやTwitchがどこからアクセスしても高速で、同じコンテンツを保持しているのと同じような感じです)。
これにより、問題3も解決されています。

サーバーオーナーは試合用サーバーに設定コマンドを入力し、GOTV+のソフトウェアの立ち上げ・ポート開放を行うだけでGOTV+をホストすることが出来ます。
サーバーは設定されたコマンドを基に、GOTV+ソフトウェアにdemファイルの断片を3秒ごとに送り続けます。
GOTV+は、この断片をCSGOクライアントが取得出来るようにし、少しずつdemを繋げるようにして再生を行います。

GOTVのメリット

GOTV+がどのような物かわかったところで、どのような利点があるのか説明していきます。

  1. 上記した問題1~3が全て解決される(全世界で超大人数が一つの試合を同時に観戦出来る)
  2. demファイルの断片なので、demoで出来ることが全て出来る(早送り、一時停止、チートコマンド、HLAE/Reshadeの使用)
  3. リプレイデータを保持する事で、オンライン上で再生出来るdemoとして機能させれる(demをダウンロードせずにリプレイを観戦出来る)

このようなメリットがあります。
1はコミュニティ大会では大事ではありませんが、2は大会演出の向上、3はユーザーに嬉しい機能ですね。

GOTVのデメリット

メリットを紹介した所で、デメリットも一緒に解説してみます。

  1. 現在のコミュニティ規模で使う意味が薄い
    現在のコミュニティではそもそもGOTV+を使うほど大きなイベントが無く、観戦もTwitchで行える為不要といえるかもしれません。

  2. 観戦者の間で時間ズレがある
    UDPではなくHTTP(TCP)を使用して通信している為、利用者同士で若干のズレが発生します。
    Twitch.tvを同じタイミングで再生してもズレてしまうとの同じです。
    その為、リアルタイムで話していたり、2画面並べて使うとズレが気になる場合があります。

  3. CDNの設置が面倒
    前述した通りCDNとうものを使えば全世界で低遅延の観戦を出来ますが、それには相応のコストがかかります。
    ある程度の設定や技術が必要なので、「全世界で低遅延で観戦する」という利点を生かす場合それなりの手間がかかります。

以上がデメリットです。

まとめ

いかがでしょうか? GOTV+について簡単に纏めてみました。
GOTV+のソフトウェアを自作したい方はCounter-Strike: Global Offensive Broadcastに簡単なAPIリファレンスを確認出来ます。
実際に動かしてみたい方は、NodeJS版,GO言語版,TypeScript版がありますので試してみてはいかがでしょうか!
以上、FlowingSPDGによるGOTV+の技術説明でした!

WE WANT YOU!

UTAGE-Techではエンジニア・デザイナー・ライターを募集中です!
興味のある方は flowing[a]utage-csgo.com までメール下さいませ!