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.
@@ -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, {
@@ -4600,6 +4624,131 @@ function useTargetBlaster(self, other, activator, context) {
4600
4624
  }
4601
4625
  context.entities.sound(self, 2, "weapons/laser2.wav", 1, ATTN_NORM, 0);
4602
4626
  }
4627
+ var TARGET_LASER_START_ON = 1;
4628
+ var TARGET_LASER_RED = 2;
4629
+ var TARGET_LASER_GREEN = 4;
4630
+ var TARGET_LASER_BLUE = 8;
4631
+ var TARGET_LASER_YELLOW = 16;
4632
+ var TARGET_LASER_ORANGE = 32;
4633
+ var TARGET_LASER_FAT = 64;
4634
+ function target_laser_think(self, context) {
4635
+ let count;
4636
+ if (self.spawnflags & 2147483648) {
4637
+ count = 8;
4638
+ } else {
4639
+ count = 4;
4640
+ }
4641
+ if (self.enemy) {
4642
+ const last_movedir = { ...self.movedir };
4643
+ const size = subtractVec3(self.enemy.maxs, self.enemy.mins);
4644
+ const centerOffset = scaleVec3(size, 0.5);
4645
+ const enemyCenter = addVec3(self.enemy.mins, centerOffset);
4646
+ const dir = subtractVec3(enemyCenter, self.origin);
4647
+ self.movedir = normalizeVec3(dir);
4648
+ 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) {
4649
+ self.spawnflags |= 2147483648;
4650
+ }
4651
+ }
4652
+ let ignore = self;
4653
+ let start = { ...self.origin };
4654
+ const end = addVec3(start, scaleVec3(self.movedir, 2048));
4655
+ let traceResult;
4656
+ while (true) {
4657
+ traceResult = context.entities.trace(start, end, ZERO_VEC3, ZERO_VEC3, ignore, CONTENTS_SOLID | CONTENTS_MONSTER | CONTENTS_DEADMONSTER);
4658
+ if (!traceResult.ent) {
4659
+ break;
4660
+ }
4661
+ const trEnt = traceResult.ent;
4662
+ if (trEnt.takedamage && !(trEnt.flags & 2)) {
4663
+ T_Damage(trEnt, self, self.activator, self.movedir, traceResult.endpos, ZERO_VEC3, self.dmg, 1, 4 /* ENERGY */, 31 /* TARGET_LASER */, context.entities.timeSeconds);
4664
+ }
4665
+ if (!(trEnt.svflags & 1) && !trEnt.client) {
4666
+ if (self.spawnflags & 2147483648) {
4667
+ self.spawnflags &= ~2147483648;
4668
+ context.entities.multicast(traceResult.endpos, 1 /* Pvs */, ServerCommand.temp_entity, TempEntity.LASER_SPARKS, count, traceResult.endpos, traceResult.plane?.normal || ZERO_VEC3, self.skin);
4669
+ }
4670
+ break;
4671
+ }
4672
+ ignore = trEnt;
4673
+ start = { ...traceResult.endpos };
4674
+ }
4675
+ self.old_origin = { ...traceResult.endpos };
4676
+ self.nextthink = context.entities.timeSeconds + 0.1;
4677
+ }
4678
+ function target_laser_on(self, context) {
4679
+ if (!self.activator) {
4680
+ self.activator = self;
4681
+ }
4682
+ self.spawnflags |= 2147483649;
4683
+ self.svflags &= ~1 /* NoClient */;
4684
+ target_laser_think(self, context);
4685
+ }
4686
+ function target_laser_off(self) {
4687
+ self.spawnflags &= ~1;
4688
+ self.svflags |= 1 /* NoClient */;
4689
+ self.nextthink = 0;
4690
+ }
4691
+ function target_laser_use(self, other, activator, context) {
4692
+ self.activator = activator;
4693
+ if (self.spawnflags & 1) {
4694
+ target_laser_off(self);
4695
+ } else {
4696
+ target_laser_on(self, context);
4697
+ }
4698
+ }
4699
+ function target_laser_start(self, context) {
4700
+ self.movetype = 0 /* None */;
4701
+ self.solid = 0 /* Not */;
4702
+ self.renderfx |= 8 | 64;
4703
+ self.modelindex = 1;
4704
+ if (self.spawnflags & TARGET_LASER_FAT) {
4705
+ self.frame = 16;
4706
+ } else {
4707
+ self.frame = 4;
4708
+ }
4709
+ if (self.spawnflags & TARGET_LASER_RED) {
4710
+ self.skin = 4076007664;
4711
+ } else if (self.spawnflags & TARGET_LASER_GREEN) {
4712
+ self.skin = 3503411923;
4713
+ } else if (self.spawnflags & TARGET_LASER_BLUE) {
4714
+ self.skin = 4092850673;
4715
+ } else if (self.spawnflags & TARGET_LASER_YELLOW) {
4716
+ self.skin = 3705528031;
4717
+ } else if (self.spawnflags & TARGET_LASER_ORANGE) {
4718
+ self.skin = 3772900067;
4719
+ }
4720
+ if (!self.enemy) {
4721
+ if (self.target) {
4722
+ let found = null;
4723
+ context.entities.forEachEntity((ent) => {
4724
+ if (ent.targetname === self.target) {
4725
+ found = ent;
4726
+ }
4727
+ });
4728
+ if (found) {
4729
+ self.enemy = found;
4730
+ } else {
4731
+ context.warn(`${self.classname} at ${self.origin}: ${self.target} is a bad target`);
4732
+ self.movedir = setMovedir(self.angles);
4733
+ }
4734
+ } else {
4735
+ self.movedir = setMovedir(self.angles);
4736
+ }
4737
+ }
4738
+ self.use = (s, o, a) => target_laser_use(s, o, a || null, context);
4739
+ self.think = (s) => target_laser_think(s, context);
4740
+ if (!self.dmg) {
4741
+ self.dmg = 1;
4742
+ }
4743
+ self.absmin = addVec3(self.origin, { x: -8, y: -8, z: -8 });
4744
+ self.absmax = addVec3(self.origin, { x: 8, y: 8, z: 8 });
4745
+ context.entities.linkentity(self);
4746
+ if (self.spawnflags & TARGET_LASER_START_ON) {
4747
+ target_laser_on(self, context);
4748
+ } else {
4749
+ target_laser_off(self);
4750
+ }
4751
+ }
4603
4752
  function registerTargetSpawns(registry) {
4604
4753
  registry.register("target_temp_entity", (entity, context) => {
4605
4754
  entity.style = context.keyValues.style ? parseInt(context.keyValues.style) : 0;
@@ -4682,6 +4831,10 @@ function registerTargetSpawns(registry) {
4682
4831
  if (!entity.speed) entity.speed = 1e3;
4683
4832
  entity.svflags |= 1 /* NoClient */;
4684
4833
  });
4834
+ registry.register("target_laser", (entity, context) => {
4835
+ entity.think = (self) => target_laser_start(self, context);
4836
+ entity.nextthink = context.entities.timeSeconds + 1;
4837
+ });
4685
4838
  }
4686
4839
 
4687
4840
  // src/entities/triggers.ts