quake2ts 0.0.266 → 0.0.268

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.
@@ -512,12 +512,12 @@ function addReplayFrame(session, cmd, serverFrame, startTime) {
512
512
  timestamp: Date.now() - startTime
513
513
  });
514
514
  }
515
- var WaterLevel = /* @__PURE__ */ ((WaterLevel3) => {
516
- WaterLevel3[WaterLevel3["None"] = 0] = "None";
517
- WaterLevel3[WaterLevel3["Feet"] = 1] = "Feet";
518
- WaterLevel3[WaterLevel3["Waist"] = 2] = "Waist";
519
- WaterLevel3[WaterLevel3["Under"] = 3] = "Under";
520
- return WaterLevel3;
515
+ var WaterLevel = /* @__PURE__ */ ((WaterLevel4) => {
516
+ WaterLevel4[WaterLevel4["None"] = 0] = "None";
517
+ WaterLevel4[WaterLevel4["Feet"] = 1] = "Feet";
518
+ WaterLevel4[WaterLevel4["Waist"] = 2] = "Waist";
519
+ WaterLevel4[WaterLevel4["Under"] = 3] = "Under";
520
+ return WaterLevel4;
521
521
  })(WaterLevel || {});
522
522
  function applyPmoveFriction(params) {
523
523
  const {
@@ -594,12 +594,14 @@ function buildWaterWish(params) {
594
594
  let wishvel = {
595
595
  x: forward.x * cmd.forwardmove + right.x * cmd.sidemove,
596
596
  y: forward.y * cmd.forwardmove + right.y * cmd.sidemove,
597
- z: 0
597
+ z: forward.z * cmd.forwardmove + right.z * cmd.sidemove
598
598
  };
599
599
  if (cmd.upmove > 10) {
600
600
  wishvel = addVec3(wishvel, { x: 0, y: 0, z: cmd.upmove });
601
601
  } else if (cmd.upmove < -10) {
602
602
  wishvel = addVec3(wishvel, { x: 0, y: 0, z: cmd.upmove });
603
+ } else if (Math.abs(cmd.forwardmove) < 10 && Math.abs(cmd.sidemove) < 10) {
604
+ wishvel = addVec3(wishvel, { x: 0, y: 0, z: -60 });
603
605
  } else {
604
606
  wishvel = addVec3(wishvel, { x: 0, y: 0, z: 10 });
605
607
  }
@@ -987,6 +989,13 @@ var U_MODEL3 = 1 << 1;
987
989
  var U_MODEL4 = 1 << 2;
988
990
  var U_REMOVE = 32768;
989
991
  var FRAMETIME = 0.025;
992
+ var MASK_WATER2 = 33554432;
993
+ var WaterLevel3 = {
994
+ None: 0,
995
+ Feet: 1,
996
+ Waist: 2,
997
+ Under: 3
998
+ };
990
999
  var categorizePosition2 = (state, trace) => {
991
1000
  const point = { ...state.origin };
992
1001
  point.z -= 0.25;
@@ -998,12 +1007,26 @@ var categorizePosition2 = (state, trace) => {
998
1007
  };
999
1008
  var checkWater = (state, pointContents2) => {
1000
1009
  const point = { ...state.origin };
1001
- point.z += state.mins.z + 1;
1010
+ const { mins, maxs } = state;
1011
+ point.z = state.origin.z + mins.z + 1;
1002
1012
  const contents = pointContents2(point);
1003
- if (contents & 33554432) {
1004
- return { ...state, waterLevel: 1 };
1005
- }
1006
- return { ...state, waterLevel: 0 };
1013
+ if (!(contents & MASK_WATER2)) {
1014
+ return { ...state, waterLevel: WaterLevel3.None };
1015
+ }
1016
+ let waterLevel = WaterLevel3.Feet;
1017
+ const waist = state.origin.z + (mins.z + maxs.z) * 0.5;
1018
+ point.z = waist;
1019
+ const waistContents = pointContents2(point);
1020
+ if (waistContents & MASK_WATER2) {
1021
+ waterLevel = WaterLevel3.Waist;
1022
+ const head = state.origin.z + 22;
1023
+ point.z = head;
1024
+ const headContents = pointContents2(point);
1025
+ if (headContents & MASK_WATER2) {
1026
+ waterLevel = WaterLevel3.Under;
1027
+ }
1028
+ }
1029
+ return { ...state, waterLevel };
1007
1030
  };
1008
1031
  var applyPmove = (state, cmd, trace, pointContents2) => {
1009
1032
  let newState = { ...state };
@@ -1043,7 +1066,8 @@ var applyPmove = (state, cmd, trace, pointContents2) => {
1043
1066
  velocity: frictionedVelocity,
1044
1067
  wishdir: wish.wishdir,
1045
1068
  wishspeed: wish.wishspeed,
1046
- accel: onGround ? 10 : 1,
1069
+ // Water movement uses ground acceleration (10), not air acceleration (1)
1070
+ accel: onGround || waterLevel >= 2 ? 10 : 1,
1047
1071
  frametime: FRAMETIME
1048
1072
  });
1049
1073
  const traceResult = trace(origin, {
@@ -4434,6 +4458,131 @@ function useTargetBlaster(self, other, activator, context) {
4434
4458
  }
4435
4459
  context.entities.sound(self, 2, "weapons/laser2.wav", 1, ATTN_NORM, 0);
4436
4460
  }
4461
+ var TARGET_LASER_START_ON = 1;
4462
+ var TARGET_LASER_RED = 2;
4463
+ var TARGET_LASER_GREEN = 4;
4464
+ var TARGET_LASER_BLUE = 8;
4465
+ var TARGET_LASER_YELLOW = 16;
4466
+ var TARGET_LASER_ORANGE = 32;
4467
+ var TARGET_LASER_FAT = 64;
4468
+ function target_laser_think(self, context) {
4469
+ let count;
4470
+ if (self.spawnflags & 2147483648) {
4471
+ count = 8;
4472
+ } else {
4473
+ count = 4;
4474
+ }
4475
+ if (self.enemy) {
4476
+ const last_movedir = { ...self.movedir };
4477
+ const size = subtractVec3(self.enemy.maxs, self.enemy.mins);
4478
+ const centerOffset = scaleVec3(size, 0.5);
4479
+ const enemyCenter = addVec3(self.enemy.mins, centerOffset);
4480
+ const dir = subtractVec3(enemyCenter, self.origin);
4481
+ self.movedir = normalizeVec3(dir);
4482
+ 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) {
4483
+ self.spawnflags |= 2147483648;
4484
+ }
4485
+ }
4486
+ let ignore = self;
4487
+ let start = { ...self.origin };
4488
+ const end = addVec3(start, scaleVec3(self.movedir, 2048));
4489
+ let traceResult;
4490
+ while (true) {
4491
+ traceResult = context.entities.trace(start, end, ZERO_VEC3, ZERO_VEC3, ignore, CONTENTS_SOLID | CONTENTS_MONSTER | CONTENTS_DEADMONSTER);
4492
+ if (!traceResult.ent) {
4493
+ break;
4494
+ }
4495
+ const trEnt = traceResult.ent;
4496
+ if (trEnt.takedamage && !(trEnt.flags & 2)) {
4497
+ T_Damage(trEnt, self, self.activator, self.movedir, traceResult.endpos, ZERO_VEC3, self.dmg, 1, 4 /* ENERGY */, 31 /* TARGET_LASER */, context.entities.timeSeconds);
4498
+ }
4499
+ if (!(trEnt.svflags & 1) && !trEnt.client) {
4500
+ if (self.spawnflags & 2147483648) {
4501
+ self.spawnflags &= ~2147483648;
4502
+ context.entities.multicast(traceResult.endpos, 1 /* Pvs */, ServerCommand.temp_entity, TempEntity.LASER_SPARKS, count, traceResult.endpos, traceResult.plane?.normal || ZERO_VEC3, self.skin);
4503
+ }
4504
+ break;
4505
+ }
4506
+ ignore = trEnt;
4507
+ start = { ...traceResult.endpos };
4508
+ }
4509
+ self.old_origin = { ...traceResult.endpos };
4510
+ self.nextthink = context.entities.timeSeconds + 0.1;
4511
+ }
4512
+ function target_laser_on(self, context) {
4513
+ if (!self.activator) {
4514
+ self.activator = self;
4515
+ }
4516
+ self.spawnflags |= 2147483649;
4517
+ self.svflags &= ~1 /* NoClient */;
4518
+ target_laser_think(self, context);
4519
+ }
4520
+ function target_laser_off(self) {
4521
+ self.spawnflags &= ~1;
4522
+ self.svflags |= 1 /* NoClient */;
4523
+ self.nextthink = 0;
4524
+ }
4525
+ function target_laser_use(self, other, activator, context) {
4526
+ self.activator = activator;
4527
+ if (self.spawnflags & 1) {
4528
+ target_laser_off(self);
4529
+ } else {
4530
+ target_laser_on(self, context);
4531
+ }
4532
+ }
4533
+ function target_laser_start(self, context) {
4534
+ self.movetype = 0 /* None */;
4535
+ self.solid = 0 /* Not */;
4536
+ self.renderfx |= 8 | 64;
4537
+ self.modelindex = 1;
4538
+ if (self.spawnflags & TARGET_LASER_FAT) {
4539
+ self.frame = 16;
4540
+ } else {
4541
+ self.frame = 4;
4542
+ }
4543
+ if (self.spawnflags & TARGET_LASER_RED) {
4544
+ self.skin = 4076007664;
4545
+ } else if (self.spawnflags & TARGET_LASER_GREEN) {
4546
+ self.skin = 3503411923;
4547
+ } else if (self.spawnflags & TARGET_LASER_BLUE) {
4548
+ self.skin = 4092850673;
4549
+ } else if (self.spawnflags & TARGET_LASER_YELLOW) {
4550
+ self.skin = 3705528031;
4551
+ } else if (self.spawnflags & TARGET_LASER_ORANGE) {
4552
+ self.skin = 3772900067;
4553
+ }
4554
+ if (!self.enemy) {
4555
+ if (self.target) {
4556
+ let found = null;
4557
+ context.entities.forEachEntity((ent) => {
4558
+ if (ent.targetname === self.target) {
4559
+ found = ent;
4560
+ }
4561
+ });
4562
+ if (found) {
4563
+ self.enemy = found;
4564
+ } else {
4565
+ context.warn(`${self.classname} at ${self.origin}: ${self.target} is a bad target`);
4566
+ self.movedir = setMovedir(self.angles);
4567
+ }
4568
+ } else {
4569
+ self.movedir = setMovedir(self.angles);
4570
+ }
4571
+ }
4572
+ self.use = (s, o, a) => target_laser_use(s, o, a || null, context);
4573
+ self.think = (s) => target_laser_think(s, context);
4574
+ if (!self.dmg) {
4575
+ self.dmg = 1;
4576
+ }
4577
+ self.absmin = addVec3(self.origin, { x: -8, y: -8, z: -8 });
4578
+ self.absmax = addVec3(self.origin, { x: 8, y: 8, z: 8 });
4579
+ context.entities.linkentity(self);
4580
+ if (self.spawnflags & TARGET_LASER_START_ON) {
4581
+ target_laser_on(self, context);
4582
+ } else {
4583
+ target_laser_off(self);
4584
+ }
4585
+ }
4437
4586
  function registerTargetSpawns(registry) {
4438
4587
  registry.register("target_temp_entity", (entity, context) => {
4439
4588
  entity.style = context.keyValues.style ? parseInt(context.keyValues.style) : 0;
@@ -4516,6 +4665,10 @@ function registerTargetSpawns(registry) {
4516
4665
  if (!entity.speed) entity.speed = 1e3;
4517
4666
  entity.svflags |= 1 /* NoClient */;
4518
4667
  });
4668
+ registry.register("target_laser", (entity, context) => {
4669
+ entity.think = (self) => target_laser_start(self, context);
4670
+ entity.nextthink = context.entities.timeSeconds + 1;
4671
+ });
4519
4672
  }
4520
4673
 
4521
4674
  // src/entities/triggers.ts