Å opavasar saskÄros ar projektu, kurÄ puiÅ”i iemÄcÄ«jÄs palaist Dota 2 servera versiju 2014 un attiecÄ«gi uz tÄs spÄlÄt. Esmu liels Ŕīs spÄles cienÄ«tÄjs un nevarÄju laist garÄm Å”o unikÄlo iespÄju iegrimt bÄrnÄ«bÄ.
Es iegrimu ļoti dziļi, un sagadÄ«jÄs, ka uzrakstÄ«ju Discord botu, kas ir atbildÄ«gs par gandrÄ«z visu funkcionalitÄti, kas netiek atbalstÄ«ta vecajÄ spÄles versijÄ, proti, matchmaking.
Pirms visiem jauninÄjumiem ar robotu vestibils tika izveidots manuÄli. MÄs apkopojÄm 10 reakcijas uz ziÅojumu un manuÄli izveidojÄm serveri vai mitinÄjÄm vietÄjo vestibilu.
Mana programmÄtÄja daba neizturÄja tik lielu roku darbu, un pa nakti ieskicÄju vienkÄrÅ”Äko bota versiju, kas automÄtiski pacÄla serveri, kad bija 10 cilvÄki.
Es uzreiz nolÄmu rakstÄ«t nodejs, jo man Ä«sti nepatÄ«k Python, un es jÅ«tos ÄrtÄk Å”ajÄ vidÄ.
Å Ä« ir mana pirmÄ pieredze, rakstot robotu priekÅ” Discord, taÄu tas izrÄdÄ«jÄs ļoti vienkÄrÅ”i. OficiÄlais npm modulis discord.js nodroÅ”ina Ärtu saskarni darbam ar ziÅojumiem, reakciju apkopoÅ”anai utt.
Atruna: visi koda piemÄri ir āpaÅ”reizÄjieā, kas nozÄ«mÄ, ka tie naktÄ« ir pÄrrakstÄ«juÅ”i vairÄkas iterÄcijas.
SpÄles pamatÄ ir ārindaā, kurÄ spÄlÄtÄji, kuri vÄlas spÄlÄt, tiek ievietoti un izÅemti, kad viÅi nevÄlas vai neatrod spÄli.
TÄ izskatÄs āspÄlÄtÄjaā bÅ«tÄ«ba. SÄkotnÄji tas bija tikai Discord lietotÄja ID, taÄu tiek plÄnots palaist / meklÄt spÄles no vietnes, bet vispirms vispirms.
Un Å”eit ir rindas interfeiss. Å eit āspÄlÄtÄjuā vietÄ tiek izmantota abstrakcija āgrupasā formÄ. Vienam spÄlÄtÄjam grupu veido viÅÅ” pats, bet grupas spÄlÄtÄjiem attiecÄ«gi visi grupas spÄlÄtÄji.
Es nolÄmu izmantot notikumus, lai apmainÄ«tos ar kontekstu. Tas bija piemÄrots gadÄ«jumiem - pasÄkumÄ "tika atrasta spÄle 10 cilvÄkiem", jÅ«s varat nosÅ«tÄ«t nepiecieÅ”amo ziÅu spÄlÄtÄjiem privÄtÄs ziÅÄs un veikt pamata biznesa loÄ£iku - palaist uzdevumu pÄrbaudÄ«t gatavÄ«bu, sagatavot vestibilu palaiÅ”anai un tÄ tÄlÄk.
SOK izmantoju InversifyJS. Man ir patÄ«kama pieredze darbÄ ar Å”o bibliotÄku. Ätri un vienkÄrÅ”i!
MÅ«su serverÄ« ir vairÄkas rindas - esam pievienojuÅ”i 1x1, parasto/novÄrtÄto un pÄris pielÄgotus režīmus. TÄpÄc starp lietotÄju un spÄles meklÄÅ”anu ir viens vienÄ«gs RoomService.
constructor(
@inject(GameServers) private gameServers: GameServers,
@inject(MatchStatsService) private stats: MatchStatsService,
@inject(PartyService) private partyService: PartyService
) {
super();
this.initQueue(MatchmakingMode.RANKED);
this.initQueue(MatchmakingMode.UNRANKED);
this.initQueue(MatchmakingMode.SOLOMID);
this.initQueue(MatchmakingMode.DIRETIDE);
this.initQueue(MatchmakingMode.GREEVILING);
this.partyService.addListener(
"party-update",
(event: PartyUpdatedEvent) => {
this.queues.forEach((q) => {
if (has(q.queue, (t) => t.is(event.party))) {
// if queue has this party, we re-add party
this.leaveQueue(event.qp, q.mode)
this.enterQueue(event.qp, q.mode)
}
});
}
);
this.partyService.addListener(
"party-removed",
(event: PartyUpdatedEvent) => {
this.queues.forEach((q) => {
if (has(q.queue, (t) => t.is(event.party))) {
// if queue has this party, we re-add party
q.remove(event.party)
}
});
}
);
}
(KodÄ nÅ«deles, lai sniegtu priekÅ”statu par to, kÄ procesi aptuveni izskatÄs)
Å eit es inicializÄju rindu katram no ieviestajiem spÄles režīmiem, kÄ arÄ« klausos izmaiÅas āgrupÄsā, lai pielÄgotu rindas un izvairÄ«tos no dažiem konfliktiem.
Labi darÄ«ts, es ievietoju koda fragmentus, kuriem nav nekÄda sakara ar tÄmu, un tagad pÄriesim tieÅ”i uz pirŔļu meklÄÅ”anu.
Apskatīsim gadījumu:
1) LietotÄjs vÄlas spÄlÄt.
2) Lai sÄktu meklÄÅ”anu, viÅÅ” izmanto Gateway=Discord, tas ir, ievada reakciju uz ziÅojumu:
3) Å Ä« vÄrteja pÄriet uz RoomService un saka: "LietotÄjs no nesaskaÅÄm vÄlas iekļūt rindÄ, režīms: spÄle bez vÄrtÄjuma."
6) RoomService acÄ«mredzot ar prieku uzklausa katru rindu, ar bažÄm gaidot Å”o notikumu. MÄs saÅemam spÄlÄtÄju sarakstu kÄ ievadi, veidojam no viÅiem virtuÄlu āistabuā un, protams, izdodam notikumu:
queue.addListener("room-found", (event: RoomFoundEvent) => {
console.log(
`Room found mode: [${mode}]. Time to get free room for these guys`
);
const room = this.getFreeRoom(mode);
room.fill(event.players);
this.onRoomFormed(room);
});
7) TÄtad mÄs nonÄcÄm pie āaugstÄkÄsā autoritÄtes - klases Bot. KopumÄ viÅÅ” nodarbojas ar saikni starp vÄrtiem (es nevaru saprast, cik smieklÄ«gi tas izskatÄs krieviski) un maÄu biznesa loÄ£iku. Bots nejauÅ”i noklausÄs notikumu un liek DiscordGateway nosÅ«tÄ«t gatavÄ«bas pÄrbaudi visiem lietotÄjiem.
8) Ja kÄds spÄli noraida vai nepieÅem 3 minÅ«Å”u laikÄ, tad rindÄ NEATgriežam. Visus pÄrÄjos atgriežam rindÄ un gaidÄm, kamÄr atkal bÅ«s 10 cilvÄki. Ja visi spÄlÄtÄji ir pieÅÄmuÅ”i spÄli, tad sÄkas interesantÄ daļa.
ÄŖpaÅ”a servera konfigurÄcija
MÅ«su spÄles tiek mitinÄtas VDS ar Windows serveri 2012. No tÄ mÄs varam izdarÄ«t vairÄkus secinÄjumus:
Uz tÄ nav dokera, kas man trÄpÄ«ja sirdÄ«
IetaupÄm uz Ä«res rÄÄ·ina
Uzdevums ir palaist procesu VDS no VPS operÄtÄjsistÄmÄ Linux. Es uzrakstÄ«ju vienkÄrÅ”u serveri FlaskÄ. JÄ, man nepatÄ«k Python, bet ko jÅ«s varat darÄ«t? UzrakstÄ«t Å”o serveri ir ÄtrÄk un vienkÄrÅ”Äk.
Tas veic 3 funkcijas:
Servera palaiÅ”ana ar konfigurÄciju - kartes atlase, spÄlÄtÄju skaits, lai sÄktu spÄli, un spraudÅu komplekts. Es tagad nerakstÄ«Å”u par spraudÅiem - tas ir cits stÄsts ar litriem kafijas naktÄ«, kas sajaukta ar asarÄm un saplÄstiem matiem.
Servera apturÄÅ”ana/restartÄÅ”ana neveiksmÄ«gu savienojumu gadÄ«jumÄ, ko varam veikt tikai manuÄli.
Å eit viss ir vienkÄrÅ”i, kodu piemÄri pat nav piemÄroti. 100 rindiÅu skripts
TÄtad, kad 10 cilvÄki sapulcÄjÄs un pieÅÄma spÄli, serveris tika palaists un visi gribÄja spÄlÄt, privÄtÄs ziÅÄs tika nosÅ«tÄ«ta saite, lai pieslÄgtos spÄlei.
NoklikŔķinot uz saites, spÄlÄtÄjs izveido savienojumu ar spÄles serveri, un tas arÄ« viss. PÄc ~25 minÅ«tÄm virtuÄlÄ āistabaā ar spÄlÄtÄjiem tiek notÄ«rÄ«ta.
Jau iepriekÅ” atvainojos par raksta neveiklÄ«bu, ilgu laiku neesmu Å”eit rakstÄ«jis, un ir pÄrÄk daudz koda, lai izceltu svarÄ«gas sadaļas. ÄŖsÄk sakot, nÅ«deles.
Ja redzÄÅ”u interesi par tÄmu, bÅ«s otrÄ daļa - tajÄ bÅ«s manas mocÄ«bas ar spraudÅiem priekÅ” srcds (Source dedicated server), un, iespÄjams, reitingu sistÄma un mini-dotabuff, vietne ar spÄļu statistiku.