@starktma/minecraft-utils 1.3.111 → 1.5.0

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 (68) hide show
  1. package/README.md +56 -0
  2. package/dist/constants.d.ts +26 -0
  3. package/dist/constants.d.ts.map +1 -0
  4. package/dist/constants.js +34 -0
  5. package/dist/constants.js.map +1 -0
  6. package/dist/database/database.d.ts +8 -5
  7. package/dist/database/database.d.ts.map +1 -1
  8. package/dist/database/database.js +40 -38
  9. package/dist/database/database.js.map +1 -1
  10. package/dist/database/index.d.ts +1 -3
  11. package/dist/database/index.d.ts.map +1 -1
  12. package/dist/database/index.js +1 -2
  13. package/dist/database/index.js.map +1 -1
  14. package/dist/game-state-machine/branch.js +2 -2
  15. package/dist/game-state-machine/branch.js.map +1 -1
  16. package/dist/game-state-machine/database.d.ts +10 -3
  17. package/dist/game-state-machine/database.d.ts.map +1 -1
  18. package/dist/game-state-machine/database.js +20 -2
  19. package/dist/game-state-machine/database.js.map +1 -1
  20. package/dist/game-state-machine/index.d.ts +1 -2
  21. package/dist/game-state-machine/index.d.ts.map +1 -1
  22. package/dist/game-state-machine/index.js +1 -2
  23. package/dist/game-state-machine/index.js.map +1 -1
  24. package/dist/game-state-machine/stateMachine.d.ts +6 -9
  25. package/dist/game-state-machine/stateMachine.d.ts.map +1 -1
  26. package/dist/game-state-machine/stateMachine.js +72 -86
  27. package/dist/game-state-machine/stateMachine.js.map +1 -1
  28. package/dist/index.d.ts +1 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +2 -1
  31. package/dist/index.js.map +1 -1
  32. package/dist/math/BFSScanner.d.ts +117 -0
  33. package/dist/math/BFSScanner.d.ts.map +1 -0
  34. package/dist/math/BFSScanner.js +388 -0
  35. package/dist/math/BFSScanner.js.map +1 -0
  36. package/dist/math/Perlin2D.d.ts +12 -0
  37. package/dist/math/Perlin2D.d.ts.map +1 -0
  38. package/dist/math/Perlin2D.js +115 -0
  39. package/dist/math/Perlin2D.js.map +1 -0
  40. package/dist/math/index.d.ts +63 -59
  41. package/dist/math/index.d.ts.map +1 -1
  42. package/dist/math/index.js +150 -76
  43. package/dist/math/index.js.map +1 -1
  44. package/dist/minecraft/effectsAPI.d.ts +69 -0
  45. package/dist/minecraft/effectsAPI.d.ts.map +1 -0
  46. package/dist/minecraft/effectsAPI.js +441 -0
  47. package/dist/minecraft/effectsAPI.js.map +1 -0
  48. package/dist/minecraft/index.d.ts +7 -3
  49. package/dist/minecraft/index.d.ts.map +1 -1
  50. package/dist/minecraft/index.js +53 -29
  51. package/dist/minecraft/index.js.map +1 -1
  52. package/dist/minecraft/projectileAPI.d.ts +23 -0
  53. package/dist/minecraft/projectileAPI.d.ts.map +1 -0
  54. package/dist/minecraft/projectileAPI.js +148 -0
  55. package/dist/minecraft/projectileAPI.js.map +1 -0
  56. package/dist/minecraft/structuresAPI.d.ts +11 -0
  57. package/dist/minecraft/structuresAPI.d.ts.map +1 -0
  58. package/dist/minecraft/structuresAPI.js +66 -0
  59. package/dist/minecraft/structuresAPI.js.map +1 -0
  60. package/package.json +7 -3
  61. package/dist/database/constants.d.ts +0 -2
  62. package/dist/database/constants.d.ts.map +0 -1
  63. package/dist/database/constants.js +0 -2
  64. package/dist/database/constants.js.map +0 -1
  65. package/dist/game-state-machine/constants.d.ts +0 -2
  66. package/dist/game-state-machine/constants.d.ts.map +0 -1
  67. package/dist/game-state-machine/constants.js +0 -2
  68. package/dist/game-state-machine/constants.js.map +0 -1
@@ -0,0 +1,441 @@
1
+ import { EntityItemComponent, MolangVariableMap, system, world, } from "@minecraft/server";
2
+ import { MinecraftItemTypes } from "@minecraft/vanilla-data";
3
+ import { getNamespace } from "../constants";
4
+ import { SimpleDatabase } from "../database";
5
+ class EffectDatabase extends SimpleDatabase {
6
+ constructor(entity) {
7
+ super("effects", entity);
8
+ }
9
+ }
10
+ // ============================= EffectManager =================================
11
+ class EffectManager {
12
+ static instance;
13
+ effectConfigs = new Map();
14
+ potionConfigs = new Map();
15
+ areaEffectClouds = new Map();
16
+ cloudIdCounter = 0;
17
+ trackedEntities = new Map();
18
+ // Entity databases: entityId -> EffectDatabase
19
+ entityDatabases = new Map();
20
+ static getInstance() {
21
+ if (!EffectManager.instance) {
22
+ EffectManager.instance = new EffectManager();
23
+ }
24
+ return EffectManager.instance;
25
+ }
26
+ constructor() { }
27
+ // ============================= Database Helpers ==========================
28
+ // Get or create database for an entity
29
+ getEntityDatabase(entity) {
30
+ let db = this.entityDatabases.get(entity.id);
31
+ if (!db) {
32
+ db = new EffectDatabase(entity);
33
+ this.entityDatabases.set(entity.id, db);
34
+ }
35
+ return db;
36
+ }
37
+ getEffect(entity, effectType) {
38
+ const db = this.getEntityDatabase(entity);
39
+ return db.getObject(effectType) || null;
40
+ }
41
+ getAllEffects(entity) {
42
+ const db = this.getEntityDatabase(entity);
43
+ return db.getAllObjects();
44
+ }
45
+ // Check if entity has any active effects and should be tracked
46
+ hasActiveEffects(entity) {
47
+ const db = this.getEntityDatabase(entity);
48
+ return db.getAllObjects().length > 0;
49
+ }
50
+ debug() {
51
+ for (const player of world.getAllPlayers()) {
52
+ const effects = this.getAllEffects(player);
53
+ if (effects.length === 0) {
54
+ player.onScreenDisplay.setActionBar("§8[§7Effects§8] §7No active effects");
55
+ continue;
56
+ }
57
+ const effectMap = new Map();
58
+ for (const effect of effects) {
59
+ const existing = effectMap.get(effect.effectType);
60
+ if (!existing || effect.duration > existing.duration) {
61
+ effectMap.set(effect.effectType, effect);
62
+ }
63
+ }
64
+ const sorted = Array.from(effectMap.values()).sort((a, b) => b.duration - a.duration);
65
+ const display = sorted.map((effect) => {
66
+ const seconds = Math.ceil(effect.duration / 20);
67
+ const minutes = Math.floor(seconds / 60);
68
+ const remainingSeconds = seconds % 60;
69
+ const timeString = seconds > 60
70
+ ? `§a${minutes}:${remainingSeconds.toString().padStart(2, "0")}`
71
+ : seconds > 10
72
+ ? `§e${seconds}s`
73
+ : `§c${seconds}s`;
74
+ const name = effect.effectType
75
+ .split("_")
76
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
77
+ .join(" ");
78
+ const amp = ["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X"][effect.amplifier] || effect.amplifier + 1;
79
+ return `§6${name}§r §7${amp}§r §8(${timeString}§8)§r`;
80
+ });
81
+ player.onScreenDisplay.setActionBar(`§8[§bActive Effects§8]§r\n${display.join("\n")}`);
82
+ }
83
+ }
84
+ // ============================= Effect API ================================
85
+ registerEffect(config) {
86
+ this.effectConfigs.set(config.effectType, config);
87
+ return {
88
+ addEffect: (entity, amplifier, durationTicks) => {
89
+ this.addEffect(entity, config.effectType, amplifier, durationTicks);
90
+ },
91
+ removeEffect: (entity) => {
92
+ this.removeEffect(entity, config.effectType);
93
+ },
94
+ applyEffect: config.handler,
95
+ };
96
+ }
97
+ addEffect(entity, effectType, amplifier, duration) {
98
+ const config = this.effectConfigs.get(effectType);
99
+ const db = this.getEntityDatabase(entity);
100
+ const existing = db.getObject(effectType);
101
+ // Determine which effect to keep (stronger one)
102
+ if (!existing ||
103
+ amplifier > existing.amplifier ||
104
+ (amplifier === existing.amplifier && duration > existing.duration)) {
105
+ const effect = {
106
+ id: effectType,
107
+ namespace: getNamespace(),
108
+ effectType,
109
+ amplifier,
110
+ duration,
111
+ color: config?.color || { red: 1, green: 1, blue: 1, alpha: 1 },
112
+ };
113
+ db.updateObject(effect);
114
+ // Play start sound only for new effects
115
+ if (!existing && config?.sounds?.start) {
116
+ try {
117
+ entity.dimension.playSound(config.sounds.start, entity.location);
118
+ }
119
+ catch { }
120
+ }
121
+ }
122
+ // Track entity for effect updates
123
+ this.trackedEntities.set(entity.id, entity);
124
+ }
125
+ removeEffect(entity, effectType) {
126
+ const db = this.getEntityDatabase(entity);
127
+ const hasEffect = db.hasObject(effectType);
128
+ const config = this.effectConfigs.get(effectType);
129
+ // Remove from database
130
+ db.removeObject(effectType);
131
+ // Play end sound only if effect existed
132
+ if (hasEffect && config?.sounds?.end) {
133
+ try {
134
+ entity.dimension.playSound(config.sounds.end, entity.location);
135
+ }
136
+ catch { }
137
+ }
138
+ // Untrack entity if no effects remain
139
+ if (!this.hasActiveEffects(entity)) {
140
+ this.entityDatabases.delete(entity.id);
141
+ this.trackedEntities.delete(entity.id);
142
+ }
143
+ }
144
+ removeAllEffects(entity) {
145
+ const db = this.getEntityDatabase(entity);
146
+ const effects = db.getAllObjects();
147
+ entity
148
+ .getTags()
149
+ .filter((tag) => tag.startsWith("starkeffects|pause_effect"))
150
+ .forEach((tag) => entity.removeTag(tag));
151
+ // Play end sounds for each effect
152
+ for (const effect of effects) {
153
+ const config = this.effectConfigs.get(effect.effectType);
154
+ if (config?.sounds?.end) {
155
+ try {
156
+ entity.dimension.playSound(config.sounds.end, entity.location);
157
+ }
158
+ catch { }
159
+ }
160
+ }
161
+ // Clear database and untrack
162
+ db.eraseAllObjects();
163
+ this.entityDatabases.delete(entity.id);
164
+ this.trackedEntities.delete(entity.id);
165
+ }
166
+ hasEffect(entity, effectType) {
167
+ const db = this.getEntityDatabase(entity);
168
+ return db.hasObject(effectType);
169
+ }
170
+ getEffects(entity) {
171
+ const db = this.getEntityDatabase(entity);
172
+ return db.getAllObjects();
173
+ }
174
+ // ============================= Potion API ================================
175
+ registerPotion(config) {
176
+ const fullConfig = {
177
+ splashRange: 4,
178
+ lingeringMaxRadius: 3,
179
+ lingeringLifetime: 600,
180
+ lingeringDurationMultiplier: 0.25,
181
+ ...config,
182
+ };
183
+ this.potionConfigs.set(`${config.namespace}:${config.effectKey}`, fullConfig);
184
+ return { handler: config.handler };
185
+ }
186
+ // ============================= System ====================================
187
+ start(startup, debug) {
188
+ if (startup) {
189
+ for (const [, config] of this.potionConfigs.entries()) {
190
+ const componentId = `${config.namespace}:${config.effectKey}_potion_effect`;
191
+ startup.itemComponentRegistry.registerCustomComponent(componentId, {
192
+ onConsume: (event, params) => {
193
+ const p = params.params;
194
+ const color = {
195
+ red: p.potion_color[0],
196
+ green: p.potion_color[1],
197
+ blue: p.potion_color[2],
198
+ alpha: p.potion_color[3],
199
+ };
200
+ config.handler(event.source, p.amplifier, p.duration * 20, color);
201
+ },
202
+ });
203
+ }
204
+ world.afterEvents.projectileHitBlock.subscribe((event) => this.handleProjectileHit(event.projectile));
205
+ world.afterEvents.projectileHitEntity.subscribe((event) => this.handleProjectileHit(event.projectile));
206
+ }
207
+ system.runInterval(() => {
208
+ //if (debug) {
209
+ // this.debug();
210
+ //}
211
+ // Process effects on tracked entities only
212
+ for (const [entityId, entity] of this.trackedEntities.entries()) {
213
+ if (!entity.isValid) {
214
+ this.entityDatabases.delete(entityId);
215
+ this.trackedEntities.delete(entityId);
216
+ continue;
217
+ }
218
+ const allTags = entity.getTags();
219
+ const pauseEffects = allTags.filter((tag) => tag.startsWith(`starkeffects|pause_effect`));
220
+ const db = this.getEntityDatabase(entity);
221
+ const effects = db.getAllObjects();
222
+ if (effects.length === 0) {
223
+ this.entityDatabases.delete(entityId);
224
+ this.trackedEntities.delete(entityId);
225
+ continue;
226
+ }
227
+ // Store original durations to detect handler modifications
228
+ const originalDurations = new Map();
229
+ for (const effect of effects) {
230
+ originalDurations.set(effect.effectType, effect.duration);
231
+ }
232
+ // Apply handlers and update effects
233
+ for (const effect of effects) {
234
+ const config = this.effectConfigs.get(effect.effectType);
235
+ // Run effect handler
236
+ if (config?.handler) {
237
+ config.handler(entity, effect);
238
+ }
239
+ // Get current effect from database (handler may have modified it)
240
+ const currentEffect = db.getObject(effect.effectType);
241
+ if (!currentEffect)
242
+ continue;
243
+ // Check if handler modified the duration
244
+ const originalDuration = originalDurations.get(effect.effectType);
245
+ if (currentEffect.duration !== originalDuration) {
246
+ // Handler modified it, skip countdown
247
+ continue;
248
+ }
249
+ // Play ambient sounds
250
+ if (config?.sounds?.ambient && system.currentTick % 40 === 0) {
251
+ try {
252
+ entity.dimension.playSound(config.sounds.ambient, entity.location, { volume: 0.5 });
253
+ }
254
+ catch { }
255
+ }
256
+ // Spawn particles
257
+ if (system.currentTick % 20 === 0) {
258
+ const loc = { ...entity.location, y: entity.location.y + 1 };
259
+ const variables = new MolangVariableMap();
260
+ variables.setColorRGBA("color", currentEffect.color);
261
+ try {
262
+ entity.dimension.spawnParticle(config?.particleType || "minecraft:mobspell_emitter", loc, variables);
263
+ }
264
+ catch { }
265
+ }
266
+ if (pauseEffects.length > 0) {
267
+ const excludeEffects = pauseEffects.map((tag) => tag.split("|")[2]);
268
+ if (!excludeEffects.includes(effect.effectType))
269
+ continue;
270
+ }
271
+ // Countdown duration
272
+ const newDuration = currentEffect.duration - 1;
273
+ if (newDuration > 0) {
274
+ db.updateObject({ ...currentEffect, duration: newDuration });
275
+ }
276
+ else {
277
+ db.removeObject(effect.effectType);
278
+ if (config?.sounds?.end) {
279
+ try {
280
+ entity.dimension.playSound(config.sounds.end, entity.location);
281
+ }
282
+ catch { }
283
+ }
284
+ }
285
+ }
286
+ // Untrack if no effects remain
287
+ if (!this.hasActiveEffects(entity)) {
288
+ this.entityDatabases.delete(entityId);
289
+ this.trackedEntities.delete(entityId);
290
+ }
291
+ }
292
+ for (const cloud of this.areaEffectClouds.values()) {
293
+ this.updateCloud(cloud);
294
+ }
295
+ }, 1);
296
+ // Track entities that spawn with active effects
297
+ world.afterEvents.entitySpawn.subscribe((event) => {
298
+ if (!event.entity || !event.entity.isValid)
299
+ return;
300
+ if (event.entity.hasComponent(EntityItemComponent.componentId))
301
+ return;
302
+ if (this.hasActiveEffects(event.entity)) {
303
+ this.trackedEntities.set(event.entity.id, event.entity);
304
+ }
305
+ });
306
+ world.afterEvents.playerJoin.subscribe((event) => {
307
+ const player = world.getEntity(event.playerId);
308
+ if (this.hasActiveEffects(player)) {
309
+ this.trackedEntities.set(player.id, player);
310
+ }
311
+ });
312
+ // Clean up when entities die
313
+ world.afterEvents.entityDie.subscribe((event) => {
314
+ this.entityDatabases.delete(event.deadEntity.id);
315
+ this.trackedEntities.delete(event.deadEntity.id);
316
+ });
317
+ world.afterEvents.itemCompleteUse.subscribe((event) => {
318
+ if (event.itemStack.typeId === MinecraftItemTypes.MilkBucket) {
319
+ this.removeAllEffects(event.source);
320
+ }
321
+ });
322
+ world.afterEvents.worldLoad.subscribe(() => {
323
+ world.getAllPlayers().forEach((player) => {
324
+ if (this.hasActiveEffects(player)) {
325
+ this.trackedEntities.set(player.id, player);
326
+ }
327
+ });
328
+ });
329
+ }
330
+ // ============================= Potion Projectiles ========================
331
+ handleProjectileHit(projectile) {
332
+ const configs = Array.from(this.potionConfigs.values());
333
+ for (const config of configs) {
334
+ if (projectile.typeId !== `${config.namespace}:potion_projectile`)
335
+ continue;
336
+ const effectId = projectile.getProperty(`${config.namespace}:effect_id`);
337
+ if (effectId !== config.effectId)
338
+ continue;
339
+ const potionType = projectile.getProperty(`${config.namespace}:type`);
340
+ if (potionType === 1) {
341
+ this.handleSplash(projectile, config);
342
+ }
343
+ else if (potionType === 2) {
344
+ this.handleLingering(projectile, config);
345
+ }
346
+ else {
347
+ projectile.remove();
348
+ }
349
+ return;
350
+ }
351
+ }
352
+ handleSplash(projectile, config) {
353
+ const location = { ...projectile.location, y: projectile.location.y + 0.1 };
354
+ const color = this.getColorFromEntity(projectile, config.namespace);
355
+ const amplifier = projectile.getProperty(`${config.namespace}:amplifier`);
356
+ const duration = projectile.getProperty(`${config.namespace}:duration`) * 20;
357
+ const variables = new MolangVariableMap();
358
+ variables.setFloat("splash_range", config.splashRange);
359
+ variables.setFloat("splash_power", 1);
360
+ variables.setColorRGBA("color", color);
361
+ projectile.dimension.spawnParticle("minecraft:splash_spell_emitter", location, variables);
362
+ const nearbyEntities = projectile.dimension.getEntities({
363
+ excludeTypes: ["minecraft:item", "minecraft:arrow"],
364
+ location: projectile.location,
365
+ maxDistance: config.splashRange,
366
+ });
367
+ for (const entity of nearbyEntities) {
368
+ if (entity.id !== projectile.id) {
369
+ config.handler(entity, amplifier, duration, color);
370
+ }
371
+ }
372
+ projectile.remove();
373
+ }
374
+ handleLingering(projectile, config) {
375
+ const location = { ...projectile.location, y: projectile.location.y + 0.1 };
376
+ const color = this.getColorFromEntity(projectile, config.namespace);
377
+ const amplifier = projectile.getProperty(`${config.namespace}:amplifier`);
378
+ const duration = projectile.getProperty(`${config.namespace}:duration`) * 20;
379
+ const cloud = {
380
+ id: `aoe_cloud_${this.cloudIdCounter++}`,
381
+ dimension: projectile.dimension.id,
382
+ location,
383
+ color,
384
+ amplifier,
385
+ duration,
386
+ currentRadius: config.lingeringMaxRadius,
387
+ maxRadius: config.lingeringMaxRadius,
388
+ createdTick: system.currentTick,
389
+ maxLifetime: config.lingeringLifetime,
390
+ affectedEntities: new Set(),
391
+ handler: config.handler,
392
+ };
393
+ this.areaEffectClouds.set(cloud.id, cloud);
394
+ projectile.remove();
395
+ }
396
+ updateCloud(cloud) {
397
+ const dimension = world.getDimension(cloud.dimension);
398
+ const age = system.currentTick - cloud.createdTick;
399
+ const ageProgress = Math.min(age / cloud.maxLifetime, 1);
400
+ cloud.currentRadius = Math.max(0, cloud.maxRadius * (1 - ageProgress));
401
+ if (age >= cloud.maxLifetime || cloud.currentRadius <= 0) {
402
+ this.areaEffectClouds.delete(cloud.id);
403
+ return;
404
+ }
405
+ const variables = new MolangVariableMap();
406
+ variables.setFloat("cloud_lifetime", cloud.maxLifetime / 20);
407
+ variables.setFloat("cloud_radius", cloud.currentRadius);
408
+ variables.setFloat("particle_multiplier", cloud.currentRadius / cloud.maxRadius);
409
+ variables.setColorRGBA("color", cloud.color);
410
+ dimension.spawnParticle("minecraft:mobspell_lingering", cloud.location, variables);
411
+ if (age < 20)
412
+ return;
413
+ const nearbyEntities = dimension.getEntities({
414
+ location: cloud.location,
415
+ maxDistance: cloud.currentRadius + 1,
416
+ excludeTypes: ["minecraft:item", "minecraft:arrow", "minecraft:xp_orb"],
417
+ });
418
+ for (const entity of nearbyEntities) {
419
+ if (cloud.affectedEntities.has(entity.id))
420
+ continue;
421
+ cloud.handler(entity, cloud.amplifier, Math.floor(cloud.duration), cloud.color);
422
+ cloud.currentRadius = Math.max(0, cloud.currentRadius - 0.5);
423
+ cloud.maxLifetime = Math.max(0, cloud.maxLifetime - 100);
424
+ cloud.affectedEntities.add(entity.id);
425
+ system.runTimeout(() => {
426
+ cloud.affectedEntities.delete(entity.id);
427
+ }, 60);
428
+ }
429
+ }
430
+ getColorFromEntity(entity, namespace) {
431
+ return {
432
+ red: entity.getProperty(`${namespace}:color_r`),
433
+ green: entity.getProperty(`${namespace}:color_g`),
434
+ blue: entity.getProperty(`${namespace}:color_b`),
435
+ alpha: entity.getProperty(`${namespace}:color_a`),
436
+ };
437
+ }
438
+ }
439
+ const effectManager = EffectManager.getInstance();
440
+ export { EffectManager, effectManager };
441
+ //# sourceMappingURL=effectsAPI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effectsAPI.js","sourceRoot":"","sources":["../../src/minecraft/effectsAPI.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,9 @@
1
- import { Player, Entity, Block, Vector3, StructureRotation, Vector2 } from "@minecraft/server";
1
+ import { Player, Entity, Block, Vector3, Vector2, Dimension } from "@minecraft/server";
2
+ import { EffectManager, effectManager, EffectObject, EffectConfig, PotionConfig } from "./effectsAPI";
3
+ import { ProjectileManager, projectileManager } from "./projectileAPI";
4
+ import { StructuresManager } from "./structuresAPI";
2
5
  export declare function getBlocksInASphere(centerBlock: Block | Entity, radius: number, innerRadius?: number): Block[];
6
+ export declare function getBlocksInRadius(dimension: Dimension, location: Vector3, radius: number): Block[];
3
7
  export declare function displayActionbar(player: Player | undefined, ...message: any): void;
4
8
  /**
5
9
  * Snaps an angle to the nearest grid size.
@@ -15,9 +19,9 @@ export declare function snapYawToGrid(angle: number): number;
15
19
  * @returns A new vector with each component rounded to the nearest integer.
16
20
  */
17
21
  export declare function snapLocationToGrid(location: Vector3, yaw: Vector2, gridSize?: number): Vector3;
18
- export declare function getStructureRotationEnum(angle: number, offset?: number): StructureRotation;
19
22
  export declare function getRelativeMovementDirection(player: Player, round: boolean): Vector3;
20
23
  export declare function restoreInventory(entity: Entity, id: string): void;
21
24
  export declare function saveInventory(entity: Entity, id: string, clearAll?: boolean): number;
22
- export declare function getPositionRelative(entity: Entity, offset: Vector3): Vector3;
25
+ export declare function getPositionRelative(entity: Entity, offset: Vector3, ignorePitch?: boolean): Vector3;
26
+ export { EffectManager, effectManager, EffectObject, EffectConfig, PotionConfig, ProjectileManager, projectileManager, StructuresManager, };
23
27
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/minecraft/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,MAAM,EACN,MAAM,EACN,KAAK,EACL,OAAO,EAEP,iBAAiB,EACjB,OAAO,EAOP,MAAM,mBAAmB,CAAC;AAG3B,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,KAAK,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,WA4BnG;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,OAAO,EAAE,GAAG,QAO3E;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKnD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,GAAE,MAAU,GAAG,OAAO,CAUjG;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAQ1F;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAapF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAwC1D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,GAAE,OAAe,GAAG,MAAM,CAuD3F;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAS5E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/minecraft/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,MAAM,EACN,MAAM,EACN,KAAK,EACL,OAAO,EAEP,OAAO,EAOP,SAAS,EAET,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACtG,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,KAAK,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,WA6BnG;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAgBxF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,OAAO,EAAE,GAAG,QAO3E;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKnD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,GAAE,MAAU,GAAG,OAAO,CAQjG;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAapF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QA2C1D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,GAAE,OAAe,GAAG,MAAM,CA2D3F;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,CAiBnG;AAED,OAAO,EACN,aAAa,EACb,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,GACjB,CAAC"}
@@ -1,5 +1,8 @@
1
- import { Block, world, StructureRotation, BlockInventoryComponent, BlockPermutation, EntityEquippableComponent, EntityInventoryComponent, EquipmentSlot, ItemStack, } from "@minecraft/server";
2
- import { calculateDistance, toRadians, toUnsigned } from "../math";
1
+ import { Block, world, BlockInventoryComponent, BlockPermutation, EntityEquippableComponent, EntityInventoryComponent, EquipmentSlot, ItemStack, StructureSaveMode, } from "@minecraft/server";
2
+ import { Trigonometry, Vector } from "../math";
3
+ import { EffectManager, effectManager } from "./effectsAPI";
4
+ import { ProjectileManager, projectileManager } from "./projectileAPI";
5
+ import { StructuresManager } from "./structuresAPI";
3
6
  export function getBlocksInASphere(centerBlock, radius, innerRadius) {
4
7
  if (centerBlock) {
5
8
  if (centerBlock instanceof Block && !centerBlock.isValid)
@@ -15,10 +18,11 @@ export function getBlocksInASphere(centerBlock, radius, innerRadius) {
15
18
  block.isValid &&
16
19
  !block.isAir &&
17
20
  !block.permutation.matches("minecraft:bedrock") &&
18
- !block.permutation.matches("minecraft:barrier") &&
19
- calculateDistance(center, block.location) <= radius &&
20
- (!innerRadius || calculateDistance(center, block.location) >= innerRadius)) {
21
- blocks.push(block);
21
+ !block.permutation.matches("minecraft:barrier")) {
22
+ const distance = Vector.magnitude(Vector.subtract(center, block.location));
23
+ if (distance <= radius && (!innerRadius || distance >= innerRadius)) {
24
+ blocks.push(block);
25
+ }
22
26
  }
23
27
  }
24
28
  catch (e) { }
@@ -29,6 +33,25 @@ export function getBlocksInASphere(centerBlock, radius, innerRadius) {
29
33
  }
30
34
  return [];
31
35
  }
36
+ export function getBlocksInRadius(dimension, location, radius) {
37
+ if (!dimension.isChunkLoaded(location))
38
+ return [];
39
+ let blocks = [];
40
+ for (let x = location.x - radius; x < location.x + radius; x++) {
41
+ for (let y = location.y - radius; y < location.y + radius; y++) {
42
+ for (let z = location.z - radius; z < location.z + radius; z++) {
43
+ try {
44
+ let block = dimension.getBlock({ x: x, y: y, z: z });
45
+ if (block && block.isValid && !block.isAir) {
46
+ blocks.push(block);
47
+ }
48
+ }
49
+ catch (e) { }
50
+ }
51
+ }
52
+ }
53
+ return blocks;
54
+ }
32
55
  export function displayActionbar(player, ...message) {
33
56
  const text = message.join(" ");
34
57
  let target;
@@ -46,7 +69,7 @@ export function displayActionbar(player, ...message) {
46
69
  export function snapYawToGrid(angle) {
47
70
  const gridSize = 90;
48
71
  // Round to nearest grid step, then normalize into [0, 360)
49
- const snapped = Math.round(toUnsigned(angle) / gridSize) * gridSize;
72
+ const snapped = Math.round(Trigonometry.unsignedAngle(angle) / gridSize) * gridSize;
50
73
  return ((snapped % 360) + 360) % 360;
51
74
  }
52
75
  /**
@@ -57,27 +80,14 @@ export function snapYawToGrid(angle) {
57
80
  */
58
81
  export function snapLocationToGrid(location, yaw, gridSize = 1) {
59
82
  const snappedYaw = snapYawToGrid(yaw.y);
60
- const dx = Math.round(Math.sin(snappedYaw));
61
- const dz = Math.round(Math.cos(snappedYaw));
62
83
  return {
63
84
  x: Math.floor(location.x / gridSize) * gridSize,
64
85
  y: Math.floor(location.y / gridSize) * gridSize,
65
86
  z: Math.floor(location.z / gridSize) * gridSize,
66
87
  };
67
88
  }
68
- export function getStructureRotationEnum(angle, offset) {
69
- const diff = snapYawToGrid(toUnsigned(angle - (offset ?? 0)));
70
- console.log(diff);
71
- if (Math.abs(diff - 90) < Number.EPSILON)
72
- return StructureRotation.Rotate90;
73
- if (Math.abs(diff - 180) < Number.EPSILON)
74
- return StructureRotation.Rotate180;
75
- if (Math.abs(diff - 270) < Number.EPSILON)
76
- return StructureRotation.Rotate270;
77
- return StructureRotation.None;
78
- }
79
89
  export function getRelativeMovementDirection(player, round) {
80
- const playerYaw = toRadians(player.getRotation().y);
90
+ const playerYaw = Trigonometry.radians(player.getRotation().y);
81
91
  const { sin, cos } = { sin: Math.sin(playerYaw), cos: Math.cos(playerYaw) };
82
92
  const playerMovement = player.inputInfo.getMovementVector();
83
93
  const dx = -sin * playerMovement.y + cos * playerMovement.x;
@@ -93,7 +103,9 @@ export function restoreInventory(entity, id) {
93
103
  const blockLocation2 = { ...blockLocation, y: blockLocation.y + 1 };
94
104
  const savedStructure = world.structureManager.get(id);
95
105
  if (savedStructure)
96
- world.structureManager.place(savedStructure, entity.dimension, blockLocation);
106
+ world.structureManager.place(savedStructure, entity.dimension, blockLocation, {
107
+ waterlogged: false,
108
+ });
97
109
  world.structureManager.delete(id);
98
110
  const block = entity.dimension.getBlock(blockLocation);
99
111
  const block2 = entity.dimension.getBlock(blockLocation2);
@@ -130,6 +142,8 @@ export function saveInventory(entity, id, clearAll = false) {
130
142
  const blockLocation2 = { ...blockLocation, y: blockLocation.y + 1 };
131
143
  const block = entity.dimension.getBlock(blockLocation);
132
144
  const block2 = entity.dimension.getBlock(blockLocation2);
145
+ block.setPermutation(BlockPermutation.resolve("minecraft:air"));
146
+ block2.setPermutation(BlockPermutation.resolve("minecraft:air"));
133
147
  block.setPermutation(BlockPermutation.resolve("minecraft:chest"));
134
148
  block2.setPermutation(BlockPermutation.resolve("minecraft:chest"));
135
149
  const equipment = entity.getComponent(EntityEquippableComponent.componentId);
@@ -163,19 +177,29 @@ export function saveInventory(entity, id, clearAll = false) {
163
177
  }
164
178
  });
165
179
  world.structureManager.delete(id);
166
- world.structureManager.createFromWorld(id, entity.dimension, blockLocation, blockLocation2);
180
+ world.structureManager.createFromWorld(id, entity.dimension, blockLocation, blockLocation2, {
181
+ saveMode: StructureSaveMode.World,
182
+ });
167
183
  blockInventory.container.clearAll();
168
184
  blockInventory2.container.clearAll();
169
185
  block.setPermutation(BlockPermutation.resolve("minecraft:air"));
170
186
  block2.setPermutation(BlockPermutation.resolve("minecraft:air"));
171
187
  return itemCount;
172
188
  }
173
- export function getPositionRelative(entity, offset) {
174
- const yaw = toRadians(entity.getRotation().y);
175
- const pitch = toRadians(entity.getRotation().x);
176
- const x = entity.location.x + offset.x * Math.cos(pitch) * Math.cos(yaw) - offset.z * Math.sin(yaw);
177
- const y = entity.location.y + offset.x * Math.sin(pitch) + offset.y;
178
- const z = entity.location.z + offset.x * Math.cos(pitch) * Math.sin(yaw) + offset.z * Math.cos(yaw);
189
+ export function getPositionRelative(entity, offset, ignorePitch) {
190
+ const rotation = entity.getRotation();
191
+ const yaw = Trigonometry.radians(rotation.y);
192
+ const pitch = ignorePitch ? 0 : Trigonometry.radians(rotation.x);
193
+ // Apply 3D rotation: pitch around X-axis, then yaw around Y-axis
194
+ const cosPitch = Math.cos(pitch);
195
+ const sinPitch = Math.sin(pitch);
196
+ const cosYaw = Math.cos(yaw);
197
+ const sinYaw = Math.sin(yaw);
198
+ // Rotate offset vector by pitch and yaw
199
+ const x = entity.location.x + offset.x * cosPitch * cosYaw - offset.y * sinPitch * cosYaw - offset.z * sinYaw;
200
+ const y = entity.location.y - offset.z * sinPitch + offset.y * cosPitch;
201
+ const z = entity.location.z + offset.x * cosPitch * sinYaw - offset.y * sinPitch * sinYaw + offset.z * cosYaw;
179
202
  return { x, y, z };
180
203
  }
204
+ export { EffectManager, effectManager, ProjectileManager, projectileManager, StructuresManager, };
181
205
  //# sourceMappingURL=index.js.map