Linux用の専用ソースサーバーの構成、パート2



投稿



Team Fortress 2の記録は、サーバー側ではプレーヤーの最終ライフの記録を作成する機会であり、クライアント側ではそれを表示、編集、保存、および公開する機会です。 SourceTVの拡張です。







エントリは、サーバーのコマンドラインで明示的に許可され、マップがロードされる前に実行される構成ファイルに含まれて構成されている必要があります。 さらに、プレーヤーにレコードを返すようにWebサーバーを事前に構成する必要があります。







Webサーバーのセットアップ



わかりやすくするために、DNSに別のreplay.example.orgサブドメインを作成し、/ var / www / replay.example.orgディレクトリを作成し、便宜上、ログを個別のファイルに記録し、ゲームユーザーにそれらを読み取れるようにします。







ルートからディレクトリを作成し、所有者(ゲーム:ゲーム)と権限(書き込みを行うゲームユーザーに、残り(Webサーバーに)-読み取り)を設定します。 また、便宜上シンボリックリンクを作成することもできます。 このWebサーバーは両方のゲームサーバーに共通ですが、それぞれが個別のディレクトリを使用してエントリをアップロードします。







# mkdir -p /var/www/replay.example.org/{htdocs/server1,htdocs/server2,log} # chown -R game:game /var/www/replay.example.org # chmod -R 755 /var/www/replay.example.org # ln -s /var/www/replay.example.org/log /home/game/log/www-replay
      
      





この構成では、デフォルトで、すべてのWebサーバーログには所有者nginx:admおよび640のアクセス許可があります。つまり、通常のユーザーにはアクセスできません。 この場合、これを修正します。







  # touch /var/www/replay.example.org/log/{access,error}.log # chmod 644 /var/www/replay.example.org/log/*.log
      
      





したがって、ユーザーはゲームのログを読み取ることができます。 しかし、最初のローテーションまでのみです。 これも修正します。 /etc/logrotate.dディレクトリで、nginxファイルをsrcds-nginxにコピーし、その中のログへのパスを指定し、 create 640 nginx adm



、アクセスマスクを640から644に修正します。







srcds-nginx
 #/etc/logrotate.d/srcds-nginx /var/www/stat.example.org/log/*.log /var/www/fastdl.example.org/log/*.log /var/www/replay.example.org/log/*.log { daily missingok rotate 52 compress delaycompress notifempty create 644 nginx adm sharedscripts postrotate if [ -f /var/run/nginx.pid ]; then kill -USR1 `cat /var/run/nginx.pid` fi endscript }
      
      





ここでは、ローテーションパスで、HLstatsX統計サーバーとFast Downloadサーバーからのログを含むディレクトリも指定しました。







ルートから、Webサーバー構成ファイル/etc/nginx/conf.d/replay.example.org.confを作成します。







replay.example.org.conf
 # /etc/nginx/conf.d/replay.example.org.conf server { server_name replay.example.org; listen 80; root /var/www/replay.example.org/htdocs; disable_symlinks on; autoindex off; access_log /var/www/replay.example.org/log/access.log main; error_log /var/www/replay.example.org/log/error.log warn; }
      
      





もちろん、これはやや簡略化されたバージョンです。 この場合、Webサーバーはゲームサーバーと同じコンピューター上にあり、インターネット上で1つのチャンネルを共有しているため、レコードをアップロードするためのチャンネル幅に追加の制限を規定することは理にかなっています。 ただし、高速ダウンロード設定とは異なり、リファラーに追加のチェックをインストールする必要はありません。







replay.example.org.conf呼び出しをメインファイル/etc/nginx/nginx.confに書き込みます(まだない場合)。次に、構成をテストし、nginxを再起動します。







  # nginx -t # systemctl reload nginx
      
      





私たちはゲームユーザーとして継続します。







ゲームサーバーのセットアップ



デフォルトでは、サーバーはレコードを解決するときに、起動時に〜/ tf2 / tf / cfg / replay.cfg構成ファイルを実行しようとします。 個々の設定が異なる必要がある両方のサーバーにレコードを含めるため、以前の場合と同様に、サーバーごとに個別のファイルを準備します。







〜/ tf2 / tf / cfgディレクトリにreplay_example.cfgファイルがあります。これを調べて、独自のファイルを作成してください。 最初のサーバーの場合、〜/ cfg / replay1.cfg:







replay1.cfg
 echo "*** ~/cfg/replay1.cfg" replay_name "  " replay_local_fileserver_path /var/www/replay.example.org/htdocs/server1 replay_fileserver_offload_enable 0 replay_fileserver_host replay.example.org replay_fileserver_path /server1 replay_enable 1
      
      





ここに:







replay_name





オブザーバー(観客)のリストに表示される方法を記録するための特別なボットの名前。







replay_local_fileserver_path





既製の録音ファイルが置かれるディレクトリ。 ゲームサーバーごとに個別であり、Webサーバーで読み取り可能である必要があります。







replay_fileserver_offload_enable





1の場合-レコードはftp経由で別のサーバーにアップロードされ、サーバー自体は既にhttp経由でそれらを配信します。 私たちの場合ではありません。







0の場合、マシンのWebサーバーが配布を処理します。







replay_fileserver_host





Webサーバー名またはIP







replay_fileserver_path





url部分は、Webサーバーによって表示されるレコードへのパスです。







replay_enable





実際には、サーバー上のエントリが含まれます。







したがって、ここで言及されていない変数replay_local_fileserver_path、replay_fileserver_host、replay_fileserver_path、replay_fileserver_protocol(= "http")およびreplay_fileserver_port(= "80")から、 " http://replay.example.org:80/server1 "の形式のURLが形成されますレコードをダウンロードします。 また、replay_local_fileserver_path変数は、ファイルシステム内の実際のディレクトリの場所を設定し、nginx + replay_fileserver_path構成ファイルのルートに等しくなります。







このファイルをreplay2.cfgにコピーし、server1-> server2パスを修正します







replay2.cfg
 echo "*** ~/cfg/replay2.cfg" replay_name "My replay bot" replay_local_fileserver_path /var/www/replay.example.org/htdocs/server2 replay_fileserver_offload_enable 0 replay_fileserver_host replay.example.org replay_fileserver_path /server2 replay_enable 1
      
      





〜/ tf2 / tf / cfgにリンクを作成します。







  $ ln -s -v ~/cfg/replay{1,2}.cfg ~/tf2/tf/cfg/
      
      





これらの構成ファイルは、autoexec.cfgの後、サーバーの最初の起動時にのみ実行されることに注意してください。 カードを変更する場合、それらは関係しません。







多かれ少なかれ有用なコンソール変数の多く:







replay_dopublishtest





レコードのサーバー(ゲームとWeb)の準備状況のテストを行います-ファイルシステム内のパスの可用性、Webサーバーの名前などをチェックします。







replay_data_lifespan





日数(デフォルトでは1日)を設定します。その後、サーバー上のエントリは「失効」としてマークされ、手動または自動クリーニングで削除できます。







replay_docleanup





「古い」エントリを削除します。 パラメーター 'force'を使用すると、一般的にすべてのレコードが削除されます。







replay_fileserver_autocleanup





デフォルトでは0-オフで、ラウンド間で「古い」レコードの自動クリーニングを開始します。







replay_dofileserver_cleanup_on_start





デフォルトでは1-オン、サーバーの起動時に〜/ tf2 / tf / replay / server {1,2}とWebサーバーディレクトリ/var/www/replay.exampleの両方で「古い」エントリの自動クリーニングを開始します。 org / htdocs / server {1,2}。







replay_record_voice





デフォルトでは1-オン、プレイヤーのボイスチャットを記録します。







このバージョンのSteamエンジンの関連変数のリストは、サーバーコンソールでfind replay_



と入力することで表示できます。







包含物



start serverスクリプトstart {1,2} .shで、コマンドラインに追加します。







最初のサーバーの場合:







start1.sh
 CMDLINE="... -replay reply1.cfg -replayserverdir server1 \ ...
      
      





2番目の場合:







start2.sh
 CMDLINE="... -replay reply2.cfg -replayserverdir server2 \ ...
      
      





ここで、「-replay」コマンドには記録機能が含まれ、サーバーの起動時に指定された構成ファイルを実行します。 2番目のコマンド「-replayserverdir」は、各サーバーがエントリを蓄積するディレクトリの名前(パス〜/ tf2 / tf / replay /から)をパラメーターとして受け取ります。







すべて、サーバーを起動して試す​​ことができます。 ゲームクライアントでは、サーバーの名前の近くのサーバーブラウザーで、VACダッシュボードの横に特徴的なレコードアイコンが表示されます。







記録をオンにすると、サーバーにオブザーバーモードでボットが表示されます。これは実際に記録すると同時に1つのゲームスロットを占有します。 したがって、サーバーの起動時に設定される「+ maxplayers 24」プレーヤーの最大数は1つ増加します。つまり、この場合は25になります(SteamTVがオンになっている場合は26)。







古いレコード設定ガイドでは通常、サーバーコマンドラインパラメーター「-replay_port」が指定されていますが、2011年に取り消されたため、言及していません-store.steampowered.com/news/6282/







プレーヤー(SourceModにバンドルされているものを含む)での大量のアクションを容易にするプラグインを使用する場合、レコーディングボットに注意する必要があります。 いずれにせよ、サーバーからうっかりキックしないでください:)


サービス



レコードファイルは、サイズは小さいものの、再生ディレクトリと/ var / www /の両方で、依然としてディスク領域を占有します。 そして、1日の設定されたエージング日(replay_data_lifespan 1)とこれらのディレクトリの自動クリーニング(replay_dofileserver_cleanup_on_start 1)にもかかわらず、古いファイルは自動的に削除されません。 replay_docleanupを手動で開始する場合でも。 したがって、安全上の理由から、 crontab -e



を実行して最後に追加することにより、古いレコードの強制クリーニングを追加します。







crontab
 0 3 * * * /usr/bin/find ~/tf2/tf/replay/server{1,2}/* -type f -mtime +10 -delete 0 3 * * * /usr/bin/find /var/www/replay.example.org/htdocs/server{1,2}/* -type f -mtime +10 -delete
      
      





cronが角括弧の拡張をサポートするシェルを使用することを確認するとよいでしょう-"{1,2}"







access.logを読むと、サーバーに接続しているとき、プレーヤー、またはむしろゲームクライアントが、3週間前にプレイしたゲームの記録を伝えようとすることがあります。







もう1つのポイント-レコードはプロセッサ時間を消費することに注意してください。 ロードの例は、「ボット」セクションの最後に記載されています。







Sourcetv



次にSourceTVを構成します。 これは、世界選手権をホストするときに、世界選手権のオンライン放送に役立ちます。







SourceTVを使用すると、視聴者はTeam Fortress 2クライアントを介して、サーバー上のゲームの進行状況を監視できます。 プロキシサーバーのチェーンを使用する場合、オーディエンスのサイズは実質的に無制限ですが、この場合、ゲームがゲームサーバーによってのみブロードキャストされる場合、それぞれがプロセッサリソースとインターネットチャネルの両方を消費するため、視聴者の数を制限することは理にかなっています。







ゲームサーバーの起動の初期設定中に、各サーバーのポート番号とともにコマンドラインですでに「+ tv_port」を指定したため、すぐに設定ファイルに移動できます。







録画設定と同様に、マップをロードする前にSourceTVをアクティブにする必要があります。つまり、tv_enable 1コマンドをサーバー起動コマンドラインまたはautoexec.cfgファイルで実行する必要があります。 さらに、tv_nameコマンドにも同様の要件があることが実験的に確立されました。







サーバーのSourceTV設定は固定されており、各マップの変更を変更する予定はないため、一般的なものはすべてautoexec.cfgに、個々の設定はautoexec {1,2} .cfgに含めます。







〜/ cfg / autoexec.cfgに一般設定を追加します。







autoexec.cfg
 //... // SourceTV //      tv_title "  !" //    // tv_password "" //    tv_maxclients 5 //      tv_maxrate 0 //   (1)   POV  (0) tv_transmitall 1 //    tv_delay 20 //  - tv_allow_camera_man 0 //     //tv_record <filename> //   //tv_stoprecord //   tv_autorecord 1
      
      





ここに:







tv_title





ブロードキャストを表示するときに、視聴者のウィンドウのタイトルバー。







tv_password





ブロードキャストに接続するためのパスワード。







tv_maxclients





視聴者の最大数(0〜255)はデフォルトで128です。オンラインブロードキャストではなく、ゲームの録画(tv_record、tv_autorecord)のみが必要な場合は、ゼロに設定できます。







tv_maxrate





各プレーヤーの最大チャンネル幅。デフォルトでは-8000 bps、0に設定されている場合-制限なし。 特にサーバーが完全に視聴者でいっぱいになる予定の場合、このパラメーターは以前のパラメーターと密接にリンクしています。







tv_transmitall





デフォルト( "0")では、視聴者にはSourceTVオペレーターが表示するもの(AIまたは特別な訓練を受けた人)のみが与えられます。 「1」に設定すると、視聴者にはゲームに関するすべての情報が提供され、異なるプレーヤーのPOVを切り替えたり、マップの上または下にホバーすることもできます。 パラメータをオンにすると、各視聴者に必要なチャンネル幅が2〜3倍になります。







tv_delay





視聴者へのブロードキャスト遅延は秒単位で、デフォルトは30です。視聴者がプレーヤーにヒントを与えることができる場合、不正行為を減らすのに役立ちます。







tv_delaymapchange





ブロードキャストが終了するまで(tv_delay遅延により)カードの変更を遅延( "1")するかしないか( "0"-デフォルト)。







tv_delaymapchange_protect





ラウンドが終了するまで、カードを手動で変更しないように保護します(「1」-デフォルト)。







tv_allow_camera_man





許可( "1"-デフォルト)または禁止( "0")オブザーバープレーヤーはSourceTVオペレーターになります。 「0」の場合-自動カメラ制御のみ。







tv_autorecord





オン( "1")にすると、すべてのゲームは、「auto-20160630-2208-koth_sawmill」などの〜/ tf2 / tfディレクトリにあるauto-<YYYYMMDD>-<hhmm>-< >.dem



という形式のファイルに自動的に書き込まれます。 .dem "。







パスワード(「tv_password <password>」)を設定すると、視聴者はサーバーブラウザーから接続できなくなります。「Disconnect:Bad spectator password」というメッセージで常に拒否され、サーバーコンソールで「Dropped <player> from server(Bad観客パスワード)」。 接続するには、視聴者はゲームのコンソール( ~



)にpassword <>



password <>



し、コンソールを閉じてから接続を試みる必要があります。 または、すぐにコンソールconnect 192.0.2.0:27020; password <>



入力しconnect 192.0.2.0:27020; password <>



connect 192.0.2.0:27020; password <>



〜/ cfg / autoexec1.cfgで、最後に追加します:







autoexec1.cfg
 //... //  SourceTV tv_enable 1 //     tv_name "SourceTV at Public Server No 1"
      
      





ここに:







tv_name





SourceTVサーバーの名前。サーバーブラウザーの[監視]タブに表示されます。







tv_enable





サーバー上のSourceTVを含む(「1」)または含まない(「0」、デフォルト)。







同様に、〜/ cfg / autoexec2.cfgを調整します







autoexec2.cfg
 //... tv_enable 1 tv_name "SoutceTV at Private Server No 2" tv_autorecord 0
      
      





しかし、2番目のサーバーでは、autoexec2.cfgの自動記録を無効にしました。 名前が「workshop /」または「workshop / .ugc」のようなSteam Workshopから接続されたカードで自動記録(「tv_autorecord 1」)を有効にすると問題が発生します。つまり、スラッシュ「/」が含まれます。スキームauto-<YYYYMMDD>-<hhmm>-< >.dem



のファイル名が不格好になり、 auto-<YYYYMMDD>-<hhmm>-< >.dem



の形式のログに悪用されます。





  Failed to write file /home/game/tf2/tf/replay/server2/sessions/20160702-074150-workshop/cp_orange_x3.ugc454299390.dmx Failed to write file /home/game/tf2/tf/replay/server2/blocks/20160702-074150-workshop/cp_orange_x3.ugc454299390_part_0.dmx ******************************************************************************** * * Replay recording shutting down due to publishing error! Recording will begin * at the beginning of the next round, but may fail again. * ******************************************************************************** ERROR: Publish timed out after 60 seconds.
      
      





そして、その結果、記録を無効にします。 または、「tv_record」を使用してスキームを考えることができます。これにより、記録するファイル名を手動で指定できます。







SourceTVをオンにすると、ボットがサーバーにオブザーバーモードで表示されます。このモードでは、ゲームのブロードキャストが行われ、同時に1つのゲームスロットが占有されます。 したがって、サーバーの起動時に設定される「+ maxplayers 24」プレーヤーの最大数は1つ増加します。つまり、この例では25に等しくなります(リプレイをオンにすると-26)。







そのため、コマンドが登録され、サーバーを再起動して、何が起こるかを確認してください。 ゲームスロットを占有するエントリもあるため、次のように表示されます。







  *** ~/cfg/autoexec.cfg (global) -------------------------------------------------------- sv_pure set to 2. -------------------------------------------------------- maxplayers set to 25 *** ~/cfg/autoexec1.cfg Server logging enabled. Server logging data to file /home/game/log/server1/L1008000.log maxplayers set to 26 (extra slot was added for SourceTV) ... Cannot verify load for invalid steam ID [A:1:0:1] Cannot verify load for invalid steam ID [A:1:1:1] Recording SourceTV demo to auto-20161008-1155-cp_granary.dem... Connection to game coordinator established. *** ~/cfg/server1.cfg ... SourceTV broadcast active. Connection to Steam servers successful. Public IP is 192.0.2.0.
      
      





そのため、最初は、サーバー上のプレーヤーの最大数が24から25に増加しました。これにより、コマンドラインパラメーター「-replay」が機能し、レコードがオンになりました。 次に、SourceTV用に別の追加スロットが追加されました。autoexec1.cfgから「tv_enable 1」が機能しました。 無効なスチームID [A:1:0:1]についての誓いには注意を払いません。これらは、サーバーがゲームスロットを追加した記録ボットとブロードキャストボットです。 次に、ファイルへのデモの記録〜/ tf2 / tf / auto-20161008-1155-cp_granary.demが開始されました-autoexec.cfgのパラメーター「tv_autorecord 1」が機能しました。 そして最後に、SourceTV放送がアクティブであると言われました。







稼いだ。 マップにボットを追加し、ビューアに接続して、tv_transmitall、tv_allow_camera_manのさまざまなモードでブロードキャストがどのように見えるかを確認できます。







スロットが追加されることもありますが、「SourceTV broadcast active」についてです。 言葉ではなく、サーバーのtv_status



コマンドを入力すると、「SourceTV not active。」と誓いますが、 tv_status



tv_status



入力されますが、「tv_enable = 1(def。0)」と表示されます。 この場合、map- changelevel < >



変更してみてください。 変更後にすべてが機能した場合、最初のカードをロードする前にSourceTVが最初にアクティブ化されなかったことを意味します。設定を確認する必要があります。







役立つコマンド:







tv_record < >





ファイル<ファイル名>に保存された記録を開始します。 オペレーターが見るものに関係なく、すべてのイベントが記録されます。







tv_stoprecord





記録を停止します。







tv_clients





接続している視聴者に関する情報を表示します。







tv_msg





すべての視聴者にメッセージを送信します(画面の中央に表示されます)。







tv_status





サーバーのステータスに関する簡単な情報を表示します-オンライン時間、FPS、視聴者数、使用されたチャンネル帯域など。







このバージョンのゲームサーバーの関連変数のリストは、サーバーコンソールにfind tv_



と入力することで表示できます。







コンテンツのダウンロードを高速化する(高速ダウンロード)



標準のTeam Fortress 2パッケージに含まれておらず、Steam Workshopで利用できないサーバー上のカード、モデル、サウンドを使用する場合、新しいプレーヤーが接続されたときに、ゲーム素材をゲームコンピューターにダウンロードする必要があります(まだ持っている場合)いいえ)。 デフォルトでは、ゲームサーバーからダウンロードされます-このモードはスローダウンロードと呼ばれます。 ただし、ゲームサーバーはまだ新しいユーザーカードを頻繁にインストールし、高負荷の専用Webサーバーではないため、カードを配信する機能(およびサウンド、モデルなど)を特別に訓練されたWebサーバーに割り当てることは合理的です。 幸せな偶然の一致によって、私たちはすでに持っています。 この機能は高速ダウンロードと呼ばれます。







Webサーバーのセットアップ



高速ダウンロードを使用するには、次の形式のサブディレクトリ構造を持つディレクトリを使用するようにWebサーバーに指示する必要があります







  dir/maps dir/materials dir/sound ...
      
      





ここで、「dir」は高速ダウンロードのルートディレクトリです。 / home / gameに作成することはできません-rwx権限を持つホームディレクトリは----であり、Webサーバーがこれらのファイルを見ることができません。 したがって、これらのディレクトリは、ゲームユーザーのホームディレクトリ以外の場所に作成します。







設定を簡素化するために、DNSにfastdl.example.orgの個別のサブドメインを記述し、ディレクトリ/var/www/fastdl.example.orgを作成します。便宜上、ログを個別のファイルに書き込み、ゲームユーザーがそれらを読み取る機会を提供します。







ルートディレクトリからディレクトリを作成し、所有者(game:game)とゲームユーザーの書き込み権限を設定し、残り(webサーバーに対する)読み取り権限を設定します。 また、便宜上シンボリックリンクを作成することもできます。 Fast Downloadディレクトリは、両方のゲームサーバーに共通です。







  # mkdir -p /var/www/fastdl.example.org/htdocs/{maps,materials,sound} # mkdir /var/www/fastdl.example.org/log # chown -R game:game /var/www/fastdl.example.org # chmod -R 755 /var/www/fastdl.example.org # ln -s /var/www/fastdl.example.org/htdocs /home/game/fastdl # ln -s /var/www/fastdl.example.org/log /home/game/log/www-fastdl
      
      





この構成では、デフォルトで、すべてのWebサーバーログには所有者nginx:admおよび640のアクセス許可があります。つまり、通常のユーザーにはアクセスできません。 この場合、これを修正します。







  # touch /var/www/fastdl.example.org/log/{access,error}.log # chmod 644 /var/www/fastdl.example.org/log/*.log
      
      





したがって、ユーザーはゲームのログを読み取ることができます。 しかし、最初のローテーションまでのみです。 これも修正します。 /etc/logrotate.dディレクトリで、nginxファイルをsrcds-nginxにコピーし、その中のログへのパスを指定し、 create 640 nginx adm



行目から644行目でcreate 640 nginx adm



fixのアクセスマスクをcreate 640 nginx adm









srcds-nginx
 #/etc/logrotate.d/srcds-nginx /var/www/stat.example.org/log/*.log /var/www/fastdl.example.org/log/*.log /var/www/replay.example.org/log/*.log { daily missingok rotate 52 compress delaycompress notifempty create 644 nginx adm sharedscripts postrotate if [ -f /var/run/nginx.pid ]; then kill -USR1 `cat /var/run/nginx.pid` fi endscript }
      
      





ここでは、ローテーションパスで、HLstatsX統計サーバーとエントリを持つサーバーからのログを含むディレクトリも指定しました。







考慮すべき別の面白い点があります。 ほとんどのサーバーでは、関連する可能性は低いですが、それでも変わりません。 悪意からではなく、私たちのものと同じユーザーカードを持つゲームサーバーの所有者を妨げるものはありませんが、トラフィックを節約するために、高速ダウンロード設定でウェブサーバーのアドレスを指定してください(ゲームコンソールでsv_downloadurl



を入力するだけです)サーバーに接続することによるクライアント)。







このような寄生虫はリファラーによって検出できます。リファラーを使用して、マップが当社からダウンロードされます。 そのため、ゲームクライアントがカードをダウンロードすると、ゲームサーバーの送信から、フォームの記録がWebサーバーログに表示されます。







  198.51.100.0 http://fastdl.example.org - [16/Jun/2016:20:08:28 +0600] "GET /maps/cp_orange_x5.bsp.bz2 HTTP/1.1" 200 2685506 "hl2://192.0.2.0:27015" "Half-Life 2" 0.453 "-"
      
      





リファラーに注意してください。 設定時にこれを考慮します。







そのため、Webサーバーを構成するように設定されています。 まず、リファラーが正しいマップと正しいマップをダウンロードしているかどうかを判断します。 /etc/nginx/nginx.conf, http {}, fastdl.example.org, :







nginx.conf
 # /etc/nginx/nginx.conf http { # <...> map $http_referer $bad_client { default 1; "hl2://192.0.2.0:27015" 0; "hl2://192.0.2.0:27016" 0; } include /etc/nginx/conf.d/fastdl.example.org.conf; }
      
      





ここではすべてが簡単です。 $http_referer , $bad_client ( 1) 0.







/etc/nginx/conf.d/fastdl.example.org.conf.







fastdl.example.org.conf
 #/etc/nginx/conf.d/fastdl.example.org.conf server { server_name fastdl.example.org; listen 80; root /var/www/fastdl.example.org/htdocs; disable_symlinks on; default_type application/octet-stream; if ($bad_client) { #      https://habrahabr.ru/post/272261/,     return 403; } access_log /var/www/fastdl.example.org/log/access.log main; error_log /var/www/fastdl.example.org/log/error.log warn; }
      
      





— $bad_client, .







, nginx valid_referers, $http_referer, , . map .







fastdl.example.org.conf nginx.conf , nginx.







  # nginx -t # systemctl reload nginx
      
      





game.









, ( bzip2), (.bsp) . , - cp_orange_x5 ( — , Steam Workshop), :







  $ mv cp_orange_x5.bsp ~/fastdl/maps $ ln -s ~/fastdl/maps/cp_orange_x5.bsp ~/tf2/tf/maps $ bzip2 --compress --keep --verbose --best ~/fastdl/maps/cp_orange_x5.bsp
      
      





~/fastdl/maps, . , , , . < >.cfg ~/tf2/tf/cfg ( ~/cfg, ).







~/cfg/autoexec.cfg:







autoexec.cfg
 //... // Fast Download //  -,       //   Fast Download  sv_downloadurl "" sv_downloadurl "http://fastdl.example.org" //       (, ). . sv_allowupload 0 //       //    Slow Download.     . sv_allowdownload 1
      
      





. , . , , autoexec.cfg Fast Download.







- — exec <configfile>



. Fast Download , autoexec.cfg, "" , server.cfg. , . , autoexec.cfg :-)

SteamApps\common\Team Fortress 2\tf\download\maps\ cp_orange_x5.bsp, — ( ).







, , , Fast Download ( "Downloading maps/cp_orange_x5.bsp.bz2" — .bz2 ):







Fast Download working







( _x3, ).







, , " " (cl_downloadfilter mapsonly), "Map is missing".







Allow maps downloading







http://fastdl.example.org/maps/cp_orange_x5.bsp.bz2 , "403 Forbidden" — , referer hl2://192.0.2.0



, .







:







Fast Download ( sv_downloadurl), -, , < >.bsp.bz2, 404 , .bz2 — < >.bsp. , ~/tf2/tf/maps Slow Download, , .







Map missing









Team Fortress 2 — . , ( sv_cheats 0), . — "", (sv_cheats 1).







TF wiki , King of the Hill ( koth_*



), Payload ( pl_*



), Dustbowl Gorge, Capture the Flag ( ctf_*



) Mann Manor ( cp_manor_event



). , . . , . .









koth_sawmill, by design. 24 . , 24 , . , 24, . — . — . , . , ~/cfg/koth_sawmill.cfg:







koth_sawmill.cfg
 echo "*** ~/cfg/koth_sawmill.cfg" //    tf_bot_difficulty 3 //      tf_bot_join_after_player 0 //   tf_bot_keep_class_after_death 0 //      tf_bot_quota_mode fill //      tf_bot_quota 24
      
      





:







tf_bot_difficulty 3





. 0=easy, 1=normal, 2=hard, 3=expert.







tf_bot_join_after_player 0





(0), (1), .







tf_bot_keep_class_after_death 0





, (, , ...), (1) (0), .







tf_bot_quota 24





, . , tf_bot_quota_mode "fill" "match", , +maxplayers .







tf_bot_quota_mode fill





:







"normal" — / (tf_bot_add / tf_bot_kick)







"fill" — ( + ) , tf_bot_quota







"match" — 1:N, N tf_bot_quota.







tf_bot_add [] [] [] [] []





, (, , maxplayers)







[] — Demoman, Engineer, HeavyWeapons, Medic, Pyro, Scout, Soldier, Sniper, Spy







[] — red blue







[] — tf_bot_difficulty, . 0=easy, 1=normal, 2=hard, 3=expert.







, ~/cfg, ~/tf2/tf/cfg:







  $ ln -s ~/cfg/koth_sawmill.cfg ~/tf2/tf/cfg
      
      





, , : changelevel koth_sawmill



. , expert-lvl tf_bot_difficulty 1 :-)









. cp_orange_x3.







koth_sawmill.cfg cp_orange_x3.cfg, Steam Workshop:







  $ mkdir ~/tf2/tf/cfg/workshop $ cp ~/cfg/koth_sawmill.cfg ~/tf2/tf/cfg/workshop/cp_orange_x3.ugc454299390.cfg
      
      





cp_orange_x3.ugc454299390.cfg echo , .







. changelevel workshop/cp_orange_x3.ugc454299390



. — , :













. , : sv_cheats 1



— - nav_generate



— ( < >.nav), . ...







  Generating Navigation Mesh... Sampling walkable space... Sampling walkable space... Sampling walkable space... Creating navigation areas from sampled data... Connecting navigation areas... Merging navigation areas... Created new fencetop area 1781(fc537be) between 3(1f542dcf) and 49(274fa843) Finding hiding spots...DONE Finding encounter spots...DONE Finding sniper spots...DONE Computing mesh visibility... Computing mesh visibility... 0% Computing mesh visibility... 1% Computing mesh visibility... 5% Computing mesh visibility... 17% Can't compute incursion distances from the Red spawn room(s). <...> Can't compute incursion distances from the Blue spawn room(s). <...> Computing mesh visibility... 84% Optimizing mesh visibility... NavMesh Visibility List Lengths: min = 12, avg = 104, max = 280 Computing mesh visibility...DONE Finding earliest occupy times...DONE Start custom... Post custom... Custom game-specific analysis...DONE Generation complete! 77.8 seconds elapsed. Navigation map '/home/game/tf2/tf\maps\workshop/cp_orange_x3.ugc454299390.nav' saved. [TF Workshop] Preparing map ID 454299390 [TF Workshop] Successfully prepared client map from workshop [ workshop/cp_orange_x3.ugc454299390 ] ---- Host_Changelevel ----   .
      
      





. "sv_cheats 0" server2.cfg. , , sv_cheats 0, — , .







— , . , , . .







- , . Navigation Mesh Commands , Steam Users Forum .







"" (Puppet bots). , , . . TF Wiki, . https://youtu.be/Dn9970dxQ2g







, , , . , top Atom N2800:













24 ( , ), 12, . , . , , 7%. tf_bot_join_after_player 1 .







, , — ( ), (koth_sawmill.cfg cp_orange_x3.ugc454299390.cfg ) , , . , — , - " ", , .nav . , , tf_bot_quota 0 server{1,2}.cfg — , .














All Articles