@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,282 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ let _jsprismarine_packs = require("@jsprismarine/packs");
4
+ // src/rules.ts
5
+ /**
6
+ * The spawn rule grammar.
7
+ *
8
+ * A file is `{"format_version": "<semver>", "minecraft:spawn_rules": {...}}`,
9
+ * and the body has `description` and `conditions`. Mojang's
10
+ * `Spawn Rules.json` declares 24 condition components; vanilla writes 21 of
11
+ * them. Parsing reports an unknown component rather than refusing the file, so
12
+ * a pack written against a newer game still loads and the report names what
13
+ * the runtime did not read.
14
+ */
15
+ /** The pools `description.population_control` names, each with its own cap. */
16
+ var POPULATION_POOLS = [
17
+ "animal",
18
+ "water_animal",
19
+ "water_ambient",
20
+ "ambient",
21
+ "monster",
22
+ "cat",
23
+ "pillager",
24
+ "villager"
25
+ ];
26
+ /** The difficulty names `minecraft:difficulty_filter` compares, in ascending order. */
27
+ var DIFFICULTIES = [
28
+ "peaceful",
29
+ "easy",
30
+ "normal",
31
+ "hard"
32
+ ];
33
+ /**
34
+ * Every condition component `Spawn Rules.json` declares, in the schema's
35
+ * order. Vanilla writes 21 of the 24; `minecraft:spawns_above_block_filter`,
36
+ * `minecraft:is_persistent` and `minecraft:is_experimental` appear in the
37
+ * schema alone, so this package parses them and leaves their meaning to the
38
+ * caller.
39
+ */
40
+ var SPAWN_RULE_COMPONENTS = [
41
+ "minecraft:biome_filter",
42
+ "minecraft:brightness_filter",
43
+ "minecraft:delay_filter",
44
+ "minecraft:density_limit",
45
+ "minecraft:difficulty_filter",
46
+ "minecraft:disallow_spawns_in_bubble",
47
+ "minecraft:distance_filter",
48
+ "minecraft:height_filter",
49
+ "minecraft:herd",
50
+ "minecraft:is_experimental",
51
+ "minecraft:is_persistent",
52
+ "minecraft:mob_event_filter",
53
+ "minecraft:permute_type",
54
+ "minecraft:player_in_village_filter",
55
+ "minecraft:spawn_event",
56
+ "minecraft:spawns_above_block_filter",
57
+ "minecraft:spawns_lava",
58
+ "minecraft:spawns_on_block_filter",
59
+ "minecraft:spawns_on_block_prevented_filter",
60
+ "minecraft:spawns_on_surface",
61
+ "minecraft:spawns_underground",
62
+ "minecraft:spawns_underwater",
63
+ "minecraft:weight",
64
+ "minecraft:world_age_filter"
65
+ ];
66
+ var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
67
+ var KNOWN_COMPONENTS = new Set(SPAWN_RULE_COMPONENTS);
68
+ var KNOWN_POOLS = new Set(POPULATION_POOLS);
69
+ /** Reads a number, falling back when the key is absent or not a number. */
70
+ var numberAt = (source, key, fallback) => {
71
+ const value = source[key];
72
+ return typeof value === "number" && Number.isFinite(value) ? value : fallback;
73
+ };
74
+ var stringAt = (source, key) => {
75
+ const value = source[key];
76
+ return typeof value === "string" ? value : void 0;
77
+ };
78
+ var bodyOf = (value) => isRecord(value) ? value : {};
79
+ /**
80
+ * Reads a block list written as one name, as a list of names, or as a list of
81
+ * `{name}` objects. All three appear in vanilla.
82
+ */
83
+ var blockList = (value) => {
84
+ const members = Array.isArray(value) ? value : [value];
85
+ const names = [];
86
+ for (const member of members) if (typeof member === "string") names.push(member);
87
+ else if (isRecord(member) && typeof member.name === "string") names.push(member.name);
88
+ return names;
89
+ };
90
+ var difficultyAt = (source, key, fallback, fail) => {
91
+ const value = source[key];
92
+ if (value === void 0) return fallback;
93
+ const name = DIFFICULTIES.find((difficulty) => difficulty === value);
94
+ if (name !== void 0) return name;
95
+ fail(`minecraft:difficulty_filter ${key} is not a difficulty: ${JSON.stringify(value)}`);
96
+ return fallback;
97
+ };
98
+ var parseHerd = (value) => (Array.isArray(value) ? value : [value]).filter(isRecord).map((body) => {
99
+ const rule = {
100
+ minSize: numberAt(body, "min_size", 1),
101
+ maxSize: numberAt(body, "max_size", 1),
102
+ initialEventCount: numberAt(body, "initial_event_count", 0),
103
+ eventSkipCount: numberAt(body, "event_skip_count", 0)
104
+ };
105
+ const initialEvent = stringAt(body, "initial_event");
106
+ if (initialEvent !== void 0) rule.initialEvent = initialEvent;
107
+ const event = stringAt(body, "event");
108
+ if (event !== void 0) rule.event = event;
109
+ return rule;
110
+ });
111
+ var parsePermutations = (value) => (Array.isArray(value) ? value : []).filter(isRecord).map((body) => {
112
+ const permutation = {
113
+ weight: numberAt(body, "weight", 1),
114
+ minGuaranteed: numberAt(body, "min_guaranteed", numberAt(body, "guaranteed_count", 0))
115
+ };
116
+ const entityType = stringAt(body, "entity_type");
117
+ if (entityType !== void 0) permutation.entityType = entityType;
118
+ return permutation;
119
+ });
120
+ var parseCondition = (value, fail) => {
121
+ for (const key of Object.keys(value)) if (!KNOWN_COMPONENTS.has(key)) fail("spawnRule.unknownComponent", `unknown spawn rule component ${key}`);
122
+ const weightBody = bodyOf(value["minecraft:weight"]);
123
+ const condition = {
124
+ weight: {
125
+ default: numberAt(weightBody, "default", 1),
126
+ rarity: numberAt(weightBody, "rarity", 0)
127
+ },
128
+ herd: "minecraft:herd" in value ? parseHerd(value["minecraft:herd"]) : [],
129
+ spawnsOnSurface: "minecraft:spawns_on_surface" in value,
130
+ spawnsUnderground: "minecraft:spawns_underground" in value,
131
+ spawnsUnderwater: "minecraft:spawns_underwater" in value,
132
+ spawnsLava: "minecraft:spawns_lava" in value,
133
+ disallowSpawnsInBubble: "minecraft:disallow_spawns_in_bubble" in value,
134
+ isPersistent: "minecraft:is_persistent" in value,
135
+ isExperimental: "minecraft:is_experimental" in value
136
+ };
137
+ if ("minecraft:biome_filter" in value) try {
138
+ condition.biomeFilter = (0, _jsprismarine_packs.parseFilter)(value["minecraft:biome_filter"]);
139
+ } catch (error) {
140
+ if (!(error instanceof _jsprismarine_packs.FilterParseError)) throw error;
141
+ fail("spawnRule.badValue", `minecraft:biome_filter does not parse: ${error.message}`);
142
+ }
143
+ if ("minecraft:brightness_filter" in value) {
144
+ const body = bodyOf(value["minecraft:brightness_filter"]);
145
+ condition.brightness = {
146
+ min: numberAt(body, "min", 0),
147
+ max: numberAt(body, "max", 15),
148
+ adjustForWeather: body.adjust_for_weather === true
149
+ };
150
+ }
151
+ if ("minecraft:difficulty_filter" in value) {
152
+ const body = bodyOf(value["minecraft:difficulty_filter"]);
153
+ const report = (message) => fail("spawnRule.badValue", message);
154
+ condition.difficulty = {
155
+ min: difficultyAt(body, "min", "peaceful", report),
156
+ max: difficultyAt(body, "max", "hard", report)
157
+ };
158
+ }
159
+ if ("minecraft:height_filter" in value) {
160
+ const body = bodyOf(value["minecraft:height_filter"]);
161
+ condition.height = {
162
+ min: numberAt(body, "min", 24),
163
+ max: numberAt(body, "max", 128)
164
+ };
165
+ }
166
+ if ("minecraft:distance_filter" in value) {
167
+ const body = bodyOf(value["minecraft:distance_filter"]);
168
+ condition.distance = {
169
+ min: numberAt(body, "min", 24),
170
+ max: numberAt(body, "max", 128)
171
+ };
172
+ }
173
+ if ("minecraft:world_age_filter" in value) {
174
+ const body = bodyOf(value["minecraft:world_age_filter"]);
175
+ condition.worldAge = {
176
+ min: numberAt(body, "min", 0),
177
+ max: numberAt(body, "max", -1)
178
+ };
179
+ }
180
+ if ("minecraft:density_limit" in value) {
181
+ const body = bodyOf(value["minecraft:density_limit"]);
182
+ condition.density = {
183
+ surface: numberAt(body, "surface", -1),
184
+ underground: numberAt(body, "underground", -1)
185
+ };
186
+ }
187
+ if ("minecraft:spawns_on_block_filter" in value) condition.blocks = blockList(value["minecraft:spawns_on_block_filter"]);
188
+ if ("minecraft:spawns_on_block_prevented_filter" in value) condition.preventedBlocks = blockList(value["minecraft:spawns_on_block_prevented_filter"]);
189
+ if ("minecraft:spawns_above_block_filter" in value) {
190
+ const body = bodyOf(value["minecraft:spawns_above_block_filter"]);
191
+ condition.aboveBlocks = {
192
+ blocks: blockList(body.blocks),
193
+ distance: numberAt(body, "distance", 1)
194
+ };
195
+ }
196
+ if ("minecraft:permute_type" in value) condition.permutations = parsePermutations(value["minecraft:permute_type"]);
197
+ if ("minecraft:delay_filter" in value) {
198
+ const body = bodyOf(value["minecraft:delay_filter"]);
199
+ const delay = {
200
+ min: numberAt(body, "min", 0),
201
+ max: numberAt(body, "max", 0),
202
+ spawnChance: numberAt(body, "spawn_chance", 100)
203
+ };
204
+ const identifier = stringAt(body, "identifier");
205
+ if (identifier !== void 0) delay.identifier = identifier;
206
+ condition.delay = delay;
207
+ }
208
+ const mobEvent = stringAt(bodyOf(value["minecraft:mob_event_filter"]), "event");
209
+ if ("minecraft:mob_event_filter" in value && mobEvent !== void 0) condition.mobEvent = mobEvent;
210
+ const spawnEvent = stringAt(bodyOf(value["minecraft:spawn_event"]), "event");
211
+ if ("minecraft:spawn_event" in value && spawnEvent !== void 0) condition.spawnEvent = spawnEvent;
212
+ if ("minecraft:player_in_village_filter" in value) {
213
+ const body = bodyOf(value["minecraft:player_in_village_filter"]);
214
+ condition.playerInVillage = {
215
+ distance: numberAt(body, "distance", 0),
216
+ villageBorderTolerance: numberAt(body, "village_border_tolerance", 10)
217
+ };
218
+ }
219
+ return condition;
220
+ };
221
+ /**
222
+ * Parses one `spawn_rules/*.json` file.
223
+ *
224
+ * @returns The rule, or undefined when the file is not a spawn rule or names
225
+ * no identifier. Everything else loads and reports.
226
+ */
227
+ var parseSpawnRule = (file, options) => {
228
+ const fail = (code, message) => {
229
+ const diagnostic = {
230
+ severity: "error",
231
+ code,
232
+ pack: options.pack,
233
+ message
234
+ };
235
+ if (options.path !== void 0) diagnostic.path = options.path;
236
+ options.report?.(diagnostic);
237
+ };
238
+ const warn = (code, message) => {
239
+ const diagnostic = {
240
+ severity: "warning",
241
+ code,
242
+ pack: options.pack,
243
+ message
244
+ };
245
+ if (options.path !== void 0) diagnostic.path = options.path;
246
+ options.report?.(diagnostic);
247
+ };
248
+ if (!isRecord(file) || !isRecord(file["minecraft:spawn_rules"])) {
249
+ fail("spawnRule.notASpawnRule", "the file has no `minecraft:spawn_rules` body");
250
+ return;
251
+ }
252
+ const body = file["minecraft:spawn_rules"];
253
+ const description = bodyOf(body.description);
254
+ const identifier = stringAt(description, "identifier");
255
+ if (identifier === void 0) {
256
+ fail("spawnRule.missingIdentifier", "`description.identifier` is missing");
257
+ return;
258
+ }
259
+ const rule = {
260
+ identifier,
261
+ conditions: []
262
+ };
263
+ const formatVersion = stringAt(file, "format_version");
264
+ if (formatVersion !== void 0) rule.formatVersion = formatVersion;
265
+ const pool = stringAt(description, "population_control");
266
+ if (pool !== void 0) {
267
+ rule.populationControl = pool;
268
+ if (!KNOWN_POOLS.has(pool)) warn("spawnRule.unknownPool", `unknown population_control ${pool}`);
269
+ }
270
+ const conditions = body.conditions;
271
+ if (conditions !== void 0) {
272
+ if (!Array.isArray(conditions)) fail("spawnRule.badValue", "`conditions` must be an array");
273
+ else rule.conditions = conditions.filter(isRecord).map((condition) => parseCondition(condition, fail));
274
+ }
275
+ return rule;
276
+ };
277
+ exports.DIFFICULTIES = DIFFICULTIES;
278
+ exports.POPULATION_POOLS = POPULATION_POOLS;
279
+ exports.SPAWN_RULE_COMPONENTS = SPAWN_RULE_COMPONENTS;
280
+ exports.parseSpawnRule = parseSpawnRule;
281
+
282
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZXMuY2pzLmNqcyIsIm5hbWVzIjpbInBhcnNlRmlsdGVyIiwiRmlsdGVyUGFyc2VFcnJvciJdLCJzb3VyY2VzIjpbIi4uL3NyYy9ydWxlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IERpYWdub3N0aWMgfSBmcm9tICdAanNwcmlzbWFyaW5lL2VudGl0aWVzJztcbmltcG9ydCB0eXBlIHsgRmlsdGVyIH0gZnJvbSAnQGpzcHJpc21hcmluZS9wYWNrcyc7XG5pbXBvcnQgeyBGaWx0ZXJQYXJzZUVycm9yLCBwYXJzZUZpbHRlciB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvcGFja3MnO1xuXG4vKipcbiAqIFRoZSBzcGF3biBydWxlIGdyYW1tYXIuXG4gKlxuICogQSBmaWxlIGlzIGB7XCJmb3JtYXRfdmVyc2lvblwiOiBcIjxzZW12ZXI+XCIsIFwibWluZWNyYWZ0OnNwYXduX3J1bGVzXCI6IHsuLi59fWAsXG4gKiBhbmQgdGhlIGJvZHkgaGFzIGBkZXNjcmlwdGlvbmAgYW5kIGBjb25kaXRpb25zYC4gTW9qYW5nJ3NcbiAqIGBTcGF3biBSdWxlcy5qc29uYCBkZWNsYXJlcyAyNCBjb25kaXRpb24gY29tcG9uZW50czsgdmFuaWxsYSB3cml0ZXMgMjEgb2ZcbiAqIHRoZW0uIFBhcnNpbmcgcmVwb3J0cyBhbiB1bmtub3duIGNvbXBvbmVudCByYXRoZXIgdGhhbiByZWZ1c2luZyB0aGUgZmlsZSwgc29cbiAqIGEgcGFjayB3cml0dGVuIGFnYWluc3QgYSBuZXdlciBnYW1lIHN0aWxsIGxvYWRzIGFuZCB0aGUgcmVwb3J0IG5hbWVzIHdoYXRcbiAqIHRoZSBydW50aW1lIGRpZCBub3QgcmVhZC5cbiAqL1xuXG4vKiogVGhlIHBvb2xzIGBkZXNjcmlwdGlvbi5wb3B1bGF0aW9uX2NvbnRyb2xgIG5hbWVzLCBlYWNoIHdpdGggaXRzIG93biBjYXAuICovXG5leHBvcnQgY29uc3QgUE9QVUxBVElPTl9QT09MUyA9IFtcbiAgICAnYW5pbWFsJyxcbiAgICAnd2F0ZXJfYW5pbWFsJyxcbiAgICAnd2F0ZXJfYW1iaWVudCcsXG4gICAgJ2FtYmllbnQnLFxuICAgICdtb25zdGVyJyxcbiAgICAnY2F0JyxcbiAgICAncGlsbGFnZXInLFxuICAgICd2aWxsYWdlcidcbl0gYXMgY29uc3Q7XG5cbi8qKiBPbmUgb2Yge0BsaW5rIFBPUFVMQVRJT05fUE9PTFN9LiAqL1xuZXhwb3J0IHR5cGUgUG9wdWxhdGlvblBvb2wgPSAodHlwZW9mIFBPUFVMQVRJT05fUE9PTFMpW251bWJlcl07XG5cbi8qKiBUaGUgZGlmZmljdWx0eSBuYW1lcyBgbWluZWNyYWZ0OmRpZmZpY3VsdHlfZmlsdGVyYCBjb21wYXJlcywgaW4gYXNjZW5kaW5nIG9yZGVyLiAqL1xuZXhwb3J0IGNvbnN0IERJRkZJQ1VMVElFUyA9IFsncGVhY2VmdWwnLCAnZWFzeScsICdub3JtYWwnLCAnaGFyZCddIGFzIGNvbnN0O1xuXG4vKiogT25lIG9mIHtAbGluayBESUZGSUNVTFRJRVN9LiAqL1xuZXhwb3J0IHR5cGUgRGlmZmljdWx0eSA9ICh0eXBlb2YgRElGRklDVUxUSUVTKVtudW1iZXJdO1xuXG4vKipcbiAqIEV2ZXJ5IGNvbmRpdGlvbiBjb21wb25lbnQgYFNwYXduIFJ1bGVzLmpzb25gIGRlY2xhcmVzLCBpbiB0aGUgc2NoZW1hJ3NcbiAqIG9yZGVyLiBWYW5pbGxhIHdyaXRlcyAyMSBvZiB0aGUgMjQ7IGBtaW5lY3JhZnQ6c3Bhd25zX2Fib3ZlX2Jsb2NrX2ZpbHRlcmAsXG4gKiBgbWluZWNyYWZ0OmlzX3BlcnNpc3RlbnRgIGFuZCBgbWluZWNyYWZ0OmlzX2V4cGVyaW1lbnRhbGAgYXBwZWFyIGluIHRoZVxuICogc2NoZW1hIGFsb25lLCBzbyB0aGlzIHBhY2thZ2UgcGFyc2VzIHRoZW0gYW5kIGxlYXZlcyB0aGVpciBtZWFuaW5nIHRvIHRoZVxuICogY2FsbGVyLlxuICovXG5leHBvcnQgY29uc3QgU1BBV05fUlVMRV9DT01QT05FTlRTID0gW1xuICAgICdtaW5lY3JhZnQ6YmlvbWVfZmlsdGVyJyxcbiAgICAnbWluZWNyYWZ0OmJyaWdodG5lc3NfZmlsdGVyJyxcbiAgICAnbWluZWNyYWZ0OmRlbGF5X2ZpbHRlcicsXG4gICAgJ21pbmVjcmFmdDpkZW5zaXR5X2xpbWl0JyxcbiAgICAnbWluZWNyYWZ0OmRpZmZpY3VsdHlfZmlsdGVyJyxcbiAgICAnbWluZWNyYWZ0OmRpc2FsbG93X3NwYXduc19pbl9idWJibGUnLFxuICAgICdtaW5lY3JhZnQ6ZGlzdGFuY2VfZmlsdGVyJyxcbiAgICAnbWluZWNyYWZ0OmhlaWdodF9maWx0ZXInLFxuICAgICdtaW5lY3JhZnQ6aGVyZCcsXG4gICAgJ21pbmVjcmFmdDppc19leHBlcmltZW50YWwnLFxuICAgICdtaW5lY3JhZnQ6aXNfcGVyc2lzdGVudCcsXG4gICAgJ21pbmVjcmFmdDptb2JfZXZlbnRfZmlsdGVyJyxcbiAgICAnbWluZWNyYWZ0OnBlcm11dGVfdHlwZScsXG4gICAgJ21pbmVjcmFmdDpwbGF5ZXJfaW5fdmlsbGFnZV9maWx0ZXInLFxuICAgICdtaW5lY3JhZnQ6c3Bhd25fZXZlbnQnLFxuICAgICdtaW5lY3JhZnQ6c3Bhd25zX2Fib3ZlX2Jsb2NrX2ZpbHRlcicsXG4gICAgJ21pbmVjcmFmdDpzcGF3bnNfbGF2YScsXG4gICAgJ21pbmVjcmFmdDpzcGF3bnNfb25fYmxvY2tfZmlsdGVyJyxcbiAgICAnbWluZWNyYWZ0OnNwYXduc19vbl9ibG9ja19wcmV2ZW50ZWRfZmlsdGVyJyxcbiAgICAnbWluZWNyYWZ0OnNwYXduc19vbl9zdXJmYWNlJyxcbiAgICAnbWluZWNyYWZ0OnNwYXduc191bmRlcmdyb3VuZCcsXG4gICAgJ21pbmVjcmFmdDpzcGF3bnNfdW5kZXJ3YXRlcicsXG4gICAgJ21pbmVjcmFmdDp3ZWlnaHQnLFxuICAgICdtaW5lY3JhZnQ6d29ybGRfYWdlX2ZpbHRlcidcbl0gYXMgY29uc3Q7XG5cbi8qKiBPbmUgb2Yge0BsaW5rIFNQQVdOX1JVTEVfQ09NUE9ORU5UU30uICovXG5leHBvcnQgdHlwZSBTcGF3blJ1bGVDb21wb25lbnQgPSAodHlwZW9mIFNQQVdOX1JVTEVfQ09NUE9ORU5UUylbbnVtYmVyXTtcblxuLyoqIEFuIGluY2x1c2l2ZSBudW1lcmljIHJhbmdlLCBhcyBldmVyeSBge21pbiwgbWF4fWAgY29tcG9uZW50IHdyaXRlcyBvbmUuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXduUmFuZ2Uge1xuICAgIHJlYWRvbmx5IG1pbjogbnVtYmVyO1xuICAgIHJlYWRvbmx5IG1heDogbnVtYmVyO1xufVxuXG4vKiogSG93IG9mdGVuIG9uZSBjb25kaXRpb24gaXMgZHJhd24gYWdhaW5zdCB0aGUgb3RoZXJzIHRoYXQgcGFzcyBhdCB0aGUgc2FtZSBwb3NpdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3Bhd25XZWlnaHQge1xuICAgIC8qKiBUaGUgcmVsYXRpdmUgd2VpZ2h0OyBhIHdlaWdodCBvZiAxMDAgYW1vbmcgYSB0b3RhbCBvZiAxMDAwIGlzIGRyYXduIGEgdGVudGggb2YgdGhlIHRpbWUuICovXG4gICAgcmVhZG9ubHkgZGVmYXVsdDogbnVtYmVyO1xuICAgIC8qKiBBbiBleHRyYSByYXJpdHkgcm9sbCBNb2phbmcgZG9jdW1lbnRzIGJ5IG5hbWUgb25seS4gWmVybyBtZWFucyBubyByb2xsLiAqL1xuICAgIHJlYWRvbmx5IHJhcml0eTogbnVtYmVyO1xufVxuXG4vKiogT25lIGBtaW5lY3JhZnQ6aGVyZGAgYWx0ZXJuYXRpdmU6IGhvdyBtYW55IHNwYXduIHRvZ2V0aGVyIGFuZCB3aGljaCBldmVudHMgdGhleSBydW4uICovXG5leHBvcnQgaW50ZXJmYWNlIEhlcmRSdWxlIHtcbiAgICByZWFkb25seSBtaW5TaXplOiBudW1iZXI7XG4gICAgcmVhZG9ubHkgbWF4U2l6ZTogbnVtYmVyO1xuICAgIC8qKiBUaGUgZXZlbnQgdGhlIGZpcnN0IHtAbGluayBpbml0aWFsRXZlbnRDb3VudH0gbWVtYmVycyBydW4gaW5zdGVhZCBvZiB0aGVpciBzcGF3biBldmVudC4gKi9cbiAgICByZWFkb25seSBpbml0aWFsRXZlbnQ/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgaW5pdGlhbEV2ZW50Q291bnQ6IG51bWJlcjtcbiAgICAvKiogVGhlIGV2ZW50IGV2ZXJ5IG1lbWJlciBwYXN0IHtAbGluayBldmVudFNraXBDb3VudH0gcnVucy4gKi9cbiAgICByZWFkb25seSBldmVudD86IHN0cmluZztcbiAgICByZWFkb25seSBldmVudFNraXBDb3VudDogbnVtYmVyO1xufVxuXG4vKiogT25lIGBtaW5lY3JhZnQ6cGVybXV0ZV90eXBlYCBlbnRyeTogYSB3ZWlnaHRlZCBzd2FwIG9mIHRoZSBlbnRpdHkgYSBoZXJkIG1lbWJlciBzcGF3bnMgYXMuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXduUGVybXV0YXRpb24ge1xuICAgIHJlYWRvbmx5IHdlaWdodDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbnRpdHkgdG8gc3Bhd24gaW5zdGVhZCwgb3B0aW9uYWxseSBpbiB0aGUgYHR5cGU8ZXZlbnQ+YCBmb3JtLiBBYnNlbnRcbiAgICAgKiBtZWFucyB0aGUgcnVsZSdzIG93biBlbnRpdHksIHdoaWNoIGlzIGhvdyB2YW5pbGxhIHdyaXRlcyB0aGUgY29tbW9uIGJyYW5jaC5cbiAgICAgKi9cbiAgICByZWFkb25seSBlbnRpdHlUeXBlPzogc3RyaW5nO1xuICAgIC8qKiBIb3cgbWFueSBoZXJkIG1lbWJlcnMgdGhpcyBwZXJtdXRhdGlvbiB0YWtlcyBiZWZvcmUgdGhlIHdlaWdodGVkIGRyYXcgcnVucy4gKi9cbiAgICByZWFkb25seSBtaW5HdWFyYW50ZWVkOiBudW1iZXI7XG59XG5cbi8qKiBUaGUgYG1pbmVjcmFmdDpkZWxheV9maWx0ZXJgIGJvZHk6IGEgY29vbGRvd24gc2hhcmVkIGJ5IGV2ZXJ5IHJ1bGUgbmFtaW5nIHRoZSBzYW1lIGlkZW50aWZpZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXduRGVsYXkge1xuICAgIHJlYWRvbmx5IG1pbjogbnVtYmVyO1xuICAgIHJlYWRvbmx5IG1heDogbnVtYmVyO1xuICAgIC8qKiBUaGUgY29vbGRvd24ncyBuYW1lLCB3aGljaCBpcyBob3cgdGhlIHRocmVlIHBpbGxhZ2VyIHBhdHJvbCBjb25kaXRpb25zIGtlZXAgc2VwYXJhdGUgdGltZXJzLiAqL1xuICAgIHJlYWRvbmx5IGlkZW50aWZpZXI/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBwZXJjZW50IGNoYW5jZSB0aGUgYXR0ZW1wdCB0YWtlcyBvbmNlIHRoZSBjb29sZG93biBoYXMgZWxhcHNlZC4gKi9cbiAgICByZWFkb25seSBzcGF3bkNoYW5jZTogbnVtYmVyO1xufVxuXG4vKiogVGhlIGBtaW5lY3JhZnQ6cGxheWVyX2luX3ZpbGxhZ2VfZmlsdGVyYCBib2R5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJJblZpbGxhZ2VGaWx0ZXIge1xuICAgIHJlYWRvbmx5IGRpc3RhbmNlOiBudW1iZXI7XG4gICAgcmVhZG9ubHkgdmlsbGFnZUJvcmRlclRvbGVyYW5jZTogbnVtYmVyO1xufVxuXG4vKiogVGhlIGBtaW5lY3JhZnQ6c3Bhd25zX2Fib3ZlX2Jsb2NrX2ZpbHRlcmAgYm9keSwgd2hpY2ggbm8gdmFuaWxsYSBydWxlIHdyaXRlcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWJvdmVCbG9ja0ZpbHRlciB7XG4gICAgcmVhZG9ubHkgYmxvY2tzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgICByZWFkb25seSBkaXN0YW5jZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIE9uZSBtZW1iZXIgb2YgYGNvbmRpdGlvbnNgOiBhIGNvbXBsZXRlIGFsdGVybmF0aXZlIHNldCBvZiByZXF1aXJlbWVudHMgd2l0aFxuICogaXRzIG93biB3ZWlnaHQsIGhlcmQgYW5kIHBlcm11dGF0aW9ucy4gQSBydWxlIHBhc3NlcyBhdCBhIHBvc2l0aW9uIHdoZW4gYW55XG4gKiBvbmUgb2YgaXRzIGNvbmRpdGlvbnMgZG9lcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF3bkNvbmRpdGlvbiB7XG4gICAgcmVhZG9ubHkgd2VpZ2h0OiBTcGF3bldlaWdodDtcbiAgICByZWFkb25seSBiaW9tZUZpbHRlcj86IEZpbHRlcjtcbiAgICByZWFkb25seSBicmlnaHRuZXNzPzogeyByZWFkb25seSBtaW46IG51bWJlcjsgcmVhZG9ubHkgbWF4OiBudW1iZXI7IHJlYWRvbmx5IGFkanVzdEZvcldlYXRoZXI6IGJvb2xlYW4gfTtcbiAgICByZWFkb25seSBkaWZmaWN1bHR5PzogeyByZWFkb25seSBtaW46IERpZmZpY3VsdHk7IHJlYWRvbmx5IG1heDogRGlmZmljdWx0eSB9O1xuICAgIHJlYWRvbmx5IGhlaWdodD86IFNwYXduUmFuZ2U7XG4gICAgLyoqIEhvdyBmYXIgZnJvbSB0aGUgbmVhcmVzdCBwbGF5ZXIgdGhlIHBvc2l0aW9uIG11c3QgYmUuICovXG4gICAgcmVhZG9ubHkgZGlzdGFuY2U/OiBTcGF3blJhbmdlO1xuICAgIC8qKiBIb3cgbWFueSBvZiB0aGlzIGVudGl0eSBtYXkgYWxyZWFkeSBzdGFuZCBuZWFyYnksIHBlciBwYXNzOyAtMSBpcyBubyBsaW1pdC4gKi9cbiAgICByZWFkb25seSBkZW5zaXR5PzogeyByZWFkb25seSBzdXJmYWNlOiBudW1iZXI7IHJlYWRvbmx5IHVuZGVyZ3JvdW5kOiBudW1iZXIgfTtcbiAgICByZWFkb25seSB3b3JsZEFnZT86IFNwYXduUmFuZ2U7XG4gICAgcmVhZG9ubHkgc3Bhd25zT25TdXJmYWNlOiBib29sZWFuO1xuICAgIHJlYWRvbmx5IHNwYXduc1VuZGVyZ3JvdW5kOiBib29sZWFuO1xuICAgIHJlYWRvbmx5IHNwYXduc1VuZGVyd2F0ZXI6IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgc3Bhd25zTGF2YTogYm9vbGVhbjtcbiAgICByZWFkb25seSBkaXNhbGxvd1NwYXduc0luQnViYmxlOiBib29sZWFuO1xuICAgIHJlYWRvbmx5IGlzUGVyc2lzdGVudDogYm9vbGVhbjtcbiAgICByZWFkb25seSBpc0V4cGVyaW1lbnRhbDogYm9vbGVhbjtcbiAgICAvKiogVGhlIGJsb2NrcyB0aGUgcG9zaXRpb24gbWF5IHN0YW5kIG9uOyBhbiBlbXB0eSBsaXN0IG1lYW5zIHRoZSBjb21wb25lbnQgaXMgYWJzZW50LiAqL1xuICAgIHJlYWRvbmx5IGJsb2Nrcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAgIC8qKiBUaGUgYmxvY2tzIHRoZSBwb3NpdGlvbiBtYXkgbm90IHN0YW5kIG9uLiAqL1xuICAgIHJlYWRvbmx5IHByZXZlbnRlZEJsb2Nrcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAgIHJlYWRvbmx5IGFib3ZlQmxvY2tzPzogQWJvdmVCbG9ja0ZpbHRlcjtcbiAgICByZWFkb25seSBoZXJkOiByZWFkb25seSBIZXJkUnVsZVtdO1xuICAgIHJlYWRvbmx5IHBlcm11dGF0aW9ucz86IHJlYWRvbmx5IFNwYXduUGVybXV0YXRpb25bXTtcbiAgICByZWFkb25seSBkZWxheT86IFNwYXduRGVsYXk7XG4gICAgcmVhZG9ubHkgbW9iRXZlbnQ/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBldmVudCBhIHNwYXduZWQgZW50aXR5IHJ1bnMgaW5zdGVhZCBvZiBgbWluZWNyYWZ0OmVudGl0eV9zcGF3bmVkYC4gKi9cbiAgICByZWFkb25seSBzcGF3bkV2ZW50Pzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHBsYXllckluVmlsbGFnZT86IFBsYXllckluVmlsbGFnZUZpbHRlcjtcbn1cblxuLyoqIE9uZSBwYXJzZWQgYHNwYXduX3J1bGVzLyouanNvbmAuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXduUnVsZSB7XG4gICAgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nO1xuICAgIC8qKiBUaGUgcG9vbCB3aG9zZSBjYXAgZ2F0ZXMgdGhpcyBlbnRpdHksIGFic2VudCB3aGVuIHRoZSBmaWxlIG5hbWVzIG5vbmUuICovXG4gICAgcmVhZG9ubHkgcG9wdWxhdGlvbkNvbnRyb2w/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgZm9ybWF0VmVyc2lvbj86IHN0cmluZztcbiAgICByZWFkb25seSBjb25kaXRpb25zOiByZWFkb25seSBTcGF3bkNvbmRpdGlvbltdO1xufVxuXG4vKiogV2hlcmUgYSBwYXJzZSByZXBvcnRzIGl0cyBmaW5kaW5ncy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3Bhd25SdWxlUGFyc2VPcHRpb25zIHtcbiAgICAvKiogVGhlIHBhY2sgdGhlIGZpbGUgY2FtZSBmcm9tLCB1c2VkIGluIHRoZSBkaWFnbm9zdGljcy4gKi9cbiAgICByZWFkb25seSBwYWNrOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcbiAgICByZWFkb25seSByZXBvcnQ/OiAoZGlhZ25vc3RpYzogRGlhZ25vc3RpYykgPT4gdm9pZDtcbn1cblxuY29uc3QgaXNSZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xuXG5jb25zdCBLTk9XTl9DT01QT05FTlRTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChTUEFXTl9SVUxFX0NPTVBPTkVOVFMpO1xuXG5jb25zdCBLTk9XTl9QT09MUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoUE9QVUxBVElPTl9QT09MUyk7XG5cbi8qKiBSZWFkcyBhIG51bWJlciwgZmFsbGluZyBiYWNrIHdoZW4gdGhlIGtleSBpcyBhYnNlbnQgb3Igbm90IGEgbnVtYmVyLiAqL1xuY29uc3QgbnVtYmVyQXQgPSAoc291cmNlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga2V5OiBzdHJpbmcsIGZhbGxiYWNrOiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gc291cmNlW2tleV07XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSA/IHZhbHVlIDogZmFsbGJhY2s7XG59O1xuXG5jb25zdCBzdHJpbmdBdCA9IChzb3VyY2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBzb3VyY2Vba2V5XTtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogdW5kZWZpbmVkO1xufTtcblxuY29uc3QgYm9keU9mID0gKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4gKGlzUmVjb3JkKHZhbHVlKSA/IHZhbHVlIDoge30pO1xuXG4vKipcbiAqIFJlYWRzIGEgYmxvY2sgbGlzdCB3cml0dGVuIGFzIG9uZSBuYW1lLCBhcyBhIGxpc3Qgb2YgbmFtZXMsIG9yIGFzIGEgbGlzdCBvZlxuICogYHtuYW1lfWAgb2JqZWN0cy4gQWxsIHRocmVlIGFwcGVhciBpbiB2YW5pbGxhLlxuICovXG5jb25zdCBibG9ja0xpc3QgPSAodmFsdWU6IHVua25vd24pOiByZWFkb25seSBzdHJpbmdbXSA9PiB7XG4gICAgY29uc3QgbWVtYmVycyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgIGNvbnN0IG5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIG1lbWJlcnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBtZW1iZXIgPT09ICdzdHJpbmcnKSBuYW1lcy5wdXNoKG1lbWJlcik7XG4gICAgICAgIGVsc2UgaWYgKGlzUmVjb3JkKG1lbWJlcikgJiYgdHlwZW9mIG1lbWJlci5uYW1lID09PSAnc3RyaW5nJykgbmFtZXMucHVzaChtZW1iZXIubmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBuYW1lcztcbn07XG5cbmNvbnN0IGRpZmZpY3VsdHlBdCA9IChcbiAgICBzb3VyY2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGtleTogc3RyaW5nLFxuICAgIGZhbGxiYWNrOiBEaWZmaWN1bHR5LFxuICAgIGZhaWw6IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWRcbik6IERpZmZpY3VsdHkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gc291cmNlW2tleV07XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxsYmFjaztcbiAgICBjb25zdCBuYW1lID0gRElGRklDVUxUSUVTLmZpbmQoKGRpZmZpY3VsdHkpID0+IGRpZmZpY3VsdHkgPT09IHZhbHVlKTtcbiAgICBpZiAobmFtZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gbmFtZTtcbiAgICBmYWlsKGBtaW5lY3JhZnQ6ZGlmZmljdWx0eV9maWx0ZXIgJHtrZXl9IGlzIG5vdCBhIGRpZmZpY3VsdHk6ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICAgIHJldHVybiBmYWxsYmFjaztcbn07XG5cbmNvbnN0IHBhcnNlSGVyZCA9ICh2YWx1ZTogdW5rbm93bik6IHJlYWRvbmx5IEhlcmRSdWxlW10gPT5cbiAgICAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0pLmZpbHRlcihpc1JlY29yZCkubWFwKChib2R5KSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGU6IHtcbiAgICAgICAgICAgIG1pblNpemU6IG51bWJlcjtcbiAgICAgICAgICAgIG1heFNpemU6IG51bWJlcjtcbiAgICAgICAgICAgIGluaXRpYWxFdmVudD86IHN0cmluZztcbiAgICAgICAgICAgIGluaXRpYWxFdmVudENvdW50OiBudW1iZXI7XG4gICAgICAgICAgICBldmVudD86IHN0cmluZztcbiAgICAgICAgICAgIGV2ZW50U2tpcENvdW50OiBudW1iZXI7XG4gICAgICAgIH0gPSB7XG4gICAgICAgICAgICBtaW5TaXplOiBudW1iZXJBdChib2R5LCAnbWluX3NpemUnLCAxKSxcbiAgICAgICAgICAgIG1heFNpemU6IG51bWJlckF0KGJvZHksICdtYXhfc2l6ZScsIDEpLFxuICAgICAgICAgICAgaW5pdGlhbEV2ZW50Q291bnQ6IG51bWJlckF0KGJvZHksICdpbml0aWFsX2V2ZW50X2NvdW50JywgMCksXG4gICAgICAgICAgICBldmVudFNraXBDb3VudDogbnVtYmVyQXQoYm9keSwgJ2V2ZW50X3NraXBfY291bnQnLCAwKVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBpbml0aWFsRXZlbnQgPSBzdHJpbmdBdChib2R5LCAnaW5pdGlhbF9ldmVudCcpO1xuICAgICAgICBpZiAoaW5pdGlhbEV2ZW50ICE9PSB1bmRlZmluZWQpIHJ1bGUuaW5pdGlhbEV2ZW50ID0gaW5pdGlhbEV2ZW50O1xuICAgICAgICBjb25zdCBldmVudCA9IHN0cmluZ0F0KGJvZHksICdldmVudCcpO1xuICAgICAgICBpZiAoZXZlbnQgIT09IHVuZGVmaW5lZCkgcnVsZS5ldmVudCA9IGV2ZW50O1xuICAgICAgICByZXR1cm4gcnVsZTtcbiAgICB9KTtcblxuY29uc3QgcGFyc2VQZXJtdXRhdGlvbnMgPSAodmFsdWU6IHVua25vd24pOiByZWFkb25seSBTcGF3blBlcm11dGF0aW9uW10gPT5cbiAgICAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdKS5maWx0ZXIoaXNSZWNvcmQpLm1hcCgoYm9keSkgPT4ge1xuICAgICAgICBjb25zdCBwZXJtdXRhdGlvbjogeyB3ZWlnaHQ6IG51bWJlcjsgZW50aXR5VHlwZT86IHN0cmluZzsgbWluR3VhcmFudGVlZDogbnVtYmVyIH0gPSB7XG4gICAgICAgICAgICB3ZWlnaHQ6IG51bWJlckF0KGJvZHksICd3ZWlnaHQnLCAxKSxcbiAgICAgICAgICAgIC8vIFRoZSBzY2hlbWEgY2FsbHMgaXQgYG1pbl9ndWFyYW50ZWVkYDsgdGhlIGRvY3MgcGFnZSBjYWxscyB0aGUgc2FtZVxuICAgICAgICAgICAgLy8gZmllbGQgYGd1YXJhbnRlZWRfY291bnRgLCBzbyBib3RoIHNwZWxsaW5ncyByZWFkLlxuICAgICAgICAgICAgbWluR3VhcmFudGVlZDogbnVtYmVyQXQoYm9keSwgJ21pbl9ndWFyYW50ZWVkJywgbnVtYmVyQXQoYm9keSwgJ2d1YXJhbnRlZWRfY291bnQnLCAwKSlcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZW50aXR5VHlwZSA9IHN0cmluZ0F0KGJvZHksICdlbnRpdHlfdHlwZScpO1xuICAgICAgICBpZiAoZW50aXR5VHlwZSAhPT0gdW5kZWZpbmVkKSBwZXJtdXRhdGlvbi5lbnRpdHlUeXBlID0gZW50aXR5VHlwZTtcbiAgICAgICAgcmV0dXJuIHBlcm11dGF0aW9uO1xuICAgIH0pO1xuXG5jb25zdCBwYXJzZUNvbmRpdGlvbiA9IChcbiAgICB2YWx1ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgZmFpbDogKGNvZGU6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkXG4pOiBTcGF3bkNvbmRpdGlvbiA9PiB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpKSB7XG4gICAgICAgIGlmICghS05PV05fQ09NUE9ORU5UUy5oYXMoa2V5KSkgZmFpbCgnc3Bhd25SdWxlLnVua25vd25Db21wb25lbnQnLCBgdW5rbm93biBzcGF3biBydWxlIGNvbXBvbmVudCAke2tleX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCB3ZWlnaHRCb2R5ID0gYm9keU9mKHZhbHVlWydtaW5lY3JhZnQ6d2VpZ2h0J10pO1xuICAgIGNvbnN0IGNvbmRpdGlvbjoge1xuICAgICAgICAtcmVhZG9ubHkgW0tleSBpbiBrZXlvZiBTcGF3bkNvbmRpdGlvbl06IFNwYXduQ29uZGl0aW9uW0tleV07XG4gICAgfSA9IHtcbiAgICAgICAgLy8gVGhlIHNjaGVtYSBtYXJrcyBgZGVmYXVsdGAgcmVxdWlyZWQgYW5kIHNheXMgbm90aGluZyBhYm91dCBhIGNvbmRpdGlvblxuICAgICAgICAvLyB0aGF0IHdyaXRlcyBubyB3ZWlnaHQgYXQgYWxsLCBzbyBhbiBhYnNlbnQgd2VpZ2h0IGNvdW50cyBvbmNlLlxuICAgICAgICB3ZWlnaHQ6IHsgZGVmYXVsdDogbnVtYmVyQXQod2VpZ2h0Qm9keSwgJ2RlZmF1bHQnLCAxKSwgcmFyaXR5OiBudW1iZXJBdCh3ZWlnaHRCb2R5LCAncmFyaXR5JywgMCkgfSxcbiAgICAgICAgaGVyZDogJ21pbmVjcmFmdDpoZXJkJyBpbiB2YWx1ZSA/IHBhcnNlSGVyZCh2YWx1ZVsnbWluZWNyYWZ0OmhlcmQnXSkgOiBbXSxcbiAgICAgICAgc3Bhd25zT25TdXJmYWNlOiAnbWluZWNyYWZ0OnNwYXduc19vbl9zdXJmYWNlJyBpbiB2YWx1ZSxcbiAgICAgICAgc3Bhd25zVW5kZXJncm91bmQ6ICdtaW5lY3JhZnQ6c3Bhd25zX3VuZGVyZ3JvdW5kJyBpbiB2YWx1ZSxcbiAgICAgICAgc3Bhd25zVW5kZXJ3YXRlcjogJ21pbmVjcmFmdDpzcGF3bnNfdW5kZXJ3YXRlcicgaW4gdmFsdWUsXG4gICAgICAgIHNwYXduc0xhdmE6ICdtaW5lY3JhZnQ6c3Bhd25zX2xhdmEnIGluIHZhbHVlLFxuICAgICAgICBkaXNhbGxvd1NwYXduc0luQnViYmxlOiAnbWluZWNyYWZ0OmRpc2FsbG93X3NwYXduc19pbl9idWJibGUnIGluIHZhbHVlLFxuICAgICAgICBpc1BlcnNpc3RlbnQ6ICdtaW5lY3JhZnQ6aXNfcGVyc2lzdGVudCcgaW4gdmFsdWUsXG4gICAgICAgIGlzRXhwZXJpbWVudGFsOiAnbWluZWNyYWZ0OmlzX2V4cGVyaW1lbnRhbCcgaW4gdmFsdWVcbiAgICB9O1xuXG4gICAgaWYgKCdtaW5lY3JhZnQ6YmlvbWVfZmlsdGVyJyBpbiB2YWx1ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uZGl0aW9uLmJpb21lRmlsdGVyID0gcGFyc2VGaWx0ZXIodmFsdWVbJ21pbmVjcmFmdDpiaW9tZV9maWx0ZXInXSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEZpbHRlclBhcnNlRXJyb3IpKSB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIGZhaWwoJ3NwYXduUnVsZS5iYWRWYWx1ZScsIGBtaW5lY3JhZnQ6YmlvbWVfZmlsdGVyIGRvZXMgbm90IHBhcnNlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoJ21pbmVjcmFmdDpicmlnaHRuZXNzX2ZpbHRlcicgaW4gdmFsdWUpIHtcbiAgICAgICAgY29uc3QgYm9keSA9IGJvZHlPZih2YWx1ZVsnbWluZWNyYWZ0OmJyaWdodG5lc3NfZmlsdGVyJ10pO1xuICAgICAgICBjb25kaXRpb24uYnJpZ2h0bmVzcyA9IHtcbiAgICAgICAgICAgIG1pbjogbnVtYmVyQXQoYm9keSwgJ21pbicsIDApLFxuICAgICAgICAgICAgbWF4OiBudW1iZXJBdChib2R5LCAnbWF4JywgMTUpLFxuICAgICAgICAgICAgYWRqdXN0Rm9yV2VhdGhlcjogYm9keS5hZGp1c3RfZm9yX3dlYXRoZXIgPT09IHRydWVcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoJ21pbmVjcmFmdDpkaWZmaWN1bHR5X2ZpbHRlcicgaW4gdmFsdWUpIHtcbiAgICAgICAgY29uc3QgYm9keSA9IGJvZHlPZih2YWx1ZVsnbWluZWNyYWZ0OmRpZmZpY3VsdHlfZmlsdGVyJ10pO1xuICAgICAgICBjb25zdCByZXBvcnQgPSAobWVzc2FnZTogc3RyaW5nKTogdm9pZCA9PiBmYWlsKCdzcGF3blJ1bGUuYmFkVmFsdWUnLCBtZXNzYWdlKTtcbiAgICAgICAgY29uZGl0aW9uLmRpZmZpY3VsdHkgPSB7XG4gICAgICAgICAgICBtaW46IGRpZmZpY3VsdHlBdChib2R5LCAnbWluJywgJ3BlYWNlZnVsJywgcmVwb3J0KSxcbiAgICAgICAgICAgIG1heDogZGlmZmljdWx0eUF0KGJvZHksICdtYXgnLCAnaGFyZCcsIHJlcG9ydClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoJ21pbmVjcmFmdDpoZWlnaHRfZmlsdGVyJyBpbiB2YWx1ZSkge1xuICAgICAgICBjb25zdCBib2R5ID0gYm9keU9mKHZhbHVlWydtaW5lY3JhZnQ6aGVpZ2h0X2ZpbHRlciddKTtcbiAgICAgICAgY29uZGl0aW9uLmhlaWdodCA9IHsgbWluOiBudW1iZXJBdChib2R5LCAnbWluJywgMjQpLCBtYXg6IG51bWJlckF0KGJvZHksICdtYXgnLCAxMjgpIH07XG4gICAgfVxuXG4gICAgaWYgKCdtaW5lY3JhZnQ6ZGlzdGFuY2VfZmlsdGVyJyBpbiB2YWx1ZSkge1xuICAgICAgICBjb25zdCBib2R5ID0gYm9keU9mKHZhbHVlWydtaW5lY3JhZnQ6ZGlzdGFuY2VfZmlsdGVyJ10pO1xuICAgICAgICBjb25kaXRpb24uZGlzdGFuY2UgPSB7IG1pbjogbnVtYmVyQXQoYm9keSwgJ21pbicsIDI0KSwgbWF4OiBudW1iZXJBdChib2R5LCAnbWF4JywgMTI4KSB9O1xuICAgIH1cblxuICAgIGlmICgnbWluZWNyYWZ0OndvcmxkX2FnZV9maWx0ZXInIGluIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBib2R5T2YodmFsdWVbJ21pbmVjcmFmdDp3b3JsZF9hZ2VfZmlsdGVyJ10pO1xuICAgICAgICBjb25kaXRpb24ud29ybGRBZ2UgPSB7IG1pbjogbnVtYmVyQXQoYm9keSwgJ21pbicsIDApLCBtYXg6IG51bWJlckF0KGJvZHksICdtYXgnLCAtMSkgfTtcbiAgICB9XG5cbiAgICBpZiAoJ21pbmVjcmFmdDpkZW5zaXR5X2xpbWl0JyBpbiB2YWx1ZSkge1xuICAgICAgICBjb25zdCBib2R5ID0gYm9keU9mKHZhbHVlWydtaW5lY3JhZnQ6ZGVuc2l0eV9saW1pdCddKTtcbiAgICAgICAgY29uZGl0aW9uLmRlbnNpdHkgPSB7IHN1cmZhY2U6IG51bWJlckF0KGJvZHksICdzdXJmYWNlJywgLTEpLCB1bmRlcmdyb3VuZDogbnVtYmVyQXQoYm9keSwgJ3VuZGVyZ3JvdW5kJywgLTEpIH07XG4gICAgfVxuXG4gICAgaWYgKCdtaW5lY3JhZnQ6c3Bhd25zX29uX2Jsb2NrX2ZpbHRlcicgaW4gdmFsdWUpXG4gICAgICAgIGNvbmRpdGlvbi5ibG9ja3MgPSBibG9ja0xpc3QodmFsdWVbJ21pbmVjcmFmdDpzcGF3bnNfb25fYmxvY2tfZmlsdGVyJ10pO1xuXG4gICAgaWYgKCdtaW5lY3JhZnQ6c3Bhd25zX29uX2Jsb2NrX3ByZXZlbnRlZF9maWx0ZXInIGluIHZhbHVlKVxuICAgICAgICBjb25kaXRpb24ucHJldmVudGVkQmxvY2tzID0gYmxvY2tMaXN0KHZhbHVlWydtaW5lY3JhZnQ6c3Bhd25zX29uX2Jsb2NrX3ByZXZlbnRlZF9maWx0ZXInXSk7XG5cbiAgICBpZiAoJ21pbmVjcmFmdDpzcGF3bnNfYWJvdmVfYmxvY2tfZmlsdGVyJyBpbiB2YWx1ZSkge1xuICAgICAgICBjb25zdCBib2R5ID0gYm9keU9mKHZhbHVlWydtaW5lY3JhZnQ6c3Bhd25zX2Fib3ZlX2Jsb2NrX2ZpbHRlciddKTtcbiAgICAgICAgY29uZGl0aW9uLmFib3ZlQmxvY2tzID0geyBibG9ja3M6IGJsb2NrTGlzdChib2R5LmJsb2NrcyksIGRpc3RhbmNlOiBudW1iZXJBdChib2R5LCAnZGlzdGFuY2UnLCAxKSB9O1xuICAgIH1cblxuICAgIGlmICgnbWluZWNyYWZ0OnBlcm11dGVfdHlwZScgaW4gdmFsdWUpIGNvbmRpdGlvbi5wZXJtdXRhdGlvbnMgPSBwYXJzZVBlcm11dGF0aW9ucyh2YWx1ZVsnbWluZWNyYWZ0OnBlcm11dGVfdHlwZSddKTtcblxuICAgIGlmICgnbWluZWNyYWZ0OmRlbGF5X2ZpbHRlcicgaW4gdmFsdWUpIHtcbiAgICAgICAgY29uc3QgYm9keSA9IGJvZHlPZih2YWx1ZVsnbWluZWNyYWZ0OmRlbGF5X2ZpbHRlciddKTtcbiAgICAgICAgY29uc3QgZGVsYXk6IHsgbWluOiBudW1iZXI7IG1heDogbnVtYmVyOyBpZGVudGlmaWVyPzogc3RyaW5nOyBzcGF3bkNoYW5jZTogbnVtYmVyIH0gPSB7XG4gICAgICAgICAgICBtaW46IG51bWJlckF0KGJvZHksICdtaW4nLCAwKSxcbiAgICAgICAgICAgIG1heDogbnVtYmVyQXQoYm9keSwgJ21heCcsIDApLFxuICAgICAgICAgICAgc3Bhd25DaGFuY2U6IG51bWJlckF0KGJvZHksICdzcGF3bl9jaGFuY2UnLCAxMDApXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBzdHJpbmdBdChib2R5LCAnaWRlbnRpZmllcicpO1xuICAgICAgICBpZiAoaWRlbnRpZmllciAhPT0gdW5kZWZpbmVkKSBkZWxheS5pZGVudGlmaWVyID0gaWRlbnRpZmllcjtcbiAgICAgICAgY29uZGl0aW9uLmRlbGF5ID0gZGVsYXk7XG4gICAgfVxuXG4gICAgY29uc3QgbW9iRXZlbnQgPSBzdHJpbmdBdChib2R5T2YodmFsdWVbJ21pbmVjcmFmdDptb2JfZXZlbnRfZmlsdGVyJ10pLCAnZXZlbnQnKTtcbiAgICBpZiAoJ21pbmVjcmFmdDptb2JfZXZlbnRfZmlsdGVyJyBpbiB2YWx1ZSAmJiBtb2JFdmVudCAhPT0gdW5kZWZpbmVkKSBjb25kaXRpb24ubW9iRXZlbnQgPSBtb2JFdmVudDtcblxuICAgIGNvbnN0IHNwYXduRXZlbnQgPSBzdHJpbmdBdChib2R5T2YodmFsdWVbJ21pbmVjcmFmdDpzcGF3bl9ldmVudCddKSwgJ2V2ZW50Jyk7XG4gICAgaWYgKCdtaW5lY3JhZnQ6c3Bhd25fZXZlbnQnIGluIHZhbHVlICYmIHNwYXduRXZlbnQgIT09IHVuZGVmaW5lZCkgY29uZGl0aW9uLnNwYXduRXZlbnQgPSBzcGF3bkV2ZW50O1xuXG4gICAgaWYgKCdtaW5lY3JhZnQ6cGxheWVyX2luX3ZpbGxhZ2VfZmlsdGVyJyBpbiB2YWx1ZSkge1xuICAgICAgICBjb25zdCBib2R5ID0gYm9keU9mKHZhbHVlWydtaW5lY3JhZnQ6cGxheWVyX2luX3ZpbGxhZ2VfZmlsdGVyJ10pO1xuICAgICAgICBjb25kaXRpb24ucGxheWVySW5WaWxsYWdlID0ge1xuICAgICAgICAgICAgZGlzdGFuY2U6IG51bWJlckF0KGJvZHksICdkaXN0YW5jZScsIDApLFxuICAgICAgICAgICAgdmlsbGFnZUJvcmRlclRvbGVyYW5jZTogbnVtYmVyQXQoYm9keSwgJ3ZpbGxhZ2VfYm9yZGVyX3RvbGVyYW5jZScsIDEwKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBjb25kaXRpb247XG59O1xuXG4vKipcbiAqIFBhcnNlcyBvbmUgYHNwYXduX3J1bGVzLyouanNvbmAgZmlsZS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgcnVsZSwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIGZpbGUgaXMgbm90IGEgc3Bhd24gcnVsZSBvciBuYW1lc1xuICogbm8gaWRlbnRpZmllci4gRXZlcnl0aGluZyBlbHNlIGxvYWRzIGFuZCByZXBvcnRzLlxuICovXG5leHBvcnQgY29uc3QgcGFyc2VTcGF3blJ1bGUgPSAoZmlsZTogdW5rbm93biwgb3B0aW9uczogU3Bhd25SdWxlUGFyc2VPcHRpb25zKTogU3Bhd25SdWxlIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCBmYWlsID0gKGNvZGU6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IGRpYWdub3N0aWM6IERpYWdub3N0aWMgPSB7IHNldmVyaXR5OiAnZXJyb3InLCBjb2RlLCBwYWNrOiBvcHRpb25zLnBhY2ssIG1lc3NhZ2UgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMucGF0aCAhPT0gdW5kZWZpbmVkKSBkaWFnbm9zdGljLnBhdGggPSBvcHRpb25zLnBhdGg7XG4gICAgICAgIG9wdGlvbnMucmVwb3J0Py4oZGlhZ25vc3RpYyk7XG4gICAgfTtcbiAgICBjb25zdCB3YXJuID0gKGNvZGU6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IGRpYWdub3N0aWM6IERpYWdub3N0aWMgPSB7IHNldmVyaXR5OiAnd2FybmluZycsIGNvZGUsIHBhY2s6IG9wdGlvbnMucGFjaywgbWVzc2FnZSB9O1xuICAgICAgICBpZiAob3B0aW9ucy5wYXRoICE9PSB1bmRlZmluZWQpIGRpYWdub3N0aWMucGF0aCA9IG9wdGlvbnMucGF0aDtcbiAgICAgICAgb3B0aW9ucy5yZXBvcnQ/LihkaWFnbm9zdGljKTtcbiAgICB9O1xuXG4gICAgaWYgKCFpc1JlY29yZChmaWxlKSB8fCAhaXNSZWNvcmQoZmlsZVsnbWluZWNyYWZ0OnNwYXduX3J1bGVzJ10pKSB7XG4gICAgICAgIGZhaWwoJ3NwYXduUnVsZS5ub3RBU3Bhd25SdWxlJywgJ3RoZSBmaWxlIGhhcyBubyBgbWluZWNyYWZ0OnNwYXduX3J1bGVzYCBib2R5Jyk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgYm9keSA9IGZpbGVbJ21pbmVjcmFmdDpzcGF3bl9ydWxlcyddO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gYm9keU9mKGJvZHkuZGVzY3JpcHRpb24pO1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSBzdHJpbmdBdChkZXNjcmlwdGlvbiwgJ2lkZW50aWZpZXInKTtcbiAgICBpZiAoaWRlbnRpZmllciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZhaWwoJ3NwYXduUnVsZS5taXNzaW5nSWRlbnRpZmllcicsICdgZGVzY3JpcHRpb24uaWRlbnRpZmllcmAgaXMgbWlzc2luZycpO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHJ1bGU6IHsgLXJlYWRvbmx5IFtLZXkgaW4ga2V5b2YgU3Bhd25SdWxlXTogU3Bhd25SdWxlW0tleV0gfSA9IHsgaWRlbnRpZmllciwgY29uZGl0aW9uczogW10gfTtcblxuICAgIGNvbnN0IGZvcm1hdFZlcnNpb24gPSBzdHJpbmdBdChmaWxlLCAnZm9ybWF0X3ZlcnNpb24nKTtcbiAgICBpZiAoZm9ybWF0VmVyc2lvbiAhPT0gdW5kZWZpbmVkKSBydWxlLmZvcm1hdFZlcnNpb24gPSBmb3JtYXRWZXJzaW9uO1xuXG4gICAgY29uc3QgcG9vbCA9IHN0cmluZ0F0KGRlc2NyaXB0aW9uLCAncG9wdWxhdGlvbl9jb250cm9sJyk7XG4gICAgaWYgKHBvb2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBydWxlLnBvcHVsYXRpb25Db250cm9sID0gcG9vbDtcbiAgICAgICAgaWYgKCFLTk9XTl9QT09MUy5oYXMocG9vbCkpIHdhcm4oJ3NwYXduUnVsZS51bmtub3duUG9vbCcsIGB1bmtub3duIHBvcHVsYXRpb25fY29udHJvbCAke3Bvb2x9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZGl0aW9ucyA9IGJvZHkuY29uZGl0aW9ucztcbiAgICBpZiAoY29uZGl0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb25kaXRpb25zKSkge1xuICAgICAgICAgICAgZmFpbCgnc3Bhd25SdWxlLmJhZFZhbHVlJywgJ2Bjb25kaXRpb25zYCBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBydWxlLmNvbmRpdGlvbnMgPSBjb25kaXRpb25zLmZpbHRlcihpc1JlY29yZCkubWFwKChjb25kaXRpb24pID0+IHBhcnNlQ29uZGl0aW9uKGNvbmRpdGlvbiwgZmFpbCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJ1bGU7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFnQkEsSUFBYSxtQkFBbUI7Q0FDNUI7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtBQUNKOztBQU1BLElBQWEsZUFBZTtDQUFDO0NBQVk7Q0FBUTtDQUFVO0FBQU07Ozs7Ozs7O0FBWWpFLElBQWEsd0JBQXdCO0NBQ2pDO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtBQUNKO0FBdUhBLElBQU0sWUFBWSxVQUNkLE9BQU8sVUFBVSxZQUFZLFVBQVUsUUFBUSxDQUFDLE1BQU0sUUFBUSxLQUFLO0FBRXZFLElBQU0sbUJBQXdDLElBQUksSUFBSSxxQkFBcUI7QUFFM0UsSUFBTSxj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
@@ -0,0 +1,152 @@
1
+ import type { Diagnostic } from '@jsprismarine/entities';
2
+ import type { Filter } from '@jsprismarine/packs';
3
+ /**
4
+ * The spawn rule grammar.
5
+ *
6
+ * A file is `{"format_version": "<semver>", "minecraft:spawn_rules": {...}}`,
7
+ * and the body has `description` and `conditions`. Mojang's
8
+ * `Spawn Rules.json` declares 24 condition components; vanilla writes 21 of
9
+ * them. Parsing reports an unknown component rather than refusing the file, so
10
+ * a pack written against a newer game still loads and the report names what
11
+ * the runtime did not read.
12
+ */
13
+ /** The pools `description.population_control` names, each with its own cap. */
14
+ export declare const POPULATION_POOLS: readonly ['animal', 'water_animal', 'water_ambient', 'ambient', 'monster', 'cat', 'pillager', 'villager'];
15
+ /** One of {@link POPULATION_POOLS}. */
16
+ export type PopulationPool = (typeof POPULATION_POOLS)[number];
17
+ /** The difficulty names `minecraft:difficulty_filter` compares, in ascending order. */
18
+ export declare const DIFFICULTIES: readonly ['peaceful', 'easy', 'normal', 'hard'];
19
+ /** One of {@link DIFFICULTIES}. */
20
+ export type Difficulty = (typeof DIFFICULTIES)[number];
21
+ /**
22
+ * Every condition component `Spawn Rules.json` declares, in the schema's
23
+ * order. Vanilla writes 21 of the 24; `minecraft:spawns_above_block_filter`,
24
+ * `minecraft:is_persistent` and `minecraft:is_experimental` appear in the
25
+ * schema alone, so this package parses them and leaves their meaning to the
26
+ * caller.
27
+ */
28
+ export declare const SPAWN_RULE_COMPONENTS: readonly ['minecraft:biome_filter', 'minecraft:brightness_filter', 'minecraft:delay_filter', 'minecraft:density_limit', 'minecraft:difficulty_filter', 'minecraft:disallow_spawns_in_bubble', 'minecraft:distance_filter', 'minecraft:height_filter', 'minecraft:herd', 'minecraft:is_experimental', 'minecraft:is_persistent', 'minecraft:mob_event_filter', 'minecraft:permute_type', 'minecraft:player_in_village_filter', 'minecraft:spawn_event', 'minecraft:spawns_above_block_filter', 'minecraft:spawns_lava', 'minecraft:spawns_on_block_filter', 'minecraft:spawns_on_block_prevented_filter', 'minecraft:spawns_on_surface', 'minecraft:spawns_underground', 'minecraft:spawns_underwater', 'minecraft:weight', 'minecraft:world_age_filter'];
29
+ /** One of {@link SPAWN_RULE_COMPONENTS}. */
30
+ export type SpawnRuleComponent = (typeof SPAWN_RULE_COMPONENTS)[number];
31
+ /** An inclusive numeric range, as every `{min, max}` component writes one. */
32
+ export interface SpawnRange {
33
+ readonly min: number;
34
+ readonly max: number;
35
+ }
36
+ /** How often one condition is drawn against the others that pass at the same position. */
37
+ export interface SpawnWeight {
38
+ /** The relative weight; a weight of 100 among a total of 1000 is drawn a tenth of the time. */
39
+ readonly default: number;
40
+ /** An extra rarity roll Mojang documents by name only. Zero means no roll. */
41
+ readonly rarity: number;
42
+ }
43
+ /** One `minecraft:herd` alternative: how many spawn together and which events they run. */
44
+ export interface HerdRule {
45
+ readonly minSize: number;
46
+ readonly maxSize: number;
47
+ /** The event the first {@link initialEventCount} members run instead of their spawn event. */
48
+ readonly initialEvent?: string;
49
+ readonly initialEventCount: number;
50
+ /** The event every member past {@link eventSkipCount} runs. */
51
+ readonly event?: string;
52
+ readonly eventSkipCount: number;
53
+ }
54
+ /** One `minecraft:permute_type` entry: a weighted swap of the entity a herd member spawns as. */
55
+ export interface SpawnPermutation {
56
+ readonly weight: number;
57
+ /**
58
+ * The entity to spawn instead, optionally in the `type<event>` form. Absent
59
+ * means the rule's own entity, which is how vanilla writes the common branch.
60
+ */
61
+ readonly entityType?: string;
62
+ /** How many herd members this permutation takes before the weighted draw runs. */
63
+ readonly minGuaranteed: number;
64
+ }
65
+ /** The `minecraft:delay_filter` body: a cooldown shared by every rule naming the same identifier. */
66
+ export interface SpawnDelay {
67
+ readonly min: number;
68
+ readonly max: number;
69
+ /** The cooldown's name, which is how the three pillager patrol conditions keep separate timers. */
70
+ readonly identifier?: string;
71
+ /** The percent chance the attempt takes once the cooldown has elapsed. */
72
+ readonly spawnChance: number;
73
+ }
74
+ /** The `minecraft:player_in_village_filter` body. */
75
+ export interface PlayerInVillageFilter {
76
+ readonly distance: number;
77
+ readonly villageBorderTolerance: number;
78
+ }
79
+ /** The `minecraft:spawns_above_block_filter` body, which no vanilla rule writes. */
80
+ export interface AboveBlockFilter {
81
+ readonly blocks: readonly string[];
82
+ readonly distance: number;
83
+ }
84
+ /**
85
+ * One member of `conditions`: a complete alternative set of requirements with
86
+ * its own weight, herd and permutations. A rule passes at a position when any
87
+ * one of its conditions does.
88
+ */
89
+ export interface SpawnCondition {
90
+ readonly weight: SpawnWeight;
91
+ readonly biomeFilter?: Filter;
92
+ readonly brightness?: {
93
+ readonly min: number;
94
+ readonly max: number;
95
+ readonly adjustForWeather: boolean;
96
+ };
97
+ readonly difficulty?: {
98
+ readonly min: Difficulty;
99
+ readonly max: Difficulty;
100
+ };
101
+ readonly height?: SpawnRange;
102
+ /** How far from the nearest player the position must be. */
103
+ readonly distance?: SpawnRange;
104
+ /** How many of this entity may already stand nearby, per pass; -1 is no limit. */
105
+ readonly density?: {
106
+ readonly surface: number;
107
+ readonly underground: number;
108
+ };
109
+ readonly worldAge?: SpawnRange;
110
+ readonly spawnsOnSurface: boolean;
111
+ readonly spawnsUnderground: boolean;
112
+ readonly spawnsUnderwater: boolean;
113
+ readonly spawnsLava: boolean;
114
+ readonly disallowSpawnsInBubble: boolean;
115
+ readonly isPersistent: boolean;
116
+ readonly isExperimental: boolean;
117
+ /** The blocks the position may stand on; an empty list means the component is absent. */
118
+ readonly blocks?: readonly string[];
119
+ /** The blocks the position may not stand on. */
120
+ readonly preventedBlocks?: readonly string[];
121
+ readonly aboveBlocks?: AboveBlockFilter;
122
+ readonly herd: readonly HerdRule[];
123
+ readonly permutations?: readonly SpawnPermutation[];
124
+ readonly delay?: SpawnDelay;
125
+ readonly mobEvent?: string;
126
+ /** The event a spawned entity runs instead of `minecraft:entity_spawned`. */
127
+ readonly spawnEvent?: string;
128
+ readonly playerInVillage?: PlayerInVillageFilter;
129
+ }
130
+ /** One parsed `spawn_rules/*.json`. */
131
+ export interface SpawnRule {
132
+ readonly identifier: string;
133
+ /** The pool whose cap gates this entity, absent when the file names none. */
134
+ readonly populationControl?: string;
135
+ readonly formatVersion?: string;
136
+ readonly conditions: readonly SpawnCondition[];
137
+ }
138
+ /** Where a parse reports its findings. */
139
+ export interface SpawnRuleParseOptions {
140
+ /** The pack the file came from, used in the diagnostics. */
141
+ readonly pack: string;
142
+ readonly path?: string;
143
+ readonly report?: (diagnostic: Diagnostic) => void;
144
+ }
145
+ /**
146
+ * Parses one `spawn_rules/*.json` file.
147
+ *
148
+ * @returns The rule, or undefined when the file is not a spawn rule or names
149
+ * no identifier. Everything else loads and reports.
150
+ */
151
+ export declare const parseSpawnRule: (file: unknown, options: SpawnRuleParseOptions) => SpawnRule | undefined;
152
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":"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"}