PHP kódminőség fenntartás
php, qa, static code checking, phpunit, phpcs, phpmd, phpstan, churn, phpdd, psalm, phplint, phan
2024-10-17
Failed: bson encoding error: BSON element key cannot contain null bytes
mongo, mongodb, bson, null, key
2024-08-24
Nem bízol a kollégáidban? Akkor valamit rosszul csinálsz!
bizalom vezetokent
2023-05-03
Dolgok, amikről a programozók azt hiszik, hogy tudják, de tévednek
programozoi-tevhitek-falsehoods
2023-04-08
A programozóktól meg kell szabadulni
chatgpt no-code low-code
2023-01-22
Miért fontosak a személyes adatok egyáltalán?
privacyaware, privacy
2023-01-07
Egy tanmese a szerény, de tehetséges informatikusról, akit én csak Gézának hívok
privacyaware, privacy
2023-01-02
Beskatulyáznád magad egy termékkel? Gondold át még egyszer!
learning, vendorlockin, risky
2022-12-11
Rekrúterekről és állásajánlatokról
bérsáv, recruiter, relevancia
2022-10-30
"A hídon akkor kell átmenni, amikor odaérünk."​ - YAGNI
yagni, pagni
2022-10-17
"A lényeg, hogy a munka készen legyen!"
agile, estimation, becsles, scrum, home office
2022-08-20
Munka vs. hivatás, a klasszikus dilemma
hr, hobbi, munka, egyensuly, hivatas
2022-07-18
Miért nem fogok nálatok technikai interjún részt venni?
technikai interju, hr, recruit, leet code, coding challenge, take home challenge
2022-07-04
"Hogyan építsek kapcsolati tőkét, ha karriert szeretnék váltani?"
linkedin, tippek, trukkok
2022-06-10
Junior/Medior/Senior, hogyan mérjük?
junior, medior, senior, hr, grade, level, experience
2022-05-09
11 tipp frontendeseknek, hogyan tegyék hatékonyabbá a munkájukat
frondend, vscode, angular
2021-10-31
Motion zoom - mozgás alapú képrekonstrukció
#52het
2021-06-01
Gesture Launcher
#52het
2021-05-31
CellEvent, első Android alkalmazásom
#52het
2021-05-19
Notebookcheck, azaz hogyan válasszuk ki a legjobb ár-érték arányú eszközt
#52het
2021-05-18
Torrent multiplexer
#52het
2021-05-17
Process watcher, logger
#52het
2021-05-05
Lazy loading material dialog content
lazy loading, angular, material, dialog
2020-12-28
Runtime configuration loading in Angular
angular, runtime, configuration, settings, environment, production
2020-03-29
How to start an Angular project?
angular
2020-03-11
Az 52 hét projekt
#52het
2020-01-01
Akkutöltöttség-jelző
#52het
2020-01-01
NetClub - Kollégiumi internetszolgáltató
#52het
2019-12-31
DeeJayy - Lost Terminal
#52het
2019-12-31
Counter Strike monitor
#52het
2019-12-31
Kollégiumi CS bajnokság 2005
#52het
2019-12-31
Mozgásérzékelős képrögzítő, Camera Capture
#52het
2019-12-30
Többszörös host pingelő
#52het
2019-12-30
Sávszélesség mérő, tesztelő
#52het
2019-12-30
Generáljunk hamis adatokat
#52het
2019-12-30
SQL lekérdezések parancssorból, odbc-vel
#52het
2019-12-30
Nonogram generátor (aka. "Fesse feketére")
#52het
2019-12-30
Egyedi chat alkalmazás, kliens és szerver
#52het
2019-12-29
FontSelector - betűtípusválasztó / font preview
#52het
2019-12-28
Saját hálózati kommunikációs segédszoftver - sox
#52het
2019-12-28
Csoportos e-mail küldő szoftver Delphiben
#52het
2019-12-28
Universal Api caller module for Angular 7-9 With NGRX state management
Ngrx, API, Effects, HttpClient
2019-07-02
A leghosszabb projekt
#52het
2019-04-19
Legelső kioszk projektem: Stari Sör Jukebox
#52het
2019-02-28
BPM számláló
#52het
2018-11-01
Assembly féléves beadandók
#52het
2018-11-01
Chatbot before it was cool
#52het
2018-10-30
StartX - Cseréljük ki a windows tálcáját és a Start menüt
#52het
2018-10-28
What? - fájltípus azonosító
#52het
2018-10-27
Transport Tycoon DirectX
#52het
2018-10-26
Diff - fájlösszehasonlító
#52het
2018-10-26
De Facto - Szoftverfelügyelet
#52het
2018-10-25
CD és DVD katalogizáló
#52het
2018-09-24
MP3 segédeszközök
#52het
2018-09-24
Keylogger - azaz billentyűleütés-figyelő és naplózó alkalmazás
#52het
2018-08-29
Az örök projekt: személyes weboldal és blog
#52het
2018-08-14
Szógyakorló nyelvtanuláshoz
#52het
2018-08-13
Warzone 2100 mentett játék szerkesztő
#52het
2018-08-13
Rejtett Windows-beállításokat konfiguráló program: TweakMaster
#52het
2018-08-13
A DrótPostaGalamb levelezőprogram adatfájljainak dekódolása
#52het
2018-08-13
Privacy jegyzet
2018-07-30
Egy éve ilyenkor
2018-07-25
The Matrix - konzol szimuláció
#52het
2018-07-13
Kakaóreceptkönyv
kakaó
2018-06-29
Crackelés!
#52het
2018-06-22
A K.I.T.T. challenge
#52het
2018-06-18
Doom 2 botokkal
#52het
2018-06-16
Römi játék Delphiben
#52het
2018-06-09
MeetsCow & DeeJayy - Intro
#52het
2018-06-09
Direct viewer - bitmap megjelenítő
#52het
2018-06-09
bazMAG
#52het
2018-06-09
Console Vision - Konzolos ablakkezelő Delphiben
#52het
2018-05-01
Quake 2 egy floppyn
#52het
2018-04-20
Játék-kitömörítők
#52het
2018-04-12
Tetszőleges program elrejtése Windows tálcáról
#52het
2018-04-05
Személyre szabás
#52het
2018-03-28
A year with Angular 5, 6 - Angular 2018
#angular5 #angular #resources #articles
2018-03-16
Az ikon evolúciója
#52het
2018-03-14
Betűtípusok
#52het
2018-03-04
Billentyűzet-gyakorló
#52het
2018-02-28
Zenél is a DeeJayy?
#52het
2018-02-22
Térképrajzoló az Ascii 3D labirintushoz
#52het
2018-02-19
Ascii 3D labyrinth
#52het
2018-02-14
52 hét - 52 projekt, avagy #eletem
#52het
2018-02-14
Dockerezzünk virtualizált környezetben!
docker, xen, ubuntu
2017-11-12
A cloud-initramfs-copymods hatásai paravirtualizált környezetben
ubuntu, xen, copymods, docker, docker-ce, docker.io
2017-11-11
Virtualizáljunk Xen 4.6-tal Ubuntu 16-on (Xenial)
ubuntu, xen, virtualizálás, hypervisor, debootstrap
2017-11-04
Álláskeresésem története
álláskeresés, it, fejvadászok, linkedin, job
2017-10-24
FAR Manager competitors
far manager, file managers
2010-01-01
Blog
blog
2001-01-02

A leghosszabb projekt

... és a vége

Ez egy nagyon hosszú poszt egy nagyon kicsi szubkultúráról, tele speciális utalásokkal, de le kellett írnom. Mindenesetre ha játszottál valaha bármelyik Counter Strike szerverünkön, pacsi!

Hazudnék, ha azt mondanám, nem morzsolok el egy könnycseppet azért a projektért, amit - ugyan változó intenzitással, de - 16 éven keresztül vittem. És aminek rövidesen vége.

Életem egyik legnagyobb, legszerteágazóbb és leghosszabb hobbiprojektje lassan véget ér: 16 év Counter Strike 1.6 üzemeltetés után hamarosan leállítom az utolsó megmaradt C4nn0N szervert is. #rip #cs16 - deejayyhu@twitter


a flyer

Online játékszerver üzemeltetés, mégis ki veheti ezt komolyan?

Még én is joggal teszem fel ezt a kérdést, noha jól tudom, hogy mennyi minden van mögötte. Láttam persze különféle példákat az évek során, leginkább olyanokat, amiket nem akartam követni. Választottam magamnak saját utat, megközelítést és közösséget.

Kezdjük egy kis történelemmel

2000 környékén lehetünk, amikor megismerkedem a Half Life nevű játék egy "mod"-jával (modification), a Counter Strike-kal (CS). Megjegyzés: a CS évekig volt a világ legnépszerűbb online FPS játéka.

Nem tudom, hogy mi fogott meg benne először, azt hiszem talán a társaság, bár ebben az időben legfeljebb számtech órákon illetve LAN-partykon játszottunk, de az, hogy nap-mint-nap szóbajött valamilyen kontextusban, sokkal inkább mélyítette az elköteleződést. Ennek a "mod"-nak is voltak további kiegészítői: pályák, textúrák, modelek, pluginek - azaz ezerféle módon lehetett még játszani azon kívül, amire a készítője eredetileg szánta.

Tehát kezdetben egyedül játszottam a saját gépemen (nem szerettem online, mert nagy volt a késleltetés /ping, lag/). Gondolom sejteni lehet, hogy egy többjátékosra tervezett játék mennyire izgalmas egyedül, ezért beszereztem gépi ellenfeleket plugin formájában - (ro)BOTokat. Ekkor kezdett kikristályosodni bennem a játékban lévő eszközkészlet és ökoszisztéma, mit és hogyan lehet módosítani, minek milyen hatásai vannak.

Majd egyetemre mentem és egyszerre két meghatározó dolog történt: végtelen sávszélesség és óriási közösség. Mindkettő a kollégiumnak köszönhető, a hálózatot éppen abban az évben fejlesztették fel 100Mbit-re, ami az otthoni 56kb-os képest végelennek tűnt, továbbá elég sok informatikussal kerültem össze és - mint említettem - a Counter Strike nagyon népszerű játék volt.

Az évfolyamommal későn érkezők voltunk, a kollégiumban már volt egy közösség, ami korábban jött létre és az infrastruktúrát kihasználva egy kialakult játékos és üzemeltetőgárda közepébe csöppentünk (hello VHS, PoLoSka! :). Az első időkben (meg persze később is, amíg tartott) elvoltam ezzel a közösséggel, a játék népszerűsége évekig töretlen volt és mindig volt kivel játszani.

Megesett továbbá egy kisebb hold-együttállás is: még a bazMAG kapcsán (ugye? vagy matávchat? vagy nemestihamér? :) megismerkedtem HuSkY-val az egyetem előtt, gyakran futottunk össze IRC csatornákon. Aztán egyik nap előkerült a közös téma a chatben és kiderült, hogy ugyanarra az egyetemre járunk, sőt, ő is kollégista és tulajdonképpen két szobával arrébb lakik. A CS-ről hasonlóan vélekedtünk és a korábbi ismertséget alapul véve rövid idő alatt felmerült, hogy csináljunk már egy klánt is (klán = játékosok csoportja, akik jellemzően együtt játszanak, war-okon azonos csapatban, nicknevüket pedig klántag-gel ellátva használják; war = "háború", melyet általában 10 játékos játszik két csapatra osztva, a csapatokban pedig az azonos klánban lévő tagok vannak).

A klán tagjai nagyrészt HuSkY baráti társaságából kerültek ki, de a szobatársai is beszálltak később velem együtt. Volt aztán klánnév-választás is, a kezdeti ]SkAnK[-ról hamar a C4nn0N vált véglegessé. Lett klánlapunk is HuSkYnak köszönhetően, illetve rendszeresen WARoztunk más klánokkal és tettük közzé serényen az eredményeket. Majd lassan felmerült az igény arra, hogy ne mindig mi legyünk vendégek más klánok szerverén, hanem legyen nekünk is egy saját.

Az elhelyezést (a szobatársam ágya alatt) és az üzemeltetést (néha beléptem rá távolról) én vállaltam, a vasat pedig HuSkY lapátolta össze, a kollégiumi internet pedig biztosította, hogy bárkit meg tudjunk invitálni egy kis baráti lövöldözésre.

Ekkor indult el az első C4nn0N klánszerver (2003)

Először csak időnként használtuk háborúzásra, majd - számomra ismeretlen okból - a kollégiumban lévő két másik szerver fokozatosan elveszítette a táborát, akik időnként a mi szerverünkön fordultak meg. Volt egy kis átmenet, mivel nem volt célunk konkurenciát állítani a meglévőknek, kicsit későn kapcsoltunk, hogy azok helyét tulajdonképpen pótolhatnánk is. Rövidesen így lett a C4nn0N az egyetem CS szervere (legjobb tudomásom szerint).

Adódott egy lehetőség, hogy a korlátozott teljesítményű szerverünket egy jobbra cseréljük, amit azonnal meg is léptünk. Ez már nem az ágy alatti porcicák között zümmögött, hanem egy salgópolcon egy erre a célra kialakított helyiségben (csúfolhatnánk szerverszobának is, akár).

Ez volt a második szerver (2005)

Ezen már linux és dedikált CS szerver futott, így sokkal közelebb állt a klasszikus "üzemeltetés" témaköréhez.

A közösséget megerősítvén szerveztem egy kisebb kollégiumi bajnokságot is, valami jelképes nevezési díjjal, amit később a szerver fejlesztésére fordítottunk (így még több játékost elbírt). Összesen 6 csapat volt, mindent dokumentáltunk, volt szép tabella, a meccsekről felvétel (demo) készült, amit később bárki letölthetett és megnézhetett. Én a MoS (Moons of Saturn) klánhoz csatlakoztam, mivel a C4nn0N ezen nem indult (a tagok egy része nem volt sem kollégista, sem az egyetem diákja).

Egy igazi élmény volt látni, ahogy az önálló játékosokból csapatok szerveződnek, gyakorolnak, felkészülnek és waroznak.

Noha a kollégisták még évekig kitartóan látogatták a helyi szervert, a világ is kinyílni látszott és egyre többen választották a publikusan elérhető szervereket is (amikből a különféle egyéb kiegészítők segítségével nagyon sok variációt összeállítottak más üzemeltetők).

Csak néhány tipikus példa a klasszikus "warszervertől" (azaz kifejezetten a Counter Strike eredeti játékmenetétől) eltérő típusok/élmények:

  • deathmatch
  • rune mod
  • warcraft 3 frozen throne
  • ultimate warcraft 3
  • superhero mod
  • paintball mod
  • gungame
  • és a többi

... és persze az alaptól eltérő pályák is sokkal nagyobb arányban voltak a hálózaton kívül reprezentálva.

Igyekeztem a törzsjátékosoknak lehetőséget biztosítani arra, hogy a nyári szünetben is legyen lehetőségük CS-zni a megszokott közösséggel. Több-kevesebb sikerrel ez ment is, de ahog ezek az emberek idővel lediplomáztak vagy elhagyták az egyetemet, a gólyák pedig sokkal inkább az újabb játékokért lelkesedtek, a látogatottság egyre alacsonyabb lett. A C4nn0N szerver visszaminősült a klánszerverünkké, ahol időnként mi vagy baráti klánok háborúztak ellenfeleikkel.


kép 2008-ból

A harmadik szerver (2011)

Részemről nem csak az üzemeltetés, hanem a játék is meglehetősen változó intenzitású volt, volt, hogy fél évig el sem indítottam, de volt, hogy naponta 2-3 órát játszottam. Így alakult, hogy 2011-ben eléggé ráálltam a DeathMatch játéktípusra. Ennek az a jellemzője, hogy sokkal pörgősebb, mint a klasszikus mód, nagyon tempósan vissza lehet építeni a fél-egy év alatt kikopott reflexeket és taktikákat. Annyira rákaptam, hogy az egyik ilyen szerver (a PrO_Hunter$) végül a törzshelyemmé vált és beszálltam az adminisztrációba is: segítettem plugineket bekonfigurálni, kihajítottam a csalókat, stb. és mivel a tulajdonos nem volt túl tapasztalt, elég sok ponton a saját ízlésemre formálhattam mind a játékot mind pedig a szabályokat.

Ez egy bérelt szerver volt, azaz volt egy cég, aki pénzért CS szervereket üzemeltetett, de csak ilyen indít/megállít szintjén, az összes többi konfigurációt annak kellett elvégezni, aki fizetett ezért a szolgáltatásért. És ezek az emberek azért fizettek, hogy a szerverükön játékosok játszanak - érdekes hobbi, mondhatjuk.

Év vége felé a szerver bérlője bejelentette, hogy ő már nem óhajt több pénzt ebbe beleölni (havi 1500-2000 Ft-ot kell elképzelni), be fogja csukni aztán mehet ki-merre lát. Kis gondolkodás után arra jutottam, hogy a parlagon fekvő C4nn0N war-szervert, amit akkorra már elég ritkán használtak, beszántom és csinálok belőle egy DeathMatch szervert, valamint megkérem a PrO_Hunter$ tulajdonosát (szevasz Titán), hogy a játékosokat meg irányítsa át oda. Így is lett, 2011-12-21-én elindult a C4nn0N CSDM (DeathMatch) szerver, ami gyakorlatilag az utolsó bástyája a C4nn0N szervereknek és amit hamarosan leállítok.


ritka alkalmak egyike, mikor Titánnal mindketten játszottunk

Az üzemeltetésen túl

A szerver alapvető működésének van egy halom paramétere (pl. milyen hosszú legyen egy kör, hány játékos lehet bent egyszerre, korlátozva legyen-e a belépés, stb), ezek beállítása pár perc guglizás után kiismerhető. Vannak azonban pluginek (mint például maga a DeathMatch), amiket már egy kicsit komplikáltabb együttműködésre bírni, de az sem rakétatudomány. Gondoskodni kell továbbá egy pályalistáról - amiknek összeállítása igazi kihívás - valamint szabályzatról és működésről.

Legyen rend!

Mind közül talán ez a legnagyobb feladat: biztosítani egy olyan környezetet a játékosoknak, ahol szórakozni tudnak, de semmiképpen sem egymás kárára. Sajnos a legtöbb online játékban gyakori problémát okoznak a csalók (cheaterek), akik különféle módon, segédprogramokkal olyan előnyre tesznek szert, amivel a többi játékos nem rendelkezik és ezzel tönkreteszik a játékélményt.

Példával élve, ha valakinek "aimbot"-ja van (aim robot, célzást segítő), akkor automatikusan minden lövése egyből az ellenfél fejére céloz és egy találattal megöli a legtávolabbi pontból is. Másik példa a "wallhack", ami átlátszóvá teszi a falakat és láthatjuk az ellenfelet, hogy mikor fog kilépni a fal mögül, a vékonyabb falak pedig át is lőhetők. Egyértelmű, hogy az áldozatok nem fognak örülni a kialakult helyzetnek.

Nem ritka az sem, hogy egy csaló miatt a többi játékos is letölti a csalást segítő programot (cheatet) és a helyzet olyan szintre fokozódik, hogy élvezhetetlen lesz a játék a szerveren.

A helyzetet tökéletesen megoldani sajnos nem lehet, de több lehetőséget lehet kombinálni a sikerért:

  1. cheat detektor segédprogram: ezt a programot minden játékosnak le kell töltenie a saját gépére és a játékkal együtt indítani. Sajnos ez is megkerülhető és meglehetősen körülményes. A kezdeti időkben elég népszerű volt, de 2011-ben már szinte egyáltalán nem volt gyakori a használata
  2. adminisztrátorok alkalmazása: megbízható, türelmes, jó ítélőképességű játékosoknak magasabb jogosultsági szintet adni, amivel kiszűrhetik a zavaró elemeket a játékból.
  3. csalók azonosítása statisztikai alapokon

Az igazi rakétatudomány

Bár voltak lelkes adminisztrátor kollégák, akik serényen dobálták kifelé a csalókat, ők sem voltak mindig elérhetőek és viszonylag kevés időt töltöttek játékban is. Egyiknek-másiknak még tapasztalata sem volt annyi, hogy hatékonyan ki tudja szűrni a csalókat (néha, amikor a cheater csapattárs, nehezen észrevehető).

Erre találtam ki az évek során egy algoritmust, amivel statisztikai számításokkal azonosíthatók a csalók.
Egy példa: ha valaki 100 gyilkosságból 100-szor fejlövéssel végzi ki az áldozatát, akkor az 99%-ban csaló (mégpedig aimbottal), mert ilyen jól ember nem tud célozni. Viszont figyelembe kell venni azt az esetet is, aki még csak 5 embert ölt meg 5 fejlövéssel, mivel ilyen kis számnál még elég valószínű, hogy szerencséje volt. Tehát a gyilkosság-fejlövés arányt korrigálni kell a gyilkosságok számával is.
Másik példa: ha valaki 50 találatból 40-et falon keresztül adott le, akkor az valószínűleg átlát a falakon (wallhack), de ha csak 5 találatból 4-szer, az megint lehet akár szerencse is - ezt is korrigálni kell.
Harmadik példa: ha valaki belép a szerverre és az első percben megöl 20 embert, az azt jelenti, hogy 3 másodpercenként öl meg valakit - ez gyakorlatilag esélytelen, itt is valamilyen csalás lesz a háttérben.

A lényeg, hogy van körülbelül 8-10 olyan paraméter, amivel egy játékos viselkedése nagyon jó pontossággal meghatározható és eldönthető, hogy zavarja-e a játékot vagy sem. Az algoritmus kiszámol egy értéket és ha ez átlép egy küszöböt, akkor kérdés nélkül kirúgja a játékost - optimális esetben még azelőtt, hogy bárkinek feltűnne, hogy csaló van a szerveren. Van egy figyelmeztetési küszöb is, ami a többi adminisztrátornak szól: ha csak ezt a küszöböt lépi át, akkor egy webes felületen jelzi az aktív adminisztrátoroknak, hogy egy játékos viselkedése "gyanúra ad okot".

Ez egyszerűen hangzik, mi ebben a rakétatudomány?

Az algoritmus pontos paraméterezése rengeteg megfigyelést igényelt, gyakorlatilag évek alatt nyerte el végleges formáját (a machine learning még nem volt menő). Mindezt egy olyan programozási nyelven kellett megírni (pawn), amit sehol nem használnak és meglehetősen béna - nagyobb hangsúlyt fektettek arra, hogy a kód ne terhelje a szervert fölöslegesen és a játék ne akadozzon miatta.


a képlet, ami megállapítja valakiről, hogy csal-e

Ez a fő funkció (a robotzsaru) adta annak a pluginnek a magját, amit a DeathMatch szerverhez fejlesztettem. A "FairPlay" plugin sok más hasznos dolgot is nyújtott ezen kívül.

A kitiltási-rendszer

Az addig rendben volt, hogy a csalókat kiszűrtük is eltávolítottuk a szerverről, de elég egyszerűen vissza tudtak jönni és ismét megkeseríteni a többi játékos és adminisztrátor életét. Sajnos a Counter Strike-ban nem lehet pontosan azonosítani egyes játékosokat - megszakítja az internetkapcsolatot és új IP címet kap, megváltoztatja a nevét, stb.

Ennek megoldására találtam ki egy speciális módszert, amit nagyon kevesen használtak: a weboldalakon lévő "cookie"-khoz hasonlóan a CS is képes volt adatokat tárolni a játékos gépén, amit minden egyes kapcsolódásnál elküldött a szervernek. Generáltam egy véletlenszerű azonosítót minden játékosnak és belépéskor ellenőriztem, hogy tiltólistán van-e mondjuk egy korábbi csalás miatt.

Ha igen, akkor két dolog történhetett:

  1. ha 60 percnél korábban lett kitiltva, akkor azonnal kirúgtam ismét. Volt rá egy kis esély, hogy valaki észrevette 1 órával ezelőtt és ismét meglátja a nevét akkor elmegy a kedve a játéktól, hiszen a csaló a tiltás ellenére megint a szerveren van.
  2. ha több, mint 60 perce lett kitiltva, akkor visszaengedem a szerverre, de ellene fordítom a viselkedését: csak vaktölténnyel lesz képes lőni. Vázolom: tehát visszajön a csaló, megpróbál aimbottal és wallhackkel ismét a játékosok alá tenni, de senkit nem képes megölni, viszont őt ahogy meglátják, halott. A frusztráció ilyen esetekben hasonló lehet, mint amikor ő a csalásával a többieknek okozott kellemetlenséget.

Moderáció

A játékosok viselkedése (lévén ők általában a fiatalabb, 12+ korosztályból kerültek ki) is kihívást tudott jelenteni. Van ugyanis a játékban chat, azaz a játékosok írhatnak a "közösbe", amit mindenki más lát. Ez kiválóan alkalmas arra, hogy az egyébként nyugodt és békés öldöklést kezelhetetlen hisztibe taszítsa, továbbá egyeseket arra ingereljen, hogy hatásos szavak híján a cheat programmal vegyenek elégtételt vitapartnereiken (meglepően sokan játszanak egyébként kikapcsolt állapotú csaló programmal, amit egyetlen gombnyomással aktiválni tudnak).

Ennek megoldására egy egyszerű, de ritkán használt eszközt használtam fel: a reguláris kifejezéseket (regexp-eket). A regexp szövegillesztésre való trükk, segítségével könnyen kiszűrhetők például a káromkodások vagy az olyan szavak, amik rövid úton vitához vezethetnek.

Ez egyébként pillére volt az egyik alapelvemnek, amit az üzemeltetés kezdetén kitűztem magamnak: csak csalókat tiltok ki.

Reklámmentesség

A chat alkalmas volt arra is, hogy más szerverek elérhetőségeit az ottani adminisztrátorok vagy azok cimborái a C4nn0N szervereken reklámozzák, ezáltal játékosokat átcsábítva csökkentsék a látogatottságunkat. Természetesen erre is kiválóan alkalmas a regexp, mivel a reklámok 99%-a ugyanarra a néhány mintára illeszkedett.

Láthatóság

Mind a moderációban mind a reklámszűrésben is alkalmaztam egy apró furfangot: a felbujtó láthatta a saját üzenetét. Tehát akiket kiszűrt az automatika, mindnyájan azt hitték, hogy az üzenetük célba ért és például mindenki látja a reklámjukat, pedig hát - nem.

Fontos volt az is, hogy az adminisztrátorok azért legyenek tisztában a kiszűrt üzenetekkel is, hiszen az a felkiáltás, hogy "ne hackelj Rezső" Rezsőnek egy offenzív üzenet, amit szóváltás kísérhet, míg az adminisztrátoroknak jelzés, hogy meg kellene nézni Rezső játékstílusát, hátha éppen azon van, hogy tönkretegye a hangulatot.

Alapelvek

Az évek során megfordultam elég sok publikus szerveren. Szinte mindenhol azt tapasztaltam, hogy az adminisztrátorok mindenféle racionális mérlegelést kihagyva, szubjektív szempontok és aktuális lelki állapot alapján (tehát: kényük-kedvük szerint) irányítják az események folyását - tegyük hozzá, hogy 14 éves gyerekektől még nem is várnánk el ennél többet. Ez viszont minden értelmes játékost zavart, ezért én elhatároztam, hogy nálunk pontosan leírható és egyféleképpen értelmezhető szabályokat betartva kell a szervert irányítani.

Többek között egyébként ez is volt az egyik ok, hogy saját szervert csináltam: kiszámítható játékmenet, számonkérhető irányítás.

1. A szájkarate nem kitiltási indok

Azon túl, hogy minden káromkodás és érzékeny szó ki lett szűrve, néha mégis felkorbácsolódtak a kedélyek, nem ritkán egy játékos és egy adminisztrátor között. Írásban megtiltottam minden adminisztrátornak, hogy a chat-beli viselkedés alapján bárkit kitiltsanak. Vagy kezelni vagy figyelmen kívül hagyni tudni kellett, ez volt az elvárás.

2. Kitiltás csak bizonyíték alapján

Az adminisztrátorok többsége nem tapasztalt vén róka, vagy ha az is, nem adminisztrátorként. A többi szerveren az is elég volt kitiltási indoknak, hogy lelőtted az adminisztátort - aki adott esetben szerényebb képességekkel rendelkezett, mint te - mivel azt hitte, csalsz. Nem kell mondani, hogy ez milyen frusztráló, amikor megpróbálsz tisztességesen játszani, netán valami eredményed is van azon a szerveren (benne vagy a toplistában pl.).

Ezért azt is előírtam, hogy kitiltani csak bizonyítékkal alátámasztva lehet - ennek pedig az volt a módja, hogy a játékot fel kellett venni (van erre beépített eszköz, demokészítésnek hívják). A kitiltásokat később felülvizsgáltam és a kérdéses esetekben megvizsgáltam a bizonyítékokat is. A jogtalan kitiltásokat eltöröltem, a sokat hibázó adminisztrátoroktól pedig elvettem a kitiltás jogát.

Ha valaki tehát három óra/nap/hét múlva reklamált a jogtalan kitiltásért, akkor volt lehetőség azt visszanézni és felülvizsgálni. Sajnos persze ezek általában félrevezetések voltak és bebizonyosodtak, hogy joggal kaptak ban-t a csalók.

3. Örök ban (kitiltás)

A szerveren a ban mindig örökre szólt, akit egyszer csaláson kaptunk, az soha többé nem kapta vissza a jogot arra, hogy másokat lelőjön. A sok évnyi tapasztalat arra a következtetésre juttatott, hogy a csalók rendre visszaesnek, ha megtehetik - ezért nálunk nem tehették meg. Az utóbbi 8 évben 5-nél kevesebb alkalommal vontam vissza örök bant, mindegyiket személyes indokok vezettek - az egyik játékos olyan változásokon ment keresztül, aminek végén még az adminisztrátori jogosultságot is kiérdemelte a felkészültsége és a(z új) hozzáállása okán.

Kollégák

Egyedül elég nehéz elvinni egy népszerű szervert, és bár a C4nn0N DeathMatchnek csak egy igazán fényes éve volt, a maradék időben azért könnyen kezelhető volt az alkalmazott segédeszközökkel is (robotzsaru, moderáció, stb). Viszont gyakran érkezett a kérdés a törzsjátékosoktól, hogy esetleg lehetnek-e adminisztrátorok. Egy jó adminisztrátor bizony jelentősen megkönnyítette a dolgomat, több meg méginkább. Lehetőséget teremtettem ezeknek a lelkes játékosoknak arra, hogy ők is beleszólhassanak a játékmenetbe és fenntartsák a jó játékélményt.

A kérdőív

Kezdetben volt egy nagyon egyszerű kérdőív, amit azért találtam ki, hogy a jelentkezőket "arcra" megszűrjem. Ugyanis az űrlapon feltettem olyan nyitott kérdéseket, amikre hosszú szöveggel kellett válaszolni, ezért alkalmas volt arra, hogy a jelentkező több képességét is egyszerre felmérjem. Akadtak szakmai kérdések, de előfordult olyan is, ami csak a motivációt firtatta vagy egyszerűen "Mi a Duna?".

Egyszer összesítettem azt a 139 jelentkezést, ami egy év alatt érkezett és amiből összesen 13-at fogadtam el, mert a többiben olyan hiányosságokat fedeztem fel, hogy az nemhogy hasznára vált volna a szervernek, hanem kárára.

A kérdőív II.

Mivel nem volt túl hatékony a módszer, amivel eddig szűrtem a jelentkezőket (10%), kicsit módosítottam az űrlapon. Alapkövetelmény volt, hogy ha valaki befolyásolni szeretné a közösséget, akkor ismerje azt: átlagosan minimum napi 45 percet töltsön el a szerveren 30 napon át. Ezt a Fairplay plugin szépen mérte és a jelentkezőket már az első lépésnél megakasztotta, ha nem volt aktív tag.

Aki túlélte

A 13 sikeres jelentkezőből végül 6-ból lett aktív adminisztrátor. Az új kollégákat egy tájékoztató e-maillel üdvözöltem, amiben le voltak írva az alapelvek, a már aktív adminisztrátorok, az eszközök, amiket használhat valamint néhány információs weboldal, amiken érdemes volt magukévá tenni, ha jól akarják végezni a dolgukat.

Fairplay

Ahogy korábban említettem, a játékmenet követésére és szabályozására csináltam egy plugint, ami egy csomó terhet levett a vállamról, például a moderáció, a csalók szűrése, ésatöbbi. Ebből a szoftverből egyébként három verzió készült.

Aki kíváncsi a forráskódra, githubon megnézheti.

A kínált funkciók

Igyekszem a teljesség igényével felsorolni a funkciókat, amiket a plugin tudott:

Adatrögzítés: minden ki- és belépést adatbázisban tárolt, ezáltal elérhetővé váltak elég részletes statisztikák a szerver használatáról. A csalók adatait is adatbázisban rögzítette, hogy az örök kitiltás mindig érvényesüljön.

Élő adattovábbítás: minden szerveren történt eseményt továbbított egy olyan felületre, ami böngészőből elérhető volt. Így élőben lehetett követni az eseményeket és közbeavatkozni, amikor szükséges - mindezt anélkül, hogy közben bent kelljen lenni a játékban.

Chat: a Counter Strike-ban alapból van chat, ezt már korábban említettem. Viszont a plugin lehetővé tette, hogy egy külső chatprogramból lehessen ezt olvasni és bármikor hozzászólni. Rövidre lehetett zárni konfliktusokat vagy elnémítani a hangos játékosokat. Ugyanitt lehetett parancsra kitiltani is.

Privát chat: alapesetben nem volt arra lehetőség, hogy két játékos csak egymással beszélgessen, viszont adminisztrátorként erre gyakran volt szükség, megírtam.

Cheat-detektálás: a csalásokat nem csak statisztika alapján lehetett kiszűrni. Voltak olyan buta programok (és csalók), amik a chatben reklámozták, hogy csalnak. Nagyon egyszerű volt ezekre egy mintafelismeréssel azonnali kitiltást akasztani.

Csali: készítetem egy olyan parancsot, ami arra való, hogy teljesen átlátszóvá tegyen. Ezt természetesen nem azért alkottam, hogy észrevétlenül megölhessek mindenkit, hanem azért, mert a csaló programok nem vették figyelembe, hogy nem látszom, akkor is fejbelőttek, ha egyébként erre egy ember képtelen lett volna (mert is nem látott). Az ilyen játékosokat azonnali kitiltással lehetett jutalmazni.

Kitiltás (ban): ahogy korábban említettem, a bannolt játékosok többé nem tudták tönkretenni mások játékát, mivel a töltényeik nem öltek meg senkit a továbbiakban. Helyette viszont összezavarodva rohangáltak, amíg mindenki más őket ölte meg.

Moderáció: mintaillesztésre alapuló káromkodás- és hergelő szavakat kiszűrő megoldás.

Reklámblokkolás: a moderációhoz nagyon hasonló elven a többi szerver reklámjainak kiszűrése.

Robotzsaru: a plugin lelke, a nyugodt játék záloga: egy olyan statisztika alapú tiltórendszer, mely elég nagy pontossággal megtalálja (95%) és eltávolítja a játékból a zavaró elemeket. A hibaarányba (5%) tartozó eseteket később felülvizsgáltam és korrigáltam, az algoritmust pedig annak megfelelően javítottam.

VIP rendszer: ennek segítségével létre lehetett hozni egy olyan elit törzsjátékosgárdát, akiket nem bánt a robotzsaru, csak extrém esetben. Ezek a játékosok "gyanú felett álltak", azaz még az adminisztrátorok sem tilthatták ki őket, csak sziklaszilárd bizonyítékok alapján. 8 év alatt egyetlen visszaélés történt a VIP státusszal. Ennek meglétéről egyébként ők maguk a VIP-k sem tudtak, ez nekem volt információ.

Név védelem: a C4nn0N klán játékosainak és néhány speciális névnek (pl. "admin") a védelmet valósítottam meg. Így nem lehetett félrevezetni a gyanútlan játékosokat.

Játékos követés: egy egyedi azonosító generálása minden játékosnak, ami hosszabb távon is azonosítja őket (hiába tárcsáznak újra pl. és kapnak új IP címet a szolgáltatótól).

DoS védelem: néhány egyszerű terheléses támadás detektálása és elkerülése.

Adminisztrátori menü: a klasszikus AMXX menü helyett egy specális felhasználómenüt hoztam létre. A kettő között az a különbség, hogy míg AMXX-ben a parancsoktól indul az interakció (azaz mit akarunk csinálni és utána, hogy kivel) itt fordítva volt: az éppen megfigyelt játékoson végezhető parancsokat rendezte egy menübe (tehát kivel akarunk csinálni és mit).

A gyűjtött adatok

Világos, hogy a FairPlay által nyújtott szolgáltatások jó része a gyűjtött adatokon alapul.

Kapcsolódási statisztika

Ha most belenézek az adatbázisba, akkor a 3 752 464. kapcsolódási sorszámot látom, ami egy elég tekintélyes szám, ha azt vesszük, hogy 8 év alatt kapcsolódtak ennyien a szerverhez. Gyors fejszámolással és némi korrekcióval kiderül, hogy napi kb. 1000 játékos volt az átlagos (volt példa 5600-ra is, de ma pl. csak 59 volt).

És ugye mi mindent lehet tenni ennyi adattal? 3.7 millió adatpont, ami csupán a csatlakozásokat tartalmazza. Nem volt annyi erőforrásom, de ha a játékmenetet is rögzíteni akarom (tehát minden találat, gyilkosság, stb), akkor milliárd körüli eseménynél járnánk.

Toplista

Nos igen, az első kimutatás szinte adja magát, kik a legjobb játékosok? Amikor egy játékos kilép a szerverről, akkor az utolsó statisztikáját is rögzíti a szerver, azaz mennyi idő alatt mennyi embert ölt meg, stb. illetve a robotzsaru, ami statisztika alapján jelölte meg a csalókat, számolt egy "score"-t mindenkire. Vettem az elmúlt 30 nap aktív játékosait (hiszen aki egyetlen pályán szerencsés, aztán sosem látjuk többé, az még nem érdemel kitűntetést) és sorba rendeztem az eredmény alapján - lett egy toplistánk. Ez a lista sokkal okosabb volt, mint a beépített statisztika, egyrészt mert sokkal több paramétert figyelembe vett, kiszűrte a csalókat, csak aktív játékosokat értékelt (tehát nem maradt a lista elején egy játékos, akit 2 éve láttunk utoljára) és megtekinthető volt a weboldalon is.

Grafikonok

A kapcsolódási-, pálya- és cheater statisztikát elég szépen lehet időben egy vonalgrafikonon megjeleníteni.


használati, működési grafikonok

A gráf

Elég sokszor kihívást jelentett, hogy feltűnt egy játékos, gyanúsan viselkedett, de nem volt egyértelműen eldönthető, hogy mit kellene vele tenni. Voltak viszont bizonyos azonosítói, amiken el lehetett indulni (ip cím, név, stb) és össze lehetett kötni mondjuk egy korábbi csalási eseménnyel. Ezt első körben kézzel, mindig egyenként végigmenve az idővonalon tettem - nem volt túl gyors.

Ennek lerövidítésére találtam ki azt, hogy az összekapcsolódó adatokból generálok egy gráfot, amit egy pillanat alatt átlátok és egyértelműen meg tudom mondani, hogy tényleg egy korábbi játékossal van-e dolgom, vagy nem.


kapcsolati háló

Monitor

A monitor, nem csak a hardvert jelenti, amit általában az irodai alkalmazottak néznek, hanem "megfigyelés", monitoring is. Ahogy korábban utaltam rá, a FairPlay élő adatovábbítást végez két helyre is: az egyik az adatbázis, ahol hosszútávon rögzítettem az értékes információkat, a másik pedig egy megfigyelő alkalmazás, amit az adminisztrátorok használhattak.

Ennek célja annyi volt, hogy anélkül lehetett másodpercről-másodpercre követni az eseményeket, hogy be kelljen lépni a szerverre ténylegesen. A monitor a korábbi fél oldalas képlettel számolt "score" érték alapján sorba rendezte a játékosokat, adott hozzá némi színezést és egyéb funkciókat. Minél pirosabb volt valaki, annál inkább érdemes volt rá odafigyelni. Maga a robotzsaru beavatkozás nélkül 13.9-nél tiltotta ki a csalókat, az adminisztrátoroknak a monitoron 12.0-tól kezdett élénkpiros háttérrel feltűnni a gyanús elem.


a monitor alkalmazás

az újabb monitor alkalmazás

Van egy zseniális program (node-webkit, nw.js), amivel weboldalakat lehetett könnyedén asztali alkalmazássá változtatni. Arra is képes volt, hogy "mindig felül", azaz always-on-top maradjon. Ha valaki emlékszik még a Windows 7-ben lévő "gadget"-ekre, akkor el tud képzelni valami hasonlót, csak a tartalma a fenti monitor weboldal volt. Ilyen módon az egyik monitor szélén mindig ott lehetett a szerver aktivitása, szükség esetén pedig be lehetett avatkozni. De volt olyan adminisztrátor, aki a mobiltelefonja böngészőjébe töltötte be és odatette a képernyője alá, hogy játék közben is lássa a gyanús elemeket.

Egy kis fakete mágia

Nem elírás, "fakete" mágia, mindjárt kiderül. Úgy fogalmaznék, hogy nem mindig a legetikusabb módon tettem szert játszóközönségre. De meg tudom magyarázni, biztos úr! Történt ugyanis, hogy egyik-másik hardverbeszerzésnél költöztetni kellett a CS szervert, vele együtt a pedig legfontontosabb elérhetőségét: az IP címét is. Az IP cím az, amit a játékosok egymás között adnak-vesznek, így lehet felvenni a kedvencek közé is, stb (pattintott kőkorszak).

Így tehát, ha nem akartam elveszíteni a teljes közönséget egy ilyen költözésnél, valahogyan át kellett őket irányítanom az új helyre. Persze vannak erre félmegoldások, de azoknak voltak bizonyos hátulütői, amik csökkentették a hatékonyságot.

Ennek korrigálására találtam ki, hogy a központi szerverlistázóban (aka. gametracker) meghamisítom a fentlévő játékosok számát úgy, hogy mindig úgy tűnjön, hogy aktívan játszanak rajta (persze napszaknak megfelelően, éjszaka nyilván sokkal lejjebb kellett venni, hogy valósnak tűnjön). Ehhez készítettem egy szoftvert, ami úgy válaszol a gametrackernek, mintha egy valódi CS szerver lenne (valójában "fake" szerver volt), de véletlenszerű (viszonylag magas, de reálisnak tűnő) számokat ad vissza.

A kihívás ebben az volt, hogy egyrészt hogyan szimuláljunk Counter Strike szervert, másrészt hogyan válaszoljunk csak a gametrackernek hamis adatokat, a játékosoknak pedig igazit.

Hogyan fejtettem vissza a HLDS protokolját a világon egyedüliként?

(A legrelevánsabb orosz oldalon is csak kérdőjeleket kaptam a témában.)

Nem mondanám bonyolult műveletnek, egyszerűen meg kellett figyelni a hálózati forgalmat, amit a játék a szerverrel kommunikál és kikövetkeztetni a visszafejtéshez szükséges kódokat. Itt lehet olvasgatni.

Mihez lehet kezdeni egy ilyen információval? Utaltam már a gametracker-re, mint központi szervergyűjtőre (tekintsünk el most attól, hogy nem ez volt a hivatalos, de ezt használta mindenki). Azt figyeltem meg, hogy az ő katalógusok elég felületes (minthogy simán tudtam nekik adatot hamisítani is) én pedig szerettem volna egy valódi, információkban bővelkedő, több szempontból súlyozott szerver-ranglistát csinálni.

Saját gametracker

Olyan információkat szerettem volna benne figyelembe venni, mint a játékosok száma, a játékosok aktivitása, a szerver stabilitása, hogy a szerver mennyire "intruzív" (ugyanis szerver oldalról felül lehet írni a játékosok gépén bizonyos fájlokat), milyen játékmódokat és konfigurációt alkalmaz, stb. Továbbá, az is rendelkezésre állt volna, hogy ki, mikor és milyen szervereken fordul meg, lehetett volna a játékosok szokásait is elemezni. Hatalmas adatmennyiség (egy éjszaka alatt 5 GB gyűlt össze csak a magyar szerverekről, mi lett volna nappal a világ összes szerverével?).

Készítettem egy kísérleti weboldalt is, ahol ennyi adatból is szépen lehetett számolni, listázni, analizálni, tulajdonképpen egy PoC-t (proof of concept, megvalósíthatósági kísérlet). Mivel nem volt erőforrásom a hatékony működtetéshez, ez ennyiben is maradt.

"Saját" pálya

A 16 év alatt próbálkoztam pályák készítésével. Egyik-másik egész értelmesen sikerült, de sosem tudtam nagyobb közösséggel kipróbáltatni, hogy ezt alá tudjam támasztani. Volt viszont egy kis kitekintésem a Warface nevű játékkal, ahol az egyik pálya nagyon megtetszett és a játékmódja is azonos volt (DeathMatch), így elhatároztam, hogy megcsinálom ugyanazt csak Counter Strike-ban. Másfél hónap alatt eljutottam egy ténylegesen játszható és élvezhető pályáig.


az eredeti Warface pálya

a másolt CS 1.6 pálya
látszik azért, hogy van a két játék között egy 15 év különbség

Néhány estére sikerült 8-12 embert összeverbuválnom, hogy játszódjunk egy kicsit rajta, véleményem szerint megállná a helyét állandó pályaként is bármelyik szerveren. További trükkje volt a pályának, hogy csak a C4nn0N Hangar szerveren volt játszható (exkluzív!), ugyanis kellett hozzá egy külön plugin is, hogy működjön.

A legnagyobb fa...

... amibe a fejszémet vágtam. Ahogy föntebb utaltam rá, a Counter Strike alapműködését lehetett bővíteni különféle pluginek segítségével. Azonban ezeket a plugineket egy nagyon buta és nehézkesen használható nyelven kellett írni (pawn), hogy működjenek. Ennek megoldására született az ötletem, hogy mi volna, ha fognánk valami modern programozási nyelvet (például a Javasriptet) és azt ültetnénk bele a CS-be.

Két "sikeres" próbálkozásom volt a témában, az egyik a hlds-v8, ami lényegében a Google Javascript értelmezőjének beültetése a CS-be, a másik pedig a hl.js, ami ennél többet, egy egyész Node.js futtatókörnyezetet enged futtatni a játék befolyásolására. Saját hiányosságom, hogy nem tudok annyira C++ nyelven, mint amennyire ez a projekt megkövetelné, így hamarosan mindkettőt magára hagytam PoC állapotban.

Köszönet

Sok embernek tartozom köszönettel, akik így vagy úgy de pozitívan befolyásolták a projekt és az én szakmai fejlődésemet. Első körben HuSkY^-nak, aki nemcsak hardvert, de klánt és lelkesedést is adott. A kollégium lakóinak, akik mindig kitartóan játszottak és neveztek a versenyre is. Az adminisztrátor-társaknak, akik segítettek mindig rendet tartani a zabolátlan tinédzserek között. Titánnak, amiért segített elindulni a harmadik szerverrel, ami idővel Magyarország legnépszerűbb CSDM szervere lett (ha csak pár hónapig is). A játékosoknak, bár ők nyilván csak játszottak, mert éppen volt hol, de néhányuknál az elköteleződés segített szinten tartani a szerverek népszerűségét.

És persze nektek, ha ideáig elolvastátok :) Jutalmul egypár belsős poén.


http://qdb.hu/6702?c=1