Anyị na-ede egwuregwu maka Dota 2014

Ndewonu onye obula.

N'oge opupu ihe ubi a, ahụrụ m ọrụ nke ụmụ okorobịa mụtara ka esi agba ọsọ ụdị nkesa Dota 2 2014 na, ya mere, gwuo egwu na ya. Abụ m nnukwu onye na-akwado egwuregwu a, enweghị m ike ịhapụ ohere a pụrụ iche iji tinye onwe m n'ime ndụ m n'oge m bụ nwata.

M nduru miri emi, o wee mee na m dere Discord bot nke na-ahụ maka ihe fọrọ nke nta ka ọ bụrụ ọrụ niile na-akwadoghị na ụdị egwuregwu ochie, ya bụ egwuregwu.
Tupu ihe ọhụrụ niile na bot, ejiri aka mebere ọnụ ụlọ. Anyị chịkọtara mmeghachi omume 10 na ozi wee jiri aka kpọkọta ihe nkesa, ma ọ bụ kwadoo ọnụ ụlọ ime obodo.

Anyị na-ede egwuregwu maka Dota 2014

Ọdịdị m dị ka onye mmemme enweghị ike iguzogide ọtụtụ ọrụ ntuziaka, na n'otu abalị, m na-esepụta ụdị bot kachasị mfe, nke na-ebuli ihe nkesa na-akpaghị aka mgbe enwere mmadụ 10.

Ekpebiri m ozugbo ide na nodejs, n'ihi na enweghị m mmasị na Python, ọ na-enwekwa ahụ iru ala karịa na gburugburu ebe a.

Nke a bụ ahụmịhe mbụ m na-ede bot maka Discord, mana ọ bịara dị mfe. Modul npm discord.js na-enye interface dị mma maka ịrụ ọrụ na ozi, ịnakọta mmeghachi omume, wdg.

Disclaimer: Ihe atụ koodu niile bụ "ugbu a", nke pụtara na ha agabigala ọtụtụ ugboro nke idegharị n'abalị.

Ndabere nke egwuregwu egwuregwu bụ " kwụ n'ahịrị "nke a na-etinye ndị egwuregwu chọrọ igwu egwu ma wepụ ya mgbe ha na-achọghị ma ọ bụ chọta egwuregwu.

Nke a bụ ihe isi okwu "onye ọkpụkpọ" dị. Na mbụ ọ bụ naanị id onye ọrụ na Discord, mana enwere atụmatụ ịmalite / chọọ egwuregwu site na saịtị ahụ, mana ihe mbụ bu ụzọ.

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

Na ebe a bụ kwụ n'ahịrị interface. N'ebe a, kama "ndị egwuregwu," a na-eji abstraction n'ụdị "otu" eme ihe. Maka otu onye ọkpụkpọ, otu ahụ mejupụtara onwe ya, yana maka ndị egwuregwu n'otu n'otu, nke ndị egwuregwu niile nọ n'otu.

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
}

Ekpebiri m iji mmemme gbanwere ọnọdụ. Ọ dabara maka ikpe - na ihe omume ahụ "a hụrụ egwuregwu maka mmadụ 10", ị nwere ike iziga ndị egwuregwu ozi dị mkpa na ozi nzuzo, wee mezuo ebumnuche azụmaahịa bụ isi - malite ọrụ iji lelee njikere, dozie ọnụ ụlọ. maka igba egbe, na ihe ndị ọzọ.

Maka IOC m na-eji InversifyJS. Enwere m ahụmịhe dị ụtọ na-arụ ọrụ na ọba akwụkwọ a. Ngwa ngwa na mfe!

Anyị nwere ọtụtụ kwụ n'ahịrị na sava anyị - anyị agbakwunyela 1x1, nkịtị/gosiri, yana ụdịdị omenala abụọ. Ya mere, enwere RoomService nke dị n'etiti onye ọrụ na nchọ egwuregwu.

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 iji nye echiche nke usoro usoro ahụ na-adị ka)

N'ebe a, m na-amalite kwụ n'ahịrị maka ụdị egwuregwu ọ bụla etinyere, na-egekwa ntị maka mgbanwe na "otu" iji dozie kwụ n'ahịrị ma zere esemokwu ụfọdụ.

Ya mere, emechara m nke ọma, etinyere m mpempe koodu na-enweghị ihe jikọrọ ya na isiokwu ahụ, ma ugbu a, ka anyị gaa n'ihu ozugbo na egwuregwu.

Ka anyị tụlee ikpe ahụ:

1) Onye ọrụ chọrọ igwu egwu.

2) Iji malite ọchụchọ, ọ na-eji Gateway= Discord, ya bụ, na-etinye mmeghachi omume na ozi ahụ:

Anyị na-ede egwuregwu maka Dota 2014

3) Ọnụ ụzọ ámá a na-aga RoomService wee kwuo "Onye ọrụ sitere na discord chọrọ ịbanye n'ahịrị, ọnọdụ: egwuregwu enweghị ọkwa."

4) RoomService na-anabata arịrịọ ọnụ ụzọ ámá wee kpọba onye ọrụ (n'ụzọ ziri ezi, otu onye ọrụ) n'ime kwụ n'ahịrị achọrọ.

5) Ndị kwụ n'ahịrị na-enyocha oge ọ bụla enwere ndị egwuregwu zuru ezu igwu egwu. Ọ bụrụ na ọ ga-ekwe omume, wepụta mmemme:

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

6) RoomService doro anya na ọ na-anụ ụtọ na-ege kwụ n'ahịrị ọ bụla na-atụsi anya mmemme a. Anyị na-enweta ndepụta nke ndị egwuregwu dị ka ntinye, mepụta “ọnụ ụlọ” mebere ha, na, n'ezie, na-ewepụta mmemme:

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) Ya mere, anyị nwetara ikike "kachasị elu" - klas bot. N'ozuzu, ọ na-ekwu banyere njikọ dị n'etiti ọnụ ụzọ ámá (Enweghị m ike ịghọta otú o si na-akpa ọchị na Russian) na azụmahịa mgbagha nke egwuregwu. Bot ahụ nụrụ ihe omume ahụ wee nye DiscordGateway iwu ka o ziga ndị ọrụ niile nlele njikere.

Anyị na-ede egwuregwu maka Dota 2014

8) Ọ bụrụ na mmadụ ajụ ma ọ bụ anabataghị egwuregwu ahụ n'ime nkeji 3, mgbe ahụ, anyị anaghị alaghachi n'ahịrị. Anyị na-alaghachi ndị ọzọ na kwụ n'ahịrị ma chere ruo mgbe mmadụ iri ọzọ. Ọ bụrụ na ndị egwuregwu niile anabatala egwuregwu ahụ, mgbe ahụ akụkụ na-adọrọ mmasị na-amalite.

Nhazi nkesa raara onwe ya nye

A na-akwado egwuregwu anyị na VDS na Windows Server 2012. Site na nke a anyị nwere ike nweta nkwubi okwu dị iche iche:

  1. Enweghị docker na ya, nke kụrụ m n'obi
  2. Anyị na-echekwa ego n'ụlọ

Ọrụ a bụ ịme usoro na VDS site na VPS na Linux. Edere m sava dị mfe na Flask. Ee, Python anaghị amasị m, mana gịnị ka ị ga - eme? Ọ dị ngwa ma dị mfe ide ihe nkesa a na ya.

Ọ na-arụ ọrụ 3:

  1. Ịmalite ihe nkesa nwere nhazi - ịhọrọ maapụ, ọnụ ọgụgụ ndị na-egwu egwuregwu ga-amalite egwuregwu, na nhazi nke plugins. Agaghị m ede banyere plugins ugbu a - nke ahụ bụ akụkọ dị iche na lita kọfị n'abalị jikọtara ya na anya mmiri na ntutu dọwara adọwa.
  2. Ịkwụsị/ịmalitegharịa ihe nkesa ahụ ma ọ bụrụ na njikọ adịghị eme nke ọma, nke anyị nwere ike iji aka naanị.

Ihe niile dị mfe ebe a, ihe atụ koodu adịghịdị adabara. Edemede ahịrị 100

Ya mere, mgbe ndị mmadụ 10 gbakọtara ma nabata egwuregwu ahụ, a na-emepụta ihe nkesa na onye ọ bụla na-achọsi ike igwu egwu, e zigara njikọ iji jikọọ na egwuregwu ahụ na ozi nzuzo.

Anyị na-ede egwuregwu maka Dota 2014

Site na ịpị njikọ ahụ, onye ọkpụkpọ ahụ na-ejikọta na ihe nkesa egwuregwu, mgbe ahụ ọ bụ ya. Mgbe nkeji ~25 gachara, a na-ekpochapụ “ime ụlọ” nke nwere ndị egwuregwu.

Ana m arịọ mgbaghara n'ihu maka ihe jọgburu onwe ya nke akụkọ ahụ, edebeghị m ebe a ogologo oge, yana enwere ọtụtụ koodu iji gosipụta akụkụ dị mkpa. Noodles, na nkenke.

Ọ bụrụ na m hụ mmasị na isiokwu ahụ, a ga-enwe akụkụ nke abụọ - ọ ga-enwe mmekpa ahụ m na plugins maka srcds (Source raara onwe ya nye ihe nkesa), na, eleghị anya, usoro ọkwa na mini-dotabuff, saịtị nwere ọnụ ọgụgụ egwuregwu.

Ụfọdụ njikọ:

  1. Weebụsaịtị anyị (ọnụọgụ, bọọdụ ndu, obere ibe ọdịda na nbudata ndị ahịa)
  2. Ihe nkesa Discord

isi: www.habr.com

Tinye a comment