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
|
@@ -27,6 +27,7 @@ __export(index_exports, {
|
|
|
27
27
|
AmmoItemId: () => AmmoItemId,
|
|
28
28
|
AmmoType: () => AmmoType,
|
|
29
29
|
ArmorType: () => ArmorType,
|
|
30
|
+
CheckGround: () => CheckGround,
|
|
30
31
|
DamageFlags: () => DamageFlags,
|
|
31
32
|
DamageMod: () => DamageMod,
|
|
32
33
|
DeadFlag: () => DeadFlag,
|
|
@@ -40,7 +41,9 @@ __export(index_exports, {
|
|
|
40
41
|
HEALTH_ITEMS: () => HEALTH_ITEMS,
|
|
41
42
|
KEY_ITEMS: () => KEY_ITEMS,
|
|
42
43
|
KeyId: () => KeyId,
|
|
44
|
+
M_CheckBottom: () => M_CheckBottom,
|
|
43
45
|
M_MoveFrame: () => M_MoveFrame,
|
|
46
|
+
M_walkmove: () => M_walkmove,
|
|
44
47
|
MoveType: () => MoveType,
|
|
45
48
|
ORDERED_DAMAGE_MODS: () => ORDERED_DAMAGE_MODS,
|
|
46
49
|
POWERUP_ITEMS: () => POWERUP_ITEMS,
|
|
@@ -51,6 +54,8 @@ __export(index_exports, {
|
|
|
51
54
|
RangeCategory: () => RangeCategory,
|
|
52
55
|
SAVE_FORMAT_VERSION: () => SAVE_FORMAT_VERSION,
|
|
53
56
|
SPAWNFLAG_MONSTER_AMBUSH: () => SPAWNFLAG_MONSTER_AMBUSH,
|
|
57
|
+
SV_NewChaseDir: () => SV_NewChaseDir,
|
|
58
|
+
SV_StepDirection: () => SV_StepDirection,
|
|
54
59
|
SaveStorage: () => SaveStorage,
|
|
55
60
|
ServerFlags: () => ServerFlags,
|
|
56
61
|
Solid: () => Solid,
|
|
@@ -148,6 +153,11 @@ __export(index_exports, {
|
|
|
148
153
|
module.exports = __toCommonJS(index_exports);
|
|
149
154
|
|
|
150
155
|
// ../shared/dist/esm/index.js
|
|
156
|
+
var __defProp2 = Object.defineProperty;
|
|
157
|
+
var __export2 = (target, all) => {
|
|
158
|
+
for (var name in all)
|
|
159
|
+
__defProp2(target, name, { get: all[name], enumerable: true });
|
|
160
|
+
};
|
|
151
161
|
var ZERO_VEC3 = { x: 0, y: 0, z: 0 };
|
|
152
162
|
var STOP_EPSILON = 0.1;
|
|
153
163
|
var DEG_TO_RAD = Math.PI / 180;
|
|
@@ -590,6 +600,41 @@ var ConfigStringIndex = ((ConfigStringIndex2) => {
|
|
|
590
600
|
return ConfigStringIndex2;
|
|
591
601
|
})(ConfigStringIndex || {});
|
|
592
602
|
var MAX_CONFIGSTRINGS = ConfigStringIndex.MaxConfigStrings;
|
|
603
|
+
var replay_exports = {};
|
|
604
|
+
__export2(replay_exports, {
|
|
605
|
+
addReplayFrame: () => addReplayFrame,
|
|
606
|
+
createReplaySession: () => createReplaySession,
|
|
607
|
+
deserializeReplay: () => deserializeReplay,
|
|
608
|
+
serializeReplay: () => serializeReplay
|
|
609
|
+
});
|
|
610
|
+
function serializeReplay(session) {
|
|
611
|
+
return JSON.stringify(session, null, 2);
|
|
612
|
+
}
|
|
613
|
+
function deserializeReplay(json) {
|
|
614
|
+
const session = JSON.parse(json);
|
|
615
|
+
if (!session.metadata || !Array.isArray(session.frames)) {
|
|
616
|
+
throw new Error("Invalid replay format: missing metadata or frames");
|
|
617
|
+
}
|
|
618
|
+
return session;
|
|
619
|
+
}
|
|
620
|
+
function createReplaySession(map, seed) {
|
|
621
|
+
return {
|
|
622
|
+
metadata: {
|
|
623
|
+
map,
|
|
624
|
+
date: (/* @__PURE__ */ new Date()).toISOString(),
|
|
625
|
+
version: "1.0",
|
|
626
|
+
seed
|
|
627
|
+
},
|
|
628
|
+
frames: []
|
|
629
|
+
};
|
|
630
|
+
}
|
|
631
|
+
function addReplayFrame(session, cmd, serverFrame, startTime) {
|
|
632
|
+
session.frames.push({
|
|
633
|
+
serverFrame,
|
|
634
|
+
cmd,
|
|
635
|
+
timestamp: Date.now() - startTime
|
|
636
|
+
});
|
|
637
|
+
}
|
|
593
638
|
var WaterLevel = /* @__PURE__ */ ((WaterLevel3) => {
|
|
594
639
|
WaterLevel3[WaterLevel3["None"] = 0] = "None";
|
|
595
640
|
WaterLevel3[WaterLevel3["Feet"] = 1] = "Feet";
|
|
@@ -1059,8 +1104,23 @@ var ENTITY_FIELD_METADATA = [
|
|
|
1059
1104
|
// src/physics/movement.ts
|
|
1060
1105
|
function runGravity(ent, gravity, frametime) {
|
|
1061
1106
|
if (ent.movetype === 7 /* Toss */) {
|
|
1062
|
-
|
|
1063
|
-
|
|
1107
|
+
if (ent.waterlevel > 1) {
|
|
1108
|
+
const speed = Math.sqrt(ent.velocity.x * ent.velocity.x + ent.velocity.y * ent.velocity.y + ent.velocity.z * ent.velocity.z);
|
|
1109
|
+
if (speed > 1) {
|
|
1110
|
+
const newspeed = speed - frametime * speed * 2;
|
|
1111
|
+
if (newspeed < 0) {
|
|
1112
|
+
ent.velocity = { x: 0, y: 0, z: 0 };
|
|
1113
|
+
} else {
|
|
1114
|
+
const scale = newspeed / speed;
|
|
1115
|
+
ent.velocity = scaleVec3(ent.velocity, scale);
|
|
1116
|
+
}
|
|
1117
|
+
}
|
|
1118
|
+
ent.velocity = addVec3(ent.velocity, scaleVec3(gravity, ent.gravity * frametime * 0.1));
|
|
1119
|
+
ent.origin = addVec3(ent.origin, scaleVec3(ent.velocity, frametime));
|
|
1120
|
+
} else {
|
|
1121
|
+
ent.velocity = addVec3(ent.velocity, scaleVec3(gravity, ent.gravity * frametime));
|
|
1122
|
+
ent.origin = addVec3(ent.origin, scaleVec3(ent.velocity, frametime));
|
|
1123
|
+
}
|
|
1064
1124
|
}
|
|
1065
1125
|
}
|
|
1066
1126
|
function runBouncing(ent, imports, frametime) {
|
|
@@ -1209,6 +1269,64 @@ function runPush(pusher, system, imports, frametime) {
|
|
|
1209
1269
|
return true;
|
|
1210
1270
|
}
|
|
1211
1271
|
|
|
1272
|
+
// src/physics/fluid.ts
|
|
1273
|
+
function checkWater2(ent, system, imports) {
|
|
1274
|
+
const origin = ent.origin;
|
|
1275
|
+
const mins = ent.mins;
|
|
1276
|
+
const maxs = ent.maxs;
|
|
1277
|
+
const point = {
|
|
1278
|
+
x: origin.x + (mins.x + maxs.x) * 0.5,
|
|
1279
|
+
y: origin.y + (mins.y + maxs.y) * 0.5,
|
|
1280
|
+
z: origin.z + mins.z + 1
|
|
1281
|
+
};
|
|
1282
|
+
let cont = imports.pointcontents(point);
|
|
1283
|
+
if ((cont & MASK_WATER) === 0) {
|
|
1284
|
+
if (ent.waterlevel > 0) {
|
|
1285
|
+
playLeaveWaterSound(ent, system);
|
|
1286
|
+
ent.flags &= ~2 /* Swim */;
|
|
1287
|
+
}
|
|
1288
|
+
ent.waterlevel = 0;
|
|
1289
|
+
ent.watertype = 0;
|
|
1290
|
+
return;
|
|
1291
|
+
}
|
|
1292
|
+
ent.watertype = cont;
|
|
1293
|
+
ent.waterlevel = 1;
|
|
1294
|
+
const waistZ = origin.z + mins.z + (maxs.z - mins.z) * 0.5;
|
|
1295
|
+
const headZ = origin.z + maxs.z - 1;
|
|
1296
|
+
const waistPoint = { ...point, z: waistZ };
|
|
1297
|
+
cont = imports.pointcontents(waistPoint);
|
|
1298
|
+
if (cont & MASK_WATER) {
|
|
1299
|
+
ent.waterlevel = 2;
|
|
1300
|
+
const headPoint = { ...point, z: headZ };
|
|
1301
|
+
cont = imports.pointcontents(headPoint);
|
|
1302
|
+
if (cont & MASK_WATER) {
|
|
1303
|
+
ent.waterlevel = 3;
|
|
1304
|
+
}
|
|
1305
|
+
}
|
|
1306
|
+
if ((ent.flags & 2 /* Swim */) === 0) {
|
|
1307
|
+
playEnterWaterSound(ent, system);
|
|
1308
|
+
ent.flags |= 2 /* Swim */;
|
|
1309
|
+
}
|
|
1310
|
+
}
|
|
1311
|
+
function playEnterWaterSound(ent, system) {
|
|
1312
|
+
if (ent.watertype & CONTENTS_LAVA) {
|
|
1313
|
+
system.sound(ent, 0, "player/lava_in.wav", 1, 1, 0);
|
|
1314
|
+
} else if (ent.watertype & CONTENTS_SLIME) {
|
|
1315
|
+
system.sound(ent, 0, "player/watr_in.wav", 1, 1, 0);
|
|
1316
|
+
} else if (ent.watertype & CONTENTS_WATER) {
|
|
1317
|
+
system.sound(ent, 0, "player/watr_in.wav", 1, 1, 0);
|
|
1318
|
+
}
|
|
1319
|
+
}
|
|
1320
|
+
function playLeaveWaterSound(ent, system) {
|
|
1321
|
+
if (ent.watertype & CONTENTS_LAVA) {
|
|
1322
|
+
system.sound(ent, 0, "player/lava_out.wav", 1, 1, 0);
|
|
1323
|
+
} else if (ent.watertype & CONTENTS_SLIME) {
|
|
1324
|
+
system.sound(ent, 0, "player/watr_out.wav", 1, 1, 0);
|
|
1325
|
+
} else if (ent.watertype & CONTENTS_WATER) {
|
|
1326
|
+
system.sound(ent, 0, "player/watr_out.wav", 1, 1, 0);
|
|
1327
|
+
}
|
|
1328
|
+
}
|
|
1329
|
+
|
|
1212
1330
|
// src/entities/pool.ts
|
|
1213
1331
|
var MAX_EDICTS = 2048;
|
|
1214
1332
|
var WORLD_INDEX = 0;
|
|
@@ -1676,6 +1794,9 @@ var EntitySystem = class {
|
|
|
1676
1794
|
if (!ent.inUse || ent.freePending) {
|
|
1677
1795
|
continue;
|
|
1678
1796
|
}
|
|
1797
|
+
if (ent.movetype !== 0 /* None */ && ent.movetype !== 2 /* Push */ && ent.movetype !== 3 /* Stop */ && ent.movetype !== 1 /* Noclip */) {
|
|
1798
|
+
checkWater2(ent, this, this.imports);
|
|
1799
|
+
}
|
|
1679
1800
|
const frametime = this.currentTimeSeconds - (ent.timestamp || 0);
|
|
1680
1801
|
switch (ent.movetype) {
|
|
1681
1802
|
case 7 /* Toss */:
|
|
@@ -3810,6 +3931,131 @@ function ai_charge(self, distance2, deltaSeconds) {
|
|
|
3810
3931
|
walkMove(self, self.angles.y, distance2);
|
|
3811
3932
|
}
|
|
3812
3933
|
}
|
|
3934
|
+
function CheckGround(self, context) {
|
|
3935
|
+
if (self.movetype === 1 /* Noclip */) {
|
|
3936
|
+
return;
|
|
3937
|
+
}
|
|
3938
|
+
const point = {
|
|
3939
|
+
x: self.origin.x,
|
|
3940
|
+
y: self.origin.y,
|
|
3941
|
+
z: self.origin.z + self.mins.z - 1
|
|
3942
|
+
};
|
|
3943
|
+
const trace = context.trace(self.origin, self.mins, self.maxs, point, self, MASK_MONSTERSOLID);
|
|
3944
|
+
self.groundentity = trace.ent;
|
|
3945
|
+
if (!self.groundentity && !trace.allsolid && !trace.startsolid && trace.fraction === 1) {
|
|
3946
|
+
const content = context.pointcontents(point);
|
|
3947
|
+
if (content & MASK_WATER) {
|
|
3948
|
+
self.waterlevel = 1;
|
|
3949
|
+
self.watertype = content;
|
|
3950
|
+
} else {
|
|
3951
|
+
self.waterlevel = 0;
|
|
3952
|
+
self.watertype = 0;
|
|
3953
|
+
}
|
|
3954
|
+
}
|
|
3955
|
+
}
|
|
3956
|
+
function M_CheckBottom(self, context) {
|
|
3957
|
+
const mins = {
|
|
3958
|
+
x: self.origin.x + self.mins.x,
|
|
3959
|
+
y: self.origin.y + self.mins.y,
|
|
3960
|
+
z: self.origin.z + self.mins.z
|
|
3961
|
+
};
|
|
3962
|
+
const maxs = {
|
|
3963
|
+
x: self.origin.x + self.maxs.x,
|
|
3964
|
+
y: self.origin.y + self.maxs.y,
|
|
3965
|
+
z: self.origin.z + self.maxs.z
|
|
3966
|
+
};
|
|
3967
|
+
let start = { x: 0, y: 0, z: 0 };
|
|
3968
|
+
let stop = { x: 0, y: 0, z: 0 };
|
|
3969
|
+
for (let i = 0; i < 2; i++) {
|
|
3970
|
+
if (i === 1) start = { x: mins.x, y: mins.y, z: 0 };
|
|
3971
|
+
else start = { x: maxs.x, y: mins.y, z: 0 };
|
|
3972
|
+
start.z = mins.z - 1;
|
|
3973
|
+
if (context.pointcontents(start) !== 0) return true;
|
|
3974
|
+
stop = { ...start };
|
|
3975
|
+
stop.z = start.z - 60;
|
|
3976
|
+
const trace = context.trace(start, null, null, stop, self, MASK_MONSTERSOLID);
|
|
3977
|
+
if (trace.fraction < 1) return true;
|
|
3978
|
+
if (i === 1) start = { x: mins.x, y: maxs.y, z: 0 };
|
|
3979
|
+
else start = { x: maxs.x, y: maxs.y, z: 0 };
|
|
3980
|
+
start.z = mins.z - 1;
|
|
3981
|
+
if (context.pointcontents(start) !== 0) return true;
|
|
3982
|
+
stop = { ...start };
|
|
3983
|
+
stop.z = start.z - 60;
|
|
3984
|
+
const trace2 = context.trace(start, null, null, stop, self, MASK_MONSTERSOLID);
|
|
3985
|
+
if (trace2.fraction < 1) return true;
|
|
3986
|
+
}
|
|
3987
|
+
return false;
|
|
3988
|
+
}
|
|
3989
|
+
function M_walkmove(self, yawDegrees, distance2, context) {
|
|
3990
|
+
if (!((self.flags & (2 /* Swim */ | 1 /* Fly */)) !== 0) && self.movetype !== 1 /* Noclip */) {
|
|
3991
|
+
if (!self.groundentity && self.waterlevel === 0) {
|
|
3992
|
+
return false;
|
|
3993
|
+
}
|
|
3994
|
+
}
|
|
3995
|
+
const delta = yawVector(yawDegrees, distance2);
|
|
3996
|
+
if ((self.monsterinfo.aiflags & 1024 /* NoStep */) !== 0 && (self.monsterinfo.aiflags & 1073741824 /* Pathing */) !== 0) {
|
|
3997
|
+
}
|
|
3998
|
+
const dest = {
|
|
3999
|
+
x: self.origin.x + delta.x,
|
|
4000
|
+
y: self.origin.y + delta.y,
|
|
4001
|
+
z: self.origin.z + delta.z
|
|
4002
|
+
};
|
|
4003
|
+
const trace = context.trace(self.origin, self.mins, self.maxs, dest, self, MASK_MONSTERSOLID);
|
|
4004
|
+
if (trace.fraction < 1) {
|
|
4005
|
+
return false;
|
|
4006
|
+
}
|
|
4007
|
+
const oldOrigin = { ...self.origin };
|
|
4008
|
+
self.origin.x = dest.x;
|
|
4009
|
+
self.origin.y = dest.y;
|
|
4010
|
+
self.origin.z = dest.z;
|
|
4011
|
+
if (!((self.flags & (2 /* Swim */ | 1 /* Fly */)) !== 0) && self.movetype !== 1 /* Noclip */) {
|
|
4012
|
+
if (!M_CheckBottom(self, context)) {
|
|
4013
|
+
self.origin.x = oldOrigin.x;
|
|
4014
|
+
self.origin.y = oldOrigin.y;
|
|
4015
|
+
self.origin.z = oldOrigin.z;
|
|
4016
|
+
return false;
|
|
4017
|
+
}
|
|
4018
|
+
}
|
|
4019
|
+
if (!((self.flags & (2 /* Swim */ | 1 /* Fly */)) !== 0)) {
|
|
4020
|
+
CheckGround(self, context);
|
|
4021
|
+
}
|
|
4022
|
+
return true;
|
|
4023
|
+
}
|
|
4024
|
+
function SV_StepDirection(self, yaw, dist, context) {
|
|
4025
|
+
for (let i = 0; i <= 90; i += 45) {
|
|
4026
|
+
if (M_walkmove(self, yaw + i, dist, context)) {
|
|
4027
|
+
if (i !== 0) {
|
|
4028
|
+
self.ideal_yaw = angleMod(yaw + i);
|
|
4029
|
+
}
|
|
4030
|
+
return true;
|
|
4031
|
+
}
|
|
4032
|
+
if (i !== 0) {
|
|
4033
|
+
if (M_walkmove(self, yaw - i, dist, context)) {
|
|
4034
|
+
self.ideal_yaw = angleMod(yaw - i);
|
|
4035
|
+
return true;
|
|
4036
|
+
}
|
|
4037
|
+
}
|
|
4038
|
+
}
|
|
4039
|
+
return false;
|
|
4040
|
+
}
|
|
4041
|
+
function SV_NewChaseDir(self, enemy, dist, context) {
|
|
4042
|
+
if (!enemy) return;
|
|
4043
|
+
const olddir = angleMod(self.ideal_yaw - self.angles.y);
|
|
4044
|
+
const turnaround = Math.abs(olddir - 180) < 20;
|
|
4045
|
+
const dx = enemy.origin.x - self.origin.x;
|
|
4046
|
+
const dy = enemy.origin.y - self.origin.y;
|
|
4047
|
+
if (Math.abs(dx) > Math.abs(dy)) {
|
|
4048
|
+
if (dx > 0) self.ideal_yaw = 0;
|
|
4049
|
+
else self.ideal_yaw = 180;
|
|
4050
|
+
} else {
|
|
4051
|
+
if (dy > 0) self.ideal_yaw = 90;
|
|
4052
|
+
else self.ideal_yaw = 270;
|
|
4053
|
+
}
|
|
4054
|
+
if (turnaround) {
|
|
4055
|
+
self.ideal_yaw = angleMod(self.ideal_yaw + 180);
|
|
4056
|
+
}
|
|
4057
|
+
SV_StepDirection(self, self.ideal_yaw, dist, context);
|
|
4058
|
+
}
|
|
3813
4059
|
|
|
3814
4060
|
// src/ai/targeting.ts
|
|
3815
4061
|
function setIdealYawTowards2(self, other) {
|
|
@@ -6115,6 +6361,7 @@ function createGame({ trace, pointcontents }, engine, options) {
|
|
|
6115
6361
|
AmmoItemId,
|
|
6116
6362
|
AmmoType,
|
|
6117
6363
|
ArmorType,
|
|
6364
|
+
CheckGround,
|
|
6118
6365
|
DamageFlags,
|
|
6119
6366
|
DamageMod,
|
|
6120
6367
|
DeadFlag,
|
|
@@ -6128,7 +6375,9 @@ function createGame({ trace, pointcontents }, engine, options) {
|
|
|
6128
6375
|
HEALTH_ITEMS,
|
|
6129
6376
|
KEY_ITEMS,
|
|
6130
6377
|
KeyId,
|
|
6378
|
+
M_CheckBottom,
|
|
6131
6379
|
M_MoveFrame,
|
|
6380
|
+
M_walkmove,
|
|
6132
6381
|
MoveType,
|
|
6133
6382
|
ORDERED_DAMAGE_MODS,
|
|
6134
6383
|
POWERUP_ITEMS,
|
|
@@ -6139,6 +6388,8 @@ function createGame({ trace, pointcontents }, engine, options) {
|
|
|
6139
6388
|
RangeCategory,
|
|
6140
6389
|
SAVE_FORMAT_VERSION,
|
|
6141
6390
|
SPAWNFLAG_MONSTER_AMBUSH,
|
|
6391
|
+
SV_NewChaseDir,
|
|
6392
|
+
SV_StepDirection,
|
|
6142
6393
|
SaveStorage,
|
|
6143
6394
|
ServerFlags,
|
|
6144
6395
|
Solid,
|