Мо барои Dota 2014 хостгорӣ менависем

Ҳама хонед

Дар ин баҳор ман бо лоиҳае дучор омадам, ки дар он бачаҳо тарзи идора кардани версияи сервери Dota 2 2014 ва мувофиқан дар он бозӣ карданро омӯхтанд. Ман як мухлиси бузурги ин бозӣ ҳастам ва ман наметавонистам ин имкони беназирро барои ғарқ шудан дар кӯдакии худ аз даст диҳам.

Ман хеле амиқ кабӯтар шудам ва чунин рӯй дод, ки ман як боти Discord навиштам, ки барои қариб ҳама функсияҳое, ки дар версияи кӯҳнаи бозӣ дастгирӣ намешаванд, яъне мувофиқат кардан масъул аст.
Пеш аз ҳама навовариҳо бо бот, лобби дастӣ сохта шуда буд. Мо 10 вокунишро ба паём ҷамъоварӣ кардем ва ба таври дастӣ сервер ҷамъ кардем ё як лобби маҳаллӣ доштем.

Мо барои Dota 2014 хостгорӣ менависем

Табиати ман ҳамчун барномасоз тоб оварда наметавонист, ки ин қадар кори дастӣ тобовар бошад ва ман дар як шаб версияи оддитарини ботро кашидам, ки ҳангоми 10 нафар серверро ба таври худкор боло мекард.

Ман фавран тасмим гирифтам, ки дар nodejs нависам, зеро ман аслан Python-ро дӯст намедорам ва дар ин муҳит худро бароҳат ҳис мекунам.

Ин аввалин таҷрибаи навиштани бот барои Discord аст, аммо маълум шуд, ки ин хеле содда аст. Модули расмии npm discord.js интерфейси мувофиқро барои кор бо паёмҳо, ҷамъоварии аксуламалҳо ва ғайра таъмин мекунад.

Радди масъулият: Ҳама мисолҳои рамзӣ "ҷорӣ" мебошанд, ки маънои онро дорад, ки онҳо шабона якчанд такрорнависиро аз сар гузаронидаанд.

Асоси мусоҳиба як "навбат" аст, ки дар он бозингароне, ки мехоҳанд бозӣ кунанд, дар он ҷо ҷойгир ва хориҷ карда мешаванд, вақте ки онҳо намехоҳанд ё бозӣ пайдо кунанд.

Мохияти «бозингар» хамин аст. Дар аввал он танҳо як ID корбар дар Discord буд, аммо нақшаҳо барои оғоз/ҷустуҷӯи бозиҳо аз сайт вуҷуд доранд, аммо дар навбати аввал.

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

Ва ин ҷо интерфейси навбат аст. Дар ин ҷо ба ҷои “бозингарон” абстраксия дар шакли “гурӯҳ” истифода мешавад. Барои як бозигар, гурӯҳ аз худи худ ва барои бозигарони як гурӯҳ мутаносибан аз ҳамаи бозигарони гурӯҳ иборат аст.

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
}

Ман тасмим гирифтам, ки воқеаҳоро барои мубодилаи контекст истифода барам. Он барои ҳолатҳо мувофиқ буд - пас аз ҳодисаи "бозӣ барои 10 нафар пайдо шуд", шумо метавонед ба бозигарон дар паёмҳои хусусӣ паёми заруриро фиристед ва мантиқи асосии тиҷоратиро иҷро кунед - супоришро барои санҷиши омодагӣ, омода кардани лобби оғоз кунед. барои ба кор андохтан ва гайра.

Барои IOC ман InversifyJS -ро истифода мебарам. Ман аз кор бо ин китобхона таҷрибаи гуворо дорам. Тез ва осон!

Мо дар сервери худ якчанд навбат дорем - мо 1x1, муқаррарӣ/баҳодиҳӣ ва якчанд намуди фармоиширо илова кардем. Аз ин рӯ, як RoomService singleton вуҷуд дорад, ки байни корбар ва ҷустуҷӯи бозӣ ҷойгир аст.

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

(Ушуро рамзгузорӣ кунед, то тасаввур кунед, ки равандҳо тақрибан чӣ гунаанд)

Дар ин ҷо ман навбатро барои ҳар як шеваи бозии иҷрошуда оғоз мекунам ва инчунин тағиротро дар "гурӯҳҳо" мешунавам, то навбатҳоро танзим кунам ва баъзе ихтилофҳоро пешгирӣ кунам.

Ҳамин тавр, хуб, ман қисмҳои кодеро ворид кардам, ки ба мавзӯъ ҳеҷ иртиботе надоранд ва ҳоло биёед мустақиман ба хостгорӣ гузарем.

Биёед парвандаро баррасӣ кунем:

1) Истифодабаранда мехоҳад бозӣ кунад.

2) Барои оғоз кардани ҷустуҷӯ, ӯ Gateway=Discord-ро истифода мебарад, яъне ба паём вокуниш нишон медиҳад:

Мо барои Dota 2014 хостгорӣ менависем

3) Ин дарвоза ба RoomService меравад ва мегӯяд: "Истифодабарандаи ихтилоф мехоҳад ба навбат ворид шавад, режим: бозии бебаҳо."

4) RoomService дархости шлюзро қабул мекунад ва корбарро (аниқтараш, гурӯҳи корбаронро) ба навбати дилхоҳ тела медиҳад.

5) Навбат ҳар дафъае, ки бозигарони кофӣ барои бозӣ вуҷуд доранд, тафтиш карда мешавад. Агар имконпазир бошад, ҳодисаро пахш кунед:

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

6) RoomService бешубҳа ҳар як навбатро бо интизории изтироби ин ҳодиса гӯш мекунад. Мо рӯйхати бозигаронро ҳамчун вуруд мегирем, аз онҳо "ҳуҷраи" маҷозӣ ташкил мекунем ва албатта як чорабинӣ мебарорем:

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) Ҳамин тавр, мо ба "баландтарин" қудрат расидем - синф Bot. Умуман, вай бо робитаи байни шлюзҳо (ман намефаҳмам, ки он ба забони русӣ чӣ қадар хандовар аст) ва мантиқи тиҷоратии хостгорӣ сарукор дорад. Бот ҳодисаро мешунавад ва ба DiscordGateway фармон медиҳад, ки ба ҳамаи корбарон санҷиши омодагӣ фиристад.

Мо барои Dota 2014 хостгорӣ менависем

8) Агар касе дар давоми 3 дақиқа бозиро рад кунад ё қабул накунад, мо онҳоро ба навбат бармегардонем. Мо ҳамаро ба навбат бармегардонем ва интизор мешавем, ки боз 10 нафар мешаванд. Агар ҳамаи бозигарон бозӣ қабул карда бошанд, пас қисми ҷолиб оғоз меёбад.

Конфигуратсияи сервери махсус

Бозиҳои мо дар VDS бо сервери Windows 2012 ҷойгир шудаанд. Аз ин мо метавонем чанд хулоса барем:

  1. Дар он докер нест, ки ба дилам зад
  2. Мо барои иҷора сарфа мекунем

Вазифа аз он иборат аст, ки раванд дар VDS аз VPS дар Linux иҷро карда шавад. Ман сервери оддӣ дар Flask навиштам. Бале, ба ман Python маъқул нест, аммо шумо чӣ кор карда метавонед?Дар он навиштани ин сервер тезтар ва осонтар аст.

Он 3 вазифаро иҷро мекунад:

  1. Оғози сервер бо конфигуратсия - интихоби харита, шумораи бозигарон барои оғози бозӣ ва маҷмӯи плагинҳо. Ман ҳоло дар бораи плагинҳо наменависам - ин як ҳикояи дигар бо литрҳои қаҳва дар шаб бо ашк ва мӯи дарида аст.
  2. Қатъи/аз нав ба кор андохтани сервер дар сурати пайвастҳои номуваффақ, ки мо онро танҳо дастӣ ҳал карда метавонем.

Дар ин ҷо ҳама чиз оддӣ аст, мисолҳои рамзӣ ҳатто мувофиқ нестанд. Скрипти 100 сатр

Ҳамин тавр, вақте ки 10 нафар ҷамъ омада, бозиро қабул карданд, сервер ба кор даромад ва ҳама хоҳиши бозӣ карданро доштанд, дар паёмҳои хусусӣ пайванде барои пайвастшавӣ ба бозӣ фиристода шуд.

Мо барои Dota 2014 хостгорӣ менависем

Бо клик кардани истинод, плеер ба сервери бозӣ пайваст мешавад ва он гоҳ тамом шуд. Пас аз ~ 25 дақиқа, "ҳуҷраи" виртуалӣ бо бозигарон тоза карда мешавад.

Ман барои ногувор будани мақола пешакӣ узр мепурсам, ман муддати тӯлонӣ дар ин ҷо нанавиштам ва барои таъкид кардани бахшҳои муҳим рамзи аз ҳад зиёд вуҷуд дорад. Хулоса угро.

Агар ман таваҷҷӯҳ ба мавзӯъро бубинам, қисми дуюм хоҳад буд - он азоби маро бо плагинҳо барои srcds (Сервери бахшидашуда) ва эҳтимолан системаи рейтингӣ ва мини-дотабуфф, сайти омори бозӣ дар бар мегирад.

Баъзе истинодҳо:

  1. Вебсайти мо (омор, ҷадвали пешсаф, саҳифаи кушодашавӣ ва зеркашии муштарӣ)
  2. Сервери Discord

Манбаъ: will.com

Илова Эзоҳ