@jsprismarine/math 0.14.2 → 0.15.0-unstable-20261024002035

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,69 @@
1
1
  # @jsprismarine/color-parser
2
2
 
3
+ ## 0.15.0-unstable-20261024002035
4
+
5
+ ### Patch Changes
6
+
7
+ - [#2577](https://github.com/JSPrismarine/JSPrismarine/pull/2577) [`6b60a88`](https://github.com/JSPrismarine/JSPrismarine/commit/6b60a88e40ad9751ea177f4273779869486de7e0) Thanks [@filiphsps](https://github.com/filiphsps)! - Move JSBinaryUtils into the monorepo as `@jsprismarine/binaryutils`.
8
+
9
+ It was developed in its own repository and consumed here as a pinned npm dependency, which meant a
10
+ change to the binary stream needed a release there before it could be used here. It now lives in
11
+ `packages/binaryutils` and every consumer resolves it through the workspace, so it builds, typechecks
12
+ and tests together with the packages that use it.
13
+
14
+ The published name changes: `@jsprismarine/jsbinaryutils` is deprecated on npm and its last release
15
+ re-exports this package, so existing installs keep working. The API is unchanged.
16
+
17
+ Two things came along with the jump from the pinned 5.5.3 to current: `write()` accepted a
18
+ `Uint8Array` in its signature but called `Buffer#copy` on it, so anything not already a `Buffer`
19
+ threw at runtime — it now uses `set`. And the single internal `buffer` field is split into a read and
20
+ a write buffer, so code reaching past the public API to assign `.buffer` no longer populates the read
21
+ side; use `setReadBuffer()`.
22
+
23
+ `@jsprismarine/protocol` also gained the dependency in its manifest — it imported the package while
24
+ relying on it being hoisted into the root `node_modules`.
25
+
26
+ - [#2577](https://github.com/JSPrismarine/JSPrismarine/pull/2577) [`fae2f4f`](https://github.com/JSPrismarine/JSPrismarine/commit/fae2f4f9952bd5ede5c0bdceaca9bffb11195029) Thanks [@filiphsps](https://github.com/filiphsps)! - Send positional packets only to the players near them, and stop sending several of them to the entire server.
27
+
28
+ Nothing filtered by distance. Two players ten thousand blocks apart still received each other's movement, each other's block updates and each other's sounds, and each other's arm swings. The code knew: `World.sendWorldEvent` and `World.sendActorEvent` both carried a `// TODO: Limit distance`, the second of them reading "as with every other broadcast here".
29
+
30
+ Several of those broadcasts were worse than world-wide. Block placement, the animate handler, the disconnect despawn loop, the pairwise spawn at join and `Player.sendSettings` all went through `SessionManager.getAllPlayers()`, so they reached every player on the server regardless of which world they were in. Latent while only one world is loaded, and a wall in front of any multi-world work.
31
+
32
+ Recipients are now chosen in one place. `World.getViewers(position, options)` answers "who should be told about this", and `World.broadcast` and `World.broadcastAround` are the two ways to reach them; `Server.broadcastPacket` stays as the genuinely global channel for the player list, the command tree and shutdown. Chat, the time of day and the command tree are unchanged.
33
+
34
+ The test is done in chunk space against the recipient's own negotiated view distance, not against a fixed radius and not against the set of chunks the server believes it has sent. That last option is nominally the most accurate and is the wrong trade: `loadedChunks` is only marked once a batch has finished compressing and is never marked if that compression fails, so building entity visibility on it makes a compression failure show up as permanently invisible mobs. Being slightly too generous costs a packet the client discards on its own; being too stingy costs an entity that is never drawn. The chunk test is circular rather than square because `needNewChunks` loads terrain on `dx² + dz² > viewDistance²` — what a client holds is a disc, so a square test would send updates for four corners it has no ground for. Both cost the same arithmetic.
35
+
36
+ Entity visibility follows vanilla in being per type rather than one radius for everything. `Entity.getTrackingRange` and `getTrackingInterval` default to 8 chunks and 3 ticks; players override to 32 chunks — past any view distance, so the viewer's own radius decides — and dropped items to 6 chunks and 20 ticks. Items are the reason this matters: they are the most numerous entity in any world and the least worth seeing at a distance, and one mob farm at the generic radius streams thousands of them to everybody nearby.
37
+
38
+ Each session now tracks which entities its client actually holds, reconciled when the player crosses a chunk boundary and every few ticks otherwise, with hysteresis between the radius at which an entity appears and the one at which it goes away — with a single radius a player standing on the boundary produces an `AddActor` and a `RemoveActor` for everything out there on alternating passes. Entities are recorded as tracked only after their spawn has reached the wire, so a failed spawn is retried rather than being remembered as delivered and never sent again. Movement is gated on that tracked set rather than on distance: a `MoveActorAbsolutePacket` for a runtime id a client was never given is discarded at the other end anyway, which makes tracking both the correct gate and a set lookup instead of arithmetic on the hottest path in the server.
39
+
40
+ `proximity-broadcast: false` turns the filtering off. It restores world-wide delivery, not the server-wide fan-out, which was a bug rather than a behaviour. `entity-tracking-hysteresis` and `entity-tracking-interval` tune the rest.
41
+
42
+ Three bugs came out of the audit that had nothing to do with distance:
43
+
44
+ `Player.sendSettings` sent one player's `UpdateAdventureSettingsPacket` to every other client. That packet has no target actor field at all — it describes the client receiving it — so a single spectator set `worldImmutable`, `noAttackingPlayers` and `noAttackingMobs` on everybody else on the server. `PlayerSession.sendSpawn` had the same defect the other way round, pushing the *viewer's* settings onto the player being spawned on every spawn. Adventure settings now go to their own client only; `UpdateAbilitiesPacket`, which does carry `targetActorUniqueId`, still reaches everyone who can see the player.
45
+
46
+ The chat listener was never unregistered. It was registered with `this.chatHandler.bind(this)` and removed by passing the naked method, which is a different function object, so every disconnected player stayed subscribed to chat for the life of the process.
47
+
48
+ `CoordinateUtils.fromBlockToChunk` was `v >> 4`, and `>>` converts through `ToInt32`, which truncates towards zero. Entity positions are floats, so anything standing between -1 and 0 was placed in chunk 0 rather than chunk -1.
49
+
50
+ Performance, alongside the reduction in recipients:
51
+
52
+ Broadcasts compress once. `Server.broadcastPacket` was a serial `await` in a loop that built a fresh `BatchPacket` per recipient, so one `UpdateBlockPacket` going to twenty players was twenty runs of zlib over identical bytes, each waiting on the one before it. `MinecraftSession.sendSharedBatch` frames bytes somebody else encoded, through the same ordering chain so it cannot overtake a chunk batch still compressing.
53
+
54
+ `needNewChunks` no longer runs every tick. It rebuilt a heap of a few hundred candidates twenty times a second per player, for a player who had not moved a block; it now runs when the player changes chunk, which is the same signal that drives entity visibility.
55
+
56
+ A tick's movement is deduplicated per entity. `Entity.setX`, `setY` and `setZ` each announce a move of their own, so a single diagonal step queued three identical packets naming the same destination.
57
+
58
+ `SetTimePacket` goes out once a second instead of twenty times a second. The client runs its own day cycle in between, which is why the packet is in the default `log-excluded-packets` in the first place.
59
+
60
+ Dead code removed: `Player.chunkSendQueue`, a `Set<Chunk>` never read or written that shadowed the real queue on `PlayerSession` by name; `PlayerSession.sendChunk`, which had no callers and was superseded by `flushChunkBatch`; and `DataPacket.getAllowBatching`, which read a field nothing ever set. `PlayerSession.send` now returns its send instead of dropping the promise, so awaiting a broadcast means something and framing errors are no longer swallowed. `PlayerSession.broadcastMove` is renamed `sendMove`, since it sends to one session and the fan-out of that name lives on `World`. `SessionManager.getAllPlayers` now filters on `isOnline()` as `World.getPlayers` already did, so a connection still in the login handshake is no longer among the recipients of every broadcast.
61
+
62
+ `Vector3` gains `distanceTo` and `distanceSquaredTo`. There were five hand-rolled copies of that arithmetic across the server using three different metrics.
63
+ - Updated dependencies [[`6b60a88`](https://github.com/JSPrismarine/JSPrismarine/commit/6b60a88e40ad9751ea177f4273779869486de7e0)]:
64
+ - @jsprismarine/binaryutils@0.15.0-unstable-20261024002035
65
+ - @jsprismarine/color-parser@0.15.0-unstable-20261024002035
66
+
3
67
  ## 0.14.2
4
68
 
5
69
  ### Patch Changes
@@ -38,26 +38,28 @@ var Vector2 = class Vector2 {
38
38
  return new Vector2(x, z);
39
39
  }
40
40
  /**
41
- * Set the X coordinate.
41
+ * Returns a copy with a different X coordinate.
42
42
  * @param {number} x - The X coordinate.
43
+ * @returns {Vector2} A new vector; this one is left alone.
43
44
  * @example
44
45
  * ```typescript
45
- * await entity.setX(10);
46
+ * const moved = vector.withX(10);
46
47
  * ```
47
48
  */
48
- setX(x) {
49
- this.x = x;
49
+ withX(x) {
50
+ return new Vector2(x, this.z);
50
51
  }
51
52
  /**
52
- * Set the Z coordinate.
53
+ * Returns a copy with a different Z coordinate.
53
54
  * @param {number} z - The Z coordinate.
55
+ * @returns {Vector2} A new vector; this one is left alone.
54
56
  * @example
55
57
  * ```typescript
56
- * await entity.setZ(10);
58
+ * const moved = vector.withZ(10);
57
59
  * ```
58
60
  */
59
- setZ(z) {
60
- this.z = z;
61
+ withZ(z) {
62
+ return new Vector2(this.x, z);
61
63
  }
62
64
  /**
63
65
  * Get the x coordinate.
@@ -80,15 +82,20 @@ var Vector2 = class Vector2 {
80
82
  return new Vector2(Math.trunc(this.x), Math.trunc(this.z));
81
83
  }
82
84
  /**
83
- * Compare an instance of `Vector3` with another.
84
- * @param {Vector2} vector - The `Vector3` to compare to.
85
+ * Compare an instance of `Vector2` with another.
86
+ *
87
+ * Compares coordinates and nothing else. The previous implementation compared
88
+ * `JSON.stringify` of both sides, which dragged in whatever fields a subclass had
89
+ * added - and for a subclass holding a reference back into the object graph, such as
90
+ * a position carrying its world, serialising it threw on the circular structure.
91
+ * @param {Vector2} vector - The `Vector2` to compare to.
85
92
  * @returns {boolean} `true` if they're equal otherwise `false`.
86
93
  */
87
94
  equals(vector) {
88
- return JSON.stringify(this) === JSON.stringify(vector);
95
+ return this.x === vector.x && this.z === vector.z;
89
96
  }
90
97
  };
91
98
  //#endregion
92
99
  exports.Vector2 = Vector2;
93
100
 
94
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmVjdG9yMi5janMuY2pzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uL3NyYy9WZWN0b3IyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogMkQgVmVjdG9yLlxuICovXG5leHBvcnQgY2xhc3MgVmVjdG9yMiB7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIFZlY3RvcjIgd2l0aCAwIG9uIGFsbCBheGlzLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IFpFUk8oKTogVmVjdG9yMiB7XG4gICAgICAgIHJldHVybiBuZXcgVmVjdG9yMigwLCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgYFZlY3RvcjJgIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIFggY29vcmRpbmF0ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSBaIGNvb3JkaW5hdGUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgdmVjdG9yID0gbmV3IFZlY3RvcjIoMTAsIDIwKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCB4OiBudW1iZXIgPSAwLFxuICAgICAgICBwcm90ZWN0ZWQgejogbnVtYmVyID0gMFxuICAgICkge31cblxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYHg6IMKnYiR7dGhpcy54LnRvRml4ZWQoMil9wqdyLCB6OiDCp2Ike3RoaXMuei50b0ZpeGVkKDIpfcKncmA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBWZWN0b3IyIGluc3RhbmNlIGZyb20gYW4gb2JqZWN0IHdpdGggeCBhbmQgeiBwcm9wZXJ0aWVzLlxuICAgICAqIEBwYXJhbSBvYmogLSBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgeCBhbmQgeiBwcm9wZXJ0aWVzLlxuICAgICAqIEByZXR1cm5zIHtWZWN0b3IyfSBBIG5ldyBWZWN0b3IyIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZnJvbU9iamVjdCh7IHgsIHogfTogeyB4OiBudW1iZXI7IHo6IG51bWJlciB9KTogVmVjdG9yMiB7XG4gICAgICAgIHJldHVybiBuZXcgVmVjdG9yMih4LCB6KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIFggY29vcmRpbmF0ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBYIGNvb3JkaW5hdGUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogYXdhaXQgZW50aXR5LnNldFgoMTApO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRYKHg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgWiBjb29yZGluYXRlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIFogY29vcmRpbmF0ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBhd2FpdCBlbnRpdHkuc2V0WigxMCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldFooejogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMueiA9IHo7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB4IGNvb3JkaW5hdGUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIHggY29vcmRpbmF0ZSdzIHZhbHVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRYKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLng7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB6IGNvb3JkaW5hdGUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIHogY29vcmRpbmF0ZSdzIHZhbHVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRaKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLno7XG4gICAgfVxuXG4gICAgcHVibGljIGZsb29yKCk6IFZlY3RvcjIge1xuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjIoTWF0aC5mbG9vcih0aGlzLngpLCBNYXRoLmZsb29yKHRoaXMueikpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0cnVuYygpOiBWZWN0b3IyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IyKE1hdGgudHJ1bmModGhpcy54KSwgTWF0aC50cnVuYyh0aGlzLnopKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tcGFyZSBhbiBpbnN0YW5jZSBvZiBgVmVjdG9yM2Agd2l0aCBhbm90aGVyLlxuICAgICAqIEBwYXJhbSB7VmVjdG9yMn0gdmVjdG9yIC0gVGhlIGBWZWN0b3IzYCB0byBjb21wYXJlIHRvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhleSdyZSBlcXVhbCBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZXF1YWxzKHZlY3RvcjogVmVjdG9yMik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcykgPT09IEpTT04uc3RyaW5naWZ5KHZlY3Rvcik7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQSxJQUFhLFVBQWIsTUFBYSxRQUFRO0NBa0JIO0NBQ0E7Ozs7Q0FmZCxXQUFrQixPQUFnQjtFQUM5QixPQUFPLElBQUksUUFBUSxHQUFHLENBQUM7Q0FDM0I7Ozs7Ozs7Ozs7Q0FXQSxZQUNJLElBQXNCLEdBQ3RCLElBQXNCLEdBQ3hCO0VBRlksS0FBQSxJQUFBO0VBQ0EsS0FBQSxJQUFBO0NBQ1g7Q0FFSCxXQUEwQjtFQUN0QixPQUFPLFFBQVEsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLFdBQVcsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFO0NBQ2xFOzs7Ozs7Q0FPQSxPQUFjLFdBQVcsRUFBRSxHQUFHLEtBQXdDO0VBQ2xFLE9BQU8sSUFBSSxRQUFRLEdBQUcsQ0FBQztDQUMzQjs7Ozs7Ozs7O0NBVUEsS0FBWSxHQUFpQjtFQUN6QixLQUFLLElBQUk7Q0FDYjs7Ozs7Ozs7O0NBVUEsS0FBWSxHQUFpQjtFQUN6QixLQUFLLElBQUk7Q0FDYjs7Ozs7Q0FNQSxPQUFzQjtFQUNsQixPQUFPLEtBQUs7Q0FDaEI7Ozs7O0NBTUEsT0FBc0I7RUFDbEIsT0FBTyxLQUFLO0NBQ2hCO0NBRUEsUUFBd0I7RUFDcEIsT0FBTyxJQUFJLFFBQVEsS0FBSyxNQUFNLEtBQUssQ0FBQyxHQUFHLEtBQUssTUFBTSxLQUFLLENBQUMsQ0FBQztDQUM3RDtDQUVBLFFBQXdCO0VBQ3BCLE9BQU8sSUFBSSxRQUFRLEtBQUssTUFBTSxLQUFLLENBQUMsR0FBRyxLQUFLLE1BQU0sS0FBSyxDQUFDLENBQUM7Q0FDN0Q7Ozs7OztDQU1BLE9BQWMsUUFBMEI7RUFDcEMsT0FBTyxLQUFLLFVBQVUsSUFBSSxNQUFNLEtBQUssVUFBVSxNQUFNO0NBQ3pEO0FBQ0oifQ==
101
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmVjdG9yMi5janMuY2pzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uL3NyYy9WZWN0b3IyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogMkQgVmVjdG9yLlxuICovXG5leHBvcnQgY2xhc3MgVmVjdG9yMiB7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIFZlY3RvcjIgd2l0aCAwIG9uIGFsbCBheGlzLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IFpFUk8oKTogVmVjdG9yMiB7XG4gICAgICAgIHJldHVybiBuZXcgVmVjdG9yMigwLCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgYFZlY3RvcjJgIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIFggY29vcmRpbmF0ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSBaIGNvb3JkaW5hdGUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgdmVjdG9yID0gbmV3IFZlY3RvcjIoMTAsIDIwKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSB4OiBudW1iZXIgPSAwLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgejogbnVtYmVyID0gMFxuICAgICkge31cblxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYHg6IMKnYiR7dGhpcy54LnRvRml4ZWQoMil9wqdyLCB6OiDCp2Ike3RoaXMuei50b0ZpeGVkKDIpfcKncmA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBWZWN0b3IyIGluc3RhbmNlIGZyb20gYW4gb2JqZWN0IHdpdGggeCBhbmQgeiBwcm9wZXJ0aWVzLlxuICAgICAqIEBwYXJhbSBvYmogLSBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgeCBhbmQgeiBwcm9wZXJ0aWVzLlxuICAgICAqIEByZXR1cm5zIHtWZWN0b3IyfSBBIG5ldyBWZWN0b3IyIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZnJvbU9iamVjdCh7IHgsIHogfTogeyB4OiBudW1iZXI7IHo6IG51bWJlciB9KTogVmVjdG9yMiB7XG4gICAgICAgIHJldHVybiBuZXcgVmVjdG9yMih4LCB6KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29weSB3aXRoIGEgZGlmZmVyZW50IFggY29vcmRpbmF0ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBYIGNvb3JkaW5hdGUuXG4gICAgICogQHJldHVybnMge1ZlY3RvcjJ9IEEgbmV3IHZlY3RvcjsgdGhpcyBvbmUgaXMgbGVmdCBhbG9uZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBtb3ZlZCA9IHZlY3Rvci53aXRoWCgxMCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHdpdGhYKHg6IG51bWJlcik6IFZlY3RvcjIge1xuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjIoeCwgdGhpcy56KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29weSB3aXRoIGEgZGlmZmVyZW50IFogY29vcmRpbmF0ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSBaIGNvb3JkaW5hdGUuXG4gICAgICogQHJldHVybnMge1ZlY3RvcjJ9IEEgbmV3IHZlY3RvcjsgdGhpcyBvbmUgaXMgbGVmdCBhbG9uZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBtb3ZlZCA9IHZlY3Rvci53aXRoWigxMCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHdpdGhaKHo6IG51bWJlcik6IFZlY3RvcjIge1xuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjIodGhpcy54LCB6KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHggY29vcmRpbmF0ZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgeCBjb29yZGluYXRlJ3MgdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIGdldFgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHogY29vcmRpbmF0ZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgeiBjb29yZGluYXRlJ3MgdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIGdldFooKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuejtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmxvb3IoKTogVmVjdG9yMiB7XG4gICAgICAgIHJldHVybiBuZXcgVmVjdG9yMihNYXRoLmZsb29yKHRoaXMueCksIE1hdGguZmxvb3IodGhpcy56KSk7XG4gICAgfVxuXG4gICAgcHVibGljIHRydW5jKCk6IFZlY3RvcjIge1xuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjIoTWF0aC50cnVuYyh0aGlzLngpLCBNYXRoLnRydW5jKHRoaXMueikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXBhcmUgYW4gaW5zdGFuY2Ugb2YgYFZlY3RvcjJgIHdpdGggYW5vdGhlci5cbiAgICAgKlxuICAgICAqIENvbXBhcmVzIGNvb3JkaW5hdGVzIGFuZCBub3RoaW5nIGVsc2UuIFRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiBjb21wYXJlZFxuICAgICAqIGBKU09OLnN0cmluZ2lmeWAgb2YgYm90aCBzaWRlcywgd2hpY2ggZHJhZ2dlZCBpbiB3aGF0ZXZlciBmaWVsZHMgYSBzdWJjbGFzcyBoYWRcbiAgICAgKiBhZGRlZCAtIGFuZCBmb3IgYSBzdWJjbGFzcyBob2xkaW5nIGEgcmVmZXJlbmNlIGJhY2sgaW50byB0aGUgb2JqZWN0IGdyYXBoLCBzdWNoIGFzXG4gICAgICogYSBwb3NpdGlvbiBjYXJyeWluZyBpdHMgd29ybGQsIHNlcmlhbGlzaW5nIGl0IHRocmV3IG9uIHRoZSBjaXJjdWxhciBzdHJ1Y3R1cmUuXG4gICAgICogQHBhcmFtIHtWZWN0b3IyfSB2ZWN0b3IgLSBUaGUgYFZlY3RvcjJgIHRvIGNvbXBhcmUgdG8uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGV5J3JlIGVxdWFsIG90aGVyd2lzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIHB1YmxpYyBlcXVhbHModmVjdG9yOiBWZWN0b3IyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnggPT09IHZlY3Rvci54ICYmIHRoaXMueiA9PT0gdmVjdG9yLno7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQSxJQUFhLFVBQWIsTUFBYSxRQUFRO0NBa0JNO0NBQ0E7Ozs7Q0FmdkIsV0FBa0IsT0FBZ0I7RUFDOUIsT0FBTyxJQUFJLFFBQVEsR0FBRyxDQUFDO0NBQzNCOzs7Ozs7Ozs7O0NBV0EsWUFDSSxJQUErQixHQUMvQixJQUErQixHQUNqQztFQUZxQixLQUFBLElBQUE7RUFDQSxLQUFBLElBQUE7Q0FDcEI7Q0FFSCxXQUEwQjtFQUN0QixPQUFPLFFBQVEsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLFdBQVcsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFO0NBQ2xFOzs7Ozs7Q0FPQSxPQUFjLFdBQVcsRUFBRSxHQUFHLEtBQXdDO0VBQ2xFLE9BQU8sSUFBSSxRQUFRLEdBQUcsQ0FBQztDQUMzQjs7Ozs7Ozs7OztDQVdBLE1BQWEsR0FBb0I7RUFDN0IsT0FBTyxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7Q0FDaEM7Ozs7Ozs7Ozs7Q0FXQSxNQUFhLEdBQW9CO0VBQzdCLE9BQU8sSUFBSSxRQUFRLEtBQUssR0FBRyxDQUFDO0NBQ2hDOzs7OztDQU1BLE9BQXNCO0VBQ2xCLE9BQU8sS0FBSztDQUNoQjs7Ozs7Q0FNQSxPQUFzQjtFQUNsQixPQUFPLEtBQUs7Q0FDaEI7Q0FFQSxRQUF3QjtFQUNwQixPQUFPLElBQUksUUFBUSxLQUFLLE1BQU0sS0FBSyxDQUFDLEdBQUcsS0FBSyxNQUFNLEtBQUssQ0FBQyxDQUFDO0NBQzdEO0NBRUEsUUFBd0I7RUFDcEIsT0FBTyxJQUFJLFFBQVEsS0FBSyxNQUFNLEtBQUssQ0FBQyxHQUFHLEtBQUssTUFBTSxLQUFLLENBQUMsQ0FBQztDQUM3RDs7Ozs7Ozs7Ozs7Q0FZQSxPQUFjLFFBQTBCO0VBQ3BDLE9BQU8sS0FBSyxNQUFNLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTztDQUNwRDtBQUNKIn0=
package/dist/Vector2.d.ts CHANGED
@@ -2,8 +2,8 @@
2
2
  * 2D Vector.
3
3
  */
4
4
  export declare class Vector2 {
5
- protected x: number;
6
- protected z: number;
5
+ protected readonly x: number;
6
+ protected readonly z: number;
7
7
  /**
8
8
  * Returns a Vector2 with 0 on all axis.
9
9
  */
@@ -29,23 +29,25 @@ export declare class Vector2 {
29
29
  z: number;
30
30
  }): Vector2;
31
31
  /**
32
- * Set the X coordinate.
32
+ * Returns a copy with a different X coordinate.
33
33
  * @param {number} x - The X coordinate.
34
+ * @returns {Vector2} A new vector; this one is left alone.
34
35
  * @example
35
36
  * ```typescript
36
- * await entity.setX(10);
37
+ * const moved = vector.withX(10);
37
38
  * ```
38
39
  */
39
- setX(x: number): void;
40
+ withX(x: number): Vector2;
40
41
  /**
41
- * Set the Z coordinate.
42
+ * Returns a copy with a different Z coordinate.
42
43
  * @param {number} z - The Z coordinate.
44
+ * @returns {Vector2} A new vector; this one is left alone.
43
45
  * @example
44
46
  * ```typescript
45
- * await entity.setZ(10);
47
+ * const moved = vector.withZ(10);
46
48
  * ```
47
49
  */
48
- setZ(z: number): void;
50
+ withZ(z: number): Vector2;
49
51
  /**
50
52
  * Get the x coordinate.
51
53
  * @returns {number} The x coordinate's value.
@@ -59,8 +61,13 @@ export declare class Vector2 {
59
61
  floor(): Vector2;
60
62
  trunc(): Vector2;
61
63
  /**
62
- * Compare an instance of `Vector3` with another.
63
- * @param {Vector2} vector - The `Vector3` to compare to.
64
+ * Compare an instance of `Vector2` with another.
65
+ *
66
+ * Compares coordinates and nothing else. The previous implementation compared
67
+ * `JSON.stringify` of both sides, which dragged in whatever fields a subclass had
68
+ * added - and for a subclass holding a reference back into the object graph, such as
69
+ * a position carrying its world, serialising it threw on the circular structure.
70
+ * @param {Vector2} vector - The `Vector2` to compare to.
64
71
  * @returns {boolean} `true` if they're equal otherwise `false`.
65
72
  */
66
73
  equals(vector: Vector2): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"Vector2.d.ts","sourceRoot":"","sources":["../src/Vector2.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,OAAO;IAkBZ,SAAS,CAAC,CAAC,EAAE,MAAM;IACnB,SAAS,CAAC,CAAC,EAAE,MAAM;IAlBvB;;OAEG;IACH,WAAkB,IAAI,IAAI,OAAO,CAEhC;IAED;;;;;;;;OAQG;gBAEW,CAAC,GAAE,MAAU,EACb,CAAC,GAAE,MAAU;IAGpB,QAAQ,IAAI,MAAM;IAIzB;;;;OAIG;WACW,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO;IAIrE;;;;;;;OAOG;IACI,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAI5B;;;;;;;OAOG;IACI,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAI5B;;;OAGG;IACI,IAAI,IAAI,MAAM;IAIrB;;;OAGG;IACI,IAAI,IAAI,MAAM;IAId,KAAK,IAAI,OAAO;IAIhB,KAAK,IAAI,OAAO;IAGvB;;;;OAIG;IACI,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO;CAG1C"}
1
+ {"version":3,"file":"Vector2.d.ts","sourceRoot":"","sources":["../src/Vector2.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,OAAO;IAkBZ,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM;IAC5B,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM;IAlBhC;;OAEG;IACH,WAAkB,IAAI,IAAI,OAAO,CAEhC;IAED;;;;;;;;OAQG;gBAEoB,CAAC,GAAE,MAAU,EACb,CAAC,GAAE,MAAU;IAG7B,QAAQ,IAAI,MAAM;IAIzB;;;;OAIG;WACW,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO;IAIrE;;;;;;;;OAQG;IACI,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAIhC;;;;;;;;OAQG;IACI,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAIhC;;;OAGG;IACI,IAAI,IAAI,MAAM;IAIrB;;;OAGG;IACI,IAAI,IAAI,MAAM;IAId,KAAK,IAAI,OAAO;IAIhB,KAAK,IAAI,OAAO;IAIvB;;;;;;;;;OASG;IACI,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO;CAG1C"}
@@ -36,26 +36,28 @@ var Vector2 = class Vector2 {
36
36
  return new Vector2(x, z);
37
37
  }
38
38
  /**
39
- * Set the X coordinate.
39
+ * Returns a copy with a different X coordinate.
40
40
  * @param {number} x - The X coordinate.
41
+ * @returns {Vector2} A new vector; this one is left alone.
41
42
  * @example
42
43
  * ```typescript
43
- * await entity.setX(10);
44
+ * const moved = vector.withX(10);
44
45
  * ```
45
46
  */
46
- setX(x) {
47
- this.x = x;
47
+ withX(x) {
48
+ return new Vector2(x, this.z);
48
49
  }
49
50
  /**
50
- * Set the Z coordinate.
51
+ * Returns a copy with a different Z coordinate.
51
52
  * @param {number} z - The Z coordinate.
53
+ * @returns {Vector2} A new vector; this one is left alone.
52
54
  * @example
53
55
  * ```typescript
54
- * await entity.setZ(10);
56
+ * const moved = vector.withZ(10);
55
57
  * ```
56
58
  */
57
- setZ(z) {
58
- this.z = z;
59
+ withZ(z) {
60
+ return new Vector2(this.x, z);
59
61
  }
60
62
  /**
61
63
  * Get the x coordinate.
@@ -78,15 +80,20 @@ var Vector2 = class Vector2 {
78
80
  return new Vector2(Math.trunc(this.x), Math.trunc(this.z));
79
81
  }
80
82
  /**
81
- * Compare an instance of `Vector3` with another.
82
- * @param {Vector2} vector - The `Vector3` to compare to.
83
+ * Compare an instance of `Vector2` with another.
84
+ *
85
+ * Compares coordinates and nothing else. The previous implementation compared
86
+ * `JSON.stringify` of both sides, which dragged in whatever fields a subclass had
87
+ * added - and for a subclass holding a reference back into the object graph, such as
88
+ * a position carrying its world, serialising it threw on the circular structure.
89
+ * @param {Vector2} vector - The `Vector2` to compare to.
83
90
  * @returns {boolean} `true` if they're equal otherwise `false`.
84
91
  */
85
92
  equals(vector) {
86
- return JSON.stringify(this) === JSON.stringify(vector);
93
+ return this.x === vector.x && this.z === vector.z;
87
94
  }
88
95
  };
89
96
  //#endregion
90
97
  export { Vector2 };
91
98
 
92
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmVjdG9yMi5lcy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvVmVjdG9yMi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIDJEIFZlY3Rvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvcjIge1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBWZWN0b3IyIHdpdGggMCBvbiBhbGwgYXhpcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldCBaRVJPKCk6IFZlY3RvcjIge1xuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjIoMCwgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGBWZWN0b3IyYCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBYIGNvb3JkaW5hdGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgWiBjb29yZGluYXRlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHZlY3RvciA9IG5ldyBWZWN0b3IyKDEwLCAyMCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgeDogbnVtYmVyID0gMCxcbiAgICAgICAgcHJvdGVjdGVkIHo6IG51bWJlciA9IDBcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGB4OiDCp2Ike3RoaXMueC50b0ZpeGVkKDIpfcKnciwgejogwqdiJHt0aGlzLnoudG9GaXhlZCgyKX3Cp3JgO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVmVjdG9yMiBpbnN0YW5jZSBmcm9tIGFuIG9iamVjdCB3aXRoIHggYW5kIHogcHJvcGVydGllcy5cbiAgICAgKiBAcGFyYW0gb2JqIC0gVGhlIG9iamVjdCBjb250YWluaW5nIHggYW5kIHogcHJvcGVydGllcy5cbiAgICAgKiBAcmV0dXJucyB7VmVjdG9yMn0gQSBuZXcgVmVjdG9yMiBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZyb21PYmplY3QoeyB4LCB6IH06IHsgeDogbnVtYmVyOyB6OiBudW1iZXIgfSk6IFZlY3RvcjIge1xuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjIoeCwgeik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBYIGNvb3JkaW5hdGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgWCBjb29yZGluYXRlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGF3YWl0IGVudGl0eS5zZXRYKDEwKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0WCh4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIFogY29vcmRpbmF0ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSBaIGNvb3JkaW5hdGUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogYXdhaXQgZW50aXR5LnNldFooMTApO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRaKHo6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnogPSB6O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgeCBjb29yZGluYXRlLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSB4IGNvb3JkaW5hdGUncyB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0WCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy54O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgeiBjb29yZGluYXRlLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSB6IGNvb3JkaW5hdGUncyB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0WigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy56O1xuICAgIH1cblxuICAgIHB1YmxpYyBmbG9vcigpOiBWZWN0b3IyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IyKE1hdGguZmxvb3IodGhpcy54KSwgTWF0aC5mbG9vcih0aGlzLnopKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdHJ1bmMoKTogVmVjdG9yMiB7XG4gICAgICAgIHJldHVybiBuZXcgVmVjdG9yMihNYXRoLnRydW5jKHRoaXMueCksIE1hdGgudHJ1bmModGhpcy56KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbXBhcmUgYW4gaW5zdGFuY2Ugb2YgYFZlY3RvcjNgIHdpdGggYW5vdGhlci5cbiAgICAgKiBAcGFyYW0ge1ZlY3RvcjJ9IHZlY3RvciAtIFRoZSBgVmVjdG9yM2AgdG8gY29tcGFyZSB0by5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZXkncmUgZXF1YWwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgcHVibGljIGVxdWFscyh2ZWN0b3I6IFZlY3RvcjIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMpID09PSBKU09OLnN0cmluZ2lmeSh2ZWN0b3IpO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUdBLElBQWEsVUFBYixNQUFhLFFBQVE7Q0FrQkg7Q0FDQTs7OztDQWZkLFdBQWtCLE9BQWdCO0VBQzlCLE9BQU8sSUFBSSxRQUFRLEdBQUcsQ0FBQztDQUMzQjs7Ozs7Ozs7OztDQVdBLFlBQ0ksSUFBc0IsR0FDdEIsSUFBc0IsR0FDeEI7RUFGWSxLQUFBLElBQUE7RUFDQSxLQUFBLElBQUE7Q0FDWDtDQUVILFdBQTBCO0VBQ3RCLE9BQU8sUUFBUSxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUUsV0FBVyxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUU7Q0FDbEU7Ozs7OztDQU9BLE9BQWMsV0FBVyxFQUFFLEdBQUcsS0FBd0M7RUFDbEUsT0FBTyxJQUFJLFFBQVEsR0FBRyxDQUFDO0NBQzNCOzs7Ozs7Ozs7Q0FVQSxLQUFZLEdBQWlCO0VBQ3pCLEtBQUssSUFBSTtDQUNiOzs7Ozs7Ozs7Q0FVQSxLQUFZLEdBQWlCO0VBQ3pCLEtBQUssSUFBSTtDQUNiOzs7OztDQU1BLE9BQXNCO0VBQ2xCLE9BQU8sS0FBSztDQUNoQjs7Ozs7Q0FNQSxPQUFzQjtFQUNsQixPQUFPLEtBQUs7Q0FDaEI7Q0FFQSxRQUF3QjtFQUNwQixPQUFPLElBQUksUUFBUSxLQUFLLE1BQU0sS0FBSyxDQUFDLEdBQUcsS0FBSyxNQUFNLEtBQUssQ0FBQyxDQUFDO0NBQzdEO0NBRUEsUUFBd0I7RUFDcEIsT0FBTyxJQUFJLFFBQVEsS0FBSyxNQUFNLEtBQUssQ0FBQyxHQUFHLEtBQUssTUFBTSxLQUFLLENBQUMsQ0FBQztDQUM3RDs7Ozs7O0NBTUEsT0FBYyxRQUEwQjtFQUNwQyxPQUFPLEtBQUssVUFBVSxJQUFJLE1BQU0sS0FBSyxVQUFVLE1BQU07Q0FDekQ7QUFDSiJ9
99
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmVjdG9yMi5lcy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvVmVjdG9yMi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIDJEIFZlY3Rvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvcjIge1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBWZWN0b3IyIHdpdGggMCBvbiBhbGwgYXhpcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldCBaRVJPKCk6IFZlY3RvcjIge1xuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjIoMCwgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGBWZWN0b3IyYCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBYIGNvb3JkaW5hdGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgWiBjb29yZGluYXRlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHZlY3RvciA9IG5ldyBWZWN0b3IyKDEwLCAyMCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgeDogbnVtYmVyID0gMCxcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IHo6IG51bWJlciA9IDBcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGB4OiDCp2Ike3RoaXMueC50b0ZpeGVkKDIpfcKnciwgejogwqdiJHt0aGlzLnoudG9GaXhlZCgyKX3Cp3JgO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVmVjdG9yMiBpbnN0YW5jZSBmcm9tIGFuIG9iamVjdCB3aXRoIHggYW5kIHogcHJvcGVydGllcy5cbiAgICAgKiBAcGFyYW0gb2JqIC0gVGhlIG9iamVjdCBjb250YWluaW5nIHggYW5kIHogcHJvcGVydGllcy5cbiAgICAgKiBAcmV0dXJucyB7VmVjdG9yMn0gQSBuZXcgVmVjdG9yMiBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZyb21PYmplY3QoeyB4LCB6IH06IHsgeDogbnVtYmVyOyB6OiBudW1iZXIgfSk6IFZlY3RvcjIge1xuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjIoeCwgeik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgd2l0aCBhIGRpZmZlcmVudCBYIGNvb3JkaW5hdGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgWCBjb29yZGluYXRlLlxuICAgICAqIEByZXR1cm5zIHtWZWN0b3IyfSBBIG5ldyB2ZWN0b3I7IHRoaXMgb25lIGlzIGxlZnQgYWxvbmUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbW92ZWQgPSB2ZWN0b3Iud2l0aFgoMTApO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoWCh4OiBudW1iZXIpOiBWZWN0b3IyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IyKHgsIHRoaXMueik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgd2l0aCBhIGRpZmZlcmVudCBaIGNvb3JkaW5hdGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgWiBjb29yZGluYXRlLlxuICAgICAqIEByZXR1cm5zIHtWZWN0b3IyfSBBIG5ldyB2ZWN0b3I7IHRoaXMgb25lIGlzIGxlZnQgYWxvbmUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbW92ZWQgPSB2ZWN0b3Iud2l0aFooMTApO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoWih6OiBudW1iZXIpOiBWZWN0b3IyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IyKHRoaXMueCwgeik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB4IGNvb3JkaW5hdGUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIHggY29vcmRpbmF0ZSdzIHZhbHVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRYKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLng7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB6IGNvb3JkaW5hdGUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIHogY29vcmRpbmF0ZSdzIHZhbHVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRaKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLno7XG4gICAgfVxuXG4gICAgcHVibGljIGZsb29yKCk6IFZlY3RvcjIge1xuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjIoTWF0aC5mbG9vcih0aGlzLngpLCBNYXRoLmZsb29yKHRoaXMueikpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0cnVuYygpOiBWZWN0b3IyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IyKE1hdGgudHJ1bmModGhpcy54KSwgTWF0aC50cnVuYyh0aGlzLnopKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlIGFuIGluc3RhbmNlIG9mIGBWZWN0b3IyYCB3aXRoIGFub3RoZXIuXG4gICAgICpcbiAgICAgKiBDb21wYXJlcyBjb29yZGluYXRlcyBhbmQgbm90aGluZyBlbHNlLiBUaGUgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gY29tcGFyZWRcbiAgICAgKiBgSlNPTi5zdHJpbmdpZnlgIG9mIGJvdGggc2lkZXMsIHdoaWNoIGRyYWdnZWQgaW4gd2hhdGV2ZXIgZmllbGRzIGEgc3ViY2xhc3MgaGFkXG4gICAgICogYWRkZWQgLSBhbmQgZm9yIGEgc3ViY2xhc3MgaG9sZGluZyBhIHJlZmVyZW5jZSBiYWNrIGludG8gdGhlIG9iamVjdCBncmFwaCwgc3VjaCBhc1xuICAgICAqIGEgcG9zaXRpb24gY2FycnlpbmcgaXRzIHdvcmxkLCBzZXJpYWxpc2luZyBpdCB0aHJldyBvbiB0aGUgY2lyY3VsYXIgc3RydWN0dXJlLlxuICAgICAqIEBwYXJhbSB7VmVjdG9yMn0gdmVjdG9yIC0gVGhlIGBWZWN0b3IyYCB0byBjb21wYXJlIHRvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhleSdyZSBlcXVhbCBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZXF1YWxzKHZlY3RvcjogVmVjdG9yMik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy54ID09PSB2ZWN0b3IueCAmJiB0aGlzLnogPT09IHZlY3Rvci56O1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUdBLElBQWEsVUFBYixNQUFhLFFBQVE7Q0FrQk07Q0FDQTs7OztDQWZ2QixXQUFrQixPQUFnQjtFQUM5QixPQUFPLElBQUksUUFBUSxHQUFHLENBQUM7Q0FDM0I7Ozs7Ozs7Ozs7Q0FXQSxZQUNJLElBQStCLEdBQy9CLElBQStCLEdBQ2pDO0VBRnFCLEtBQUEsSUFBQTtFQUNBLEtBQUEsSUFBQTtDQUNwQjtDQUVILFdBQTBCO0VBQ3RCLE9BQU8sUUFBUSxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUUsV0FBVyxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUU7Q0FDbEU7Ozs7OztDQU9BLE9BQWMsV0FBVyxFQUFFLEdBQUcsS0FBd0M7RUFDbEUsT0FBTyxJQUFJLFFBQVEsR0FBRyxDQUFDO0NBQzNCOzs7Ozs7Ozs7O0NBV0EsTUFBYSxHQUFvQjtFQUM3QixPQUFPLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztDQUNoQzs7Ozs7Ozs7OztDQVdBLE1BQWEsR0FBb0I7RUFDN0IsT0FBTyxJQUFJLFFBQVEsS0FBSyxHQUFHLENBQUM7Q0FDaEM7Ozs7O0NBTUEsT0FBc0I7RUFDbEIsT0FBTyxLQUFLO0NBQ2hCOzs7OztDQU1BLE9BQXNCO0VBQ2xCLE9BQU8sS0FBSztDQUNoQjtDQUVBLFFBQXdCO0VBQ3BCLE9BQU8sSUFBSSxRQUFRLEtBQUssTUFBTSxLQUFLLENBQUMsR0FBRyxLQUFLLE1BQU0sS0FBSyxDQUFDLENBQUM7Q0FDN0Q7Q0FFQSxRQUF3QjtFQUNwQixPQUFPLElBQUksUUFBUSxLQUFLLE1BQU0sS0FBSyxDQUFDLEdBQUcsS0FBSyxNQUFNLEtBQUssQ0FBQyxDQUFDO0NBQzdEOzs7Ozs7Ozs7OztDQVlBLE9BQWMsUUFBMEI7RUFDcEMsT0FBTyxLQUFLLE1BQU0sT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPO0NBQ3BEO0FBQ0oifQ==
@@ -39,15 +39,54 @@ var Vector3 = class Vector3 extends require_Vector2.Vector2 {
39
39
  return new Vector3(x, y, z);
40
40
  }
41
41
  /**
42
- * Set the Y coordinate.
42
+ * Builds another instance of whatever class this actually is, from raw coordinates.
43
+ *
44
+ * Every method that derives a new vector goes through here, so a subclass keeps its own
45
+ * type instead of decaying to a plain `Vector3` - and a subclass carrying extra state,
46
+ * such as a position carrying its world, gets one place to reattach it.
47
+ * @param {number} x - The X coordinate.
43
48
  * @param {number} y - The Y coordinate.
49
+ * @param {number} z - The Z coordinate.
50
+ * @returns {this} A new instance of the concrete class.
51
+ */
52
+ create(x, y, z) {
53
+ return new this.constructor(x, y, z);
54
+ }
55
+ /**
56
+ * Returns a copy with a different X coordinate.
57
+ * @param {number} x - The X coordinate.
58
+ * @returns {this} A new vector; this one is left alone.
44
59
  * @example
45
60
  * ```typescript
46
- * entity.setY(10);
61
+ * const moved = vector.withX(10);
47
62
  * ```
48
63
  */
49
- setY(y) {
50
- this.y = y;
64
+ withX(x) {
65
+ return this.create(x, this.y, this.z);
66
+ }
67
+ /**
68
+ * Returns a copy with a different Y coordinate.
69
+ * @param {number} y - The Y coordinate.
70
+ * @returns {this} A new vector; this one is left alone.
71
+ * @example
72
+ * ```typescript
73
+ * const moved = vector.withY(10);
74
+ * ```
75
+ */
76
+ withY(y) {
77
+ return this.create(this.x, y, this.z);
78
+ }
79
+ /**
80
+ * Returns a copy with a different Z coordinate.
81
+ * @param {number} z - The Z coordinate.
82
+ * @returns {this} A new vector; this one is left alone.
83
+ * @example
84
+ * ```typescript
85
+ * const moved = vector.withZ(10);
86
+ * ```
87
+ */
88
+ withZ(z) {
89
+ return this.create(this.x, this.y, z);
51
90
  }
52
91
  /**
53
92
  * Get the y coordinate.
@@ -58,17 +97,17 @@ var Vector3 = class Vector3 extends require_Vector2.Vector2 {
58
97
  }
59
98
  /**
60
99
  * Returns a new Vector3 with each component rounded down to the nearest integer.
61
- * @returns {Vector3} A new Vector3 with rounded down components.
100
+ * @returns {this} A new vector with rounded down components.
62
101
  */
63
102
  floor() {
64
- return new Vector3(Math.floor(this.x), Math.floor(this.y), Math.floor(this.z));
103
+ return this.create(Math.floor(this.x), Math.floor(this.y), Math.floor(this.z));
65
104
  }
66
105
  /**
67
106
  * Returns a new Vector3 with each component truncated to the nearest integer.
68
- * @returns {Vector3} A new Vector3 with truncated axis.
107
+ * @returns {this} A new vector with truncated axis.
69
108
  */
70
109
  trunc() {
71
- return new Vector3(Math.trunc(this.x), Math.trunc(this.y), Math.trunc(this.z));
110
+ return this.create(Math.trunc(this.x), Math.trunc(this.y), Math.trunc(this.z));
72
111
  }
73
112
  /**
74
113
  * Compare an instance of `Vector3` with another.
@@ -76,10 +115,44 @@ var Vector3 = class Vector3 extends require_Vector2.Vector2 {
76
115
  * @returns {boolean} `true` if they're equal otherwise `false`.
77
116
  */
78
117
  equals(vector) {
79
- return JSON.stringify(this) === JSON.stringify(vector);
118
+ return this.x === vector.x && this.y === vector.y && this.z === vector.z;
119
+ }
120
+ /**
121
+ * The squared distance to another vector.
122
+ *
123
+ * Squared, and offered first, because almost every caller compares a distance against
124
+ * another distance - and a comparison of squares gives the same answer without the square
125
+ * root. Prefer this to {@link Vector3.distanceTo} wherever the number itself is not shown
126
+ * to anyone.
127
+ * @param {Vector3} vector - The vector to measure to.
128
+ * @returns {number} The squared distance.
129
+ * @example
130
+ * ```typescript
131
+ * if (a.distanceSquaredTo(b) <= range * range) {
132
+ * // within range, with no square root taken
133
+ * }
134
+ * ```
135
+ */
136
+ distanceSquaredTo(vector) {
137
+ const dx = this.x - vector.x;
138
+ const dy = this.y - vector.y;
139
+ const dz = this.z - vector.z;
140
+ return dx * dx + dy * dy + dz * dz;
141
+ }
142
+ /**
143
+ * The distance to another vector.
144
+ * @param {Vector3} vector - The vector to measure to.
145
+ * @returns {number} The distance.
146
+ * @example
147
+ * ```typescript
148
+ * const metres = player.getPosition().distanceTo(target.getPosition());
149
+ * ```
150
+ */
151
+ distanceTo(vector) {
152
+ return Math.sqrt(this.distanceSquaredTo(vector));
80
153
  }
81
154
  };
82
155
  //#endregion
83
156
  exports.Vector3 = Vector3;
84
157
 
85
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmVjdG9yMy5janMuY2pzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uL3NyYy9WZWN0b3IzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuL1ZlY3RvcjInO1xuXG4vKipcbiAqIDNEIFZlY3Rvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvcjMgZXh0ZW5kcyBWZWN0b3IyIHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgVmVjdG9yMyB3aXRoIDAgb24gYWxsIGF4aXMuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXQgWkVSTygpOiBWZWN0b3IzIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IzKDAsIDAsIDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBgVmVjdG9yM2AgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgWCBjb29yZGluYXRlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIFkgY29vcmRpbmF0ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSBaIGNvb3JkaW5hdGUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgdmVjdG9yID0gbmV3IFZlY3RvcjMoMTAsIDIwLCAzMCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICB4OiBudW1iZXIsXG4gICAgICAgIHByb3RlY3RlZCB5OiBudW1iZXIsXG4gICAgICAgIHo6IG51bWJlclxuICAgICkge1xuICAgICAgICBzdXBlcih4LCB6KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGB4OiDCp2Ike3RoaXMueC50b0ZpeGVkKDIpfcKnciwgeTogwqdiJHt0aGlzLnkudG9GaXhlZCgyKX3Cp3IsIHo6IMKnYiR7dGhpcy56LnRvRml4ZWQoMil9wqdyYDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFZlY3RvcjMgaW5zdGFuY2UgZnJvbSBhbiBvYmplY3Qgd2l0aCB4LCB5LCBhbmQgeiBwcm9wZXJ0aWVzLlxuICAgICAqIEBwYXJhbSBvYmogLSBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgeCwgeSwgYW5kIHogcHJvcGVydGllcy5cbiAgICAgKiBAcmV0dXJucyB7VmVjdG9yM30gQSBuZXcgVmVjdG9yMyBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZyb21PYmplY3QoeyB4LCB5LCB6IH06IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9KTogVmVjdG9yMyB7XG4gICAgICAgIHJldHVybiBuZXcgVmVjdG9yMyh4LCB5LCB6KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIFkgY29vcmRpbmF0ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBZIGNvb3JkaW5hdGUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZW50aXR5LnNldFkoMTApO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRZKHk6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgeSBjb29yZGluYXRlLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSB5IGNvb3JkaW5hdGUncyB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0WSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy55O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcgVmVjdG9yMyB3aXRoIGVhY2ggY29tcG9uZW50IHJvdW5kZWQgZG93biB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLlxuICAgICAqIEByZXR1cm5zIHtWZWN0b3IzfSBBIG5ldyBWZWN0b3IzIHdpdGggcm91bmRlZCBkb3duIGNvbXBvbmVudHMuXG4gICAgICovXG4gICAgcHVibGljIGZsb29yKCk6IFZlY3RvcjMge1xuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjMoTWF0aC5mbG9vcih0aGlzLngpLCBNYXRoLmZsb29yKHRoaXMueSksIE1hdGguZmxvb3IodGhpcy56KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyBWZWN0b3IzIHdpdGggZWFjaCBjb21wb25lbnQgdHJ1bmNhdGVkIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuXG4gICAgICogQHJldHVybnMge1ZlY3RvcjN9IEEgbmV3IFZlY3RvcjMgd2l0aCB0cnVuY2F0ZWQgYXhpcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdHJ1bmMoKTogVmVjdG9yMyB7XG4gICAgICAgIHJldHVybiBuZXcgVmVjdG9yMyhNYXRoLnRydW5jKHRoaXMueCksIE1hdGgudHJ1bmModGhpcy55KSwgTWF0aC50cnVuYyh0aGlzLnopKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlIGFuIGluc3RhbmNlIG9mIGBWZWN0b3IzYCB3aXRoIGFub3RoZXIuXG4gICAgICogQHBhcmFtIHtWZWN0b3IzfSB2ZWN0b3IgLSBUaGUgYFZlY3RvcjNgIHRvIGNvbXBhcmUgdG8uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGV5J3JlIGVxdWFsIG90aGVyd2lzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIHB1YmxpYyBlcXVhbHModmVjdG9yOiB0eXBlb2YgdGhpcyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcykgPT09IEpTT04uc3RyaW5naWZ5KHZlY3Rvcik7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBS0EsSUFBYSxVQUFiLE1BQWEsZ0JBQWdCLGdCQUFBLFFBQVE7Q0FvQm5COzs7O0NBaEJkLFdBQWtCLE9BQWdCO0VBQzlCLE9BQU8sSUFBSSxRQUFRLEdBQUcsR0FBRyxDQUFDO0NBQzlCOzs7Ozs7Ozs7OztDQVlBLFlBQ0ksR0FDQSxHQUNBLEdBQ0Y7RUFDRSxNQUFNLEdBQUcsQ0FBQztFQUhBLEtBQUEsSUFBQTtDQUlkO0NBRUEsV0FBMEI7RUFDdEIsT0FBTyxRQUFRLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRSxXQUFXLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRSxXQUFXLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRTtDQUMvRjs7Ozs7O0NBT0EsT0FBYyxXQUFXLEVBQUUsR0FBRyxHQUFHLEtBQW1EO0VBQ2hGLE9BQU8sSUFBSSxRQUFRLEdBQUcsR0FBRyxDQUFDO0NBQzlCOzs7Ozs7Ozs7Q0FVQSxLQUFZLEdBQWlCO0VBQ3pCLEtBQUssSUFBSTtDQUNiOzs7OztDQU1BLE9BQXNCO0VBQ2xCLE9BQU8sS0FBSztDQUNoQjs7Ozs7Q0FNQSxRQUF3QjtFQUNwQixPQUFPLElBQUksUUFBUSxLQUFLLE1BQU0sS0FBSyxDQUFDLEdBQUcsS0FBSyxNQUFNLEtBQUssQ0FBQyxHQUFHLEtBQUssTUFBTSxLQUFLLENBQUMsQ0FBQztDQUNqRjs7Ozs7Q0FNQSxRQUF3QjtFQUNwQixPQUFPLElBQUksUUFBUSxLQUFLLE1BQU0sS0FBSyxDQUFDLEdBQUcsS0FBSyxNQUFNLEtBQUssQ0FBQyxHQUFHLEtBQUssTUFBTSxLQUFLLENBQUMsQ0FBQztDQUNqRjs7Ozs7O0NBT0EsT0FBYyxRQUE4QjtFQUN4QyxPQUFPLEtBQUssVUFBVSxJQUFJLE1BQU0sS0FBSyxVQUFVLE1BQU07Q0FDekQ7QUFDSiJ9
158
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmVjdG9yMy5janMuY2pzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uL3NyYy9WZWN0b3IzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuL1ZlY3RvcjInO1xuXG4vKipcbiAqIDNEIFZlY3Rvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvcjMgZXh0ZW5kcyBWZWN0b3IyIHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgVmVjdG9yMyB3aXRoIDAgb24gYWxsIGF4aXMuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXQgWkVSTygpOiBWZWN0b3IzIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IzKDAsIDAsIDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBgVmVjdG9yM2AgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgWCBjb29yZGluYXRlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIFkgY29vcmRpbmF0ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSBaIGNvb3JkaW5hdGUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgdmVjdG9yID0gbmV3IFZlY3RvcjMoMTAsIDIwLCAzMCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICB4OiBudW1iZXIsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSB5OiBudW1iZXIsXG4gICAgICAgIHo6IG51bWJlclxuICAgICkge1xuICAgICAgICBzdXBlcih4LCB6KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGB4OiDCp2Ike3RoaXMueC50b0ZpeGVkKDIpfcKnciwgeTogwqdiJHt0aGlzLnkudG9GaXhlZCgyKX3Cp3IsIHo6IMKnYiR7dGhpcy56LnRvRml4ZWQoMil9wqdyYDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFZlY3RvcjMgaW5zdGFuY2UgZnJvbSBhbiBvYmplY3Qgd2l0aCB4LCB5LCBhbmQgeiBwcm9wZXJ0aWVzLlxuICAgICAqIEBwYXJhbSBvYmogLSBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgeCwgeSwgYW5kIHogcHJvcGVydGllcy5cbiAgICAgKiBAcmV0dXJucyB7VmVjdG9yM30gQSBuZXcgVmVjdG9yMyBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZyb21PYmplY3QoeyB4LCB5LCB6IH06IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9KTogVmVjdG9yMyB7XG4gICAgICAgIHJldHVybiBuZXcgVmVjdG9yMyh4LCB5LCB6KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgYW5vdGhlciBpbnN0YW5jZSBvZiB3aGF0ZXZlciBjbGFzcyB0aGlzIGFjdHVhbGx5IGlzLCBmcm9tIHJhdyBjb29yZGluYXRlcy5cbiAgICAgKlxuICAgICAqIEV2ZXJ5IG1ldGhvZCB0aGF0IGRlcml2ZXMgYSBuZXcgdmVjdG9yIGdvZXMgdGhyb3VnaCBoZXJlLCBzbyBhIHN1YmNsYXNzIGtlZXBzIGl0cyBvd25cbiAgICAgKiB0eXBlIGluc3RlYWQgb2YgZGVjYXlpbmcgdG8gYSBwbGFpbiBgVmVjdG9yM2AgLSBhbmQgYSBzdWJjbGFzcyBjYXJyeWluZyBleHRyYSBzdGF0ZSxcbiAgICAgKiBzdWNoIGFzIGEgcG9zaXRpb24gY2FycnlpbmcgaXRzIHdvcmxkLCBnZXRzIG9uZSBwbGFjZSB0byByZWF0dGFjaCBpdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBYIGNvb3JkaW5hdGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgWSBjb29yZGluYXRlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIFogY29vcmRpbmF0ZS5cbiAgICAgKiBAcmV0dXJucyB7dGhpc30gQSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNvbmNyZXRlIGNsYXNzLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGUoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcik6IHRoaXMge1xuICAgICAgICByZXR1cm4gbmV3ICh0aGlzLmNvbnN0cnVjdG9yIGFzIG5ldyAoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcikgPT4gdGhpcykoeCwgeSwgeik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgd2l0aCBhIGRpZmZlcmVudCBYIGNvb3JkaW5hdGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgWCBjb29yZGluYXRlLlxuICAgICAqIEByZXR1cm5zIHt0aGlzfSBBIG5ldyB2ZWN0b3I7IHRoaXMgb25lIGlzIGxlZnQgYWxvbmUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbW92ZWQgPSB2ZWN0b3Iud2l0aFgoMTApO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSB3aXRoWCh4OiBudW1iZXIpOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKHgsIHRoaXMueSwgdGhpcy56KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29weSB3aXRoIGEgZGlmZmVyZW50IFkgY29vcmRpbmF0ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBZIGNvb3JkaW5hdGUuXG4gICAgICogQHJldHVybnMge3RoaXN9IEEgbmV3IHZlY3RvcjsgdGhpcyBvbmUgaXMgbGVmdCBhbG9uZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBtb3ZlZCA9IHZlY3Rvci53aXRoWSgxMCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHdpdGhZKHk6IG51bWJlcik6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGUodGhpcy54LCB5LCB0aGlzLnopO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb3B5IHdpdGggYSBkaWZmZXJlbnQgWiBjb29yZGluYXRlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIFogY29vcmRpbmF0ZS5cbiAgICAgKiBAcmV0dXJucyB7dGhpc30gQSBuZXcgdmVjdG9yOyB0aGlzIG9uZSBpcyBsZWZ0IGFsb25lLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG1vdmVkID0gdmVjdG9yLndpdGhaKDEwKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgd2l0aFooejogbnVtYmVyKTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZSh0aGlzLngsIHRoaXMueSwgeik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB5IGNvb3JkaW5hdGUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIHkgY29vcmRpbmF0ZSdzIHZhbHVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRZKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyBWZWN0b3IzIHdpdGggZWFjaCBjb21wb25lbnQgcm91bmRlZCBkb3duIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuXG4gICAgICogQHJldHVybnMge3RoaXN9IEEgbmV3IHZlY3RvciB3aXRoIHJvdW5kZWQgZG93biBjb21wb25lbnRzLlxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBmbG9vcigpOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKE1hdGguZmxvb3IodGhpcy54KSwgTWF0aC5mbG9vcih0aGlzLnkpLCBNYXRoLmZsb29yKHRoaXMueikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcgVmVjdG9yMyB3aXRoIGVhY2ggY29tcG9uZW50IHRydW5jYXRlZCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLlxuICAgICAqIEByZXR1cm5zIHt0aGlzfSBBIG5ldyB2ZWN0b3Igd2l0aCB0cnVuY2F0ZWQgYXhpcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgdHJ1bmMoKTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZShNYXRoLnRydW5jKHRoaXMueCksIE1hdGgudHJ1bmModGhpcy55KSwgTWF0aC50cnVuYyh0aGlzLnopKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlIGFuIGluc3RhbmNlIG9mIGBWZWN0b3IzYCB3aXRoIGFub3RoZXIuXG4gICAgICogQHBhcmFtIHtWZWN0b3IzfSB2ZWN0b3IgLSBUaGUgYFZlY3RvcjNgIHRvIGNvbXBhcmUgdG8uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGV5J3JlIGVxdWFsIG90aGVyd2lzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBlcXVhbHModmVjdG9yOiBWZWN0b3IzKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnggPT09IHZlY3Rvci54ICYmIHRoaXMueSA9PT0gdmVjdG9yLnkgJiYgdGhpcy56ID09PSB2ZWN0b3IuejtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3F1YXJlZCBkaXN0YW5jZSB0byBhbm90aGVyIHZlY3Rvci5cbiAgICAgKlxuICAgICAqIFNxdWFyZWQsIGFuZCBvZmZlcmVkIGZpcnN0LCBiZWNhdXNlIGFsbW9zdCBldmVyeSBjYWxsZXIgY29tcGFyZXMgYSBkaXN0YW5jZSBhZ2FpbnN0XG4gICAgICogYW5vdGhlciBkaXN0YW5jZSAtIGFuZCBhIGNvbXBhcmlzb24gb2Ygc3F1YXJlcyBnaXZlcyB0aGUgc2FtZSBhbnN3ZXIgd2l0aG91dCB0aGUgc3F1YXJlXG4gICAgICogcm9vdC4gUHJlZmVyIHRoaXMgdG8ge0BsaW5rIFZlY3RvcjMuZGlzdGFuY2VUb30gd2hlcmV2ZXIgdGhlIG51bWJlciBpdHNlbGYgaXMgbm90IHNob3duXG4gICAgICogdG8gYW55b25lLlxuICAgICAqIEBwYXJhbSB7VmVjdG9yM30gdmVjdG9yIC0gVGhlIHZlY3RvciB0byBtZWFzdXJlIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBzcXVhcmVkIGRpc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGlmIChhLmRpc3RhbmNlU3F1YXJlZFRvKGIpIDw9IHJhbmdlICogcmFuZ2UpIHtcbiAgICAgKiAgICAgLy8gd2l0aGluIHJhbmdlLCB3aXRoIG5vIHNxdWFyZSByb290IHRha2VuXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBkaXN0YW5jZVNxdWFyZWRUbyh2ZWN0b3I6IFZlY3RvcjMpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBkeCA9IHRoaXMueCAtIHZlY3Rvci54O1xuICAgICAgICBjb25zdCBkeSA9IHRoaXMueSAtIHZlY3Rvci55O1xuICAgICAgICBjb25zdCBkeiA9IHRoaXMueiAtIHZlY3Rvci56O1xuICAgICAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHkgKyBkeiAqIGR6O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBkaXN0YW5jZSB0byBhbm90aGVyIHZlY3Rvci5cbiAgICAgKiBAcGFyYW0ge1ZlY3RvcjN9IHZlY3RvciAtIFRoZSB2ZWN0b3IgdG8gbWVhc3VyZSB0by5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgZGlzdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbWV0cmVzID0gcGxheWVyLmdldFBvc2l0aW9uKCkuZGlzdGFuY2VUbyh0YXJnZXQuZ2V0UG9zaXRpb24oKSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGRpc3RhbmNlVG8odmVjdG9yOiBWZWN0b3IzKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlU3F1YXJlZFRvKHZlY3RvcikpO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUtBLElBQWEsVUFBYixNQUFhLGdCQUFnQixnQkFBQSxRQUFRO0NBb0JWOzs7O0NBaEJ2QixXQUFrQixPQUFnQjtFQUM5QixPQUFPLElBQUksUUFBUSxHQUFHLEdBQUcsQ0FBQztDQUM5Qjs7Ozs7Ozs7Ozs7Q0FZQSxZQUNJLEdBQ0EsR0FDQSxHQUNGO0VBQ0UsTUFBTSxHQUFHLENBQUM7RUFIUyxLQUFBLElBQUE7Q0FJdkI7Q0FFQSxXQUEwQjtFQUN0QixPQUFPLFFBQVEsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLFdBQVcsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLFdBQVcsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFO0NBQy9GOzs7Ozs7Q0FPQSxPQUFjLFdBQVcsRUFBRSxHQUFHLEdBQUcsS0FBbUQ7RUFDaEYsT0FBTyxJQUFJLFFBQVEsR0FBRyxHQUFHLENBQUM7Q0FDOUI7Ozs7Ozs7Ozs7OztDQWFBLE9BQWlCLEdBQVcsR0FBVyxHQUFpQjtFQUNwRCxPQUFPLElBQUssS0FBSyxZQUE4RCxHQUFHLEdBQUcsQ0FBQztDQUMxRjs7Ozs7Ozs7OztDQVdBLE1BQXNCLEdBQWlCO0VBQ25DLE9BQU8sS0FBSyxPQUFPLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQztDQUN4Qzs7Ozs7Ozs7OztDQVdBLE1BQWEsR0FBaUI7RUFDMUIsT0FBTyxLQUFLLE9BQU8sS0FBSyxHQUFHLEdBQUcsS0FBSyxDQUFDO0NBQ3hDOzs7Ozs7Ozs7O0NBV0EsTUFBc0IsR0FBaUI7RUFDbkMsT0FBTyxLQUFLLE9BQU8sS0FBSyxHQUFHLEtBQUssR0FBRyxDQUFDO0NBQ3hDOzs7OztDQU1BLE9BQXNCO0VBQ2xCLE9BQU8sS0FBSztDQUNoQjs7Ozs7Q0FNQSxRQUE4QjtFQUMxQixPQUFPLEtBQUssT0FBTyxLQUFLLE1BQU0sS0FBSyxDQUFDLEdBQUcsS0FBSyxNQUFNLEtBQUssQ0FBQyxHQUFHLEtBQUssTUFBTSxLQUFLLENBQUMsQ0FBQztDQUNqRjs7Ozs7Q0FNQSxRQUE4QjtFQUMxQixPQUFPLEtBQUssT0FBTyxLQUFLLE1BQU0sS0FBSyxDQUFDLEdBQUcsS0FBSyxNQUFNLEtBQUssQ0FBQyxHQUFHLEtBQUssTUFBTSxLQUFLLENBQUMsQ0FBQztDQUNqRjs7Ozs7O0NBT0EsT0FBdUIsUUFBMEI7RUFDN0MsT0FBTyxLQUFLLE1BQU0sT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU87Q0FDM0U7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBa0JBLGtCQUF5QixRQUF5QjtFQUM5QyxNQUFNLEtBQUssS0FBSyxJQUFJLE9BQU87RUFDM0IsTUFBTSxLQUFLLEtBQUssSUFBSSxPQUFPO0VBQzNCLE1BQU0sS0FBSyxLQUFLLElBQUksT0FBTztFQUMzQixPQUFPLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSztDQUNwQzs7Ozs7Ozs7OztDQVdBLFdBQWtCLFFBQXlCO0VBQ3ZDLE9BQU8sS0FBSyxLQUFLLEtBQUssa0JBQWtCLE1BQU0sQ0FBQztDQUNuRDtBQUNKIn0=
package/dist/Vector3.d.ts CHANGED
@@ -3,7 +3,7 @@ import { Vector2 } from './Vector2';
3
3
  * 3D Vector.
4
4
  */
5
5
  export declare class Vector3 extends Vector2 {
6
- protected y: number;
6
+ protected readonly y: number;
7
7
  /**
8
8
  * Returns a Vector3 with 0 on all axis.
9
9
  */
@@ -31,14 +31,47 @@ export declare class Vector3 extends Vector2 {
31
31
  z: number;
32
32
  }): Vector3;
33
33
  /**
34
- * Set the Y coordinate.
34
+ * Builds another instance of whatever class this actually is, from raw coordinates.
35
+ *
36
+ * Every method that derives a new vector goes through here, so a subclass keeps its own
37
+ * type instead of decaying to a plain `Vector3` - and a subclass carrying extra state,
38
+ * such as a position carrying its world, gets one place to reattach it.
39
+ * @param {number} x - The X coordinate.
40
+ * @param {number} y - The Y coordinate.
41
+ * @param {number} z - The Z coordinate.
42
+ * @returns {this} A new instance of the concrete class.
43
+ */
44
+ protected create(x: number, y: number, z: number): this;
45
+ /**
46
+ * Returns a copy with a different X coordinate.
47
+ * @param {number} x - The X coordinate.
48
+ * @returns {this} A new vector; this one is left alone.
49
+ * @example
50
+ * ```typescript
51
+ * const moved = vector.withX(10);
52
+ * ```
53
+ */
54
+ withX(x: number): this;
55
+ /**
56
+ * Returns a copy with a different Y coordinate.
35
57
  * @param {number} y - The Y coordinate.
58
+ * @returns {this} A new vector; this one is left alone.
36
59
  * @example
37
60
  * ```typescript
38
- * entity.setY(10);
61
+ * const moved = vector.withY(10);
39
62
  * ```
40
63
  */
41
- setY(y: number): void;
64
+ withY(y: number): this;
65
+ /**
66
+ * Returns a copy with a different Z coordinate.
67
+ * @param {number} z - The Z coordinate.
68
+ * @returns {this} A new vector; this one is left alone.
69
+ * @example
70
+ * ```typescript
71
+ * const moved = vector.withZ(10);
72
+ * ```
73
+ */
74
+ withZ(z: number): this;
42
75
  /**
43
76
  * Get the y coordinate.
44
77
  * @returns {number} The y coordinate's value.
@@ -46,19 +79,46 @@ export declare class Vector3 extends Vector2 {
46
79
  getY(): number;
47
80
  /**
48
81
  * Returns a new Vector3 with each component rounded down to the nearest integer.
49
- * @returns {Vector3} A new Vector3 with rounded down components.
82
+ * @returns {this} A new vector with rounded down components.
50
83
  */
51
- floor(): Vector3;
84
+ floor(): this;
52
85
  /**
53
86
  * Returns a new Vector3 with each component truncated to the nearest integer.
54
- * @returns {Vector3} A new Vector3 with truncated axis.
87
+ * @returns {this} A new vector with truncated axis.
55
88
  */
56
- trunc(): Vector3;
89
+ trunc(): this;
57
90
  /**
58
91
  * Compare an instance of `Vector3` with another.
59
92
  * @param {Vector3} vector - The `Vector3` to compare to.
60
93
  * @returns {boolean} `true` if they're equal otherwise `false`.
61
94
  */
62
- equals(vector: typeof this): boolean;
95
+ equals(vector: Vector3): boolean;
96
+ /**
97
+ * The squared distance to another vector.
98
+ *
99
+ * Squared, and offered first, because almost every caller compares a distance against
100
+ * another distance - and a comparison of squares gives the same answer without the square
101
+ * root. Prefer this to {@link Vector3.distanceTo} wherever the number itself is not shown
102
+ * to anyone.
103
+ * @param {Vector3} vector - The vector to measure to.
104
+ * @returns {number} The squared distance.
105
+ * @example
106
+ * ```typescript
107
+ * if (a.distanceSquaredTo(b) <= range * range) {
108
+ * // within range, with no square root taken
109
+ * }
110
+ * ```
111
+ */
112
+ distanceSquaredTo(vector: Vector3): number;
113
+ /**
114
+ * The distance to another vector.
115
+ * @param {Vector3} vector - The vector to measure to.
116
+ * @returns {number} The distance.
117
+ * @example
118
+ * ```typescript
119
+ * const metres = player.getPosition().distanceTo(target.getPosition());
120
+ * ```
121
+ */
122
+ distanceTo(vector: Vector3): number;
63
123
  }
64
124
  //# sourceMappingURL=Vector3.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Vector3.d.ts","sourceRoot":"","sources":["../src/Vector3.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;GAEG;AACH,qBAAa,OAAQ,SAAQ,OAAO;IAoB5B,SAAS,CAAC,CAAC,EAAE,MAAM;IAnBvB;;OAEG;IACH,WAAkB,IAAI,IAAI,OAAO,CAEhC;IAED;;;;;;;;;OASG;gBAEC,CAAC,EAAE,MAAM,EACC,CAAC,EAAE,MAAM,EACnB,CAAC,EAAE,MAAM;IAKN,QAAQ,IAAI,MAAM;IAIzB;;;;OAIG;WACW,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO;IAInF;;;;;;;OAOG;IACI,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAI5B;;;OAGG;IACI,IAAI,IAAI,MAAM;IAIrB;;;OAGG;IACI,KAAK,IAAI,OAAO;IAIvB;;;OAGG;IACI,KAAK,IAAI,OAAO;IAIvB;;;;OAIG;IACI,MAAM,CAAC,MAAM,EAAE,OAAO,IAAI,GAAG,OAAO;CAG9C"}
1
+ {"version":3,"file":"Vector3.d.ts","sourceRoot":"","sources":["../src/Vector3.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;GAEG;AACH,qBAAa,OAAQ,SAAQ,OAAO;IAoB5B,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM;IAnBhC;;OAEG;IACH,WAAkB,IAAI,IAAI,OAAO,CAEhC;IAED;;;;;;;;;OASG;gBAEC,CAAC,EAAE,MAAM,EACU,CAAC,EAAE,MAAM,EAC5B,CAAC,EAAE,MAAM;IAKN,QAAQ,IAAI,MAAM;IAIzB;;;;OAIG;WACW,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO;IAInF;;;;;;;;;;OAUG;IACH,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAIvD;;;;;;;;OAQG;IACa,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAItC;;;;;;;;OAQG;IACI,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAI7B;;;;;;;;OAQG;IACa,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAItC;;;OAGG;IACI,IAAI,IAAI,MAAM;IAIrB;;;OAGG;IACa,KAAK,IAAI,IAAI;IAI7B;;;OAGG;IACa,KAAK,IAAI,IAAI;IAI7B;;;;OAIG;IACa,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO;IAIhD;;;;;;;;;;;;;;;OAeG;IACI,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM;IAOjD;;;;;;;;OAQG;IACI,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM;CAG7C"}
@@ -37,15 +37,54 @@ var Vector3 = class Vector3 extends Vector2 {
37
37
  return new Vector3(x, y, z);
38
38
  }
39
39
  /**
40
- * Set the Y coordinate.
40
+ * Builds another instance of whatever class this actually is, from raw coordinates.
41
+ *
42
+ * Every method that derives a new vector goes through here, so a subclass keeps its own
43
+ * type instead of decaying to a plain `Vector3` - and a subclass carrying extra state,
44
+ * such as a position carrying its world, gets one place to reattach it.
45
+ * @param {number} x - The X coordinate.
41
46
  * @param {number} y - The Y coordinate.
47
+ * @param {number} z - The Z coordinate.
48
+ * @returns {this} A new instance of the concrete class.
49
+ */
50
+ create(x, y, z) {
51
+ return new this.constructor(x, y, z);
52
+ }
53
+ /**
54
+ * Returns a copy with a different X coordinate.
55
+ * @param {number} x - The X coordinate.
56
+ * @returns {this} A new vector; this one is left alone.
42
57
  * @example
43
58
  * ```typescript
44
- * entity.setY(10);
59
+ * const moved = vector.withX(10);
45
60
  * ```
46
61
  */
47
- setY(y) {
48
- this.y = y;
62
+ withX(x) {
63
+ return this.create(x, this.y, this.z);
64
+ }
65
+ /**
66
+ * Returns a copy with a different Y coordinate.
67
+ * @param {number} y - The Y coordinate.
68
+ * @returns {this} A new vector; this one is left alone.
69
+ * @example
70
+ * ```typescript
71
+ * const moved = vector.withY(10);
72
+ * ```
73
+ */
74
+ withY(y) {
75
+ return this.create(this.x, y, this.z);
76
+ }
77
+ /**
78
+ * Returns a copy with a different Z coordinate.
79
+ * @param {number} z - The Z coordinate.
80
+ * @returns {this} A new vector; this one is left alone.
81
+ * @example
82
+ * ```typescript
83
+ * const moved = vector.withZ(10);
84
+ * ```
85
+ */
86
+ withZ(z) {
87
+ return this.create(this.x, this.y, z);
49
88
  }
50
89
  /**
51
90
  * Get the y coordinate.
@@ -56,17 +95,17 @@ var Vector3 = class Vector3 extends Vector2 {
56
95
  }
57
96
  /**
58
97
  * Returns a new Vector3 with each component rounded down to the nearest integer.
59
- * @returns {Vector3} A new Vector3 with rounded down components.
98
+ * @returns {this} A new vector with rounded down components.
60
99
  */
61
100
  floor() {
62
- return new Vector3(Math.floor(this.x), Math.floor(this.y), Math.floor(this.z));
101
+ return this.create(Math.floor(this.x), Math.floor(this.y), Math.floor(this.z));
63
102
  }
64
103
  /**
65
104
  * Returns a new Vector3 with each component truncated to the nearest integer.
66
- * @returns {Vector3} A new Vector3 with truncated axis.
105
+ * @returns {this} A new vector with truncated axis.
67
106
  */
68
107
  trunc() {
69
- return new Vector3(Math.trunc(this.x), Math.trunc(this.y), Math.trunc(this.z));
108
+ return this.create(Math.trunc(this.x), Math.trunc(this.y), Math.trunc(this.z));
70
109
  }
71
110
  /**
72
111
  * Compare an instance of `Vector3` with another.
@@ -74,10 +113,44 @@ var Vector3 = class Vector3 extends Vector2 {
74
113
  * @returns {boolean} `true` if they're equal otherwise `false`.
75
114
  */
76
115
  equals(vector) {
77
- return JSON.stringify(this) === JSON.stringify(vector);
116
+ return this.x === vector.x && this.y === vector.y && this.z === vector.z;
117
+ }
118
+ /**
119
+ * The squared distance to another vector.
120
+ *
121
+ * Squared, and offered first, because almost every caller compares a distance against
122
+ * another distance - and a comparison of squares gives the same answer without the square
123
+ * root. Prefer this to {@link Vector3.distanceTo} wherever the number itself is not shown
124
+ * to anyone.
125
+ * @param {Vector3} vector - The vector to measure to.
126
+ * @returns {number} The squared distance.
127
+ * @example
128
+ * ```typescript
129
+ * if (a.distanceSquaredTo(b) <= range * range) {
130
+ * // within range, with no square root taken
131
+ * }
132
+ * ```
133
+ */
134
+ distanceSquaredTo(vector) {
135
+ const dx = this.x - vector.x;
136
+ const dy = this.y - vector.y;
137
+ const dz = this.z - vector.z;
138
+ return dx * dx + dy * dy + dz * dz;
139
+ }
140
+ /**
141
+ * The distance to another vector.
142
+ * @param {Vector3} vector - The vector to measure to.
143
+ * @returns {number} The distance.
144
+ * @example
145
+ * ```typescript
146
+ * const metres = player.getPosition().distanceTo(target.getPosition());
147
+ * ```
148
+ */
149
+ distanceTo(vector) {
150
+ return Math.sqrt(this.distanceSquaredTo(vector));
78
151
  }
79
152
  };
80
153
  //#endregion
81
154
  export { Vector3 };
82
155
 
83
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmVjdG9yMy5lcy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvVmVjdG9yMy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi9WZWN0b3IyJztcblxuLyoqXG4gKiAzRCBWZWN0b3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBWZWN0b3IzIGV4dGVuZHMgVmVjdG9yMiB7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIFZlY3RvcjMgd2l0aCAwIG9uIGFsbCBheGlzLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IFpFUk8oKTogVmVjdG9yMyB7XG4gICAgICAgIHJldHVybiBuZXcgVmVjdG9yMygwLCAwLCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgYFZlY3RvcjNgIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIFggY29vcmRpbmF0ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBZIGNvb3JkaW5hdGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgWiBjb29yZGluYXRlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHZlY3RvciA9IG5ldyBWZWN0b3IzKDEwLCAyMCwgMzApO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgeDogbnVtYmVyLFxuICAgICAgICBwcm90ZWN0ZWQgeTogbnVtYmVyLFxuICAgICAgICB6OiBudW1iZXJcbiAgICApIHtcbiAgICAgICAgc3VwZXIoeCwgeik7XG4gICAgfVxuXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgeDogwqdiJHt0aGlzLngudG9GaXhlZCgyKX3Cp3IsIHk6IMKnYiR7dGhpcy55LnRvRml4ZWQoMil9wqdyLCB6OiDCp2Ike3RoaXMuei50b0ZpeGVkKDIpfcKncmA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBWZWN0b3IzIGluc3RhbmNlIGZyb20gYW4gb2JqZWN0IHdpdGggeCwgeSwgYW5kIHogcHJvcGVydGllcy5cbiAgICAgKiBAcGFyYW0gb2JqIC0gVGhlIG9iamVjdCBjb250YWluaW5nIHgsIHksIGFuZCB6IHByb3BlcnRpZXMuXG4gICAgICogQHJldHVybnMge1ZlY3RvcjN9IEEgbmV3IFZlY3RvcjMgaW5zdGFuY2UuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBmcm9tT2JqZWN0KHsgeCwgeSwgeiB9OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfSk6IFZlY3RvcjMge1xuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjMoeCwgeSwgeik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBZIGNvb3JkaW5hdGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgWSBjb29yZGluYXRlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGVudGl0eS5zZXRZKDEwKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0WSh5OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHkgY29vcmRpbmF0ZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgeSBjb29yZGluYXRlJ3MgdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIGdldFkoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IFZlY3RvcjMgd2l0aCBlYWNoIGNvbXBvbmVudCByb3VuZGVkIGRvd24gdG8gdGhlIG5lYXJlc3QgaW50ZWdlci5cbiAgICAgKiBAcmV0dXJucyB7VmVjdG9yM30gQSBuZXcgVmVjdG9yMyB3aXRoIHJvdW5kZWQgZG93biBjb21wb25lbnRzLlxuICAgICAqL1xuICAgIHB1YmxpYyBmbG9vcigpOiBWZWN0b3IzIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IzKE1hdGguZmxvb3IodGhpcy54KSwgTWF0aC5mbG9vcih0aGlzLnkpLCBNYXRoLmZsb29yKHRoaXMueikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcgVmVjdG9yMyB3aXRoIGVhY2ggY29tcG9uZW50IHRydW5jYXRlZCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLlxuICAgICAqIEByZXR1cm5zIHtWZWN0b3IzfSBBIG5ldyBWZWN0b3IzIHdpdGggdHJ1bmNhdGVkIGF4aXMuXG4gICAgICovXG4gICAgcHVibGljIHRydW5jKCk6IFZlY3RvcjMge1xuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjMoTWF0aC50cnVuYyh0aGlzLngpLCBNYXRoLnRydW5jKHRoaXMueSksIE1hdGgudHJ1bmModGhpcy56KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZSBhbiBpbnN0YW5jZSBvZiBgVmVjdG9yM2Agd2l0aCBhbm90aGVyLlxuICAgICAqIEBwYXJhbSB7VmVjdG9yM30gdmVjdG9yIC0gVGhlIGBWZWN0b3IzYCB0byBjb21wYXJlIHRvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhleSdyZSBlcXVhbCBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZXF1YWxzKHZlY3RvcjogdHlwZW9mIHRoaXMpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMpID09PSBKU09OLnN0cmluZ2lmeSh2ZWN0b3IpO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFLQSxJQUFhLFVBQWIsTUFBYSxnQkFBZ0IsUUFBUTtDQW9CbkI7Ozs7Q0FoQmQsV0FBa0IsT0FBZ0I7RUFDOUIsT0FBTyxJQUFJLFFBQVEsR0FBRyxHQUFHLENBQUM7Q0FDOUI7Ozs7Ozs7Ozs7O0NBWUEsWUFDSSxHQUNBLEdBQ0EsR0FDRjtFQUNFLE1BQU0sR0FBRyxDQUFDO0VBSEEsS0FBQSxJQUFBO0NBSWQ7Q0FFQSxXQUEwQjtFQUN0QixPQUFPLFFBQVEsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLFdBQVcsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLFdBQVcsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFO0NBQy9GOzs7Ozs7Q0FPQSxPQUFjLFdBQVcsRUFBRSxHQUFHLEdBQUcsS0FBbUQ7RUFDaEYsT0FBTyxJQUFJLFFBQVEsR0FBRyxHQUFHLENBQUM7Q0FDOUI7Ozs7Ozs7OztDQVVBLEtBQVksR0FBaUI7RUFDekIsS0FBSyxJQUFJO0NBQ2I7Ozs7O0NBTUEsT0FBc0I7RUFDbEIsT0FBTyxLQUFLO0NBQ2hCOzs7OztDQU1BLFFBQXdCO0VBQ3BCLE9BQU8sSUFBSSxRQUFRLEtBQUssTUFBTSxLQUFLLENBQUMsR0FBRyxLQUFLLE1BQU0sS0FBSyxDQUFDLEdBQUcsS0FBSyxNQUFNLEtBQUssQ0FBQyxDQUFDO0NBQ2pGOzs7OztDQU1BLFFBQXdCO0VBQ3BCLE9BQU8sSUFBSSxRQUFRLEtBQUssTUFBTSxLQUFLLENBQUMsR0FBRyxLQUFLLE1BQU0sS0FBSyxDQUFDLEdBQUcsS0FBSyxNQUFNLEtBQUssQ0FBQyxDQUFDO0NBQ2pGOzs7Ozs7Q0FPQSxPQUFjLFFBQThCO0VBQ3hDLE9BQU8sS0FBSyxVQUFVLElBQUksTUFBTSxLQUFLLFVBQVUsTUFBTTtDQUN6RDtBQUNKIn0=
156
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmVjdG9yMy5lcy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvVmVjdG9yMy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi9WZWN0b3IyJztcblxuLyoqXG4gKiAzRCBWZWN0b3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBWZWN0b3IzIGV4dGVuZHMgVmVjdG9yMiB7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIFZlY3RvcjMgd2l0aCAwIG9uIGFsbCBheGlzLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IFpFUk8oKTogVmVjdG9yMyB7XG4gICAgICAgIHJldHVybiBuZXcgVmVjdG9yMygwLCAwLCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgYFZlY3RvcjNgIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIFggY29vcmRpbmF0ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBZIGNvb3JkaW5hdGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgWiBjb29yZGluYXRlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHZlY3RvciA9IG5ldyBWZWN0b3IzKDEwLCAyMCwgMzApO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgeDogbnVtYmVyLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgeTogbnVtYmVyLFxuICAgICAgICB6OiBudW1iZXJcbiAgICApIHtcbiAgICAgICAgc3VwZXIoeCwgeik7XG4gICAgfVxuXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgeDogwqdiJHt0aGlzLngudG9GaXhlZCgyKX3Cp3IsIHk6IMKnYiR7dGhpcy55LnRvRml4ZWQoMil9wqdyLCB6OiDCp2Ike3RoaXMuei50b0ZpeGVkKDIpfcKncmA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBWZWN0b3IzIGluc3RhbmNlIGZyb20gYW4gb2JqZWN0IHdpdGggeCwgeSwgYW5kIHogcHJvcGVydGllcy5cbiAgICAgKiBAcGFyYW0gb2JqIC0gVGhlIG9iamVjdCBjb250YWluaW5nIHgsIHksIGFuZCB6IHByb3BlcnRpZXMuXG4gICAgICogQHJldHVybnMge1ZlY3RvcjN9IEEgbmV3IFZlY3RvcjMgaW5zdGFuY2UuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBmcm9tT2JqZWN0KHsgeCwgeSwgeiB9OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfSk6IFZlY3RvcjMge1xuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjMoeCwgeSwgeik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIGFub3RoZXIgaW5zdGFuY2Ugb2Ygd2hhdGV2ZXIgY2xhc3MgdGhpcyBhY3R1YWxseSBpcywgZnJvbSByYXcgY29vcmRpbmF0ZXMuXG4gICAgICpcbiAgICAgKiBFdmVyeSBtZXRob2QgdGhhdCBkZXJpdmVzIGEgbmV3IHZlY3RvciBnb2VzIHRocm91Z2ggaGVyZSwgc28gYSBzdWJjbGFzcyBrZWVwcyBpdHMgb3duXG4gICAgICogdHlwZSBpbnN0ZWFkIG9mIGRlY2F5aW5nIHRvIGEgcGxhaW4gYFZlY3RvcjNgIC0gYW5kIGEgc3ViY2xhc3MgY2FycnlpbmcgZXh0cmEgc3RhdGUsXG4gICAgICogc3VjaCBhcyBhIHBvc2l0aW9uIGNhcnJ5aW5nIGl0cyB3b3JsZCwgZ2V0cyBvbmUgcGxhY2UgdG8gcmVhdHRhY2ggaXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgWCBjb29yZGluYXRlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIFkgY29vcmRpbmF0ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSBaIGNvb3JkaW5hdGUuXG4gICAgICogQHJldHVybnMge3RoaXN9IEEgbmV3IGluc3RhbmNlIG9mIHRoZSBjb25jcmV0ZSBjbGFzcy5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY3JlYXRlKHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIpOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIG5ldyAodGhpcy5jb25zdHJ1Y3RvciBhcyBuZXcgKHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIpID0+IHRoaXMpKHgsIHksIHopO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb3B5IHdpdGggYSBkaWZmZXJlbnQgWCBjb29yZGluYXRlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIFggY29vcmRpbmF0ZS5cbiAgICAgKiBAcmV0dXJucyB7dGhpc30gQSBuZXcgdmVjdG9yOyB0aGlzIG9uZSBpcyBsZWZ0IGFsb25lLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG1vdmVkID0gdmVjdG9yLndpdGhYKDEwKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgd2l0aFgoeDogbnVtYmVyKTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZSh4LCB0aGlzLnksIHRoaXMueik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgd2l0aCBhIGRpZmZlcmVudCBZIGNvb3JkaW5hdGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgWSBjb29yZGluYXRlLlxuICAgICAqIEByZXR1cm5zIHt0aGlzfSBBIG5ldyB2ZWN0b3I7IHRoaXMgb25lIGlzIGxlZnQgYWxvbmUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbW92ZWQgPSB2ZWN0b3Iud2l0aFkoMTApO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoWSh5OiBudW1iZXIpOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKHRoaXMueCwgeSwgdGhpcy56KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29weSB3aXRoIGEgZGlmZmVyZW50IFogY29vcmRpbmF0ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSBaIGNvb3JkaW5hdGUuXG4gICAgICogQHJldHVybnMge3RoaXN9IEEgbmV3IHZlY3RvcjsgdGhpcyBvbmUgaXMgbGVmdCBhbG9uZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBtb3ZlZCA9IHZlY3Rvci53aXRoWigxMCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIHdpdGhaKHo6IG51bWJlcik6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGUodGhpcy54LCB0aGlzLnksIHopO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgeSBjb29yZGluYXRlLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSB5IGNvb3JkaW5hdGUncyB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0WSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy55O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcgVmVjdG9yMyB3aXRoIGVhY2ggY29tcG9uZW50IHJvdW5kZWQgZG93biB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLlxuICAgICAqIEByZXR1cm5zIHt0aGlzfSBBIG5ldyB2ZWN0b3Igd2l0aCByb3VuZGVkIGRvd24gY29tcG9uZW50cy5cbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZmxvb3IoKTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZShNYXRoLmZsb29yKHRoaXMueCksIE1hdGguZmxvb3IodGhpcy55KSwgTWF0aC5mbG9vcih0aGlzLnopKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IFZlY3RvcjMgd2l0aCBlYWNoIGNvbXBvbmVudCB0cnVuY2F0ZWQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci5cbiAgICAgKiBAcmV0dXJucyB7dGhpc30gQSBuZXcgdmVjdG9yIHdpdGggdHJ1bmNhdGVkIGF4aXMuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIHRydW5jKCk6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGUoTWF0aC50cnVuYyh0aGlzLngpLCBNYXRoLnRydW5jKHRoaXMueSksIE1hdGgudHJ1bmModGhpcy56KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZSBhbiBpbnN0YW5jZSBvZiBgVmVjdG9yM2Agd2l0aCBhbm90aGVyLlxuICAgICAqIEBwYXJhbSB7VmVjdG9yM30gdmVjdG9yIC0gVGhlIGBWZWN0b3IzYCB0byBjb21wYXJlIHRvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhleSdyZSBlcXVhbCBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZXF1YWxzKHZlY3RvcjogVmVjdG9yMyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy54ID09PSB2ZWN0b3IueCAmJiB0aGlzLnkgPT09IHZlY3Rvci55ICYmIHRoaXMueiA9PT0gdmVjdG9yLno7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHNxdWFyZWQgZGlzdGFuY2UgdG8gYW5vdGhlciB2ZWN0b3IuXG4gICAgICpcbiAgICAgKiBTcXVhcmVkLCBhbmQgb2ZmZXJlZCBmaXJzdCwgYmVjYXVzZSBhbG1vc3QgZXZlcnkgY2FsbGVyIGNvbXBhcmVzIGEgZGlzdGFuY2UgYWdhaW5zdFxuICAgICAqIGFub3RoZXIgZGlzdGFuY2UgLSBhbmQgYSBjb21wYXJpc29uIG9mIHNxdWFyZXMgZ2l2ZXMgdGhlIHNhbWUgYW5zd2VyIHdpdGhvdXQgdGhlIHNxdWFyZVxuICAgICAqIHJvb3QuIFByZWZlciB0aGlzIHRvIHtAbGluayBWZWN0b3IzLmRpc3RhbmNlVG99IHdoZXJldmVyIHRoZSBudW1iZXIgaXRzZWxmIGlzIG5vdCBzaG93blxuICAgICAqIHRvIGFueW9uZS5cbiAgICAgKiBAcGFyYW0ge1ZlY3RvcjN9IHZlY3RvciAtIFRoZSB2ZWN0b3IgdG8gbWVhc3VyZSB0by5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgc3F1YXJlZCBkaXN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBpZiAoYS5kaXN0YW5jZVNxdWFyZWRUbyhiKSA8PSByYW5nZSAqIHJhbmdlKSB7XG4gICAgICogICAgIC8vIHdpdGhpbiByYW5nZSwgd2l0aCBubyBzcXVhcmUgcm9vdCB0YWtlblxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzdGFuY2VTcXVhcmVkVG8odmVjdG9yOiBWZWN0b3IzKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgZHggPSB0aGlzLnggLSB2ZWN0b3IueDtcbiAgICAgICAgY29uc3QgZHkgPSB0aGlzLnkgLSB2ZWN0b3IueTtcbiAgICAgICAgY29uc3QgZHogPSB0aGlzLnogLSB2ZWN0b3IuejtcbiAgICAgICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5ICsgZHogKiBkejtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGlzdGFuY2UgdG8gYW5vdGhlciB2ZWN0b3IuXG4gICAgICogQHBhcmFtIHtWZWN0b3IzfSB2ZWN0b3IgLSBUaGUgdmVjdG9yIHRvIG1lYXN1cmUgdG8uXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIGRpc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG1ldHJlcyA9IHBsYXllci5nZXRQb3NpdGlvbigpLmRpc3RhbmNlVG8odGFyZ2V0LmdldFBvc2l0aW9uKCkpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBkaXN0YW5jZVRvKHZlY3RvcjogVmVjdG9yMyk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVNxdWFyZWRUbyh2ZWN0b3IpKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBS0EsSUFBYSxVQUFiLE1BQWEsZ0JBQWdCLFFBQVE7Q0FvQlY7Ozs7Q0FoQnZCLFdBQWtCLE9BQWdCO0VBQzlCLE9BQU8sSUFBSSxRQUFRLEdBQUcsR0FBRyxDQUFDO0NBQzlCOzs7Ozs7Ozs7OztDQVlBLFlBQ0ksR0FDQSxHQUNBLEdBQ0Y7RUFDRSxNQUFNLEdBQUcsQ0FBQztFQUhTLEtBQUEsSUFBQTtDQUl2QjtDQUVBLFdBQTBCO0VBQ3RCLE9BQU8sUUFBUSxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUUsV0FBVyxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUUsV0FBVyxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUU7Q0FDL0Y7Ozs7OztDQU9BLE9BQWMsV0FBVyxFQUFFLEdBQUcsR0FBRyxLQUFtRDtFQUNoRixPQUFPLElBQUksUUFBUSxHQUFHLEdBQUcsQ0FBQztDQUM5Qjs7Ozs7Ozs7Ozs7O0NBYUEsT0FBaUIsR0FBVyxHQUFXLEdBQWlCO0VBQ3BELE9BQU8sSUFBSyxLQUFLLFlBQThELEdBQUcsR0FBRyxDQUFDO0NBQzFGOzs7Ozs7Ozs7O0NBV0EsTUFBc0IsR0FBaUI7RUFDbkMsT0FBTyxLQUFLLE9BQU8sR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDO0NBQ3hDOzs7Ozs7Ozs7O0NBV0EsTUFBYSxHQUFpQjtFQUMxQixPQUFPLEtBQUssT0FBTyxLQUFLLEdBQUcsR0FBRyxLQUFLLENBQUM7Q0FDeEM7Ozs7Ozs7Ozs7Q0FXQSxNQUFzQixHQUFpQjtFQUNuQyxPQUFPLEtBQUssT0FBTyxLQUFLLEdBQUcsS0FBSyxHQUFHLENBQUM7Q0FDeEM7Ozs7O0NBTUEsT0FBc0I7RUFDbEIsT0FBTyxLQUFLO0NBQ2hCOzs7OztDQU1BLFFBQThCO0VBQzFCLE9BQU8sS0FBSyxPQUFPLEtBQUssTUFBTSxLQUFLLENBQUMsR0FBRyxLQUFLLE1BQU0sS0FBSyxDQUFDLEdBQUcsS0FBSyxNQUFNLEtBQUssQ0FBQyxDQUFDO0NBQ2pGOzs7OztDQU1BLFFBQThCO0VBQzFCLE9BQU8sS0FBSyxPQUFPLEtBQUssTUFBTSxLQUFLLENBQUMsR0FBRyxLQUFLLE1BQU0sS0FBSyxDQUFDLEdBQUcsS0FBSyxNQUFNLEtBQUssQ0FBQyxDQUFDO0NBQ2pGOzs7Ozs7Q0FPQSxPQUF1QixRQUEwQjtFQUM3QyxPQUFPLEtBQUssTUFBTSxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTztDQUMzRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FrQkEsa0JBQXlCLFFBQXlCO0VBQzlDLE1BQU0sS0FBSyxLQUFLLElBQUksT0FBTztFQUMzQixNQUFNLEtBQUssS0FBSyxJQUFJLE9BQU87RUFDM0IsTUFBTSxLQUFLLEtBQUssSUFBSSxPQUFPO0VBQzNCLE9BQU8sS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLO0NBQ3BDOzs7Ozs7Ozs7O0NBV0EsV0FBa0IsUUFBeUI7RUFDdkMsT0FBTyxLQUFLLEtBQUssS0FBSyxrQkFBa0IsTUFBTSxDQUFDO0NBQ25EO0FBQ0oifQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsprismarine/math",
3
- "version": "0.14.2",
3
+ "version": "0.15.0-unstable-20261024002035",
4
4
  "description": "JSPrismarine math utilities",
5
5
  "sideEffects": false,
6
6
  "publishConfig": {
@@ -50,8 +50,8 @@
50
50
  "vitest": "5.0.1"
51
51
  },
52
52
  "dependencies": {
53
- "@jsprismarine/color-parser": "0.14.2",
54
- "@jsprismarine/jsbinaryutils": "5.5.3"
53
+ "@jsprismarine/binaryutils": "0.15.0-unstable-20261024002035",
54
+ "@jsprismarine/color-parser": "0.15.0-unstable-20261024002035"
55
55
  },
56
56
  "scripts": {
57
57
  "clean": "rimraf dist jsp *.tsbuildinfo vite.config.ts.timestamp-* .tsup .turbo",