Sibhala ukwenza umdlalo weDota ka-2014

Molweni nonke.

Kule ntwasahlobo ndiye ndadibana neprojekthi apho abafana bafunda indlela yokusebenzisa i-Dota 2 i-server version 2014 kwaye, ngokufanelekileyo, badlale kuyo. Ndingumlandeli omkhulu walo mdlalo, kwaye andikwazanga ukuncama eli thuba likhethekileyo lokuzintywilisela ebuntwaneni bam.

Ndijube ngokunzulu, kwaye kwenzekile ukuba ndibhale i-Discord bot enoxanduva malunga nayo yonke imisebenzi engaxhaswanga kuhlelo oludala lomdlalo, oko kukuthi ukuhambelana.
Ngaphambi kwayo yonke into entsha kunye ne-bot, indawo yokusebenzela yenziwa ngesandla. Siqokelele iimpendulo ezili-10 kumyalezo kwaye saqokelela iseva ngesandla, okanye sabamba indawo yokwamkela iindwendwe.

Sibhala ukwenza umdlalo weDota ka-2014

Ubume bam njengomcwangcisi bekungekho kumelana nomsebenzi omninzi wezandla, kwaye ngobusuku ndidwebile eyona nguqulelo ilula ye-bot, eyaphakamisa umncedisi ngokuzenzekelayo xa kukho abantu abali-10.

Ngokukhawuleza ndagqiba ekubeni ndibhale kwii-nodejs, kuba andiyithandi ngokwenene iPython, kwaye ndiziva ndikhululekile kule ndawo.

La ngamava am okuqala ndibhalela i-bot yeDiscord, kodwa iye yalula kakhulu. Imodyuli esemthethweni ye-npm discord.js ibonelela ngojongano olufanelekileyo lokusebenza ngemiyalezo, ukuqokelela iimpendulo, njl.

I-Disclaimer: Yonke imizekelo yekhowudi "yangoku", oku kuthetha ukuba baye baphinda baphinda babhala ebusuku.

Isiseko somdlalo "ngumgca" apho abadlali abafuna ukudlala bafakwe kwaye basuswe xa bengafuni okanye bafumane umdlalo.

Yile nto ingundoqo "yomdlali" ibonakala ngayo. Ekuqaleni yayiyi-id yomsebenzisi kwi-Discord, kodwa kukho izicwangciso zokuqalisa / ukukhangela imidlalo kwisayithi, kodwa izinto zokuqala kuqala.

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

Kwaye nalu ujongano lomgca. Apha, endaweni ye "abadlali," i-abstract ngendlela "yeqela" isetyenzisiweyo. Kumdlali omnye, iqela liquka yena, kunye nabadlali kwiqela, ngokulandelanayo, kubo bonke abadlali beqela.

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
}

Ndagqiba ekubeni ndisebenzise imicimbi ukutshintshisa umxholo. Yayilungele iimeko-kumsitho othi "umdlalo wabantu abali-10 ufunyenwe", ungathumela umyalezo oyimfuneko kubadlali kwimiyalezo yabucala, kwaye wenze ingqiqo yeshishini elisisiseko - uqalise umsebenzi wokukhangela ukulungela, ukulungiselela indawo yokuhlala. ukuqaliswa, njalo njalo.

Kwi-IOC ndisebenzisa i-InversifyJS. Ndinamava amnandi okusebenza neli thala leencwadi. Ngokukhawuleza kwaye kulula!

Sinemigca emininzi kwiseva yethu - songeze i-1x1, eqhelekileyo/ireyithwe, kunye neendlela ezimbalwa zesiko. Ke ngoko, kukho iSingleton RoomService elele phakathi komsebenzisi kunye nokukhangela komdlalo.

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

(Code noodles ukunika umbono wokuba iinkqubo zijongeka njani)

Apha ndiqala umgca wendlela nganye yomdlalo ophunyeziweyo, kwaye kwakhona ndimamele utshintsho "kumaqela" ukuze ulungelelanise imigca kwaye ugweme ezinye iingxabano.

Ke, wenze kakuhle, ndifake amaqhekeza ekhowudi angenanto yakwenza nesihloko, kwaye ngoku masiqhubele phambili ngokuthe ngqo ekwenzeni umdlalo.

Makhe siqwalasele imeko:

1) Umsebenzisi ufuna ukudlala.

2) Ukuze aqalise ukukhangela, usebenzisa iGateway=Discord, oko kukuthi, ibeka impendulo kumyalezo:

Sibhala ukwenza umdlalo weDota ka-2014

3) Eli sango liya kwi-RoomService kwaye lithi "Umsebenzisi osuka kwi-discord ufuna ukungena emgceni, indlela: umdlalo ongalinganiswanga."

I-4) I-RoomService yamkela isicelo sesango kwaye ityhala umsebenzisi (ngokuchanekileyo, iqela labasebenzisi) kumgca ofunekayo.

5) Umgca uhlola rhoqo xa kukho abadlali abaneleyo abadlalayo. Ukuba kunokwenzeka, khupha umcimbi:

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

I-6) I-RoomService ngokucacileyo imamele ngovuyo kuyo yonke i-queue ngolindelo olunexhala lwesi siganeko. Sifumana uluhlu lwabadlali njengegalelo, yenza "igumbi" elibonakalayo kubo, kwaye, ewe, ukhuphe umsitho:

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) Ngoko sifikelele kwigunya "eliphezulu" - iklasi Bot. Ngokuqhelekileyo, ujongene nokudibanisa phakathi kwamasango (andiyiqondi indlela ehlekisayo ekhangeleka ngayo ngesiRashiya) kunye nengqiqo yoshishino lokufanisa. I-bot iyawuva umsitho kwaye iyalele i-DiscordGateway ukuba ithumele ukukhangela ukulungela kubo bonke abasebenzisi.

Sibhala ukwenza umdlalo weDota ka-2014

8) Ukuba umntu uyala okanye akawamkeli umdlalo phakathi kwemizuzu emi-3, ngoko SINGAYIbuyisela emgceni. Sibuyisela wonke umntu emgceni kwaye silinde de kubekho abantu abali-10 kwakhona. Ukuba bonke abadlali bawamkele umdlalo, ke inxalenye enomdla iqala.

Ubumbeko lweseva olunikezelweyo

Imidlalo yethu isingathwa kwiVDS ngeWindows server 2012. Ukusuka koku sinokufikelela kwizigqibo ezininzi:

  1. Akukho docker kuyo, endibetha entliziyweni
  2. Siyonga ngerenti

Umsebenzi kukuqhuba inkqubo kwiVDS ukusuka kwiVPS kwiLinux. Ndabhala iseva elula kwiFlask. Ewe, andiyithandi iPython, kodwa yintoni onokuyenza?Kukhawuleza kwaye kulula ukubhala le seva kuyo.

Yenza imisebenzi emi-3:

  1. Ukuqala umncedisi ngoqwalaselo - ukukhetha imephu, inani labadlali abaza kuqala umdlalo, kunye neseti yeeplagi. Andizukubhala malunga neeplagi ngoku - libali elahlukileyo elineelitha zekofu ebusuku ezixutywe neenyembezi kunye neenwele ezikrazukileyo.
  2. Ukumisa / ukuqalisa kwakhona iseva kwimeko yoxhulumaniso olungaphumelelanga, esinokuluphatha ngesandla kuphela.

Yonke into ilula apha, imizekelo yekhowudi ayifanelekanga. 100 umgca script

Ngoko ke, xa abantu be-10 behlangene kwaye bamkela umdlalo, umncedisi waqaliswa kwaye wonke umntu wayenomdla wokudlala, ikhonkco lokuxhuma kumdlalo lithunyelwe kwimiyalezo yangasese.

Sibhala ukwenza umdlalo weDota ka-2014

Ngokucofa kwikhonkco, umdlali uqhagamshela kumncedisi womdlalo, kwaye ke yiloo nto. Emva kwemizuzu engama-25, "igumbi" elinabadlali liyacinywa.

Ndiyaxolisa kwangaphambili ngenxa yokungahambi kakuhle kwenqaku, andizange ndibhale apha ixesha elide, kwaye kukho ikhowudi eninzi yokugqamisa amacandelo abalulekileyo. IiNoodles, ngokufutshane.

Ukuba ndibona umdla kwisihloko, kuya kuba nenxalenye yesibini - iya kuqulatha intuthumbo yam kunye neeplagi ze-srcds (Umthombo ozinikeleyo weseva), kwaye, mhlawumbi, inkqubo yokulinganisa kunye ne-mini-dotabuff, indawo enezibalo zomdlalo.

Amanye amakhonkco:

  1. Iwebhusayithi yethu (izibalo, ibhodi yabaphambili, iphepha elincinci lokufika kunye nokukhuphela abathengi)
  2. Discord iseva

umthombo: www.habr.com

Yongeza izimvo