@adatechnology/game-weapons-three 0.4.0 → 0.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.
package/dist/index.js CHANGED
@@ -651,56 +651,8 @@ var createLaserRaycast = (THREE, scene, camera, options = {}) => {
651
651
  };
652
652
  };
653
653
 
654
- // src/merge-by-material.ts
655
- var ATTRIBUTES = ["position", "normal", "uv"];
656
- var isVisible = (object) => {
657
- for (let node = object; node; node = node.parent) if (!node.visible) return false;
658
- return true;
659
- };
660
- var bake = (THREE, mesh, matrix) => {
661
- const source = mesh.geometry.index ? mesh.geometry.toNonIndexed() : mesh.geometry.clone();
662
- const baked = new THREE.BufferGeometry();
663
- const count = source.getAttribute("position").count;
664
- for (const name of ATTRIBUTES) {
665
- const attribute = source.getAttribute(name);
666
- baked.setAttribute(name, attribute ?? new THREE.BufferAttribute(new Float32Array(count * (name === "uv" ? 2 : 3)), name === "uv" ? 2 : 3));
667
- }
668
- source.dispose();
669
- return baked.applyMatrix4(matrix);
670
- };
671
- var join = (THREE, geometries) => {
672
- const merged = new THREE.BufferGeometry();
673
- for (const name of ATTRIBUTES) {
674
- const size = (geometries[0]?.getAttribute(name)).itemSize;
675
- const total = geometries.reduce((sum, geometry) => sum + geometry.getAttribute(name).count, 0);
676
- const array = new Float32Array(total * size);
677
- let offset = 0;
678
- for (const geometry of geometries) {
679
- array.set(geometry.getAttribute(name).array, offset);
680
- offset += geometry.getAttribute(name).count * size;
681
- }
682
- merged.setAttribute(name, new THREE.BufferAttribute(array, size));
683
- }
684
- return merged;
685
- };
686
- function mergeByMaterial(THREE, root, space) {
687
- const toSpace = space.matrixWorld.clone().invert();
688
- const byMaterial = /* @__PURE__ */ new Map();
689
- root.traverse((object) => {
690
- const mesh = object;
691
- if (!mesh.isMesh || Array.isArray(mesh.material) || !isVisible(mesh)) return;
692
- const list = byMaterial.get(mesh.material) ?? [];
693
- list.push(bake(THREE, mesh, new THREE.Matrix4().multiplyMatrices(toSpace, mesh.matrixWorld)));
694
- byMaterial.set(mesh.material, list);
695
- });
696
- return [...byMaterial].map(([material, geometries]) => {
697
- const merged = new THREE.Mesh(join(THREE, geometries), material);
698
- for (const geometry of geometries) geometry.dispose();
699
- merged.castShadow = false;
700
- merged.receiveShadow = true;
701
- return merged;
702
- });
703
- }
654
+ // src/props.ts
655
+ import { mergeByMaterial } from "@adatechnology/game-props3d";
704
656
 
705
657
  // src/models/index.ts
706
658
  import { WEAPONS } from "@adatechnology/game-weapons";
@@ -5942,6 +5894,10 @@ var manifest_default = {
5942
5894
  source: "generated",
5943
5895
  file: "generated/carl_gustaf_m4.svg"
5944
5896
  },
5897
+ cast_iron_skillet: {
5898
+ source: "generated",
5899
+ file: "generated/cast_iron_skillet.svg"
5900
+ },
5945
5901
  cbc_122: {
5946
5902
  source: "generated",
5947
5903
  file: "generated/cbc_122.svg"
@@ -5954,6 +5910,10 @@ var manifest_default = {
5954
5910
  source: "generated",
5955
5911
  file: "generated/cbc_pump_military_3_0.svg"
5956
5912
  },
5913
+ chainsaw: {
5914
+ source: "generated",
5915
+ file: "generated/chainsaw.svg"
5916
+ },
5957
5917
  cheytac_m200: {
5958
5918
  source: "generated",
5959
5919
  file: "generated/cheytac_m200.svg"
@@ -6110,6 +6070,10 @@ var manifest_default = {
6110
6070
  source: "generated",
6111
6071
  file: "generated/hammer.svg"
6112
6072
  },
6073
+ hatchet: {
6074
+ source: "generated",
6075
+ file: "generated/hatchet.svg"
6076
+ },
6113
6077
  hk416: {
6114
6078
  source: "generated",
6115
6079
  file: "generated/hk416.svg"
@@ -6178,6 +6142,14 @@ var manifest_default = {
6178
6142
  source: "generated",
6179
6143
  file: "generated/improvised_flamethrower.svg"
6180
6144
  },
6145
+ improvised_spear: {
6146
+ source: "generated",
6147
+ file: "generated/improvised_spear.svg"
6148
+ },
6149
+ iron_pipe: {
6150
+ source: "generated",
6151
+ file: "generated/iron_pipe.svg"
6152
+ },
6181
6153
  kel_tec_ksg: {
6182
6154
  source: "generated",
6183
6155
  file: "generated/kel_tec_ksg.svg"
@@ -6246,6 +6218,10 @@ var manifest_default = {
6246
6218
  source: "generated",
6247
6219
  file: "generated/makarov_pm.svg"
6248
6220
  },
6221
+ meat_cleaver: {
6222
+ source: "generated",
6223
+ file: "generated/meat_cleaver.svg"
6224
+ },
6249
6225
  mg3: {
6250
6226
  source: "generated",
6251
6227
  file: "generated/mg3.svg"
@@ -6270,6 +6246,14 @@ var manifest_default = {
6270
6246
  source: "generated",
6271
6247
  file: "generated/mossberg_500_cruiser.svg"
6272
6248
  },
6249
+ nail_bat: {
6250
+ source: "generated",
6251
+ file: "generated/nail_bat.svg"
6252
+ },
6253
+ pickaxe: {
6254
+ source: "generated",
6255
+ file: "generated/pickaxe.svg"
6256
+ },
6273
6257
  pipe_bomb: {
6274
6258
  source: "generated",
6275
6259
  file: "generated/pipe_bomb.svg"
@@ -6290,6 +6274,10 @@ var manifest_default = {
6290
6274
  source: "generated",
6291
6275
  file: "generated/pkm.svg"
6292
6276
  },
6277
+ police_baton: {
6278
+ source: "generated",
6279
+ file: "generated/police_baton.svg"
6280
+ },
6293
6281
  pp19_bizon: {
6294
6282
  source: "generated",
6295
6283
  file: "generated/pp19_bizon.svg"
@@ -6302,6 +6290,10 @@ var manifest_default = {
6302
6290
  source: "generated",
6303
6291
  file: "generated/pry_bar.svg"
6304
6292
  },
6293
+ recurve_bow: {
6294
+ source: "generated",
6295
+ file: "generated/recurve_bow.svg"
6296
+ },
6305
6297
  remington_700: {
6306
6298
  source: "generated",
6307
6299
  file: "generated/remington_700.svg"
@@ -6378,6 +6370,10 @@ var manifest_default = {
6378
6370
  source: "generated",
6379
6371
  file: "generated/shotgun_semi_12.svg"
6380
6372
  },
6373
+ sickle: {
6374
+ source: "generated",
6375
+ file: "generated/sickle.svg"
6376
+ },
6381
6377
  sig_mpx: {
6382
6378
  source: "generated",
6383
6379
  file: "generated/sig_mpx.svg"
@@ -6430,6 +6426,10 @@ var manifest_default = {
6430
6426
  source: "generated",
6431
6427
  file: "generated/sw_model_29.svg"
6432
6428
  },
6429
+ tactical_knife: {
6430
+ source: "generated",
6431
+ file: "generated/tactical_knife.svg"
6432
+ },
6433
6433
  taurus_82: {
6434
6434
  source: "generated",
6435
6435
  file: "generated/taurus_82.svg"
@@ -6528,7 +6528,7 @@ var explosivePart = (def, shape) => ({
6528
6528
  shape: shape.shape,
6529
6529
  position: shape.position,
6530
6530
  ...SHELL,
6531
- explodes: { energy: def.energy, radius: def.injuryRadius, ...def.chain ? { chain: { ...def.chain } } : {} }
6531
+ explodes: { energy: def.energy, radius: def.injuryRadius, effect: def.id, ...def.chain ? { chain: { ...def.chain } } : {} }
6532
6532
  });
6533
6533
  var meshOf = (THREE, shape) => {
6534
6534
  const geometry = shape.shape.kind === "cylinder" ? new THREE.CylinderGeometry(shape.shape.radius, shape.shape.radius, shape.shape.height, 16) : shape.shape.kind === "box" ? new THREE.BoxGeometry(...shape.shape.size) : new THREE.SphereGeometry(0.2);
@@ -6556,6 +6556,51 @@ var worldExplosiveItem = (def, name) => {
6556
6556
  };
6557
6557
  };
6558
6558
 
6559
+ // src/data/world-effects.json
6560
+ var world_effects_default = {
6561
+ pistol: { muzzle: "muzzle_glock", casing: "casing_brass" },
6562
+ tiny: { muzzle: "muzzle_glock", casing: "casing_brass" },
6563
+ rifle: { muzzle: "muzzle_ak", casing: "casing_brass" },
6564
+ shell: { muzzle: "muzzle_r870", casing: "casing_shell" },
6565
+ big: { muzzle: "muzzle_barrett", casing: "casing_50" }
6566
+ };
6567
+
6568
+ // src/world-effects.ts
6569
+ var WORLD_EFFECTS = world_effects_default;
6570
+ var PORT_BACK = 0.35;
6571
+ var PORT_RIGHT = 0.04;
6572
+ function createWorldEffects(options) {
6573
+ const ids = options.ids ?? WORLD_EFFECTS;
6574
+ const caseTypeOf = options.caseTypeOf ?? ((weapon) => {
6575
+ const def = options.arsenal.weapons.get(weapon);
6576
+ return def && def.action.kind === "firearm" ? options.arsenal.calibers.get(def.action.caliber)?.caseType : void 0;
6577
+ });
6578
+ let counter = 0;
6579
+ return {
6580
+ /** Plays what the event asks for and answers how many effects started. */
6581
+ handle(event, sink) {
6582
+ if (!sink || event.type !== "shot" || !event.origin) return 0;
6583
+ const caseType = caseTypeOf(event.weapon) ?? "rifle";
6584
+ const entry = ids[caseType];
6585
+ if (!entry) return 0;
6586
+ const direction = event.direction ?? [0, 0, -1];
6587
+ const seed = ++counter;
6588
+ let started = 0;
6589
+ for (let shot = 0; shot < Math.max(1, event.rounds ?? 1); shot++) {
6590
+ if (sink.play({ effect: entry.muzzle, point: event.origin, direction, seed: seed * 8 + shot }) !== null) started++;
6591
+ }
6592
+ const side = [direction[2], 0, -direction[0]];
6593
+ const port = [
6594
+ event.origin[0] - direction[0] * PORT_BACK + side[0] * PORT_RIGHT,
6595
+ event.origin[1] - direction[1] * PORT_BACK,
6596
+ event.origin[2] - direction[2] * PORT_BACK + side[2] * PORT_RIGHT
6597
+ ];
6598
+ if (sink.play({ effect: entry.casing, point: port, direction, seed: seed * 8 + 7 }) !== null) started++;
6599
+ return started;
6600
+ }
6601
+ };
6602
+ }
6603
+
6559
6604
  // src/area.ts
6560
6605
  var WEAPON_ITEM_PREFIX = "weapon_";
6561
6606
  var COUNTER_ITEM_ID = "counter_weapons";
@@ -6832,7 +6877,9 @@ function createWeaponsTestModule(options = {}) {
6832
6877
  } else if (change.kind === "control" && change.id === "sound_distance" && typeof change.value === "number") soundDistance = change.value;
6833
6878
  else if (change.kind === "control" && change.id === "fuse_length" && typeof change.value === "number") lent.configureTool?.({ fuse_length: String(change.value) });
6834
6879
  });
6880
+ const worldEffects = createWorldEffects({ arsenal });
6835
6881
  const offEvents = lent.on((event) => {
6882
+ worldEffects.handle(event, lent.effects);
6836
6883
  if (event.type === "explosion") {
6837
6884
  const away = Math.hypot(event.point[0] - camera.position.x, event.point[1] - camera.position.y, event.point[2] - camera.position.z);
6838
6885
  audio?.play("explosion", Math.min(1, EXPLOSION_VOLUME_BASE + event.radius * EXPLOSION_VOLUME_PER_METRE), away);
@@ -6872,6 +6919,7 @@ export {
6872
6919
  MOUNTED_M134_ITEM_ID,
6873
6920
  WEAPON_ITEM_PREFIX,
6874
6921
  WEAPON_THUMBNAILS,
6922
+ WORLD_EFFECTS,
6875
6923
  WORLD_EXPLOSIVE_IDS,
6876
6924
  WORLD_EXPLOSIVE_PREFIX,
6877
6925
  applyCondition,
@@ -6887,6 +6935,7 @@ export {
6887
6935
  createWeaponAudio,
6888
6936
  createWeaponFx,
6889
6937
  createWeaponsTestModule,
6938
+ createWorldEffects,
6890
6939
  deriveFrames,
6891
6940
  fitAttachmentModels,
6892
6941
  hasWeaponModel,