Ke kākau nei mākou i ka matchmaking no Dota 2014

Aloha kākou kela kanaka.

I kēia pūnāwai ua loaʻa iaʻu kahi papahana kahi i aʻo ai nā kāne i ka holo ʻana i ka Dota 2 server version 2014 a, no laila, e pāʻani ma luna. Nui wau i kēia pāʻani, a ʻaʻole hiki iaʻu ke hoʻolilo i kēia manawa kūʻokoʻa e hoʻolulu iaʻu iho i koʻu wā kamaliʻi.

Luku loa au, a no laila ua kākau wau i kahi bot Discord nona ke kuleana no nā hana āpau i kākoʻo ʻole ʻia i ka mana kahiko o ka pāʻani, ʻo ia hoʻi ka matchmaking.
Ma mua o nā hana hou a pau me ka bot, ua hana lima ʻia ka lobby. Ua hōʻiliʻili mākou i 10 mau manaʻo i kahi leka a hōʻuluʻulu lima mākou i kahi kikowaena, a hoʻokipa paha i kahi lobby kūloko.

Ke kākau nei mākou i ka matchmaking no Dota 2014

ʻAʻole hiki i koʻu ʻano ma ke ʻano he polokalamu ke kū i ka nui o ka hana lima, a i ka pō aʻu i kahakaha ai i ka mana maʻalahi o ka bot, ka mea i hoʻokiʻekiʻe i ke kikowaena inā he 10 mau kānaka.

Ua hoʻoholo koke wau e kākau i nā nodejs, no ka mea, ʻaʻole wau makemake i ka Python, a ʻoi aku ka ʻoluʻolu i kēia kaiapuni.

ʻO kēia kaʻu ʻike mua e kākau ana i kahi bot no Discord, akā ua maʻalahi loa ia. Hāʻawi ka npm module discord.js i kahi kikowaena kūpono no ka hana ʻana me nā memo, hōʻiliʻili i nā hopena, etc.

Hoʻokuʻu: ʻO nā laʻana code āpau "ʻo kēia manawa", ʻo ia hoʻi ua hele lākou i nā ʻano hou o ke kākau hou ʻana i ka pō.

ʻO ke kumu o ka matchmaking he "queue" kahi e hoʻokomo ʻia ai nā mea pāʻani e makemake e pāʻani a wehe ʻia inā ʻaʻole lākou makemake a loaʻa i kahi pāʻani.

ʻO kēia keʻano o keʻano o ka "mea pāʻani". I ka hoʻomaka ʻana he mea hoʻohana wale nō ia ma Discord, akā aia nā manaʻo e hoʻomaka / ʻimi i nā pāʻani mai ka pūnaewele, akā ʻo nā mea mua.

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

A eia ka laina laina. Maanei, ma kahi o "nā mea pāʻani," hoʻohana ʻia kahi abstraction ma ke ʻano o kahi "hui". No ka mea pāʻani hoʻokahi, aia ka hui iā ia iho, a no nā mea pāʻani ma kahi hui, kēlā me kēia, o nā mea pāʻani a pau o ka hui.

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
}

Ua hoʻoholo wau e hoʻohana i nā hanana e hoʻololi i ka pōʻaiapili. Ua kūpono ia no nā hihia - ma ka hanana "ua loaʻa kahi pāʻani no 10 mau kānaka", hiki iā ʻoe ke hoʻouna i ka leka e pono ai i nā mea pāʻani i nā leka pilikino, a hoʻokō i ka loiloi ʻoihana kumu - hoʻomaka i kahi hana e nānā i ka mākaukau, hoʻomākaukau i ka lobby. no ka hoʻomaka ʻana, a pēlā aku.

No IOC hoʻohana wau iā InversifyJS. He ʻoluʻolu koʻu hana me kēia waihona. ʻO ka wikiwiki a me ka maʻalahi!

Loaʻa iā mākou nā pila ma kā mākou kikowaena - ua hoʻohui mākou i 1x1, maʻamau/helu ʻia, a me nā ʻano hana maʻamau. No laila, aia kahi Singleton RoomService e waiho ana ma waena o ka mea hoʻohana a me ka ʻimi pāʻani.

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 e hāʻawi i kahi manaʻo o ke ʻano o nā kaʻina hana)

Maanei wau e hoʻomaka ai i ka pila no kēlā me kēia ʻano pāʻani i hoʻokō ʻia, a hoʻolohe pū i nā loli i nā "hui" i mea e hoʻoponopono ai i nā queues a pale i kekahi mau paio.

No laila, hana maikaʻi, ua hoʻokomo wau i nā ʻāpana code i pili ʻole i ke kumuhana, a i kēia manawa e neʻe pololei kāua i ka matchmaking.

E noʻonoʻo kākou i ka hihia:

1) Makemake ka mea hoʻohana e pāʻani.

2) No ka hoʻomaka ʻana i ka ʻimi, hoʻohana ʻo ia i Gateway=Discord, ʻo ia hoʻi, kau i kahi pane i ka memo:

Ke kākau nei mākou i ka matchmaking no Dota 2014

3) Hele kēia ʻīpuka i RoomService a ʻōlelo ʻo "Makemake kahi mea hoʻohana mai ka hakakā e komo i ka pila, mode: unrated game."

4) ʻAe ʻo RoomService i ka noi a ka ʻīpuka a hoʻokuke i ka mea hoʻohana (ʻoi aku ka pololei, ka hui mea hoʻohana) i ka pila i makemake ʻia.

5) Nānā ka pila i kēlā me kēia manawa i lawa nā mea pāʻani e pāʻani. Inā hiki, e hoʻopuka i kahi hanana:

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

6) ʻIke ʻia ʻo RoomService me ka hauʻoli i ka hoʻolohe ʻana i kēlā me kēia laina i ka manaʻo hopohopo no kēia hanana. Loaʻa iā mākou kahi papa inoa o nā mea pāʻani ma ke ʻano he hoʻokomo, hana i kahi "lumi" virtual mai lākou, a, ʻoiaʻiʻo, hoʻopuka i kahi hanana:

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) No laila ua hiki mākou i ka mana "kiʻekiʻe" - ka papa Bot. Ma keʻano laulā, piliʻo ia i ka pilina ma waena o nā'īpuka (ʻaʻole hiki iaʻu ke hoʻomaopopo i keʻano o kaʻakaʻaka ma ka'ōlelo Lūkini) a me ka manaʻoʻoihana o ka matchmaking. Lohe ka bot i ka hanana a kauoha iā DiscordGateway e hoʻouna i kahi māka mākaukau i nā mea hoʻohana āpau.

Ke kākau nei mākou i ka matchmaking no Dota 2014

8) Inā hōʻole a ʻae ʻole kekahi i ka pāʻani i loko o 3 mau minuke, a laila ʻAʻole mākou e hoʻihoʻi iā lākou i ka pila. Hoʻihoʻi mākou i nā mea ʻē aʻe i ka laina a kali a hiki i ka 10 poʻe hou. Inā ua ʻae nā mea pāʻani a pau i ka pāʻani, a laila hoʻomaka ka ʻāpana hoihoi.

Hoʻonohonoho kikowaena kikowaena

Hoʻokipa ʻia kā mākou mau pāʻani ma VDS me Windows server 2012. Mai kēia hiki iā mākou ke huki i kekahi mau hopena:

  1. ʻAʻohe docker ma luna o ia mea, ka mea i paʻi iaʻu i ka puʻuwai
  2. Mālama mākou i ka hoʻolimalima

ʻO ka hana e holo i kahi kaʻina ma VDS mai kahi VPS ma Linux. Ua kākau wau i kahi kikowaena maʻalahi ma Flask. ʻAe, ʻaʻole wau makemake iā Python, akā he aha kāu e hana ai? ʻOi aku ka wikiwiki a me ka maʻalahi o ke kākau ʻana i kēia kikowaena ma luna.

Hana ia i 3 mau hana:

  1. Hoʻomaka i kahi kikowaena me kahi hoʻonohonoho - ke koho ʻana i kahi palapala ʻāina, ka helu o nā mea pāʻani e hoʻomaka i ka pāʻani, a me kahi hoʻonohonoho o nā plugins. ʻAʻole wau e kākau e pili ana i nā plugins i kēia manawa - he moʻolelo ʻokoʻa kēlā me nā lita o ka kofe i ka pō i hui pū ʻia me ka waimaka a me ka lauoho haehae.
  2. Hoʻopau/hoʻomaka hou i ke kikowaena inā loaʻa ʻole nā ​​​​pilina, hiki iā mākou ke lawelawe lima wale.

Maʻalahi nā mea a pau ma aneʻi, ʻaʻole kūpono nā code code. 100 laina palapala

No laila, i ka hui ʻana o 10 poʻe a ʻae i ka pāʻani, ua hoʻokuʻu ʻia ke kikowaena a makemake nui nā mea a pau e pāʻani, ua hoʻouna ʻia kahi loulou e hoʻopili ai i ka pāʻani ma nā leka pilikino.

Ke kākau nei mākou i ka matchmaking no Dota 2014

Ma ke kaomi ʻana i ka loulou, pili ka mea pāʻani i ke kikowaena pāʻani, a laila ʻo ia. Ma hope o ~ 25 mau minuke, holoi ʻia ka "lumi" virtual me nā mea pāʻani.

Ke kala aku nei au ma mua no ka ʻino o ka ʻatikala, ʻaʻole wau i kākau ma ʻaneʻi no ka manawa lōʻihi, a he nui loa nā code e hōʻike i nā ʻāpana koʻikoʻi. Noodles, ma ka pōkole.

Inā ʻike wau i ka hoihoi i ke kumuhana, aia kahi ʻāpana ʻelua - e loaʻa i kaʻu ʻeha me nā plugins no srcds (Source dedicated server), a, ʻo ia paha, kahi ʻōnaehana helu a me ka mini-dotabuff, kahi pūnaewele me nā helu pāʻani.

Kekahi mau loulou:

  1. ʻO kā mākou pūnaewele (nā helu helu, alakaʻi, ʻaoʻao pae liʻiliʻi a me ka hoʻoiho ʻana o ka mea kūʻai aku)
  2. Kūkākūkā hoʻopaʻapaʻa

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka