Rust Server Browser
Vyhledávání a sledování Rust serverů
- C#
- .NET
- PostgreSQL
- React
Výběr Rust serveru začíná dávno před připojením. RustBrowser spojuje vyhledávání serverů s historií hráčů, přehledem map a odhadem příštího wipe, aby se hráč mohl rozhodnout podle víc než aktuálního počtu lidí online.
- Moje role
- Návrh a vývoj
Proč jsem RustBrowser vytvořil
Rust je multiplayerová hra o přežití, ve které hráči sbírají suroviny, stavějí základny a soupeří o místo na mapě. Zážitek ale výrazně ovlivňuje server. Někde hrají jednotlivci, jinde velké týmy, někde je postup pomalý a jinde získáš suroviny několikanásobně rychleji.
Vestavěný prohlížeč serverů přímo ve hře mi pro výběr nestačil. Chtěl jsem vědět, jak se na serveru mění počet hráčů, jak dlouho zůstává aktivní po resetu mapy a jestli odpovídá tomu, jak chci hrát. Samotný seznam serverů a aktuální počet lidí online mi na to nedával dostatečnou odpověď.
Proto jsem vytvořil Rust Server Browser na rustbrowser.com. Propojil jsem vyhledávání s historií hráčů, informacemi o mapách a odhadem příštího wipe. Hráč může hledat podle regionu, počtu hráčů, velikosti týmu, rychlosti získávání surovin nebo stáří mapy a před připojením si udělat lepší představu o tom, co ho čeká.
Detail serveru a historie hráčů
Aktuální počet hráčů je jen jeden okamžik. Detail serveru proto doplňuje graf vývoje populace, historii resetů mapy a přehled samotné mapy s odkazem na RustMaps. Na jednom místě jsou také údaje pro připojení a dostupné odkazy na web nebo Discord serveru.
Z nasbírané historie počítám i to, jak si server drží hráče v průběhu jednoho herního cyklu, kolik jich připadá na kilometr čtvereční mapy a jakou část sledovaného času se čeká ve frontě. Tyto údaje pomáhají rozlišit rušný server, klidnější prostředí i místo, kde bývá obtížné se vůbec připojit.
Hodnocení serverů
Součástí prohlížeče je také žebříček serverů. Pro jeho sestavení jsem vytvořil vlastní systém hodnocení, který využívá nasbíranou historii a zohledňuje dlouhodobou aktivitu i to, jak si server udržuje populaci po resetu mapy.
Hodnocení pomáhá při výběru serveru doplnit aktuální počet hráčů o pohled na jeho aktivitu v delším období. Skóre se průběžně přepočítává na pozadí.
Odhad příštího wipe
Důležitou součástí Rustu je wipe, tedy reset herního světa, při kterém zmizí stavby a začíná nový cyklus. Podle termínu resetu se hráči rozhodují, jestli má cenu začínat stavět novou základnu.
Změny mapy sleduji podle jejích parametrů nebo adresy souboru a ukládám je do historie. Z předchozích wipe pak algoritmus hledá opakující se dny a intervaly a odhaduje další termín. Zohledňuje i pravidelný měsíční reset vynucený aktualizací hry a změny letního času.
Nejde o pevný slib provozovatele serveru, ale o odhad z pozorovaných dat. Intervaly se mezi servery liší. Některé servery resetují mapu několikrát týdně, jiné jednou za dva týdny a některé po měsíční aktualizaci vynechají svůj obvyklý termín.
Sběr a ukládání dat
Servery objevuji přes Steam Web API a jejich stav následně zjišťuji přímo přes protokol Valve A2S nad UDP. Dotaz A2S_INFO vrací základní informace o serveru a populaci, A2S_RULES doplňuje nastavení a metadata. Samostatná služba v .NET zpracovává i ověřovací challenge odpovědi, časové limity a opakované pokusy. Když přímý INFO dotaz selže, zkouší získat náhradní údaje přes Steam Web API.
Z metadat čtu také queue, tedy počet hráčů čekajících na připojení. Ukládám jej společně s počtem hráčů a parametry mapy do historie, ze které pak vznikají grafy a analýzy obsazenosti.
Pro ukládání větších dávek používám Npgsql a hromadný zápis COPY přímo do PostgreSQL. ASP.NET Core API pak čte připravené výsledky a předává je webu v Reactu a TypeScriptu. Otevření stránky tak nemusí čekat na nové dotazování herních serverů. Pro dohled nad sběrem slouží samostatný dashboard s chybami, průběhem kontrol a mezerami v historii.
Plánování aktualizací
Servery rozděluji do tří úrovní priority, takzvaných tierů. Ty určují, jak často se jejich údaje aktualizují. Aktivní a prioritní servery se kontrolují častěji, méně vytížené s delšími odstupy. Zařazení se průběžně přehodnocuje podle nasbíraných dat.
Dotazy se odbavují postupně s omezeným počtem souběžných požadavků. Další čekají na uvolnění kapacity a neúspěšné dotazy se podle nastavení opakují. Díky tomu můžu průběžně sledovat velký seznam serverů a řídit zátěž sběrné služby.
Doporučování serverů
Vedle klasických filtrů jsem připravil průvodce výběrem serveru. Zohledňuje region, velikost skupiny, zkušenosti, herní styl i čas, který chce hráč hře věnovat. Jiný server se hodí na jeden večer a jiný na několik týdnů.
Doporučení vznikají bodovým porovnáním těchto preferencí s vlastnostmi serverů a doplňují je konkrétní důvody výběru. Algoritmus zároveň omezuje opakování stejné serverové sítě, aby výsledky nabízely pestřejší výběr.
Herní statistiky
Projekt obsahuje také volitelný systém podrobných statistik. Pro zapojené servery jsem připravil plugin, který odesílá herní události do API. Z nich mohou vznikat žebříčky hráčů a týmů, přehledy soubojů, těžby, stavění nebo dosažených úspěchů.
Tato část vyžaduje instalaci pluginu a výslovné zapnutí; běžné dotazy na veřejné servery takto podrobná data neposkytují. Základní prohlížeč funguje samostatně. RustBrowser nabízí hráčům přehled pro výběr serveru. Na pozadí průběžně sbírá a zpracovává data pro tento přehled.