bedrock-kit 0.0.3

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.
Files changed (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +32 -0
  3. package/dist/bedrockKit.d.ts +32 -0
  4. package/dist/bedrockKit.d.ts.map +1 -0
  5. package/dist/bedrockKit.js +33 -0
  6. package/dist/bedrockKit.js.map +1 -0
  7. package/dist/internal/addon.d.ts +198 -0
  8. package/dist/internal/addon.d.ts.map +1 -0
  9. package/dist/internal/addon.js +562 -0
  10. package/dist/internal/addon.js.map +1 -0
  11. package/dist/internal/animation.d.ts +53 -0
  12. package/dist/internal/animation.d.ts.map +1 -0
  13. package/dist/internal/animation.js +47 -0
  14. package/dist/internal/animation.js.map +1 -0
  15. package/dist/internal/attachable.d.ts +31 -0
  16. package/dist/internal/attachable.d.ts.map +1 -0
  17. package/dist/internal/attachable.js +35 -0
  18. package/dist/internal/attachable.js.map +1 -0
  19. package/dist/internal/biome.d.ts +62 -0
  20. package/dist/internal/biome.d.ts.map +1 -0
  21. package/dist/internal/biome.js +75 -0
  22. package/dist/internal/biome.js.map +1 -0
  23. package/dist/internal/block.d.ts +55 -0
  24. package/dist/internal/block.d.ts.map +1 -0
  25. package/dist/internal/block.js +75 -0
  26. package/dist/internal/block.js.map +1 -0
  27. package/dist/internal/entity.d.ts +107 -0
  28. package/dist/internal/entity.d.ts.map +1 -0
  29. package/dist/internal/entity.js +148 -0
  30. package/dist/internal/entity.js.map +1 -0
  31. package/dist/internal/item.d.ts +72 -0
  32. package/dist/internal/item.d.ts.map +1 -0
  33. package/dist/internal/item.js +103 -0
  34. package/dist/internal/item.js.map +1 -0
  35. package/dist/internal/itemStack.d.ts +27 -0
  36. package/dist/internal/itemStack.d.ts.map +1 -0
  37. package/dist/internal/itemStack.js +23 -0
  38. package/dist/internal/itemStack.js.map +1 -0
  39. package/dist/internal/lootTable.d.ts +38 -0
  40. package/dist/internal/lootTable.d.ts.map +1 -0
  41. package/dist/internal/lootTable.js +57 -0
  42. package/dist/internal/lootTable.js.map +1 -0
  43. package/dist/internal/particle.d.ts +35 -0
  44. package/dist/internal/particle.d.ts.map +1 -0
  45. package/dist/internal/particle.js +42 -0
  46. package/dist/internal/particle.js.map +1 -0
  47. package/dist/internal/recipe.d.ts +89 -0
  48. package/dist/internal/recipe.d.ts.map +1 -0
  49. package/dist/internal/recipe.js +198 -0
  50. package/dist/internal/recipe.js.map +1 -0
  51. package/dist/internal/renderController.d.ts +24 -0
  52. package/dist/internal/renderController.d.ts.map +1 -0
  53. package/dist/internal/renderController.js +19 -0
  54. package/dist/internal/renderController.js.map +1 -0
  55. package/dist/internal/sound.d.ts +85 -0
  56. package/dist/internal/sound.d.ts.map +1 -0
  57. package/dist/internal/sound.js +64 -0
  58. package/dist/internal/sound.js.map +1 -0
  59. package/dist/internal/spawnRule.d.ts +44 -0
  60. package/dist/internal/spawnRule.d.ts.map +1 -0
  61. package/dist/internal/spawnRule.js +57 -0
  62. package/dist/internal/spawnRule.js.map +1 -0
  63. package/dist/internal/tag.d.ts +43 -0
  64. package/dist/internal/tag.d.ts.map +1 -0
  65. package/dist/internal/tag.js +8 -0
  66. package/dist/internal/tag.js.map +1 -0
  67. package/dist/internal/tradingTable.d.ts +34 -0
  68. package/dist/internal/tradingTable.d.ts.map +1 -0
  69. package/dist/internal/tradingTable.js +62 -0
  70. package/dist/internal/tradingTable.js.map +1 -0
  71. package/dist/internal/types.d.ts +97 -0
  72. package/dist/internal/types.d.ts.map +1 -0
  73. package/dist/internal/types.js +3 -0
  74. package/dist/internal/types.js.map +1 -0
  75. package/dist/internal/utils.d.ts +39 -0
  76. package/dist/internal/utils.d.ts.map +1 -0
  77. package/dist/internal/utils.js +137 -0
  78. package/dist/internal/utils.js.map +1 -0
  79. package/package.json +35 -0
@@ -0,0 +1,89 @@
1
+ import type { AddOn } from "./addon.js";
2
+ import type { RecipeType } from "./types.js";
3
+ import { Tag } from "./tag.js";
4
+ import { ItemStack } from "./itemStack.js";
5
+ import type { Item } from "./item.js";
6
+ import type { Ingredient, ShapelessIngredient, FurnaceResolved, BrewingResolved } from "./tag.js";
7
+ export type { RecipeType };
8
+ /**
9
+ * Represents a single recipe file from the behavior pack's `recipes/` directory.
10
+ * Supports shaped, shapeless, furnace, and brewing recipe types.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * const recipes = addon.getRecipesFor("minecraft:copper_spear");
15
+ * const shaped = recipes.find(r => r.type === "shaped");
16
+ * const grid = shaped?.resolveShape();
17
+ * // grid[0][2] instanceof Item -> true
18
+ * ```
19
+ */
20
+ export declare class Recipe {
21
+ /** The raw parsed JSON of the recipe file. */
22
+ readonly data: Record<string, unknown>;
23
+ /** The recipe type as detected from the root JSON key. */
24
+ readonly type: RecipeType;
25
+ /**
26
+ * Pattern rows for shaped recipes, e.g. `["X ", "X ", "X "]`.
27
+ * Null for non-shaped recipes.
28
+ */
29
+ readonly shape: string[] | null;
30
+ /**
31
+ * Raw ingredient data extracted from the recipe file.
32
+ * Prefer the typed resolve methods over reading this directly.
33
+ */
34
+ readonly ingredients: Record<string, string> | string[];
35
+ private readonly _addon;
36
+ constructor(data: Record<string, unknown>, addon: AddOn);
37
+ private _detectType;
38
+ private _extractIngredients;
39
+ private _parseResult;
40
+ /**
41
+ * Returns the output of this recipe as an `ItemStack`, or null if the recipe
42
+ * has no result (e.g. some brewing recipes).
43
+ *
44
+ * `ItemStack.item` is null when the result identifier has no matching item
45
+ * definition in the behavior pack. `ItemStack.count` reflects the exact
46
+ * output quantity specified in the recipe file, defaulting to 1.
47
+ *
48
+ * @example
49
+ * ```ts
50
+ * const stack = addon.getRecipesFor("minecraft:stick")[0]?.getResultStack();
51
+ * console.log(stack?.count); // 4
52
+ * console.log(stack?.item?.identifier); // "minecraft:stick"
53
+ * ```
54
+ */
55
+ getResultStack(): ItemStack | null;
56
+ /** @deprecated Use `getResultStack()` instead. */
57
+ getResultItem(): Item | null;
58
+ /**
59
+ * Shaped: returns a 2D grid matching the pattern.
60
+ * Each cell is an Item, a Tag, or null for an empty slot.
61
+ * Returns null if this recipe is not shaped.
62
+ */
63
+ resolveShape(): Ingredient[][] | null;
64
+ /**
65
+ * Shapeless: returns each ingredient as an Item or Tag with its count.
66
+ * Returns null if this recipe is not shapeless.
67
+ */
68
+ resolveShapeless(): ShapelessIngredient[] | null;
69
+ /**
70
+ * Furnace: returns input and output as Item or Tag objects.
71
+ * Returns null if this recipe is not a furnace recipe.
72
+ */
73
+ resolveFurnace(): FurnaceResolved | null;
74
+ /**
75
+ * Brewing: returns input, reagent, and output as Item or Tag objects.
76
+ * Returns null if this recipe is not a brewing recipe.
77
+ */
78
+ resolveBrewing(): BrewingResolved | null;
79
+ /**
80
+ * Returns a flat array of all ingredients across the recipe as `Item | Tag` objects.
81
+ * Empty slots are excluded.
82
+ */
83
+ getAllIngredients(): Array<Item | Tag>;
84
+ private _resolveIngredientStr;
85
+ /** Returns true if this recipe uses the given item identifier as an ingredient, regardless of whether it is in the addon's item store. */
86
+ usesItem(identifier: string): boolean;
87
+ private _allIngredientStrings;
88
+ }
89
+ //# sourceMappingURL=recipe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../../src/internal/recipe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EACV,UAAU,EACV,mBAAmB,EACnB,eAAe,EACf,eAAe,EAChB,MAAM,UAAU,CAAC;AAElB,YAAY,EAAE,UAAU,EAAE,CAAC;AAE3B;;;;;;;;;;;GAWG;AACH,qBAAa,MAAM;IACjB,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC;IAExD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;gBAEnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK;IAUvD,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,YAAY;IAWpB;;;;;;;;;;;;;;OAcG;IACH,cAAc,IAAI,SAAS,GAAG,IAAI;IAQlC,kDAAkD;IAClD,aAAa,IAAI,IAAI,GAAG,IAAI;IAI5B;;;;OAIG;IACH,YAAY,IAAI,UAAU,EAAE,EAAE,GAAG,IAAI;IAYrC;;;OAGG;IACH,gBAAgB,IAAI,mBAAmB,EAAE,GAAG,IAAI;IAahD;;;OAGG;IACH,cAAc,IAAI,eAAe,GAAG,IAAI;IAUxC;;;OAGG;IACH,cAAc,IAAI,eAAe,GAAG,IAAI;IAWxC;;;OAGG;IACH,iBAAiB,IAAI,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC;IAQtC,OAAO,CAAC,qBAAqB;IAM7B,0IAA0I;IAC1I,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAIrC,OAAO,CAAC,qBAAqB;CAiB9B"}
@@ -0,0 +1,198 @@
1
+ import { Tag } from "./tag.js";
2
+ import { ItemStack } from "./itemStack.js";
3
+ import { parseIngredient } from "./utils.js";
4
+ /**
5
+ * Represents a single recipe file from the behavior pack's `recipes/` directory.
6
+ * Supports shaped, shapeless, furnace, and brewing recipe types.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * const recipes = addon.getRecipesFor("minecraft:copper_spear");
11
+ * const shaped = recipes.find(r => r.type === "shaped");
12
+ * const grid = shaped?.resolveShape();
13
+ * // grid[0][2] instanceof Item -> true
14
+ * ```
15
+ */
16
+ export class Recipe {
17
+ constructor(data, addon) {
18
+ this.data = data;
19
+ this._addon = addon;
20
+ const recipeKey = Object.keys(data).find((k) => k.startsWith("minecraft:recipe_"));
21
+ const inner = recipeKey ? data[recipeKey] : {};
22
+ this.type = this._detectType(recipeKey ?? "");
23
+ this.shape = Array.isArray(inner["pattern"]) ? inner["pattern"] : null;
24
+ this.ingredients = this._extractIngredients(inner);
25
+ }
26
+ _detectType(key) {
27
+ if (key.includes("shaped"))
28
+ return "shaped";
29
+ if (key.includes("shapeless"))
30
+ return "shapeless";
31
+ if (key.includes("furnace"))
32
+ return "furnace";
33
+ if (key.includes("brewing_mix"))
34
+ return "brewing_mix";
35
+ if (key.includes("brewing_container"))
36
+ return "brewing_container";
37
+ return "unknown";
38
+ }
39
+ _extractIngredients(inner) {
40
+ if (inner["key"] && typeof inner["key"] === "object" && !Array.isArray(inner["key"])) {
41
+ const keyMap = inner["key"];
42
+ const result = {};
43
+ for (const [symbol, value] of Object.entries(keyMap))
44
+ result[symbol] = parseIngredient(value);
45
+ return result;
46
+ }
47
+ if (Array.isArray(inner["ingredients"])) {
48
+ return inner["ingredients"].map(parseIngredient);
49
+ }
50
+ return {};
51
+ }
52
+ _parseResult(inner) {
53
+ if (!inner["result"])
54
+ return null;
55
+ if (typeof inner["result"] === "string")
56
+ return { identifier: inner["result"], count: 1 };
57
+ const r = inner["result"];
58
+ const identifier = r["item"] ?? r["block"] ?? null;
59
+ if (!identifier)
60
+ return null;
61
+ const count = typeof r["count"] === "number" ? r["count"] : 1;
62
+ return { identifier, count };
63
+ }
64
+ /**
65
+ * Returns the output of this recipe as an `ItemStack`, or null if the recipe
66
+ * has no result (e.g. some brewing recipes).
67
+ *
68
+ * `ItemStack.item` is null when the result identifier has no matching item
69
+ * definition in the behavior pack. `ItemStack.count` reflects the exact
70
+ * output quantity specified in the recipe file, defaulting to 1.
71
+ *
72
+ * @example
73
+ * ```ts
74
+ * const stack = addon.getRecipesFor("minecraft:stick")[0]?.getResultStack();
75
+ * console.log(stack?.count); // 4
76
+ * console.log(stack?.item?.identifier); // "minecraft:stick"
77
+ * ```
78
+ */
79
+ getResultStack() {
80
+ const recipeKey = Object.keys(this.data).find((k) => k.startsWith("minecraft:recipe_"));
81
+ const inner = recipeKey ? this.data[recipeKey] : {};
82
+ const parsed = this._parseResult(inner);
83
+ if (!parsed)
84
+ return null;
85
+ return new ItemStack(parsed.identifier, parsed.count, this._addon);
86
+ }
87
+ /** @deprecated Use `getResultStack()` instead. */
88
+ getResultItem() {
89
+ return this.getResultStack()?.item ?? null;
90
+ }
91
+ /**
92
+ * Shaped: returns a 2D grid matching the pattern.
93
+ * Each cell is an Item, a Tag, or null for an empty slot.
94
+ * Returns null if this recipe is not shaped.
95
+ */
96
+ resolveShape() {
97
+ if (this.type !== "shaped" || !this.shape)
98
+ return null;
99
+ const keyMap = this.ingredients;
100
+ return this.shape.map((row) => row.split("").map((char) => {
101
+ if (char === " ")
102
+ return null;
103
+ const raw = keyMap[char] ?? "";
104
+ return this._resolveIngredientStr(raw);
105
+ }));
106
+ }
107
+ /**
108
+ * Shapeless: returns each ingredient as an Item or Tag with its count.
109
+ * Returns null if this recipe is not shapeless.
110
+ */
111
+ resolveShapeless() {
112
+ if (this.type !== "shapeless")
113
+ return null;
114
+ const recipeKey = Object.keys(this.data).find((k) => k.startsWith("minecraft:recipe_"));
115
+ const inner = recipeKey ? this.data[recipeKey] : {};
116
+ const raw = inner["ingredients"];
117
+ if (!Array.isArray(raw))
118
+ return [];
119
+ return raw.flatMap((entry) => {
120
+ const ingredient = this._resolveIngredientStr(parseIngredient(entry));
121
+ if (!ingredient)
122
+ return [];
123
+ return [{ ingredient, count: entry["count"] ?? 1 }];
124
+ });
125
+ }
126
+ /**
127
+ * Furnace: returns input and output as Item or Tag objects.
128
+ * Returns null if this recipe is not a furnace recipe.
129
+ */
130
+ resolveFurnace() {
131
+ if (this.type !== "furnace")
132
+ return null;
133
+ const recipeKey = Object.keys(this.data).find((k) => k.startsWith("minecraft:recipe_"));
134
+ const inner = recipeKey ? this.data[recipeKey] : {};
135
+ const input = this._resolveIngredientStr(parseIngredient(inner["input"]));
136
+ const output = this._resolveIngredientStr(parseIngredient(inner["output"]));
137
+ if (!input || !output)
138
+ return null;
139
+ return { input, output };
140
+ }
141
+ /**
142
+ * Brewing: returns input, reagent, and output as Item or Tag objects.
143
+ * Returns null if this recipe is not a brewing recipe.
144
+ */
145
+ resolveBrewing() {
146
+ if (this.type !== "brewing_mix" && this.type !== "brewing_container")
147
+ return null;
148
+ const recipeKey = Object.keys(this.data).find((k) => k.startsWith("minecraft:recipe_"));
149
+ const inner = recipeKey ? this.data[recipeKey] : {};
150
+ const input = this._resolveIngredientStr(parseIngredient(inner["input"]));
151
+ const reagent = this._resolveIngredientStr(parseIngredient(inner["reagent"]));
152
+ const output = this._resolveIngredientStr(parseIngredient(inner["output"]));
153
+ if (!input || !reagent || !output)
154
+ return null;
155
+ return { input, reagent, output };
156
+ }
157
+ /**
158
+ * Returns a flat array of all ingredients across the recipe as `Item | Tag` objects.
159
+ * Empty slots are excluded.
160
+ */
161
+ getAllIngredients() {
162
+ const strs = this._allIngredientStrings();
163
+ return strs.flatMap((s) => {
164
+ const r = this._resolveIngredientStr(s);
165
+ return r ? [r] : [];
166
+ });
167
+ }
168
+ _resolveIngredientStr(raw) {
169
+ if (!raw)
170
+ return null;
171
+ if (raw.startsWith("tag:"))
172
+ return new Tag(raw.slice(4));
173
+ return this._addon.getItem(raw) ?? new Tag(raw);
174
+ }
175
+ /** Returns true if this recipe uses the given item identifier as an ingredient, regardless of whether it is in the addon's item store. */
176
+ usesItem(identifier) {
177
+ return this._allIngredientStrings().some((s) => s === identifier);
178
+ }
179
+ _allIngredientStrings() {
180
+ const recipeKey = Object.keys(this.data).find((k) => k.startsWith("minecraft:recipe_"));
181
+ const inner = recipeKey ? this.data[recipeKey] : {};
182
+ const strs = [];
183
+ if (inner["key"] && typeof inner["key"] === "object" && !Array.isArray(inner["key"])) {
184
+ for (const v of Object.values(inner["key"]))
185
+ strs.push(parseIngredient(v));
186
+ }
187
+ if (Array.isArray(inner["ingredients"])) {
188
+ for (const v of inner["ingredients"])
189
+ strs.push(parseIngredient(v));
190
+ }
191
+ for (const field of ["input", "reagent", "output"]) {
192
+ if (inner[field])
193
+ strs.push(parseIngredient(inner[field]));
194
+ }
195
+ return strs.filter(Boolean);
196
+ }
197
+ }
198
+ //# sourceMappingURL=recipe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipe.js","sourceRoot":"","sources":["../../src/internal/recipe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Represents a single render controller loaded from a resource pack
3
+ * `render_controllers/` file. Render controllers define which geometry,
4
+ * materials, and textures are applied to an entity at runtime.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * const rc = addon.getRenderController("controller.render.zombie");
9
+ * console.log(rc?.data); // { geometry: "...", materials: [...], textures: [...] }
10
+ * ```
11
+ */
12
+ export declare class RenderController {
13
+ /** The full controller ID, e.g. `"controller.render.zombie"`. */
14
+ readonly id: string;
15
+ /** The raw data for this render controller definition. */
16
+ readonly data: Record<string, unknown>;
17
+ /**
18
+ * Absolute path to the file this controller was loaded from.
19
+ * Empty string when loaded from browser `File[]`.
20
+ */
21
+ readonly filePath: string;
22
+ constructor(id: string, data: Record<string, unknown>, filePath: string);
23
+ }
24
+ //# sourceMappingURL=renderController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderController.d.ts","sourceRoot":"","sources":["../../src/internal/renderController.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,qBAAa,gBAAgB;IAC3B,iEAAiE;IACjE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM;CAKxE"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Represents a single render controller loaded from a resource pack
3
+ * `render_controllers/` file. Render controllers define which geometry,
4
+ * materials, and textures are applied to an entity at runtime.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * const rc = addon.getRenderController("controller.render.zombie");
9
+ * console.log(rc?.data); // { geometry: "...", materials: [...], textures: [...] }
10
+ * ```
11
+ */
12
+ export class RenderController {
13
+ constructor(id, data, filePath) {
14
+ this.id = id;
15
+ this.data = data;
16
+ this.filePath = filePath;
17
+ }
18
+ }
19
+ //# sourceMappingURL=renderController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderController.js","sourceRoot":"","sources":["../../src/internal/renderController.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,OAAO,gBAAgB;IAW3B,YAAY,EAAU,EAAE,IAA6B,EAAE,QAAgB;QACrE,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,85 @@
1
+ import type { SoundFile } from "./types.js";
2
+ export type { SoundFile };
3
+ /**
4
+ * Represents a single entry from `sounds/sound_definitions.json`.
5
+ * Each definition maps a sound event ID (e.g. `"mob.zombie.say"`) to a list of
6
+ * audio files and their playback properties.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * const def = addon.getSoundDefinition("mob.zombie.say");
11
+ * console.log(def?.category); // "mob"
12
+ * console.log(def?.files[0].name); // "sounds/mob/zombie/say1"
13
+ * ```
14
+ */
15
+ export declare class SoundDefinition {
16
+ /** The sound event identifier, e.g. `"mob.zombie.say"`. */
17
+ readonly id: string;
18
+ /** The raw data for this sound definition entry. */
19
+ readonly data: Record<string, unknown>;
20
+ /**
21
+ * The audio category, e.g. `"ambient"`, `"block"`, `"mob"`, `"music"`, `"player"`, `"ui"`.
22
+ * Null if not specified.
23
+ */
24
+ readonly category: string | null;
25
+ /** The parsed list of audio files this definition can play. */
26
+ readonly files: SoundFile[];
27
+ constructor(id: string, data: Record<string, unknown>);
28
+ private _parseFiles;
29
+ }
30
+ /**
31
+ * A resolved sound event binding — the pairing of an event name with the
32
+ * `SoundDefinition` it maps to. Returned by `Entity.getSoundEvents()` and
33
+ * `Block.getSoundEvents()`.
34
+ *
35
+ * Event values in `sounds.json` can be plain strings (just a definition ID) or
36
+ * inline objects with overriding `sound`, `pitch`, and `volume` fields.
37
+ * Both forms are normalised into this shape.
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * const events = addon.getEntity("minecraft:zombie")?.getSoundEvents() ?? [];
42
+ * for (const { event, definition } of events) {
43
+ * console.log(event, "→", definition?.files[0].name);
44
+ * }
45
+ * ```
46
+ */
47
+ export interface SoundEvent {
48
+ /** The event name, e.g. `"ambient"`, `"death"`, `"hurt"`. */
49
+ event: string;
50
+ /**
51
+ * The sound definition ID this event resolves to, e.g. `"mob.zombie.say"`.
52
+ * Empty string means the event is intentionally silent.
53
+ */
54
+ definitionId: string;
55
+ /** The resolved `SoundDefinition`, or null if the ID is not in `sound_definitions.json`. */
56
+ definition: SoundDefinition | null;
57
+ /** Per-event volume override from `sounds.json`. Null if not specified. */
58
+ volume: number | null;
59
+ /** Per-event pitch override from `sounds.json`. Null if not specified. */
60
+ pitch: number | [number, number] | null;
61
+ }
62
+ /**
63
+ * Represents a single entry from `sounds/music_definitions.json`.
64
+ * Maps a context key (biome shortname, `"game"`, `"menu"`, etc.) to the music
65
+ * event that plays there and its delay range.
66
+ *
67
+ * @example
68
+ * ```ts
69
+ * const music = addon.getMusicDefinition("bamboo_jungle");
70
+ * console.log(music?.eventName); // "music.overworld.bamboo_jungle"
71
+ * console.log(music?.minDelay); // 60
72
+ * ```
73
+ */
74
+ export declare class MusicDefinition {
75
+ /** The context key, e.g. `"bamboo_jungle"`, `"game"`, `"menu"`. */
76
+ readonly id: string;
77
+ /** The sound event ID to play, e.g. `"music.overworld.bamboo_jungle"`. */
78
+ readonly eventName: string;
79
+ /** Minimum seconds before music starts. */
80
+ readonly minDelay: number;
81
+ /** Maximum seconds before music starts. */
82
+ readonly maxDelay: number;
83
+ constructor(id: string, data: Record<string, unknown>);
84
+ }
85
+ //# sourceMappingURL=sound.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sound.d.ts","sourceRoot":"","sources":["../../src/internal/sound.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B;;;;;;;;;;;GAWG;AACH,qBAAa,eAAe;IAC1B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC;gBAEhB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAOrD,OAAO,CAAC,WAAW;CAepB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,UAAU;IACzB,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,4FAA4F;IAC5F,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,2EAA2E;IAC3E,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,0EAA0E;IAC1E,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;CACzC;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,eAAe;IAC1B,mEAAmE;IACnE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,2CAA2C;IAC3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,2CAA2C;IAC3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAOtD"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Represents a single entry from `sounds/sound_definitions.json`.
3
+ * Each definition maps a sound event ID (e.g. `"mob.zombie.say"`) to a list of
4
+ * audio files and their playback properties.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * const def = addon.getSoundDefinition("mob.zombie.say");
9
+ * console.log(def?.category); // "mob"
10
+ * console.log(def?.files[0].name); // "sounds/mob/zombie/say1"
11
+ * ```
12
+ */
13
+ export class SoundDefinition {
14
+ constructor(id, data) {
15
+ this.id = id;
16
+ this.data = data;
17
+ this.category = data["category"] ?? null;
18
+ this.files = this._parseFiles(data["sounds"]);
19
+ }
20
+ _parseFiles(raw) {
21
+ if (!Array.isArray(raw))
22
+ return [];
23
+ return raw.map((entry) => {
24
+ if (typeof entry === "string")
25
+ return { name: entry };
26
+ const e = entry;
27
+ const result = { name: e["name"] ?? "" };
28
+ if (typeof e["volume"] === "number")
29
+ result.volume = e["volume"];
30
+ if (typeof e["pitch"] === "number")
31
+ result.pitch = e["pitch"];
32
+ if (typeof e["weight"] === "number")
33
+ result.weight = e["weight"];
34
+ if (typeof e["is3D"] === "boolean")
35
+ result.is3D = e["is3D"];
36
+ if (typeof e["stream"] === "boolean")
37
+ result.stream = e["stream"];
38
+ if (typeof e["load_on_low_memory"] === "boolean")
39
+ result.loadOnLowMemory = e["load_on_low_memory"];
40
+ return result;
41
+ });
42
+ }
43
+ }
44
+ /**
45
+ * Represents a single entry from `sounds/music_definitions.json`.
46
+ * Maps a context key (biome shortname, `"game"`, `"menu"`, etc.) to the music
47
+ * event that plays there and its delay range.
48
+ *
49
+ * @example
50
+ * ```ts
51
+ * const music = addon.getMusicDefinition("bamboo_jungle");
52
+ * console.log(music?.eventName); // "music.overworld.bamboo_jungle"
53
+ * console.log(music?.minDelay); // 60
54
+ * ```
55
+ */
56
+ export class MusicDefinition {
57
+ constructor(id, data) {
58
+ this.id = id;
59
+ this.eventName = data["event_name"] ?? "";
60
+ this.minDelay = data["min_delay"] ?? 0;
61
+ this.maxDelay = data["max_delay"] ?? 0;
62
+ }
63
+ }
64
+ //# sourceMappingURL=sound.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sound.js","sourceRoot":"","sources":["../../src/internal/sound.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,eAAe;IAa1B,YAAY,EAAU,EAAE,IAA6B;QACnD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAI,IAAI,CAAC,UAAU,CAAY,IAAI,IAAI,CAAC;QACrD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,CAAC;IAEO,WAAW,CAAC,GAAY;QAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;QACnC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACvB,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACtD,MAAM,CAAC,GAAG,KAAgC,CAAC;YAC3C,MAAM,MAAM,GAAc,EAAE,IAAI,EAAG,CAAC,CAAC,MAAM,CAAY,IAAI,EAAE,EAAE,CAAC;YAChE,IAAI,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,QAAQ;gBAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAW,CAAC;YAC3E,IAAI,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ;gBAAE,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,OAAO,CAAW,CAAC;YACxE,IAAI,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,QAAQ;gBAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAW,CAAC;YAC3E,IAAI,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,SAAS;gBAAE,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAY,CAAC;YACvE,IAAI,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,SAAS;gBAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAY,CAAC;YAC7E,IAAI,OAAO,CAAC,CAAC,oBAAoB,CAAC,KAAK,SAAS;gBAAE,MAAM,CAAC,eAAe,GAAG,CAAC,CAAC,oBAAoB,CAAY,CAAC;YAC9G,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAmCD;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,eAAe;IAU1B,YAAY,EAAU,EAAE,IAA6B;QACnD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,SAAS,GAAI,IAAI,CAAC,YAAY,CAAY,IAAI,EAAE,CAAC;QACtD,IAAI,CAAC,QAAQ,GAAI,IAAI,CAAC,WAAW,CAAY,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,GAAI,IAAI,CAAC,WAAW,CAAY,IAAI,CAAC,CAAC;IACrD,CAAC;CAEF"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Represents a spawn rule file from the behavior pack's `spawn_rules/` directory.
3
+ * Spawn rules define when and where an entity can naturally spawn in the world.
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * const rule = addon.getSpawnRule("minecraft:zombie");
8
+ * console.log(rule?.populationControl); // "monster"
9
+ * console.log(rule?.getBiomeTags()); // ["monster", "overworld"]
10
+ * ```
11
+ */
12
+ export declare class SpawnRule {
13
+ /** The namespaced entity identifier this spawn rule applies to, e.g. `"minecraft:zombie"`. */
14
+ readonly identifier: string;
15
+ /** The raw parsed JSON of the spawn rule file. */
16
+ readonly data: Record<string, unknown>;
17
+ /**
18
+ * Absolute path to the spawn rule file on disk.
19
+ * Empty string when loaded from browser `File[]`.
20
+ */
21
+ readonly filePath: string;
22
+ /**
23
+ * The population control group that limits how many of this entity spawn together.
24
+ * Common values: `"animal"`, `"monster"`, `"ambient"`, `"water_animal"`.
25
+ * Null if not specified.
26
+ */
27
+ readonly populationControl: string | null;
28
+ /** The raw condition objects from the spawn rule. Each condition defines spawn requirements. */
29
+ readonly conditions: Record<string, unknown>[];
30
+ constructor(identifier: string, data: Record<string, unknown>, filePath: string);
31
+ /**
32
+ * Extracts all biome tag values referenced in this spawn rule's `minecraft:biome_filter`
33
+ * conditions. Tags are used to match biomes — e.g. `"monster"`, `"savanna"`, `"mesa"`.
34
+ *
35
+ * @returns Deduplicated list of biome tag strings.
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * addon.getSpawnRule("minecraft:armadillo")?.getBiomeTags(); // ["savanna", "mesa", "plateau"]
40
+ * ```
41
+ */
42
+ getBiomeTags(): string[];
43
+ }
44
+ //# sourceMappingURL=spawnRule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawnRule.d.ts","sourceRoot":"","sources":["../../src/internal/spawnRule.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,qBAAa,SAAS;IACpB,8FAA8F;IAC9F,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,kDAAkD;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,gGAAgG;IAChG,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;gBAEnC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM;IAW/E;;;;;;;;;;OAUG;IACH,YAAY,IAAI,MAAM,EAAE;CAqBzB"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Represents a spawn rule file from the behavior pack's `spawn_rules/` directory.
3
+ * Spawn rules define when and where an entity can naturally spawn in the world.
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * const rule = addon.getSpawnRule("minecraft:zombie");
8
+ * console.log(rule?.populationControl); // "monster"
9
+ * console.log(rule?.getBiomeTags()); // ["monster", "overworld"]
10
+ * ```
11
+ */
12
+ export class SpawnRule {
13
+ constructor(identifier, data, filePath) {
14
+ this.identifier = identifier;
15
+ this.data = data;
16
+ this.filePath = filePath;
17
+ const inner = data["minecraft:spawn_rules"] ?? {};
18
+ const desc = inner["description"] ?? {};
19
+ this.populationControl = desc["population_control"] ?? null;
20
+ this.conditions = Array.isArray(inner["conditions"])
21
+ ? inner["conditions"] : [];
22
+ }
23
+ /**
24
+ * Extracts all biome tag values referenced in this spawn rule's `minecraft:biome_filter`
25
+ * conditions. Tags are used to match biomes — e.g. `"monster"`, `"savanna"`, `"mesa"`.
26
+ *
27
+ * @returns Deduplicated list of biome tag strings.
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * addon.getSpawnRule("minecraft:armadillo")?.getBiomeTags(); // ["savanna", "mesa", "plateau"]
32
+ * ```
33
+ */
34
+ getBiomeTags() {
35
+ const tags = [];
36
+ for (const cond of this.conditions) {
37
+ const filter = cond["minecraft:biome_filter"];
38
+ if (!filter)
39
+ continue;
40
+ const filters = Array.isArray(filter) ? filter : [filter];
41
+ for (const f of filters) {
42
+ if (f["test"] === "has_biome_tag" && typeof f["value"] === "string")
43
+ tags.push(f["value"]);
44
+ for (const key of ["all_of", "any_of"]) {
45
+ if (Array.isArray(f[key])) {
46
+ for (const sub of f[key]) {
47
+ if (sub["test"] === "has_biome_tag" && typeof sub["value"] === "string")
48
+ tags.push(sub["value"]);
49
+ }
50
+ }
51
+ }
52
+ }
53
+ }
54
+ return [...new Set(tags)];
55
+ }
56
+ }
57
+ //# sourceMappingURL=spawnRule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawnRule.js","sourceRoot":"","sources":["../../src/internal/spawnRule.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,OAAO,SAAS;IAmBpB,YAAY,UAAkB,EAAE,IAA6B,EAAE,QAAgB;QAC7E,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,MAAM,KAAK,GAAI,IAAI,CAAC,uBAAuB,CAA6B,IAAI,EAAE,CAAC;QAC/E,MAAM,IAAI,GAAI,KAAK,CAAC,aAAa,CAA6B,IAAI,EAAE,CAAC;QACrE,IAAI,CAAC,iBAAiB,GAAI,IAAI,CAAC,oBAAoB,CAAY,IAAI,IAAI,CAAC;QACxE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAClD,CAAC,CAAE,KAAK,CAAC,YAAY,CAA+B,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,CAAC;IAED;;;;;;;;;;OAUG;IACH,YAAY;QACV,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAC9C,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC1D,KAAK,MAAM,CAAC,IAAI,OAAoC,EAAE,CAAC;gBACrD,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,eAAe,IAAI,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ;oBACjE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAW,CAAC,CAAC;gBAClC,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;oBACvC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;wBAC1B,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,CAA8B,EAAE,CAAC;4BACtD,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,eAAe,IAAI,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,QAAQ;gCACrE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAW,CAAC,CAAC;wBACtC,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5B,CAAC;CACF"}