quake2ts 0.0.266 → 0.0.269

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 (32) hide show
  1. package/package.json +1 -1
  2. package/packages/client/dist/browser/index.global.js +13 -13
  3. package/packages/client/dist/browser/index.global.js.map +1 -1
  4. package/packages/client/dist/cjs/index.cjs +6 -6
  5. package/packages/client/dist/cjs/index.cjs.map +1 -1
  6. package/packages/client/dist/esm/index.js +6 -6
  7. package/packages/client/dist/esm/index.js.map +1 -1
  8. package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
  9. package/packages/engine/dist/browser/index.global.js.map +1 -1
  10. package/packages/engine/dist/cjs/index.cjs.map +1 -1
  11. package/packages/engine/dist/esm/index.js.map +1 -1
  12. package/packages/game/dist/browser/index.global.js +3 -3
  13. package/packages/game/dist/browser/index.global.js.map +1 -1
  14. package/packages/game/dist/cjs/index.cjs +225 -16
  15. package/packages/game/dist/cjs/index.cjs.map +1 -1
  16. package/packages/game/dist/esm/index.js +225 -16
  17. package/packages/game/dist/esm/index.js.map +1 -1
  18. package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
  19. package/packages/game/dist/types/entities/system.d.ts +4 -0
  20. package/packages/game/dist/types/entities/system.d.ts.map +1 -1
  21. package/packages/game/dist/types/entities/targets.d.ts.map +1 -1
  22. package/packages/game/dist/types/save/rerelease.d.ts.map +1 -1
  23. package/packages/game/dist/types/save/save.d.ts.map +1 -1
  24. package/packages/shared/dist/browser/index.global.js +1 -1
  25. package/packages/shared/dist/browser/index.global.js.map +1 -1
  26. package/packages/shared/dist/cjs/index.cjs +36 -12
  27. package/packages/shared/dist/cjs/index.cjs.map +1 -1
  28. package/packages/shared/dist/esm/index.js +36 -12
  29. package/packages/shared/dist/esm/index.js.map +1 -1
  30. package/packages/shared/dist/tsconfig.tsbuildinfo +1 -1
  31. package/packages/shared/dist/types/pmove/apply.d.ts.map +1 -1
  32. package/packages/shared/dist/types/pmove/pmove.d.ts.map +1 -1
@@ -678,12 +678,12 @@ function addReplayFrame(session, cmd, serverFrame, startTime) {
678
678
  timestamp: Date.now() - startTime
679
679
  });
680
680
  }
681
- var WaterLevel = /* @__PURE__ */ ((WaterLevel3) => {
682
- WaterLevel3[WaterLevel3["None"] = 0] = "None";
683
- WaterLevel3[WaterLevel3["Feet"] = 1] = "Feet";
684
- WaterLevel3[WaterLevel3["Waist"] = 2] = "Waist";
685
- WaterLevel3[WaterLevel3["Under"] = 3] = "Under";
686
- return WaterLevel3;
681
+ var WaterLevel = /* @__PURE__ */ ((WaterLevel4) => {
682
+ WaterLevel4[WaterLevel4["None"] = 0] = "None";
683
+ WaterLevel4[WaterLevel4["Feet"] = 1] = "Feet";
684
+ WaterLevel4[WaterLevel4["Waist"] = 2] = "Waist";
685
+ WaterLevel4[WaterLevel4["Under"] = 3] = "Under";
686
+ return WaterLevel4;
687
687
  })(WaterLevel || {});
688
688
  function applyPmoveFriction(params) {
689
689
  const {
@@ -760,12 +760,14 @@ function buildWaterWish(params) {
760
760
  let wishvel = {
761
761
  x: forward.x * cmd.forwardmove + right.x * cmd.sidemove,
762
762
  y: forward.y * cmd.forwardmove + right.y * cmd.sidemove,
763
- z: 0
763
+ z: forward.z * cmd.forwardmove + right.z * cmd.sidemove
764
764
  };
765
765
  if (cmd.upmove > 10) {
766
766
  wishvel = addVec3(wishvel, { x: 0, y: 0, z: cmd.upmove });
767
767
  } else if (cmd.upmove < -10) {
768
768
  wishvel = addVec3(wishvel, { x: 0, y: 0, z: cmd.upmove });
769
+ } else if (Math.abs(cmd.forwardmove) < 10 && Math.abs(cmd.sidemove) < 10) {
770
+ wishvel = addVec3(wishvel, { x: 0, y: 0, z: -60 });
769
771
  } else {
770
772
  wishvel = addVec3(wishvel, { x: 0, y: 0, z: 10 });
771
773
  }
@@ -1153,6 +1155,13 @@ var U_MODEL3 = 1 << 1;
1153
1155
  var U_MODEL4 = 1 << 2;
1154
1156
  var U_REMOVE = 32768;
1155
1157
  var FRAMETIME = 0.025;
1158
+ var MASK_WATER2 = 33554432;
1159
+ var WaterLevel3 = {
1160
+ None: 0,
1161
+ Feet: 1,
1162
+ Waist: 2,
1163
+ Under: 3
1164
+ };
1156
1165
  var categorizePosition2 = (state, trace) => {
1157
1166
  const point = { ...state.origin };
1158
1167
  point.z -= 0.25;
@@ -1164,12 +1173,26 @@ var categorizePosition2 = (state, trace) => {
1164
1173
  };
1165
1174
  var checkWater = (state, pointContents2) => {
1166
1175
  const point = { ...state.origin };
1167
- point.z += state.mins.z + 1;
1176
+ const { mins, maxs } = state;
1177
+ point.z = state.origin.z + mins.z + 1;
1168
1178
  const contents = pointContents2(point);
1169
- if (contents & 33554432) {
1170
- return { ...state, waterLevel: 1 };
1171
- }
1172
- return { ...state, waterLevel: 0 };
1179
+ if (!(contents & MASK_WATER2)) {
1180
+ return { ...state, waterLevel: WaterLevel3.None };
1181
+ }
1182
+ let waterLevel = WaterLevel3.Feet;
1183
+ const waist = state.origin.z + (mins.z + maxs.z) * 0.5;
1184
+ point.z = waist;
1185
+ const waistContents = pointContents2(point);
1186
+ if (waistContents & MASK_WATER2) {
1187
+ waterLevel = WaterLevel3.Waist;
1188
+ const head = state.origin.z + 22;
1189
+ point.z = head;
1190
+ const headContents = pointContents2(point);
1191
+ if (headContents & MASK_WATER2) {
1192
+ waterLevel = WaterLevel3.Under;
1193
+ }
1194
+ }
1195
+ return { ...state, waterLevel };
1173
1196
  };
1174
1197
  var applyPmove = (state, cmd, trace, pointContents2) => {
1175
1198
  let newState = { ...state };
@@ -1209,7 +1232,8 @@ var applyPmove = (state, cmd, trace, pointContents2) => {
1209
1232
  velocity: frictionedVelocity,
1210
1233
  wishdir: wish.wishdir,
1211
1234
  wishspeed: wish.wishspeed,
1212
- accel: onGround ? 10 : 1,
1235
+ // Water movement uses ground acceleration (10), not air acceleration (1)
1236
+ accel: onGround || waterLevel >= 2 ? 10 : 1,
1213
1237
  frametime: FRAMETIME
1214
1238
  });
1215
1239
  const traceResult = trace(origin, {
@@ -3278,6 +3302,9 @@ var EntitySystem = class {
3278
3302
  this.random = createRandomGenerator();
3279
3303
  this.currentTimeSeconds = 0;
3280
3304
  this.frameNumber = 0;
3305
+ // Persistent state for cross-level logic
3306
+ this.crossLevelFlags = 0;
3307
+ this.crossUnitFlags = 0;
3281
3308
  this.pool = new EntityPool(maxEntities);
3282
3309
  this.thinkScheduler = new ThinkScheduler();
3283
3310
  this.engine = engine;
@@ -3603,11 +3630,15 @@ var EntitySystem = class {
3603
3630
  sound2EntityIndex: this.targetAwareness.sound2Entity?.index ?? null,
3604
3631
  sound2EntityFrame: this.targetAwareness.sound2EntityFrame,
3605
3632
  sightClientIndex: this.targetAwareness.sightClient?.index ?? null
3606
- }
3633
+ },
3634
+ crossLevelFlags: this.crossLevelFlags,
3635
+ crossUnitFlags: this.crossUnitFlags
3607
3636
  };
3608
3637
  }
3609
3638
  restore(snapshot, callbackRegistry) {
3610
3639
  this.currentTimeSeconds = snapshot.timeSeconds;
3640
+ this.crossLevelFlags = snapshot.crossLevelFlags ?? 0;
3641
+ this.crossUnitFlags = snapshot.crossUnitFlags ?? 0;
3611
3642
  this.pool.restore(snapshot.pool);
3612
3643
  const indexToEntity = /* @__PURE__ */ new Map();
3613
3644
  for (const entity of this.pool) {
@@ -4600,6 +4631,131 @@ function useTargetBlaster(self, other, activator, context) {
4600
4631
  }
4601
4632
  context.entities.sound(self, 2, "weapons/laser2.wav", 1, ATTN_NORM, 0);
4602
4633
  }
4634
+ var TARGET_LASER_START_ON = 1;
4635
+ var TARGET_LASER_RED = 2;
4636
+ var TARGET_LASER_GREEN = 4;
4637
+ var TARGET_LASER_BLUE = 8;
4638
+ var TARGET_LASER_YELLOW = 16;
4639
+ var TARGET_LASER_ORANGE = 32;
4640
+ var TARGET_LASER_FAT = 64;
4641
+ function target_laser_think(self, context) {
4642
+ let count;
4643
+ if (self.spawnflags & 2147483648) {
4644
+ count = 8;
4645
+ } else {
4646
+ count = 4;
4647
+ }
4648
+ if (self.enemy) {
4649
+ const last_movedir = { ...self.movedir };
4650
+ const size = subtractVec3(self.enemy.maxs, self.enemy.mins);
4651
+ const centerOffset = scaleVec3(size, 0.5);
4652
+ const enemyCenter = addVec3(self.enemy.mins, centerOffset);
4653
+ const dir = subtractVec3(enemyCenter, self.origin);
4654
+ self.movedir = normalizeVec3(dir);
4655
+ if (Math.abs(self.movedir.x - last_movedir.x) > 1e-3 || Math.abs(self.movedir.y - last_movedir.y) > 1e-3 || Math.abs(self.movedir.z - last_movedir.z) > 1e-3) {
4656
+ self.spawnflags |= 2147483648;
4657
+ }
4658
+ }
4659
+ let ignore = self;
4660
+ let start = { ...self.origin };
4661
+ const end = addVec3(start, scaleVec3(self.movedir, 2048));
4662
+ let traceResult;
4663
+ while (true) {
4664
+ traceResult = context.entities.trace(start, end, ZERO_VEC3, ZERO_VEC3, ignore, CONTENTS_SOLID | CONTENTS_MONSTER | CONTENTS_DEADMONSTER);
4665
+ if (!traceResult.ent) {
4666
+ break;
4667
+ }
4668
+ const trEnt = traceResult.ent;
4669
+ if (trEnt.takedamage && !(trEnt.flags & 2)) {
4670
+ T_Damage(trEnt, self, self.activator, self.movedir, traceResult.endpos, ZERO_VEC3, self.dmg, 1, 4 /* ENERGY */, 31 /* TARGET_LASER */, context.entities.timeSeconds);
4671
+ }
4672
+ if (!(trEnt.svflags & 1) && !trEnt.client) {
4673
+ if (self.spawnflags & 2147483648) {
4674
+ self.spawnflags &= ~2147483648;
4675
+ context.entities.multicast(traceResult.endpos, 1 /* Pvs */, ServerCommand.temp_entity, TempEntity.LASER_SPARKS, count, traceResult.endpos, traceResult.plane?.normal || ZERO_VEC3, self.skin);
4676
+ }
4677
+ break;
4678
+ }
4679
+ ignore = trEnt;
4680
+ start = { ...traceResult.endpos };
4681
+ }
4682
+ self.old_origin = { ...traceResult.endpos };
4683
+ self.nextthink = context.entities.timeSeconds + 0.1;
4684
+ }
4685
+ function target_laser_on(self, context) {
4686
+ if (!self.activator) {
4687
+ self.activator = self;
4688
+ }
4689
+ self.spawnflags |= 2147483649;
4690
+ self.svflags &= ~1 /* NoClient */;
4691
+ target_laser_think(self, context);
4692
+ }
4693
+ function target_laser_off(self) {
4694
+ self.spawnflags &= ~1;
4695
+ self.svflags |= 1 /* NoClient */;
4696
+ self.nextthink = 0;
4697
+ }
4698
+ function target_laser_use(self, other, activator, context) {
4699
+ self.activator = activator;
4700
+ if (self.spawnflags & 1) {
4701
+ target_laser_off(self);
4702
+ } else {
4703
+ target_laser_on(self, context);
4704
+ }
4705
+ }
4706
+ function target_laser_start(self, context) {
4707
+ self.movetype = 0 /* None */;
4708
+ self.solid = 0 /* Not */;
4709
+ self.renderfx |= 8 | 64;
4710
+ self.modelindex = 1;
4711
+ if (self.spawnflags & TARGET_LASER_FAT) {
4712
+ self.frame = 16;
4713
+ } else {
4714
+ self.frame = 4;
4715
+ }
4716
+ if (self.spawnflags & TARGET_LASER_RED) {
4717
+ self.skin = 4076007664;
4718
+ } else if (self.spawnflags & TARGET_LASER_GREEN) {
4719
+ self.skin = 3503411923;
4720
+ } else if (self.spawnflags & TARGET_LASER_BLUE) {
4721
+ self.skin = 4092850673;
4722
+ } else if (self.spawnflags & TARGET_LASER_YELLOW) {
4723
+ self.skin = 3705528031;
4724
+ } else if (self.spawnflags & TARGET_LASER_ORANGE) {
4725
+ self.skin = 3772900067;
4726
+ }
4727
+ if (!self.enemy) {
4728
+ if (self.target) {
4729
+ let found = null;
4730
+ context.entities.forEachEntity((ent) => {
4731
+ if (ent.targetname === self.target) {
4732
+ found = ent;
4733
+ }
4734
+ });
4735
+ if (found) {
4736
+ self.enemy = found;
4737
+ } else {
4738
+ context.warn(`${self.classname} at ${self.origin}: ${self.target} is a bad target`);
4739
+ self.movedir = setMovedir(self.angles);
4740
+ }
4741
+ } else {
4742
+ self.movedir = setMovedir(self.angles);
4743
+ }
4744
+ }
4745
+ self.use = (s, o, a) => target_laser_use(s, o, a || null, context);
4746
+ self.think = (s) => target_laser_think(s, context);
4747
+ if (!self.dmg) {
4748
+ self.dmg = 1;
4749
+ }
4750
+ self.absmin = addVec3(self.origin, { x: -8, y: -8, z: -8 });
4751
+ self.absmax = addVec3(self.origin, { x: 8, y: 8, z: 8 });
4752
+ context.entities.linkentity(self);
4753
+ if (self.spawnflags & TARGET_LASER_START_ON) {
4754
+ target_laser_on(self, context);
4755
+ } else {
4756
+ target_laser_off(self);
4757
+ }
4758
+ }
4603
4759
  function registerTargetSpawns(registry) {
4604
4760
  registry.register("target_temp_entity", (entity, context) => {
4605
4761
  entity.style = context.keyValues.style ? parseInt(context.keyValues.style) : 0;
@@ -4682,6 +4838,55 @@ function registerTargetSpawns(registry) {
4682
4838
  if (!entity.speed) entity.speed = 1e3;
4683
4839
  entity.svflags |= 1 /* NoClient */;
4684
4840
  });
4841
+ registry.register("target_laser", (entity, context) => {
4842
+ entity.think = (self) => target_laser_start(self, context);
4843
+ entity.think = (self) => target_laser_start(self, context);
4844
+ entity.nextthink = context.entities.timeSeconds + 1;
4845
+ });
4846
+ registry.register("target_crosslevel_trigger", (entity, context) => {
4847
+ entity.svflags |= 1 /* NoClient */;
4848
+ entity.use = (self) => {
4849
+ context.entities.crossLevelFlags |= self.spawnflags;
4850
+ context.free(self);
4851
+ };
4852
+ });
4853
+ registry.register("target_crosslevel_target", (entity, context) => {
4854
+ entity.svflags |= 1 /* NoClient */;
4855
+ if (!entity.delay) {
4856
+ entity.delay = 1;
4857
+ }
4858
+ const SFL_CROSS_TRIGGER_MASK = 4294967295;
4859
+ entity.think = (self) => {
4860
+ const flags = self.spawnflags & SFL_CROSS_TRIGGER_MASK;
4861
+ if ((context.entities.crossLevelFlags & flags) === flags) {
4862
+ context.entities.useTargets(self, self);
4863
+ context.free(self);
4864
+ }
4865
+ };
4866
+ context.entities.scheduleThink(entity, context.entities.timeSeconds + entity.delay);
4867
+ });
4868
+ registry.register("target_crossunit_trigger", (entity, context) => {
4869
+ entity.svflags |= 1 /* NoClient */;
4870
+ entity.use = (self) => {
4871
+ context.entities.crossUnitFlags |= self.spawnflags;
4872
+ context.free(self);
4873
+ };
4874
+ });
4875
+ registry.register("target_crossunit_target", (entity, context) => {
4876
+ entity.svflags |= 1 /* NoClient */;
4877
+ if (!entity.delay) {
4878
+ entity.delay = 1;
4879
+ }
4880
+ const SFL_CROSS_TRIGGER_MASK = 4294967295;
4881
+ entity.think = (self) => {
4882
+ const flags = self.spawnflags & SFL_CROSS_TRIGGER_MASK;
4883
+ if ((context.entities.crossUnitFlags & flags) === flags) {
4884
+ context.entities.useTargets(self, self);
4885
+ context.free(self);
4886
+ }
4887
+ };
4888
+ context.entities.scheduleThink(entity, context.entities.timeSeconds + entity.delay);
4889
+ });
4685
4890
  }
4686
4891
 
4687
4892
  // src/entities/triggers.ts
@@ -14745,7 +14950,9 @@ function parseEntitySnapshot(raw) {
14745
14950
  pool: parsePool(snapshot.pool),
14746
14951
  entities: parseEntities(snapshot.entities),
14747
14952
  thinks: parseThinkEntries(snapshot.thinks),
14748
- awareness: parseAwareness(snapshot.awareness)
14953
+ awareness: parseAwareness(snapshot.awareness),
14954
+ crossLevelFlags: ensureNumberOrDefault(snapshot.crossLevelFlags, "entities.crossLevelFlags", 0),
14955
+ crossUnitFlags: ensureNumberOrDefault(snapshot.crossUnitFlags, "entities.crossUnitFlags", 0)
14749
14956
  };
14750
14957
  }
14751
14958
  function parseCvars(raw) {
@@ -15106,7 +15313,9 @@ function buildEntitySnapshot(entities, levelTimeSeconds, capacityHint) {
15106
15313
  pool: { capacity, activeOrder, freeList, pendingFree: [] },
15107
15314
  entities: serialized,
15108
15315
  thinks: [],
15109
- awareness: dummyAwareness
15316
+ awareness: dummyAwareness,
15317
+ crossLevelFlags: 0,
15318
+ crossUnitFlags: 0
15110
15319
  };
15111
15320
  }
15112
15321
  function buildLevelState(level) {