@jsprismarine/spawning 0.0.0 → 0.16.0-unstable-20261029135432
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 +80 -0
- package/LICENSE +373 -0
- package/README.md +207 -0
- package/dist/conditions.cjs.cjs +190 -0
- package/dist/conditions.d.ts +81 -0
- package/dist/conditions.d.ts.map +1 -0
- package/dist/conditions.es.js +186 -0
- package/dist/constants.cjs.cjs +29 -0
- package/dist/constants.d.ts +73 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.es.js +26 -0
- package/dist/despawn.cjs.cjs +25 -0
- package/dist/despawn.d.ts +33 -0
- package/dist/despawn.d.ts.map +1 -0
- package/dist/despawn.es.js +23 -0
- package/dist/engineRules.cjs.cjs +145 -0
- package/dist/engineRules.d.ts +86 -0
- package/dist/engineRules.d.ts.map +1 -0
- package/dist/engineRules.es.js +138 -0
- package/dist/index.cjs.cjs +32 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.es.js +8 -0
- package/dist/rules.cjs.cjs +282 -0
- package/dist/rules.d.ts +152 -0
- package/dist/rules.d.ts.map +1 -0
- package/dist/rules.es.js +277 -0
- package/dist/spawner.cjs.cjs +280 -0
- package/dist/spawner.d.ts +105 -0
- package/dist/spawner.d.ts.map +1 -0
- package/dist/spawner.es.js +278 -0
- package/dist/tables/spawnConstants.cjs.cjs +111 -0
- package/dist/tables/spawnConstants.d.ts +2 -0
- package/dist/tables/spawnConstants.es.js +89 -0
- package/dist/tables/spawnConstants.json.d.ts +2 -0
- package/dist/world.cjs.cjs +51 -0
- package/dist/world.d.ts +111 -0
- package/dist/world.d.ts.map +1 -0
- package/dist/world.es.js +45 -0
- package/package.json +68 -5
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { distanceSquared, passAt } from "./world.es.js";
|
|
2
|
+
import { SPAWN_CONSTANTS } from "./constants.es.js";
|
|
3
|
+
import { DIFFICULTIES } from "./rules.es.js";
|
|
4
|
+
import { evaluateFilter } from "@jsprismarine/entities";
|
|
5
|
+
// src/conditions.ts
|
|
6
|
+
/**
|
|
7
|
+
* The cooldowns `minecraft:delay_filter` keeps.
|
|
8
|
+
*
|
|
9
|
+
* The three pillager patrol conditions each name their own identifier, which
|
|
10
|
+
* is how one per-difficulty cooldown exists per world rather than one per
|
|
11
|
+
* condition.
|
|
12
|
+
*/
|
|
13
|
+
var SpawnDelays = class {
|
|
14
|
+
ready = /* @__PURE__ */ new Map();
|
|
15
|
+
/** The tick the named cooldown next allows a spawn, or undefined when it has never run. */
|
|
16
|
+
readyAt(identifier) {
|
|
17
|
+
return this.ready.get(identifier);
|
|
18
|
+
}
|
|
19
|
+
/** Sets the tick at which the named cooldown allows the next spawn. */
|
|
20
|
+
schedule(identifier, tick) {
|
|
21
|
+
this.ready.set(identifier, tick);
|
|
22
|
+
}
|
|
23
|
+
/** Draws a delay inside the filter's range and schedules it from `tick`. */
|
|
24
|
+
scheduleFrom(delay, tick, random) {
|
|
25
|
+
if (delay.identifier === void 0) return;
|
|
26
|
+
const span = Math.max(0, delay.max - delay.min);
|
|
27
|
+
this.schedule(delay.identifier, tick + delay.min + Math.floor(random.nextFloat() * (span + 1)));
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
var rejected = (component) => ({
|
|
31
|
+
passed: false,
|
|
32
|
+
rejectedBy: component
|
|
33
|
+
});
|
|
34
|
+
var PASSED = { passed: true };
|
|
35
|
+
/**
|
|
36
|
+
* Builds the filter context a `minecraft:biome_filter` reads.
|
|
37
|
+
*
|
|
38
|
+
* A spawn rule has no entity yet, so the `self` subject is the position: its
|
|
39
|
+
* biome tags answer `has_biome_tag`, its biome answers `is_biome`, and its
|
|
40
|
+
* site flags answer `is_snow_covered`, `is_underground`, `is_underwater` and
|
|
41
|
+
* `in_lava`. Every other test the shared grammar allows goes unanswered and is
|
|
42
|
+
* reported, which is what the engine does for a fact it cannot establish.
|
|
43
|
+
*/
|
|
44
|
+
var spawnFilterContext = (world, at) => {
|
|
45
|
+
return {
|
|
46
|
+
self: {
|
|
47
|
+
flag: (name) => {
|
|
48
|
+
switch (name) {
|
|
49
|
+
case "is_snow_covered": return world.site("snow_covered", at);
|
|
50
|
+
case "is_underground": return world.site("underground", at);
|
|
51
|
+
case "is_underwater":
|
|
52
|
+
case "in_water": return world.site("underwater", at);
|
|
53
|
+
case "in_lava": return world.site("lava", at);
|
|
54
|
+
default: return;
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
names: (name) => {
|
|
58
|
+
if (name === "has_biome_tag") return world.biomeTags(at);
|
|
59
|
+
if (name === "is_biome") {
|
|
60
|
+
const biome = world.biome?.(at);
|
|
61
|
+
return biome === void 0 ? void 0 : [biome];
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
world: {
|
|
66
|
+
difficulty: () => world.difficulty(),
|
|
67
|
+
weather: () => world.weather()
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
/** The light a brightness filter compares, after the darkening weather applies to it. */
|
|
72
|
+
var brightnessAt = (world, at, adjustForWeather, constants) => {
|
|
73
|
+
const light = world.light(at);
|
|
74
|
+
if (!adjustForWeather) return light;
|
|
75
|
+
const weather = world.weather();
|
|
76
|
+
if (weather === "rain") return Math.max(0, light - constants.rainDarkening);
|
|
77
|
+
if (weather === "thunder") return Math.max(0, light - constants.thunderDarkening);
|
|
78
|
+
return light;
|
|
79
|
+
};
|
|
80
|
+
var difficultyRank = (difficulty) => DIFFICULTIES.indexOf(difficulty);
|
|
81
|
+
/** The distance from a position to the nearest player, or undefined when no player is loaded. */
|
|
82
|
+
var nearestPlayerDistance = (world, at) => {
|
|
83
|
+
let best;
|
|
84
|
+
for (const player of world.players()) {
|
|
85
|
+
const distance = distanceSquared(player.position, at);
|
|
86
|
+
if (best === void 0 || distance < best) best = distance;
|
|
87
|
+
}
|
|
88
|
+
return best === void 0 ? void 0 : Math.sqrt(best);
|
|
89
|
+
};
|
|
90
|
+
var matchesBlock = (identifier, names) => identifier !== void 0 && names.includes(identifier);
|
|
91
|
+
/**
|
|
92
|
+
* Decides whether one condition allows a spawn at a position.
|
|
93
|
+
*
|
|
94
|
+
* The components run cheapest first, and the first one that rejects names
|
|
95
|
+
* itself in the result. A condition that declares neither
|
|
96
|
+
* `minecraft:spawns_underwater` nor `minecraft:spawns_lava` refuses a position
|
|
97
|
+
* inside either liquid, which is the reading that keeps land mobs out of the
|
|
98
|
+
* ocean; Mojang states the components and not that rule.
|
|
99
|
+
*
|
|
100
|
+
* @param requestedPass - The pass the spawn loop is evaluating, or absent to
|
|
101
|
+
* derive it from the world's site facts.
|
|
102
|
+
*/
|
|
103
|
+
var evaluateSpawnCondition = (condition, at, context, requestedPass) => {
|
|
104
|
+
const { world } = context;
|
|
105
|
+
const constants = context.constants ?? SPAWN_CONSTANTS;
|
|
106
|
+
const pass = requestedPass ?? passAt(world, at);
|
|
107
|
+
if (condition.spawnsOnSurface || condition.spawnsUnderground) {
|
|
108
|
+
if (pass === "surface" && !condition.spawnsOnSurface) return rejected("minecraft:spawns_underground");
|
|
109
|
+
if (pass === "underground" && !condition.spawnsUnderground) return rejected("minecraft:spawns_on_surface");
|
|
110
|
+
}
|
|
111
|
+
const inWater = world.site("underwater", at);
|
|
112
|
+
const inLava = world.site("lava", at);
|
|
113
|
+
if (condition.spawnsUnderwater && !inWater) return rejected("minecraft:spawns_underwater");
|
|
114
|
+
if (condition.spawnsLava && !inLava) return rejected("minecraft:spawns_lava");
|
|
115
|
+
if (!condition.spawnsUnderwater && inWater) return rejected("minecraft:spawns_underwater");
|
|
116
|
+
if (!condition.spawnsLava && inLava) return rejected("minecraft:spawns_lava");
|
|
117
|
+
if (condition.disallowSpawnsInBubble && world.site("bubble_column", at)) return rejected("minecraft:disallow_spawns_in_bubble");
|
|
118
|
+
if (condition.height !== void 0 && (at.y < condition.height.min || at.y > condition.height.max)) return rejected("minecraft:height_filter");
|
|
119
|
+
if (condition.blocks !== void 0) {
|
|
120
|
+
if (!matchesBlock(world.block({
|
|
121
|
+
x: at.x,
|
|
122
|
+
y: at.y - 1,
|
|
123
|
+
z: at.z
|
|
124
|
+
}), condition.blocks)) return rejected("minecraft:spawns_on_block_filter");
|
|
125
|
+
}
|
|
126
|
+
if (condition.preventedBlocks !== void 0) {
|
|
127
|
+
if (matchesBlock(world.block({
|
|
128
|
+
x: at.x,
|
|
129
|
+
y: at.y - 1,
|
|
130
|
+
z: at.z
|
|
131
|
+
}), condition.preventedBlocks)) return rejected("minecraft:spawns_on_block_prevented_filter");
|
|
132
|
+
}
|
|
133
|
+
if (condition.aboveBlocks !== void 0) {
|
|
134
|
+
let found = false;
|
|
135
|
+
for (let depth = 1; depth <= condition.aboveBlocks.distance && !found; depth += 1) found = matchesBlock(world.block({
|
|
136
|
+
x: at.x,
|
|
137
|
+
y: at.y - depth,
|
|
138
|
+
z: at.z
|
|
139
|
+
}), condition.aboveBlocks.blocks);
|
|
140
|
+
if (!found) return rejected("minecraft:spawns_above_block_filter");
|
|
141
|
+
}
|
|
142
|
+
if (condition.brightness !== void 0) {
|
|
143
|
+
const light = brightnessAt(world, at, condition.brightness.adjustForWeather, constants);
|
|
144
|
+
if (light < condition.brightness.min || light > condition.brightness.max) return rejected("minecraft:brightness_filter");
|
|
145
|
+
}
|
|
146
|
+
if (condition.difficulty !== void 0) {
|
|
147
|
+
const rank = difficultyRank(world.difficulty());
|
|
148
|
+
if (rank < difficultyRank(condition.difficulty.min) || rank > difficultyRank(condition.difficulty.max)) return rejected("minecraft:difficulty_filter");
|
|
149
|
+
}
|
|
150
|
+
if (condition.worldAge !== void 0) {
|
|
151
|
+
const age = world.age();
|
|
152
|
+
if (age < condition.worldAge.min) return rejected("minecraft:world_age_filter");
|
|
153
|
+
if (condition.worldAge.max >= 0 && age > condition.worldAge.max) return rejected("minecraft:world_age_filter");
|
|
154
|
+
}
|
|
155
|
+
if (condition.mobEvent !== void 0 && !world.mobEventActive(condition.mobEvent)) return rejected("minecraft:mob_event_filter");
|
|
156
|
+
if (condition.distance !== void 0) {
|
|
157
|
+
const distance = nearestPlayerDistance(world, at);
|
|
158
|
+
if (distance === void 0 || distance < condition.distance.min || distance > condition.distance.max) return rejected("minecraft:distance_filter");
|
|
159
|
+
}
|
|
160
|
+
if (condition.playerInVillage !== void 0) {
|
|
161
|
+
const { distance, villageBorderTolerance } = condition.playerInVillage;
|
|
162
|
+
if (!world.players().filter((player) => distanceSquared(player.position, at) <= distance * distance).some((player) => {
|
|
163
|
+
const border = world.villageBorderDistance?.(player.position);
|
|
164
|
+
return border !== void 0 && border <= villageBorderTolerance;
|
|
165
|
+
})) return rejected("minecraft:player_in_village_filter");
|
|
166
|
+
}
|
|
167
|
+
if (condition.biomeFilter !== void 0) {
|
|
168
|
+
const options = {};
|
|
169
|
+
if (context.onUnanswered !== void 0) options.onUnanswered = context.onUnanswered;
|
|
170
|
+
if (!evaluateFilter(condition.biomeFilter, spawnFilterContext(world, at), options)) return rejected("minecraft:biome_filter");
|
|
171
|
+
}
|
|
172
|
+
if (condition.density !== void 0) {
|
|
173
|
+
const limit = pass === "surface" ? condition.density.surface : condition.density.underground;
|
|
174
|
+
if (limit >= 0 && world.typeCount(context.identifier, at, constants.densityRadius) >= limit) return rejected("minecraft:density_limit");
|
|
175
|
+
}
|
|
176
|
+
if (condition.delay !== void 0) {
|
|
177
|
+
const identifier = condition.delay.identifier;
|
|
178
|
+
const readyAt = identifier === void 0 ? void 0 : context.delays?.readyAt(identifier);
|
|
179
|
+
if (readyAt !== void 0 && context.tick < readyAt) return rejected("minecraft:delay_filter");
|
|
180
|
+
if (context.random.nextFloat() * 100 >= condition.delay.spawnChance) return rejected("minecraft:delay_filter");
|
|
181
|
+
}
|
|
182
|
+
return PASSED;
|
|
183
|
+
};
|
|
184
|
+
export { SpawnDelays, evaluateSpawnCondition, spawnFilterContext };
|
|
185
|
+
|
|
186
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZGl0aW9ucy5lcy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvY29uZGl0aW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEV2YWx1YXRlRmlsdGVyT3B0aW9ucywgRmlsdGVyQ29udGV4dCwgRmlsdGVyRW50aXR5VmlldyB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvZW50aXRpZXMnO1xuaW1wb3J0IHsgZXZhbHVhdGVGaWx0ZXIgfSBmcm9tICdAanNwcmlzbWFyaW5lL2VudGl0aWVzJztcbmltcG9ydCB0eXBlIHsgUmFuZG9tU291cmNlIH0gZnJvbSAnQGpzcHJpc21hcmluZS9wcmVkaWNhdGVzJztcblxuaW1wb3J0IHR5cGUgeyBTcGF3bkNvbnN0YW50cyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IFNQQVdOX0NPTlNUQU5UUyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB0eXBlIHsgRGlmZmljdWx0eSwgU3Bhd25Db25kaXRpb24sIFNwYXduRGVsYXksIFNwYXduUnVsZUNvbXBvbmVudCB9IGZyb20gJy4vcnVsZXMnO1xuaW1wb3J0IHsgRElGRklDVUxUSUVTIH0gZnJvbSAnLi9ydWxlcyc7XG5pbXBvcnQgdHlwZSB7IFNwYXduUGFzcywgU3Bhd25Qb3NpdGlvbiwgU3Bhd25Xb3JsZCB9IGZyb20gJy4vd29ybGQnO1xuaW1wb3J0IHsgZGlzdGFuY2VTcXVhcmVkLCBwYXNzQXQgfSBmcm9tICcuL3dvcmxkJztcblxuLyoqXG4gKiBEZWNpZGluZyB3aGV0aGVyIG9uZSBjb25kaXRpb24gb2YgYSBzcGF3biBydWxlIGFsbG93cyBhIHBvc2l0aW9uLlxuICpcbiAqIEEgcnVsZSdzIGBjb25kaXRpb25zYCBhcmUgYWx0ZXJuYXRpdmVzOiB0aGUgcnVsZSBhbGxvd3MgYSBwb3NpdGlvbiB3aGVuIGFueVxuICogb25lIGNvbmRpdGlvbiBkb2VzLiBFYWNoIGNvbmRpdGlvbiBpcyBhIGNvbmp1bmN0aW9uIG9mIGl0cyBjb21wb25lbnRzLCBhbmRcbiAqIHRoaXMgbW9kdWxlIHJlcG9ydHMgd2hpY2ggY29tcG9uZW50IHJlamVjdGVkIGEgcG9zaXRpb24gc28gYSBzZXJ2ZXIgY2FuXG4gKiBleHBsYWluIGFuIGVtcHR5IHNwYXduIGF0dGVtcHQgYW5kIGEgdGVzdCBjYW4gbmFtZSB0aGUgY29tcG9uZW50IGl0IGNvdmVycy5cbiAqXG4gKiBgbWluZWNyYWZ0OmJpb21lX2ZpbHRlcmAgZ29lcyB0aHJvdWdoIHRoZSBmaWx0ZXIgZXZhbHVhdG9yIG9mXG4gKiBgQGpzcHJpc21hcmluZS9lbnRpdGllc2AsIGJlY2F1c2Ugc3Bhd24gcnVsZXMsIGVudGl0eSBkZWZpbml0aW9ucyBhbmQgdHJhZGVcbiAqIHRhYmxlcyBzaGFyZSBvbmUgZmlsdGVyIGdyYW1tYXIgYW5kIG9uZSBldmFsdWF0b3IuXG4gKi9cblxuLyoqIFdoYXQgb25lIGNvbmRpdGlvbiBldmFsdWF0aW9uIHByb2R1Y2VkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF3bkNvbmRpdGlvblJlc3VsdCB7XG4gICAgcmVhZG9ubHkgcGFzc2VkOiBib29sZWFuO1xuICAgIC8qKiBUaGUgZmlyc3QgY29tcG9uZW50IHRoYXQgcmVqZWN0ZWQgdGhlIHBvc2l0aW9uLCBhYnNlbnQgd2hlbiB0aGUgY29uZGl0aW9uIHBhc3NlZC4gKi9cbiAgICByZWFkb25seSByZWplY3RlZEJ5PzogU3Bhd25SdWxlQ29tcG9uZW50O1xufVxuXG4vKiogUmVhZHMgdGhlIGNvb2xkb3ducyBgbWluZWNyYWZ0OmRlbGF5X2ZpbHRlcmAga2VlcHMsIGtleWVkIGJ5IGl0cyBgaWRlbnRpZmllcmAuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXduRGVsYXlWaWV3IHtcbiAgICAvKiogVGhlIHRpY2sgdGhlIG5hbWVkIGNvb2xkb3duIG5leHQgYWxsb3dzIGEgc3Bhd24sIG9yIHVuZGVmaW5lZCB3aGVuIGl0IGhhcyBuZXZlciBydW4uICovXG4gICAgcmVhZHlBdChpZGVudGlmaWVyOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhlIGNvb2xkb3ducyBgbWluZWNyYWZ0OmRlbGF5X2ZpbHRlcmAga2VlcHMuXG4gKlxuICogVGhlIHRocmVlIHBpbGxhZ2VyIHBhdHJvbCBjb25kaXRpb25zIGVhY2ggbmFtZSB0aGVpciBvd24gaWRlbnRpZmllciwgd2hpY2hcbiAqIGlzIGhvdyBvbmUgcGVyLWRpZmZpY3VsdHkgY29vbGRvd24gZXhpc3RzIHBlciB3b3JsZCByYXRoZXIgdGhhbiBvbmUgcGVyXG4gKiBjb25kaXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBTcGF3bkRlbGF5cyBpbXBsZW1lbnRzIFNwYXduRGVsYXlWaWV3IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlYWR5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICAgIC8qKiBUaGUgdGljayB0aGUgbmFtZWQgY29vbGRvd24gbmV4dCBhbGxvd3MgYSBzcGF3biwgb3IgdW5kZWZpbmVkIHdoZW4gaXQgaGFzIG5ldmVyIHJ1bi4gKi9cbiAgICBwdWJsaWMgcmVhZHlBdChpZGVudGlmaWVyOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkeS5nZXQoaWRlbnRpZmllcik7XG4gICAgfVxuXG4gICAgLyoqIFNldHMgdGhlIHRpY2sgYXQgd2hpY2ggdGhlIG5hbWVkIGNvb2xkb3duIGFsbG93cyB0aGUgbmV4dCBzcGF3bi4gKi9cbiAgICBwdWJsaWMgc2NoZWR1bGUoaWRlbnRpZmllcjogc3RyaW5nLCB0aWNrOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWFkeS5zZXQoaWRlbnRpZmllciwgdGljayk7XG4gICAgfVxuXG4gICAgLyoqIERyYXdzIGEgZGVsYXkgaW5zaWRlIHRoZSBmaWx0ZXIncyByYW5nZSBhbmQgc2NoZWR1bGVzIGl0IGZyb20gYHRpY2tgLiAqL1xuICAgIHB1YmxpYyBzY2hlZHVsZUZyb20oZGVsYXk6IFNwYXduRGVsYXksIHRpY2s6IG51bWJlciwgcmFuZG9tOiBSYW5kb21Tb3VyY2UpOiB2b2lkIHtcbiAgICAgICAgaWYgKGRlbGF5LmlkZW50aWZpZXIgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBzcGFuID0gTWF0aC5tYXgoMCwgZGVsYXkubWF4IC0gZGVsYXkubWluKTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZShkZWxheS5pZGVudGlmaWVyLCB0aWNrICsgZGVsYXkubWluICsgTWF0aC5mbG9vcihyYW5kb20ubmV4dEZsb2F0KCkgKiAoc3BhbiArIDEpKSk7XG4gICAgfVxufVxuXG4vKiogRXZlcnl0aGluZyBvbmUgY29uZGl0aW9uIGV2YWx1YXRpb24gbmVlZHMgYmV5b25kIHRoZSBjb25kaXRpb24gYW5kIHRoZSBwb3NpdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3Bhd25Db25kaXRpb25Db250ZXh0IHtcbiAgICByZWFkb25seSB3b3JsZDogU3Bhd25Xb3JsZDtcbiAgICAvKiogVGhlIGVudGl0eSB0aGUgcnVsZSBzcGF3bnMsIHdoaWNoIGBtaW5lY3JhZnQ6ZGVuc2l0eV9saW1pdGAgY291bnRzLiAqL1xuICAgIHJlYWRvbmx5IGlkZW50aWZpZXI6IHN0cmluZztcbiAgICByZWFkb25seSByYW5kb206IFJhbmRvbVNvdXJjZTtcbiAgICAvKiogVGhlIGN1cnJlbnQgd29ybGQgdGljaywgd2hpY2ggYG1pbmVjcmFmdDpkZWxheV9maWx0ZXJgIGNvbXBhcmVzLiAqL1xuICAgIHJlYWRvbmx5IHRpY2s6IG51bWJlcjtcbiAgICByZWFkb25seSBjb25zdGFudHM/OiBTcGF3bkNvbnN0YW50cztcbiAgICByZWFkb25seSBkZWxheXM/OiBTcGF3bkRlbGF5VmlldztcbiAgICAvKiogUmVjZWl2ZXMgZXZlcnkgYmlvbWUgZmlsdGVyIHRlc3QgdGhlIGV2YWx1YXRvciBjb3VsZCBub3QgYW5zd2VyLiAqL1xuICAgIHJlYWRvbmx5IG9uVW5hbnN3ZXJlZD86IEV2YWx1YXRlRmlsdGVyT3B0aW9uc1snb25VbmFuc3dlcmVkJ107XG59XG5cbmNvbnN0IHJlamVjdGVkID0gKGNvbXBvbmVudDogU3Bhd25SdWxlQ29tcG9uZW50KTogU3Bhd25Db25kaXRpb25SZXN1bHQgPT4gKHsgcGFzc2VkOiBmYWxzZSwgcmVqZWN0ZWRCeTogY29tcG9uZW50IH0pO1xuXG5jb25zdCBQQVNTRUQ6IFNwYXduQ29uZGl0aW9uUmVzdWx0ID0geyBwYXNzZWQ6IHRydWUgfTtcblxuLyoqXG4gKiBCdWlsZHMgdGhlIGZpbHRlciBjb250ZXh0IGEgYG1pbmVjcmFmdDpiaW9tZV9maWx0ZXJgIHJlYWRzLlxuICpcbiAqIEEgc3Bhd24gcnVsZSBoYXMgbm8gZW50aXR5IHlldCwgc28gdGhlIGBzZWxmYCBzdWJqZWN0IGlzIHRoZSBwb3NpdGlvbjogaXRzXG4gKiBiaW9tZSB0YWdzIGFuc3dlciBgaGFzX2Jpb21lX3RhZ2AsIGl0cyBiaW9tZSBhbnN3ZXJzIGBpc19iaW9tZWAsIGFuZCBpdHNcbiAqIHNpdGUgZmxhZ3MgYW5zd2VyIGBpc19zbm93X2NvdmVyZWRgLCBgaXNfdW5kZXJncm91bmRgLCBgaXNfdW5kZXJ3YXRlcmAgYW5kXG4gKiBgaW5fbGF2YWAuIEV2ZXJ5IG90aGVyIHRlc3QgdGhlIHNoYXJlZCBncmFtbWFyIGFsbG93cyBnb2VzIHVuYW5zd2VyZWQgYW5kIGlzXG4gKiByZXBvcnRlZCwgd2hpY2ggaXMgd2hhdCB0aGUgZW5naW5lIGRvZXMgZm9yIGEgZmFjdCBpdCBjYW5ub3QgZXN0YWJsaXNoLlxuICovXG5leHBvcnQgY29uc3Qgc3Bhd25GaWx0ZXJDb250ZXh0ID0gKHdvcmxkOiBTcGF3bldvcmxkLCBhdDogU3Bhd25Qb3NpdGlvbik6IEZpbHRlckNvbnRleHQgPT4ge1xuICAgIGNvbnN0IHNlbGY6IEZpbHRlckVudGl0eVZpZXcgPSB7XG4gICAgICAgIGZsYWc6IChuYW1lKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdpc19zbm93X2NvdmVyZWQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ybGQuc2l0ZSgnc25vd19jb3ZlcmVkJywgYXQpO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2lzX3VuZGVyZ3JvdW5kJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdvcmxkLnNpdGUoJ3VuZGVyZ3JvdW5kJywgYXQpO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2lzX3VuZGVyd2F0ZXInOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2luX3dhdGVyJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdvcmxkLnNpdGUoJ3VuZGVyd2F0ZXInLCBhdCk7XG4gICAgICAgICAgICAgICAgY2FzZSAnaW5fbGF2YSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3b3JsZC5zaXRlKCdsYXZhJywgYXQpO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG5hbWVzOiAobmFtZSkgPT4ge1xuICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdoYXNfYmlvbWVfdGFnJykgcmV0dXJuIHdvcmxkLmJpb21lVGFncyhhdCk7XG4gICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2lzX2Jpb21lJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJpb21lID0gd29ybGQuYmlvbWU/LihhdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJpb21lID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBbYmlvbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzZWxmLFxuICAgICAgICB3b3JsZDogeyBkaWZmaWN1bHR5OiAoKSA9PiB3b3JsZC5kaWZmaWN1bHR5KCksIHdlYXRoZXI6ICgpID0+IHdvcmxkLndlYXRoZXIoKSB9XG4gICAgfTtcbn07XG5cbi8qKiBUaGUgbGlnaHQgYSBicmlnaHRuZXNzIGZpbHRlciBjb21wYXJlcywgYWZ0ZXIgdGhlIGRhcmtlbmluZyB3ZWF0aGVyIGFwcGxpZXMgdG8gaXQuICovXG5jb25zdCBicmlnaHRuZXNzQXQgPSAoXG4gICAgd29ybGQ6IFNwYXduV29ybGQsXG4gICAgYXQ6IFNwYXduUG9zaXRpb24sXG4gICAgYWRqdXN0Rm9yV2VhdGhlcjogYm9vbGVhbixcbiAgICBjb25zdGFudHM6IFNwYXduQ29uc3RhbnRzXG4pOiBudW1iZXIgPT4ge1xuICAgIGNvbnN0IGxpZ2h0ID0gd29ybGQubGlnaHQoYXQpO1xuICAgIGlmICghYWRqdXN0Rm9yV2VhdGhlcikgcmV0dXJuIGxpZ2h0O1xuICAgIGNvbnN0IHdlYXRoZXIgPSB3b3JsZC53ZWF0aGVyKCk7XG4gICAgaWYgKHdlYXRoZXIgPT09ICdyYWluJykgcmV0dXJuIE1hdGgubWF4KDAsIGxpZ2h0IC0gY29uc3RhbnRzLnJhaW5EYXJrZW5pbmcpO1xuICAgIGlmICh3ZWF0aGVyID09PSAndGh1bmRlcicpIHJldHVybiBNYXRoLm1heCgwLCBsaWdodCAtIGNvbnN0YW50cy50aHVuZGVyRGFya2VuaW5nKTtcbiAgICByZXR1cm4gbGlnaHQ7XG59O1xuXG5jb25zdCBkaWZmaWN1bHR5UmFuayA9IChkaWZmaWN1bHR5OiBEaWZmaWN1bHR5KTogbnVtYmVyID0+IERJRkZJQ1VMVElFUy5pbmRleE9mKGRpZmZpY3VsdHkpO1xuXG4vKiogVGhlIGRpc3RhbmNlIGZyb20gYSBwb3NpdGlvbiB0byB0aGUgbmVhcmVzdCBwbGF5ZXIsIG9yIHVuZGVmaW5lZCB3aGVuIG5vIHBsYXllciBpcyBsb2FkZWQuICovXG5jb25zdCBuZWFyZXN0UGxheWVyRGlzdGFuY2UgPSAod29ybGQ6IFNwYXduV29ybGQsIGF0OiBTcGF3blBvc2l0aW9uKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgICBsZXQgYmVzdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgcGxheWVyIG9mIHdvcmxkLnBsYXllcnMoKSkge1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGRpc3RhbmNlU3F1YXJlZChwbGF5ZXIucG9zaXRpb24sIGF0KTtcbiAgICAgICAgaWYgKGJlc3QgPT09IHVuZGVmaW5lZCB8fCBkaXN0YW5jZSA8IGJlc3QpIGJlc3QgPSBkaXN0YW5jZTtcbiAgICB9XG4gICAgcmV0dXJuIGJlc3QgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IE1hdGguc3FydChiZXN0KTtcbn07XG5cbmNvbnN0IG1hdGNoZXNCbG9jayA9IChpZGVudGlmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQsIG5hbWVzOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4gPT5cbiAgICBpZGVudGlmaWVyICE9PSB1bmRlZmluZWQgJiYgbmFtZXMuaW5jbHVkZXMoaWRlbnRpZmllcik7XG5cbi8qKlxuICogRGVjaWRlcyB3aGV0aGVyIG9uZSBjb25kaXRpb24gYWxsb3dzIGEgc3Bhd24gYXQgYSBwb3NpdGlvbi5cbiAqXG4gKiBUaGUgY29tcG9uZW50cyBydW4gY2hlYXBlc3QgZmlyc3QsIGFuZCB0aGUgZmlyc3Qgb25lIHRoYXQgcmVqZWN0cyBuYW1lc1xuICogaXRzZWxmIGluIHRoZSByZXN1bHQuIEEgY29uZGl0aW9uIHRoYXQgZGVjbGFyZXMgbmVpdGhlclxuICogYG1pbmVjcmFmdDpzcGF3bnNfdW5kZXJ3YXRlcmAgbm9yIGBtaW5lY3JhZnQ6c3Bhd25zX2xhdmFgIHJlZnVzZXMgYSBwb3NpdGlvblxuICogaW5zaWRlIGVpdGhlciBsaXF1aWQsIHdoaWNoIGlzIHRoZSByZWFkaW5nIHRoYXQga2VlcHMgbGFuZCBtb2JzIG91dCBvZiB0aGVcbiAqIG9jZWFuOyBNb2phbmcgc3RhdGVzIHRoZSBjb21wb25lbnRzIGFuZCBub3QgdGhhdCBydWxlLlxuICpcbiAqIEBwYXJhbSByZXF1ZXN0ZWRQYXNzIC0gVGhlIHBhc3MgdGhlIHNwYXduIGxvb3AgaXMgZXZhbHVhdGluZywgb3IgYWJzZW50IHRvXG4gKiAgIGRlcml2ZSBpdCBmcm9tIHRoZSB3b3JsZCdzIHNpdGUgZmFjdHMuXG4gKi9cbmV4cG9ydCBjb25zdCBldmFsdWF0ZVNwYXduQ29uZGl0aW9uID0gKFxuICAgIGNvbmRpdGlvbjogU3Bhd25Db25kaXRpb24sXG4gICAgYXQ6IFNwYXduUG9zaXRpb24sXG4gICAgY29udGV4dDogU3Bhd25Db25kaXRpb25Db250ZXh0LFxuICAgIHJlcXVlc3RlZFBhc3M/OiBTcGF3blBhc3Ncbik6IFNwYXduQ29uZGl0aW9uUmVzdWx0ID0+IHtcbiAgICBjb25zdCB7IHdvcmxkIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IGNvbnN0YW50cyA9IGNvbnRleHQuY29uc3RhbnRzID8/IFNQQVdOX0NPTlNUQU5UUztcbiAgICBjb25zdCBwYXNzID0gcmVxdWVzdGVkUGFzcyA/PyBwYXNzQXQod29ybGQsIGF0KTtcblxuICAgIGlmIChjb25kaXRpb24uc3Bhd25zT25TdXJmYWNlIHx8IGNvbmRpdGlvbi5zcGF3bnNVbmRlcmdyb3VuZCkge1xuICAgICAgICBpZiAocGFzcyA9PT0gJ3N1cmZhY2UnICYmICFjb25kaXRpb24uc3Bhd25zT25TdXJmYWNlKSByZXR1cm4gcmVqZWN0ZWQoJ21pbmVjcmFmdDpzcGF3bnNfdW5kZXJncm91bmQnKTtcbiAgICAgICAgaWYgKHBhc3MgPT09ICd1bmRlcmdyb3VuZCcgJiYgIWNvbmRpdGlvbi5zcGF3bnNVbmRlcmdyb3VuZCkgcmV0dXJuIHJlamVjdGVkKCdtaW5lY3JhZnQ6c3Bhd25zX29uX3N1cmZhY2UnKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbldhdGVyID0gd29ybGQuc2l0ZSgndW5kZXJ3YXRlcicsIGF0KTtcbiAgICBjb25zdCBpbkxhdmEgPSB3b3JsZC5zaXRlKCdsYXZhJywgYXQpO1xuICAgIGlmIChjb25kaXRpb24uc3Bhd25zVW5kZXJ3YXRlciAmJiAhaW5XYXRlcikgcmV0dXJuIHJlamVjdGVkKCdtaW5lY3JhZnQ6c3Bhd25zX3VuZGVyd2F0ZXInKTtcbiAgICBpZiAoY29uZGl0aW9uLnNwYXduc0xhdmEgJiYgIWluTGF2YSkgcmV0dXJuIHJlamVjdGVkKCdtaW5lY3JhZnQ6c3Bhd25zX2xhdmEnKTtcbiAgICBpZiAoIWNvbmRpdGlvbi5zcGF3bnNVbmRlcndhdGVyICYmIGluV2F0ZXIpIHJldHVybiByZWplY3RlZCgnbWluZWNyYWZ0OnNwYXduc191bmRlcndhdGVyJyk7XG4gICAgaWYgKCFjb25kaXRpb24uc3Bhd25zTGF2YSAmJiBpbkxhdmEpIHJldHVybiByZWplY3RlZCgnbWluZWNyYWZ0OnNwYXduc19sYXZhJyk7XG5cbiAgICBpZiAoY29uZGl0aW9uLmRpc2FsbG93U3Bhd25zSW5CdWJibGUgJiYgd29ybGQuc2l0ZSgnYnViYmxlX2NvbHVtbicsIGF0KSlcbiAgICAgICAgcmV0dXJuIHJlamVjdGVkKCdtaW5lY3JhZnQ6ZGlzYWxsb3dfc3Bhd25zX2luX2J1YmJsZScpO1xuXG4gICAgaWYgKGNvbmRpdGlvbi5oZWlnaHQgIT09IHVuZGVmaW5lZCAmJiAoYXQueSA8IGNvbmRpdGlvbi5oZWlnaHQubWluIHx8IGF0LnkgPiBjb25kaXRpb24uaGVpZ2h0Lm1heCkpXG4gICAgICAgIHJldHVybiByZWplY3RlZCgnbWluZWNyYWZ0OmhlaWdodF9maWx0ZXInKTtcblxuICAgIGlmIChjb25kaXRpb24uYmxvY2tzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgYmVsb3cgPSB3b3JsZC5ibG9jayh7IHg6IGF0LngsIHk6IGF0LnkgLSAxLCB6OiBhdC56IH0pO1xuICAgICAgICBpZiAoIW1hdGNoZXNCbG9jayhiZWxvdywgY29uZGl0aW9uLmJsb2NrcykpIHJldHVybiByZWplY3RlZCgnbWluZWNyYWZ0OnNwYXduc19vbl9ibG9ja19maWx0ZXInKTtcbiAgICB9XG5cbiAgICBpZiAoY29uZGl0aW9uLnByZXZlbnRlZEJsb2NrcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGJlbG93ID0gd29ybGQuYmxvY2soeyB4OiBhdC54LCB5OiBhdC55IC0gMSwgejogYXQueiB9KTtcbiAgICAgICAgaWYgKG1hdGNoZXNCbG9jayhiZWxvdywgY29uZGl0aW9uLnByZXZlbnRlZEJsb2NrcykpXG4gICAgICAgICAgICByZXR1cm4gcmVqZWN0ZWQoJ21pbmVjcmFmdDpzcGF3bnNfb25fYmxvY2tfcHJldmVudGVkX2ZpbHRlcicpO1xuICAgIH1cblxuICAgIGlmIChjb25kaXRpb24uYWJvdmVCbG9ja3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBUaGUgY29tcG9uZW50IG5hbWVzIG5vIGRpcmVjdGlvbi4gXCJTcGF3bnMgYWJvdmUgYmxvY2tcIiByZWFkcyBhcyB0aGVcbiAgICAgICAgLy8gZW50aXR5IHN0YW5kaW5nIGFib3ZlIG9uZSBvZiB0aGUgYmxvY2tzLCBzbyB0aGUgc2NhbiBydW5zIGRvd253YXJkXG4gICAgICAgIC8vIGZyb20gdGhlIHBvc2l0aW9uIGZvciBgZGlzdGFuY2VgIGJsb2Nrcy5cbiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGRlcHRoID0gMTsgZGVwdGggPD0gY29uZGl0aW9uLmFib3ZlQmxvY2tzLmRpc3RhbmNlICYmICFmb3VuZDsgZGVwdGggKz0gMSkge1xuICAgICAgICAgICAgZm91bmQgPSBtYXRjaGVzQmxvY2sod29ybGQuYmxvY2soeyB4OiBhdC54LCB5OiBhdC55IC0gZGVwdGgsIHo6IGF0LnogfSksIGNvbmRpdGlvbi5hYm92ZUJsb2Nrcy5ibG9ja3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZm91bmQpIHJldHVybiByZWplY3RlZCgnbWluZWNyYWZ0OnNwYXduc19hYm92ZV9ibG9ja19maWx0ZXInKTtcbiAgICB9XG5cbiAgICBpZiAoY29uZGl0aW9uLmJyaWdodG5lc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBsaWdodCA9IGJyaWdodG5lc3NBdCh3b3JsZCwgYXQsIGNvbmRpdGlvbi5icmlnaHRuZXNzLmFkanVzdEZvcldlYXRoZXIsIGNvbnN0YW50cyk7XG4gICAgICAgIGlmIChsaWdodCA8IGNvbmRpdGlvbi5icmlnaHRuZXNzLm1pbiB8fCBsaWdodCA+IGNvbmRpdGlvbi5icmlnaHRuZXNzLm1heClcbiAgICAgICAgICAgIHJldHVybiByZWplY3RlZCgnbWluZWNyYWZ0OmJyaWdodG5lc3NfZmlsdGVyJyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmRpdGlvbi5kaWZmaWN1bHR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgcmFuayA9IGRpZmZpY3VsdHlSYW5rKHdvcmxkLmRpZmZpY3VsdHkoKSk7XG4gICAgICAgIGlmIChyYW5rIDwgZGlmZmljdWx0eVJhbmsoY29uZGl0aW9uLmRpZmZpY3VsdHkubWluKSB8fCByYW5rID4gZGlmZmljdWx0eVJhbmsoY29uZGl0aW9uLmRpZmZpY3VsdHkubWF4KSlcbiAgICAgICAgICAgIHJldHVybiByZWplY3RlZCgnbWluZWNyYWZ0OmRpZmZpY3VsdHlfZmlsdGVyJyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmRpdGlvbi53b3JsZEFnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGFnZSA9IHdvcmxkLmFnZSgpO1xuICAgICAgICBpZiAoYWdlIDwgY29uZGl0aW9uLndvcmxkQWdlLm1pbikgcmV0dXJuIHJlamVjdGVkKCdtaW5lY3JhZnQ6d29ybGRfYWdlX2ZpbHRlcicpO1xuICAgICAgICBpZiAoY29uZGl0aW9uLndvcmxkQWdlLm1heCA+PSAwICYmIGFnZSA+IGNvbmRpdGlvbi53b3JsZEFnZS5tYXgpIHJldHVybiByZWplY3RlZCgnbWluZWNyYWZ0OndvcmxkX2FnZV9maWx0ZXInKTtcbiAgICB9XG5cbiAgICBpZiAoY29uZGl0aW9uLm1vYkV2ZW50ICE9PSB1bmRlZmluZWQgJiYgIXdvcmxkLm1vYkV2ZW50QWN0aXZlKGNvbmRpdGlvbi5tb2JFdmVudCkpXG4gICAgICAgIHJldHVybiByZWplY3RlZCgnbWluZWNyYWZ0Om1vYl9ldmVudF9maWx0ZXInKTtcblxuICAgIGlmIChjb25kaXRpb24uZGlzdGFuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IG5lYXJlc3RQbGF5ZXJEaXN0YW5jZSh3b3JsZCwgYXQpO1xuICAgICAgICBpZiAoZGlzdGFuY2UgPT09IHVuZGVmaW5lZCB8fCBkaXN0YW5jZSA8IGNvbmRpdGlvbi5kaXN0YW5jZS5taW4gfHwgZGlzdGFuY2UgPiBjb25kaXRpb24uZGlzdGFuY2UubWF4KVxuICAgICAgICAgICAgcmV0dXJuIHJlamVjdGVkKCdtaW5lY3JhZnQ6ZGlzdGFuY2VfZmlsdGVyJyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmRpdGlvbi5wbGF5ZXJJblZpbGxhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB7IGRpc3RhbmNlLCB2aWxsYWdlQm9yZGVyVG9sZXJhbmNlIH0gPSBjb25kaXRpb24ucGxheWVySW5WaWxsYWdlO1xuICAgICAgICBjb25zdCBpblJhbmdlID0gd29ybGQucGxheWVycygpLmZpbHRlcigocGxheWVyKSA9PiBkaXN0YW5jZVNxdWFyZWQocGxheWVyLnBvc2l0aW9uLCBhdCkgPD0gZGlzdGFuY2UgKiBkaXN0YW5jZSk7XG4gICAgICAgIGNvbnN0IG5lYXJWaWxsYWdlID0gaW5SYW5nZS5zb21lKChwbGF5ZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJvcmRlciA9IHdvcmxkLnZpbGxhZ2VCb3JkZXJEaXN0YW5jZT8uKHBsYXllci5wb3NpdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gYm9yZGVyICE9PSB1bmRlZmluZWQgJiYgYm9yZGVyIDw9IHZpbGxhZ2VCb3JkZXJUb2xlcmFuY2U7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIW5lYXJWaWxsYWdlKSByZXR1cm4gcmVqZWN0ZWQoJ21pbmVjcmFmdDpwbGF5ZXJfaW5fdmlsbGFnZV9maWx0ZXInKTtcbiAgICB9XG5cbiAgICBpZiAoY29uZGl0aW9uLmJpb21lRmlsdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uczogRXZhbHVhdGVGaWx0ZXJPcHRpb25zID0ge307XG4gICAgICAgIGlmIChjb250ZXh0Lm9uVW5hbnN3ZXJlZCAhPT0gdW5kZWZpbmVkKSBvcHRpb25zLm9uVW5hbnN3ZXJlZCA9IGNvbnRleHQub25VbmFuc3dlcmVkO1xuICAgICAgICBpZiAoIWV2YWx1YXRlRmlsdGVyKGNvbmRpdGlvbi5iaW9tZUZpbHRlciwgc3Bhd25GaWx0ZXJDb250ZXh0KHdvcmxkLCBhdCksIG9wdGlvbnMpKVxuICAgICAgICAgICAgcmV0dXJuIHJlamVjdGVkKCdtaW5lY3JhZnQ6YmlvbWVfZmlsdGVyJyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmRpdGlvbi5kZW5zaXR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbGltaXQgPSBwYXNzID09PSAnc3VyZmFjZScgPyBjb25kaXRpb24uZGVuc2l0eS5zdXJmYWNlIDogY29uZGl0aW9uLmRlbnNpdHkudW5kZXJncm91bmQ7XG4gICAgICAgIGlmIChsaW1pdCA+PSAwICYmIHdvcmxkLnR5cGVDb3VudChjb250ZXh0LmlkZW50aWZpZXIsIGF0LCBjb25zdGFudHMuZGVuc2l0eVJhZGl1cykgPj0gbGltaXQpXG4gICAgICAgICAgICByZXR1cm4gcmVqZWN0ZWQoJ21pbmVjcmFmdDpkZW5zaXR5X2xpbWl0Jyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmRpdGlvbi5kZWxheSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBjb25kaXRpb24uZGVsYXkuaWRlbnRpZmllcjtcbiAgICAgICAgY29uc3QgcmVhZHlBdCA9IGlkZW50aWZpZXIgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGNvbnRleHQuZGVsYXlzPy5yZWFkeUF0KGlkZW50aWZpZXIpO1xuICAgICAgICBpZiAocmVhZHlBdCAhPT0gdW5kZWZpbmVkICYmIGNvbnRleHQudGljayA8IHJlYWR5QXQpIHJldHVybiByZWplY3RlZCgnbWluZWNyYWZ0OmRlbGF5X2ZpbHRlcicpO1xuICAgICAgICBpZiAoY29udGV4dC5yYW5kb20ubmV4dEZsb2F0KCkgKiAxMDAgPj0gY29uZGl0aW9uLmRlbGF5LnNwYXduQ2hhbmNlKSByZXR1cm4gcmVqZWN0ZWQoJ21pbmVjcmFmdDpkZWxheV9maWx0ZXInKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUEFTU0VEO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBNENBLElBQWEsY0FBYixNQUFtRDtDQUMvQyx3QkFBeUIsSUFBSSxJQUFvQjs7Q0FHakQsUUFBZSxZQUF3QztFQUNuRCxPQUFPLEtBQUssTUFBTSxJQUFJLFVBQVU7Q0FDcEM7O0NBR0EsU0FBZ0IsWUFBb0IsTUFBb0I7RUFDcEQsS0FBSyxNQUFNLElBQUksWUFBWSxJQUFJO0NBQ25DOztDQUdBLGFBQW9CLE9BQW1CLE1BQWMsUUFBNEI7RUFDN0UsSUFBSSxNQUFNLGVBQWUsS0FBQSxHQUFXO0VBQ3BDLE1BQU0sT0FBTyxLQUFLLElBQUksR0FBRyxNQUFNLE1BQU0sTUFBTSxHQUFHO0VBQzlDLEtBQUssU0FBUyxNQUFNLFlBQVksT0FBTyxNQUFNLE1BQU0sS0FBSyxNQUFNLE9BQU8sVUFBVSxLQUFLLE9BQU8sRUFBRSxDQUFDO0NBQ2xHO0FBQ0o7QUFnQkEsSUFBTSxZQUFZLGVBQXlEO0NBQUUsUUFBUTtDQUFPLFlBQVk7QUFBVTtBQUVsSCxJQUFNLFNBQStCLEVBQUUsUUFBUSxLQUFLOzs7Ozs7Ozs7O0FBV3BELElBQWEsc0JBQXNCLE9BQW1CLE9BQXFDO0NBMkJ2RixPQUFPO0VBQ0gsTUFBQTtHQTFCQSxPQUFPLFNBQVM7SUFDWixRQUFRLE1BQVI7S0FDSSxLQUFLLG1CQUNELE9BQU8sTUFBTSxLQUFLLGdCQUFnQixFQUFFO0tBQ3hDLEtBQUssa0JBQ0QsT0FBTyxNQUFNLEtBQUssZUFBZSxFQUFFO0tBQ3ZDLEtBQUs7S0FDTCxLQUFLLFlBQ0QsT0FBTyxNQUFNLEtBQUssY0FBYyxF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
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
// src/constants.ts
|
|
4
|
+
/**
|
|
5
|
+
* The numbers this project chose, read from
|
|
6
|
+
* `src/tables/spawnConstants.json`. A host replaces the whole table through
|
|
7
|
+
* `SpawnerOptions.constants`.
|
|
8
|
+
*/
|
|
9
|
+
var SPAWN_CONSTANTS = require("./tables/spawnConstants.cjs.cjs").default;
|
|
10
|
+
/**
|
|
11
|
+
* The cap one pool is allowed in the spawn region right now.
|
|
12
|
+
*
|
|
13
|
+
* @param players - How many players the spawn region holds, which scales a
|
|
14
|
+
* `per_player` cap.
|
|
15
|
+
* @returns The cap, or undefined when the pool has none and other machinery
|
|
16
|
+
* limits it.
|
|
17
|
+
*/
|
|
18
|
+
var poolCapFor = (pool, players, constants = SPAWN_CONSTANTS) => {
|
|
19
|
+
const entry = constants.pools[pool];
|
|
20
|
+
if (entry === void 0 || entry.cap === null) return void 0;
|
|
21
|
+
return entry.scope === "per_player" ? entry.cap * players : entry.cap;
|
|
22
|
+
};
|
|
23
|
+
/** How many ticks pass between two spawn cycles of one pool. */
|
|
24
|
+
var cycleTicksFor = (pool, constants = SPAWN_CONSTANTS) => constants.pools[pool]?.cycleTicks;
|
|
25
|
+
exports.SPAWN_CONSTANTS = SPAWN_CONSTANTS;
|
|
26
|
+
exports.cycleTicksFor = cycleTicksFor;
|
|
27
|
+
exports.poolCapFor = poolCapFor;
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmNqcy5janMiLCJuYW1lcyI6WyJ0YWJsZSJdLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25zdGFudHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHRhYmxlIGZyb20gJy4vdGFibGVzL3NwYXduQ29uc3RhbnRzLmpzb24nO1xuaW1wb3J0IHR5cGUgeyBQb3B1bGF0aW9uUG9vbCB9IGZyb20gJy4vcnVsZXMnO1xuXG4vKipcbiAqIFRoZSBudW1iZXJzIHRoZSBzcGF3bmluZyBhbGdvcml0aG0gbmVlZHMgYW5kIE1vamFuZyBkb2VzIG5vdCBwdWJsaXNoLlxuICpcbiAqIE1vamFuZyBkb2N1bWVudHMgdGhlIHBvb2wgbmFtZXMgYW5kIGV2ZXJ5IHNwYXduIHJ1bGUgY29tcG9uZW50J3NcbiAqIHBhcmFtZXRlcnMsIGFuZCBwdWJsaXNoZXMgbm8gc3Bhd24gYXR0ZW1wdCByYXRlLCBubyBjYXAgdmFsdWUsIG5vIHNwYXduXG4gKiByYWRpdXMgYW5kIG5vIGxpZ2h0IGFsZ29yaXRobS4gVGhlIG9ubHkgbnVtYmVycyBpbiBwcmludCBhcmUgdGhlXG4gKiB0aWxkZS1oZWRnZWQgXCJUeXBpY2FsIENhcFwiIGNvbHVtbiBvZiBgRW50aXR5U3Bhd25pbmdEZWVwRGl2ZS5tZGAuIEV2ZXJ5XG4gKiBudW1iZXIgaGVyZSBpcyB0aGVyZWZvcmUgdGhpcyBwcm9qZWN0J3MgY2hvaWNlLCBpdCBsaXZlcyBpblxuICogYHNyYy90YWJsZXMvc3Bhd25Db25zdGFudHMuanNvbmAgcmF0aGVyIHRoYW4gaW4gY29kZSBzbyBpdCBpcyB2aXNpYmxlIGFuZFxuICogcmVwbGFjZWFibGUsIGFuZCBlYWNoIG9uZSBjYXJyaWVzIGEgYHNvdXJjZWAgc3RyaW5nIHNheWluZyB3aGVyZSBpdCBjYW1lXG4gKiBmcm9tLlxuICovXG5cbi8qKiBXaGV0aGVyIGEgcG9vbCdzIGNhcCBjb3ZlcnMgdGhlIHdob2xlIHNwYXduIHJlZ2lvbiBvciBzY2FsZXMgd2l0aCB0aGUgcGxheWVycyBpbiBpdC4gKi9cbmV4cG9ydCB0eXBlIFBvb2xDYXBTY29wZSA9ICdwZXJfcGxheWVyJyB8ICdwZXJfcmVnaW9uJztcblxuLyoqIE9uZSBwb29sJ3MgY2FwLCBjYWRlbmNlIGFuZCB0aGUgcHJvdmVuYW5jZSBvZiBib3RoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb29sQ29uc3RhbnRzIHtcbiAgICAvKiogVGhlIGNhcCwgb3IgbnVsbCBmb3IgYSBwb29sIHRoZSBkb2N1bWVudGF0aW9uIGxlYXZlcyB0byBvdGhlciBtYWNoaW5lcnkuICovXG4gICAgcmVhZG9ubHkgY2FwOiBudW1iZXIgfCBudWxsO1xuICAgIHJlYWRvbmx5IHNjb3BlOiBQb29sQ2FwU2NvcGU7XG4gICAgLyoqIEhvdyBtYW55IHRpY2tzIHBhc3MgYmV0d2VlbiB0d28gc3Bhd24gY3ljbGVzIG9mIHRoaXMgcG9vbC4gKi9cbiAgICByZWFkb25seSBjeWNsZVRpY2tzOiBudW1iZXI7XG4gICAgLyoqIFdoZXJlIHRoZSB0d28gbnVtYmVycyBjYW1lIGZyb20sIHF1b3RlZCBzbyBhIHJlYWRlciBjYW4ganVkZ2UgdGhlbS4gKi9cbiAgICByZWFkb25seSBzb3VyY2U6IHN0cmluZztcbn1cblxuLyoqIFRoZSB3aG9sZSBjb25zdGFudHMgdGFibGUuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXduQ29uc3RhbnRzIHtcbiAgICAvKiogV2h5IG5vbmUgb2YgdGhlc2UgbnVtYmVycyBhcmUgTW9qYW5nJ3MuICovXG4gICAgcmVhZG9ubHkgcHJvdmVuYW5jZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHBvb2xzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBQb29sQ29uc3RhbnRzPj47XG4gICAgLyoqIEhvdyBmYXIgZnJvbSBhIHBsYXllciwgaW4gY2h1bmtzLCB0aGUgc3Bhd25lciBsb29rcyBmb3IgYSBwb3NpdGlvbi4gKi9cbiAgICByZWFkb25seSBzcGF3blJhZGl1c0NodW5rczogbnVtYmVyO1xuICAgIHJlYWRvbmx5IHNwYXduUmFkaXVzU291cmNlOiBzdHJpbmc7XG4gICAgLyoqIEhvdyBtYW55IGNodW5rcyBvbmUgY3ljbGUgc2FtcGxlcyBwZXIgcGxheWVyLiAqL1xuICAgIHJlYWRvbmx5IGNodW5rc1BlckN5Y2xlOiBudW1iZXI7XG4gICAgLyoqIEhvdyBtYW55IHBvc2l0aW9ucyBvbmUgY3ljbGUgdHJpZXMgaW4gZWFjaCBzYW1wbGVkIGNodW5rLiAqL1xuICAgIHJlYWRvbmx5IHBvc2l0aW9uc1BlckNodW5rOiBudW1iZXI7XG4gICAgcmVhZG9ubHkgYXR0ZW1wdFNvdXJjZTogc3RyaW5nO1xuICAgIC8qKiBIb3cgZmFyIGZyb20gdGhlIGFuY2hvciwgaW4gYmxvY2tzLCBhIGhlcmQgbWVtYmVyIG1heSBiZSBwbGFjZWQuICovXG4gICAgcmVhZG9ubHkgaGVyZFJhZGl1czogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGhlcmRSYWRpdXNTb3VyY2U6IHN0cmluZztcbiAgICAvKiogVGhlIHJhZGl1cyBgbWluZWNyYWZ0OmRlbnNpdHlfbGltaXRgIGNvdW50cyBlbnRpdGllcyBvdmVyLiAqL1xuICAgIHJlYWRvbmx5IGRlbnNpdHlSYWRpdXM6IG51bWJlcjtcbiAgICByZWFkb25seSBkZW5zaXR5UmFkaXVzU291cmNlOiBzdHJpbmc7XG4gICAgLyoqIEhvdyBtdWNoIHJhaW4gbG93ZXJzIHRoZSBsaWdodCBhbiBgYWRqdXN0X2Zvcl93ZWF0aGVyYCBicmlnaHRuZXNzIGZpbHRlciBjb21wYXJlcy4gKi9cbiAgICByZWFkb25seSByYWluRGFya2VuaW5nOiBudW1iZXI7XG4gICAgLyoqIEhvdyBtdWNoIGEgdGh1bmRlcnN0b3JtIGxvd2VycyB0aGF0IGxpZ2h0LiAqL1xuICAgIHJlYWRvbmx5IHRodW5kZXJEYXJrZW5pbmc6IG51bWJlcjtcbiAgICByZWFkb25seSBkYXJrZW5pbmdTb3VyY2U6IHN0cmluZztcbiAgICAvKiogSG93IGZhciBmcm9tIGV2ZXJ5IHBsYXllciwgaW4gY2h1bmtzLCBhIG1vYiBpcyBjdWxsZWQuICovXG4gICAgcmVhZG9ubHkgZGVzcGF3blJhZGl1c0NodW5rczogbnVtYmVyO1xuICAgIC8qKiBUaGUgaGVpZ2h0IGF0IGFuZCBiZWxvdyB3aGljaCBldmVyeSBtb2IgZGVzcGF3bnMuICovXG4gICAgcmVhZG9ubHkgZGVzcGF3bkZsb29yWTogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGRlc3Bhd25Tb3VyY2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgbnVtYmVycyB0aGlzIHByb2plY3QgY2hvc2UsIHJlYWQgZnJvbVxuICogYHNyYy90YWJsZXMvc3Bhd25Db25zdGFudHMuanNvbmAuIEEgaG9zdCByZXBsYWNlcyB0aGUgd2hvbGUgdGFibGUgdGhyb3VnaFxuICogYFNwYXduZXJPcHRpb25zLmNvbnN0YW50c2AuXG4gKi9cbi8vIFRoZSB0YWJsZSBpcyBoYW5kLW1haW50YWluZWQgSlNPTiBpbiB0aGlzIHBhY2thZ2U7IGl0cyBsaXRlcmFsIHR5cGVzIGFyZSB0b29cbi8vIG5hcnJvdyB0byBkZXNjcmliZSBhIGhvc3QncyByZXBsYWNlbWVudCwgc28gdGhlIHNoYXBlIGlzIGFzc2VydGVkIG9uY2UgaGVyZS5cbmV4cG9ydCBjb25zdCBTUEFXTl9DT05TVEFOVFMgPSB0YWJsZSBhcyBTcGF3bkNvbnN0YW50cztcblxuLyoqXG4gKiBUaGUgY2FwIG9uZSBwb29sIGlzIGFsbG93ZWQgaW4gdGhlIHNwYXduIHJlZ2lvbiByaWdodCBub3cuXG4gKlxuICogQHBhcmFtIHBsYXllcnMgLSBIb3cgbWFueSBwbGF5ZXJzIHRoZSBzcGF3biByZWdpb24gaG9sZHMsIHdoaWNoIHNjYWxlcyBhXG4gKiBgcGVyX3BsYXllcmAgY2FwLlxuICogQHJldHVybnMgVGhlIGNhcCwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIHBvb2wgaGFzIG5vbmUgYW5kIG90aGVyIG1hY2hpbmVyeVxuICogbGltaXRzIGl0LlxuICovXG5leHBvcnQgY29uc3QgcG9vbENhcEZvciA9IChcbiAgICBwb29sOiBQb3B1bGF0aW9uUG9vbCB8IHN0cmluZyxcbiAgICBwbGF5ZXJzOiBudW1iZXIsXG4gICAgY29uc3RhbnRzOiBTcGF3bkNvbnN0YW50cyA9IFNQQVdOX0NPTlNUQU5UU1xuKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCBlbnRyeSA9IGNvbnN0YW50cy5wb29sc1twb29sXTtcbiAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCB8fCBlbnRyeS5jYXAgPT09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGVudHJ5LnNjb3BlID09PSAncGVyX3BsYXllcicgPyBlbnRyeS5jYXAgKiBwbGF5ZXJzIDogZW50cnkuY2FwO1xufTtcblxuLyoqIEhvdyBtYW55IHRpY2tzIHBhc3MgYmV0d2VlbiB0d28gc3Bhd24gY3ljbGVzIG9mIG9uZSBwb29sLiAqL1xuZXhwb3J0IGNvbnN0IGN5Y2xlVGlja3NGb3IgPSAoXG4gICAgcG9vbDogUG9wdWxhdGlvblBvb2wgfCBzdHJpbmcsXG4gICAgY29uc3RhbnRzOiBTcGF3bkNvbnN0YW50cyA9IFNQQVdOX0NPTlNUQU5UU1xuKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IGNvbnN0YW50cy5wb29sc1twb29sXT8uY3ljbGVUaWNrcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFvRUEsSUFBYSxrQix5Q0FBa0JBLENBQUFBLENBQUFBOzs7Ozs7Ozs7QUFVL0IsSUFBYSxjQUNULE1BQ0EsU0FDQSxZQUE0QixvQkFDUDtDQUNyQixNQUFNLFFBQVEsVUFBVSxNQUFNO0NBQzlCLElBQUksVUFBVSxLQUFBLEtBQWEsTUFBTSxRQUFRLE1BQU0sT0FBTyxLQUFBO0NBQ3RELE9BQU8sTUFBTSxVQUFVLGVBQWUsTUFBTSxNQUFNLFVBQVUsTUFBTTtBQUN0RTs7QUFHQSxJQUFhLGlCQUNULE1BQ0EsWUFBNEIsb0JBQ1AsVUFBVSxNQUFNLEtBQUssRUFBRSJ9
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { PopulationPool } from './rules';
|
|
2
|
+
/**
|
|
3
|
+
* The numbers the spawning algorithm needs and Mojang does not publish.
|
|
4
|
+
*
|
|
5
|
+
* Mojang documents the pool names and every spawn rule component's
|
|
6
|
+
* parameters, and publishes no spawn attempt rate, no cap value, no spawn
|
|
7
|
+
* radius and no light algorithm. The only numbers in print are the
|
|
8
|
+
* tilde-hedged "Typical Cap" column of `EntitySpawningDeepDive.md`. Every
|
|
9
|
+
* number here is therefore this project's choice, it lives in
|
|
10
|
+
* `src/tables/spawnConstants.json` rather than in code so it is visible and
|
|
11
|
+
* replaceable, and each one carries a `source` string saying where it came
|
|
12
|
+
* from.
|
|
13
|
+
*/
|
|
14
|
+
/** Whether a pool's cap covers the whole spawn region or scales with the players in it. */
|
|
15
|
+
export type PoolCapScope = 'per_player' | 'per_region';
|
|
16
|
+
/** One pool's cap, cadence and the provenance of both. */
|
|
17
|
+
export interface PoolConstants {
|
|
18
|
+
/** The cap, or null for a pool the documentation leaves to other machinery. */
|
|
19
|
+
readonly cap: number | null;
|
|
20
|
+
readonly scope: PoolCapScope;
|
|
21
|
+
/** How many ticks pass between two spawn cycles of this pool. */
|
|
22
|
+
readonly cycleTicks: number;
|
|
23
|
+
/** Where the two numbers came from, quoted so a reader can judge them. */
|
|
24
|
+
readonly source: string;
|
|
25
|
+
}
|
|
26
|
+
/** The whole constants table. */
|
|
27
|
+
export interface SpawnConstants {
|
|
28
|
+
/** Why none of these numbers are Mojang's. */
|
|
29
|
+
readonly provenance: string;
|
|
30
|
+
readonly pools: Readonly<Record<string, PoolConstants>>;
|
|
31
|
+
/** How far from a player, in chunks, the spawner looks for a position. */
|
|
32
|
+
readonly spawnRadiusChunks: number;
|
|
33
|
+
readonly spawnRadiusSource: string;
|
|
34
|
+
/** How many chunks one cycle samples per player. */
|
|
35
|
+
readonly chunksPerCycle: number;
|
|
36
|
+
/** How many positions one cycle tries in each sampled chunk. */
|
|
37
|
+
readonly positionsPerChunk: number;
|
|
38
|
+
readonly attemptSource: string;
|
|
39
|
+
/** How far from the anchor, in blocks, a herd member may be placed. */
|
|
40
|
+
readonly herdRadius: number;
|
|
41
|
+
readonly herdRadiusSource: string;
|
|
42
|
+
/** The radius `minecraft:density_limit` counts entities over. */
|
|
43
|
+
readonly densityRadius: number;
|
|
44
|
+
readonly densityRadiusSource: string;
|
|
45
|
+
/** How much rain lowers the light an `adjust_for_weather` brightness filter compares. */
|
|
46
|
+
readonly rainDarkening: number;
|
|
47
|
+
/** How much a thunderstorm lowers that light. */
|
|
48
|
+
readonly thunderDarkening: number;
|
|
49
|
+
readonly darkeningSource: string;
|
|
50
|
+
/** How far from every player, in chunks, a mob is culled. */
|
|
51
|
+
readonly despawnRadiusChunks: number;
|
|
52
|
+
/** The height at and below which every mob despawns. */
|
|
53
|
+
readonly despawnFloorY: number;
|
|
54
|
+
readonly despawnSource: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* The numbers this project chose, read from
|
|
58
|
+
* `src/tables/spawnConstants.json`. A host replaces the whole table through
|
|
59
|
+
* `SpawnerOptions.constants`.
|
|
60
|
+
*/
|
|
61
|
+
export declare const SPAWN_CONSTANTS: SpawnConstants;
|
|
62
|
+
/**
|
|
63
|
+
* The cap one pool is allowed in the spawn region right now.
|
|
64
|
+
*
|
|
65
|
+
* @param players - How many players the spawn region holds, which scales a
|
|
66
|
+
* `per_player` cap.
|
|
67
|
+
* @returns The cap, or undefined when the pool has none and other machinery
|
|
68
|
+
* limits it.
|
|
69
|
+
*/
|
|
70
|
+
export declare const poolCapFor: (pool: PopulationPool | string, players: number, constants?: SpawnConstants) => number | undefined;
|
|
71
|
+
/** How many ticks pass between two spawn cycles of one pool. */
|
|
72
|
+
export declare const cycleTicksFor: (pool: PopulationPool | string, constants?: SpawnConstants) => number | undefined;
|
|
73
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C;;;;;;;;;;;GAWG;AAEH,2FAA2F;AAC3F,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,YAAY,CAAC;AAEvD,0DAA0D;AAC1D,MAAM,WAAW,aAAa;IAC1B,+EAA+E;IAC/E,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,iEAAiE;IACjE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,0EAA0E;IAC1E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CAC3B;AAED,iCAAiC;AACjC,MAAM,WAAW,cAAc;IAC3B,8CAA8C;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;IACxD,0EAA0E;IAC1E,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,oDAAoD;IACpD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,gEAAgE;IAChE,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,uEAAuE;IACvE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,iEAAiE;IACjE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,yFAAyF;IACzF,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,iDAAiD;IACjD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,6DAA6D;IAC7D,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,wDAAwD;IACxD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAClC;AAED;;;;GAIG;AAGH,eAAO,MAAM,eAAe,EAAY,cAAc,CAAC;AAEvD;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,SACb,cAAc,GAAG,MAAM,WACpB,MAAM,cACJ,cAAc,KAC1B,MAAM,GAAG,SAIX,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,aAAa,SAChB,cAAc,GAAG,MAAM,cAClB,cAAc,KAC1B,MAAM,GAAG,SAA8C,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import spawnConstants_default from "./tables/spawnConstants.es.js";
|
|
2
|
+
// src/constants.ts
|
|
3
|
+
/**
|
|
4
|
+
* The numbers this project chose, read from
|
|
5
|
+
* `src/tables/spawnConstants.json`. A host replaces the whole table through
|
|
6
|
+
* `SpawnerOptions.constants`.
|
|
7
|
+
*/
|
|
8
|
+
var SPAWN_CONSTANTS = spawnConstants_default;
|
|
9
|
+
/**
|
|
10
|
+
* The cap one pool is allowed in the spawn region right now.
|
|
11
|
+
*
|
|
12
|
+
* @param players - How many players the spawn region holds, which scales a
|
|
13
|
+
* `per_player` cap.
|
|
14
|
+
* @returns The cap, or undefined when the pool has none and other machinery
|
|
15
|
+
* limits it.
|
|
16
|
+
*/
|
|
17
|
+
var poolCapFor = (pool, players, constants = SPAWN_CONSTANTS) => {
|
|
18
|
+
const entry = constants.pools[pool];
|
|
19
|
+
if (entry === void 0 || entry.cap === null) return void 0;
|
|
20
|
+
return entry.scope === "per_player" ? entry.cap * players : entry.cap;
|
|
21
|
+
};
|
|
22
|
+
/** How many ticks pass between two spawn cycles of one pool. */
|
|
23
|
+
var cycleTicksFor = (pool, constants = SPAWN_CONSTANTS) => constants.pools[pool]?.cycleTicks;
|
|
24
|
+
export { SPAWN_CONSTANTS, cycleTicksFor, poolCapFor };
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmVzLmpzIiwibmFtZXMiOlsidGFibGUiXSwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0YWJsZSBmcm9tICcuL3RhYmxlcy9zcGF3bkNvbnN0YW50cy5qc29uJztcbmltcG9ydCB0eXBlIHsgUG9wdWxhdGlvblBvb2wgfSBmcm9tICcuL3J1bGVzJztcblxuLyoqXG4gKiBUaGUgbnVtYmVycyB0aGUgc3Bhd25pbmcgYWxnb3JpdGhtIG5lZWRzIGFuZCBNb2phbmcgZG9lcyBub3QgcHVibGlzaC5cbiAqXG4gKiBNb2phbmcgZG9jdW1lbnRzIHRoZSBwb29sIG5hbWVzIGFuZCBldmVyeSBzcGF3biBydWxlIGNvbXBvbmVudCdzXG4gKiBwYXJhbWV0ZXJzLCBhbmQgcHVibGlzaGVzIG5vIHNwYXduIGF0dGVtcHQgcmF0ZSwgbm8gY2FwIHZhbHVlLCBubyBzcGF3blxuICogcmFkaXVzIGFuZCBubyBsaWdodCBhbGdvcml0aG0uIFRoZSBvbmx5IG51bWJlcnMgaW4gcHJpbnQgYXJlIHRoZVxuICogdGlsZGUtaGVkZ2VkIFwiVHlwaWNhbCBDYXBcIiBjb2x1bW4gb2YgYEVudGl0eVNwYXduaW5nRGVlcERpdmUubWRgLiBFdmVyeVxuICogbnVtYmVyIGhlcmUgaXMgdGhlcmVmb3JlIHRoaXMgcHJvamVjdCdzIGNob2ljZSwgaXQgbGl2ZXMgaW5cbiAqIGBzcmMvdGFibGVzL3NwYXduQ29uc3RhbnRzLmpzb25gIHJhdGhlciB0aGFuIGluIGNvZGUgc28gaXQgaXMgdmlzaWJsZSBhbmRcbiAqIHJlcGxhY2VhYmxlLCBhbmQgZWFjaCBvbmUgY2FycmllcyBhIGBzb3VyY2VgIHN0cmluZyBzYXlpbmcgd2hlcmUgaXQgY2FtZVxuICogZnJvbS5cbiAqL1xuXG4vKiogV2hldGhlciBhIHBvb2wncyBjYXAgY292ZXJzIHRoZSB3aG9sZSBzcGF3biByZWdpb24gb3Igc2NhbGVzIHdpdGggdGhlIHBsYXllcnMgaW4gaXQuICovXG5leHBvcnQgdHlwZSBQb29sQ2FwU2NvcGUgPSAncGVyX3BsYXllcicgfCAncGVyX3JlZ2lvbic7XG5cbi8qKiBPbmUgcG9vbCdzIGNhcCwgY2FkZW5jZSBhbmQgdGhlIHByb3ZlbmFuY2Ugb2YgYm90aC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9vbENvbnN0YW50cyB7XG4gICAgLyoqIFRoZSBjYXAsIG9yIG51bGwgZm9yIGEgcG9vbCB0aGUgZG9jdW1lbnRhdGlvbiBsZWF2ZXMgdG8gb3RoZXIgbWFjaGluZXJ5LiAqL1xuICAgIHJlYWRvbmx5IGNhcDogbnVtYmVyIHwgbnVsbDtcbiAgICByZWFkb25seSBzY29wZTogUG9vbENhcFNjb3BlO1xuICAgIC8qKiBIb3cgbWFueSB0aWNrcyBwYXNzIGJldHdlZW4gdHdvIHNwYXduIGN5Y2xlcyBvZiB0aGlzIHBvb2wuICovXG4gICAgcmVhZG9ubHkgY3ljbGVUaWNrczogbnVtYmVyO1xuICAgIC8qKiBXaGVyZSB0aGUgdHdvIG51bWJlcnMgY2FtZSBmcm9tLCBxdW90ZWQgc28gYSByZWFkZXIgY2FuIGp1ZGdlIHRoZW0uICovXG4gICAgcmVhZG9ubHkgc291cmNlOiBzdHJpbmc7XG59XG5cbi8qKiBUaGUgd2hvbGUgY29uc3RhbnRzIHRhYmxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF3bkNvbnN0YW50cyB7XG4gICAgLyoqIFdoeSBub25lIG9mIHRoZXNlIG51bWJlcnMgYXJlIE1vamFuZydzLiAqL1xuICAgIHJlYWRvbmx5IHByb3ZlbmFuY2U6IHN0cmluZztcbiAgICByZWFkb25seSBwb29sczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgUG9vbENvbnN0YW50cz4+O1xuICAgIC8qKiBIb3cgZmFyIGZyb20gYSBwbGF5ZXIsIGluIGNodW5rcywgdGhlIHNwYXduZXIgbG9va3MgZm9yIGEgcG9zaXRpb24uICovXG4gICAgcmVhZG9ubHkgc3Bhd25SYWRpdXNDaHVua3M6IG51bWJlcjtcbiAgICByZWFkb25seSBzcGF3blJhZGl1c1NvdXJjZTogc3RyaW5nO1xuICAgIC8qKiBIb3cgbWFueSBjaHVua3Mgb25lIGN5Y2xlIHNhbXBsZXMgcGVyIHBsYXllci4gKi9cbiAgICByZWFkb25seSBjaHVua3NQZXJDeWNsZTogbnVtYmVyO1xuICAgIC8qKiBIb3cgbWFueSBwb3NpdGlvbnMgb25lIGN5Y2xlIHRyaWVzIGluIGVhY2ggc2FtcGxlZCBjaHVuay4gKi9cbiAgICByZWFkb25seSBwb3NpdGlvbnNQZXJDaHVuazogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGF0dGVtcHRTb3VyY2U6IHN0cmluZztcbiAgICAvKiogSG93IGZhciBmcm9tIHRoZSBhbmNob3IsIGluIGJsb2NrcywgYSBoZXJkIG1lbWJlciBtYXkgYmUgcGxhY2VkLiAqL1xuICAgIHJlYWRvbmx5IGhlcmRSYWRpdXM6IG51bWJlcjtcbiAgICByZWFkb25seSBoZXJkUmFkaXVzU291cmNlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSByYWRpdXMgYG1pbmVjcmFmdDpkZW5zaXR5X2xpbWl0YCBjb3VudHMgZW50aXRpZXMgb3Zlci4gKi9cbiAgICByZWFkb25seSBkZW5zaXR5UmFkaXVzOiBudW1iZXI7XG4gICAgcmVhZG9ubHkgZGVuc2l0eVJhZGl1c1NvdXJjZTogc3RyaW5nO1xuICAgIC8qKiBIb3cgbXVjaCByYWluIGxvd2VycyB0aGUgbGlnaHQgYW4gYGFkanVzdF9mb3Jfd2VhdGhlcmAgYnJpZ2h0bmVzcyBmaWx0ZXIgY29tcGFyZXMuICovXG4gICAgcmVhZG9ubHkgcmFpbkRhcmtlbmluZzogbnVtYmVyO1xuICAgIC8qKiBIb3cgbXVjaCBhIHRodW5kZXJzdG9ybSBsb3dlcnMgdGhhdCBsaWdodC4gKi9cbiAgICByZWFkb25seSB0aHVuZGVyRGFya2VuaW5nOiBudW1iZXI7XG4gICAgcmVhZG9ubHkgZGFya2VuaW5nU291cmNlOiBzdHJpbmc7XG4gICAgLyoqIEhvdyBmYXIgZnJvbSBldmVyeSBwbGF5ZXIsIGluIGNodW5rcywgYSBtb2IgaXMgY3VsbGVkLiAqL1xuICAgIHJlYWRvbmx5IGRlc3Bhd25SYWRpdXNDaHVua3M6IG51bWJlcjtcbiAgICAvKiogVGhlIGhlaWdodCBhdCBhbmQgYmVsb3cgd2hpY2ggZXZlcnkgbW9iIGRlc3Bhd25zLiAqL1xuICAgIHJlYWRvbmx5IGRlc3Bhd25GbG9vclk6IG51bWJlcjtcbiAgICByZWFkb25seSBkZXNwYXduU291cmNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG51bWJlcnMgdGhpcyBwcm9qZWN0IGNob3NlLCByZWFkIGZyb21cbiAqIGBzcmMvdGFibGVzL3NwYXduQ29uc3RhbnRzLmpzb25gLiBBIGhvc3QgcmVwbGFjZXMgdGhlIHdob2xlIHRhYmxlIHRocm91Z2hcbiAqIGBTcGF3bmVyT3B0aW9ucy5jb25zdGFudHNgLlxuICovXG4vLyBUaGUgdGFibGUgaXMgaGFuZC1tYWludGFpbmVkIEpTT04gaW4gdGhpcyBwYWNrYWdlOyBpdHMgbGl0ZXJhbCB0eXBlcyBhcmUgdG9vXG4vLyBuYXJyb3cgdG8gZGVzY3JpYmUgYSBob3N0J3MgcmVwbGFjZW1lbnQsIHNvIHRoZSBzaGFwZSBpcyBhc3NlcnRlZCBvbmNlIGhlcmUuXG5leHBvcnQgY29uc3QgU1BBV05fQ09OU1RBTlRTID0gdGFibGUgYXMgU3Bhd25Db25zdGFudHM7XG5cbi8qKlxuICogVGhlIGNhcCBvbmUgcG9vbCBpcyBhbGxvd2VkIGluIHRoZSBzcGF3biByZWdpb24gcmlnaHQgbm93LlxuICpcbiAqIEBwYXJhbSBwbGF5ZXJzIC0gSG93IG1hbnkgcGxheWVycyB0aGUgc3Bhd24gcmVnaW9uIGhvbGRzLCB3aGljaCBzY2FsZXMgYVxuICogYHBlcl9wbGF5ZXJgIGNhcC5cbiAqIEByZXR1cm5zIFRoZSBjYXAsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBwb29sIGhhcyBub25lIGFuZCBvdGhlciBtYWNoaW5lcnlcbiAqIGxpbWl0cyBpdC5cbiAqL1xuZXhwb3J0IGNvbnN0IHBvb2xDYXBGb3IgPSAoXG4gICAgcG9vbDogUG9wdWxhdGlvblBvb2wgfCBzdHJpbmcsXG4gICAgcGxheWVyczogbnVtYmVyLFxuICAgIGNvbnN0YW50czogU3Bhd25Db25zdGFudHMgPSBTUEFXTl9DT05TVEFOVFNcbik6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgZW50cnkgPSBjb25zdGFudHMucG9vbHNbcG9vbF07XG4gICAgaWYgKGVudHJ5ID09PSB1bmRlZmluZWQgfHwgZW50cnkuY2FwID09PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBlbnRyeS5zY29wZSA9PT0gJ3Blcl9wbGF5ZXInID8gZW50cnkuY2FwICogcGxheWVycyA6IGVudHJ5LmNhcDtcbn07XG5cbi8qKiBIb3cgbWFueSB0aWNrcyBwYXNzIGJldHdlZW4gdHdvIHNwYXduIGN5Y2xlcyBvZiBvbmUgcG9vbC4gKi9cbmV4cG9ydCBjb25zdCBjeWNsZVRpY2tzRm9yID0gKFxuICAgIHBvb2w6IFBvcHVsYXRpb25Qb29sIHwgc3RyaW5nLFxuICAgIGNvbnN0YW50czogU3Bhd25Db25zdGFudHMgPSBTUEFXTl9DT05TVEFOVFNcbik6IG51bWJlciB8IHVuZGVmaW5lZCA9PiBjb25zdGFudHMucG9vbHNbcG9vbF0/LmN5Y2xlVGlja3M7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFvRUEsSUFBYSxrQkFBa0JBOzs7Ozs7Ozs7QUFVL0IsSUFBYSxjQUNULE1BQ0EsU0FDQSxZQUE0QixvQkFDUDtDQUNyQixNQUFNLFFBQVEsVUFBVSxNQUFNO0NBQzlCLElBQUksVUFBVSxLQUFBLEtBQWEsTUFBTSxRQUFRLE1BQU0sT0FBTyxLQUFBO0NBQ3RELE9BQU8sTUFBTSxVQUFVLGVBQWUsTUFBTSxNQUFNLFVBQVUsTUFBTTtBQUN0RTs7QUFHQSxJQUFhLGlCQUNULE1BQ0EsWUFBNEIsb0JBQ1AsVUFBVSxNQUFNLEtBQUssRUFBRSJ9
|
|
@@ -0,0 +1,25 @@
|
|
|
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
|
+
// src/despawn.ts
|
|
6
|
+
/**
|
|
7
|
+
* Decides whether one entity leaves the world for a population reason.
|
|
8
|
+
*
|
|
9
|
+
* The Y floor is published and is the same in both editions: every mob
|
|
10
|
+
* despawns at Y=-128 and below. The simulation edge is not published; this
|
|
11
|
+
* project uses `despawnRadiusChunks` on the X and Z axes, whose default of 8
|
|
12
|
+
* chunks is the 128 blocks of
|
|
13
|
+
* `minecraft:despawn.despawn_from_distance.max_distance`.
|
|
14
|
+
*
|
|
15
|
+
* @returns The reason, or undefined when the entity stays.
|
|
16
|
+
*/
|
|
17
|
+
var despawnReason = (candidate, world, constants = require_constants.SPAWN_CONSTANTS) => {
|
|
18
|
+
if (candidate.persistent === true) return void 0;
|
|
19
|
+
if (candidate.position.y <= constants.despawnFloorY) return "below_floor";
|
|
20
|
+
const edge = constants.despawnRadiusChunks * 16;
|
|
21
|
+
return world.players().some((player) => require_world.horizontalDistanceSquared(player.position, candidate.position) <= edge * edge) ? void 0 : "simulation_edge";
|
|
22
|
+
};
|
|
23
|
+
exports.despawnReason = despawnReason;
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzcGF3bi5janMuY2pzIiwibmFtZXMiOlsiU1BBV05fQ09OU1RBTlRTIiwiaG9yaXpvbnRhbERpc3RhbmNlU3F1YXJlZCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9kZXNwYXduLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3Bhd25Db25zdGFudHMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBTUEFXTl9DT05TVEFOVFMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgdHlwZSB7IFNwYXduUG9zaXRpb24sIFNwYXduV29ybGQgfSBmcm9tICcuL3dvcmxkJztcbmltcG9ydCB7IGhvcml6b250YWxEaXN0YW5jZVNxdWFyZWQgfSBmcm9tICcuL3dvcmxkJztcblxuLyoqXG4gKiBUaGUgcG9wdWxhdGlvbi1sZXZlbCBkZXNwYXduIHJ1bGVzLlxuICpcbiAqIGBtaW5lY3JhZnQ6ZGVzcGF3bmAgYmVsb25ncyB0byBgQGpzcHJpc21hcmluZS9lbnRpdGllc2AsIHdoaWNoIGNhcnJpZXMgdGhlXG4gKiBkb2N1bWVudGVkIHBlci1lbnRpdHkgcG9saWN5OiBgZGVzcGF3bl9mcm9tX2Rpc3RhbmNlYCxcbiAqIGBkZXNwYXduX2Zyb21fY2hhbmNlYCwgYGRlc3Bhd25fZnJvbV9pbmFjdGl2aXR5YCBhbmQgdGhlIGNvbXBvbmVudCdzXG4gKiBgZmlsdGVyc2AuIFR3byBydWxlcyBzaXQgb3V0c2lkZSBhbnkgZW50aXR5IGRlZmluaXRpb24gYW5kIGJlbG9uZyBoZXJlIHdpdGhcbiAqIHRoZSByZXN0IG9mIHRoZSBwb3B1bGF0aW9uIG1hY2hpbmVyeTogdGhlIGhlaWdodCBldmVyeSBtb2IgZGVzcGF3bnMgYmVsb3csXG4gKiBhbmQgdGhlIGVkZ2Ugb2YgdGhlIHNpbXVsYXRlZCByZWdpb24uXG4gKi9cblxuLyoqIFdoeSBvbmUgZW50aXR5IGRlc3Bhd25lZC4gKi9cbmV4cG9ydCB0eXBlIERlc3Bhd25SZWFzb24gPSAnYmVsb3dfZmxvb3InIHwgJ3NpbXVsYXRpb25fZWRnZSc7XG5cbi8qKiBPbmUgZW50aXR5IHRoZSBwb3B1bGF0aW9uIGN1bGwgbG9va3MgYXQuICovXG5leHBvcnQgaW50ZXJmYWNlIERlc3Bhd25DYW5kaWRhdGUge1xuICAgIHJlYWRvbmx5IHBvc2l0aW9uOiBTcGF3blBvc2l0aW9uO1xuICAgIC8qKiBXaGV0aGVyIGBtaW5lY3JhZnQ6cGVyc2lzdGVudGAgb3IgYSBuYW1lIHRhZyBrZWVwcyB0aGUgZW50aXR5IGxvYWRlZC4gKi9cbiAgICByZWFkb25seSBwZXJzaXN0ZW50PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZWNpZGVzIHdoZXRoZXIgb25lIGVudGl0eSBsZWF2ZXMgdGhlIHdvcmxkIGZvciBhIHBvcHVsYXRpb24gcmVhc29uLlxuICpcbiAqIFRoZSBZIGZsb29yIGlzIHB1Ymxpc2hlZCBhbmQgaXMgdGhlIHNhbWUgaW4gYm90aCBlZGl0aW9uczogZXZlcnkgbW9iXG4gKiBkZXNwYXducyBhdCBZPS0xMjggYW5kIGJlbG93LiBUaGUgc2ltdWxhdGlvbiBlZGdlIGlzIG5vdCBwdWJsaXNoZWQ7IHRoaXNcbiAqIHByb2plY3QgdXNlcyBgZGVzcGF3blJhZGl1c0NodW5rc2Agb24gdGhlIFggYW5kIFogYXhlcywgd2hvc2UgZGVmYXVsdCBvZiA4XG4gKiBjaHVua3MgaXMgdGhlIDEyOCBibG9ja3Mgb2ZcbiAqIGBtaW5lY3JhZnQ6ZGVzcGF3bi5kZXNwYXduX2Zyb21fZGlzdGFuY2UubWF4X2Rpc3RhbmNlYC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgcmVhc29uLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgZW50aXR5IHN0YXlzLlxuICovXG5leHBvcnQgY29uc3QgZGVzcGF3blJlYXNvbiA9IChcbiAgICBjYW5kaWRhdGU6IERlc3Bhd25DYW5kaWRhdGUsXG4gICAgd29ybGQ6IFNwYXduV29ybGQsXG4gICAgY29uc3RhbnRzOiBTcGF3bkNvbnN0YW50cyA9IFNQQVdOX0NPTlNUQU5UU1xuKTogRGVzcGF3blJlYXNvbiB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKGNhbmRpZGF0ZS5wZXJzaXN0ZW50ID09PSB0cnVlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChjYW5kaWRhdGUucG9zaXRpb24ueSA8PSBjb25zdGFudHMuZGVzcGF3bkZsb29yWSkgcmV0dXJuICdiZWxvd19mbG9vcic7XG5cbiAgICBjb25zdCBlZGdlID0gY29uc3RhbnRzLmRlc3Bhd25SYWRpdXNDaHVua3MgKiAxNjtcbiAgICBjb25zdCBpblJhbmdlID0gd29ybGRcbiAgICAgICAgLnBsYXllcnMoKVxuICAgICAgICAuc29tZSgocGxheWVyKSA9PiBob3Jpem9udGFsRGlzdGFuY2VTcXVhcmVkKHBsYXllci5wb3NpdGlvbiwgY2FuZGlkYXRlLnBvc2l0aW9uKSA8PSBlZGdlICogZWRnZSk7XG4gICAgcmV0dXJuIGluUmFuZ2UgPyB1bmRlZmluZWQgOiAnc2ltdWxhdGlvbl9lZGdlJztcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQ0EsSUFBYSxpQkFDVCxXQUNBLE9BQ0EsWUFBNEJBLGtCQUFBQSxvQkFDQTtDQUM1QixJQUFJLFVBQVUsZUFBZSxNQUFNLE9BQU8sS0FBQTtDQUMxQyxJQUFJLFVBQVUsU0FBUyxLQUFLLFVBQVUsZUFBZSxPQUFPO0NBRTVELE1BQU0sT0FBTyxVQUFVLHNCQUFzQjtDQUk3QyxPQUhnQixNQUNYLFFBQVEsQ0FBQyxDQUNULE1BQU0sV0FBV0MsY0FBQUEsMEJBQTBCLE9BQU8sVUFBVSxVQUFVLFFBQVEsS0FBSyxPQUFPLElBQ3hGLElBQVUsS0FBQSxJQUFZO0FBQ2pDIn0=
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { SpawnConstants } from './constants';
|
|
2
|
+
import type { SpawnPosition, SpawnWorld } from './world';
|
|
3
|
+
/**
|
|
4
|
+
* The population-level despawn rules.
|
|
5
|
+
*
|
|
6
|
+
* `minecraft:despawn` belongs to `@jsprismarine/entities`, which carries the
|
|
7
|
+
* documented per-entity policy: `despawn_from_distance`,
|
|
8
|
+
* `despawn_from_chance`, `despawn_from_inactivity` and the component's
|
|
9
|
+
* `filters`. Two rules sit outside any entity definition and belong here with
|
|
10
|
+
* the rest of the population machinery: the height every mob despawns below,
|
|
11
|
+
* and the edge of the simulated region.
|
|
12
|
+
*/
|
|
13
|
+
/** Why one entity despawned. */
|
|
14
|
+
export type DespawnReason = 'below_floor' | 'simulation_edge';
|
|
15
|
+
/** One entity the population cull looks at. */
|
|
16
|
+
export interface DespawnCandidate {
|
|
17
|
+
readonly position: SpawnPosition;
|
|
18
|
+
/** Whether `minecraft:persistent` or a name tag keeps the entity loaded. */
|
|
19
|
+
readonly persistent?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Decides whether one entity leaves the world for a population reason.
|
|
23
|
+
*
|
|
24
|
+
* The Y floor is published and is the same in both editions: every mob
|
|
25
|
+
* despawns at Y=-128 and below. The simulation edge is not published; this
|
|
26
|
+
* project uses `despawnRadiusChunks` on the X and Z axes, whose default of 8
|
|
27
|
+
* chunks is the 128 blocks of
|
|
28
|
+
* `minecraft:despawn.despawn_from_distance.max_distance`.
|
|
29
|
+
*
|
|
30
|
+
* @returns The reason, or undefined when the entity stays.
|
|
31
|
+
*/
|
|
32
|
+
export declare const despawnReason: (candidate: DespawnCandidate, world: SpawnWorld, constants?: SpawnConstants) => DespawnReason | undefined;
|
|
33
|
+
//# sourceMappingURL=despawn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"despawn.d.ts","sourceRoot":"","sources":["../src/despawn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGzD;;;;;;;;;GASG;AAEH,gCAAgC;AAChC,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,iBAAiB,CAAC;AAE9D,+CAA+C;AAC/C,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,4EAA4E;IAC5E,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,aAAa,cACX,gBAAgB,SACpB,UAAU,cACN,cAAc,KAC1B,aAAa,GAAG,SASlB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { horizontalDistanceSquared } from "./world.es.js";
|
|
2
|
+
import { SPAWN_CONSTANTS } from "./constants.es.js";
|
|
3
|
+
// src/despawn.ts
|
|
4
|
+
/**
|
|
5
|
+
* Decides whether one entity leaves the world for a population reason.
|
|
6
|
+
*
|
|
7
|
+
* The Y floor is published and is the same in both editions: every mob
|
|
8
|
+
* despawns at Y=-128 and below. The simulation edge is not published; this
|
|
9
|
+
* project uses `despawnRadiusChunks` on the X and Z axes, whose default of 8
|
|
10
|
+
* chunks is the 128 blocks of
|
|
11
|
+
* `minecraft:despawn.despawn_from_distance.max_distance`.
|
|
12
|
+
*
|
|
13
|
+
* @returns The reason, or undefined when the entity stays.
|
|
14
|
+
*/
|
|
15
|
+
var despawnReason = (candidate, world, constants = SPAWN_CONSTANTS) => {
|
|
16
|
+
if (candidate.persistent === true) return void 0;
|
|
17
|
+
if (candidate.position.y <= constants.despawnFloorY) return "below_floor";
|
|
18
|
+
const edge = constants.despawnRadiusChunks * 16;
|
|
19
|
+
return world.players().some((player) => horizontalDistanceSquared(player.position, candidate.position) <= edge * edge) ? void 0 : "simulation_edge";
|
|
20
|
+
};
|
|
21
|
+
export { despawnReason };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzcGF3bi5lcy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvZGVzcGF3bi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFNwYXduQ29uc3RhbnRzIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgU1BBV05fQ09OU1RBTlRTIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHR5cGUgeyBTcGF3blBvc2l0aW9uLCBTcGF3bldvcmxkIH0gZnJvbSAnLi93b3JsZCc7XG5pbXBvcnQgeyBob3Jpem9udGFsRGlzdGFuY2VTcXVhcmVkIH0gZnJvbSAnLi93b3JsZCc7XG5cbi8qKlxuICogVGhlIHBvcHVsYXRpb24tbGV2ZWwgZGVzcGF3biBydWxlcy5cbiAqXG4gKiBgbWluZWNyYWZ0OmRlc3Bhd25gIGJlbG9uZ3MgdG8gYEBqc3ByaXNtYXJpbmUvZW50aXRpZXNgLCB3aGljaCBjYXJyaWVzIHRoZVxuICogZG9jdW1lbnRlZCBwZXItZW50aXR5IHBvbGljeTogYGRlc3Bhd25fZnJvbV9kaXN0YW5jZWAsXG4gKiBgZGVzcGF3bl9mcm9tX2NoYW5jZWAsIGBkZXNwYXduX2Zyb21faW5hY3Rpdml0eWAgYW5kIHRoZSBjb21wb25lbnQnc1xuICogYGZpbHRlcnNgLiBUd28gcnVsZXMgc2l0IG91dHNpZGUgYW55IGVudGl0eSBkZWZpbml0aW9uIGFuZCBiZWxvbmcgaGVyZSB3aXRoXG4gKiB0aGUgcmVzdCBvZiB0aGUgcG9wdWxhdGlvbiBtYWNoaW5lcnk6IHRoZSBoZWlnaHQgZXZlcnkgbW9iIGRlc3Bhd25zIGJlbG93LFxuICogYW5kIHRoZSBlZGdlIG9mIHRoZSBzaW11bGF0ZWQgcmVnaW9uLlxuICovXG5cbi8qKiBXaHkgb25lIGVudGl0eSBkZXNwYXduZWQuICovXG5leHBvcnQgdHlwZSBEZXNwYXduUmVhc29uID0gJ2JlbG93X2Zsb29yJyB8ICdzaW11bGF0aW9uX2VkZ2UnO1xuXG4vKiogT25lIGVudGl0eSB0aGUgcG9wdWxhdGlvbiBjdWxsIGxvb2tzIGF0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXNwYXduQ2FuZGlkYXRlIHtcbiAgICByZWFkb25seSBwb3NpdGlvbjogU3Bhd25Qb3NpdGlvbjtcbiAgICAvKiogV2hldGhlciBgbWluZWNyYWZ0OnBlcnNpc3RlbnRgIG9yIGEgbmFtZSB0YWcga2VlcHMgdGhlIGVudGl0eSBsb2FkZWQuICovXG4gICAgcmVhZG9ubHkgcGVyc2lzdGVudD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGV0aGVyIG9uZSBlbnRpdHkgbGVhdmVzIHRoZSB3b3JsZCBmb3IgYSBwb3B1bGF0aW9uIHJlYXNvbi5cbiAqXG4gKiBUaGUgWSBmbG9vciBpcyBwdWJsaXNoZWQgYW5kIGlzIHRoZSBzYW1lIGluIGJvdGggZWRpdGlvbnM6IGV2ZXJ5IG1vYlxuICogZGVzcGF3bnMgYXQgWT0tMTI4IGFuZCBiZWxvdy4gVGhlIHNpbXVsYXRpb24gZWRnZSBpcyBub3QgcHVibGlzaGVkOyB0aGlzXG4gKiBwcm9qZWN0IHVzZXMgYGRlc3Bhd25SYWRpdXNDaHVua3NgIG9uIHRoZSBYIGFuZCBaIGF4ZXMsIHdob3NlIGRlZmF1bHQgb2YgOFxuICogY2h1bmtzIGlzIHRoZSAxMjggYmxvY2tzIG9mXG4gKiBgbWluZWNyYWZ0OmRlc3Bhd24uZGVzcGF3bl9mcm9tX2Rpc3RhbmNlLm1heF9kaXN0YW5jZWAuXG4gKlxuICogQHJldHVybnMgVGhlIHJlYXNvbiwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIGVudGl0eSBzdGF5cy5cbiAqL1xuZXhwb3J0IGNvbnN0IGRlc3Bhd25SZWFzb24gPSAoXG4gICAgY2FuZGlkYXRlOiBEZXNwYXduQ2FuZGlkYXRlLFxuICAgIHdvcmxkOiBTcGF3bldvcmxkLFxuICAgIGNvbnN0YW50czogU3Bhd25Db25zdGFudHMgPSBTUEFXTl9DT05TVEFOVFNcbik6IERlc3Bhd25SZWFzb24gfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmIChjYW5kaWRhdGUucGVyc2lzdGVudCA9PT0gdHJ1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoY2FuZGlkYXRlLnBvc2l0aW9uLnkgPD0gY29uc3RhbnRzLmRlc3Bhd25GbG9vclkpIHJldHVybiAnYmVsb3dfZmxvb3InO1xuXG4gICAgY29uc3QgZWRnZSA9IGNvbnN0YW50cy5kZXNwYXduUmFkaXVzQ2h1bmtzICogMTY7XG4gICAgY29uc3QgaW5SYW5nZSA9IHdvcmxkXG4gICAgICAgIC5wbGF5ZXJzKClcbiAgICAgICAgLnNvbWUoKHBsYXllcikgPT4gaG9yaXpvbnRhbERpc3RhbmNlU3F1YXJlZChwbGF5ZXIucG9zaXRpb24sIGNhbmRpZGF0ZS5wb3NpdGlvbikgPD0gZWRnZSAqIGVkZ2UpO1xuICAgIHJldHVybiBpblJhbmdlID8gdW5kZWZpbmVkIDogJ3NpbXVsYXRpb25fZWRnZSc7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQXFDQSxJQUFhLGlCQUNULFdBQ0EsT0FDQSxZQUE0QixvQkFDQTtDQUM1QixJQUFJLFVBQVUsZUFBZSxNQUFNLE9BQU8sS0FBQTtDQUMxQyxJQUFJLFVBQVUsU0FBUyxLQUFLLFVBQVUsZUFBZSxPQUFPO0NBRTVELE1BQU0sT0FBTyxVQUFVLHNCQUFzQjtDQUk3QyxPQUhnQixNQUNYLFFBQVEsQ0FBQyxDQUNULE1BQU0sV0FBVywwQkFBMEIsT0FBTyxVQUFVLFVBQVUsUUFBUSxLQUFLLE9BQU8sSUFDeEYsSUFBVSxLQUFBLElBQVk7QUFDakMifQ==
|