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.
- package/package.json +1 -1
- package/packages/client/dist/browser/index.global.js +13 -13
- package/packages/client/dist/browser/index.global.js.map +1 -1
- package/packages/client/dist/cjs/index.cjs +6 -6
- package/packages/client/dist/cjs/index.cjs.map +1 -1
- package/packages/client/dist/esm/index.js +6 -6
- package/packages/client/dist/esm/index.js.map +1 -1
- package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/engine/dist/browser/index.global.js.map +1 -1
- package/packages/engine/dist/cjs/index.cjs.map +1 -1
- package/packages/engine/dist/esm/index.js.map +1 -1
- package/packages/game/dist/browser/index.global.js +3 -3
- package/packages/game/dist/browser/index.global.js.map +1 -1
- package/packages/game/dist/cjs/index.cjs +225 -16
- package/packages/game/dist/cjs/index.cjs.map +1 -1
- package/packages/game/dist/esm/index.js +225 -16
- package/packages/game/dist/esm/index.js.map +1 -1
- package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/game/dist/types/entities/system.d.ts +4 -0
- package/packages/game/dist/types/entities/system.d.ts.map +1 -1
- package/packages/game/dist/types/entities/targets.d.ts.map +1 -1
- package/packages/game/dist/types/save/rerelease.d.ts.map +1 -1
- package/packages/game/dist/types/save/save.d.ts.map +1 -1
- package/packages/shared/dist/browser/index.global.js +1 -1
- package/packages/shared/dist/browser/index.global.js.map +1 -1
- package/packages/shared/dist/cjs/index.cjs +36 -12
- package/packages/shared/dist/cjs/index.cjs.map +1 -1
- package/packages/shared/dist/esm/index.js +36 -12
- package/packages/shared/dist/esm/index.js.map +1 -1
- package/packages/shared/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/shared/dist/types/pmove/apply.d.ts.map +1 -1
- 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__ */ ((
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
return
|
|
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:
|
|
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
|
-
|
|
1176
|
+
const { mins, maxs } = state;
|
|
1177
|
+
point.z = state.origin.z + mins.z + 1;
|
|
1168
1178
|
const contents = pointContents2(point);
|
|
1169
|
-
if (contents &
|
|
1170
|
-
return { ...state, waterLevel:
|
|
1171
|
-
}
|
|
1172
|
-
|
|
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
|
-
|
|
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) {
|