Dota pro MMXIV matchmaking scribimus "

Omnis salve.

Hoc vere per consilium veni in quo guys didicerunt quomodo ad currere Dota 2 server versionis 2014 et proinde ludere in eo. Magnus sum ludi huius ventilabrum, et hanc unicam occasionem praeterire non potui ut me in infantiam immergerem.

Valde profunde columbo, et ita factum est ut Discordiam scriberem autocineticam quae omnium fere officiorum est quae in veteri versio ludi non valet, nempe conciliationis.
Ante omnia innovationes cum autocineto, lobby manually creatus est. X reactiones ad nuntium collegimus et manually ministrantem convenerunt, vel lobby locales hosted.

Dota pro MMXIV matchmaking scribimus "

Natura mea ut programmator tantum laborem manualem sustinere non potuit, et pernoctare pernoctavi simplicissimam versionem autocineti delineavi, quae automatice ministratorem cum X hominum erant.

Statim in nodejs scribere decrevi, quia non vere amo Python, et in hac rerum ambitu sentio commodius.

Haec prima experientia scribens automatum pro Discord, sed valde simplex evasit. Officialis npm moduli discordiae. commodam operam praebet ad operandum cum nuntiis, motus colligendis, etc.

Disclaimer: Omnia exempla "current" sunt, id est per aliquot iterationes scribendae nocturnos transierunt.

Fundamentum conciliationis est "queue" in quo histriones qui ludere volunt collocantur et removentur cum ludum invenire non volunt.

Hoc est quod essentia "ludii" similis est. Initio sicut in Discordia usoris fuit, sed consilia sunt ludos ex situ, sed prima prima.

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

Et hic est interface queue. Loco "histrionum" hic abstractio in specie "coetus" adhibetur. Nam unum nisl, congue in ipsum, ac cursus nisl, in accumsan nisl.

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
}

Certe ad commutandum contextum uti decrevi. Conveniens ad causas - super eventu "ludus pro X hominibus inventae", nuntium necessarium ad scaenicos in nuntiis privatis mittere potes, ac negotia fundamentalia logica exsequere - negotium ad reprimendam promptitudinem deducendum, lobby praeparet. for launch, and so on.

Nam IOC Utor InversifyJS. Iucundum experientiam habeo cum hac bibliotheca laborat. Ieiunium et facilis!

Plures queues in servo nostro habemus - 1x1, normal/ratit, et duos modos consuetudinis addimus. Ideo unum est RoomService quod inter usorem et inquisitionem lusus iacet.

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

(Codex noodles ad ideam de illis quae fiunt circiter sicut vultus)

Hic ego initialize queue pro singulis modis venationis impletae, et etiam auscultare mutationes in "coetibus" ut accommodare queues et aliquas pugnas vitare.

Ita, bene factum, fragmenta codicis interposui quae nihil ad rem pertinent, et nunc directe ad congruentiam accedamus.

Causam videamus:

1) Usor ludere vult.

2) Ut investigationem incipias, porta = Discordia utitur, id est, reactionem mittit nuntio:

Dota pro MMXIV matchmaking scribimus "

3) Haec porta ad RoomService accedit et dicit "User a discordia inire queue, modum: ludum sine ratione".

4) RoomService petitionem portae accipit et usorem (propressius, coetus usoris) in queue desideratam impellit.

5) Queue omni tempore satis sunt histriones ludere. Si fieri potest, eventum emitte:

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

6 Inputationem lusorum accipimus, virtualem "cubiculum" ab eis formant et, utique, eventum edunt:

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) Hactenus ad "summam" auctoritatem - classium pervenit Bot. In genere agit de nexu inter portas (quam ridiculam in Russian spectat) et negotia logica conciliationis tractat. Bot rei eventum audit et DiscordGateway iubet ut promptum reprehendo omnibus usoribus mittere.

Dota pro MMXIV matchmaking scribimus "

8) Si quis ludum intra 3 minutas reiecerit vel non recipiat, eos ad queue non reddemus. Omnes ad queue revertemur et expectamus donec iterum sunt 10 homines. Si omnes histriones ludum acceperunt, tunc incipit pars interesting.

Configuratione servo dedicated

Ludi nostri in VDS cum Fenestra servo 2012 hosted. Ex quo plures conclusiones colligere possumus:

  1. Non est in ea grex, qui me percutit in corde
  2. Serva in redditu

Negotium est processus in VDS ex VPS in Linux currere. Scripsi simplici servo in Flask. Ita, Pythone non placet, sed quid facere potes?Hoc velocius et facilius est hunc servom scribere.

3 munera exercet;

  1. Proficiscens cultor cum configuratione - chartam eligens, numerus lusorum ad ludum committitur, et copia plugins. Non de plugins nunc scribo - aliam fabulam cum liters capulus noctu mixtis lacrimis et crinibus laceratis.
  2. Reprimendo/reprimendo servo in casu necessitudinum infelicium, quas modo manually tractare possumus.

Omnia hic simplicia sunt, exempla etiam in codice haud apta sunt. C linea script

Itaque, cum X homines convenerunt et in ludum receperunt, cultor immissus est et omnes ad ludendum festinaverunt, nexus ad lusum cum nuntiis privatis missus est.

Dota pro MMXIV matchmaking scribimus "

Strepitando in nexu, lusor cum servo lusori nectit, et tunc est. Post ~25 minuta, virtualis "locus" cum histriones purgatur.

Paenitemus in antecessum propter inconstantiam articuli, hic non diu scripsi, et nimis est signum ad sectiones momenti momentis illustrandas. Noodles, in short.

Si rem in themate videro, pars altera erit - continebit tormentum meum cum plugins pro srcds (Source servo dedicato), et fortasse, systema rating et mini-dotabuff, situm cum ludo mutant.

Quidam nexus:

  1. Nostra pagina (statistics, leaderboard, parva pagina et client download)
  2. Discordia servo

Source: www.habr.com