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.
Files changed (52) hide show
  1. package/package.json +1 -1
  2. package/packages/cgame/dist/index.cjs +55 -2
  3. package/packages/cgame/dist/index.cjs.map +1 -1
  4. package/packages/cgame/dist/index.d.cts +7 -0
  5. package/packages/cgame/dist/index.d.ts +7 -0
  6. package/packages/cgame/dist/index.js +56 -3
  7. package/packages/cgame/dist/index.js.map +1 -1
  8. package/packages/client/dist/browser/index.global.js +13 -13
  9. package/packages/client/dist/browser/index.global.js.map +1 -1
  10. package/packages/client/dist/cjs/index.cjs +76 -19
  11. package/packages/client/dist/cjs/index.cjs.map +1 -1
  12. package/packages/client/dist/esm/index.js +71 -14
  13. package/packages/client/dist/esm/index.js.map +1 -1
  14. package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
  15. package/packages/client/dist/types/cgameBridge.d.ts.map +1 -1
  16. package/packages/client/dist/types/input/controller.d.ts +1 -0
  17. package/packages/client/dist/types/input/controller.d.ts.map +1 -1
  18. package/packages/client/dist/types/net/connection.d.ts +3 -0
  19. package/packages/client/dist/types/net/connection.d.ts.map +1 -1
  20. package/packages/engine/dist/browser/index.global.js +8 -8
  21. package/packages/engine/dist/browser/index.global.js.map +1 -1
  22. package/packages/engine/dist/cjs/index.cjs.map +1 -1
  23. package/packages/engine/dist/esm/index.js.map +1 -1
  24. package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
  25. package/packages/game/dist/browser/index.global.js +4 -4
  26. package/packages/game/dist/browser/index.global.js.map +1 -1
  27. package/packages/game/dist/cjs/index.cjs +67 -20
  28. package/packages/game/dist/cjs/index.cjs.map +1 -1
  29. package/packages/game/dist/esm/index.js +67 -20
  30. package/packages/game/dist/esm/index.js.map +1 -1
  31. package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
  32. package/packages/game/dist/types/ai/movement.d.ts.map +1 -1
  33. package/packages/server/dist/index.cjs +9 -2
  34. package/packages/server/dist/index.js +9 -2
  35. package/packages/shared/dist/browser/index.global.js +1 -1
  36. package/packages/shared/dist/browser/index.global.js.map +1 -1
  37. package/packages/shared/dist/cjs/index.cjs +1342 -1038
  38. package/packages/shared/dist/cjs/index.cjs.map +1 -1
  39. package/packages/shared/dist/esm/index.js +1340 -1038
  40. package/packages/shared/dist/esm/index.js.map +1 -1
  41. package/packages/shared/dist/tsconfig.tsbuildinfo +1 -1
  42. package/packages/shared/dist/types/pmove/jump.d.ts +2 -0
  43. package/packages/shared/dist/types/pmove/jump.d.ts.map +1 -1
  44. package/packages/shared/dist/types/pmove/move.d.ts +20 -0
  45. package/packages/shared/dist/types/pmove/move.d.ts.map +1 -1
  46. package/packages/shared/dist/types/pmove/pmove.d.ts +5 -1
  47. package/packages/shared/dist/types/pmove/pmove.d.ts.map +1 -1
  48. package/packages/shared/dist/types/pmove/types.d.ts +25 -1
  49. package/packages/shared/dist/types/pmove/types.d.ts.map +1 -1
  50. package/packages/shared/dist/types/protocol/usercmd.d.ts +3 -0
  51. package/packages/shared/dist/types/protocol/usercmd.d.ts.map +1 -1
  52. 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) => (cmd.serverFrame ?? Number.MAX_SAFE_INTEGER) > frame.frame);
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(