Tikulemba zofananira za Dota 2014

Moni nonse.

M'chakachi ndinapeza pulojekiti yomwe anyamatawo adaphunzira kuyendetsa mtundu wa seva ya Dota 2 2014 ndipo, motero, kusewera pa izo. Ndine wokonda kwambiri masewerawa, ndipo sindikanatha kusiya mwayi wapaderawu woti ndidziloŵetse muubwana wanga.

Ndimachita nkhunda mozama kwambiri, ndipo zidachitika kuti ndidalemba Discord bot yomwe imayang'anira pafupifupi magwiridwe antchito onse omwe samathandizidwa mumtundu wakale wamasewera, womwe ndi kupanga machesi.
Zisanachitike zonse zatsopano ndi bot, malo olandirira alendo adapangidwa pamanja. Tinasonkhanitsa mayankho 10 ku uthenga ndikusonkhanitsa seva, kapena kukhala ndi malo olandirira alendo.

Tikulemba zofananira za Dota 2014

Chikhalidwe changa monga wolemba mapulogalamu sichikanatha kupirira ntchito zambiri zamanja, ndipo usiku wonse ndinajambula mtundu wosavuta kwambiri wa bot, womwe unakweza seva pamene panali anthu 10.

Nthawi yomweyo ndinaganiza zolembera mu nodejs, chifukwa sindimakonda Python, ndipo ndimakhala womasuka kwambiri m'deralo.

Ichi chinali chondichitikira choyamba ndikulemba bot ya Discord, koma zidakhala zosavuta. Npm module discord.js imapereka mawonekedwe osavuta ogwirira ntchito ndi mauthenga, kusonkhanitsa mayankho, ndi zina.

Chodzikanira: Zitsanzo zonse za ma code ndi "zakali pano", kutanthauza kuti adutsa kangapo polembanso usiku.

Maziko a matchmaking ndi "mzere" momwe osewera omwe akufuna kusewera amayikidwa ndikuchotsedwa pamene sakufuna kapena kupeza masewera.

Izi ndi zomwe tanthauzo la "player" limawonekera. Poyamba inali id ​​yogwiritsa ntchito ku Discord, koma pali mapulani oyambitsa / kusaka masewera kuchokera patsamba, koma zinthu zoyamba poyamba.

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

Ndipo apa pali mawonekedwe amzere. Apa, m'malo mwa "osewera," kuchotsedwa kwa "gulu" kumagwiritsidwa ntchito. Kwa wosewera m'modzi, gululi limakhala la iye yekha, komanso kwa osewera pagulu, motsatana, mwa onse omwe ali mgululi.

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
}

Ndinaganiza zogwiritsa ntchito zochitika kuti ndisinthe zochitika. Zinali zoyenera pamilandu - pamwambowu "masewera a anthu 10 adapezeka", mutha kutumiza uthenga wofunikira kwa osewera m'mawu achinsinsi, ndikuchita zoyambira zamabizinesi - yambitsani ntchito yoyang'ana kukonzekera, kukonzekera malo olandirira alendo. kwa kukhazikitsa, ndi zina zotero.

Kwa IOC ndimagwiritsa ntchito InversifyJS. Ndimasangalala ndikugwira ntchito ndi laibulale iyi. Mofulumira komanso zosavuta!

Tili ndi mizere ingapo pa seva yathu - tawonjezera 1x1, yachizolowezi/yovotera, ndi mitundu ingapo yachizolowezi. Chifukwa chake, pali singleton RoomService yomwe ili pakati pa wosuta ndi kusaka kwamasewera.

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 Zakudyazi kuti upereke lingaliro la momwe njirazo zimawonekera)

Apa ndikuyambitsa mzere wamtundu uliwonse wamasewera omwe akhazikitsidwa, ndikumvetseranso kusintha kwa "magulu" kuti musinthe mizere ndikupewa mikangano.

Chifukwa chake, mwachita bwino, ndidayikapo ma code omwe alibe chochita ndi mutuwo, ndipo tsopano tiyeni tipite patsogolo pakupanga machesi.

Tiyeni tilingalire mlanduwu:

1) Wogwiritsa ntchito akufuna kusewera.

2) Kuti ayambe kufufuza, amagwiritsa ntchito Gateway=Discord, ndiye kuti, amayankha uthengawo:

Tikulemba zofananira za Dota 2014

3) Chipata ichi chimapita ku RoomService ndikuti "Wogwiritsa ntchito ku discord akufuna kulowa pamzere, mode: masewera osawerengeka."

4) RoomService imavomereza pempho lachipata ndikukankhira wogwiritsa ntchito (molondola, gulu la ogwiritsa ntchito) pamzere womwe mukufuna.

5) Mzere umayang'ana nthawi iliyonse pali osewera okwanira kuti azisewera. Ngati ndi kotheka, tulutsani chochitika:

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

6) RoomService mwachiwonekere akumvetsera mosangalala pamzere uliwonse poyembekezera mwachidwi chochitika ichi. Timalandila mndandanda wa osewera ngati zolowetsa, kupanga "chipinda" kuchokera kwa iwo, ndipo, zowona, kutulutsa chochitika:

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) Kotero ife tinafika ku ulamuliro "wapamwamba" - kalasi Bot. Kawirikawiri, amakhudzana ndi kugwirizana pakati pa zipata (sindingathe kumvetsa momwe zimakhalira zoseketsa mu Chirasha) ndi malingaliro amalonda a matchmaking. Bot imamva zomwe zinachitika ndikulamula DiscordGateway kutumiza cheke kwa ogwiritsa ntchito onse.

Tikulemba zofananira za Dota 2014

8) Ngati wina akana kapena sakuvomereza masewerawo mkati mwa mphindi 3, ndiye kuti SITIWAbwezera pamzere. Timabwezera ena onse pamzere ndikudikirira mpaka anthu 10 abwerenso. Ngati osewera onse avomereza masewerawo, ndiye kuti gawo losangalatsa limayamba.

Kukonzekera kwa seva yodzipatulira

Masewera athu amachitidwa pa VDS ndi Windows seva 2012. Kuchokera apa titha kupeza mfundo zingapo:

  1. Palibe docker pamenepo, zomwe zidandikhudza mtima
  2. Timasunga pa renti

Ntchitoyo ndikuyendetsa njira pa VDS kuchokera ku VPS pa Linux. Ndinalemba seva yosavuta mu Flask. Inde, sindimakonda Python, koma mungachite chiyani?Ndizofulumira komanso zosavuta kulemba seva iyi pa izo.

Imagwira ntchito zitatu:

  1. Kuyambitsa seva ndi kasinthidwe - kusankha mapu, kuchuluka kwa osewera kuti ayambitse masewerawo, ndi mapulagini ambiri. Sindilemba za mapulagini tsopano - ndiyo nkhani yosiyana ndi malita a khofi usiku wosakanikirana ndi misozi ndi tsitsi long'ambika.
  2. Kuyimitsa/kuyambitsanso seva ngati kulumikizidwa kosapambana, komwe titha kungogwira pamanja.

Chilichonse ndi chosavuta apa, zitsanzo zamakhodi sizoyenera. 100 mzere script

Kotero, pamene anthu a 10 adasonkhana pamodzi ndikuvomereza masewerawo, seva inayambika ndipo aliyense anali wofunitsitsa kusewera, chiyanjano chogwirizanitsa ndi masewerawo chinatumizidwa mu mauthenga apadera.

Tikulemba zofananira za Dota 2014

Mwa kuwonekera pa ulalo, wosewera mpira amalumikizana ndi seva yamasewera, ndiye ndizomwezo. Pambuyo pa mphindi pafupifupi 25, "chipinda" chokhala ndi osewera chimachotsedwa.

Ndikupepesa pasadakhale chifukwa chazovuta za nkhaniyi, sindinalembe pano kwa nthawi yayitali, ndipo pali code yochulukirapo yowunikira magawo ofunikira. Zakudyazi, mwachidule.

Ngati ndiwona chidwi pamutuwu, padzakhala gawo lachiwiri - lidzakhala ndi kuzunzika kwanga ndi mapulagini a srcds (Source odzipereka seva), ndipo, mwinamwake, dongosolo la ndondomeko ndi mini-dotabuff, malo omwe ali ndi ziwerengero zamasewera.

Maulalo ena:

  1. Webusaiti yathu (ziwerengero, boardboard, tsamba laling'ono lofikira ndikutsitsa kasitomala)
  2. Discord seva

Source: www.habr.com

Kuwonjezera ndemanga