Peb tab tom sau kev sib tw rau Dota 2014

Nyob zoo txhua tus.

Lub caij nplooj ntoo hlav no kuv tau hla ib qhov project uas cov txiv neej tau kawm yuav ua li cas khiav Dota 2 server version 2014 thiab, raws li, ua si ntawm nws. Kuv yog tus kiv cua loj ntawm qhov kev ua si no, thiab kuv tsis tuaj yeem hla lub sijhawm tshwj xeeb los raus kuv tus kheej hauv kuv thaum yau.

Kuv nquab heev, thiab nws thiaj li tshwm sim hais tias kuv tau sau ib tug Discord bot uas yog lub luag hauj lwm rau yuav luag tag nrho cov functionality uas tsis txaus siab nyob rau hauv lub qub version ntawm qhov kev ua si, uas yog matchmaking.
Ua ntej txhua qhov kev tsim kho tshiab nrog bot, lub chaw tos txais tau tsim manually. Peb tau sau 10 cov lus teb rau cov lus thiab manually sib sau ua ke ib tus neeg rau zaub mov, lossis tuav lub chaw tos txais hauv zos.

Peb tab tom sau kev sib tw rau Dota 2014

Kuv qhov xwm txheej ua tus programmer tsis tuaj yeem tiv taus ntau phau ntawv ua haujlwm, thiab thaum hmo ntuj kuv tau kos tawm qhov yooj yim tshaj plaws ntawm bot, uas tau tsa lub server thaum muaj 10 tus neeg.

Kuv tam sim ntawd txiav txim siab sau rau hauv nodejs, vim kuv tsis nyiam Python tiag tiag, thiab kuv xav tias xis nyob hauv qhov chaw no.

Nov yog kuv thawj qhov kev sau ntawv bot rau Discord, tab sis nws hloov tawm los ua qhov yooj yim heev. Cov nom tswv npm module discord.js muab qhov yooj yim interface rau kev ua haujlwm nrog cov lus, sau cov kev cuam tshuam, thiab lwm yam.

Tsis lees paub: Tag nrho cov qauv code yog "tam sim no", txhais tau tias lawv tau dhau los ntawm ntau qhov kev rov sau dua thaum hmo ntuj.

Lub hauv paus ntawm kev sib tw yog "queue" uas cov neeg ua si uas xav ua si tau muab tso rau hauv thiab tshem tawm thaum lawv tsis xav los yog nrhiav kev ua si.

Qhov no yog qhov tseem ceeb ntawm "tus neeg ua si" zoo li. Thaum xub thawj nws tsuas yog tus neeg siv id hauv Discord, tab sis muaj cov phiaj xwm tshaj tawm / tshawb nrhiav kev ua si los ntawm lub xaib, tab sis ua ntej ua ntej.

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

Thiab ntawm no yog qhov queue interface. Ntawm no, es tsis txhob "cov neeg ua si", ib qho kev paub daws teeb meem hauv daim ntawv ntawm "pab pawg" yog siv. Rau ib tus neeg ua si, pab pawg muaj nws tus kheej, thiab rau cov neeg ua si hauv ib pab pawg, feem, ntawm txhua tus players hauv pab pawg.

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
}

Kuv txiav txim siab siv cov xwm txheej los pauv cov ntsiab lus. Nws yog qhov tsim nyog rau cov xwm txheej - thaum qhov kev tshwm sim "ib qho kev ua si rau 10 tus neeg tau pom", koj tuaj yeem xa cov lus tsim nyog rau cov neeg ua si hauv cov lus ntiag tug, thiab ua tiav cov txheej txheem kev lag luam yooj yim - pib ua haujlwm los kuaj xyuas kev npaj, npaj lub chaw tos txais. rau kev tso tawm, thiab lwm yam.

Rau IOC Kuv siv InversifyJS. Kuv muaj kev zoo siab ua haujlwm nrog lub tsev qiv ntawv no. Ceev thiab yooj yim!

Peb muaj ob peb kab ntawm peb cov neeg rau zaub mov - peb tau ntxiv 1x1, ib txwm / ntsuas, thiab ob peb hom kev cai. Yog li ntawd, muaj ib tug singleton RoomService uas nyob nruab nrab ntawm tus neeg siv thiab cov kev ua si nrhiav.

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 los muab lub tswv yim ntawm cov txheej txheem zoo li cas)

Ntawm no kuv pib cov kab rau txhua qhov kev ua si hom, thiab tseem mloog cov kev hloov pauv hauv "pab pawg" txhawm rau kho cov kab thiab zam qee qhov tsis sib haum xeeb.

Yog li, ua tau zoo, Kuv tau tso cov lej ntawm cov lej uas tsis muaj dab tsi ua rau lub ncauj lus, thiab tam sim no cia peb txav mus ncaj qha rau kev sib tw.

Cia peb xav txog qhov xwm txheej:

1) Tus neeg siv xav ua si.

2) Txhawm rau pib qhov kev tshawb fawb, nws siv Gateway = Discord, uas yog, tso cov lus teb rau cov lus:

Peb tab tom sau kev sib tw rau Dota 2014

3) Lub rooj vag no mus rau RoomService thiab hais tias "Ib tus neeg siv los ntawm kev tsis sib haum xeeb xav nkag mus rau hauv kab, hom: tsis muaj kev ua si."

4) RoomService lees txais lub rooj vag qhov kev thov thiab thawb tus neeg siv (ntau dua, pawg neeg siv) rau hauv cov kab uas xav tau.

5) Cov kab kuaj xyuas txhua zaus muaj cov players txaus los ua si. Yog ua tau, emit ib qho kev tshwm sim:

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

6) RoomService yog pom tseeb zoo siab mloog rau txhua tus kab hauv kev txhawj xeeb txog qhov xwm txheej no. Peb tau txais ib daim ntawv teev cov players raws li kev tawm tswv yim, tsim virtual "chav" los ntawm lawv, thiab, tau kawg, teeb tsa ib qho kev tshwm sim:

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) Yog li peb tau mus rau "siab tshaj" txoj cai - chav kawm Bot. Feem ntau, nws cuam tshuam nrog kev sib txuas ntawm lub rooj vag (Kuv tsis tuaj yeem nkag siab tias nws zoo li cas hauv Lavxias) thiab kev lag luam logic ntawm kev sib tw. Lub bot hnov ​​​​txog qhov xwm txheej thiab hais kom DiscordGateway xa daim tshev npaj rau txhua tus neeg siv.

Peb tab tom sau kev sib tw rau Dota 2014

8) Yog tias ib tug neeg tsis lees paub lossis tsis lees txais qhov kev ua si hauv 3 feeb, ces peb TSIS TXHOB xa lawv rov qab rau hauv kab. Peb rov qab txhua tus neeg mus rau hauv kab thiab tos kom txog thaum muaj 10 tus neeg ntxiv. Yog tias txhua tus players tau txais qhov kev ua si, ces qhov nthuav qhia pib.

Dedicated server configuration

Peb cov kev ua si tau tuav ntawm VDS nrog Windows server 2012. Los ntawm qhov no peb tuaj yeem kos ntau cov lus xaus:

  1. Tsis muaj docker rau ntawm nws, uas ntaus kuv hauv siab
  2. Peb txuag nqi tsev

Txoj haujlwm yog los khiav cov txheej txheem ntawm VDS los ntawm VPS ntawm Linux. Kuv sau ib qho yooj yim server hauv Flask. Yog lawm, Kuv tsis nyiam Python, tab sis koj tuaj yeem ua li cas? Nws nrawm dua thiab yooj yim dua los sau cov server no rau ntawm nws.

Nws ua 3 txoj haujlwm:

  1. Pib lub server nrog kev teeb tsa - xaiv ib daim ntawv qhia, tus naj npawb ntawm cov neeg ua si pib qhov kev ua si, thiab cov txheej txheem plugins. Kuv yuav tsis sau txog plugins tam sim no - uas yog ib zaj dab neeg sib txawv nrog litres kas fes thaum hmo ntuj sib xyaw nrog kua muag thiab cov plaub hau tawg.
  2. Nres / rov pib dua tus neeg rau zaub mov hauv qhov xwm txheej tsis ua tiav, uas peb tuaj yeem ua manually nkaus xwb.

Txhua yam yog yooj yim ntawm no, code piv txwv tsis txawm tsim nyog. 100 kab ntawv

Yog li, thaum 10 tus neeg tau sib sau ua ke thiab lees txais qhov kev ua si, cov neeg rau zaub mov tau pib thiab txhua tus tau mob siab rau ua si, qhov txuas txuas mus rau qhov kev ua si raug xa hauv cov lus ntiag tug.

Peb tab tom sau kev sib tw rau Dota 2014

Los ntawm txhaj rau qhov txuas, tus neeg ua si txuas mus rau lub server game, thiab tom qab ntawd yog nws. Tom qab ~ 25 feeb, virtual "chav" nrog cov players raug tshem tawm.

Kuv thov zam txim ua ntej rau qhov tsis txaus ntseeg ntawm tsab xov xwm, Kuv tsis tau sau rau ntawm no ntev, thiab muaj ntau txoj cai los qhia txog ntu tseem ceeb. Noodles, luv luv.

Yog tias kuv pom kev txaus siab rau lub ntsiab lus, yuav muaj ib feem thib ob - nws yuav muaj kuv qhov kev tsim txom nrog plugins rau srcds (Tseem ceeb neeg rau zaub mov), thiab, tej zaum, qhov kev ntsuam xyuas qhov system thiab mini-dotabuff, ib qhov chaw nrog kev ua si txheeb cais.

Qee qhov txuas:

  1. Peb lub vev xaib (cov txheeb cais, cov thawj coj, nplooj ntawv me me thiab cov neeg siv khoom rub tawm)
  2. Discord server

Tau qhov twg los: www.hab.com

Ntxiv ib saib