RE:NODE

Návody13 min čtení

Soutěžní zápasový server CS2 s MatchZy

Cvary pro zápas MR12, knife round a warm-up, MatchZy pro ready-up a pauzy, dema z GOTV a obnovení kola po pádu serveru.

7 čtenářů

Zápasový server je veřejný server, ze kterého je vyndaná zábava. Žádné hlasování o změně mapy, žádné automatické vyvažování týmů, které potichu přehodí tvého entry fraggera, žádný warm-up, který skončí, protože vypršel čas, zatímco jeden hráč pořád instaloval aktualizaci. Místo toho má konfiguraci, se kterou se spouští ostrá hra, způsob, jak hru pozastavit, demo všeho, co se stalo, a zálohu po kolech, takže pád v 19. kole stojí pět minut, ne celý zápas.

Stručně: dej pravidla zápasu do souboru live.cfg, který nic jiného nepřepisuje, večer veď přes MatchZy místo ručního zadávání, nahrávej GOTV od prvního kola a zapni vestavěné zálohy kol dřív, než je budeš potřebovat. Zbytek jsou podrobnosti, včetně tréninkového serveru, který bude ta samá skupina chtít do druhého týdne.

Co musí zápasový server umět a veřejný ne#

PožadavekJak se splní
Pokaždé stejná pravidlaJeden live.cfg, spuštěný přes exec při startu ostré hry, ne rozházený po souborech
Počkat na deset lidíWarm-up se zastaveným časovačem a systém ready-up
Férově rozhodnout stranyKnife round, pak zůstat, nebo přehodit
Zastavit hodinyTaktické oddechové časy a pauza od admina
Dokázat, co se staloNahrávání GOTV od prvního kola
Přežít pádZálohy kol na disku, obnovené do probíhajícího zápasu
Nepustit cizíHeslo, nebo whitelist deseti Steam id v pluginu

Nic z toho není exotické a většina je v enginu. Plugin lidé instalují ne kvůli schopnostem, ale protože ruční postup znamená admina, který píše jedenáct příkazů ve správném pořadí, zatímco devět lidí čeká, a jedna překlepnutá hodnota restartuje hru za stavu 12-7.

všichni připravenikaždé kolotv_autorecordWarm-upready-up, whitelistKnife roundzůstat, nebo přehoditOstrá hralive.cfg, MR12Zálohy koljeden soubor na koloDemo z GOTV.dem na disku
Zápasový večer od warm-upu po demo

Konfigurace zápasu#

Tohle je soubor, který server spustí přes exec v okamžiku, kdy začne ostrá hra. Měj ho jako game/csgo/cfg/live.cfg a spouštěj ho výslovně; nespoléhej na server.cfg, protože konfigurace herního režimu běží po server.cfg při každém načtení mapy a polovinu z něj zruší. Past s pořadím vysvětluje příkazy a cvary serveru CS2 a je to důvod, proč zápasové konfigurace existují jako samostatné soubory.

game/csgo/cfg/live.cfg
// Format: MR12 with MR3 overtimemp_maxrounds 24mp_halftime 1mp_halftime_duration 15mp_overtime_enable 1mp_overtime_maxrounds 6mp_overtime_startmoney 12500mp_match_can_clinch 1mp_match_end_restart 0mp_match_restart_delay 15mp_endmatch_votenextmap 0// Economymp_maxmoney 16000mp_startmoney 800mp_afterroundmoney 0mp_playercashawards 1mp_teamcashawards 1// Roundmp_freezetime 15mp_roundtime 1.92mp_roundtime_defuse 1.92mp_roundtime_hostage 1.92mp_buytime 20mp_buy_anywhere 0mp_free_armor 0mp_death_drop_gun 1mp_death_drop_grenade 2mp_death_drop_defuser 1mp_friendlyfire 1mp_solid_teammates 1// No interferencemp_autoteambalance 0mp_limitteams 0mp_autokick 0mp_forcecamera 1mp_timelimit 0mp_team_intro_time 0// Timeoutsmp_team_timeout_time 30mp_team_timeout_max 4mp_team_timeout_ot_add_each 1mp_team_timeout_ot_max 1// Voicesv_full_alltalk 0sv_deadtalk 1// Safetysv_cheats 0mp_warmup_pausetimer 0

K několika z nich patří věta. mp_maxrounds 24 je MR12, na čem se soutěžní CS2 usadilo; liga, která pořád hraje MR15, chce 30 a mp_overtime_maxrounds 6 platí tak či tak. mp_match_can_clinch 1 ukončí zápas při stavu 13-4, místo aby se dohrávala kola, která nikdo nepotřebuje. mp_autokick 0 brání serveru vyhodit hráče za nečinnost během taktické pauzy, což je opravdu špatný večer. mp_team_intro_time 0 přeskočí úvodní cinematic, který CS2 přehrává před prvním kolem. A mp_forcecamera 1 omezí mrtvé hráče na sledování vlastního týmu, což je rozdíl mezi scrimem a čestným slovem.

Názvy týmů patří do mp_teamname_1 a mp_teamname_2, dvoupísmenné kódy do mp_teamflag_1 a mp_teamflag_2. Zobrazují se na výsledkové tabuli a hlavně v demu z GOTV za půl roku, když si nevzpomeneš, kdo hrál.

Warm-up, knife round a spuštění ostré hry ručně#

Tohle bys měl nechat na pluginu. Ale měl bys vědět, co dělá, protože když plugin ve 20:55 selže, budeš to dělat ručně.

Nejdřív warm-up. mp_warmuptime 300 s mp_warmup_pausetimer 1 dá neomezený warm-up: hodiny se zobrazují, ale neběží dolů, takže nikdo nespěchá a nikdo ho nemusí pořád restartovat. mp_warmup_end ho ukončí, až budete připraveni.

Knife round je konfigurace plus dva příkazy:

game/csgo/cfg/knife.cfg
mp_startmoney 0mp_maxmoney 0mp_free_armor 0mp_give_player_c4 0mp_ct_default_primary ""mp_ct_default_secondary ""mp_ct_default_melee "weapon_knife"mp_t_default_primary ""mp_t_default_secondary ""mp_t_default_melee "weapon_knife"mp_death_drop_gun 0mp_death_drop_grenade 0mp_buytime 0mp_buy_anywhere 0mp_freezetime 10mp_roundtime 5mp_roundtime_defuse 5mp_maxrounds 1mp_warmup_endmp_restartgame 1

Vítězný tým pak vybírá. Pokud zůstanou, spusť přes exec live.cfg a mp_restartgame 3. Pokud přehodí, nejdřív spusť mp_swapteams, potom stejné dva kroky. Oznam to v chatu třikrát, aby nikdo nemohl tvrdit, že četl Discord, protože první kolo ostrého zápasu odehrané jedním týmem, který si myslel, že pořád běží knife, je nejstarší hádka v Counter-Strike.

MatchZy: plugin, který řídí večer#

MatchZy je plugin pro CounterStrikeSharp, takže pod sebou potřebuje Metamod:Source a CounterStrikeSharp - instalaci popisují pluginy pro CS2 s Metamodem a CounterStrikeSharp. Jakmile je načtený, večer se řídí z chatu.

PříkazKdoÚčinek
.ready / .unreadyHráčiReady-up. Zápas začne, když je připraveno dost hráčů
.forcereadyAdminSpustí zápas i tak
.knife-Knife round, potom .stay nebo .switch od vítěze
.pause / .unpauseHráčiPauza na konci kola, pokračování, když souhlasí oba týmy
.tacHráčiTaktický oddechový čas, odečtený z limitu týmu
.stopHráčiObnoví aktuální kolo. Musí souhlasit oba týmy
.restore <round>AdminObnoví libovolné kolo z jeho záložního souboru
.map <name>AdminZmění mapu bez opuštění zápasového režimu
.scoreKdokoliAktuální skóre a stav série

MatchZy dodává vlastní konfigurace v game/csgo/cfg/MatchZy/ - konfiguraci warm-upu, knife roundu a ostré hry - což znamená, že upravuješ cfg/MatchZy/live.cfg, ne soubor, který jsi napsal výše, a plugin ho spustí ve správný okamžik. Jeho vlastní nastavení jsou convary s předponou matchzy_ ve stejné složce; první, který budeš měnit, je počet připravených hráčů potřebných ke startu. Názvy se mezi vydáními posouvají, takže čti verzi, kterou jsi stáhl, ne dva roky starý blogový příspěvek.

Pro cokoli organizovanějšího než pickup hru načte MatchZy definici zápasu v JSON, buď ze souboru na serveru, nebo z URL:

match.json
{  "matchid": "renode-scrim-014",  "num_maps": 1,  "players_per_team": 5,  "skip_veto": true,  "maplist": ["de_mirage"],  "team1": {    "name": "Longship",    "players": { "76561198012345678": "anna" }  },  "team2": {    "name": "Drakkar",    "players": { "76561198087654321": "jan" }  }}

Načtení té konfigurace přepne server do zápasového režimu se správnou mapou, správnými názvy týmů a whitelistem: připojit se smějí jen uvedená Steam id a každé je automaticky zařazeno do svého týmu. Pro best-of-three nastav num_maps na 3 a uveď tři mapy. Je to také háček, který by použil bot na Discordu nebo malá webová stránka k zakládání zápasů, aniž by se kdokoli dotkl konzole.

GOTV a dema#

GOTV je spektátorské relay a nahrávač dem v jednom a důležitá je ta nahrávací půlka. Zapni ho před zápasem, ne až poté, co se někdo zeptá na klip.

in server.cfg
tv_enable 1tv_port 27020tv_autorecord 1tv_delay 0tv_delaymapchange 1tv_maxclients 8tv_name "Longship GOTV"tv_password ""tv_relaypassword ""tv_snapshotrate 32

tv_autorecord 1 spustí demo v každém zápase a po skončení mapy ho zapíše na disk; tv_record <name> a tv_stoprecord dělají totéž ručně. tv_delay je zpoždění vysílání v sekundách a je to nastavení, které lidé pokazí oběma směry: 0 je správně pro server jen na dema, kde nikdo nesleduje živě, a něco jako 90 až 120 je správně, pokud jsou na GOTV připojeni diváci, protože divák s nulovým zpožděním je obvinění z ghostingu čekající na svou chvíli. tv_delaymapchange 1 drží změnu mapy, dokud zpožděné vysílání nedoběhne, takže poslední kolo není uříznuté.

Diváci se připojují na port GOTV, ne na herní port, což je důvod, proč server CS2 potřebuje dvě přidělení portů, ne jedno. Dema se zapisují do game/csgo/ s datem a mapou v názvu a celá mapa MR12 má při 64 tick pár set megabajtů a při 128 víc, takže vytížený scrim server zaplní disk za týdny, ne za měsíce. Pomáhají dva návyky: stahuj dema, na kterých ti záleží, a nastav na serveru naplánovanou úlohu, která maže všechno starší než měsíc. Naplánované úlohy, které stojí za to mít tento vzor popisují; na RE:NODE záložka Schedules spouští výraz cron proti příkazu konzole, takže úklid je úloha, kterou nastavíš jednou.

Demo se sleduje tak, že ho dáš do složky csgo na klientovi a spustíš playdemo <name>, nebo se za zápasu připojíš na <address>:27020.

Zálohy kol a obnovení po pádu#

Engine na začátku každého kola zapíše úplný snímek zápasu, pokud mu to dovolíš, a skoro nikdo to nezapne, dokud to poprvé nepotřebuje.

config
mp_backup_round_auto 1mp_backup_round_file "match"mp_backup_restore_load_file "match_round12.txt"

S mp_backup_round_auto 1 server zapíše do game/csgo/ jeden malý textový soubor na kolo, který obsahuje skóre, peníze, vybavení a strany. mp_backup_restore_load_file <file> jeden z nich načte zpět a zápas pokračuje od začátku toho kola se zachovanou ekonomikou všech. Funguje po pádu, po restartu i po kole, které se musí opakovat, protože někomu během nákupu spadla hra.

MatchZy na tom staví s příkazem .stop, který obnoví aktuální kolo, když ho napíšou oba týmy, a s .restore <round> pro admina. Soubory pluginu a soubory enginu nejsou totéž, takže pokud používáš MatchZy, použij jeho příkazy a nemíchej obojí.

Zálohy kol také mění pohled na pády. Když kontejner narazí na limit paměti, je zastaven a čistě restartován, ne ponechán v swapování, což zní brutálně, dokud to nesrovnáš s patnácti minutami serveru, který se plazí. Se zapnutými zálohami stojí ten restart čas na opětovné připojení a napsání jednoho příkazu. Bez nich stojí zápas. Stejný argument platí pro zálohy samotného serveru - viz zálohy, které opravdu obnovíš, které jsou o disciplíně, ne o tlačítku.

Tréninkový server pro stejnou skupinu#

Druhá věc, o kterou tým požádá, je místo na házení smoků. Je to stejný serverový software s téměř opačnou konfigurací a potřebuje sv_cheats 1, a proto nesmí být nikdy tím veřejným.

game/csgo/cfg/prac.cfg
sv_cheats 1mp_limitteams 0mp_autoteambalance 0mp_maxmoney 60000mp_startmoney 60000mp_afterroundmoney 60000mp_buytime 60000mp_buy_anywhere 1mp_freezetime 0mp_roundtime 60mp_roundtime_defuse 60mp_respawn_on_death_t 1mp_respawn_on_death_ct 1mp_death_drop_gun 0mp_death_drop_grenade 0sv_infinite_ammo 1ammo_grenade_limit_total 5mp_ct_default_grenades "weapon_hegrenade weapon_flashbang weapon_smokegrenade weapon_incgrenade weapon_decoy"mp_t_default_grenades "weapon_hegrenade weapon_flashbang weapon_smokegrenade weapon_molotov weapon_decoy"sv_grenade_trajectory_prac_pipreview 1sv_grenade_trajectory_prac_trailtime 8sv_showimpacts 1sv_showimpacts_time 8bot_quota 0bot_stop 1sv_full_alltalk 1mp_warmup_endmp_restartgame 1

Cvary pro dráhy granátů a dopady jsou smyslem celého souboru: dráhy vykreslí čáru, kterou granát letěl, a nechají ji tam sv_grenade_trajectory_prac_trailtime sekund, a sv_showimpacts označí, kam kulky skutečně dopadly, oproti tomu, kam si myslel klient. sv_rethrow_last_grenade hodí poslední granát znovu ze stejného místa a stojí za to ho navázat na klávesu. noclip potřebuje sv_cheats 1, které teď má.

MatchZy má vlastní tréninkový režim, což je úhlednější cesta, pokud už je nainstalovaný: nastaví tohle, přidá příkazy pro spawny a časovače a poté server vrátí zpět. Provozovat trénink a zápasy na stejném serveru je v pořádku, pokud si někdo pamatuje spustit konfiguraci ostré hry; provozovat je současně ne, takže pokud je skupina dost velká, aby chtěla obojí najednou, jsou to dva servery.

Dimenzování, tick rate a síť#

Desetihráčový server CS2 s nahráváním GOTV není náročný. Náročným ho dělá 128 tick, který zhruba zdvojnásobí CPU na hráče, a CounterStrikeSharp, který do procesu přináší runtime .NET.

SestavaPaměťCPU
5v5, 64 tick, vanilla, GOTV1 GB1 jádro
5v5, 64 tick, MatchZy a jeden či dva pluginy2 GB1,5 jádra
5v5, 128 tick, MatchZy, nahrávání GOTV2-3 GB2 jádra
Tréninkový server, 128 tick, náročná práce s granáty2 GB2 jádra

Tick rate je spor, který stojí za to vyřešit brzy. CS2 označuje vstupy časovými značkami v rozlišení sub-tick, takže registrace zásahů je na ticku závislá mnohem méně než v CS:GO a poctivý argument pro 128 tick dnes stojí na simulaci granátů a pohybu, ne na tom, jestli tvoje rány zasáhnou - měření najdeš v co tick rate doopravdy znamená. Pokud tým trénuje lineupy na 128 a hraje oficiální zápasy na 128, hrajte na 128. Jinak 64 s rezervou poráží 128 na stropu CPU.

O tom, jak se scrim cítí, nerozhoduje tick rate, ale vzdálenost mezi deseti hráči a serverem. Všichni v jednom regionu se serverem a nikdo na wifi poráží každý konfigurační soubor na této stránce. Latence, jitter a ztráta paketů ukazuje, jak poznat, který ze tří zrovna kazí konkrétnímu hráči večer, a odpovědí je obvykle jitter.

Řešení potíží#

Zápas začne 0-0, ale peníze jsou špatně. Konfigurace ostré hry byla spuštěna přes exec po restartu místo před ním. Exec, potom mp_restartgame 1.

Kola končí v 1:55 na jedné mapě a jinak na jiné. Nastavil jsi mp_roundtime, ale ne mp_roundtime_defuse a mp_roundtime_hostage. Konkrétnější hodnoty vyhrávají na typech map, které jmenují.

Server po zápase změní mapu. Je zapnuté mp_match_end_restart nebo mp_endmatch_votenextmap. Na zápasovém serveru by obě měla být 0.

Nikdo se nemůže připojit na GOTV. Port GOTV není přidělen nebo není otevřený. Je to samostatný UDP port odlišný od herního a na hostingu s panelem musí existovat jako přidělení, než ho tv_port může obsadit.

Po pádu chybí demo. GOTV zapíše soubor, když se nahrávání zastaví. Tvrdý pád uprostřed mapy ho ztratí. Přesně na to jsou zálohy kol a je to argument pro naplánovaný restart mezi sezeními místo jednoho dlouho žijícího procesu.

Hráči jsou automaticky vyvažováni do špatného týmu. Dělá to mp_autoteambalance 1 a mp_limitteams. Obojí patří v zápasové konfiguraci na 0.

Pauzu nejde zrušit. Některé příkazy pauzy potřebují oba týmy, některé admina. S MatchZy .unpause od druhého týmu, nebo admin s příslušným flagem.

FAQ#

Jaký je standardní formát soutěžního zápasu v CS2?

MR12: mp_maxrounds 24, první na 13, strany se vymění po 12 kolech s mp_halftime 1. Prodloužení je MR3 s mp_overtime_maxrounds 6 a 12 500 $ startovních peněz, opakuje se, dokud někdo nevyhraje.

Potřebuji MatchZy, nebo zvládnu zápas jen s konfiguracemi?

Zápas jen s konfiguracemi zvládneš. Přijdeš o systém ready-up, automatizaci knife roundu, oddechové časy, které se počítají samy, a obnovení kola jedním příkazem. Pro pravidelný tým se plugin vyplatí poprvé, když se někdo v 19. kole odpojí.

Kde se ukládají dema z GOTV?

V herním adresáři game/csgo/, s datem a mapou v názvu, pokud je zapnuté tv_autorecord. Stáhneš je přes správce souborů nebo přes SFTP. Jsou velká, takže je maž nebo archivuj podle plánu, ne až když se zaplní disk.

Mohu provozovat tréninkový a zápasový server v jednom tarifu?

Ne současně na jednom serveru, protože trénink potřebuje sv_cheats 1 a zápas ho mít nesmí. Jeden server můžeš mezi oběma přepínat konfiguracemi, nebo provozovat dva malé servery, což je to, k čemu většina týmů nakonec dojde.

Jak zabráním cizím hráčům připojit se na scrim?

Nastav sv_password a dej ho deseti lidem, nebo načti konfiguraci zápasu MatchZy, která whitelistuje Steam id v ní uvedená a všechny ostatní odmítne. Heslo je jednodušší; whitelist navíc zařadí lidi do správného týmu.

Registrují se zásahy v CS2 na 128 tick lépe?

Mnohem méně než v CS:GO. Sub-tick časování znamená, že server vyhodnotí výstřel v okamžiku, kdy byl vypálen, ne při dalším ticku. Fyzika granátů a pohyb pořád běží po tickách, což je zbývající skutečný argument pro 128.


Komentáře

Zcela anonymně: žádný účet, žádný e-mail, žádné cookie. Ukládáme jen jméno, které napíšeš, text a čas - nic dalšího. Počet odkazů je omezený a značkování se nevykresluje.

0/2000