Qed niktbu t-tlaqqigħ għal Dota 2014

Hi kulħadd

Din ir-rebbiegħa ltqajt ma 'proġett li fih il-guys tgħallmu kif imexxu l-verżjoni tas-server Dota 2 2014 u, għaldaqstant, jilagħbu fuqha. Jien dilettant kbir ta’ din il-logħba, u ma stajtx inħalli din l-opportunità unika biex tgħaddas ruħi fi tfuliti.

I ħamma fil-fond ħafna, u ġara li ktibt Discord bot li huwa responsabbli għal kważi l-funzjonalità kollha li mhix appoġġjata fil-verżjoni l-antika tal-logħba, jiġifieri t-tlaqqigħ.
Qabel l-innovazzjonijiet kollha bil-bot, il-lobby inħoloq manwalment. Ġbarna 10 reazzjonijiet għal messaġġ u immuntajna manwalment server, jew ospitajna lobby lokali.

Qed niktbu t-tlaqqigħ għal Dota 2014

In-natura tiegħi bħala programmatur ma setgħetx tiflaħ tant xogħol manwali, u mil-lum għal għada fassalt l-aktar verżjoni sempliċi tal-bot, li awtomatikament qajjem is-server meta kien hemm 10 nies.

Immedjatament iddeċidejt li nikteb f'nodejs, għax ma tantx inħobb Python, u nħossni aktar komdu f'dan l-ambjent.

Din hija l-ewwel esperjenza tiegħi nikteb bot għal Discord, iżda rriżulta li kien sempliċi ħafna. Il-modulu npm uffiċjali discord.js jipprovdi interface konvenjenti biex taħdem ma 'messaġġi, tiġbor reazzjonijiet, eċċ.

Ċaħda ta' responsabbiltà: L-eżempji kollha tal-kodiċi huma "kurrenti", li jfisser li għaddew minn diversi iterazzjonijiet ta 'kitba mill-ġdid bil-lejl.

Il-bażi tat-tlaqqigħ hija "kju" li fiha l-plejers li jridu jilagħbu jitqiegħdu u jitneħħew meta ma jridux jew isibu logħba.

Dan huwa kif tidher l-essenza ta '"player". Inizjalment kien biss user id f'Discord, iżda hemm pjanijiet biex tniedi/tfittex logħob mis-sit, iżda l-ewwelnett.

export enum Realm {
  DISCORD,
  EXTERNAL,
}

export default class QueuePlayer {
  constructor(public readonly realm: Realm, public readonly id: string) {}

  public is(qp: QueuePlayer): boolean {
    return this.realm === qp.realm && this.id === qp.id;
  }

  static Discord(id: string) {
    return new QueuePlayer(Realm.DISCORD, id);
  }

  static External(id: string) {
    return new QueuePlayer(Realm.EXTERNAL, id);
  }
}

U hawn huwa l-interface tal-kju. Hawnhekk, minflok "plejers", tintuża estrazzjoni fil-forma ta '"grupp". Għal plejer wieħed, il-grupp jikkonsisti minnu nnifsu, u għal plejers fi grupp, rispettivament, mill-plejers kollha fil-grupp.

export default interface IQueue extends EventEmitter {
  inQueue: QueuePlayer[]
  put(uid: Party): boolean;
  remove(uid: Party): boolean;
  removeAll(ids: Party[]): void;

  mode: MatchmakingMode
  roomSize: number;
  clear(): void
}

Iddeċidejt li nuża l-avvenimenti biex niskambja l-kuntest. Kien adattat għal każijiet - mal-avveniment "instabet logħba għal 10 persuni", tista 'tibgħat il-messaġġ meħtieġ lill-plejers f'messaġġi privati, u twettaq il-loġika kummerċjali bażika - tniedi kompitu biex tiċċekkja r-rieda, tipprepara l-lobby għat-tnedija, eċċ.

Għall-IOC nuża InversifyJS. Għandi esperjenza pjaċevoli ta' xogħol ma' din il-librerija. Mgħaġġel u faċli!

Għandna diversi kjuwijiet fuq is-server tagħna - żidna 1x1, normali/ratati, u ftit modi personalizzati. Għalhekk, hemm singleton RoomService li jinsab bejn l-utent u t-tfittxija tal-logħba.

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)
          }
        });
      }
    );
  }

(Kodifika noodles biex tagħti idea ta' kif jidhru bejn wieħed u ieħor il-proċessi)

Hawnhekk inizjalizza l-kju għal kull waħda mill-modi tal-logħob implimentati, u nisma 'wkoll għal bidliet fi "gruppi" sabiex taġġusta l-kjuwijiet u tevita xi kunflitti.

Allura, tajjeb, daħħalt biċċiet ta 'kodiċi li m'għandhom x'jaqsmu xejn mas-suġġett, u issa ejja ngħaddu direttament għat-tlaqqigħ.

Ejja nikkunsidraw il-każ:

1) L-utent irid jilgħab.

2) Sabiex jibda t-tfittxija, juża Gateway=Discord, jiġifieri, ipoġġi reazzjoni għall-messaġġ:

Qed niktbu t-tlaqqigħ għal Dota 2014

3) Dan il-portal imur għand RoomService u jgħid "Utent minn discord irid jidħol fil-kju, mod: logħba mhux klassifikata."

4) RoomService jaċċetta t-talba tal-gateway u jimbotta lill-utent (b'mod aktar preċiż, il-grupp tal-utenti) fil-kju mixtieq.

5) Il-kju jiċċekkja kull darba li jkun hemm biżżejjed plejers biex jilagħbu. Jekk possibbli, emetti avveniment:

private onRoomFound(players: Party[]) {
    this.emit("room-found", {
      players,
    });
  }

6) RoomService huwa ovvjament kuntent li jisma 'kull kju fl-antiċipazzjoni anzjużi ta' dan l-avveniment. Nirċievu lista ta 'plejers bħala input, niffurmaw "kamra" virtwali minnhom, u, ovvjament, noħorġu avveniment:

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) Allura wasalna għall-"ogħla" awtorità - il-klassi Bot. B'mod ġenerali, jittratta l-konnessjoni bejn il-bibien (ma nistax nifhem kemm jidher umoristiku bir-Russu) u l-loġika tan-negozju tat-tlaqqigħ. Il-bot jisma 'l-avveniment u jordna lil DiscordGateway biex jibgħat verifika ta' prontezza lill-utenti kollha.

Qed niktbu t-tlaqqigħ għal Dota 2014

8) Jekk xi ħadd jirrifjuta jew ma jaċċettax il-logħba fi żmien 3 minuti, allura MA NIrritornawhomx fil-kju. Nirritornaw lil kulħadd fil-kju u nistennew sakemm jerġa’ jkun hemm 10 persuni. Jekk il-plejers kollha aċċettaw il-logħba, allura tibda l-parti interessanti.

Konfigurazzjoni ta 'server dedikat

Il-logħob tagħna huwa ospitat fuq VDS b'Windows server 2012. Minn dan nistgħu niġbdu diversi konklużjonijiet:

  1. M'hemm l-ebda docker fuqha, li laqatni f'qalbi
  2. Niffrankaw fuq il-kera

Il-kompitu huwa li tmexxi proċess fuq VDS minn VPS fuq Linux. Jien ktibt server sempliċi f'Flask. Iva, ma nħobbx Python, imma x'tista 'tagħmel? Huwa aktar mgħaġġel u aktar faċli li tikteb dan is-server fuqu.

Huwa jwettaq 3 funzjonijiet:

  1. Bidu ta 'server b'konfigurazzjoni - għażla ta' mappa, in-numru ta 'plejers biex tibda l-logħba, u sett ta' plugins. Mhux se nikteb dwar plugins issa - dik hija storja differenti b'litri ta 'kafè bil-lejl imħallat ma' tiċrit u xagħar imqatta '.
  2. Twaqqaf/ristartja s-server f'każ ta 'konnessjonijiet li ma rnexxewx, li nistgħu nittrattaw biss manwalment.

Kollox huwa sempliċi hawn, eżempji ta 'kodiċi lanqas huma xierqa. skript ta' 100 linja

Allura, meta 10 persuni ltaqgħu flimkien u aċċettaw il-logħba, is-server ġie mniedi u kulħadd kien ħerqan biex jilgħab, intbagħtet link biex tikkonnettja mal-logħba f'messaġġi privati.

Qed niktbu t-tlaqqigħ għal Dota 2014

Billi tikklikkja fuq il-link, il-plejer jgħaqqad mas-server tal-logħob, u mbagħad dak hu. Wara ~ 25 minuta, il-"kamra" virtwali mal-plejers titneħħa.

Niskuża ruħi bil-quddiem għall-iskomda tal-artiklu, ilni ma nikteb hawn, u hemm wisq kodiċi biex tenfasizza sezzjonijiet importanti. Noodles, fil-qosor.

Jekk nara interess fis-suġġett, se jkun hemm it-tieni parti - se jkun fiha t-torment tiegħi bi plugins għal srcds (Source dedikat server), u, probabbilment, sistema ta 'klassifikazzjoni u mini-dotabuff, sit bi statistika tal-logħob.

Xi links:

  1. Il-websajt tagħna (statistika, leaderboard, paġna żgħira ta' inżul u download tal-klijent)
  2. Discord server

Sors: www.habr.com

Żid kumment