A n kọ ibaramu fun Dota 2014

Mo ki gbogbo yin.

Ni orisun omi yii Mo wa kọja iṣẹ akanṣe kan ninu eyiti awọn eniyan buruku kọ bi o ṣe le ṣiṣe ẹya olupin Dota 2 2014 ati, ni ibamu, mu ṣiṣẹ lori rẹ. Mo jẹ olufẹ nla ti ere yii, ati pe Emi ko le kọja aye alailẹgbẹ yii lati fi ara mi bọmi ni igba ewe mi.

Mo jinlẹ pupọ, ati pe o ṣẹlẹ pe Mo kọ bot Discord kan ti o jẹ iduro fun gbogbo awọn iṣẹ ṣiṣe ti ko ni atilẹyin ni ẹya atijọ ti ere naa, eyun matchmaking.
Ṣaaju gbogbo awọn imotuntun pẹlu bot, ibebe naa ni a ṣẹda pẹlu ọwọ. A kojọpọ awọn aati 10 si ifiranṣẹ kan ati pe a ṣajọpọ olupin pẹlu ọwọ, tabi gbalejo ibebe agbegbe kan.

A n kọ ibaramu fun Dota 2014

Iseda mi bi pirogirama ko le koju iṣẹ afọwọṣe pupọ, ati ni alẹ moju Mo ṣe apẹrẹ ẹya ti o rọrun julọ ti bot, eyiti o gbe olupin naa dide laifọwọyi nigbati eniyan mẹwa 10 wa.

Mo pinnu lẹsẹkẹsẹ lati kọ ni nodejs, nitori Emi ko fẹran Python gaan, ati pe Mo ni itunu diẹ sii ni agbegbe yii.

Eyi ni iriri akọkọ mi kikọ bot kan fun Discord, ṣugbọn o wa ni irọrun pupọ. Awọn osise npm module discord.js pese a rọrun ni wiwo fun ṣiṣẹ pẹlu awọn ifiranṣẹ, gbigba aati, ati be be lo.

AlAIgBA: Gbogbo awọn apẹẹrẹ koodu jẹ “lọwọlọwọ”, afipamo pe wọn ti kọja ọpọlọpọ awọn iterations ti atunkọ ni alẹ.

Ipilẹ ti matchmaking ni a "isinyi" ninu eyi ti awọn ẹrọ orin ti o fẹ lati mu wa ni gbe sinu ati ki o kuro nigba ti won ko ba fẹ lati tabi ri ere kan.

Eleyi jẹ ohun ti awọn lodi ti a "player" wulẹ bi. Ni ibẹrẹ o jẹ id olumulo nikan ni Discord, ṣugbọn awọn ero wa lati ṣe ifilọlẹ / wa awọn ere lati aaye naa, ṣugbọn awọn nkan akọkọ ni akọkọ.

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

Ati ki o nibi ni wiwo ti isinyi. Nibi, dipo "awọn ẹrọ orin," abstraction ni irisi "ẹgbẹ" ni a lo. Fun ẹrọ orin kan, ẹgbẹ naa ni tirẹ, ati fun awọn oṣere ni ẹgbẹ kan, lẹsẹsẹ, ti gbogbo awọn oṣere ninu ẹgbẹ naa.

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
}

Mo pinnu lati lo awọn iṣẹlẹ lati paarọ ọrọ-ọrọ. O dara fun awọn ọran - lori iṣẹlẹ naa “ere kan fun eniyan 10 ni a rii”, o le fi ifiranṣẹ pataki ranṣẹ si awọn oṣere ni awọn ifiranṣẹ aladani, ati ṣe ọgbọn iṣowo ipilẹ - ṣe ifilọlẹ iṣẹ kan lati ṣayẹwo imurasilẹ, mura ibebe. fun ifilole, ati be be lo.

Fun IOC Mo lo InversifyJS. Mo ni kan dídùn iriri ṣiṣẹ pẹlu yi ìkàwé. Sare ati ki o rọrun!

A ni ọpọlọpọ awọn ila lori olupin wa - a ti ṣafikun 1x1, deede/ti wọn ṣe, ati awọn ipo aṣa tọkọtaya kan. Nitorinaa, Iṣẹ Room Singleton kan wa ti o wa laarin olumulo ati wiwa ere.

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

(Awọn nudulu koodu lati fun imọran kini kini awọn ilana ṣe dabi aijọju)

Nibi Mo bẹrẹ isinyi fun ọkọọkan awọn ipo ere ti a ṣe imuse, ati tun tẹtisi awọn ayipada ninu “awọn ẹgbẹ” lati ṣatunṣe awọn ila ati yago fun diẹ ninu awọn ija.

Nítorí, daradara ṣe, Mo ti fi sii ona ti koodu ti o ni nkankan lati se pẹlu awọn koko, ki o si bayi jẹ ki ká gbe lori taara si matchmaking.

Ẹ jẹ́ ká gbé ọ̀ràn náà yẹ̀ wò:

1) Olumulo fẹ lati mu ṣiṣẹ.

2) Lati bẹrẹ wiwa, o nlo Gateway=Discord, iyẹn ni, fi esi si ifiranṣẹ naa:

A n kọ ibaramu fun Dota 2014

3) Ẹnu-ọna yii lọ si RoomService o sọ pe “Olumulo lati discord fẹ lati tẹ isinyi, ipo: ere ti ko ni idiyele.”

4) Iṣẹ Room gba ibeere ẹnu-ọna ati titari olumulo (diẹ sii ni deede, ẹgbẹ olumulo) sinu isinyi ti o fẹ.

5) Awọn sọwedowo isinyi ni gbogbo igba ti awọn ẹrọ orin to lati mu ṣiṣẹ. Ti o ba ṣee ṣe, tu iṣẹlẹ kan jade:

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

6) Iṣẹ Room ni o han gedegbe pẹlu inudidun ti n tẹtisi gbogbo awọn ti isinyi ni ifojusona aniyan ti iṣẹlẹ yii. A gba atokọ ti awọn oṣere bi titẹ sii, ṣe agbekalẹ “yara” foju kan lati ọdọ wọn, ati, nitorinaa, gbejade iṣẹlẹ kan:

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) Nitorinaa a de si aṣẹ “ga julọ” - kilasi naa Bot. Ni gbogbogbo, o ṣe pẹlu asopọ laarin awọn ẹnu-ọna (Emi ko le loye bi o ṣe dun ni Russian) ati imọ-ọrọ iṣowo ti matchmaking. Boti naa gbọ iṣẹlẹ naa ati paṣẹ fun DiscordGateway lati fi ayẹwo imurasilẹ ranṣẹ si gbogbo awọn olumulo.

A n kọ ibaramu fun Dota 2014

8) Ti ẹnikan ba kọ tabi ko gba ere naa laarin awọn iṣẹju 3, lẹhinna a ko da wọn pada si isinyi. A pada gbogbo eniyan miran si awọn ti isinyi ati ki o duro titi nibẹ ni o wa 10 eniyan lẹẹkansi. Ti gbogbo awọn oṣere ba ti gba ere naa, lẹhinna apakan ti o nifẹ bẹrẹ.

Ifiṣootọ olupin iṣeto ni

Awọn ere wa ti gbalejo lori VDS pẹlu olupin Windows 2012. Lati eyi a le fa ọpọlọpọ awọn ipinnu:

  1. Ko si docker lori rẹ, eyi ti o lu mi ni okan
  2. A fipamọ sori iyalo

Iṣẹ-ṣiṣe ni lati ṣiṣe ilana kan lori VDS lati VPS kan lori Lainos. Mo ti kowe kan ti o rọrun olupin ni Flask. Bẹẹni, Emi ko fẹran Python, ṣugbọn kini o le ṣe? O yara ati rọrun lati kọ olupin yii sori rẹ.

O ṣe awọn iṣẹ mẹta:

  1. Bibẹrẹ olupin pẹlu iṣeto ni - yiyan maapu kan, nọmba awọn oṣere lati bẹrẹ ere, ati ṣeto awọn afikun. Emi kii yoo kọ nipa awọn afikun ni bayi - iyẹn jẹ itan ti o yatọ pẹlu awọn liters ti kofi ni alẹ ti a dapọ pẹlu omije ati irun ya.
  2. Idaduro / tun olupin naa bẹrẹ ni ọran ti awọn asopọ ti ko ni aṣeyọri, eyiti a le mu pẹlu ọwọ nikan.

Ohun gbogbo ni o rọrun nibi, awọn apẹẹrẹ koodu ko paapaa yẹ. 100 ila akosile

Nitorinaa, nigbati awọn eniyan 10 pejọ ati gba ere naa, olupin naa ti ṣe ifilọlẹ ati pe gbogbo eniyan ni itara lati ṣere, ọna asopọ kan lati sopọ si ere naa ni a firanṣẹ ni awọn ifiranṣẹ aladani.

A n kọ ibaramu fun Dota 2014

Nipa tite lori ọna asopọ, ẹrọ orin sopọ si olupin ere, lẹhinna iyẹn ni. Lẹhin ~ 25 iṣẹju, awọn foju "yara" pẹlu awọn ẹrọ orin ti wa ni nso.

Mo gafara ni ilosiwaju fun aibalẹ ti nkan naa, Emi ko kọ nibi fun igba pipẹ, ati pe koodu pupọ wa lati ṣe afihan awọn apakan pataki. Noodles, ni kukuru.

Ti MO ba rii iwulo ninu koko-ọrọ naa, apakan keji yoo wa - yoo ni ijiya mi pẹlu awọn afikun fun srcds (Orisun igbẹhin olupin), ati, boya, eto igbelewọn ati mini-dotabuff, aaye kan pẹlu awọn iṣiro ere.

Diẹ ninu awọn ọna asopọ:

  1. Oju opo wẹẹbu wa (awọn iṣiro, igbimọ adari, oju-iwe ibalẹ kekere ati igbasilẹ alabara)
  2. Discord olupin

orisun: www.habr.com

Fi ọrọìwòye kun