quake2ts 0.0.98 → 0.0.99

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 (29) hide show
  1. package/package.json +1 -1
  2. package/packages/client/dist/browser/index.global.js +1 -1
  3. package/packages/client/dist/browser/index.global.js.map +1 -1
  4. package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
  5. package/packages/game/dist/browser/index.global.js +1 -1
  6. package/packages/game/dist/browser/index.global.js.map +1 -1
  7. package/packages/game/dist/cjs/index.cjs +257 -85
  8. package/packages/game/dist/cjs/index.cjs.map +1 -1
  9. package/packages/game/dist/esm/index.js +257 -85
  10. package/packages/game/dist/esm/index.js.map +1 -1
  11. package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
  12. package/packages/game/dist/types/combat/damage.d.ts.map +1 -1
  13. package/packages/game/dist/types/combat/weapons/firing.d.ts.map +1 -1
  14. package/packages/game/dist/types/combat/weapons/state.d.ts +1 -0
  15. package/packages/game/dist/types/combat/weapons/state.d.ts.map +1 -1
  16. package/packages/game/dist/types/entities/entity.d.ts +2 -1
  17. package/packages/game/dist/types/entities/entity.d.ts.map +1 -1
  18. package/packages/game/dist/types/entities/gibs.d.ts +5 -0
  19. package/packages/game/dist/types/entities/gibs.d.ts.map +1 -0
  20. package/packages/game/dist/types/entities/monsters/soldier.d.ts.map +1 -1
  21. package/packages/game/dist/types/entities/player.d.ts +5 -0
  22. package/packages/game/dist/types/entities/player.d.ts.map +1 -0
  23. package/packages/game/dist/types/entities/projectiles.d.ts.map +1 -1
  24. package/packages/game/dist/types/entities/system.d.ts +5 -2
  25. package/packages/game/dist/types/entities/system.d.ts.map +1 -1
  26. package/packages/game/dist/types/imports.d.ts +8 -0
  27. package/packages/game/dist/types/imports.d.ts.map +1 -1
  28. package/packages/game/dist/types/index.d.ts +7 -1
  29. package/packages/game/dist/types/index.d.ts.map +1 -1
@@ -739,6 +739,89 @@ function buildWaterWish(params) {
739
739
  };
740
740
  }
741
741
  var WATERJUMP_CLEAR = 8 | 16 | 32 | 1024;
742
+ var ServerCommand = /* @__PURE__ */ ((ServerCommand22) => {
743
+ ServerCommand22[ServerCommand22["bad"] = 0] = "bad";
744
+ ServerCommand22[ServerCommand22["muzzleflash"] = 1] = "muzzleflash";
745
+ ServerCommand22[ServerCommand22["muzzleflash2"] = 2] = "muzzleflash2";
746
+ ServerCommand22[ServerCommand22["temp_entity"] = 3] = "temp_entity";
747
+ ServerCommand22[ServerCommand22["layout"] = 4] = "layout";
748
+ ServerCommand22[ServerCommand22["inventory"] = 5] = "inventory";
749
+ ServerCommand22[ServerCommand22["nop"] = 6] = "nop";
750
+ ServerCommand22[ServerCommand22["disconnect"] = 7] = "disconnect";
751
+ ServerCommand22[ServerCommand22["reconnect"] = 8] = "reconnect";
752
+ ServerCommand22[ServerCommand22["sound"] = 9] = "sound";
753
+ ServerCommand22[ServerCommand22["print"] = 10] = "print";
754
+ ServerCommand22[ServerCommand22["stufftext"] = 11] = "stufftext";
755
+ ServerCommand22[ServerCommand22["serverdata"] = 12] = "serverdata";
756
+ ServerCommand22[ServerCommand22["configstring"] = 13] = "configstring";
757
+ ServerCommand22[ServerCommand22["spawnbaseline"] = 14] = "spawnbaseline";
758
+ ServerCommand22[ServerCommand22["centerprint"] = 15] = "centerprint";
759
+ ServerCommand22[ServerCommand22["download"] = 16] = "download";
760
+ ServerCommand22[ServerCommand22["playerinfo"] = 17] = "playerinfo";
761
+ ServerCommand22[ServerCommand22["packetentities"] = 18] = "packetentities";
762
+ ServerCommand22[ServerCommand22["deltapacketentities"] = 19] = "deltapacketentities";
763
+ ServerCommand22[ServerCommand22["frame"] = 20] = "frame";
764
+ return ServerCommand22;
765
+ })(ServerCommand || {});
766
+ var TempEntity = /* @__PURE__ */ ((TempEntity2) => {
767
+ TempEntity2[TempEntity2["GUNSHOT"] = 0] = "GUNSHOT";
768
+ TempEntity2[TempEntity2["BLOOD"] = 1] = "BLOOD";
769
+ TempEntity2[TempEntity2["BLASTER"] = 2] = "BLASTER";
770
+ TempEntity2[TempEntity2["RAILTRAIL"] = 3] = "RAILTRAIL";
771
+ TempEntity2[TempEntity2["SHOTGUN"] = 4] = "SHOTGUN";
772
+ TempEntity2[TempEntity2["EXPLOSION1"] = 5] = "EXPLOSION1";
773
+ TempEntity2[TempEntity2["EXPLOSION2"] = 6] = "EXPLOSION2";
774
+ TempEntity2[TempEntity2["ROCKET_EXPLOSION"] = 7] = "ROCKET_EXPLOSION";
775
+ TempEntity2[TempEntity2["GRENADE_EXPLOSION"] = 8] = "GRENADE_EXPLOSION";
776
+ TempEntity2[TempEntity2["SPARKS"] = 9] = "SPARKS";
777
+ TempEntity2[TempEntity2["SPLASH"] = 10] = "SPLASH";
778
+ TempEntity2[TempEntity2["BUBBLETRAIL"] = 11] = "BUBBLETRAIL";
779
+ TempEntity2[TempEntity2["SCREEN_SPARKS"] = 12] = "SCREEN_SPARKS";
780
+ TempEntity2[TempEntity2["SHIELD_SPARKS"] = 13] = "SHIELD_SPARKS";
781
+ TempEntity2[TempEntity2["BULLET_SPARKS"] = 14] = "BULLET_SPARKS";
782
+ TempEntity2[TempEntity2["LASER_SPARKS"] = 15] = "LASER_SPARKS";
783
+ TempEntity2[TempEntity2["PARASITE_ATTACK"] = 16] = "PARASITE_ATTACK";
784
+ TempEntity2[TempEntity2["ROCKET_EXPLOSION_WATER"] = 17] = "ROCKET_EXPLOSION_WATER";
785
+ TempEntity2[TempEntity2["GRENADE_EXPLOSION_WATER"] = 18] = "GRENADE_EXPLOSION_WATER";
786
+ TempEntity2[TempEntity2["MEDIC_CABLE_ATTACK"] = 19] = "MEDIC_CABLE_ATTACK";
787
+ TempEntity2[TempEntity2["BFG_EXPLOSION"] = 20] = "BFG_EXPLOSION";
788
+ TempEntity2[TempEntity2["BFG_BIGEXPLOSION"] = 21] = "BFG_BIGEXPLOSION";
789
+ TempEntity2[TempEntity2["BOSSTPORT"] = 22] = "BOSSTPORT";
790
+ TempEntity2[TempEntity2["BFG_LASER"] = 23] = "BFG_LASER";
791
+ TempEntity2[TempEntity2["GRAPPLE_CABLE"] = 24] = "GRAPPLE_CABLE";
792
+ TempEntity2[TempEntity2["WELDING_SPARKS"] = 25] = "WELDING_SPARKS";
793
+ TempEntity2[TempEntity2["GREENBLOOD"] = 26] = "GREENBLOOD";
794
+ TempEntity2[TempEntity2["BLUEHYPERBLASTER"] = 27] = "BLUEHYPERBLASTER";
795
+ TempEntity2[TempEntity2["PLASMA_EXPLOSION"] = 28] = "PLASMA_EXPLOSION";
796
+ TempEntity2[TempEntity2["TUNNEL_SPARKS"] = 29] = "TUNNEL_SPARKS";
797
+ TempEntity2[TempEntity2["BLASTER2"] = 30] = "BLASTER2";
798
+ TempEntity2[TempEntity2["RAILTRAIL2"] = 31] = "RAILTRAIL2";
799
+ TempEntity2[TempEntity2["FLAME"] = 32] = "FLAME";
800
+ TempEntity2[TempEntity2["LIGHTNING"] = 33] = "LIGHTNING";
801
+ TempEntity2[TempEntity2["DEBUGTRAIL"] = 34] = "DEBUGTRAIL";
802
+ TempEntity2[TempEntity2["PLAIN_EXPLOSION"] = 35] = "PLAIN_EXPLOSION";
803
+ TempEntity2[TempEntity2["FLASHLIGHT"] = 36] = "FLASHLIGHT";
804
+ TempEntity2[TempEntity2["FORCEWALL"] = 37] = "FORCEWALL";
805
+ TempEntity2[TempEntity2["HEATBEAM"] = 38] = "HEATBEAM";
806
+ TempEntity2[TempEntity2["MONSTER_HEATBEAM"] = 39] = "MONSTER_HEATBEAM";
807
+ TempEntity2[TempEntity2["STEAM"] = 40] = "STEAM";
808
+ TempEntity2[TempEntity2["BUBBLETRAIL2"] = 41] = "BUBBLETRAIL2";
809
+ TempEntity2[TempEntity2["MOREBLOOD"] = 42] = "MOREBLOOD";
810
+ TempEntity2[TempEntity2["HEATBEAM_SPARKS"] = 43] = "HEATBEAM_SPARKS";
811
+ TempEntity2[TempEntity2["HEATBEAM_STEAM"] = 44] = "HEATBEAM_STEAM";
812
+ TempEntity2[TempEntity2["CHAINFIST_SMOKE"] = 45] = "CHAINFIST_SMOKE";
813
+ TempEntity2[TempEntity2["ELECTRIC_SPARKS"] = 46] = "ELECTRIC_SPARKS";
814
+ TempEntity2[TempEntity2["TRACKER_EXPLOSION"] = 47] = "TRACKER_EXPLOSION";
815
+ TempEntity2[TempEntity2["TELEPORT_EFFECT"] = 48] = "TELEPORT_EFFECT";
816
+ TempEntity2[TempEntity2["DBALL_GOAL"] = 49] = "DBALL_GOAL";
817
+ TempEntity2[TempEntity2["WIDOWBEAMOUT"] = 50] = "WIDOWBEAMOUT";
818
+ TempEntity2[TempEntity2["NUKEBLAST"] = 51] = "NUKEBLAST";
819
+ TempEntity2[TempEntity2["WIDOWSPLASH"] = 52] = "WIDOWSPLASH";
820
+ TempEntity2[TempEntity2["EXPLOSION1_BIG"] = 53] = "EXPLOSION1_BIG";
821
+ TempEntity2[TempEntity2["EXPLOSION1_NP"] = 54] = "EXPLOSION1_NP";
822
+ TempEntity2[TempEntity2["FLECHETTE"] = 55] = "FLECHETTE";
823
+ return TempEntity2;
824
+ })(TempEntity || {});
742
825
  var FRAMETIME = 0.025;
743
826
  var categorizePosition2 = (state, trace) => {
744
827
  const point = { ...state.origin };
@@ -2009,6 +2092,10 @@ var EntitySystem = class {
2009
2092
  y: ent.origin.y + ent.maxs.y,
2010
2093
  z: ent.origin.z + ent.maxs.z
2011
2094
  };
2095
+ },
2096
+ multicast: () => {
2097
+ },
2098
+ unicast: () => {
2012
2099
  }
2013
2100
  };
2014
2101
  this.gravity = gravity || { x: 0, y: 0, z: 0 };
@@ -2068,6 +2155,12 @@ var EntitySystem = class {
2068
2155
  modelIndex(model) {
2069
2156
  return this.engine.modelIndex?.(model) || 0;
2070
2157
  }
2158
+ multicast(origin, type, event, ...args) {
2159
+ this.imports.multicast(origin, type, event, ...args);
2160
+ }
2161
+ unicast(ent, reliable, event, ...args) {
2162
+ this.imports.unicast(ent, reliable, event, ...args);
2163
+ }
2071
2164
  scheduleThink(entity, nextThinkSeconds) {
2072
2165
  this.thinkScheduler.schedule(entity, nextThinkSeconds);
2073
2166
  }
@@ -4284,67 +4377,67 @@ function monster_think(self, context) {
4284
4377
  }
4285
4378
 
4286
4379
  // src/combat/damageMods.ts
4287
- var DamageMod = /* @__PURE__ */ ((DamageMod2) => {
4288
- DamageMod2[DamageMod2["UNKNOWN"] = 0] = "UNKNOWN";
4289
- DamageMod2[DamageMod2["BLASTER"] = 1] = "BLASTER";
4290
- DamageMod2[DamageMod2["SHOTGUN"] = 2] = "SHOTGUN";
4291
- DamageMod2[DamageMod2["SSHOTGUN"] = 3] = "SSHOTGUN";
4292
- DamageMod2[DamageMod2["MACHINEGUN"] = 4] = "MACHINEGUN";
4293
- DamageMod2[DamageMod2["CHAINGUN"] = 5] = "CHAINGUN";
4294
- DamageMod2[DamageMod2["GRENADE"] = 6] = "GRENADE";
4295
- DamageMod2[DamageMod2["G_SPLASH"] = 7] = "G_SPLASH";
4296
- DamageMod2[DamageMod2["ROCKET"] = 8] = "ROCKET";
4297
- DamageMod2[DamageMod2["R_SPLASH"] = 9] = "R_SPLASH";
4298
- DamageMod2[DamageMod2["HYPERBLASTER"] = 10] = "HYPERBLASTER";
4299
- DamageMod2[DamageMod2["RAILGUN"] = 11] = "RAILGUN";
4300
- DamageMod2[DamageMod2["BFG_LASER"] = 12] = "BFG_LASER";
4301
- DamageMod2[DamageMod2["BFG_BLAST"] = 13] = "BFG_BLAST";
4302
- DamageMod2[DamageMod2["BFG_EFFECT"] = 14] = "BFG_EFFECT";
4303
- DamageMod2[DamageMod2["HANDGRENADE"] = 15] = "HANDGRENADE";
4304
- DamageMod2[DamageMod2["HG_SPLASH"] = 16] = "HG_SPLASH";
4305
- DamageMod2[DamageMod2["WATER"] = 17] = "WATER";
4306
- DamageMod2[DamageMod2["SLIME"] = 18] = "SLIME";
4307
- DamageMod2[DamageMod2["LAVA"] = 19] = "LAVA";
4308
- DamageMod2[DamageMod2["CRUSH"] = 20] = "CRUSH";
4309
- DamageMod2[DamageMod2["TELEFRAG"] = 21] = "TELEFRAG";
4310
- DamageMod2[DamageMod2["TELEFRAG_SPAWN"] = 22] = "TELEFRAG_SPAWN";
4311
- DamageMod2[DamageMod2["FALLING"] = 23] = "FALLING";
4312
- DamageMod2[DamageMod2["SUICIDE"] = 24] = "SUICIDE";
4313
- DamageMod2[DamageMod2["HELD_GRENADE"] = 25] = "HELD_GRENADE";
4314
- DamageMod2[DamageMod2["EXPLOSIVE"] = 26] = "EXPLOSIVE";
4315
- DamageMod2[DamageMod2["BARREL"] = 27] = "BARREL";
4316
- DamageMod2[DamageMod2["BOMB"] = 28] = "BOMB";
4317
- DamageMod2[DamageMod2["EXIT"] = 29] = "EXIT";
4318
- DamageMod2[DamageMod2["SPLASH"] = 30] = "SPLASH";
4319
- DamageMod2[DamageMod2["TARGET_LASER"] = 31] = "TARGET_LASER";
4320
- DamageMod2[DamageMod2["TRIGGER_HURT"] = 32] = "TRIGGER_HURT";
4321
- DamageMod2[DamageMod2["HIT"] = 33] = "HIT";
4322
- DamageMod2[DamageMod2["TARGET_BLASTER"] = 34] = "TARGET_BLASTER";
4323
- DamageMod2[DamageMod2["RIPPER"] = 35] = "RIPPER";
4324
- DamageMod2[DamageMod2["PHALANX"] = 36] = "PHALANX";
4325
- DamageMod2[DamageMod2["BRAINTENTACLE"] = 37] = "BRAINTENTACLE";
4326
- DamageMod2[DamageMod2["BLASTOFF"] = 38] = "BLASTOFF";
4327
- DamageMod2[DamageMod2["GEKK"] = 39] = "GEKK";
4328
- DamageMod2[DamageMod2["TRAP"] = 40] = "TRAP";
4329
- DamageMod2[DamageMod2["CHAINFIST"] = 41] = "CHAINFIST";
4330
- DamageMod2[DamageMod2["DISINTEGRATOR"] = 42] = "DISINTEGRATOR";
4331
- DamageMod2[DamageMod2["ETF_RIFLE"] = 43] = "ETF_RIFLE";
4332
- DamageMod2[DamageMod2["BLASTER2"] = 44] = "BLASTER2";
4333
- DamageMod2[DamageMod2["HEATBEAM"] = 45] = "HEATBEAM";
4334
- DamageMod2[DamageMod2["TESLA"] = 46] = "TESLA";
4335
- DamageMod2[DamageMod2["PROX"] = 47] = "PROX";
4336
- DamageMod2[DamageMod2["NUKE"] = 48] = "NUKE";
4337
- DamageMod2[DamageMod2["VENGEANCE_SPHERE"] = 49] = "VENGEANCE_SPHERE";
4338
- DamageMod2[DamageMod2["HUNTER_SPHERE"] = 50] = "HUNTER_SPHERE";
4339
- DamageMod2[DamageMod2["DEFENDER_SPHERE"] = 51] = "DEFENDER_SPHERE";
4340
- DamageMod2[DamageMod2["TRACKER"] = 52] = "TRACKER";
4341
- DamageMod2[DamageMod2["DBALL_CRUSH"] = 53] = "DBALL_CRUSH";
4342
- DamageMod2[DamageMod2["DOPPLE_EXPLODE"] = 54] = "DOPPLE_EXPLODE";
4343
- DamageMod2[DamageMod2["DOPPLE_VENGEANCE"] = 55] = "DOPPLE_VENGEANCE";
4344
- DamageMod2[DamageMod2["DOPPLE_HUNTER"] = 56] = "DOPPLE_HUNTER";
4345
- DamageMod2[DamageMod2["GRAPPLE"] = 57] = "GRAPPLE";
4346
- DamageMod2[DamageMod2["BLUEBLASTER"] = 58] = "BLUEBLASTER";
4347
- return DamageMod2;
4380
+ var DamageMod = /* @__PURE__ */ ((DamageMod3) => {
4381
+ DamageMod3[DamageMod3["UNKNOWN"] = 0] = "UNKNOWN";
4382
+ DamageMod3[DamageMod3["BLASTER"] = 1] = "BLASTER";
4383
+ DamageMod3[DamageMod3["SHOTGUN"] = 2] = "SHOTGUN";
4384
+ DamageMod3[DamageMod3["SSHOTGUN"] = 3] = "SSHOTGUN";
4385
+ DamageMod3[DamageMod3["MACHINEGUN"] = 4] = "MACHINEGUN";
4386
+ DamageMod3[DamageMod3["CHAINGUN"] = 5] = "CHAINGUN";
4387
+ DamageMod3[DamageMod3["GRENADE"] = 6] = "GRENADE";
4388
+ DamageMod3[DamageMod3["G_SPLASH"] = 7] = "G_SPLASH";
4389
+ DamageMod3[DamageMod3["ROCKET"] = 8] = "ROCKET";
4390
+ DamageMod3[DamageMod3["R_SPLASH"] = 9] = "R_SPLASH";
4391
+ DamageMod3[DamageMod3["HYPERBLASTER"] = 10] = "HYPERBLASTER";
4392
+ DamageMod3[DamageMod3["RAILGUN"] = 11] = "RAILGUN";
4393
+ DamageMod3[DamageMod3["BFG_LASER"] = 12] = "BFG_LASER";
4394
+ DamageMod3[DamageMod3["BFG_BLAST"] = 13] = "BFG_BLAST";
4395
+ DamageMod3[DamageMod3["BFG_EFFECT"] = 14] = "BFG_EFFECT";
4396
+ DamageMod3[DamageMod3["HANDGRENADE"] = 15] = "HANDGRENADE";
4397
+ DamageMod3[DamageMod3["HG_SPLASH"] = 16] = "HG_SPLASH";
4398
+ DamageMod3[DamageMod3["WATER"] = 17] = "WATER";
4399
+ DamageMod3[DamageMod3["SLIME"] = 18] = "SLIME";
4400
+ DamageMod3[DamageMod3["LAVA"] = 19] = "LAVA";
4401
+ DamageMod3[DamageMod3["CRUSH"] = 20] = "CRUSH";
4402
+ DamageMod3[DamageMod3["TELEFRAG"] = 21] = "TELEFRAG";
4403
+ DamageMod3[DamageMod3["TELEFRAG_SPAWN"] = 22] = "TELEFRAG_SPAWN";
4404
+ DamageMod3[DamageMod3["FALLING"] = 23] = "FALLING";
4405
+ DamageMod3[DamageMod3["SUICIDE"] = 24] = "SUICIDE";
4406
+ DamageMod3[DamageMod3["HELD_GRENADE"] = 25] = "HELD_GRENADE";
4407
+ DamageMod3[DamageMod3["EXPLOSIVE"] = 26] = "EXPLOSIVE";
4408
+ DamageMod3[DamageMod3["BARREL"] = 27] = "BARREL";
4409
+ DamageMod3[DamageMod3["BOMB"] = 28] = "BOMB";
4410
+ DamageMod3[DamageMod3["EXIT"] = 29] = "EXIT";
4411
+ DamageMod3[DamageMod3["SPLASH"] = 30] = "SPLASH";
4412
+ DamageMod3[DamageMod3["TARGET_LASER"] = 31] = "TARGET_LASER";
4413
+ DamageMod3[DamageMod3["TRIGGER_HURT"] = 32] = "TRIGGER_HURT";
4414
+ DamageMod3[DamageMod3["HIT"] = 33] = "HIT";
4415
+ DamageMod3[DamageMod3["TARGET_BLASTER"] = 34] = "TARGET_BLASTER";
4416
+ DamageMod3[DamageMod3["RIPPER"] = 35] = "RIPPER";
4417
+ DamageMod3[DamageMod3["PHALANX"] = 36] = "PHALANX";
4418
+ DamageMod3[DamageMod3["BRAINTENTACLE"] = 37] = "BRAINTENTACLE";
4419
+ DamageMod3[DamageMod3["BLASTOFF"] = 38] = "BLASTOFF";
4420
+ DamageMod3[DamageMod3["GEKK"] = 39] = "GEKK";
4421
+ DamageMod3[DamageMod3["TRAP"] = 40] = "TRAP";
4422
+ DamageMod3[DamageMod3["CHAINFIST"] = 41] = "CHAINFIST";
4423
+ DamageMod3[DamageMod3["DISINTEGRATOR"] = 42] = "DISINTEGRATOR";
4424
+ DamageMod3[DamageMod3["ETF_RIFLE"] = 43] = "ETF_RIFLE";
4425
+ DamageMod3[DamageMod3["BLASTER2"] = 44] = "BLASTER2";
4426
+ DamageMod3[DamageMod3["HEATBEAM"] = 45] = "HEATBEAM";
4427
+ DamageMod3[DamageMod3["TESLA"] = 46] = "TESLA";
4428
+ DamageMod3[DamageMod3["PROX"] = 47] = "PROX";
4429
+ DamageMod3[DamageMod3["NUKE"] = 48] = "NUKE";
4430
+ DamageMod3[DamageMod3["VENGEANCE_SPHERE"] = 49] = "VENGEANCE_SPHERE";
4431
+ DamageMod3[DamageMod3["HUNTER_SPHERE"] = 50] = "HUNTER_SPHERE";
4432
+ DamageMod3[DamageMod3["DEFENDER_SPHERE"] = 51] = "DEFENDER_SPHERE";
4433
+ DamageMod3[DamageMod3["TRACKER"] = 52] = "TRACKER";
4434
+ DamageMod3[DamageMod3["DBALL_CRUSH"] = 53] = "DBALL_CRUSH";
4435
+ DamageMod3[DamageMod3["DOPPLE_EXPLODE"] = 54] = "DOPPLE_EXPLODE";
4436
+ DamageMod3[DamageMod3["DOPPLE_VENGEANCE"] = 55] = "DOPPLE_VENGEANCE";
4437
+ DamageMod3[DamageMod3["DOPPLE_HUNTER"] = 56] = "DOPPLE_HUNTER";
4438
+ DamageMod3[DamageMod3["GRAPPLE"] = 57] = "GRAPPLE";
4439
+ DamageMod3[DamageMod3["BLUEBLASTER"] = 58] = "BLUEBLASTER";
4440
+ return DamageMod3;
4348
4441
  })(DamageMod || {});
4349
4442
  var ORDERED_DAMAGE_MODS = [
4350
4443
  0 /* UNKNOWN */,
@@ -4560,37 +4653,23 @@ function createGrenade(sys, owner, start, dir, damage, speed) {
4560
4653
  grenade.modelindex = sys.modelIndex("models/objects/grenade/tris.md2");
4561
4654
  grenade.mins = { x: -4, y: -4, z: -4 };
4562
4655
  grenade.maxs = { x: 4, y: 4, z: 4 };
4656
+ const explode = (self) => {
4657
+ const entities = sys.findByRadius(self.origin, 120);
4658
+ T_RadiusDamage(entities, self, self.owner, damage, self.owner, 120, 0 /* NONE */, 6 /* GRENADE */);
4659
+ sys.multicast(self.origin, 2 /* Phs */, ServerCommand.temp_entity, TempEntity.GRENADE_EXPLOSION, self.origin);
4660
+ sys.free(self);
4661
+ };
4563
4662
  grenade.touch = (self, other, plane, surf) => {
4564
4663
  if (other === self.owner) {
4565
4664
  return;
4566
4665
  }
4567
4666
  if (other && other.takedamage) {
4568
- T_Damage(
4569
- other,
4570
- self,
4571
- self.owner,
4572
- self.velocity,
4573
- self.origin,
4574
- plane ? plane.normal : ZERO_VEC3,
4575
- damage,
4576
- // Direct impact damage? Usually separate but let's assume it's part of it or handled by radius.
4577
- // Actually G_Weapon.c Grenade_Touch calls Grenade_Explode which calls T_RadiusDamage.
4578
- // It doesn't seem to do T_Damage separately?
4579
- // Wait, if it hits a monster, it stops and explodes.
4580
- 0,
4581
- 0 /* NONE */,
4582
- 6 /* GRENADE */
4583
- );
4584
- const entities = sys.findByRadius(self.origin, 120);
4585
- T_RadiusDamage(entities, self, self.owner, damage, self.owner, 120, 0 /* NONE */, 6 /* GRENADE */);
4586
- sys.free(self);
4667
+ explode(self);
4587
4668
  return;
4588
4669
  }
4589
4670
  };
4590
4671
  grenade.think = (self) => {
4591
- const entities = sys.findByRadius(self.origin, 120);
4592
- T_RadiusDamage(entities, self, self.owner, damage, self.owner, 120, 0 /* NONE */, 6 /* GRENADE */);
4593
- sys.free(self);
4672
+ explode(self);
4594
4673
  };
4595
4674
  sys.scheduleThink(grenade, sys.timeSeconds + 2.5);
4596
4675
  sys.finalizeSpawn(grenade);
@@ -4738,6 +4817,54 @@ function registerGunnerSpawns(registry) {
4738
4817
  registry.register("monster_gunner", SP_monster_gunner);
4739
4818
  }
4740
4819
 
4820
+ // src/entities/gibs.ts
4821
+ var random = createRandomGenerator();
4822
+ function spawnGib(sys, origin, damage) {
4823
+ const gib = sys.spawn();
4824
+ gib.classname = "gib";
4825
+ gib.origin = {
4826
+ x: origin.x + (random.frandom() - 0.5) * 20,
4827
+ y: origin.y + (random.frandom() - 0.5) * 20,
4828
+ z: origin.z + (random.frandom() - 0.5) * 20
4829
+ };
4830
+ gib.velocity = {
4831
+ x: (random.frandom() - 0.5) * 300,
4832
+ // Velocity based on damage?
4833
+ y: (random.frandom() - 0.5) * 300,
4834
+ z: 200 + random.frandom() * 100
4835
+ };
4836
+ gib.movetype = 9 /* Bounce */;
4837
+ gib.solid = 0 /* Not */;
4838
+ gib.clipmask = 1;
4839
+ gib.avelocity = {
4840
+ x: random.crandom() * 600,
4841
+ y: random.crandom() * 600,
4842
+ z: random.crandom() * 600
4843
+ };
4844
+ const models = [
4845
+ "models/objects/gibs/bone/tris.md2",
4846
+ "models/objects/gibs/meat/tris.md2",
4847
+ "models/objects/gibs/sm_meat/tris.md2",
4848
+ "models/objects/gibs/arm/tris.md2"
4849
+ // larger parts?
4850
+ ];
4851
+ const modelName = models[Math.floor(random.frandom() * models.length)];
4852
+ gib.modelindex = sys.modelIndex(modelName);
4853
+ gib.mins = { x: -2, y: -2, z: -2 };
4854
+ gib.maxs = { x: 2, y: 2, z: 2 };
4855
+ gib.think = (self) => {
4856
+ sys.free(self);
4857
+ };
4858
+ sys.scheduleThink(gib, sys.timeSeconds + 10 + random.frandom() * 10);
4859
+ sys.finalizeSpawn(gib);
4860
+ }
4861
+ function throwGibs(sys, origin, damage) {
4862
+ const count = 4 + Math.floor(random.frandom() * 4);
4863
+ for (let i = 0; i < count; i++) {
4864
+ spawnGib(sys, origin, damage);
4865
+ }
4866
+ }
4867
+
4741
4868
  // src/entities/monsters/soldier.ts
4742
4869
  var MONSTER_TICK2 = 0.1;
4743
4870
  function monster_ai_stand2(self, dist, context) {
@@ -4834,11 +4961,21 @@ function SP_monster_soldier(self, context) {
4834
4961
  self.health = 20;
4835
4962
  self.max_health = 20;
4836
4963
  self.mass = 100;
4964
+ self.takedamage = true;
4837
4965
  self.pain = (self2, other, kick, damage) => {
4838
4966
  };
4839
4967
  self.die = (self2, inflictor, attacker, damage, point) => {
4840
4968
  self2.deadflag = 2 /* Dead */;
4841
4969
  self2.solid = 0 /* Not */;
4970
+ if (self2.health < -40) {
4971
+ throwGibs(context.entities, self2.origin, damage);
4972
+ context.entities.free(self2);
4973
+ return;
4974
+ }
4975
+ self2.think = (self3) => {
4976
+ context.entities.free(self3);
4977
+ };
4978
+ self2.nextthink = context.entities.timeSeconds + 5;
4842
4979
  };
4843
4980
  self.monsterinfo.stand = soldier_stand;
4844
4981
  self.monsterinfo.walk = soldier_walk;
@@ -5226,6 +5363,31 @@ var LevelClock = class {
5226
5363
  }
5227
5364
  };
5228
5365
 
5366
+ // src/entities/player.ts
5367
+ function player_die(self, inflictor, attacker, damage, point, mod, sys) {
5368
+ self.deadflag = 2 /* Dead */;
5369
+ self.solid = 0 /* Not */;
5370
+ self.movetype = 7 /* Toss */;
5371
+ self.takedamage = false;
5372
+ if (self.health < -40 && sys) {
5373
+ throwGibs(sys, self.origin, damage);
5374
+ }
5375
+ self.frame = 0;
5376
+ if (sys) {
5377
+ let message = "You died.";
5378
+ if (attacker) {
5379
+ if (attacker === self) {
5380
+ message = "You killed yourself.";
5381
+ } else {
5382
+ message = `You were killed by ${attacker.classname} (${damageModName(mod)})`;
5383
+ }
5384
+ } else {
5385
+ message = `You died (${damageModName(mod)})`;
5386
+ }
5387
+ sys.engine.centerprintf?.(self, message);
5388
+ }
5389
+ }
5390
+
5229
5391
  // src/checksum.ts
5230
5392
  var FNV_OFFSET_BASIS = 2166136261;
5231
5393
  var FNV_PRIME = 16777619;
@@ -6279,7 +6441,7 @@ function getWeaponState(playerStates, weaponId) {
6279
6441
 
6280
6442
  // src/index.ts
6281
6443
  var ZERO_VEC32 = { x: 0, y: 0, z: 0 };
6282
- function createGame({ trace, pointcontents }, engine, options) {
6444
+ function createGame({ trace, pointcontents, multicast, unicast }, engine, options) {
6283
6445
  const gravity = options.gravity;
6284
6446
  const levelClock = new LevelClock();
6285
6447
  const frameLoop = new GameFrameLoop();
@@ -6295,7 +6457,7 @@ function createGame({ trace, pointcontents }, engine, options) {
6295
6457
  z: ent.origin.z + ent.maxs.z
6296
6458
  };
6297
6459
  };
6298
- const entities = new EntitySystem(engine, { trace, pointcontents, linkentity }, gravity);
6460
+ const entities = new EntitySystem(engine, { trace, pointcontents, linkentity, multicast, unicast }, gravity);
6299
6461
  frameLoop.addStage("prep", (context) => {
6300
6462
  levelClock.tick(context);
6301
6463
  entities.beginFrame(levelClock.current.timeSeconds);
@@ -6351,6 +6513,7 @@ function createGame({ trace, pointcontents }, engine, options) {
6351
6513
  player.origin = playerStart ? { ...playerStart.origin } : { x: 0, y: 0, z: 0 };
6352
6514
  player.angles = playerStart ? { ...playerStart.angles } : { x: 0, y: 0, z: 0 };
6353
6515
  player.health = 100;
6516
+ player.takedamage = true;
6354
6517
  player.movetype = 7 /* Toss */;
6355
6518
  player.mins = { x: -16, y: -16, z: -24 };
6356
6519
  player.maxs = { x: 16, y: 16, z: 32 };
@@ -6358,6 +6521,9 @@ function createGame({ trace, pointcontents }, engine, options) {
6358
6521
  inventory: createPlayerInventory(),
6359
6522
  weaponStates: createPlayerWeaponStates()
6360
6523
  };
6524
+ player.die = (self, inflictor, attacker, damage, point, mod) => {
6525
+ player_die(self, inflictor, attacker, damage, point, mod, entities);
6526
+ };
6361
6527
  entities.finalizeSpawn(player);
6362
6528
  origin = { ...player.origin };
6363
6529
  },
@@ -6397,6 +6563,12 @@ function createGame({ trace, pointcontents }, engine, options) {
6397
6563
  engine.centerprintf?.(entity, message);
6398
6564
  },
6399
6565
  trace,
6566
+ multicast(origin2, type, event, ...args) {
6567
+ multicast(origin2, type, event, ...args);
6568
+ },
6569
+ unicast(ent, reliable, event, ...args) {
6570
+ unicast(ent, reliable, event, ...args);
6571
+ },
6400
6572
  get time() {
6401
6573
  return levelClock.current.timeSeconds;
6402
6574
  }