quake2ts 0.0.297 → 0.0.299
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/cgame/dist/index.cjs +55 -2
- package/packages/cgame/dist/index.cjs.map +1 -1
- package/packages/cgame/dist/index.d.cts +7 -0
- package/packages/cgame/dist/index.d.ts +7 -0
- package/packages/cgame/dist/index.js +56 -3
- package/packages/cgame/dist/index.js.map +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 +76 -19
- package/packages/client/dist/cjs/index.cjs.map +1 -1
- package/packages/client/dist/esm/index.js +71 -14
- package/packages/client/dist/esm/index.js.map +1 -1
- package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/client/dist/types/cgameBridge.d.ts.map +1 -1
- package/packages/client/dist/types/input/controller.d.ts +1 -0
- package/packages/client/dist/types/input/controller.d.ts.map +1 -1
- package/packages/client/dist/types/net/connection.d.ts +3 -0
- package/packages/client/dist/types/net/connection.d.ts.map +1 -1
- package/packages/engine/dist/browser/index.global.js +8 -8
- 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/engine/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/game/dist/browser/index.global.js +4 -4
- package/packages/game/dist/browser/index.global.js.map +1 -1
- package/packages/game/dist/cjs/index.cjs +67 -20
- package/packages/game/dist/cjs/index.cjs.map +1 -1
- package/packages/game/dist/esm/index.js +67 -20
- 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.map +1 -1
- package/packages/server/dist/index.cjs +9 -2
- package/packages/server/dist/index.js +9 -2
- 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 +1342 -1038
- package/packages/shared/dist/cjs/index.cjs.map +1 -1
- package/packages/shared/dist/esm/index.js +1340 -1038
- package/packages/shared/dist/esm/index.js.map +1 -1
- package/packages/shared/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/shared/dist/types/pmove/jump.d.ts +2 -0
- package/packages/shared/dist/types/pmove/jump.d.ts.map +1 -1
- package/packages/shared/dist/types/pmove/move.d.ts +20 -0
- package/packages/shared/dist/types/pmove/move.d.ts.map +1 -1
- package/packages/shared/dist/types/pmove/pmove.d.ts +5 -1
- package/packages/shared/dist/types/pmove/pmove.d.ts.map +1 -1
- package/packages/shared/dist/types/pmove/types.d.ts +25 -1
- package/packages/shared/dist/types/pmove/types.d.ts.map +1 -1
- package/packages/shared/dist/types/protocol/usercmd.d.ts +3 -0
- package/packages/shared/dist/types/protocol/usercmd.d.ts.map +1 -1
- package/packages/tools/dist/tsconfig.tsbuildinfo +1 -1
|
@@ -17,6 +17,9 @@ interface CGameImport {
|
|
|
17
17
|
TagFree(ptr: unknown): void;
|
|
18
18
|
FreeTags(tag: number): void;
|
|
19
19
|
cvar(name: string, value: string, flags: number): unknown;
|
|
20
|
+
Cvar_Get(name: string, value: string, flags: number): {
|
|
21
|
+
value: number;
|
|
22
|
+
};
|
|
20
23
|
cvar_set(name: string, value: string): void;
|
|
21
24
|
cvar_forceset(name: string, value: string): void;
|
|
22
25
|
CL_FrameValid(): boolean;
|
|
@@ -119,9 +122,13 @@ declare class ClientPrediction {
|
|
|
119
122
|
private baseFrame;
|
|
120
123
|
private commands;
|
|
121
124
|
private predicted;
|
|
125
|
+
private predictionError;
|
|
122
126
|
constructor(trace: PmoveTraceFn, pointContents: (p: Vec3) => number, settings?: Partial<PredictionSettings>);
|
|
123
127
|
setAuthoritative(frame: GameFrameResult<PredictionState>): PredictionState;
|
|
128
|
+
getPredictionError(): Vec3;
|
|
129
|
+
decayError(frametime: number): void;
|
|
124
130
|
enqueueCommand(cmd: UserCommand): PredictionState;
|
|
131
|
+
getCommand(sequence: number): UserCommand | undefined;
|
|
125
132
|
getPredictedState(): PredictionState;
|
|
126
133
|
private recompute;
|
|
127
134
|
}
|
|
@@ -17,6 +17,9 @@ interface CGameImport {
|
|
|
17
17
|
TagFree(ptr: unknown): void;
|
|
18
18
|
FreeTags(tag: number): void;
|
|
19
19
|
cvar(name: string, value: string, flags: number): unknown;
|
|
20
|
+
Cvar_Get(name: string, value: string, flags: number): {
|
|
21
|
+
value: number;
|
|
22
|
+
};
|
|
20
23
|
cvar_set(name: string, value: string): void;
|
|
21
24
|
cvar_forceset(name: string, value: string): void;
|
|
22
25
|
CL_FrameValid(): boolean;
|
|
@@ -119,9 +122,13 @@ declare class ClientPrediction {
|
|
|
119
122
|
private baseFrame;
|
|
120
123
|
private commands;
|
|
121
124
|
private predicted;
|
|
125
|
+
private predictionError;
|
|
122
126
|
constructor(trace: PmoveTraceFn, pointContents: (p: Vec3) => number, settings?: Partial<PredictionSettings>);
|
|
123
127
|
setAuthoritative(frame: GameFrameResult<PredictionState>): PredictionState;
|
|
128
|
+
getPredictionError(): Vec3;
|
|
129
|
+
decayError(frametime: number): void;
|
|
124
130
|
enqueueCommand(cmd: UserCommand): PredictionState;
|
|
131
|
+
getCommand(sequence: number): UserCommand | undefined;
|
|
125
132
|
getPredictedState(): PredictionState;
|
|
126
133
|
private recompute;
|
|
127
134
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { angleVectors, clampViewAngles, ZERO_VEC3, hasPmFlag, PmFlag, dotVec3, PmType, WaterLevel, angleMod, applyPmove, PlayerStat, PowerupId, G_GetPowerupStat, WEAPON_WHEEL_ORDER, WEAPON_AMMO_MAP, G_GetAmmoStat, ConfigStringIndex, MAX_MODELS, MAX_SOUNDS, MAX_IMAGES } from '@quake2ts/shared';
|
|
1
|
+
import { angleVectors, clampViewAngles, ZERO_VEC3, hasPmFlag, PmFlag, dotVec3, PmType, WaterLevel, subtractVec3, lengthVec3, scaleVec3, angleMod, applyPmove, PlayerStat, PowerupId, G_GetPowerupStat, WEAPON_WHEEL_ORDER, WEAPON_AMMO_MAP, G_GetAmmoStat, ConfigStringIndex, MAX_MODELS, MAX_SOUNDS, MAX_IMAGES } from '@quake2ts/shared';
|
|
2
2
|
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __export = (target, all) => {
|
|
@@ -928,6 +928,7 @@ var DEFAULTS = {
|
|
|
928
928
|
};
|
|
929
929
|
var DEFAULT_GRAVITY = 800;
|
|
930
930
|
var ZERO_VEC32 = { x: 0, y: 0, z: 0 };
|
|
931
|
+
var CMD_BACKUP = 64;
|
|
931
932
|
function defaultPredictionState() {
|
|
932
933
|
return {
|
|
933
934
|
origin: ZERO_VEC32,
|
|
@@ -1032,7 +1033,9 @@ function simulateCommand(state, cmd, settings, trace, pointContents) {
|
|
|
1032
1033
|
forwardmove: cmd.forwardmove,
|
|
1033
1034
|
sidemove: cmd.sidemove,
|
|
1034
1035
|
upmove: cmd.upmove,
|
|
1035
|
-
buttons: cmd.buttons
|
|
1036
|
+
buttons: cmd.buttons,
|
|
1037
|
+
angles: cmd.angles
|
|
1038
|
+
// Added missing property
|
|
1036
1039
|
};
|
|
1037
1040
|
const newState = applyPmove(state, pmoveCmd, trace, pointContents);
|
|
1038
1041
|
const { viewangles } = clampViewAngles({
|
|
@@ -1054,6 +1057,7 @@ var ClientPrediction = class {
|
|
|
1054
1057
|
};
|
|
1055
1058
|
this.commands = [];
|
|
1056
1059
|
this.predicted = defaultPredictionState();
|
|
1060
|
+
this.predictionError = ZERO_VEC32;
|
|
1057
1061
|
this.settings = { ...DEFAULTS, ...settings };
|
|
1058
1062
|
this.trace = trace;
|
|
1059
1063
|
this.pointContents = pointContents;
|
|
@@ -1061,14 +1065,57 @@ var ClientPrediction = class {
|
|
|
1061
1065
|
}
|
|
1062
1066
|
setAuthoritative(frame) {
|
|
1063
1067
|
const normalized = normalizeState(frame.state);
|
|
1068
|
+
if (frame.frame <= this.baseFrame.frame) {
|
|
1069
|
+
return this.predicted;
|
|
1070
|
+
}
|
|
1071
|
+
let predictedAtFrame;
|
|
1072
|
+
const relevantCommands = this.commands.filter((c) => c.sequence <= frame.frame && c.sequence > this.baseFrame.frame);
|
|
1073
|
+
if (relevantCommands.length > 0 || this.baseFrame.frame === frame.frame) {
|
|
1074
|
+
let tempState = normalizeState(this.baseFrame.state);
|
|
1075
|
+
for (const cmd of relevantCommands) {
|
|
1076
|
+
tempState = simulateCommand(tempState, cmd, this.settings, this.trace, this.pointContents);
|
|
1077
|
+
}
|
|
1078
|
+
predictedAtFrame = tempState;
|
|
1079
|
+
}
|
|
1080
|
+
if (predictedAtFrame) {
|
|
1081
|
+
const error = subtractVec3(predictedAtFrame.origin, normalized.origin);
|
|
1082
|
+
const errorLen = lengthVec3(error);
|
|
1083
|
+
if (errorLen > 10) {
|
|
1084
|
+
this.predictionError = ZERO_VEC32;
|
|
1085
|
+
} else if (errorLen > 0.1) {
|
|
1086
|
+
this.predictionError = error;
|
|
1087
|
+
} else {
|
|
1088
|
+
this.predictionError = ZERO_VEC32;
|
|
1089
|
+
}
|
|
1090
|
+
} else {
|
|
1091
|
+
this.predictionError = ZERO_VEC32;
|
|
1092
|
+
}
|
|
1064
1093
|
this.baseFrame = { ...frame, state: normalized };
|
|
1065
|
-
this.commands = this.commands.filter((cmd) =>
|
|
1094
|
+
this.commands = this.commands.filter((cmd) => cmd.sequence > frame.frame);
|
|
1066
1095
|
return this.recompute();
|
|
1067
1096
|
}
|
|
1097
|
+
getPredictionError() {
|
|
1098
|
+
return this.predictionError;
|
|
1099
|
+
}
|
|
1100
|
+
// Decay error over time - usually called once per client frame
|
|
1101
|
+
decayError(frametime) {
|
|
1102
|
+
const len2 = lengthVec3(this.predictionError);
|
|
1103
|
+
if (len2 > 0) {
|
|
1104
|
+
const decay = len2 * 10 * frametime;
|
|
1105
|
+
const scale2 = Math.max(0, len2 - decay) / len2;
|
|
1106
|
+
this.predictionError = scaleVec3(this.predictionError, scale2);
|
|
1107
|
+
}
|
|
1108
|
+
}
|
|
1068
1109
|
enqueueCommand(cmd) {
|
|
1069
1110
|
this.commands.push(cmd);
|
|
1111
|
+
if (this.commands.length > CMD_BACKUP) {
|
|
1112
|
+
this.commands.shift();
|
|
1113
|
+
}
|
|
1070
1114
|
return this.recompute();
|
|
1071
1115
|
}
|
|
1116
|
+
getCommand(sequence) {
|
|
1117
|
+
return this.commands.find((c) => c.sequence === sequence);
|
|
1118
|
+
}
|
|
1072
1119
|
getPredictedState() {
|
|
1073
1120
|
return this.predicted;
|
|
1074
1121
|
}
|
|
@@ -1084,6 +1131,7 @@ var ClientPrediction = class {
|
|
|
1084
1131
|
|
|
1085
1132
|
// src/index.ts
|
|
1086
1133
|
var cgi2 = null;
|
|
1134
|
+
var cg_predict = null;
|
|
1087
1135
|
function Init() {
|
|
1088
1136
|
if (!cgi2) {
|
|
1089
1137
|
console.error("CGame Init: cgame imports not set");
|
|
@@ -1091,6 +1139,8 @@ function Init() {
|
|
|
1091
1139
|
}
|
|
1092
1140
|
cgi2.Com_Print("===== CGame Initialization =====\n");
|
|
1093
1141
|
CG_InitScreen(cgi2);
|
|
1142
|
+
cg_predict = cgi2.Cvar_Get("cg_predict", "1", 0);
|
|
1143
|
+
cgi2.Cvar_Get("cg_showmiss", "0", 0);
|
|
1094
1144
|
cgi2.Com_Print("CGame initialized\n");
|
|
1095
1145
|
}
|
|
1096
1146
|
function Shutdown() {
|
|
@@ -1152,6 +1202,9 @@ function Pmove(pmove) {
|
|
|
1152
1202
|
if (!pm || !pm.s || !pm.cmd || !cgi2) {
|
|
1153
1203
|
return;
|
|
1154
1204
|
}
|
|
1205
|
+
if (cg_predict && cg_predict.value === 0) {
|
|
1206
|
+
return;
|
|
1207
|
+
}
|
|
1155
1208
|
const traceAdapter = (start, end, mins, maxs) => {
|
|
1156
1209
|
const zero2 = { x: 0, y: 0, z: 0 };
|
|
1157
1210
|
return cgi2.PM_Trace(
|