@jsprismarine/spawning 0.0.0 → 0.16.0-unstable-20261029140140

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.
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ // src/engineRules.ts
4
+ /** How far into the state a twist step reads its second word. */
5
+ var TWISTER_OFFSET = 397;
6
+ /** The multiplier of the twister's seeding recurrence, Matsumoto and Nishimura's 1812433253. */
7
+ var TWISTER_SEED_MULTIPLIER = 1812433253;
8
+ /** The twist step's tempering matrix. */
9
+ var TWISTER_MATRIX = 2567483615;
10
+ /**
11
+ * The first 32-bit draw of a Mersenne twister seeded with one value.
12
+ *
13
+ * Only the first draw exists because that is all the slime chunk rule takes.
14
+ * The twist of word zero reads words zero, one and {@link TWISTER_OFFSET}, so
15
+ * the seeding recurrence stops one word past the offset rather than filling
16
+ * all 624 words of a full state. Bedrock's own copy stops in the same place.
17
+ */
18
+ var firstTwisterDraw = (seed) => {
19
+ const state = /* @__PURE__ */ new Uint32Array(399);
20
+ state[0] = seed;
21
+ for (let index = 1; index < state.length; index += 1) {
22
+ const previous = state[index - 1];
23
+ state[index] = Math.imul(TWISTER_SEED_MULTIPLIER, previous ^ previous >>> 30) + index >>> 0;
24
+ }
25
+ const mixed = state[0] & 2147483648 | state[1] & 2147483647;
26
+ let draw = state[TWISTER_OFFSET] ^ mixed >>> 1 ^ ((mixed & 1) === 0 ? 0 : TWISTER_MATRIX);
27
+ draw ^= draw >>> 11;
28
+ draw ^= draw << 7 & 2636928640;
29
+ draw ^= draw << 15 & 4022730752;
30
+ draw ^= draw >>> 18;
31
+ return draw >>> 0;
32
+ };
33
+ /**
34
+ * The multiplier Bedrock hashes a chunk's X coordinate by. It is the engine's
35
+ * general-purpose hash multiplier rather than anything about slimes.
36
+ */
37
+ var SLIME_CHUNK_MULTIPLIER = 522133279;
38
+ /** One chunk in ten holds slimes, which is the divisor of the draw. */
39
+ var SLIME_CHUNK_IN = 10;
40
+ /** How many answers {@link isSlimeChunk} keeps before it starts over. */
41
+ var SLIME_CHUNK_MEMO_LIMIT = 4096;
42
+ var slimeChunkMemo = /* @__PURE__ */ new Map();
43
+ /**
44
+ * Whether a chunk is a slime chunk.
45
+ *
46
+ * Bedrock seeds a Mersenne twister with `chunkX * 0x1f1f1f1f ^ chunkZ` and
47
+ * takes its first draw modulo ten. The world seed is not part of it, which is
48
+ * why a Bedrock slime farm sits at the same chunk coordinates in every world
49
+ * and why Java's seeded formula is the wrong answer here.
50
+ *
51
+ * @param chunkX - The chunk's X coordinate, which is a block X shifted right by four.
52
+ * @param chunkZ - The chunk's Z coordinate.
53
+ */
54
+ var isSlimeChunk = (chunkX, chunkZ) => {
55
+ const seed = (Math.imul(chunkX, SLIME_CHUNK_MULTIPLIER) ^ chunkZ) >>> 0;
56
+ const known = slimeChunkMemo.get(seed);
57
+ if (known !== void 0) return known;
58
+ const answer = firstTwisterDraw(seed) % SLIME_CHUNK_IN === 0;
59
+ if (slimeChunkMemo.size >= SLIME_CHUNK_MEMO_LIMIT) slimeChunkMemo.clear();
60
+ slimeChunkMemo.set(seed, answer);
61
+ return answer;
62
+ };
63
+ /** How many ticks one Minecraft day lasts. */
64
+ var DAY_TICKS = 24e3;
65
+ /**
66
+ * How bright the moon is at each of its eight phases, starting at the full
67
+ * moon. The swamp branch of the slime rule draws against this number, so a
68
+ * swamp spawns no slimes at all on a new moon.
69
+ */
70
+ var MOON_BRIGHTNESS = [
71
+ 1,
72
+ .75,
73
+ .5,
74
+ .25,
75
+ 0,
76
+ .25,
77
+ .5,
78
+ .75
79
+ ];
80
+ /**
81
+ * The moon phase at one world time.
82
+ *
83
+ * @param time - The world's age in ticks, which is never negative on a running server.
84
+ * @returns A phase from 0, the full moon, to 7.
85
+ */
86
+ var moonPhase = (time) => Math.abs(Math.trunc(time / DAY_TICKS)) % MOON_BRIGHTNESS.length;
87
+ /** The highest Y at which the slime chunk branch applies. */
88
+ var SLIME_CHUNK_CEILING = 38;
89
+ /** The lowest Y of the swamp branch's band. */
90
+ var SLIME_SWAMP_FLOOR = 50;
91
+ /** The highest Y of the swamp branch's band. */
92
+ var SLIME_SWAMP_CEILING = 68;
93
+ /**
94
+ * The light a swamp slime tolerates, before the extra draw.
95
+ *
96
+ * It is an early exit rather than a second condition: the draw it guards is
97
+ * over `[0, 8)`, so a light above seven already fails it.
98
+ */
99
+ var SLIME_SWAMP_LIGHT_CEILING = 7;
100
+ /** The width of the draw the swamp branch compares the light against. */
101
+ var SLIME_SWAMP_LIGHT_DRAW = 8;
102
+ /**
103
+ * The biome tag the swamp branch reads. Three vanilla biomes carry it:
104
+ * `swampland`, `swampland_mutated` and `mangrove_swamp`.
105
+ */
106
+ var SLIME_SURFACE_BIOME_TAG = "spawns_slimes_on_surface";
107
+ /**
108
+ * Where a slime may spawn, which `spawn_rules/slime.json` does not say.
109
+ *
110
+ * Two branches, as Bedrock writes them. At Y 38 and below the position has to
111
+ * be in a slime chunk and nothing else is asked, which is why a slime farm is
112
+ * dug out rather than lit up. Above that the position has to be in a swamp
113
+ * between Y 50 and Y 68, dark enough, and lucky against the moon phase.
114
+ * Everything in between, and every lit surface, spawns no slimes at all.
115
+ *
116
+ * The one divergence from the Bedrock function is the position the biome tag
117
+ * is read at. Bedrock reads it one block higher than the spawn position; this
118
+ * reads it at the spawn position, because a biome boundary is the only place
119
+ * the two can differ and neither answer is more correct there.
120
+ */
121
+ var slimeSpawnRule = (at, { world, random }) => {
122
+ if (at.y <= SLIME_CHUNK_CEILING) return isSlimeChunk(at.x >> 4, at.z >> 4);
123
+ if (at.y < SLIME_SWAMP_FLOOR || at.y > SLIME_SWAMP_CEILING) return false;
124
+ const light = world.light(at);
125
+ if (light > SLIME_SWAMP_LIGHT_CEILING) return false;
126
+ if (light > random.nextInt(SLIME_SWAMP_LIGHT_DRAW)) return false;
127
+ if (random.nextFloat() >= MOON_BRIGHTNESS[moonPhase(world.age())]) return false;
128
+ return world.biomeTags(at).includes(SLIME_SURFACE_BIOME_TAG);
129
+ };
130
+ /**
131
+ * Every engine rule vanilla needs, keyed by the entity it gates.
132
+ *
133
+ * {@link import('./spawner').Spawner} applies these by default. A host that
134
+ * wants a different set passes its own map, and a host that wants none passes
135
+ * an empty one.
136
+ */
137
+ var VANILLA_ENGINE_SPAWN_RULES = /* @__PURE__ */ new Map([["minecraft:slime", slimeSpawnRule]]);
138
+ exports.MOON_BRIGHTNESS = MOON_BRIGHTNESS;
139
+ exports.SLIME_SURFACE_BIOME_TAG = SLIME_SURFACE_BIOME_TAG;
140
+ exports.VANILLA_ENGINE_SPAWN_RULES = VANILLA_ENGINE_SPAWN_RULES;
141
+ exports.isSlimeChunk = isSlimeChunk;
142
+ exports.moonPhase = moonPhase;
143
+ exports.slimeSpawnRule = slimeSpawnRule;
144
+
145
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lUnVsZXMuY2pzLmNqcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvZW5naW5lUnVsZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSYW5kb21Tb3VyY2UgfSBmcm9tICdAanNwcmlzbWFyaW5lL3ByZWRpY2F0ZXMnO1xuXG5pbXBvcnQgdHlwZSB7IFNwYXduUG9zaXRpb24sIFNwYXduV29ybGQgfSBmcm9tICcuL3dvcmxkJztcblxuLyoqXG4gKiBUaGUgc3Bhd24gY29uZGl0aW9ucyBCZWRyb2NrIGtlZXBzIGluIGVuZ2luZSBjb2RlIHJhdGhlciB0aGFuIGluXG4gKiBgc3Bhd25fcnVsZXMvKi5qc29uYC5cbiAqXG4gKiBUaGUgMjQtY29tcG9uZW50IGdyYW1tYXIgY2Fubm90IGV4cHJlc3MgYSBoYXNoIG9mIHRoZSBjaHVuayBjb29yZGluYXRlcyBvciBhXG4gKiBkcmF3IGFnYWluc3QgdGhlIG1vb24gcGhhc2UsIHNvIE1vamFuZyB3cml0ZXMgdGhvc2UgaW4gQysrIGFuZCBsZWF2ZXMgdGhlXG4gKiBKU09OIGZpbGUgYXMgdGhlIGNvYXJzZSBnYXRlIGluIGZyb250IG9mIHRoZW0uIGBzcGF3bl9ydWxlcy9zbGltZS5qc29uYCBpc1xuICogdGhlIGNsZWFyZXN0IGNhc2U6IGl0IGNhcnJpZXMgbm8gYnJpZ2h0bmVzcyBmaWx0ZXIsIG5vIGhlaWdodCBmaWx0ZXIgYW5kIGFcbiAqIHdlaWdodCBvZiAxMDAsIHdoaWNoIG9uIGl0cyBvd24gbGV0cyBhIHNsaW1lIHNwYXduIGluIGFueSBgbW9uc3RlcmAgYmlvbWUgaW5cbiAqIGRheWxpZ2h0IGFuZCBmaWxsIHRoZSBtb25zdGVyIHBvb2wgdG8gaXRzIGNhcC4gVGhlIHJlYWwgcnVsZSBpcyB0aGUgZnVuY3Rpb25cbiAqIGF0IHZpcnR1YWwgYWRkcmVzcyBgMHhiYjgwMDQwYCBvZiBCRFMgMS4yNi41MS4xJ3MgYGJlZHJvY2tfc2VydmVyYCwgd2hpY2hcbiAqIHRoaXMgbW9kdWxlIHJlaW1wbGVtZW50cy5cbiAqXG4gKiBBIHJ1bGUgaGVyZSBydW5zIGFmdGVyIHRoZSBKU09OIGNvbmRpdGlvbnMgcGFzcyBhbmQgYmVmb3JlIHRoZSB3ZWlnaHRlZFxuICogZHJhdywgc28gdGhlIGZpbGUgc3RpbGwgZGVjaWRlcyB0aGUgYmlvbWVzLCB0aGUgZGlmZmljdWx0eSBhbmQgdGhlIHdlaWdodCxcbiAqIGFuZCB0aGUgY29kZSBkZWNpZGVzIHdoYXQgdGhlIGZpbGUgY2Fubm90IHNheS5cbiAqL1xuXG4vKiogV2hhdCBhbiBlbmdpbmUgcnVsZSByZWFkcyBiZXNpZGVzIHRoZSBwb3NpdGlvbiBpdCBpcyBkZWNpZGluZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5naW5lU3Bhd25Db250ZXh0IHtcbiAgICByZWFkb25seSB3b3JsZDogU3Bhd25Xb3JsZDtcbiAgICAvKiogVGhlIHNwYXduZXIncyBvd24gc291cmNlLCBzbyBvbmUgc2VlZCBzdGlsbCByZXByb2R1Y2VzIG9uZSBzZXQgb2Ygc3Bhd25zLiAqL1xuICAgIHJlYWRvbmx5IHJhbmRvbTogUmFuZG9tU291cmNlO1xufVxuXG4vKipcbiAqIE9uZSBlbnRpdHkncyBlbmdpbmUtc2lkZSBzcGF3biBjb25kaXRpb24uXG4gKlxuICogQHJldHVybnMgV2hldGhlciB0aGUgZW50aXR5IG1heSBzcGF3biBhdCB0aGUgcG9zaXRpb24sIHdpdGggdGhlIGVudGl0eSdzXG4gKiAgIGBzcGF3bl9ydWxlcy8qLmpzb25gIGNvbmRpdGlvbnMgYWxyZWFkeSBzYXRpc2ZpZWQuXG4gKi9cbmV4cG9ydCB0eXBlIEVuZ2luZVNwYXduUnVsZSA9IChhdDogU3Bhd25Qb3NpdGlvbiwgY29udGV4dDogRW5naW5lU3Bhd25Db250ZXh0KSA9PiBib29sZWFuO1xuXG4vKiogSG93IGZhciBpbnRvIHRoZSBzdGF0ZSBhIHR3aXN0IHN0ZXAgcmVhZHMgaXRzIHNlY29uZCB3b3JkLiAqL1xuY29uc3QgVFdJU1RFUl9PRkZTRVQgPSAzOTc7XG5cbi8qKiBUaGUgbXVsdGlwbGllciBvZiB0aGUgdHdpc3RlcidzIHNlZWRpbmcgcmVjdXJyZW5jZSwgTWF0c3Vtb3RvIGFuZCBOaXNoaW11cmEncyAxODEyNDMzMjUzLiAqL1xuY29uc3QgVFdJU1RFUl9TRUVEX01VTFRJUExJRVIgPSAweDZjMDc4OTY1O1xuXG4vKiogVGhlIHR3aXN0IHN0ZXAncyB0ZW1wZXJpbmcgbWF0cml4LiAqL1xuY29uc3QgVFdJU1RFUl9NQVRSSVggPSAweDk5MDhiMGRmO1xuXG4vKipcbiAqIFRoZSBmaXJzdCAzMi1iaXQgZHJhdyBvZiBhIE1lcnNlbm5lIHR3aXN0ZXIgc2VlZGVkIHdpdGggb25lIHZhbHVlLlxuICpcbiAqIE9ubHkgdGhlIGZpcnN0IGRyYXcgZXhpc3RzIGJlY2F1c2UgdGhhdCBpcyBhbGwgdGhlIHNsaW1lIGNodW5rIHJ1bGUgdGFrZXMuXG4gKiBUaGUgdHdpc3Qgb2Ygd29yZCB6ZXJvIHJlYWRzIHdvcmRzIHplcm8sIG9uZSBhbmQge0BsaW5rIFRXSVNURVJfT0ZGU0VUfSwgc29cbiAqIHRoZSBzZWVkaW5nIHJlY3VycmVuY2Ugc3RvcHMgb25lIHdvcmQgcGFzdCB0aGUgb2Zmc2V0IHJhdGhlciB0aGFuIGZpbGxpbmdcbiAqIGFsbCA2MjQgd29yZHMgb2YgYSBmdWxsIHN0YXRlLiBCZWRyb2NrJ3Mgb3duIGNvcHkgc3RvcHMgaW4gdGhlIHNhbWUgcGxhY2UuXG4gKi9cbmNvbnN0IGZpcnN0VHdpc3RlckRyYXcgPSAoc2VlZDogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IG5ldyBVaW50MzJBcnJheShUV0lTVEVSX09GRlNFVCArIDIpO1xuICAgIHN0YXRlWzBdID0gc2VlZDtcbiAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RhdGUubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gc3RhdGVbaW5kZXggLSAxXSE7XG4gICAgICAgIHN0YXRlW2luZGV4XSA9IChNYXRoLmltdWwoVFdJU1RFUl9TRUVEX01VTFRJUExJRVIsIHByZXZpb3VzIF4gKHByZXZpb3VzID4+PiAzMCkpICsgaW5kZXgpID4+PiAwO1xuICAgIH1cblxuICAgIGNvbnN0IG1peGVkID0gKHN0YXRlWzBdISAmIDB4ODAwMDAwMDApIHwgKHN0YXRlWzFdISAmIDB4N2ZmZmZmZmYpO1xuICAgIGxldCBkcmF3ID0gc3RhdGVbVFdJU1RFUl9PRkZTRVRdISBeIChtaXhlZCA+Pj4gMSkgXiAoKG1peGVkICYgMSkgPT09IDAgPyAwIDogVFdJU1RFUl9NQVRSSVgpO1xuXG4gICAgZHJhdyBePSBkcmF3ID4+PiAxMTtcbiAgICBkcmF3IF49IChkcmF3IDw8IDcpICYgMHg5ZDJjNTY4MDtcbiAgICBkcmF3IF49IChkcmF3IDw8IDE1KSAmIDB4ZWZjNjAwMDA7XG4gICAgZHJhdyBePSBkcmF3ID4+PiAxODtcbiAgICByZXR1cm4gZHJhdyA+Pj4gMDtcbn07XG5cbi8qKlxuICogVGhlIG11bHRpcGxpZXIgQmVkcm9jayBoYXNoZXMgYSBjaHVuaydzIFggY29vcmRpbmF0ZSBieS4gSXQgaXMgdGhlIGVuZ2luZSdzXG4gKiBnZW5lcmFsLXB1cnBvc2UgaGFzaCBtdWx0aXBsaWVyIHJhdGhlciB0aGFuIGFueXRoaW5nIGFib3V0IHNsaW1lcy5cbiAqL1xuY29uc3QgU0xJTUVfQ0hVTktfTVVMVElQTElFUiA9IDB4MWYxZjFmMWY7XG5cbi8qKiBPbmUgY2h1bmsgaW4gdGVuIGhvbGRzIHNsaW1lcywgd2hpY2ggaXMgdGhlIGRpdmlzb3Igb2YgdGhlIGRyYXcuICovXG5jb25zdCBTTElNRV9DSFVOS19JTiA9IDEwO1xuXG4vKiogSG93IG1hbnkgYW5zd2VycyB7QGxpbmsgaXNTbGltZUNodW5rfSBrZWVwcyBiZWZvcmUgaXQgc3RhcnRzIG92ZXIuICovXG5jb25zdCBTTElNRV9DSFVOS19NRU1PX0xJTUlUID0gNDA5NjtcblxuY29uc3Qgc2xpbWVDaHVua01lbW8gPSBuZXcgTWFwPG51bWJlciwgYm9vbGVhbj4oKTtcblxuLyoqXG4gKiBXaGV0aGVyIGEgY2h1bmsgaXMgYSBzbGltZSBjaHVuay5cbiAqXG4gKiBCZWRyb2NrIHNlZWRzIGEgTWVyc2VubmUgdHdpc3RlciB3aXRoIGBjaHVua1ggKiAweDFmMWYxZjFmIF4gY2h1bmtaYCBhbmRcbiAqIHRha2VzIGl0cyBmaXJzdCBkcmF3IG1vZHVsbyB0ZW4uIFRoZSB3b3JsZCBzZWVkIGlzIG5vdCBwYXJ0IG9mIGl0LCB3aGljaCBpc1xuICogd2h5IGEgQmVkcm9jayBzbGltZSBmYXJtIHNpdHMgYXQgdGhlIHNhbWUgY2h1bmsgY29vcmRpbmF0ZXMgaW4gZXZlcnkgd29ybGRcbiAqIGFuZCB3aHkgSmF2YSdzIHNlZWRlZCBmb3JtdWxhIGlzIHRoZSB3cm9uZyBhbnN3ZXIgaGVyZS5cbiAqXG4gKiBAcGFyYW0gY2h1bmtYIC0gVGhlIGNodW5rJ3MgWCBjb29yZGluYXRlLCB3aGljaCBpcyBhIGJsb2NrIFggc2hpZnRlZCByaWdodCBieSBmb3VyLlxuICogQHBhcmFtIGNodW5rWiAtIFRoZSBjaHVuaydzIFogY29vcmRpbmF0ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzU2xpbWVDaHVuayA9IChjaHVua1g6IG51bWJlciwgY2h1bmtaOiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBzZWVkID0gKE1hdGguaW11bChjaHVua1gsIFNMSU1FX0NIVU5LX01VTFRJUExJRVIpIF4gY2h1bmtaKSA+Pj4gMDtcbiAgICBjb25zdCBrbm93biA9IHNsaW1lQ2h1bmtNZW1vLmdldChzZWVkKTtcbiAgICBpZiAoa25vd24gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGtub3duO1xuXG4gICAgY29uc3QgYW5zd2VyID0gZmlyc3RUd2lzdGVyRHJhdyhzZWVkKSAlIFNMSU1FX0NIVU5LX0lOID09PSAwO1xuICAgIGlmIChzbGltZUNodW5rTWVtby5zaXplID49IFNMSU1FX0NIVU5LX01FTU9fTElNSVQpIHNsaW1lQ2h1bmtNZW1vLmNsZWFyKCk7XG4gICAgc2xpbWVDaHVua01lbW8uc2V0KHNlZWQsIGFuc3dlcik7XG4gICAgcmV0dXJuIGFuc3dlcjtcbn07XG5cbi8qKiBIb3cgbWFueSB0aWNrcyBvbmUgTWluZWNyYWZ0IGRheSBsYXN0cy4gKi9cbmNvbnN0IERBWV9USUNLUyA9IDI0MDAwO1xuXG4vKipcbiAqIEhvdyBicmlnaHQgdGhlIG1vb24gaXMgYXQgZWFjaCBvZiBpdHMgZWlnaHQgcGhhc2VzLCBzdGFydGluZyBhdCB0aGUgZnVsbFxuICogbW9vbi4gVGhlIHN3YW1wIGJyYW5jaCBvZiB0aGUgc2xpbWUgcnVsZSBkcmF3cyBhZ2FpbnN0IHRoaXMgbnVtYmVyLCBzbyBhXG4gKiBzd2FtcCBzcGF3bnMgbm8gc2xpbWVzIGF0IGFsbCBvbiBhIG5ldyBtb29uLlxuICovXG5leHBvcnQgY29uc3QgTU9PTl9CUklHSFRORVNTOiByZWFkb25seSBudW1iZXJbXSA9IFsxLCAwLjc1LCAwLjUsIDAuMjUsIDAsIDAuMjUsIDAuNSwgMC43NV07XG5cbi8qKlxuICogVGhlIG1vb24gcGhhc2UgYXQgb25lIHdvcmxkIHRpbWUuXG4gKlxuICogQHBhcmFtIHRpbWUgLSBUaGUgd29ybGQncyBhZ2UgaW4gdGlja3MsIHdoaWNoIGlzIG5ldmVyIG5lZ2F0aXZlIG9uIGEgcnVubmluZyBzZXJ2ZXIuXG4gKiBAcmV0dXJucyBBIHBoYXNlIGZyb20gMCwgdGhlIGZ1bGwgbW9vbiwgdG8gNy5cbiAqL1xuZXhwb3J0IGNvbnN0IG1vb25QaGFzZSA9ICh0aW1lOiBudW1iZXIpOiBudW1iZXIgPT4gTWF0aC5hYnMoTWF0aC50cnVuYyh0aW1lIC8gREFZX1RJQ0tTKSkgJSBNT09OX0JSSUdIVE5FU1MubGVuZ3RoO1xuXG4vKiogVGhlIGhpZ2hlc3QgWSBhdCB3aGljaCB0aGUgc2xpbWUgY2h1bmsgYnJhbmNoIGFwcGxpZXMuICovXG5jb25zdCBTTElNRV9DSFVOS19DRUlMSU5HID0gMzg7XG5cbi8qKiBUaGUgbG93ZXN0IFkgb2YgdGhlIHN3YW1wIGJyYW5jaCdzIGJhbmQuICovXG5jb25zdCBTTElNRV9TV0FNUF9GTE9PUiA9IDUwO1xuXG4vKiogVGhlIGhpZ2hlc3QgWSBvZiB0aGUgc3dhbXAgYnJhbmNoJ3MgYmFuZC4gKi9cbmNvbnN0IFNMSU1FX1NXQU1QX0NFSUxJTkcgPSA2ODtcblxuLyoqXG4gKiBUaGUgbGlnaHQgYSBzd2FtcCBzbGltZSB0b2xlcmF0ZXMsIGJlZm9yZSB0aGUgZXh0cmEgZHJhdy5cbiAqXG4gKiBJdCBpcyBhbiBlYXJseSBleGl0IHJhdGhlciB0aGFuIGEgc2Vjb25kIGNvbmRpdGlvbjogdGhlIGRyYXcgaXQgZ3VhcmRzIGlzXG4gKiBvdmVyIGBbMCwgOClgLCBzbyBhIGxpZ2h0IGFib3ZlIHNldmVuIGFscmVhZHkgZmFpbHMgaXQuXG4gKi9cbmNvbnN0IFNMSU1FX1NXQU1QX0xJR0hUX0NFSUxJTkcgPSA3O1xuXG4vKiogVGhlIHdpZHRoIG9mIHRoZSBkcmF3IHRoZSBzd2FtcCBicmFuY2ggY29tcGFyZXMgdGhlIGxpZ2h0IGFnYWluc3QuICovXG5jb25zdCBTTElNRV9TV0FNUF9MSUdIVF9EUkFXID0gODtcblxuLyoqXG4gKiBUaGUgYmlvbWUgdGFnIHRoZSBzd2FtcCBicmFuY2ggcmVhZHMuIFRocmVlIHZhbmlsbGEgYmlvbWVzIGNhcnJ5IGl0OlxuICogYHN3YW1wbGFuZGAsIGBzd2FtcGxhbmRfbXV0YXRlZGAgYW5kIGBtYW5ncm92ZV9zd2FtcGAuXG4gKi9cbmV4cG9ydCBjb25zdCBTTElNRV9TVVJGQUNFX0JJT01FX1RBRyA9ICdzcGF3bnNfc2xpbWVzX29uX3N1cmZhY2UnO1xuXG4vKipcbiAqIFdoZXJlIGEgc2xpbWUgbWF5IHNwYXduLCB3aGljaCBgc3Bhd25fcnVsZXMvc2xpbWUuanNvbmAgZG9lcyBub3Qgc2F5LlxuICpcbiAqIFR3byBicmFuY2hlcywgYXMgQmVkcm9jayB3cml0ZXMgdGhlbS4gQXQgWSAzOCBhbmQgYmVsb3cgdGhlIHBvc2l0aW9uIGhhcyB0b1xuICogYmUgaW4gYSBzbGltZSBjaHVuayBhbmQgbm90aGluZyBlbHNlIGlzIGFza2VkLCB3aGljaCBpcyB3aHkgYSBzbGltZSBmYXJtIGlzXG4gKiBkdWcgb3V0IHJhdGhlciB0aGFuIGxpdCB1cC4gQWJvdmUgdGhhdCB0aGUgcG9zaXRpb24gaGFzIHRvIGJlIGluIGEgc3dhbXBcbiAqIGJldHdlZW4gWSA1MCBhbmQgWSA2OCwgZGFyayBlbm91Z2gsIGFuZCBsdWNreSBhZ2FpbnN0IHRoZSBtb29uIHBoYXNlLlxuICogRXZlcnl0aGluZyBpbiBiZXR3ZWVuLCBhbmQgZXZlcnkgbGl0IHN1cmZhY2UsIHNwYXducyBubyBzbGltZXMgYXQgYWxsLlxuICpcbiAqIFRoZSBvbmUgZGl2ZXJnZW5jZSBmcm9tIHRoZSBCZWRyb2NrIGZ1bmN0aW9uIGlzIHRoZSBwb3NpdGlvbiB0aGUgYmlvbWUgdGFnXG4gKiBpcyByZWFkIGF0LiBCZWRyb2NrIHJlYWRzIGl0IG9uZSBibG9jayBoaWdoZXIgdGhhbiB0aGUgc3Bhd24gcG9zaXRpb247IHRoaXNcbiAqIHJlYWRzIGl0IGF0IHRoZSBzcGF3biBwb3NpdGlvbiwgYmVjYXVzZSBhIGJpb21lIGJvdW5kYXJ5IGlzIHRoZSBvbmx5IHBsYWNlXG4gKiB0aGUgdHdvIGNhbiBkaWZmZXIgYW5kIG5laXRoZXIgYW5zd2VyIGlzIG1vcmUgY29ycmVjdCB0aGVyZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHNsaW1lU3Bhd25SdWxlOiBFbmdpbmVTcGF3blJ1bGUgPSAoYXQsIHsgd29ybGQsIHJhbmRvbSB9KSA9PiB7XG4gICAgaWYgKGF0LnkgPD0gU0xJTUVfQ0hVTktfQ0VJTElORykgcmV0dXJuIGlzU2xpbWVDaHVuayhhdC54ID4+IDQsIGF0LnogPj4gNCk7XG5cbiAgICBpZiAoYXQueSA8IFNMSU1FX1NXQU1QX0ZMT09SIHx8IGF0LnkgPiBTTElNRV9TV0FNUF9DRUlMSU5HKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBsaWdodCA9IHdvcmxkLmxpZ2h0KGF0KTtcbiAgICBpZiAobGlnaHQgPiBTTElNRV9TV0FNUF9MSUdIVF9DRUlMSU5HKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGxpZ2h0ID4gcmFuZG9tLm5leHRJbnQoU0xJTUVfU1dBTVBfTElHSFRfRFJBVykpIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChyYW5kb20ubmV4dEZsb2F0KCkgPj0gTU9PTl9CUklHSFRORVNTW21vb25QaGFzZSh3b3JsZC5hZ2UoKSldISkgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIHdvcmxkLmJpb21lVGFncyhhdCkuaW5jbHVkZXMoU0xJTUVfU1VSRkFDRV9CSU9NRV9UQUcpO1xufTtcblxuLyoqXG4gKiBFdmVyeSBlbmdpbmUgcnVsZSB2YW5pbGxhIG5lZWRzLCBrZXllZCBieSB0aGUgZW50aXR5IGl0IGdhdGVzLlxuICpcbiAqIHtAbGluayBpbXBvcnQoJy4vc3Bhd25lcicpLlNwYXduZXJ9IGFwcGxpZXMgdGhlc2UgYnkgZGVmYXVsdC4gQSBob3N0IHRoYXRcbiAqIHdhbnRzIGEgZGlmZmVyZW50IHNldCBwYXNzZXMgaXRzIG93biBtYXAsIGFuZCBhIGhvc3QgdGhhdCB3YW50cyBub25lIHBhc3Nlc1xuICogYW4gZW1wdHkgb25lLlxuICovXG5leHBvcnQgY29uc3QgVkFOSUxMQV9FTkdJTkVfU1BBV05fUlVMRVM6IFJlYWRvbmx5TWFwPHN0cmluZywgRW5naW5lU3Bhd25SdWxlPiA9IG5ldyBNYXAoW1xuICAgIFsnbWluZWNyYWZ0OnNsaW1lJywgc2xpbWVTcGF3blJ1bGVdXG5dKTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQXNDQSxJQUFNLGlCQUFpQjs7QUFHdkIsSUFBTSwwQkFBMEI7O0FBR2hDLElBQU0saUJBQWlCOzs7Ozs7Ozs7QUFVdkIsSUFBTSxvQkFBb0IsU0FBeUI7Q0FDL0MsTUFBTSx3QkFBUSxJQUFJLFlBQVksR0FBa0I7Q0FDaEQsTUFBTSxLQUFLO0NBQ1gsS0FBSyxJQUFJLFFBQVEsR0FBRyxRQUFRLE1BQU0sUUFBUSxTQUFTLEdBQUc7RUFDbEQsTUFBTSxXQUFXLE1BQU0sUUFBUTtFQUMvQixNQUFNLFNBQVUsS0FBSyxLQUFLLHlCQUF5QixXQUFZLGFBQWEsRUFBRyxJQUFJLFVBQVc7Q0FDbEc7Q0FFQSxNQUFNLFFBQVMsTUFBTSxLQUFNLGFBQWUsTUFBTSxLQUFNO0NBQ3RELElBQUksT0FBTyxNQUFNLGtCQUFvQixVQUFVLE1BQU8sUUFBUSxPQUFPLElBQUksSUFBSTtDQUU3RSxRQUFRLFNBQVM7Q0FDakIsUUFBUyxRQUFRLElBQUs7Q0FDdEIsUUFBUyxRQUFRLEtBQU07Q0FDdkIsUUFBUSxTQUFTO0NBQ2pCLE9BQU8sU0FBUztBQUNwQjs7Ozs7QUFNQSxJQUFNLHlCQUF5Qjs7QUFHL0IsSUFBTSxpQkFBaUI7O0FBR3ZCLElBQU0seUJBQXlCO0FBRS9CLElBQU0saUNBQWlCLElBQUksSUFBcUI7Ozs7Ozs7Ozs7OztBQWFoRCxJQUFhLGdCQUFnQixRQUFnQixXQUE0QjtDQUNyRSxNQUFNLFFBQVEsS0FBSyxLQUFLLFFBQVEsc0JBQXNCLElBQUksWUFBWTtDQUN0RSxNQUFNLFFBQVEsZUFBZSxJQUFJLElBQUk7Q0FDckMsSUFBSSxVQUFVLEtBQUEsR0FBVyxPQUFPO0NBRWhDLE1BQU0sU0FBUyxpQkFBaUIsSUFBSSxJQUFJLG1CQUFtQjtDQUMzRCxJQUFJLGVBQWUsUUFBUSx3QkFBd0IsZUFBZSxNQUFNO0NBQ3hFLGVBQWUsSUFBSSxNQUFNLE1BQU07Q0FDL0IsT0FBTztBQUNYOztBQUdBLElBQU0sWUFBWTs7Ozs7O0FBT2xCLElBQWEsa0JBQXFDO0NBQUM7Q0FBRztDQUFNO0NBQUs7Q0FBTTtDQUFHO0NBQU07Q0FBSztBQUFJOzs7Ozs7O0FBUXpGLElBQWEsYUFBYSxTQUF5QixLQUFLLElBQUksS0FBSyxNQUFNLE9BQU8sU0FBUyxDQUFDLElBQUksZ0JBQWdCOztBQUc1RyxJQUFNLHNCQUFzQjs7QUFHNUIsSUFBTSxvQkFBb0I7O0FBRzFCLElBQU0sc0JBQXNCOzs7Ozs7O0FBUTVCLElBQU0sNEJBQTRCOztBQUdsQyxJQUFNLHlCQUF5Qjs7Ozs7QUFNL0IsSUFBYSwwQkFBMEI7Ozs7Ozs7Ozs7Ozs7OztBQWdCdkMsSUFBYSxrQkFBbUMsSUFBSSxFQUFFLE9BQU8sYUFBYTtDQUN0RSxJQUFJLEdBQUcsS0FBSyxxQkFBcUIsT0FBTyxhQUFhLEdBQUcsS0FBSyxHQUFHLEdBQUcsS0FBSyxDQUFDO0NBRXpFLElBQUksR0FBRyxJQUFJLHFCQUFxQixHQUFHLElBQUkscUJBQXFCLE9BQU87Q0FFbkUsTUFBTSxRQUFRLE1BQU0sTUFBTSxFQUFFO0NBQzVCLElBQUksUUFBUSwyQkFBMkIsT0FBTztDQUM5QyxJQUFJLFFBQVEsT0FBTyxRQUFRLHNCQUFzQixHQUFHLE9BQU87Q0FFM0QsSUFBSSxPQUFPLFVBQVUsS0FBSyxnQkFBZ0IsVUFBVSxNQUFNLElBQUksQ0FBQyxJQUFLLE9BQU87Q0FFM0UsT0FBTyxNQUFNLFVBQVUsRUFBRSxDQUFDLENBQUMsU0FBUyx1QkFBdUI7QUFDL0Q7Ozs7Ozs7O0FBU0EsSUFBYSw2Q0FBbUUsSUFBSSxJQUFJLENBQ3BGLENBQUMsbUJBQW1CLGNBQWMsQ0FDdEMsQ0FBQyJ9
@@ -0,0 +1,86 @@
1
+ import type { RandomSource } from '@jsprismarine/predicates';
2
+ import type { SpawnPosition, SpawnWorld } from './world';
3
+ /**
4
+ * The spawn conditions Bedrock keeps in engine code rather than in
5
+ * `spawn_rules/*.json`.
6
+ *
7
+ * The 24-component grammar cannot express a hash of the chunk coordinates or a
8
+ * draw against the moon phase, so Mojang writes those in C++ and leaves the
9
+ * JSON file as the coarse gate in front of them. `spawn_rules/slime.json` is
10
+ * the clearest case: it carries no brightness filter, no height filter and a
11
+ * weight of 100, which on its own lets a slime spawn in any `monster` biome in
12
+ * daylight and fill the monster pool to its cap. The real rule is the function
13
+ * at virtual address `0xbb80040` of BDS 1.26.51.1's `bedrock_server`, which
14
+ * this module reimplements.
15
+ *
16
+ * A rule here runs after the JSON conditions pass and before the weighted
17
+ * draw, so the file still decides the biomes, the difficulty and the weight,
18
+ * and the code decides what the file cannot say.
19
+ */
20
+ /** What an engine rule reads besides the position it is deciding. */
21
+ export interface EngineSpawnContext {
22
+ readonly world: SpawnWorld;
23
+ /** The spawner's own source, so one seed still reproduces one set of spawns. */
24
+ readonly random: RandomSource;
25
+ }
26
+ /**
27
+ * One entity's engine-side spawn condition.
28
+ *
29
+ * @returns Whether the entity may spawn at the position, with the entity's
30
+ * `spawn_rules/*.json` conditions already satisfied.
31
+ */
32
+ export type EngineSpawnRule = (at: SpawnPosition, context: EngineSpawnContext) => boolean;
33
+ /**
34
+ * Whether a chunk is a slime chunk.
35
+ *
36
+ * Bedrock seeds a Mersenne twister with `chunkX * 0x1f1f1f1f ^ chunkZ` and
37
+ * takes its first draw modulo ten. The world seed is not part of it, which is
38
+ * why a Bedrock slime farm sits at the same chunk coordinates in every world
39
+ * and why Java's seeded formula is the wrong answer here.
40
+ *
41
+ * @param chunkX - The chunk's X coordinate, which is a block X shifted right by four.
42
+ * @param chunkZ - The chunk's Z coordinate.
43
+ */
44
+ export declare const isSlimeChunk: (chunkX: number, chunkZ: number) => boolean;
45
+ /**
46
+ * How bright the moon is at each of its eight phases, starting at the full
47
+ * moon. The swamp branch of the slime rule draws against this number, so a
48
+ * swamp spawns no slimes at all on a new moon.
49
+ */
50
+ export declare const MOON_BRIGHTNESS: readonly number[];
51
+ /**
52
+ * The moon phase at one world time.
53
+ *
54
+ * @param time - The world's age in ticks, which is never negative on a running server.
55
+ * @returns A phase from 0, the full moon, to 7.
56
+ */
57
+ export declare const moonPhase: (time: number) => number;
58
+ /**
59
+ * The biome tag the swamp branch reads. Three vanilla biomes carry it:
60
+ * `swampland`, `swampland_mutated` and `mangrove_swamp`.
61
+ */
62
+ export declare const SLIME_SURFACE_BIOME_TAG = "spawns_slimes_on_surface";
63
+ /**
64
+ * Where a slime may spawn, which `spawn_rules/slime.json` does not say.
65
+ *
66
+ * Two branches, as Bedrock writes them. At Y 38 and below the position has to
67
+ * be in a slime chunk and nothing else is asked, which is why a slime farm is
68
+ * dug out rather than lit up. Above that the position has to be in a swamp
69
+ * between Y 50 and Y 68, dark enough, and lucky against the moon phase.
70
+ * Everything in between, and every lit surface, spawns no slimes at all.
71
+ *
72
+ * The one divergence from the Bedrock function is the position the biome tag
73
+ * is read at. Bedrock reads it one block higher than the spawn position; this
74
+ * reads it at the spawn position, because a biome boundary is the only place
75
+ * the two can differ and neither answer is more correct there.
76
+ */
77
+ export declare const slimeSpawnRule: EngineSpawnRule;
78
+ /**
79
+ * Every engine rule vanilla needs, keyed by the entity it gates.
80
+ *
81
+ * {@link import('./spawner').Spawner} applies these by default. A host that
82
+ * wants a different set passes its own map, and a host that wants none passes
83
+ * an empty one.
84
+ */
85
+ export declare const VANILLA_ENGINE_SPAWN_RULES: ReadonlyMap<string, EngineSpawnRule>;
86
+ //# sourceMappingURL=engineRules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engineRules.d.ts","sourceRoot":"","sources":["../src/engineRules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEzD;;;;;;;;;;;;;;;;GAgBG;AAEH,qEAAqE;AACrE,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,gFAAgF;IAChF,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;CACjC;AAED;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC;AAmD1F;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,WAAY,MAAM,UAAU,MAAM,KAAG,OAS7D,CAAC;AAKF;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAA6C,CAAC;AAE3F;;;;;GAKG;AACH,eAAO,MAAM,SAAS,SAAU,MAAM,KAAG,MAAyE,CAAC;AAsBnH;;;GAGG;AACH,eAAO,MAAM,uBAAuB,6BAA6B,CAAC;AAElE;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,cAAc,EAAE,eAY5B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,EAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAE1E,CAAC"}
@@ -0,0 +1,138 @@
1
+ // src/engineRules.ts
2
+ /** How far into the state a twist step reads its second word. */
3
+ var TWISTER_OFFSET = 397;
4
+ /** The multiplier of the twister's seeding recurrence, Matsumoto and Nishimura's 1812433253. */
5
+ var TWISTER_SEED_MULTIPLIER = 1812433253;
6
+ /** The twist step's tempering matrix. */
7
+ var TWISTER_MATRIX = 2567483615;
8
+ /**
9
+ * The first 32-bit draw of a Mersenne twister seeded with one value.
10
+ *
11
+ * Only the first draw exists because that is all the slime chunk rule takes.
12
+ * The twist of word zero reads words zero, one and {@link TWISTER_OFFSET}, so
13
+ * the seeding recurrence stops one word past the offset rather than filling
14
+ * all 624 words of a full state. Bedrock's own copy stops in the same place.
15
+ */
16
+ var firstTwisterDraw = (seed) => {
17
+ const state = /* @__PURE__ */ new Uint32Array(399);
18
+ state[0] = seed;
19
+ for (let index = 1; index < state.length; index += 1) {
20
+ const previous = state[index - 1];
21
+ state[index] = Math.imul(TWISTER_SEED_MULTIPLIER, previous ^ previous >>> 30) + index >>> 0;
22
+ }
23
+ const mixed = state[0] & 2147483648 | state[1] & 2147483647;
24
+ let draw = state[TWISTER_OFFSET] ^ mixed >>> 1 ^ ((mixed & 1) === 0 ? 0 : TWISTER_MATRIX);
25
+ draw ^= draw >>> 11;
26
+ draw ^= draw << 7 & 2636928640;
27
+ draw ^= draw << 15 & 4022730752;
28
+ draw ^= draw >>> 18;
29
+ return draw >>> 0;
30
+ };
31
+ /**
32
+ * The multiplier Bedrock hashes a chunk's X coordinate by. It is the engine's
33
+ * general-purpose hash multiplier rather than anything about slimes.
34
+ */
35
+ var SLIME_CHUNK_MULTIPLIER = 522133279;
36
+ /** One chunk in ten holds slimes, which is the divisor of the draw. */
37
+ var SLIME_CHUNK_IN = 10;
38
+ /** How many answers {@link isSlimeChunk} keeps before it starts over. */
39
+ var SLIME_CHUNK_MEMO_LIMIT = 4096;
40
+ var slimeChunkMemo = /* @__PURE__ */ new Map();
41
+ /**
42
+ * Whether a chunk is a slime chunk.
43
+ *
44
+ * Bedrock seeds a Mersenne twister with `chunkX * 0x1f1f1f1f ^ chunkZ` and
45
+ * takes its first draw modulo ten. The world seed is not part of it, which is
46
+ * why a Bedrock slime farm sits at the same chunk coordinates in every world
47
+ * and why Java's seeded formula is the wrong answer here.
48
+ *
49
+ * @param chunkX - The chunk's X coordinate, which is a block X shifted right by four.
50
+ * @param chunkZ - The chunk's Z coordinate.
51
+ */
52
+ var isSlimeChunk = (chunkX, chunkZ) => {
53
+ const seed = (Math.imul(chunkX, SLIME_CHUNK_MULTIPLIER) ^ chunkZ) >>> 0;
54
+ const known = slimeChunkMemo.get(seed);
55
+ if (known !== void 0) return known;
56
+ const answer = firstTwisterDraw(seed) % SLIME_CHUNK_IN === 0;
57
+ if (slimeChunkMemo.size >= SLIME_CHUNK_MEMO_LIMIT) slimeChunkMemo.clear();
58
+ slimeChunkMemo.set(seed, answer);
59
+ return answer;
60
+ };
61
+ /** How many ticks one Minecraft day lasts. */
62
+ var DAY_TICKS = 24e3;
63
+ /**
64
+ * How bright the moon is at each of its eight phases, starting at the full
65
+ * moon. The swamp branch of the slime rule draws against this number, so a
66
+ * swamp spawns no slimes at all on a new moon.
67
+ */
68
+ var MOON_BRIGHTNESS = [
69
+ 1,
70
+ .75,
71
+ .5,
72
+ .25,
73
+ 0,
74
+ .25,
75
+ .5,
76
+ .75
77
+ ];
78
+ /**
79
+ * The moon phase at one world time.
80
+ *
81
+ * @param time - The world's age in ticks, which is never negative on a running server.
82
+ * @returns A phase from 0, the full moon, to 7.
83
+ */
84
+ var moonPhase = (time) => Math.abs(Math.trunc(time / DAY_TICKS)) % MOON_BRIGHTNESS.length;
85
+ /** The highest Y at which the slime chunk branch applies. */
86
+ var SLIME_CHUNK_CEILING = 38;
87
+ /** The lowest Y of the swamp branch's band. */
88
+ var SLIME_SWAMP_FLOOR = 50;
89
+ /** The highest Y of the swamp branch's band. */
90
+ var SLIME_SWAMP_CEILING = 68;
91
+ /**
92
+ * The light a swamp slime tolerates, before the extra draw.
93
+ *
94
+ * It is an early exit rather than a second condition: the draw it guards is
95
+ * over `[0, 8)`, so a light above seven already fails it.
96
+ */
97
+ var SLIME_SWAMP_LIGHT_CEILING = 7;
98
+ /** The width of the draw the swamp branch compares the light against. */
99
+ var SLIME_SWAMP_LIGHT_DRAW = 8;
100
+ /**
101
+ * The biome tag the swamp branch reads. Three vanilla biomes carry it:
102
+ * `swampland`, `swampland_mutated` and `mangrove_swamp`.
103
+ */
104
+ var SLIME_SURFACE_BIOME_TAG = "spawns_slimes_on_surface";
105
+ /**
106
+ * Where a slime may spawn, which `spawn_rules/slime.json` does not say.
107
+ *
108
+ * Two branches, as Bedrock writes them. At Y 38 and below the position has to
109
+ * be in a slime chunk and nothing else is asked, which is why a slime farm is
110
+ * dug out rather than lit up. Above that the position has to be in a swamp
111
+ * between Y 50 and Y 68, dark enough, and lucky against the moon phase.
112
+ * Everything in between, and every lit surface, spawns no slimes at all.
113
+ *
114
+ * The one divergence from the Bedrock function is the position the biome tag
115
+ * is read at. Bedrock reads it one block higher than the spawn position; this
116
+ * reads it at the spawn position, because a biome boundary is the only place
117
+ * the two can differ and neither answer is more correct there.
118
+ */
119
+ var slimeSpawnRule = (at, { world, random }) => {
120
+ if (at.y <= SLIME_CHUNK_CEILING) return isSlimeChunk(at.x >> 4, at.z >> 4);
121
+ if (at.y < SLIME_SWAMP_FLOOR || at.y > SLIME_SWAMP_CEILING) return false;
122
+ const light = world.light(at);
123
+ if (light > SLIME_SWAMP_LIGHT_CEILING) return false;
124
+ if (light > random.nextInt(SLIME_SWAMP_LIGHT_DRAW)) return false;
125
+ if (random.nextFloat() >= MOON_BRIGHTNESS[moonPhase(world.age())]) return false;
126
+ return world.biomeTags(at).includes(SLIME_SURFACE_BIOME_TAG);
127
+ };
128
+ /**
129
+ * Every engine rule vanilla needs, keyed by the entity it gates.
130
+ *
131
+ * {@link import('./spawner').Spawner} applies these by default. A host that
132
+ * wants a different set passes its own map, and a host that wants none passes
133
+ * an empty one.
134
+ */
135
+ var VANILLA_ENGINE_SPAWN_RULES = /* @__PURE__ */ new Map([["minecraft:slime", slimeSpawnRule]]);
136
+ export { MOON_BRIGHTNESS, SLIME_SURFACE_BIOME_TAG, VANILLA_ENGINE_SPAWN_RULES, isSlimeChunk, moonPhase, slimeSpawnRule };
137
+
138
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lUnVsZXMuZXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL2VuZ2luZVJ1bGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUmFuZG9tU291cmNlIH0gZnJvbSAnQGpzcHJpc21hcmluZS9wcmVkaWNhdGVzJztcblxuaW1wb3J0IHR5cGUgeyBTcGF3blBvc2l0aW9uLCBTcGF3bldvcmxkIH0gZnJvbSAnLi93b3JsZCc7XG5cbi8qKlxuICogVGhlIHNwYXduIGNvbmRpdGlvbnMgQmVkcm9jayBrZWVwcyBpbiBlbmdpbmUgY29kZSByYXRoZXIgdGhhbiBpblxuICogYHNwYXduX3J1bGVzLyouanNvbmAuXG4gKlxuICogVGhlIDI0LWNvbXBvbmVudCBncmFtbWFyIGNhbm5vdCBleHByZXNzIGEgaGFzaCBvZiB0aGUgY2h1bmsgY29vcmRpbmF0ZXMgb3IgYVxuICogZHJhdyBhZ2FpbnN0IHRoZSBtb29uIHBoYXNlLCBzbyBNb2phbmcgd3JpdGVzIHRob3NlIGluIEMrKyBhbmQgbGVhdmVzIHRoZVxuICogSlNPTiBmaWxlIGFzIHRoZSBjb2Fyc2UgZ2F0ZSBpbiBmcm9udCBvZiB0aGVtLiBgc3Bhd25fcnVsZXMvc2xpbWUuanNvbmAgaXNcbiAqIHRoZSBjbGVhcmVzdCBjYXNlOiBpdCBjYXJyaWVzIG5vIGJyaWdodG5lc3MgZmlsdGVyLCBubyBoZWlnaHQgZmlsdGVyIGFuZCBhXG4gKiB3ZWlnaHQgb2YgMTAwLCB3aGljaCBvbiBpdHMgb3duIGxldHMgYSBzbGltZSBzcGF3biBpbiBhbnkgYG1vbnN0ZXJgIGJpb21lIGluXG4gKiBkYXlsaWdodCBhbmQgZmlsbCB0aGUgbW9uc3RlciBwb29sIHRvIGl0cyBjYXAuIFRoZSByZWFsIHJ1bGUgaXMgdGhlIGZ1bmN0aW9uXG4gKiBhdCB2aXJ0dWFsIGFkZHJlc3MgYDB4YmI4MDA0MGAgb2YgQkRTIDEuMjYuNTEuMSdzIGBiZWRyb2NrX3NlcnZlcmAsIHdoaWNoXG4gKiB0aGlzIG1vZHVsZSByZWltcGxlbWVudHMuXG4gKlxuICogQSBydWxlIGhlcmUgcnVucyBhZnRlciB0aGUgSlNPTiBjb25kaXRpb25zIHBhc3MgYW5kIGJlZm9yZSB0aGUgd2VpZ2h0ZWRcbiAqIGRyYXcsIHNvIHRoZSBmaWxlIHN0aWxsIGRlY2lkZXMgdGhlIGJpb21lcywgdGhlIGRpZmZpY3VsdHkgYW5kIHRoZSB3ZWlnaHQsXG4gKiBhbmQgdGhlIGNvZGUgZGVjaWRlcyB3aGF0IHRoZSBmaWxlIGNhbm5vdCBzYXkuXG4gKi9cblxuLyoqIFdoYXQgYW4gZW5naW5lIHJ1bGUgcmVhZHMgYmVzaWRlcyB0aGUgcG9zaXRpb24gaXQgaXMgZGVjaWRpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIEVuZ2luZVNwYXduQ29udGV4dCB7XG4gICAgcmVhZG9ubHkgd29ybGQ6IFNwYXduV29ybGQ7XG4gICAgLyoqIFRoZSBzcGF3bmVyJ3Mgb3duIHNvdXJjZSwgc28gb25lIHNlZWQgc3RpbGwgcmVwcm9kdWNlcyBvbmUgc2V0IG9mIHNwYXducy4gKi9cbiAgICByZWFkb25seSByYW5kb206IFJhbmRvbVNvdXJjZTtcbn1cblxuLyoqXG4gKiBPbmUgZW50aXR5J3MgZW5naW5lLXNpZGUgc3Bhd24gY29uZGl0aW9uLlxuICpcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGVudGl0eSBtYXkgc3Bhd24gYXQgdGhlIHBvc2l0aW9uLCB3aXRoIHRoZSBlbnRpdHknc1xuICogICBgc3Bhd25fcnVsZXMvKi5qc29uYCBjb25kaXRpb25zIGFscmVhZHkgc2F0aXNmaWVkLlxuICovXG5leHBvcnQgdHlwZSBFbmdpbmVTcGF3blJ1bGUgPSAoYXQ6IFNwYXduUG9zaXRpb24sIGNvbnRleHQ6IEVuZ2luZVNwYXduQ29udGV4dCkgPT4gYm9vbGVhbjtcblxuLyoqIEhvdyBmYXIgaW50byB0aGUgc3RhdGUgYSB0d2lzdCBzdGVwIHJlYWRzIGl0cyBzZWNvbmQgd29yZC4gKi9cbmNvbnN0IFRXSVNURVJfT0ZGU0VUID0gMzk3O1xuXG4vKiogVGhlIG11bHRpcGxpZXIgb2YgdGhlIHR3aXN0ZXIncyBzZWVkaW5nIHJlY3VycmVuY2UsIE1hdHN1bW90byBhbmQgTmlzaGltdXJhJ3MgMTgxMjQzMzI1My4gKi9cbmNvbnN0IFRXSVNURVJfU0VFRF9NVUxUSVBMSUVSID0gMHg2YzA3ODk2NTtcblxuLyoqIFRoZSB0d2lzdCBzdGVwJ3MgdGVtcGVyaW5nIG1hdHJpeC4gKi9cbmNvbnN0IFRXSVNURVJfTUFUUklYID0gMHg5OTA4YjBkZjtcblxuLyoqXG4gKiBUaGUgZmlyc3QgMzItYml0IGRyYXcgb2YgYSBNZXJzZW5uZSB0d2lzdGVyIHNlZWRlZCB3aXRoIG9uZSB2YWx1ZS5cbiAqXG4gKiBPbmx5IHRoZSBmaXJzdCBkcmF3IGV4aXN0cyBiZWNhdXNlIHRoYXQgaXMgYWxsIHRoZSBzbGltZSBjaHVuayBydWxlIHRha2VzLlxuICogVGhlIHR3aXN0IG9mIHdvcmQgemVybyByZWFkcyB3b3JkcyB6ZXJvLCBvbmUgYW5kIHtAbGluayBUV0lTVEVSX09GRlNFVH0sIHNvXG4gKiB0aGUgc2VlZGluZyByZWN1cnJlbmNlIHN0b3BzIG9uZSB3b3JkIHBhc3QgdGhlIG9mZnNldCByYXRoZXIgdGhhbiBmaWxsaW5nXG4gKiBhbGwgNjI0IHdvcmRzIG9mIGEgZnVsbCBzdGF0ZS4gQmVkcm9jaydzIG93biBjb3B5IHN0b3BzIGluIHRoZSBzYW1lIHBsYWNlLlxuICovXG5jb25zdCBmaXJzdFR3aXN0ZXJEcmF3ID0gKHNlZWQ6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSBuZXcgVWludDMyQXJyYXkoVFdJU1RFUl9PRkZTRVQgKyAyKTtcbiAgICBzdGF0ZVswXSA9IHNlZWQ7XG4gICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0YXRlLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICBjb25zdCBwcmV2aW91cyA9IHN0YXRlW2luZGV4IC0gMV0hO1xuICAgICAgICBzdGF0ZVtpbmRleF0gPSAoTWF0aC5pbXVsKFRXSVNURVJfU0VFRF9NVUxUSVBMSUVSLCBwcmV2aW91cyBeIChwcmV2aW91cyA+Pj4gMzApKSArIGluZGV4KSA+Pj4gMDtcbiAgICB9XG5cbiAgICBjb25zdCBtaXhlZCA9IChzdGF0ZVswXSEgJiAweDgwMDAwMDAwKSB8IChzdGF0ZVsxXSEgJiAweDdmZmZmZmZmKTtcbiAgICBsZXQgZHJhdyA9IHN0YXRlW1RXSVNURVJfT0ZGU0VUXSEgXiAobWl4ZWQgPj4+IDEpIF4gKChtaXhlZCAmIDEpID09PSAwID8gMCA6IFRXSVNURVJfTUFUUklYKTtcblxuICAgIGRyYXcgXj0gZHJhdyA+Pj4gMTE7XG4gICAgZHJhdyBePSAoZHJhdyA8PCA3KSAmIDB4OWQyYzU2ODA7XG4gICAgZHJhdyBePSAoZHJhdyA8PCAxNSkgJiAweGVmYzYwMDAwO1xuICAgIGRyYXcgXj0gZHJhdyA+Pj4gMTg7XG4gICAgcmV0dXJuIGRyYXcgPj4+IDA7XG59O1xuXG4vKipcbiAqIFRoZSBtdWx0aXBsaWVyIEJlZHJvY2sgaGFzaGVzIGEgY2h1bmsncyBYIGNvb3JkaW5hdGUgYnkuIEl0IGlzIHRoZSBlbmdpbmUnc1xuICogZ2VuZXJhbC1wdXJwb3NlIGhhc2ggbXVsdGlwbGllciByYXRoZXIgdGhhbiBhbnl0aGluZyBhYm91dCBzbGltZXMuXG4gKi9cbmNvbnN0IFNMSU1FX0NIVU5LX01VTFRJUExJRVIgPSAweDFmMWYxZjFmO1xuXG4vKiogT25lIGNodW5rIGluIHRlbiBob2xkcyBzbGltZXMsIHdoaWNoIGlzIHRoZSBkaXZpc29yIG9mIHRoZSBkcmF3LiAqL1xuY29uc3QgU0xJTUVfQ0hVTktfSU4gPSAxMDtcblxuLyoqIEhvdyBtYW55IGFuc3dlcnMge0BsaW5rIGlzU2xpbWVDaHVua30ga2VlcHMgYmVmb3JlIGl0IHN0YXJ0cyBvdmVyLiAqL1xuY29uc3QgU0xJTUVfQ0hVTktfTUVNT19MSU1JVCA9IDQwOTY7XG5cbmNvbnN0IHNsaW1lQ2h1bmtNZW1vID0gbmV3IE1hcDxudW1iZXIsIGJvb2xlYW4+KCk7XG5cbi8qKlxuICogV2hldGhlciBhIGNodW5rIGlzIGEgc2xpbWUgY2h1bmsuXG4gKlxuICogQmVkcm9jayBzZWVkcyBhIE1lcnNlbm5lIHR3aXN0ZXIgd2l0aCBgY2h1bmtYICogMHgxZjFmMWYxZiBeIGNodW5rWmAgYW5kXG4gKiB0YWtlcyBpdHMgZmlyc3QgZHJhdyBtb2R1bG8gdGVuLiBUaGUgd29ybGQgc2VlZCBpcyBub3QgcGFydCBvZiBpdCwgd2hpY2ggaXNcbiAqIHdoeSBhIEJlZHJvY2sgc2xpbWUgZmFybSBzaXRzIGF0IHRoZSBzYW1lIGNodW5rIGNvb3JkaW5hdGVzIGluIGV2ZXJ5IHdvcmxkXG4gKiBhbmQgd2h5IEphdmEncyBzZWVkZWQgZm9ybXVsYSBpcyB0aGUgd3JvbmcgYW5zd2VyIGhlcmUuXG4gKlxuICogQHBhcmFtIGNodW5rWCAtIFRoZSBjaHVuaydzIFggY29vcmRpbmF0ZSwgd2hpY2ggaXMgYSBibG9jayBYIHNoaWZ0ZWQgcmlnaHQgYnkgZm91ci5cbiAqIEBwYXJhbSBjaHVua1ogLSBUaGUgY2h1bmsncyBaIGNvb3JkaW5hdGUuXG4gKi9cbmV4cG9ydCBjb25zdCBpc1NsaW1lQ2h1bmsgPSAoY2h1bmtYOiBudW1iZXIsIGNodW5rWjogbnVtYmVyKTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3Qgc2VlZCA9IChNYXRoLmltdWwoY2h1bmtYLCBTTElNRV9DSFVOS19NVUxUSVBMSUVSKSBeIGNodW5rWikgPj4+IDA7XG4gICAgY29uc3Qga25vd24gPSBzbGltZUNodW5rTWVtby5nZXQoc2VlZCk7XG4gICAgaWYgKGtub3duICE9PSB1bmRlZmluZWQpIHJldHVybiBrbm93bjtcblxuICAgIGNvbnN0IGFuc3dlciA9IGZpcnN0VHdpc3RlckRyYXcoc2VlZCkgJSBTTElNRV9DSFVOS19JTiA9PT0gMDtcbiAgICBpZiAoc2xpbWVDaHVua01lbW8uc2l6ZSA+PSBTTElNRV9DSFVOS19NRU1PX0xJTUlUKSBzbGltZUNodW5rTWVtby5jbGVhcigpO1xuICAgIHNsaW1lQ2h1bmtNZW1vLnNldChzZWVkLCBhbnN3ZXIpO1xuICAgIHJldHVybiBhbnN3ZXI7XG59O1xuXG4vKiogSG93IG1hbnkgdGlja3Mgb25lIE1pbmVjcmFmdCBkYXkgbGFzdHMuICovXG5jb25zdCBEQVlfVElDS1MgPSAyNDAwMDtcblxuLyoqXG4gKiBIb3cgYnJpZ2h0IHRoZSBtb29uIGlzIGF0IGVhY2ggb2YgaXRzIGVpZ2h0IHBoYXNlcywgc3RhcnRpbmcgYXQgdGhlIGZ1bGxcbiAqIG1vb24uIFRoZSBzd2FtcCBicmFuY2ggb2YgdGhlIHNsaW1lIHJ1bGUgZHJhd3MgYWdhaW5zdCB0aGlzIG51bWJlciwgc28gYVxuICogc3dhbXAgc3Bhd25zIG5vIHNsaW1lcyBhdCBhbGwgb24gYSBuZXcgbW9vbi5cbiAqL1xuZXhwb3J0IGNvbnN0IE1PT05fQlJJR0hUTkVTUzogcmVhZG9ubHkgbnVtYmVyW10gPSBbMSwgMC43NSwgMC41LCAwLjI1LCAwLCAwLjI1LCAwLjUsIDAuNzVdO1xuXG4vKipcbiAqIFRoZSBtb29uIHBoYXNlIGF0IG9uZSB3b3JsZCB0aW1lLlxuICpcbiAqIEBwYXJhbSB0aW1lIC0gVGhlIHdvcmxkJ3MgYWdlIGluIHRpY2tzLCB3aGljaCBpcyBuZXZlciBuZWdhdGl2ZSBvbiBhIHJ1bm5pbmcgc2VydmVyLlxuICogQHJldHVybnMgQSBwaGFzZSBmcm9tIDAsIHRoZSBmdWxsIG1vb24sIHRvIDcuXG4gKi9cbmV4cG9ydCBjb25zdCBtb29uUGhhc2UgPSAodGltZTogbnVtYmVyKTogbnVtYmVyID0+IE1hdGguYWJzKE1hdGgudHJ1bmModGltZSAvIERBWV9USUNLUykpICUgTU9PTl9CUklHSFRORVNTLmxlbmd0aDtcblxuLyoqIFRoZSBoaWdoZXN0IFkgYXQgd2hpY2ggdGhlIHNsaW1lIGNodW5rIGJyYW5jaCBhcHBsaWVzLiAqL1xuY29uc3QgU0xJTUVfQ0hVTktfQ0VJTElORyA9IDM4O1xuXG4vKiogVGhlIGxvd2VzdCBZIG9mIHRoZSBzd2FtcCBicmFuY2gncyBiYW5kLiAqL1xuY29uc3QgU0xJTUVfU1dBTVBfRkxPT1IgPSA1MDtcblxuLyoqIFRoZSBoaWdoZXN0IFkgb2YgdGhlIHN3YW1wIGJyYW5jaCdzIGJhbmQuICovXG5jb25zdCBTTElNRV9TV0FNUF9DRUlMSU5HID0gNjg7XG5cbi8qKlxuICogVGhlIGxpZ2h0IGEgc3dhbXAgc2xpbWUgdG9sZXJhdGVzLCBiZWZvcmUgdGhlIGV4dHJhIGRyYXcuXG4gKlxuICogSXQgaXMgYW4gZWFybHkgZXhpdCByYXRoZXIgdGhhbiBhIHNlY29uZCBjb25kaXRpb246IHRoZSBkcmF3IGl0IGd1YXJkcyBpc1xuICogb3ZlciBgWzAsIDgpYCwgc28gYSBsaWdodCBhYm92ZSBzZXZlbiBhbHJlYWR5IGZhaWxzIGl0LlxuICovXG5jb25zdCBTTElNRV9TV0FNUF9MSUdIVF9DRUlMSU5HID0gNztcblxuLyoqIFRoZSB3aWR0aCBvZiB0aGUgZHJhdyB0aGUgc3dhbXAgYnJhbmNoIGNvbXBhcmVzIHRoZSBsaWdodCBhZ2FpbnN0LiAqL1xuY29uc3QgU0xJTUVfU1dBTVBfTElHSFRfRFJBVyA9IDg7XG5cbi8qKlxuICogVGhlIGJpb21lIHRhZyB0aGUgc3dhbXAgYnJhbmNoIHJlYWRzLiBUaHJlZSB2YW5pbGxhIGJpb21lcyBjYXJyeSBpdDpcbiAqIGBzd2FtcGxhbmRgLCBgc3dhbXBsYW5kX211dGF0ZWRgIGFuZCBgbWFuZ3JvdmVfc3dhbXBgLlxuICovXG5leHBvcnQgY29uc3QgU0xJTUVfU1VSRkFDRV9CSU9NRV9UQUcgPSAnc3Bhd25zX3NsaW1lc19vbl9zdXJmYWNlJztcblxuLyoqXG4gKiBXaGVyZSBhIHNsaW1lIG1heSBzcGF3biwgd2hpY2ggYHNwYXduX3J1bGVzL3NsaW1lLmpzb25gIGRvZXMgbm90IHNheS5cbiAqXG4gKiBUd28gYnJhbmNoZXMsIGFzIEJlZHJvY2sgd3JpdGVzIHRoZW0uIEF0IFkgMzggYW5kIGJlbG93IHRoZSBwb3NpdGlvbiBoYXMgdG9cbiAqIGJlIGluIGEgc2xpbWUgY2h1bmsgYW5kIG5vdGhpbmcgZWxzZSBpcyBhc2tlZCwgd2hpY2ggaXMgd2h5IGEgc2xpbWUgZmFybSBpc1xuICogZHVnIG91dCByYXRoZXIgdGhhbiBsaXQgdXAuIEFib3ZlIHRoYXQgdGhlIHBvc2l0aW9uIGhhcyB0byBiZSBpbiBhIHN3YW1wXG4gKiBiZXR3ZWVuIFkgNTAgYW5kIFkgNjgsIGRhcmsgZW5vdWdoLCBhbmQgbHVja3kgYWdhaW5zdCB0aGUgbW9vbiBwaGFzZS5cbiAqIEV2ZXJ5dGhpbmcgaW4gYmV0d2VlbiwgYW5kIGV2ZXJ5IGxpdCBzdXJmYWNlLCBzcGF3bnMgbm8gc2xpbWVzIGF0IGFsbC5cbiAqXG4gKiBUaGUgb25lIGRpdmVyZ2VuY2UgZnJvbSB0aGUgQmVkcm9jayBmdW5jdGlvbiBpcyB0aGUgcG9zaXRpb24gdGhlIGJpb21lIHRhZ1xuICogaXMgcmVhZCBhdC4gQmVkcm9jayByZWFkcyBpdCBvbmUgYmxvY2sgaGlnaGVyIHRoYW4gdGhlIHNwYXduIHBvc2l0aW9uOyB0aGlzXG4gKiByZWFkcyBpdCBhdCB0aGUgc3Bhd24gcG9zaXRpb24sIGJlY2F1c2UgYSBiaW9tZSBib3VuZGFyeSBpcyB0aGUgb25seSBwbGFjZVxuICogdGhlIHR3byBjYW4gZGlmZmVyIGFuZCBuZWl0aGVyIGFuc3dlciBpcyBtb3JlIGNvcnJlY3QgdGhlcmUuXG4gKi9cbmV4cG9ydCBjb25zdCBzbGltZVNwYXduUnVsZTogRW5naW5lU3Bhd25SdWxlID0gKGF0LCB7IHdvcmxkLCByYW5kb20gfSkgPT4ge1xuICAgIGlmIChhdC55IDw9IFNMSU1FX0NIVU5LX0NFSUxJTkcpIHJldHVybiBpc1NsaW1lQ2h1bmsoYXQueCA+PiA0LCBhdC56ID4+IDQpO1xuXG4gICAgaWYgKGF0LnkgPCBTTElNRV9TV0FNUF9GTE9PUiB8fCBhdC55ID4gU0xJTUVfU1dBTVBfQ0VJTElORykgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgbGlnaHQgPSB3b3JsZC5saWdodChhdCk7XG4gICAgaWYgKGxpZ2h0ID4gU0xJTUVfU1dBTVBfTElHSFRfQ0VJTElORykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChsaWdodCA+IHJhbmRvbS5uZXh0SW50KFNMSU1FX1NXQU1QX0xJR0hUX0RSQVcpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAocmFuZG9tLm5leHRGbG9hdCgpID49IE1PT05fQlJJR0hUTkVTU1ttb29uUGhhc2Uod29ybGQuYWdlKCkpXSEpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiB3b3JsZC5iaW9tZVRhZ3MoYXQpLmluY2x1ZGVzKFNMSU1FX1NVUkZBQ0VfQklPTUVfVEFHKTtcbn07XG5cbi8qKlxuICogRXZlcnkgZW5naW5lIHJ1bGUgdmFuaWxsYSBuZWVkcywga2V5ZWQgYnkgdGhlIGVudGl0eSBpdCBnYXRlcy5cbiAqXG4gKiB7QGxpbmsgaW1wb3J0KCcuL3NwYXduZXInKS5TcGF3bmVyfSBhcHBsaWVzIHRoZXNlIGJ5IGRlZmF1bHQuIEEgaG9zdCB0aGF0XG4gKiB3YW50cyBhIGRpZmZlcmVudCBzZXQgcGFzc2VzIGl0cyBvd24gbWFwLCBhbmQgYSBob3N0IHRoYXQgd2FudHMgbm9uZSBwYXNzZXNcbiAqIGFuIGVtcHR5IG9uZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFZBTklMTEFfRU5HSU5FX1NQQVdOX1JVTEVTOiBSZWFkb25seU1hcDxzdHJpbmcsIEVuZ2luZVNwYXduUnVsZT4gPSBuZXcgTWFwKFtcbiAgICBbJ21pbmVjcmFmdDpzbGltZScsIHNsaW1lU3Bhd25SdWxlXVxuXSk7XG4iXSwibWFwcGluZ3MiOiI7O0FBc0NBLElBQU0saUJBQWlCOztBQUd2QixJQUFNLDBCQUEwQjs7QUFHaEMsSUFBTSxpQkFBaUI7Ozs7Ozs7OztBQVV2QixJQUFNLG9CQUFvQixTQUF5QjtDQUMvQyxNQUFNLHdCQUFRLElBQUksWUFBWSxHQUFrQjtDQUNoRCxNQUFNLEtBQUs7Q0FDWCxLQUFLLElBQUksUUFBUSxHQUFHLFFBQVEsTUFBTSxRQUFRLFNBQVMsR0FBRztFQUNsRCxNQUFNLFdBQVcsTUFBTSxRQUFRO0VBQy9CLE1BQU0sU0FBVSxLQUFLLEtBQUsseUJBQXlCLFdBQVksYUFBYSxFQUFHLElBQUksVUFBVztDQUNsRztDQUVBLE1BQU0sUUFBUyxNQUFNLEtBQU0sYUFBZSxNQUFNLEtBQU07Q0FDdEQsSUFBSSxPQUFPLE1BQU0sa0JBQW9CLFVBQVUsTUFBTyxRQUFRLE9BQU8sSUFBSSxJQUFJO0NBRTdFLFFBQVEsU0FBUztDQUNqQixRQUFTLFFBQVEsSUFBSztDQUN0QixRQUFTLFFBQVEsS0FBTTtDQUN2QixRQUFRLFNBQVM7Q0FDakIsT0FBTyxTQUFTO0FBQ3BCOzs7OztBQU1BLElBQU0seUJBQXlCOztBQUcvQixJQUFNLGlCQUFpQjs7QUFHdkIsSUFBTSx5QkFBeUI7QUFFL0IsSUFBTSxpQ0FBaUIsSUFBSSxJQUFxQjs7Ozs7Ozs7Ozs7O0FBYWhELElBQWEsZ0JBQWdCLFFBQWdCLFdBQTRCO0NBQ3JFLE1BQU0sUUFBUSxLQUFLLEtBQUssUUFBUSxzQkFBc0IsSUFBSSxZQUFZO0NBQ3RFLE1BQU0sUUFBUSxlQUFlLElBQUksSUFBSTtDQUNyQyxJQUFJLFVBQVUsS0FBQSxHQUFXLE9BQU87Q0FFaEMsTUFBTSxTQUFTLGlCQUFpQixJQUFJLElBQUksbUJBQW1CO0NBQzNELElBQUksZUFBZSxRQUFRLHdCQUF3QixlQUFlLE1BQU07Q0FDeEUsZUFBZSxJQUFJLE1BQU0sTUFBTTtDQUMvQixPQUFPO0FBQ1g7O0FBR0EsSUFBTSxZQUFZOzs7Ozs7QUFPbEIsSUFBYSxrQkFBcUM7Q0FBQztDQUFHO0NBQU07Q0FBSztDQUFNO0NBQUc7Q0FBTTtDQUFLO0FBQUk7Ozs7Ozs7QUFRekYsSUFBYSxhQUFhLFNBQXlCLEtBQUssSUFBSSxLQUFLLE1BQU0sT0FBTyxTQUFTLENBQUMsSUFBSSxnQkFBZ0I7O0FBRzVHLElBQU0sc0JBQXNCOztBQUc1QixJQUFNLG9CQUFvQjs7QUFHMUIsSUFBTSxzQkFBc0I7Ozs7Ozs7QUFRNUIsSUFBTSw0QkFBNEI7O0FBR2xDLElBQU0seUJBQXlCOzs7OztBQU0vQixJQUFhLDBCQUEwQjs7Ozs7Ozs7Ozs7Ozs7O0FBZ0J2QyxJQUFhLGtCQUFtQyxJQUFJLEVBQUUsT0FBTyxhQUFhO0NBQ3RFLElBQUksR0FBRyxLQUFLLHFCQUFxQixPQUFPLGFBQWEsR0FBRyxLQUFLLEdBQUcsR0FBRyxLQUFLLENBQUM7Q0FFekUsSUFBSSxHQUFHLElBQUkscUJBQXFCLEdBQUcsSUFBSSxxQkFBcUIsT0FBTztDQUVuRSxNQUFNLFFBQVEsTUFBTSxNQUFNLEVBQUU7Q0FDNUIsSUFBSSxRQUFRLDJCQUEyQixPQUFPO0NBQzlDLElBQUksUUFBUSxPQUFPLFFBQVEsc0JBQXNCLEdBQUcsT0FBTztDQUUzRCxJQUFJLE9BQU8sVUFBVSxLQUFLLGdCQUFnQixVQUFVLE1BQU0sSUFBSSxDQUFDLElBQUssT0FBTztDQUUzRSxPQUFPLE1BQU0sVUFBVSxFQUFFLENBQUMsQ0FBQyxTQUFTLHVCQUF1QjtBQUMvRDs7Ozs7Ozs7QUFTQSxJQUFhLDZDQUFtRSxJQUFJLElBQUksQ0FDcEYsQ0FBQyxtQkFBbUIsY0FBYyxDQUN0QyxDQUFDIn0=
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const require_world = require("./world.cjs.cjs");
4
+ const require_constants = require("./constants.cjs.cjs");
5
+ const require_rules = require("./rules.cjs.cjs");
6
+ const require_conditions = require("./conditions.cjs.cjs");
7
+ const require_engineRules = require("./engineRules.cjs.cjs");
8
+ const require_spawner = require("./spawner.cjs.cjs");
9
+ const require_despawn = require("./despawn.cjs.cjs");
10
+ exports.DIFFICULTIES = require_rules.DIFFICULTIES;
11
+ exports.MOON_BRIGHTNESS = require_engineRules.MOON_BRIGHTNESS;
12
+ exports.POPULATION_POOLS = require_rules.POPULATION_POOLS;
13
+ exports.SLIME_SURFACE_BIOME_TAG = require_engineRules.SLIME_SURFACE_BIOME_TAG;
14
+ exports.SPAWN_CONSTANTS = require_constants.SPAWN_CONSTANTS;
15
+ exports.SPAWN_RULE_COMPONENTS = require_rules.SPAWN_RULE_COMPONENTS;
16
+ exports.SPAWN_SITE_FLAGS = require_world.SPAWN_SITE_FLAGS;
17
+ exports.SPAWN_WEATHER = require_world.SPAWN_WEATHER;
18
+ exports.SpawnDelays = require_conditions.SpawnDelays;
19
+ exports.Spawner = require_spawner.Spawner;
20
+ exports.VANILLA_ENGINE_SPAWN_RULES = require_engineRules.VANILLA_ENGINE_SPAWN_RULES;
21
+ exports.cycleTicksFor = require_constants.cycleTicksFor;
22
+ exports.despawnReason = require_despawn.despawnReason;
23
+ exports.distanceSquared = require_world.distanceSquared;
24
+ exports.evaluateSpawnCondition = require_conditions.evaluateSpawnCondition;
25
+ exports.horizontalDistanceSquared = require_world.horizontalDistanceSquared;
26
+ exports.isSlimeChunk = require_engineRules.isSlimeChunk;
27
+ exports.moonPhase = require_engineRules.moonPhase;
28
+ exports.parseSpawnRule = require_rules.parseSpawnRule;
29
+ exports.passAt = require_world.passAt;
30
+ exports.poolCapFor = require_constants.poolCapFor;
31
+ exports.slimeSpawnRule = require_engineRules.slimeSpawnRule;
32
+ exports.spawnFilterContext = require_conditions.spawnFilterContext;
@@ -0,0 +1,8 @@
1
+ export * from './conditions';
2
+ export * from './constants';
3
+ export * from './despawn';
4
+ export * from './engineRules';
5
+ export * from './rules';
6
+ export * from './spawner';
7
+ export * from './world';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { SPAWN_SITE_FLAGS, SPAWN_WEATHER, distanceSquared, horizontalDistanceSquared, passAt } from "./world.es.js";
2
+ import { SPAWN_CONSTANTS, cycleTicksFor, poolCapFor } from "./constants.es.js";
3
+ import { DIFFICULTIES, POPULATION_POOLS, SPAWN_RULE_COMPONENTS, parseSpawnRule } from "./rules.es.js";
4
+ import { SpawnDelays, evaluateSpawnCondition, spawnFilterContext } from "./conditions.es.js";
5
+ import { MOON_BRIGHTNESS, SLIME_SURFACE_BIOME_TAG, VANILLA_ENGINE_SPAWN_RULES, isSlimeChunk, moonPhase, slimeSpawnRule } from "./engineRules.es.js";
6
+ import { Spawner } from "./spawner.es.js";
7
+ import { despawnReason } from "./despawn.es.js";
8
+ export { DIFFICULTIES, MOON_BRIGHTNESS, POPULATION_POOLS, SLIME_SURFACE_BIOME_TAG, SPAWN_CONSTANTS, SPAWN_RULE_COMPONENTS, SPAWN_SITE_FLAGS, SPAWN_WEATHER, SpawnDelays, Spawner, VANILLA_ENGINE_SPAWN_RULES, cycleTicksFor, despawnReason, distanceSquared, evaluateSpawnCondition, horizontalDistanceSquared, isSlimeChunk, moonPhase, parseSpawnRule, passAt, poolCapFor, slimeSpawnRule, spawnFilterContext };