Closed17

CS2サーバーをLinux上でホストしたい(LIMITED TEST期間中)

FlowingSPDGFlowingSPDG

明日、友人の家でCS2のLANパーティーにお呼ばれしたので、CS2サーバーをLinux上でホストする方法について調査を行う。
以下、免責事項など。

  • 明日、2023年9月27日水曜日にCS2のオープンベータがリリースされると噂されている
  • Windowsで建てる方法は既に存在する(https://www.reddit.com/r/GlobalOffensive/comments/16asst1/cs2_how_to_create_a_prac_server_with_your_friends/)
  • Linuxで建てる方法はあるが、チート開発を行う掲示板で公開されているパッチ版CS2なので、今回は取り扱わない
  • 公式に近い方法で、CS2のベータ版アクセス権を所有するユーザーがなるべく安全な方法でサーバーを建てる方法を模索する
  • なお、本スクラップ上で紹介する建て方を真似した結果、ValveによりSteamアカウントのBAN処置や、PCの破損などが発生しても筆者は一切の責任を負わない
FlowingSPDGFlowingSPDG

まずはDockerを使用し、SteamCMDをダウンロードする。

docker pull steamcmd/steamcmd:latest

SteamCMDを起動し、ログインする。
通常サーバーのダウンロードにはanonymous(匿名アカウント)を使用するが、今回はCS2のアクセス権が必要なので、IDを使ってログインを行う。

docker run -it steamcmd/steamcmd:latest +login [SteamのログインID]

以下、コンソール出力。

flowing@DESKTOP-BUIITN0:~$ docker run -it steamcmd/steamcmd:latest +login [SteamのログインID]
ln: failed to create symbolic link '/root/.steam/root': No such file or directory
ln: failed to create symbolic link '/root/.steam/steam': No such file or directory
Redirecting stderr to '/root/Steam/logs/stderr.txt'
Logging directory: '/root/Steam/logs'
[  0%] Checking for available updates...
[----] Verifying installation...
Steam Console Client (c) Valve Corporation - version 1694466999
-- type 'quit' to exit --
Loading Steam API...dlmopen steamservice.so failed: steamservice.so: cannot open shared object file: No such file or directory
OK
Logging in user '[SteamのログインID]' to Steam Public...
password:
Enter the current code from your Steam Guard Mobile Authenticator app
Two-factor code:XXXXX
OK
Waiting for client config...OK
Waiting for user info...OK

Steam>

自分の場合、Steamアプリでの二段階認証を設定していたため2FAの入力も求められた。

FlowingSPDGFlowingSPDG

ちなみに、以下のコマンドで一発でログイン・$pwd/srcds までDLができた。
CS2のデータは特にダウンロードされなかった。

docker run -it -v $PWD/srcds:/data steamcmd/steamcmd:latest +login [SteamID] [パスワード] [2FA] +force_install_dir /data +app_update 740 +quit
FlowingSPDGFlowingSPDG

なぜかSteamへのログインがRate Exceedで出来なくなってしまったので、その間にCS2の情報に関してSteamDBで調べてみる。
https://steamdb.info/app/730/config/

Launch Optionsの項目を見てみると、CS2の起動に関連したオプションが多数見つかる。
Counter-Strike 2 Limited Test のWindows版の起動には、DB上でDLCとして扱われているCS2へのアクセス権が必要となりそう(AppID: 2279720)。
https://steamdb.info/app/2279720/

macos, Linuxでの起動には、また別個のDLC(AppID: 741)の所有が条件となりそう...?

https://steamdb.info/app/741/
また、DLCの関連パッケージを追いかけてみると、Counter-Strike: Global Offensive Internal Use Betaなる開発者向けのパッケージが存在することが確認できる。
https://steamdb.info/sub/11758/apps/

FlowingSPDGFlowingSPDG

調査しているうちにSteamのレート制限が解除されたっぽい。
一度ログインしたらしばらくログアウトしないようにしながら慎重に進める。

FlowingSPDGFlowingSPDG

以下のコマンドで、CS2のゲームクライアントLinux版のインストールが出来ないか試してみる。
参考までに、ゲームクライアントがAppID: 730であり、サーバーのAppIDは740である。

docker run -it -v $PWD/srcds:/data steamcmd/steamcmd:latest +login [SteamID] [パスワード] [2FA]
Steam> app_update 730 -beta "Counter Strike 2 (Limited Test)"
FlowingSPDGFlowingSPDG

ダウンロードが完了。
treeコマンドの実行結果。

flowing@DESKTOP-BUIITN0:/mnt/c/Users/Flowing/srcds$ tree -L 2
.
├── EmptySteamDepot
├── bin
│   ├── adminserver.dll
│   ├── bsppack.dll
│   ├── bsppack_client.so
│   ├── bugreporter_public.dll
│   ├── cairo.dll
│   ├── convertdmx.lua
│   ├── crashhandler.dll
│   ├── crashhandler.so
│   ├── datacache.dll
│   ├── datacache.so
│   ├── datacache_client.so
│   ├── dedicated.dll
│   ├── dedicated.so
│   ├── dedicated_client.so
│   ├── dxsupport.cfg
│   ├── dxsupport_episodic.cfg
│   ├── dxsupport_mac.cfg
│   ├── engine.dll
│   ├── engine.so
│   ├── engine_client.so
│   ├── engine_ds_client.so
│   ├── engine_xlsp.so
│   ├── filesystem_stdio.dll
│   ├── filesystem_stdio_client.so
│   ├── filesystem_steam_client.so
│   ├── filesystemopendialog.dll
│   ├── icui18n.dll
│   ├── icuuc.dll
│   ├── imemanager.dll
│   ├── inputsystem.dll
│   ├── inputsystem_client.so
│   ├── launcher.dll
│   ├── launcher_client.so
│   ├── libMiles.so
│   ├── libSDL2-2.0.so.0
│   ├── libavcodec-56.dll
│   ├── libavformat-56.dll
│   ├── libavresample-2.dll
│   ├── libavutil-54.dll
│   ├── libfbxsdk.dll
│   ├── libfontconfig-1.dll
│   ├── libfreetype-6.dll
│   ├── libgcc_s.so.1
│   ├── libglib-2.0-0.dll
│   ├── libgmodule-2.0-0.dll
│   ├── libgobject-2.0-0.dll
│   ├── libmysqlr.dll
│   ├── libpango-1.0-0.dll
│   ├── libpangoft2-1.0-0.dll
│   ├── libsteam_api.so
│   ├── libsteamnetworkingsockets.so
│   ├── libswscale-3.dll
│   ├── libtelemetryx64.so
│   ├── libtelemetryx64c.so
│   ├── libtelemetryx86.so
│   ├── libtelemetryx86c.so
│   ├── libtier0.so
│   ├── libtier0_client.so
│   ├── libtogl_client.so
│   ├── libvstdlib.so
│   ├── libvstdlib_client.so
│   ├── linux32
│   ├── linux64
│   ├── locales
│   ├── localize.dll
│   ├── localize_client.so
│   ├── map_publish
│   ├── maplist_csgo.txt
│   ├── materialsystem.dll
│   ├── materialsystem.so
│   ├── materialsystem_client.so
│   ├── mdllib.dll
│   ├── mss32.dll
│   ├── mssdolby.flt
│   ├── mssds3d.flt
│   ├── mssdsp.flt
│   ├── msseax.flt
│   ├── mssmp3.asi
│   ├── msssrs.flt
│   ├── panorama.dll
│   ├── panorama_text_pango.dll
│   ├── panoramauiclient.dll
│   ├── parsifal.dll
│   ├── phonon.dll
│   ├── prefabs
│   ├── scenefilecache.dll
│   ├── scenefilecache.so
│   ├── scenefilecache_client.so
│   ├── serverbrowser.dll
│   ├── serverbrowser_client.so
│   ├── serverplugin_empty.dll
│   ├── shaderapidx9.dll
│   ├── shaderapidx9_client.so
│   ├── shaderapiempty.dll
│   ├── shaderapiempty.so
│   ├── sixense.dll
│   ├── sixense_utils.dll
│   ├── soundemittersystem.dll
│   ├── soundemittersystem.so
│   ├── soundemittersystem_client.so
│   ├── soundsystem.dll
│   ├── stdshader_dbg.dll
│   ├── stdshader_dx9.dll
│   ├── stdshader_dx9_client.so
│   ├── steam_api.dll
│   ├── steam_appid.txt
│   ├── steamclient.dll
│   ├── steamclient.so
│   ├── steamerrorreporter
│   ├── steamnetworkingsockets.dll
│   ├── studiorender.dll
│   ├── studiorender.so
│   ├── studiorender_client.so
│   ├── telemetry32.dll
│   ├── telemetry32c.dll
│   ├── texturecompile_dll.dll
│   ├── tier0.dll
│   ├── tier0_s.dll
│   ├── trxtemplate.xml
│   ├── unitlib.dll
│   ├── unitlib.so
│   ├── v8.dll
│   ├── v8_libbase.dll
│   ├── v8_libplatform.dll
│   ├── v8_winxp
│   ├── valve_avi.dll
│   ├── valve_avi_client.so
│   ├── vaudio_celt.dll
│   ├── vaudio_celt_client.so
│   ├── vaudio_miles.dll
│   ├── vaudio_miles_client.so
│   ├── vaudio_speex.dll
│   ├── vaudio_speex_client.so
│   ├── vgui2.dll
│   ├── vgui2_client.so
│   ├── vguimatsurface.dll
│   ├── vguimatsurface_client.so
│   ├── vidcfg.bin
│   ├── video.dll
│   ├── vphysics.dll
│   ├── vphysics.so
│   ├── vphysics_client.so
│   ├── vscript.dll
│   ├── vscript.so
│   ├── vscript_client.so
│   ├── vstdlib.dll
│   ├── vstdlib_s.dll
│   ├── vtex_dll.dll
│   └── xinput1_3.dll
├── chrome.pak
├── csgo
│   ├── autobuy.txt
│   ├── bin
│   ├── botchatter.db
│   ├── botprofile.db
│   ├── botprofilecoop.db
│   ├── bspconvar_whitelist.txt
│   ├── cfg
│   ├── demo_polish_settings.cfg
│   ├── dxsupport_override.cfg
│   ├── expressions
│   ├── gameinfo.txt
│   ├── gameinfo_srgb.txt
│   ├── gamemodes.txt
│   ├── gamemodes_server.txt.example
│   ├── gamerulescvars.txt.example
│   ├── leaderboardsconfig.txt
│   ├── lights.rad
│   ├── loadouts.txt
│   ├── mapcycle.txt
│   ├── maplist.txt
│   ├── maps
│   ├── materials
│   ├── medalsconfig.txt
│   ├── missioncycle.txt
│   ├── models
│   ├── modelsounds.cache
│   ├── motd.txt
│   ├── navplace.db
│   ├── pak01_000.vpk
│   ├── pak01_001.vpk
│   ├── pak01_002.vpk
│   ├── pak01_003.vpk
│   ├── pak01_004.vpk
│   ├── pak01_005.vpk
│   ├── pak01_006.vpk
│   ├── pak01_007.vpk
│   ├── pak01_008.vpk
│   ├── pak01_009.vpk
│   ├── pak01_010.vpk
│   ├── pak01_011.vpk
│   ├── pak01_012.vpk
│   ├── pak01_013.vpk
│   ├── pak01_014.vpk
│   ├── pak01_015.vpk
│   ├── pak01_016.vpk
│   ├── pak01_017.vpk
│   ├── pak01_018.vpk
│   ├── pak01_019.vpk
│   ├── pak01_020.vpk
│   ├── pak01_021.vpk
│   ├── pak01_022.vpk
│   ├── pak01_023.vpk
│   ├── pak01_024.vpk
│   ├── pak01_025.vpk
│   ├── pak01_026.vpk
│   ├── pak01_027.vpk
│   ├── pak01_028.vpk
│   ├── pak01_029.vpk
│   ├── pak01_030.vpk
│   ├── pak01_031.vpk
│   ├── pak01_032.vpk
│   ├── pak01_033.vpk
│   ├── pak01_034.vpk
│   ├── pak01_035.vpk
│   ├── pak01_036.vpk
│   ├── pak01_037.vpk
│   ├── pak01_038.vpk
│   ├── pak01_039.vpk
│   ├── pak01_040.vpk
│   ├── pak01_041.vpk
│   ├── pak01_042.vpk
│   ├── pak01_043.vpk
│   ├── pak01_044.vpk
│   ├── pak01_045.vpk
│   ├── pak01_046.vpk
│   ├── pak01_047.vpk
│   ├── pak01_048.vpk
│   ├── pak01_049.vpk
│   ├── pak01_050.vpk
│   ├── pak01_051.vpk
│   ├── pak01_052.vpk
│   ├── pak01_053.vpk
│   ├── pak01_054.vpk
│   ├── pak01_055.vpk
│   ├── pak01_056.vpk
│   ├── pak01_057.vpk
│   ├── pak01_058.vpk
│   ├── pak01_059.vpk
│   ├── pak01_060.vpk
│   ├── pak01_061.vpk
│   ├── pak01_062.vpk
│   ├── pak01_063.vpk
│   ├── pak01_064.vpk
│   ├── pak01_065.vpk
│   ├── pak01_066.vpk
│   ├── pak01_067.vpk
│   ├── pak01_068.vpk
│   ├── pak01_069.vpk
│   ├── pak01_070.vpk
│   ├── pak01_071.vpk
│   ├── pak01_072.vpk
│   ├── pak01_073.vpk
│   ├── pak01_074.vpk
│   ├── pak01_075.vpk
│   ├── pak01_076.vpk
│   ├── pak01_077.vpk
│   ├── pak01_078.vpk
│   ├── pak01_079.vpk
│   ├── pak01_080.vpk
│   ├── pak01_081.vpk
│   ├── pak01_082.vpk
│   ├── pak01_083.vpk
│   ├── pak01_084.vpk
│   ├── pak01_085.vpk
│   ├── pak01_086.vpk
│   ├── pak01_087.vpk
│   ├── pak01_088.vpk
│   ├── pak01_089.vpk
│   ├── pak01_090.vpk
│   ├── pak01_091.vpk
│   ├── pak01_092.vpk
│   ├── pak01_093.vpk
│   ├── pak01_094.vpk
│   ├── pak01_095.vpk
│   ├── pak01_096.vpk
│   ├── pak01_097.vpk
│   ├── pak01_098.vpk
│   ├── pak01_099.vpk
│   ├── pak01_100.vpk
│   ├── pak01_101.vpk
│   ├── pak01_102.vpk
│   ├── pak01_103.vpk
│   ├── pak01_104.vpk
│   ├── pak01_105.vpk
│   ├── pak01_106.vpk
│   ├── pak01_107.vpk
│   ├── pak01_108.vpk
│   ├── pak01_109.vpk
│   ├── pak01_110.vpk
│   ├── pak01_111.vpk
│   ├── pak01_112.vpk
│   ├── pak01_113.vpk
│   ├── pak01_114.vpk
│   ├── pak01_115.vpk
│   ├── pak01_116.vpk
│   ├── pak01_117.vpk
│   ├── pak01_118.vpk
│   ├── pak01_119.vpk
│   ├── pak01_120.vpk
│   ├── pak01_121.vpk
│   ├── pak01_122.vpk
│   ├── pak01_123.vpk
│   ├── pak01_124.vpk
│   ├── pak01_125.vpk
│   ├── pak01_126.vpk
│   ├── pak01_127.vpk
│   ├── pak01_128.vpk
│   ├── pak01_129.vpk
│   ├── pak01_130.vpk
│   ├── pak01_131.vpk
│   ├── pak01_132.vpk
│   ├── pak01_133.vpk
│   ├── pak01_134.vpk
│   ├── pak01_135.vpk
│   ├── pak01_136.vpk
│   ├── pak01_137.vpk
│   ├── pak01_138.vpk
│   ├── pak01_139.vpk
│   ├── pak01_140.vpk
│   ├── pak01_141.vpk
│   ├── pak01_142.vpk
│   ├── pak01_143.vpk
│   ├── pak01_144.vpk
│   ├── pak01_145.vpk
│   ├── pak01_146.vpk
│   ├── pak01_147.vpk
│   ├── pak01_148.vpk
│   ├── pak01_149.vpk
│   ├── pak01_150.vpk
│   ├── pak01_151.vpk
│   ├── pak01_152.vpk
│   ├── pak01_153.vpk
│   ├── pak01_154.vpk
│   ├── pak01_155.vpk
│   ├── pak01_156.vpk
│   ├── pak01_157.vpk
│   ├── pak01_158.vpk
│   ├── pak01_159.vpk
│   ├── pak01_160.vpk
│   ├── pak01_161.vpk
│   ├── pak01_162.vpk
│   ├── pak01_163.vpk
│   ├── pak01_164.vpk
│   ├── pak01_165.vpk
│   ├── pak01_166.vpk
│   ├── pak01_167.vpk
│   ├── pak01_168.vpk
│   ├── pak01_169.vpk
│   ├── pak01_170.vpk
│   ├── pak01_171.vpk
│   ├── pak01_172.vpk
│   ├── pak01_173.vpk
│   ├── pak01_174.vpk
│   ├── pak01_175.vpk
│   ├── pak01_176.vpk
│   ├── pak01_177.vpk
│   ├── pak01_178.vpk
│   ├── pak01_179.vpk
│   ├── pak01_180.vpk
│   ├── pak01_181.vpk
│   ├── pak01_182.vpk
│   ├── pak01_183.vpk
│   ├── pak01_184.vpk
│   ├── pak01_185.vpk
│   ├── pak01_186.vpk
│   ├── pak01_187.vpk
│   ├── pak01_188.vpk
│   ├── pak01_189.vpk
│   ├── pak01_190.vpk
│   ├── pak01_191.vpk
│   ├── pak01_192.vpk
│   ├── pak01_193.vpk
│   ├── pak01_194.vpk
│   ├── pak01_195.vpk
│   ├── pak01_196.vpk
│   ├── pak01_197.vpk
│   ├── pak01_198.vpk
│   ├── pak01_199.vpk
│   ├── pak01_200.vpk
│   ├── pak01_201.vpk
│   ├── pak01_202.vpk
│   ├── pak01_203.vpk
│   ├── pak01_dir.vpk
│   ├── pakxv_audiochinese_000.vpk
│   ├── pakxv_audiochinese_001.vpk
│   ├── pakxv_audiochinese_002.vpk
│   ├── pakxv_audiochinese_003.vpk
│   ├── pakxv_audiochinese_004.vpk
│   ├── pakxv_audiochinese_005.vpk
│   ├── pakxv_audiochinese_006.vpk
│   ├── pakxv_audiochinese_007.vpk
│   ├── pakxv_audiochinese_dir.vpk
│   ├── pakxv_lowviolence_000.vpk
│   ├── pakxv_lowviolence_dir.vpk
│   ├── pakxv_perfectworld_000.vpk
│   ├── pakxv_perfectworld_001.vpk
│   ├── pakxv_perfectworld_002.vpk
│   ├── pakxv_perfectworld_dir.vpk
│   ├── panorama
│   ├── pure_server_whitelist.txt
│   ├── radial_quickinventory.txt
│   ├── radial_radio.txt
│   ├── rebuy.txt
│   ├── resource
│   ├── scene.cache
│   ├── scenes
│   ├── scripts
│   ├── shader_cache.cfg
│   ├── splitscreen_config.txt
│   ├── stats.txt
│   ├── steam.inf
│   ├── unusedcontent.cfg
│   ├── whitelist.cfg
│   └── whitelist_beta.cfg
├── csgo.sh
├── csgo_linux64
├── game
│   ├── bin
│   ├── core
│   ├── csgo
│   ├── csgo_core
│   ├── csgo_imported
│   ├── csgo_lv
│   └── thirdpartylegalnotices.txt
├── installscript.vdf
├── platform
│   ├── admin
│   ├── materials
│   ├── platform_pak01_000.vpk
│   ├── platform_pak01_001.vpk
│   ├── platform_pak01_002.vpk
│   ├── platform_pak01_003.vpk
│   ├── platform_pak01_004.vpk
│   ├── platform_pak01_005.vpk
│   ├── platform_pak01_dir.vpk
│   ├── resource
│   ├── scripts
│   ├── servers
│   ├── steam
│   └── vgui
├── srcds.exe
├── srcds_linux
├── srcds_run
├── steamapps
│   ├── appmanifest_730.acf
│   ├── appmanifest_740.acf
│   ├── downloading
│   ├── temp
│   └── workshop
└── thirdpartylegalnotices.doc

38 directories, 415 files
flowing@DESKTOP-BUIITN0:/mnt/c/Users/Flowing/srcds$

通常のcsgoディレクトリとは別に、gameディレクトリが作成されていた。

FlowingSPDGFlowingSPDG

軽く見た限りだが、CS2のデータがダウンロード出来ているように見える。
起動方法を模索する。

FlowingSPDGFlowingSPDG

ライブラリの導入が面倒なので、cm2network/csgo のエントリーポイントをbashに変更し、CS2の起動を試みる。
https://hub.docker.com/r/cm2network/csgo

docker run --rm -it -v $PWD/srcds:/data --entrypoint bash cm2network/csgo
steam@8e3b40fa5ead:/data$ ./srcds_run

普通にCSGOのサーバーが起動した。そっちじゃない。

FlowingSPDGFlowingSPDG

Sourceエンジン製のゲームは、 -game オプションでゲームディレクトリを指定出来るので指定してみる。

steam@8e3b40fa5ead:/data$ ./srcds_run -game game/csgo -dedicated
./srcds_run: 32: pushd: not found
./srcds_run: 35: popd: not found
WARNING: No map specified! Defaulting to de_dust
Server will auto-restart if there is a crash.
LD_LIBRARY_PATH=/data/bin:/data:/data/bin:
#Unable to find gameinfo.txt. Solutions:

1. Read http://www.valve-erc.com/srcsdk/faq.html#NoGameDir
2. Run vconfig to specify which game you're working on.
3. Add -game <path> on the command line where <path> is the directory that gameinfo.txt is in.

#Unable to find gameinfo.txt. Solutions:

1. Read http://www.valve-erc.com/srcsdk/faq.html#NoGameDir
2. Run vconfig to specify which game you're working on.
3. Add -game <path> on the command line where <path> is the directory that gameinfo.txt is in.

Add "-debug" to the ./srcds_run command line to generate a debug.log to help with solving this problem
Tue Sep 26 19:09:36 UTC 2023: Server restart in 10 seconds
^CTue Sep 26 19:09:36 UTC 2023: Server Quit

gameinfo.txt が見つからないと。
試しに game/csgo ディレクトリを見てみると、gameinfo.txt の代わりにgameinfo.gi というファイルが見つかった。
中身をのぞいでみる。

steam@8e3b40fa5ead:/data$ cat game/csgo/gameinfo.gi
"GameInfo"
{
        // ********************************************************************************
        // ********************************************************************************
        // ********************************************************************************
        // DO NOT EDIT THIS FILE DIRECTLY - YOU PROBABLY WANT TO EDIT CSGO_CORE/GAMEINFO.GI
        // ********************************************************************************
        // ********************************************************************************
        // ********************************************************************************

        game            "Counter-Strike 2"
        title           "Counter-Strike 2"

        LayeredOnMod    csgo_imported // Inherits the gameinfo.gi data from csgo_imported (which itself inherits from csgo_core)

        FileSystem
        {
                SearchPaths
                {
                        Game_LowViolence        csgo_lv // Perfect World content override

                        Game    csgo
                        Game    csgo_imported
                        Game    csgo_core
                        Game    core

                        Mod             csgo
                        Mod             csgo_imported
                        Mod             csgo_core

                        AddonRoot                       csgo_addons

                        LayeredGameRoot         "../game_otherplatforms/etc" [$MOBILE || $ETC_TEXTURES] //Some platforms do not support DXT compression. ETC is a well-supported alternative.
                        LayeredGameRoot         "../game_otherplatforms/low_bitrate" [$MOBILE]
                }

                "UserSettingsPathID"    "USRLOCAL"
                "UserSettingsFileEx"    "cs2_"
        }

        Engine2
        {
                "DepotBuildDateTimeInTitleBar" "1"
        }

        pulse
        {
                "pulse_enabled"                                 "1"
        }

        ConVars
        {
                // Bandwidth control default: 300,000 Bps
                "rate"
                {
                        "min"           "98304"
                        "default"       "786432"
                        "max"           "1000000"
                }
                "sv_minrate"    "98304"
                "sv_maxunlag"   "0.200"

                // GOTV controls
                "tv_secret_code"                "0"
                "tv_relay_secret_code"  "0"
                "tv_update_hibernation_enabled" "0"

                // Performance
                "sv_parallel_checktransmit"             "2"
                "fps_max"               "400"
                "fps_max_ui"    "120"
                "r_add_views_in_pre_output"             "1"

                // Nav fixups
                "nav_path_fixup_climb_up_segments" "1"
                "nav_gen_agent_radius_buffer" "0.75"
                "nav_gen_jump_connection_min_overlap_ratio" "0.1"

                // CSM override
                "csm_slope_scale_db_override" "3"

                // SSAO customization for CSGO (this is used on viewmodels)
                "r_ssao_radius"                         "8"
                "r_ssao_strength"                       "3"
                "r_ssao_bias"                           "2.5"

                // this cache kills performance due to mutex contention
                "bone_decode_cache_enabled" "0"

                // Disable warning about oscillating panorama classes
                "panorama_classes_oscillation_warning" "0"

                // Spew warning when adding/removing classes to/from the top of the hierarchy
                "panorama_classes_perf_warning_threshold_ms" "0.75"

                // Panorama - enable render target cache
                "panorama_disable_render_target_cache" "0"

                // Panorama - enable minidumps on JS exceptions
                "panorama_js_minidumps" "1"

                // HLTV AutoDirector - disable it for now so that it doesn't interfere with our spectator camera during replays / hltv / demos
                // Needs to be revisited when we re-enable AutoDirector
                "spec_autodirector" "false"

                // Grass
                "r_grass_quality"                               "3"
                "r_grass_alpha_test"                    "1"
                "r_grass_density_mode"                  "1"
                "r_grass_start_fade"                    "3000"
                "r_grass_end_fade"                              "3900"

                // Default to binding keys based on keyboard position instead of key name
                "input_button_code_is_scan_code"        "1"

                // Disable Cubemap Brightening
                "lb_cubemap_normalization_max"          "1"

                // For low quality shaders, cubemap bounds are scaled by this percentage of the fade region
                "lb_low_quality_shader_fade_region_rescale"     "0.5"

                // Use normal quality compression even in MET, this makes compiles in MET slower than
                // the default of fastest (0), but reduces artifacts that are confusing to artists since
                // it's not clear that texture compression quality is different in MET than when regularly compiled.
                "rc_default_texture_encode_quality" "2"

                // The engine default of 50 for CS:GO is too high, drop down to a more sensible
                // default value.
                "mouse_pitchyaw_sensitivity"    "3"
                "pitch_extra_mouse_sensitivity" "1.0"

                "r_size_cull_threshold"                 "0.33"
                "r_size_cull_threshold_fade"    "7.5"
                "inferno_scorch_decals" "0"

                // Steam Audio project specific convars
                "snd_musicvolume"
                {
                        "version"       "2"
                }
                "snd_steamaudio_enable_custom_hrtf"                                     "0"
                "snd_steamaudio_enable_perspective_correction"          "1"
                "snd_steamaudio_perspective_correction_factor"          "1.0"
                "snd_steamaudio_normalize_default_hrtf_volume"          "1"
                "snd_steamaudio_default_hrtf_volume_gain"                       "0.0"
                "snd_steamaudio_max_hrtf_normalization_gain_db"         "6.0"

                // Need much tighter sound clock sync
                "snd_delay_sound_ms_max"        "40"

                "cl_disconnect_voice_fade"      "-1.0"
                "cl_disconnect_soundevent"      "StopSoundEvents.StopAllExceptMusic"

                // Physics specific customization
                "phys_use_position_based_toi_test" "1"
        }

        // Temporarily allowing this because the particle files that are tripping this up ALSO crash PET so I
        // cannot fix them. We'll sort this out Monday 2/13/23.
        //ResourceCompiler
        //{
        //      // See csgo_imported's gameinfo.gi
        //      "DeprecatedBehaviorVersionsAllowed"     "0"
        //}

        GMS
        {
                "Advertise"                     "1"
        }

        GameInstructor
        {
                "SaveToSteamStats" "1"
        }

        CS2WorkshopManager
        {
                "RequiredTag" "CS2"
                "HighlightEntriesMissingRequiredTag" "1"
        }

        AssetBrowser
        {
                retail_filter0          "characters/models/"
                retail_filter1          "materials/decals/sprays/"
                retail_filter2          "panorama/"
                retail_filter3          "patches/"
                retail_filter4          "stickers/"
                retail_filter5          "weapons/"
                retail_filter6          "materials/models/inventory_items/"
        }

        AddonConfig
        {
                "VpkDirectories"
                {
                        "exclude"       "maps/content_examples"
                        "include"       "maps"
                        "include"       "cfg/maps"
                        "include"       "materials"
                        "include"       "models"
                        "include"       "panorama/images/overheadmaps"
                        "include"       "scripts/vscripts"
                        "include"       "sounds"
                        "include"       "soundevents"
                        "include"       "lighting/postprocessing"
                        "include"       "postprocess"
                        "include"       "addoninfo.txt"
                }
        }
}
steam@8e3b40fa5ead:/data$ 

coreの方にも似たようなファイルがあった。
いったんリネームして拡張子を.txtに変更して、サーバーを起動してみる。

steam@8e3b40fa5ead:/data$ cp game/csgo/gameinfo.gi game/csgo/gameinfo.txt
steam@8e3b40fa5ead:/data$ ./srcds_run -game game/csgo -dedicated

サーバーが起動したが、CS2なのか、CS:GOのままなのかはわからない。

FlowingSPDGFlowingSPDG

雑談。Counter-Strike2に名称を変えても、内部的にはcsgoのままの部分がかなりの数あるように見える。
まあ、CSGOも内部的にcstrike(HL1MOD時代と同じ)だったり、cstrike15だったりしたので、このあたりは大目に見てやっても良いんじゃないだろうか。
閑話休題。

FlowingSPDGFlowingSPDG

ちなみに、グレーな話題。
何年か前にValveから委託を受けてCSGOの開発を行っていたスタッフが、離職後CSGOのソースコードをリークさせたことでかなり話題になった。
リーク自体は2020年だが、ソースコード自体は2018年の物だったらしい。
Visual Studioなどの環境があれば、実際のゲームクライアントのコンパイルまで出来たというのでかなり驚いた記憶がある。
法的なリスクが否定出来ないので、ここでは詳しく解説はしない。
だが、実際自分もGOTV+ の開発にあたり、リークされたコード群に含まれるJavaScriptのリファレンスコードを参照にしていたので、CSGO/Sourceエンジンの実装についで詳しくなりたい人は目を通しても良いかもしれない。
ただし、絶対に悪用しないように。

FlowingSPDGFlowingSPDG

gameオプションを指定したサーバーが起動した。
statusコマンドを打ってみる。

status
hostname: Counter-Strike: Global Offensive
version : 1.38.7.9/13879 1573/8853 secure  [A:1:3873134623:24376]
udp/ip  : 172.17.0.2:27016  (public ip: XX.XXX.X.XXX)
os      :  Linux
type    :  community dedicated
map     : de_dust2
players : 0 humans, 0 bots (20/0 max) (hibernating)

# userid name uniqueid connected ping loss state rate adr
#end

public IPの部分のみ実際のIPなのでXで置き換えている。
hostnameがCSGOのままなのが心配。
また、デフォルトでは27015ポートのはずが、27016ポートを使用している。

FlowingSPDGFlowingSPDG

ここで、Dockerのnetworkが開いていないことに気付く。
いったんコンテナを停止し、ポートを紐づけるよう変更する。

docker run --rm -it -v $PWD/srcds:/data -p 27015-27020:27015-27020/udp --entrypoint bash cm2network/csgo

サーバーを再起動。

cd /data
./srcds_run -game game/csgo -dedicated
FlowingSPDGFlowingSPDG

CS2クライアントを起動し、接続を試してみるがうまくいかない。
正しく接続が確立出来ていないようだ。

逆に、CS:GOのクライアントを起動して接続を試みると、サーバーがハングアップするのが確認出来た。

FlowingSPDGFlowingSPDG

これは予想だが、CSGO時代のバイナリを使っている時点で既に起動は難しいのではないだろうか?
当面はWindows版サーバーを使うことが賢明だと考えられる。
Limited Test版段階でのLinux版CS2サーバーの立ち上げに関しては、これでいったん調査終了とする。
気が向いたら、Windows版でのサーバー作成方法を日本語にて紹介しようと思う。

このスクラップは2023/09/27にクローズされました