@adatechnology/game-vehicles-three 0.3.0 → 0.3.2

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.
@@ -41,6 +41,84 @@ var GameVehiclesThree = (() => {
41
41
  loadVehiclesTestModule: () => loadVehiclesTestModule
42
42
  });
43
43
 
44
+ // ../game-contracts/dist/index.js
45
+ var DEFAULT_IGNITION_RULES = {
46
+ fillCurve: [
47
+ [0, 0.6],
48
+ [0.1, 1],
49
+ [0.35, 0.6],
50
+ [0.65, 0.3],
51
+ [0.9, 0.15],
52
+ [1, 0.12]
53
+ ],
54
+ flameFillInfluence: 0.5,
55
+ flameDefaults: { incendiary: 0.7, tracer: 0.2 },
56
+ sparkTarget: { steel: 1, iron: 1, aluminium: 0.25 },
57
+ sparkMetalDefault: 0.5,
58
+ sparkFluid: { diesel: 0.15 },
59
+ fireNear: { radius: 1.5, chancePerSecond: 0.5 }
60
+ };
61
+ var resolveIgnitionRules = (rules) => ({
62
+ ...DEFAULT_IGNITION_RULES,
63
+ ...rules,
64
+ flameDefaults: { ...DEFAULT_IGNITION_RULES.flameDefaults, ...rules?.flameDefaults },
65
+ sparkTarget: { ...DEFAULT_IGNITION_RULES.sparkTarget, ...rules?.sparkTarget },
66
+ sparkFluid: { ...DEFAULT_IGNITION_RULES.sparkFluid, ...rules?.sparkFluid },
67
+ fireNear: { ...DEFAULT_IGNITION_RULES.fireNear, ...rules?.fireNear }
68
+ });
69
+ var fillFactor = (fill2, curve = DEFAULT_IGNITION_RULES.fillCurve) => {
70
+ if (curve.length === 0) return 1;
71
+ const f = Math.min(1, Math.max(0, fill2));
72
+ if (f <= curve[0][0]) return curve[0][1];
73
+ for (let i = 1; i < curve.length; i++) {
74
+ const [x1, y1] = curve[i];
75
+ const [x0, y0] = curve[i - 1];
76
+ if (f <= x1) return x1 === x0 ? y1 : y0 + (y1 - y0) * (f - x0) / (x1 - x0);
77
+ }
78
+ return curve[curve.length - 1][1];
79
+ };
80
+ var sparkTargetFactor = (materialId, metal, rules = DEFAULT_IGNITION_RULES) => !metal ? 0 : rules.sparkTarget[materialId] ?? rules.sparkMetalDefault;
81
+ var ignitionChance = (hit, target, rules = DEFAULT_IGNITION_RULES) => {
82
+ const k = fillFactor(target.fill, rules.fillCurve);
83
+ const spark = (hit.ignition?.spark ?? 0) * target.sparkTarget * (target.fluid === void 0 ? 1 : rules.sparkFluid[target.fluid] ?? 1) * k;
84
+ const flameBase = hit.ignition?.flame ?? Math.max(hit.incendiary ? rules.flameDefaults.incendiary : 0, hit.tracer ? rules.flameDefaults.tracer : 0);
85
+ const flame = flameBase * (1 - rules.flameFillInfluence * (1 - k));
86
+ return 1 - (1 - Math.min(1, Math.max(0, spark))) * (1 - Math.min(1, Math.max(0, flame)));
87
+ };
88
+ var UNSAFE_KEYS = /* @__PURE__ */ new Set(["__proto__", "constructor", "prototype"]);
89
+ var isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value) && Object.getPrototypeOf(value) === Object.prototype;
90
+ var deepMerge = (base, patch) => {
91
+ if (!patch) return base;
92
+ const result = { ...base };
93
+ for (const [key, value] of Object.entries(patch)) {
94
+ if (value === void 0 || UNSAFE_KEYS.has(key)) continue;
95
+ const current = result[key];
96
+ result[key] = isPlainObject(current) && isPlainObject(value) ? deepMerge(current, value) : value;
97
+ }
98
+ return result;
99
+ };
100
+ var mergeById = (shipped, extra) => {
101
+ const entries = /* @__PURE__ */ new Map();
102
+ for (const entry of [...shipped, ...extra ?? []]) entries.set(entry.id, entry);
103
+ return entries;
104
+ };
105
+ var applyPatches = (entries, patches) => {
106
+ for (const [id, patch] of Object.entries(patches ?? {})) {
107
+ const entry = entries.get(id);
108
+ if (entry) entries.set(id, deepMerge(entry, patch));
109
+ }
110
+ };
111
+ var removeIds = (entries, ids) => {
112
+ for (const id of ids ?? []) entries.delete(id);
113
+ };
114
+ var KIT_ORIGIN_KEY = "kitOrigin";
115
+ function markKitOrigin(object2, origin) {
116
+ const node = object2;
117
+ node.userData = node.userData ?? {};
118
+ node.userData[KIT_ORIGIN_KEY] = { ...origin };
119
+ return object2;
120
+ }
121
+
44
122
  // ../game-vehicles-fleet/dist/index.js
45
123
  var military = [
46
124
  "light_4x4",
@@ -27826,6 +27904,7 @@ var GameVehiclesThree = (() => {
27826
27904
  const pivotMatrix = new THREE.Matrix4().makeTranslation(-cx, -bounds.min.y, -cz).multiply(rotation);
27827
27905
  const group = new THREE.Group();
27828
27906
  group.name = `vehicle:${key}`;
27907
+ markKitOrigin(group, { owner: "game-vehicles-three", kind: "vehicle", id: key });
27829
27908
  const damageables = kit.damageables(c, pivotMatrix);
27830
27909
  let pruned = 0;
27831
27910
  if (quality === "high") {
@@ -29413,77 +29492,6 @@ var GameVehiclesThree = (() => {
29413
29492
  return result;
29414
29493
  }
29415
29494
 
29416
- // ../game-contracts/dist/index.js
29417
- var DEFAULT_IGNITION_RULES = {
29418
- fillCurve: [
29419
- [0, 0.6],
29420
- [0.1, 1],
29421
- [0.35, 0.6],
29422
- [0.65, 0.3],
29423
- [0.9, 0.15],
29424
- [1, 0.12]
29425
- ],
29426
- flameFillInfluence: 0.5,
29427
- flameDefaults: { incendiary: 0.7, tracer: 0.2 },
29428
- sparkTarget: { steel: 1, iron: 1, aluminium: 0.25 },
29429
- sparkMetalDefault: 0.5,
29430
- sparkFluid: { diesel: 0.15 },
29431
- fireNear: { radius: 1.5, chancePerSecond: 0.5 }
29432
- };
29433
- var resolveIgnitionRules = (rules) => ({
29434
- ...DEFAULT_IGNITION_RULES,
29435
- ...rules,
29436
- flameDefaults: { ...DEFAULT_IGNITION_RULES.flameDefaults, ...rules?.flameDefaults },
29437
- sparkTarget: { ...DEFAULT_IGNITION_RULES.sparkTarget, ...rules?.sparkTarget },
29438
- sparkFluid: { ...DEFAULT_IGNITION_RULES.sparkFluid, ...rules?.sparkFluid },
29439
- fireNear: { ...DEFAULT_IGNITION_RULES.fireNear, ...rules?.fireNear }
29440
- });
29441
- var fillFactor = (fill2, curve = DEFAULT_IGNITION_RULES.fillCurve) => {
29442
- if (curve.length === 0) return 1;
29443
- const f = Math.min(1, Math.max(0, fill2));
29444
- if (f <= curve[0][0]) return curve[0][1];
29445
- for (let i = 1; i < curve.length; i++) {
29446
- const [x1, y1] = curve[i];
29447
- const [x0, y0] = curve[i - 1];
29448
- if (f <= x1) return x1 === x0 ? y1 : y0 + (y1 - y0) * (f - x0) / (x1 - x0);
29449
- }
29450
- return curve[curve.length - 1][1];
29451
- };
29452
- var sparkTargetFactor = (materialId, metal, rules = DEFAULT_IGNITION_RULES) => !metal ? 0 : rules.sparkTarget[materialId] ?? rules.sparkMetalDefault;
29453
- var ignitionChance = (hit, target, rules = DEFAULT_IGNITION_RULES) => {
29454
- const k = fillFactor(target.fill, rules.fillCurve);
29455
- const spark = (hit.ignition?.spark ?? 0) * target.sparkTarget * (target.fluid === void 0 ? 1 : rules.sparkFluid[target.fluid] ?? 1) * k;
29456
- const flameBase = hit.ignition?.flame ?? Math.max(hit.incendiary ? rules.flameDefaults.incendiary : 0, hit.tracer ? rules.flameDefaults.tracer : 0);
29457
- const flame = flameBase * (1 - rules.flameFillInfluence * (1 - k));
29458
- return 1 - (1 - Math.min(1, Math.max(0, spark))) * (1 - Math.min(1, Math.max(0, flame)));
29459
- };
29460
- var UNSAFE_KEYS = /* @__PURE__ */ new Set(["__proto__", "constructor", "prototype"]);
29461
- var isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value) && Object.getPrototypeOf(value) === Object.prototype;
29462
- var deepMerge = (base, patch) => {
29463
- if (!patch) return base;
29464
- const result = { ...base };
29465
- for (const [key, value] of Object.entries(patch)) {
29466
- if (value === void 0 || UNSAFE_KEYS.has(key)) continue;
29467
- const current = result[key];
29468
- result[key] = isPlainObject(current) && isPlainObject(value) ? deepMerge(current, value) : value;
29469
- }
29470
- return result;
29471
- };
29472
- var mergeById = (shipped, extra) => {
29473
- const entries = /* @__PURE__ */ new Map();
29474
- for (const entry of [...shipped, ...extra ?? []]) entries.set(entry.id, entry);
29475
- return entries;
29476
- };
29477
- var applyPatches = (entries, patches) => {
29478
- for (const [id, patch] of Object.entries(patches ?? {})) {
29479
- const entry = entries.get(id);
29480
- if (entry) entries.set(id, deepMerge(entry, patch));
29481
- }
29482
- };
29483
- var removeIds = (entries, ids) => {
29484
- for (const id of ids ?? []) entries.delete(id);
29485
- };
29486
-
29487
29495
  // ../game-vehicles/dist/index.js
29488
29496
  var __defProp2 = Object.defineProperty;
29489
29497
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
@@ -30879,6 +30887,7 @@ var GameVehiclesThree = (() => {
30879
30887
  this.effects = new THREE.Group();
30880
30888
  this.root.add(this.vehicle);
30881
30889
  this.root.add(this.effects);
30890
+ markKitOrigin(this.root, { owner: "game-vehicles", kind: "vehicle" });
30882
30891
  this.state = state;
30883
30892
  this.glass = [];
30884
30893
  this.quads = [];
@@ -42829,6 +42838,7 @@ var GameVehiclesThree = (() => {
42829
42838
  var LANE = { z: 11, from: -12, wall: 13 };
42830
42839
  var MATERIAL_COLOURS = { metal: 13421772, glass: 4500223, rubber: 16750848, fuel: 16724736 };
42831
42840
  var ZONE_COLOURS = { door: 5627221, hood: 14540083, lid: 14522675, bumper: 14505437, glass: 4500223, light: 16777215, wheel: 16742195 };
42841
+ var BODY_HEIGHT = 1.7;
42832
42842
  function createVehiclesTestModule(options = {}) {
42833
42843
  const locale = options.locale ?? "pt-BR";
42834
42844
  const text = TEXT[locale] ?? TEXT["pt-BR"];
@@ -42960,6 +42970,7 @@ var GameVehiclesThree = (() => {
42960
42970
  entry.root.updateMatrixWorld(true);
42961
42971
  const inverse = new three.Matrix4().copy(entry.root.matrixWorld).invert();
42962
42972
  const bounds = new three.Box3();
42973
+ const low = new three.Box3();
42963
42974
  const piece = new three.Box3();
42964
42975
  const matrix = new three.Matrix4();
42965
42976
  entry.root.traverse((mesh2) => {
@@ -42969,9 +42980,11 @@ var GameVehiclesThree = (() => {
42969
42980
  mesh2.geometry.computeBoundingBox();
42970
42981
  piece.copy(mesh2.geometry.boundingBox).applyMatrix4(matrix.multiplyMatrices(inverse, mesh2.matrixWorld));
42971
42982
  bounds.union(piece);
42983
+ if (piece.min.y < BODY_HEIGHT) low.union(piece);
42972
42984
  });
42973
42985
  const size = bounds.getSize(new three.Vector3());
42974
42986
  entry.size = { length: size.z, width: size.x, height: size.y };
42987
+ if (!low.isEmpty()) entry.footprint = { minX: low.min.x, maxX: low.max.x, minZ: low.min.z, maxZ: low.max.z };
42975
42988
  return entry.size;
42976
42989
  };
42977
42990
  const clearHelpers = () => {
@@ -43021,6 +43034,23 @@ var GameVehiclesThree = (() => {
43021
43034
  }
43022
43035
  helpersShown = boxKey();
43023
43036
  };
43037
+ const local = { m: null, v: null };
43038
+ const inside = (root, fp, x, z, radius) => {
43039
+ if (!three) return false;
43040
+ local.m ?? (local.m = new three.Matrix4());
43041
+ local.v ?? (local.v = new three.Vector3());
43042
+ root.updateWorldMatrix(true, false);
43043
+ const p = local.v.set(x, 0, z).applyMatrix4(local.m.copy(root.matrixWorld).invert());
43044
+ return p.x > fp.minX - radius && p.x < fp.maxX + radius && p.z > fp.minZ - radius && p.z < fp.maxZ + radius;
43045
+ };
43046
+ const blocked = (x, z, radius) => {
43047
+ for (const entry of placed.values()) if (entry.root.parent && entry.footprint && inside(entry.root, entry.footprint, x, z, radius)) return true;
43048
+ if (lane) {
43049
+ const half = { l: lane.car.length / 2, w: lane.car.width / 2 };
43050
+ if (inside(lane.group, { minX: -half.w, maxX: half.w, minZ: -half.l, maxZ: half.l }, x, z, radius)) return true;
43051
+ }
43052
+ return false;
43053
+ };
43024
43054
  const clearLane = () => {
43025
43055
  stopEngine();
43026
43056
  if (!lane) return;
@@ -43241,10 +43271,12 @@ var GameVehiclesThree = (() => {
43241
43271
  three = lent.THREE;
43242
43272
  const stopChange = lent.bench?.onChange(onChange);
43243
43273
  const stopFrame = lent.onFrame(frame);
43274
+ const stopBlocker = lent.addBlocker?.(blocked);
43244
43275
  lent.audio?.register?.(LIBRARY_BANK);
43245
43276
  return () => {
43246
43277
  stopChange?.();
43247
43278
  stopFrame();
43279
+ stopBlocker?.();
43248
43280
  clearHelpers();
43249
43281
  clearLane();
43250
43282
  host = null;