quake2ts 0.0.85 → 0.0.87
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 +1 -1
- package/packages/client/dist/browser/index.global.js.map +1 -1
- package/packages/client/dist/cjs/index.cjs +80 -0
- package/packages/client/dist/cjs/index.cjs.map +1 -1
- package/packages/client/dist/esm/index.js +80 -0
- 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 +7 -7
- package/packages/engine/dist/browser/index.global.js.map +1 -1
- package/packages/engine/dist/cjs/index.cjs +40 -0
- package/packages/engine/dist/cjs/index.cjs.map +1 -1
- package/packages/engine/dist/esm/index.js +40 -0
- package/packages/engine/dist/esm/index.js.map +1 -1
- package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/engine/dist/types/render/collisionVis.d.ts +53 -0
- package/packages/engine/dist/types/render/collisionVis.d.ts.map +1 -0
- package/packages/engine/dist/types/render/renderer.d.ts +2 -0
- package/packages/engine/dist/types/render/renderer.d.ts.map +1 -1
- package/packages/game/dist/browser/index.global.js +1 -1
- package/packages/game/dist/browser/index.global.js.map +1 -1
- package/packages/game/dist/cjs/index.cjs +253 -2
- package/packages/game/dist/cjs/index.cjs.map +1 -1
- package/packages/game/dist/esm/index.js +248 -2
- package/packages/game/dist/esm/index.js.map +1 -1
- package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/game/dist/types/ai/movement.d.ts +5 -0
- package/packages/game/dist/types/ai/movement.d.ts.map +1 -1
- package/packages/game/dist/types/entities/system.d.ts.map +1 -1
- package/packages/game/dist/types/physics/fluid.d.ts +5 -0
- package/packages/game/dist/types/physics/fluid.d.ts.map +1 -0
- package/packages/game/dist/types/physics/movement.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 +41 -0
- package/packages/shared/dist/cjs/index.cjs.map +1 -1
- package/packages/shared/dist/esm/index.js +46 -0
- package/packages/shared/dist/esm/index.js.map +1 -1
- package/packages/shared/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/shared/dist/types/index.d.ts +1 -0
- package/packages/shared/dist/types/index.d.ts.map +1 -1
- package/packages/shared/dist/types/replay/index.d.ts +3 -0
- package/packages/shared/dist/types/replay/index.d.ts.map +1 -0
- package/packages/shared/dist/types/replay/io.d.ts +7 -0
- package/packages/shared/dist/types/replay/io.d.ts.map +1 -0
- package/packages/shared/dist/types/replay/schema.d.ts +31 -0
- package/packages/shared/dist/types/replay/schema.d.ts.map +1 -0
- package/packages/tools/dist/tsconfig.tsbuildinfo +1 -1
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
// ../shared/dist/esm/index.js
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __export = (target, all) => {
|
|
4
|
+
for (var name in all)
|
|
5
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
6
|
+
};
|
|
2
7
|
var ZERO_VEC3 = { x: 0, y: 0, z: 0 };
|
|
3
8
|
var STOP_EPSILON = 0.1;
|
|
4
9
|
var DEG_TO_RAD = Math.PI / 180;
|
|
@@ -441,6 +446,41 @@ var ConfigStringIndex = ((ConfigStringIndex2) => {
|
|
|
441
446
|
return ConfigStringIndex2;
|
|
442
447
|
})(ConfigStringIndex || {});
|
|
443
448
|
var MAX_CONFIGSTRINGS = ConfigStringIndex.MaxConfigStrings;
|
|
449
|
+
var replay_exports = {};
|
|
450
|
+
__export(replay_exports, {
|
|
451
|
+
addReplayFrame: () => addReplayFrame,
|
|
452
|
+
createReplaySession: () => createReplaySession,
|
|
453
|
+
deserializeReplay: () => deserializeReplay,
|
|
454
|
+
serializeReplay: () => serializeReplay
|
|
455
|
+
});
|
|
456
|
+
function serializeReplay(session) {
|
|
457
|
+
return JSON.stringify(session, null, 2);
|
|
458
|
+
}
|
|
459
|
+
function deserializeReplay(json) {
|
|
460
|
+
const session = JSON.parse(json);
|
|
461
|
+
if (!session.metadata || !Array.isArray(session.frames)) {
|
|
462
|
+
throw new Error("Invalid replay format: missing metadata or frames");
|
|
463
|
+
}
|
|
464
|
+
return session;
|
|
465
|
+
}
|
|
466
|
+
function createReplaySession(map, seed) {
|
|
467
|
+
return {
|
|
468
|
+
metadata: {
|
|
469
|
+
map,
|
|
470
|
+
date: (/* @__PURE__ */ new Date()).toISOString(),
|
|
471
|
+
version: "1.0",
|
|
472
|
+
seed
|
|
473
|
+
},
|
|
474
|
+
frames: []
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
function addReplayFrame(session, cmd, serverFrame, startTime) {
|
|
478
|
+
session.frames.push({
|
|
479
|
+
serverFrame,
|
|
480
|
+
cmd,
|
|
481
|
+
timestamp: Date.now() - startTime
|
|
482
|
+
});
|
|
483
|
+
}
|
|
444
484
|
var WaterLevel = /* @__PURE__ */ ((WaterLevel3) => {
|
|
445
485
|
WaterLevel3[WaterLevel3["None"] = 0] = "None";
|
|
446
486
|
WaterLevel3[WaterLevel3["Feet"] = 1] = "Feet";
|
|
@@ -910,8 +950,23 @@ var ENTITY_FIELD_METADATA = [
|
|
|
910
950
|
// src/physics/movement.ts
|
|
911
951
|
function runGravity(ent, gravity, frametime) {
|
|
912
952
|
if (ent.movetype === 7 /* Toss */) {
|
|
913
|
-
|
|
914
|
-
|
|
953
|
+
if (ent.waterlevel > 1) {
|
|
954
|
+
const speed = Math.sqrt(ent.velocity.x * ent.velocity.x + ent.velocity.y * ent.velocity.y + ent.velocity.z * ent.velocity.z);
|
|
955
|
+
if (speed > 1) {
|
|
956
|
+
const newspeed = speed - frametime * speed * 2;
|
|
957
|
+
if (newspeed < 0) {
|
|
958
|
+
ent.velocity = { x: 0, y: 0, z: 0 };
|
|
959
|
+
} else {
|
|
960
|
+
const scale = newspeed / speed;
|
|
961
|
+
ent.velocity = scaleVec3(ent.velocity, scale);
|
|
962
|
+
}
|
|
963
|
+
}
|
|
964
|
+
ent.velocity = addVec3(ent.velocity, scaleVec3(gravity, ent.gravity * frametime * 0.1));
|
|
965
|
+
ent.origin = addVec3(ent.origin, scaleVec3(ent.velocity, frametime));
|
|
966
|
+
} else {
|
|
967
|
+
ent.velocity = addVec3(ent.velocity, scaleVec3(gravity, ent.gravity * frametime));
|
|
968
|
+
ent.origin = addVec3(ent.origin, scaleVec3(ent.velocity, frametime));
|
|
969
|
+
}
|
|
915
970
|
}
|
|
916
971
|
}
|
|
917
972
|
function runBouncing(ent, imports, frametime) {
|
|
@@ -1060,6 +1115,64 @@ function runPush(pusher, system, imports, frametime) {
|
|
|
1060
1115
|
return true;
|
|
1061
1116
|
}
|
|
1062
1117
|
|
|
1118
|
+
// src/physics/fluid.ts
|
|
1119
|
+
function checkWater2(ent, system, imports) {
|
|
1120
|
+
const origin = ent.origin;
|
|
1121
|
+
const mins = ent.mins;
|
|
1122
|
+
const maxs = ent.maxs;
|
|
1123
|
+
const point = {
|
|
1124
|
+
x: origin.x + (mins.x + maxs.x) * 0.5,
|
|
1125
|
+
y: origin.y + (mins.y + maxs.y) * 0.5,
|
|
1126
|
+
z: origin.z + mins.z + 1
|
|
1127
|
+
};
|
|
1128
|
+
let cont = imports.pointcontents(point);
|
|
1129
|
+
if ((cont & MASK_WATER) === 0) {
|
|
1130
|
+
if (ent.waterlevel > 0) {
|
|
1131
|
+
playLeaveWaterSound(ent, system);
|
|
1132
|
+
ent.flags &= ~2 /* Swim */;
|
|
1133
|
+
}
|
|
1134
|
+
ent.waterlevel = 0;
|
|
1135
|
+
ent.watertype = 0;
|
|
1136
|
+
return;
|
|
1137
|
+
}
|
|
1138
|
+
ent.watertype = cont;
|
|
1139
|
+
ent.waterlevel = 1;
|
|
1140
|
+
const waistZ = origin.z + mins.z + (maxs.z - mins.z) * 0.5;
|
|
1141
|
+
const headZ = origin.z + maxs.z - 1;
|
|
1142
|
+
const waistPoint = { ...point, z: waistZ };
|
|
1143
|
+
cont = imports.pointcontents(waistPoint);
|
|
1144
|
+
if (cont & MASK_WATER) {
|
|
1145
|
+
ent.waterlevel = 2;
|
|
1146
|
+
const headPoint = { ...point, z: headZ };
|
|
1147
|
+
cont = imports.pointcontents(headPoint);
|
|
1148
|
+
if (cont & MASK_WATER) {
|
|
1149
|
+
ent.waterlevel = 3;
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
1152
|
+
if ((ent.flags & 2 /* Swim */) === 0) {
|
|
1153
|
+
playEnterWaterSound(ent, system);
|
|
1154
|
+
ent.flags |= 2 /* Swim */;
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1157
|
+
function playEnterWaterSound(ent, system) {
|
|
1158
|
+
if (ent.watertype & CONTENTS_LAVA) {
|
|
1159
|
+
system.sound(ent, 0, "player/lava_in.wav", 1, 1, 0);
|
|
1160
|
+
} else if (ent.watertype & CONTENTS_SLIME) {
|
|
1161
|
+
system.sound(ent, 0, "player/watr_in.wav", 1, 1, 0);
|
|
1162
|
+
} else if (ent.watertype & CONTENTS_WATER) {
|
|
1163
|
+
system.sound(ent, 0, "player/watr_in.wav", 1, 1, 0);
|
|
1164
|
+
}
|
|
1165
|
+
}
|
|
1166
|
+
function playLeaveWaterSound(ent, system) {
|
|
1167
|
+
if (ent.watertype & CONTENTS_LAVA) {
|
|
1168
|
+
system.sound(ent, 0, "player/lava_out.wav", 1, 1, 0);
|
|
1169
|
+
} else if (ent.watertype & CONTENTS_SLIME) {
|
|
1170
|
+
system.sound(ent, 0, "player/watr_out.wav", 1, 1, 0);
|
|
1171
|
+
} else if (ent.watertype & CONTENTS_WATER) {
|
|
1172
|
+
system.sound(ent, 0, "player/watr_out.wav", 1, 1, 0);
|
|
1173
|
+
}
|
|
1174
|
+
}
|
|
1175
|
+
|
|
1063
1176
|
// src/entities/pool.ts
|
|
1064
1177
|
var MAX_EDICTS = 2048;
|
|
1065
1178
|
var WORLD_INDEX = 0;
|
|
@@ -1527,6 +1640,9 @@ var EntitySystem = class {
|
|
|
1527
1640
|
if (!ent.inUse || ent.freePending) {
|
|
1528
1641
|
continue;
|
|
1529
1642
|
}
|
|
1643
|
+
if (ent.movetype !== 0 /* None */ && ent.movetype !== 2 /* Push */ && ent.movetype !== 3 /* Stop */ && ent.movetype !== 1 /* Noclip */) {
|
|
1644
|
+
checkWater2(ent, this, this.imports);
|
|
1645
|
+
}
|
|
1530
1646
|
const frametime = this.currentTimeSeconds - (ent.timestamp || 0);
|
|
1531
1647
|
switch (ent.movetype) {
|
|
1532
1648
|
case 7 /* Toss */:
|
|
@@ -3661,6 +3777,131 @@ function ai_charge(self, distance2, deltaSeconds) {
|
|
|
3661
3777
|
walkMove(self, self.angles.y, distance2);
|
|
3662
3778
|
}
|
|
3663
3779
|
}
|
|
3780
|
+
function CheckGround(self, context) {
|
|
3781
|
+
if (self.movetype === 1 /* Noclip */) {
|
|
3782
|
+
return;
|
|
3783
|
+
}
|
|
3784
|
+
const point = {
|
|
3785
|
+
x: self.origin.x,
|
|
3786
|
+
y: self.origin.y,
|
|
3787
|
+
z: self.origin.z + self.mins.z - 1
|
|
3788
|
+
};
|
|
3789
|
+
const trace = context.trace(self.origin, self.mins, self.maxs, point, self, MASK_MONSTERSOLID);
|
|
3790
|
+
self.groundentity = trace.ent;
|
|
3791
|
+
if (!self.groundentity && !trace.allsolid && !trace.startsolid && trace.fraction === 1) {
|
|
3792
|
+
const content = context.pointcontents(point);
|
|
3793
|
+
if (content & MASK_WATER) {
|
|
3794
|
+
self.waterlevel = 1;
|
|
3795
|
+
self.watertype = content;
|
|
3796
|
+
} else {
|
|
3797
|
+
self.waterlevel = 0;
|
|
3798
|
+
self.watertype = 0;
|
|
3799
|
+
}
|
|
3800
|
+
}
|
|
3801
|
+
}
|
|
3802
|
+
function M_CheckBottom(self, context) {
|
|
3803
|
+
const mins = {
|
|
3804
|
+
x: self.origin.x + self.mins.x,
|
|
3805
|
+
y: self.origin.y + self.mins.y,
|
|
3806
|
+
z: self.origin.z + self.mins.z
|
|
3807
|
+
};
|
|
3808
|
+
const maxs = {
|
|
3809
|
+
x: self.origin.x + self.maxs.x,
|
|
3810
|
+
y: self.origin.y + self.maxs.y,
|
|
3811
|
+
z: self.origin.z + self.maxs.z
|
|
3812
|
+
};
|
|
3813
|
+
let start = { x: 0, y: 0, z: 0 };
|
|
3814
|
+
let stop = { x: 0, y: 0, z: 0 };
|
|
3815
|
+
for (let i = 0; i < 2; i++) {
|
|
3816
|
+
if (i === 1) start = { x: mins.x, y: mins.y, z: 0 };
|
|
3817
|
+
else start = { x: maxs.x, y: mins.y, z: 0 };
|
|
3818
|
+
start.z = mins.z - 1;
|
|
3819
|
+
if (context.pointcontents(start) !== 0) return true;
|
|
3820
|
+
stop = { ...start };
|
|
3821
|
+
stop.z = start.z - 60;
|
|
3822
|
+
const trace = context.trace(start, null, null, stop, self, MASK_MONSTERSOLID);
|
|
3823
|
+
if (trace.fraction < 1) return true;
|
|
3824
|
+
if (i === 1) start = { x: mins.x, y: maxs.y, z: 0 };
|
|
3825
|
+
else start = { x: maxs.x, y: maxs.y, z: 0 };
|
|
3826
|
+
start.z = mins.z - 1;
|
|
3827
|
+
if (context.pointcontents(start) !== 0) return true;
|
|
3828
|
+
stop = { ...start };
|
|
3829
|
+
stop.z = start.z - 60;
|
|
3830
|
+
const trace2 = context.trace(start, null, null, stop, self, MASK_MONSTERSOLID);
|
|
3831
|
+
if (trace2.fraction < 1) return true;
|
|
3832
|
+
}
|
|
3833
|
+
return false;
|
|
3834
|
+
}
|
|
3835
|
+
function M_walkmove(self, yawDegrees, distance2, context) {
|
|
3836
|
+
if (!((self.flags & (2 /* Swim */ | 1 /* Fly */)) !== 0) && self.movetype !== 1 /* Noclip */) {
|
|
3837
|
+
if (!self.groundentity && self.waterlevel === 0) {
|
|
3838
|
+
return false;
|
|
3839
|
+
}
|
|
3840
|
+
}
|
|
3841
|
+
const delta = yawVector(yawDegrees, distance2);
|
|
3842
|
+
if ((self.monsterinfo.aiflags & 1024 /* NoStep */) !== 0 && (self.monsterinfo.aiflags & 1073741824 /* Pathing */) !== 0) {
|
|
3843
|
+
}
|
|
3844
|
+
const dest = {
|
|
3845
|
+
x: self.origin.x + delta.x,
|
|
3846
|
+
y: self.origin.y + delta.y,
|
|
3847
|
+
z: self.origin.z + delta.z
|
|
3848
|
+
};
|
|
3849
|
+
const trace = context.trace(self.origin, self.mins, self.maxs, dest, self, MASK_MONSTERSOLID);
|
|
3850
|
+
if (trace.fraction < 1) {
|
|
3851
|
+
return false;
|
|
3852
|
+
}
|
|
3853
|
+
const oldOrigin = { ...self.origin };
|
|
3854
|
+
self.origin.x = dest.x;
|
|
3855
|
+
self.origin.y = dest.y;
|
|
3856
|
+
self.origin.z = dest.z;
|
|
3857
|
+
if (!((self.flags & (2 /* Swim */ | 1 /* Fly */)) !== 0) && self.movetype !== 1 /* Noclip */) {
|
|
3858
|
+
if (!M_CheckBottom(self, context)) {
|
|
3859
|
+
self.origin.x = oldOrigin.x;
|
|
3860
|
+
self.origin.y = oldOrigin.y;
|
|
3861
|
+
self.origin.z = oldOrigin.z;
|
|
3862
|
+
return false;
|
|
3863
|
+
}
|
|
3864
|
+
}
|
|
3865
|
+
if (!((self.flags & (2 /* Swim */ | 1 /* Fly */)) !== 0)) {
|
|
3866
|
+
CheckGround(self, context);
|
|
3867
|
+
}
|
|
3868
|
+
return true;
|
|
3869
|
+
}
|
|
3870
|
+
function SV_StepDirection(self, yaw, dist, context) {
|
|
3871
|
+
for (let i = 0; i <= 90; i += 45) {
|
|
3872
|
+
if (M_walkmove(self, yaw + i, dist, context)) {
|
|
3873
|
+
if (i !== 0) {
|
|
3874
|
+
self.ideal_yaw = angleMod(yaw + i);
|
|
3875
|
+
}
|
|
3876
|
+
return true;
|
|
3877
|
+
}
|
|
3878
|
+
if (i !== 0) {
|
|
3879
|
+
if (M_walkmove(self, yaw - i, dist, context)) {
|
|
3880
|
+
self.ideal_yaw = angleMod(yaw - i);
|
|
3881
|
+
return true;
|
|
3882
|
+
}
|
|
3883
|
+
}
|
|
3884
|
+
}
|
|
3885
|
+
return false;
|
|
3886
|
+
}
|
|
3887
|
+
function SV_NewChaseDir(self, enemy, dist, context) {
|
|
3888
|
+
if (!enemy) return;
|
|
3889
|
+
const olddir = angleMod(self.ideal_yaw - self.angles.y);
|
|
3890
|
+
const turnaround = Math.abs(olddir - 180) < 20;
|
|
3891
|
+
const dx = enemy.origin.x - self.origin.x;
|
|
3892
|
+
const dy = enemy.origin.y - self.origin.y;
|
|
3893
|
+
if (Math.abs(dx) > Math.abs(dy)) {
|
|
3894
|
+
if (dx > 0) self.ideal_yaw = 0;
|
|
3895
|
+
else self.ideal_yaw = 180;
|
|
3896
|
+
} else {
|
|
3897
|
+
if (dy > 0) self.ideal_yaw = 90;
|
|
3898
|
+
else self.ideal_yaw = 270;
|
|
3899
|
+
}
|
|
3900
|
+
if (turnaround) {
|
|
3901
|
+
self.ideal_yaw = angleMod(self.ideal_yaw + 180);
|
|
3902
|
+
}
|
|
3903
|
+
SV_StepDirection(self, self.ideal_yaw, dist, context);
|
|
3904
|
+
}
|
|
3664
3905
|
|
|
3665
3906
|
// src/ai/targeting.ts
|
|
3666
3907
|
function setIdealYawTowards2(self, other) {
|
|
@@ -5965,6 +6206,7 @@ export {
|
|
|
5965
6206
|
AmmoItemId,
|
|
5966
6207
|
AmmoType,
|
|
5967
6208
|
ArmorType,
|
|
6209
|
+
CheckGround,
|
|
5968
6210
|
DamageFlags,
|
|
5969
6211
|
DamageMod,
|
|
5970
6212
|
DeadFlag,
|
|
@@ -5978,7 +6220,9 @@ export {
|
|
|
5978
6220
|
HEALTH_ITEMS,
|
|
5979
6221
|
KEY_ITEMS,
|
|
5980
6222
|
KeyId,
|
|
6223
|
+
M_CheckBottom,
|
|
5981
6224
|
M_MoveFrame,
|
|
6225
|
+
M_walkmove,
|
|
5982
6226
|
MoveType,
|
|
5983
6227
|
ORDERED_DAMAGE_MODS,
|
|
5984
6228
|
POWERUP_ITEMS,
|
|
@@ -5989,6 +6233,8 @@ export {
|
|
|
5989
6233
|
RangeCategory,
|
|
5990
6234
|
SAVE_FORMAT_VERSION,
|
|
5991
6235
|
SPAWNFLAG_MONSTER_AMBUSH,
|
|
6236
|
+
SV_NewChaseDir,
|
|
6237
|
+
SV_StepDirection,
|
|
5992
6238
|
SaveStorage,
|
|
5993
6239
|
ServerFlags,
|
|
5994
6240
|
Solid,
|