Muna rubuta wasan daidaitawa don Dota 2014

Sannu kowa da kowa.

A wannan bazara na ci karo da wani aiki wanda a cikinsa mutanen suka koyi yadda ake gudanar da sigar uwar garken Dota 2 2014 kuma, a kan haka, kunna shi. Ni babban mai sha'awar wannan wasan ne, kuma ba zan iya ba da wannan dama ta musamman ba don nutsad da kaina cikin kuruciyata.

Na yi kurciya sosai, kuma hakan ya faru da na rubuta bot ɗin Discord wanda ke da alhakin kusan duk ayyukan da ba a tallafawa a cikin tsohuwar sigar wasan, wato daidaitawa.
Kafin duk sabbin abubuwa tare da bot, falon an ƙirƙira shi da hannu. Mun tattara martani guda 10 ga saƙo kuma mun haɗa uwar garken da hannu, ko kuma mun karɓi masaukin harabar gida.

Muna rubuta wasan daidaitawa don Dota 2014

Yanayina a matsayina na mai shirye-shirye ba zai iya jure wa aikin hannu da yawa ba, kuma cikin dare na zana sigar bot ɗin mafi sauƙi, wanda ya ɗaga uwar garken kai tsaye lokacin da akwai mutane 10.

Nan da nan na yanke shawarar rubuta a cikin nodejs, saboda ba na son Python sosai, kuma ina jin daɗi a wannan yanayin.

Wannan shine gwanina na farko na rubuta bot don Discord, amma ya zama mai sauƙi. The official npm module discord.js yana ba da ingantacciyar hanyar sadarwa don aiki tare da saƙonni, tattara martani, da sauransu.

Disclaimer: Duk misalan lambobin “na yanzu” ne, ma’ana sun yi ta maimaita rubutu da yawa cikin dare.

Tushen daidaitawa shine "layin layi" wanda ake sanya 'yan wasan da suke son yin wasa a ciki kuma a cire su lokacin da ba sa so ko samun wasa.

Wannan shine abin da ainihin "dan wasa" yayi kama. Da farko id ɗin mai amfani ne kawai a cikin Discord, amma akwai shirye-shiryen ƙaddamarwa / nemo wasanni daga rukunin yanar gizon, amma abubuwa na farko.

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

Kuma a nan ga jerin gwano. Anan, maimakon "'yan wasa," ana amfani da abstraction a cikin nau'i na "ƙungiyar". Ga ɗan wasa ɗaya, ƙungiyar ta ƙunshi kansa, kuma ga ƴan wasa a cikin rukuni, bi da bi, na duk ƴan wasan da ke cikin rukuni.

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
}

Na yanke shawarar yin amfani da abubuwan da suka faru don musayar mahallin. Ya dace da shari'o'i - a kan taron "an sami wani wasa don mutane 10", za ku iya aika saƙon da ya dace ga 'yan wasa a cikin saƙon sirri, da aiwatar da dabarun kasuwanci na asali - ƙaddamar da aiki don bincika shirye-shiryen, shirya harabar. don ƙaddamarwa, da sauransu.

Don IOC Ina amfani da InversifyJS. Ina jin daɗin aiki tare da wannan ɗakin karatu. Mai sauri da sauƙi!

Muna da layukan layi da yawa akan sabar mu - mun ƙara 1x1, al'ada/ ƙididdigewa, da wasu nau'ikan al'ada. Don haka, akwai Sabis ɗin Room guda ɗaya wanda ke tsakanin mai amfani da binciken wasan.

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 don ba da ra'ayi game da yadda tsarin ke yi kama da shi)

Anan na fara jerin gwano don kowane tsarin wasan da aka aiwatar, sannan kuma sauraron canje-canje a cikin "ƙungiyoyi" don daidaita layukan da kuma guje wa wasu rikice-rikice.

Don haka, da kyau, na saka ɓangarorin lambobin da ba su da alaƙa da batun, kuma yanzu bari mu ci gaba kai tsaye don daidaitawa.

Mu yi la’akari da lamarin:

1) Mai amfani yana son yin wasa.

2) Domin fara binciken, yana amfani da Gateway=Discord, wato yana sanya martani ga sakon:

Muna rubuta wasan daidaitawa don Dota 2014

3) Wannan ƙofa tana zuwa RoomService kuma ta ce "Mai amfani da rashin jituwa yana son shigar da layi, yanayin: wasan da ba a ƙididdigewa ba."

4) RoomService yana karɓar buƙatar ƙofa kuma yana tura mai amfani (mafi daidai, ƙungiyar mai amfani) cikin layin da ake so.

5) Ana duba jerin gwano a duk lokacin da aka samu isassun 'yan wasa da za su taka. Idan zai yiwu, fitar da wani taron:

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

6) RoomService a fili yana jin daɗin kowane jerin gwano a cikin tsammanin wannan taron. Muna karɓar jerin ƴan wasa azaman shigarwa, samar da “daki” mai kama-da-wane daga gare su, kuma, ba shakka, muna fitar da wani taron:

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) Don haka mun kai ga "mafi girma" hukuma - ajin bot. Gabaɗaya, yana hulɗa da haɗin kai tsakanin ƙofofin ƙofofin (Ba zan iya fahimtar yadda abin ban dariya yake a cikin Rashanci ba) da dabarun kasuwanci na daidaitawa. Bot din yana jin taron kuma ya ba da umarnin DiscordGateway don aika rajistan shirye-shiryen ga duk masu amfani.

Muna rubuta wasan daidaitawa don Dota 2014

8) Idan wani ya ƙi ko kuma bai karɓi wasan a cikin mintuna 3 ba, to ba mu mayar da su cikin jerin gwano. Muna mayar da kowa zuwa jerin gwano da jira har sai an sake samun mutum 10. Idan duk 'yan wasan sun karɓi wasan, to, ɓangaren mai ban sha'awa ya fara.

Tsarin uwar garken sadaukarwa

Ana shirya wasanninmu akan VDS tare da uwar garken Windows 2012. Daga wannan zamu iya zana sakamako da yawa:

  1. Babu docker a kai, wanda ya bugi ni a cikin zuciya
  2. Muna ajiyewa akan haya

Ayyukan shine gudanar da tsari akan VDS daga VPS akan Linux. Na rubuta sabar mai sauƙi a cikin Flask. Ee, ba na son Python, amma me za ku iya yi? Yana da sauri da sauƙi don rubuta wannan sabar a kai.

Yana yin ayyuka 3:

  1. Fara uwar garken tare da daidaitawa - zaɓi taswira, adadin 'yan wasan da za su fara wasan, da saitin plugins. Ba zan rubuta game da plugins yanzu ba - wannan labari ne daban tare da lita na kofi da dare gauraye da hawaye da yayyage gashi.
  2. Tsayawa/sake kunna uwar garken idan akwai haɗin kai da ba su yi nasara ba, waɗanda kawai za mu iya sarrafa su da hannu.

Komai yana da sauƙi a nan, misalan lambobin ba ma dace ba. Rubutun layi 100

Don haka, lokacin da mutane 10 suka taru suka karɓi wasan, an ƙaddamar da uwar garken kuma kowa yana sha'awar yin wasa, an aika hanyar haɗi zuwa wasan a cikin saƙon sirri.

Muna rubuta wasan daidaitawa don Dota 2014

Ta danna hanyar haɗin yanar gizon, mai kunnawa yana haɗi zuwa uwar garken wasan, sannan shi ke nan. Bayan ~ 25 mintuna, "ɗakin" mai kama da ƴan wasa an share.

Ina neman afuwa a gaba don rashin jin daɗi na labarin, ban daɗe da rubutawa a nan ba, kuma akwai lambar da yawa don haskaka mahimman sassan. Noodles, a takaice.

Idan na ga sha'awar batun, za a sami kashi na biyu - zai ƙunshi azabata tare da plugins don srcds (Source sadaukar uwar garken), kuma, mai yiwuwa, tsarin ƙididdigewa da mini-dotabuff, wani shafi tare da kididdigar wasanni.

Wasu hanyoyin haɗin gwiwa:

  1. Gidan yanar gizon mu (ƙididdiga, allon jagora, ƙaramin shafin saukowa da zazzage abokin ciniki)
  2. Discord uwar garken

source: www.habr.com

Add a comment