quake2ts 0.0.7 → 0.0.39

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 (177) hide show
  1. package/README.md +425 -0
  2. package/apps/viewer/dist/browser/index.global.js +1 -1
  3. package/apps/viewer/dist/browser/index.global.js.map +1 -1
  4. package/apps/viewer/dist/cjs/index.cjs +2097 -295
  5. package/apps/viewer/dist/cjs/index.cjs.map +1 -1
  6. package/apps/viewer/dist/esm/index.js +2097 -295
  7. package/apps/viewer/dist/esm/index.js.map +1 -1
  8. package/apps/viewer/dist/tsconfig.tsbuildinfo +1 -1
  9. package/apps/viewer/dist/types/index.d.ts +1 -1
  10. package/package.json +1 -1
  11. package/packages/client/dist/browser/index.global.js +1 -1
  12. package/packages/client/dist/browser/index.global.js.map +1 -1
  13. package/packages/client/dist/cjs/index.cjs +1200 -13
  14. package/packages/client/dist/cjs/index.cjs.map +1 -1
  15. package/packages/client/dist/esm/index.js +1186 -12
  16. package/packages/client/dist/esm/index.js.map +1 -1
  17. package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
  18. package/packages/client/dist/types/index.d.ts +14 -6
  19. package/packages/client/dist/types/index.d.ts.map +1 -1
  20. package/packages/client/dist/types/input/bindings.d.ts +18 -0
  21. package/packages/client/dist/types/input/bindings.d.ts.map +1 -0
  22. package/packages/client/dist/types/input/command-buffer.d.ts +15 -0
  23. package/packages/client/dist/types/input/command-buffer.d.ts.map +1 -0
  24. package/packages/client/dist/types/input/controller.d.ts +125 -0
  25. package/packages/client/dist/types/input/controller.d.ts.map +1 -0
  26. package/packages/client/dist/types/prediction.d.ts +38 -0
  27. package/packages/client/dist/types/prediction.d.ts.map +1 -0
  28. package/packages/client/dist/types/view-effects.d.ts +41 -0
  29. package/packages/client/dist/types/view-effects.d.ts.map +1 -0
  30. package/packages/engine/dist/browser/index.global.js +257 -1
  31. package/packages/engine/dist/browser/index.global.js.map +1 -1
  32. package/packages/engine/dist/cjs/index.cjs +2408 -2
  33. package/packages/engine/dist/cjs/index.cjs.map +1 -1
  34. package/packages/engine/dist/esm/index.js +2340 -2
  35. package/packages/engine/dist/esm/index.js.map +1 -1
  36. package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
  37. package/packages/engine/dist/types/assets/animation.d.ts +33 -0
  38. package/packages/engine/dist/types/assets/animation.d.ts.map +1 -0
  39. package/packages/engine/dist/types/assets/audio.d.ts +21 -0
  40. package/packages/engine/dist/types/assets/audio.d.ts.map +1 -0
  41. package/packages/engine/dist/types/assets/bsp.d.ts +1 -1
  42. package/packages/engine/dist/types/assets/bsp.d.ts.map +1 -1
  43. package/packages/engine/dist/types/assets/ingestion.d.ts +31 -0
  44. package/packages/engine/dist/types/assets/ingestion.d.ts.map +1 -1
  45. package/packages/engine/dist/types/assets/manager.d.ts +43 -0
  46. package/packages/engine/dist/types/assets/manager.d.ts.map +1 -0
  47. package/packages/engine/dist/types/assets/md3.d.ts +69 -0
  48. package/packages/engine/dist/types/assets/md3.d.ts.map +1 -0
  49. package/packages/engine/dist/types/assets/ogg.d.ts +12 -0
  50. package/packages/engine/dist/types/assets/ogg.d.ts.map +1 -0
  51. package/packages/engine/dist/types/assets/pakIndexStore.d.ts +19 -0
  52. package/packages/engine/dist/types/assets/pakIndexStore.d.ts.map +1 -0
  53. package/packages/engine/dist/types/assets/pakValidation.d.ts +28 -0
  54. package/packages/engine/dist/types/assets/pakValidation.d.ts.map +1 -0
  55. package/packages/engine/dist/types/assets/pcx.d.ts +13 -0
  56. package/packages/engine/dist/types/assets/pcx.d.ts.map +1 -0
  57. package/packages/engine/dist/types/assets/texture.d.ts +29 -0
  58. package/packages/engine/dist/types/assets/texture.d.ts.map +1 -0
  59. package/packages/engine/dist/types/assets/wal.d.ts +21 -0
  60. package/packages/engine/dist/types/assets/wal.d.ts.map +1 -0
  61. package/packages/engine/dist/types/assets/wav.d.ts +11 -0
  62. package/packages/engine/dist/types/assets/wav.d.ts.map +1 -0
  63. package/packages/engine/dist/types/audio/api.d.ts +29 -0
  64. package/packages/engine/dist/types/audio/api.d.ts.map +1 -0
  65. package/packages/engine/dist/types/audio/channels.d.ts +15 -0
  66. package/packages/engine/dist/types/audio/channels.d.ts.map +1 -0
  67. package/packages/engine/dist/types/audio/constants.d.ts +24 -0
  68. package/packages/engine/dist/types/audio/constants.d.ts.map +1 -0
  69. package/packages/engine/dist/types/audio/context.d.ts +67 -0
  70. package/packages/engine/dist/types/audio/context.d.ts.map +1 -0
  71. package/packages/engine/dist/types/audio/music.d.ts +42 -0
  72. package/packages/engine/dist/types/audio/music.d.ts.map +1 -0
  73. package/packages/engine/dist/types/audio/precache.d.ts +28 -0
  74. package/packages/engine/dist/types/audio/precache.d.ts.map +1 -0
  75. package/packages/engine/dist/types/audio/registry.d.ts +13 -0
  76. package/packages/engine/dist/types/audio/registry.d.ts.map +1 -0
  77. package/packages/engine/dist/types/audio/spatialization.d.ts +14 -0
  78. package/packages/engine/dist/types/audio/spatialization.d.ts.map +1 -0
  79. package/packages/engine/dist/types/audio/system.d.ts +101 -0
  80. package/packages/engine/dist/types/audio/system.d.ts.map +1 -0
  81. package/packages/engine/dist/types/configstrings.d.ts +1 -0
  82. package/packages/engine/dist/types/configstrings.d.ts.map +1 -1
  83. package/packages/engine/dist/types/index.d.ts +26 -1
  84. package/packages/engine/dist/types/index.d.ts.map +1 -1
  85. package/packages/engine/dist/types/render/bspPipeline.d.ts +42 -0
  86. package/packages/engine/dist/types/render/bspPipeline.d.ts.map +1 -0
  87. package/packages/engine/dist/types/render/bspTraversal.d.ts +11 -0
  88. package/packages/engine/dist/types/render/bspTraversal.d.ts.map +1 -0
  89. package/packages/engine/dist/types/render/culling.d.ts +8 -0
  90. package/packages/engine/dist/types/render/culling.d.ts.map +1 -0
  91. package/packages/engine/dist/types/render/md2Pipeline.d.ts +51 -0
  92. package/packages/engine/dist/types/render/md2Pipeline.d.ts.map +1 -0
  93. package/packages/engine/dist/types/render/resources.d.ts +10 -0
  94. package/packages/engine/dist/types/render/resources.d.ts.map +1 -1
  95. package/packages/engine/dist/types/render/skybox.d.ts +26 -0
  96. package/packages/engine/dist/types/render/skybox.d.ts.map +1 -0
  97. package/packages/game/dist/browser/index.global.js +1 -1
  98. package/packages/game/dist/browser/index.global.js.map +1 -1
  99. package/packages/game/dist/cjs/index.cjs +2926 -116
  100. package/packages/game/dist/cjs/index.cjs.map +1 -1
  101. package/packages/game/dist/esm/index.js +2863 -115
  102. package/packages/game/dist/esm/index.js.map +1 -1
  103. package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
  104. package/packages/game/dist/types/ai/constants.d.ts +13 -0
  105. package/packages/game/dist/types/ai/constants.d.ts.map +1 -0
  106. package/packages/game/dist/types/ai/index.d.ts +4 -0
  107. package/packages/game/dist/types/ai/index.d.ts.map +1 -0
  108. package/packages/game/dist/types/ai/movement.d.ts +20 -0
  109. package/packages/game/dist/types/ai/movement.d.ts.map +1 -0
  110. package/packages/game/dist/types/ai/perception.d.ts +21 -0
  111. package/packages/game/dist/types/ai/perception.d.ts.map +1 -0
  112. package/packages/game/dist/types/checksum.d.ts +3 -0
  113. package/packages/game/dist/types/checksum.d.ts.map +1 -0
  114. package/packages/game/dist/types/combat/armor.d.ts +39 -0
  115. package/packages/game/dist/types/combat/armor.d.ts.map +1 -0
  116. package/packages/game/dist/types/combat/damage.d.ts +52 -0
  117. package/packages/game/dist/types/combat/damage.d.ts.map +1 -0
  118. package/packages/game/dist/types/combat/damageFlags.d.ts +15 -0
  119. package/packages/game/dist/types/combat/damageFlags.d.ts.map +1 -0
  120. package/packages/game/dist/types/combat/damageMods.d.ts +79 -0
  121. package/packages/game/dist/types/combat/damageMods.d.ts.map +1 -0
  122. package/packages/game/dist/types/combat/index.d.ts +6 -0
  123. package/packages/game/dist/types/combat/index.d.ts.map +1 -0
  124. package/packages/game/dist/types/combat/specialDamage.d.ts +88 -0
  125. package/packages/game/dist/types/combat/specialDamage.d.ts.map +1 -0
  126. package/packages/game/dist/types/entities/entity.d.ts +46 -2
  127. package/packages/game/dist/types/entities/entity.d.ts.map +1 -1
  128. package/packages/game/dist/types/entities/index.d.ts +6 -2
  129. package/packages/game/dist/types/entities/index.d.ts.map +1 -1
  130. package/packages/game/dist/types/entities/pool.d.ts +9 -0
  131. package/packages/game/dist/types/entities/pool.d.ts.map +1 -1
  132. package/packages/game/dist/types/entities/spawn.d.ts +27 -0
  133. package/packages/game/dist/types/entities/spawn.d.ts.map +1 -0
  134. package/packages/game/dist/types/entities/system.d.ts +32 -1
  135. package/packages/game/dist/types/entities/system.d.ts.map +1 -1
  136. package/packages/game/dist/types/entities/thinkScheduler.d.ts +6 -0
  137. package/packages/game/dist/types/entities/thinkScheduler.d.ts.map +1 -1
  138. package/packages/game/dist/types/entities/triggers.d.ts +3 -0
  139. package/packages/game/dist/types/entities/triggers.d.ts.map +1 -0
  140. package/packages/game/dist/types/entities/utils.d.ts +4 -0
  141. package/packages/game/dist/types/entities/utils.d.ts.map +1 -0
  142. package/packages/game/dist/types/index.d.ts +5 -0
  143. package/packages/game/dist/types/index.d.ts.map +1 -1
  144. package/packages/game/dist/types/inventory/ammo.d.ts +17 -0
  145. package/packages/game/dist/types/inventory/ammo.d.ts.map +1 -0
  146. package/packages/game/dist/types/inventory/index.d.ts +2 -0
  147. package/packages/game/dist/types/inventory/index.d.ts.map +1 -0
  148. package/packages/game/dist/types/level.d.ts +1 -0
  149. package/packages/game/dist/types/level.d.ts.map +1 -1
  150. package/packages/game/dist/types/save/index.d.ts +4 -0
  151. package/packages/game/dist/types/save/index.d.ts.map +1 -0
  152. package/packages/game/dist/types/save/rerelease.d.ts +25 -0
  153. package/packages/game/dist/types/save/rerelease.d.ts.map +1 -0
  154. package/packages/game/dist/types/save/save.d.ts +49 -0
  155. package/packages/game/dist/types/save/save.d.ts.map +1 -0
  156. package/packages/game/dist/types/save/storage.d.ts +37 -0
  157. package/packages/game/dist/types/save/storage.d.ts.map +1 -0
  158. package/packages/shared/dist/browser/index.global.js +1 -1
  159. package/packages/shared/dist/browser/index.global.js.map +1 -1
  160. package/packages/shared/dist/cjs/index.cjs +638 -9
  161. package/packages/shared/dist/cjs/index.cjs.map +1 -1
  162. package/packages/shared/dist/esm/index.js +616 -9
  163. package/packages/shared/dist/esm/index.js.map +1 -1
  164. package/packages/shared/dist/tsconfig.tsbuildinfo +1 -1
  165. package/packages/shared/dist/types/bsp/collision.d.ts +56 -0
  166. package/packages/shared/dist/types/bsp/collision.d.ts.map +1 -1
  167. package/packages/shared/dist/types/bsp/contents.d.ts +1 -0
  168. package/packages/shared/dist/types/bsp/contents.d.ts.map +1 -1
  169. package/packages/shared/dist/types/index.d.ts +2 -0
  170. package/packages/shared/dist/types/index.d.ts.map +1 -1
  171. package/packages/shared/dist/types/math/random.d.ts +11 -0
  172. package/packages/shared/dist/types/math/random.d.ts.map +1 -1
  173. package/packages/shared/dist/types/protocol/contracts.d.ts +17 -0
  174. package/packages/shared/dist/types/protocol/contracts.d.ts.map +1 -0
  175. package/packages/shared/dist/types/protocol/usercmd.d.ts +30 -0
  176. package/packages/shared/dist/types/protocol/usercmd.d.ts.map +1 -0
  177. package/packages/tools/dist/tsconfig.tsbuildinfo +1 -1
@@ -1,32 +1,1206 @@
1
+ // ../shared/dist/esm/index.js
2
+ var ZERO_VEC3 = { x: 0, y: 0, z: 0 };
3
+ var DEG_TO_RAD = Math.PI / 180;
4
+ function addVec3(a, b) {
5
+ return { x: a.x + b.x, y: a.y + b.y, z: a.z + b.z };
6
+ }
7
+ function scaleVec3(a, scalar) {
8
+ return { x: a.x * scalar, y: a.y * scalar, z: a.z * scalar };
9
+ }
10
+ function dotVec3(a, b) {
11
+ return a.x * b.x + a.y * b.y + a.z * b.z;
12
+ }
13
+ function lengthSquaredVec3(a) {
14
+ return dotVec3(a, a);
15
+ }
16
+ function lengthVec3(a) {
17
+ return Math.sqrt(lengthSquaredVec3(a));
18
+ }
19
+ function normalizeVec3(a) {
20
+ const len = lengthVec3(a);
21
+ return len === 0 ? a : scaleVec3(a, 1 / len);
22
+ }
23
+ var PITCH = 0;
24
+ var YAW = 1;
25
+ var ROLL = 2;
26
+ var DEG2RAD_FACTOR = Math.PI / 180;
27
+ var RAD2DEG_FACTOR = 180 / Math.PI;
28
+ function axisComponent(vec, axis) {
29
+ switch (axis) {
30
+ case PITCH:
31
+ return vec.x;
32
+ case YAW:
33
+ return vec.y;
34
+ case ROLL:
35
+ default:
36
+ return vec.z;
37
+ }
38
+ }
39
+ function degToRad(degrees) {
40
+ return degrees * DEG2RAD_FACTOR;
41
+ }
42
+ function angleMod(angle) {
43
+ const value = angle % 360;
44
+ return value < 0 ? 360 + value : value;
45
+ }
46
+ function angleVectors(angles) {
47
+ const yaw = degToRad(axisComponent(angles, YAW));
48
+ const pitch = degToRad(axisComponent(angles, PITCH));
49
+ const roll = degToRad(axisComponent(angles, ROLL));
50
+ const sy = Math.sin(yaw);
51
+ const cy = Math.cos(yaw);
52
+ const sp = Math.sin(pitch);
53
+ const cp = Math.cos(pitch);
54
+ const sr = Math.sin(roll);
55
+ const cr = Math.cos(roll);
56
+ const forward = {
57
+ x: cp * cy,
58
+ y: cp * sy,
59
+ z: -sp
60
+ };
61
+ const right = {
62
+ x: -sr * sp * cy - cr * -sy,
63
+ y: -sr * sp * sy - cr * cy,
64
+ z: -sr * cp
65
+ };
66
+ const up = {
67
+ x: cr * sp * cy - sr * -sy,
68
+ y: cr * sp * sy - sr * cy,
69
+ z: cr * cp
70
+ };
71
+ return { forward, right, up };
72
+ }
73
+ var CONTENTS_SOLID = 1 << 0;
74
+ var CONTENTS_WINDOW = 1 << 1;
75
+ var CONTENTS_AUX = 1 << 2;
76
+ var CONTENTS_LAVA = 1 << 3;
77
+ var CONTENTS_SLIME = 1 << 4;
78
+ var CONTENTS_WATER = 1 << 5;
79
+ var CONTENTS_MIST = 1 << 6;
80
+ var CONTENTS_NO_WATERJUMP = 1 << 13;
81
+ var CONTENTS_PROJECTILECLIP = 1 << 14;
82
+ var CONTENTS_AREAPORTAL = 1 << 15;
83
+ var CONTENTS_PLAYERCLIP = 1 << 16;
84
+ var CONTENTS_MONSTERCLIP = 1 << 17;
85
+ var CONTENTS_CURRENT_0 = 1 << 18;
86
+ var CONTENTS_CURRENT_90 = 1 << 19;
87
+ var CONTENTS_CURRENT_180 = 1 << 20;
88
+ var CONTENTS_CURRENT_270 = 1 << 21;
89
+ var CONTENTS_CURRENT_UP = 1 << 22;
90
+ var CONTENTS_CURRENT_DOWN = 1 << 23;
91
+ var CONTENTS_ORIGIN = 1 << 24;
92
+ var CONTENTS_MONSTER = 1 << 25;
93
+ var CONTENTS_DEADMONSTER = 1 << 26;
94
+ var CONTENTS_DETAIL = 1 << 27;
95
+ var CONTENTS_TRANSLUCENT = 1 << 28;
96
+ var CONTENTS_LADDER = 1 << 29;
97
+ var CONTENTS_PLAYER = 1 << 30;
98
+ var CONTENTS_PROJECTILE = 1 << 31;
99
+ var SURF_LIGHT = 1 << 0;
100
+ var SURF_SLICK = 1 << 1;
101
+ var SURF_SKY = 1 << 2;
102
+ var SURF_WARP = 1 << 3;
103
+ var SURF_TRANS33 = 1 << 4;
104
+ var SURF_TRANS66 = 1 << 5;
105
+ var SURF_FLOWING = 1 << 6;
106
+ var SURF_NODRAW = 1 << 7;
107
+ var SURF_ALPHATEST = 1 << 25;
108
+ var SURF_N64_UV = 1 << 28;
109
+ var SURF_N64_SCROLL_X = 1 << 29;
110
+ var SURF_N64_SCROLL_Y = 1 << 30;
111
+ var SURF_N64_SCROLL_FLIP = 1 << 31;
112
+ var MASK_SOLID = CONTENTS_SOLID | CONTENTS_WINDOW;
113
+ var MASK_PLAYERSOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_PLAYER;
114
+ var MASK_DEADSOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW;
115
+ var MASK_MONSTERSOLID = CONTENTS_SOLID | CONTENTS_MONSTERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_PLAYER;
116
+ var MASK_WATER = CONTENTS_WATER | CONTENTS_LAVA | CONTENTS_SLIME;
117
+ var MASK_OPAQUE = CONTENTS_SOLID | CONTENTS_SLIME | CONTENTS_LAVA;
118
+ var MASK_SHOT = CONTENTS_SOLID | CONTENTS_MONSTER | CONTENTS_PLAYER | CONTENTS_WINDOW | CONTENTS_DEADMONSTER;
119
+ var MASK_CURRENT = CONTENTS_CURRENT_0 | CONTENTS_CURRENT_90 | CONTENTS_CURRENT_180 | CONTENTS_CURRENT_270 | CONTENTS_CURRENT_UP | CONTENTS_CURRENT_DOWN;
120
+ var MASK_BLOCK_SIGHT = CONTENTS_SOLID | CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_MONSTER | CONTENTS_PLAYER;
121
+ var MASK_NAV_SOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW;
122
+ var MASK_LADDER_NAV_SOLID = CONTENTS_SOLID | CONTENTS_WINDOW;
123
+ var MASK_WALK_NAV_SOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTERCLIP;
124
+ var MASK_PROJECTILE = MASK_SHOT | CONTENTS_PROJECTILECLIP;
125
+ var MAX_CHECKCOUNT = Number.MAX_SAFE_INTEGER - 1;
126
+ var MAX_CLIENTS = 256;
127
+ var MAX_LIGHTSTYLES = 256;
128
+ var MAX_MODELS = 8192;
129
+ var MAX_SOUNDS = 2048;
130
+ var MAX_IMAGES = 512;
131
+ var MAX_ITEMS = 256;
132
+ var MAX_GENERAL = MAX_CLIENTS * 2;
133
+ var MAX_SHADOW_LIGHTS = 256;
134
+ var MAX_WHEEL_ITEMS = 32;
135
+ var ConfigStringIndex = ((ConfigStringIndex2) => {
136
+ ConfigStringIndex2[ConfigStringIndex2["Name"] = 0] = "Name";
137
+ ConfigStringIndex2[ConfigStringIndex2["CdTrack"] = 1] = "CdTrack";
138
+ ConfigStringIndex2[ConfigStringIndex2["Sky"] = 2] = "Sky";
139
+ ConfigStringIndex2[ConfigStringIndex2["SkyAxis"] = 3] = "SkyAxis";
140
+ ConfigStringIndex2[ConfigStringIndex2["SkyRotate"] = 4] = "SkyRotate";
141
+ ConfigStringIndex2[ConfigStringIndex2["StatusBar"] = 5] = "StatusBar";
142
+ ConfigStringIndex2[ConfigStringIndex2["AirAccel"] = 59] = "AirAccel";
143
+ ConfigStringIndex2[ConfigStringIndex2["MaxClients"] = 60] = "MaxClients";
144
+ ConfigStringIndex2[ConfigStringIndex2["MapChecksum"] = 61] = "MapChecksum";
145
+ ConfigStringIndex2[ConfigStringIndex2["Models"] = 62] = "Models";
146
+ ConfigStringIndex2[ConfigStringIndex2["Sounds"] = 62 + MAX_MODELS] = "Sounds";
147
+ ConfigStringIndex2[ConfigStringIndex2["Images"] = ConfigStringIndex2.Sounds + MAX_SOUNDS] = "Images";
148
+ ConfigStringIndex2[ConfigStringIndex2["Lights"] = ConfigStringIndex2.Images + MAX_IMAGES] = "Lights";
149
+ ConfigStringIndex2[ConfigStringIndex2["ShadowLights"] = ConfigStringIndex2.Lights + MAX_LIGHTSTYLES] = "ShadowLights";
150
+ ConfigStringIndex2[ConfigStringIndex2["Items"] = ConfigStringIndex2.ShadowLights + MAX_SHADOW_LIGHTS] = "Items";
151
+ ConfigStringIndex2[ConfigStringIndex2["PlayerSkins"] = ConfigStringIndex2.Items + MAX_ITEMS] = "PlayerSkins";
152
+ ConfigStringIndex2[ConfigStringIndex2["General"] = ConfigStringIndex2.PlayerSkins + MAX_CLIENTS] = "General";
153
+ ConfigStringIndex2[ConfigStringIndex2["WheelWeapons"] = ConfigStringIndex2.General + MAX_GENERAL] = "WheelWeapons";
154
+ ConfigStringIndex2[ConfigStringIndex2["WheelAmmo"] = ConfigStringIndex2.WheelWeapons + MAX_WHEEL_ITEMS] = "WheelAmmo";
155
+ ConfigStringIndex2[ConfigStringIndex2["WheelPowerups"] = ConfigStringIndex2.WheelAmmo + MAX_WHEEL_ITEMS] = "WheelPowerups";
156
+ ConfigStringIndex2[ConfigStringIndex2["CdLoopCount"] = ConfigStringIndex2.WheelPowerups + MAX_WHEEL_ITEMS] = "CdLoopCount";
157
+ ConfigStringIndex2[ConfigStringIndex2["GameStyle"] = ConfigStringIndex2.CdLoopCount + 1] = "GameStyle";
158
+ ConfigStringIndex2[ConfigStringIndex2["MaxConfigStrings"] = ConfigStringIndex2.GameStyle + 1] = "MaxConfigStrings";
159
+ return ConfigStringIndex2;
160
+ })(ConfigStringIndex || {});
161
+ var MAX_CONFIGSTRINGS = ConfigStringIndex.MaxConfigStrings;
162
+ var WaterLevel = /* @__PURE__ */ ((WaterLevel3) => {
163
+ WaterLevel3[WaterLevel3["None"] = 0] = "None";
164
+ WaterLevel3[WaterLevel3["Feet"] = 1] = "Feet";
165
+ WaterLevel3[WaterLevel3["Waist"] = 2] = "Waist";
166
+ WaterLevel3[WaterLevel3["Under"] = 3] = "Under";
167
+ return WaterLevel3;
168
+ })(WaterLevel || {});
169
+ var PmFlag = /* @__PURE__ */ ((PmFlag2) => {
170
+ PmFlag2[PmFlag2["Ducked"] = 1] = "Ducked";
171
+ PmFlag2[PmFlag2["JumpHeld"] = 2] = "JumpHeld";
172
+ PmFlag2[PmFlag2["OnGround"] = 4] = "OnGround";
173
+ PmFlag2[PmFlag2["TimeWaterJump"] = 8] = "TimeWaterJump";
174
+ PmFlag2[PmFlag2["TimeLand"] = 16] = "TimeLand";
175
+ PmFlag2[PmFlag2["TimeTeleport"] = 32] = "TimeTeleport";
176
+ PmFlag2[PmFlag2["NoPositionalPrediction"] = 64] = "NoPositionalPrediction";
177
+ PmFlag2[PmFlag2["OnLadder"] = 128] = "OnLadder";
178
+ PmFlag2[PmFlag2["NoAngularPrediction"] = 256] = "NoAngularPrediction";
179
+ PmFlag2[PmFlag2["IgnorePlayerCollision"] = 512] = "IgnorePlayerCollision";
180
+ PmFlag2[PmFlag2["TimeTrick"] = 1024] = "TimeTrick";
181
+ return PmFlag2;
182
+ })(PmFlag || {});
183
+ function hasPmFlag(flags, flag) {
184
+ return (flags & flag) !== 0;
185
+ }
186
+ var PmType = /* @__PURE__ */ ((PmType2) => {
187
+ PmType2[PmType2["Normal"] = 0] = "Normal";
188
+ PmType2[PmType2["Grapple"] = 1] = "Grapple";
189
+ PmType2[PmType2["NoClip"] = 2] = "NoClip";
190
+ PmType2[PmType2["Spectator"] = 3] = "Spectator";
191
+ PmType2[PmType2["Dead"] = 4] = "Dead";
192
+ PmType2[PmType2["Gib"] = 5] = "Gib";
193
+ PmType2[PmType2["Freeze"] = 6] = "Freeze";
194
+ return PmType2;
195
+ })(PmType || {});
196
+ var PlayerButton = /* @__PURE__ */ ((PlayerButton2) => {
197
+ PlayerButton2[PlayerButton2["None"] = 0] = "None";
198
+ PlayerButton2[PlayerButton2["Attack"] = 1] = "Attack";
199
+ PlayerButton2[PlayerButton2["Use"] = 2] = "Use";
200
+ PlayerButton2[PlayerButton2["Holster"] = 4] = "Holster";
201
+ PlayerButton2[PlayerButton2["Jump"] = 8] = "Jump";
202
+ PlayerButton2[PlayerButton2["Crouch"] = 16] = "Crouch";
203
+ PlayerButton2[PlayerButton2["Any"] = 128] = "Any";
204
+ return PlayerButton2;
205
+ })(PlayerButton || {});
206
+ function applyPmoveFriction(params) {
207
+ const {
208
+ velocity,
209
+ frametime,
210
+ onGround,
211
+ groundIsSlick,
212
+ onLadder,
213
+ waterlevel,
214
+ pmFriction,
215
+ pmStopSpeed,
216
+ pmWaterFriction
217
+ } = params;
218
+ const speed = lengthVec3(velocity);
219
+ if (speed < 1) {
220
+ return { x: 0, y: 0, z: velocity.z };
221
+ }
222
+ let drop = 0;
223
+ if (onGround && !groundIsSlick || onLadder) {
224
+ const control = speed < pmStopSpeed ? pmStopSpeed : speed;
225
+ const friction = pmFriction;
226
+ drop += control * friction * frametime;
227
+ }
228
+ if (waterlevel > 0 && !onLadder) {
229
+ drop += speed * pmWaterFriction * waterlevel * frametime;
230
+ }
231
+ let newspeed = speed - drop;
232
+ if (newspeed < 0) {
233
+ newspeed = 0;
234
+ }
235
+ if (newspeed === speed) {
236
+ return velocity;
237
+ }
238
+ const scale = newspeed / speed;
239
+ return scaleVec3(velocity, scale);
240
+ }
241
+ function applyPmoveAccelerate(params) {
242
+ const { velocity, wishdir, wishspeed, accel, frametime } = params;
243
+ const currentSpeed = dotVec3(velocity, wishdir);
244
+ const addSpeed = wishspeed - currentSpeed;
245
+ if (addSpeed <= 0) {
246
+ return velocity;
247
+ }
248
+ let accelSpeed = accel * frametime * wishspeed;
249
+ if (accelSpeed > addSpeed) {
250
+ accelSpeed = addSpeed;
251
+ }
252
+ return {
253
+ x: velocity.x + wishdir.x * accelSpeed,
254
+ y: velocity.y + wishdir.y * accelSpeed,
255
+ z: velocity.z + wishdir.z * accelSpeed
256
+ };
257
+ }
258
+ function applyPmoveAirAccelerate(params) {
259
+ const { velocity, wishdir, wishspeed, accel, frametime } = params;
260
+ const wishspd = Math.min(wishspeed, 30);
261
+ const currentSpeed = dotVec3(velocity, wishdir);
262
+ const addSpeed = wishspd - currentSpeed;
263
+ if (addSpeed <= 0) {
264
+ return velocity;
265
+ }
266
+ let accelSpeed = accel * wishspeed * frametime;
267
+ if (accelSpeed > addSpeed) {
268
+ accelSpeed = addSpeed;
269
+ }
270
+ return {
271
+ x: velocity.x + wishdir.x * accelSpeed,
272
+ y: velocity.y + wishdir.y * accelSpeed,
273
+ z: velocity.z + wishdir.z * accelSpeed
274
+ };
275
+ }
276
+ function buildAirGroundWish(params) {
277
+ const { forward, right, cmd, maxSpeed } = params;
278
+ let wishvel = {
279
+ x: forward.x * cmd.forwardmove + right.x * cmd.sidemove,
280
+ y: forward.y * cmd.forwardmove + right.y * cmd.sidemove,
281
+ z: 0
282
+ };
283
+ let wishspeed = lengthVec3(wishvel);
284
+ if (wishspeed > maxSpeed) {
285
+ const scale = maxSpeed / wishspeed;
286
+ wishvel = scaleVec3(wishvel, scale);
287
+ wishspeed = maxSpeed;
288
+ }
289
+ return {
290
+ wishdir: wishspeed === 0 ? wishvel : normalizeVec3(wishvel),
291
+ wishspeed
292
+ };
293
+ }
294
+ function buildWaterWish(params) {
295
+ const { forward, right, cmd, maxSpeed } = params;
296
+ let wishvel = {
297
+ x: forward.x * cmd.forwardmove + right.x * cmd.sidemove,
298
+ y: forward.y * cmd.forwardmove + right.y * cmd.sidemove,
299
+ z: 0
300
+ };
301
+ if (cmd.upmove > 10) {
302
+ wishvel = addVec3(wishvel, { x: 0, y: 0, z: cmd.upmove });
303
+ } else if (cmd.upmove < -10) {
304
+ wishvel = addVec3(wishvel, { x: 0, y: 0, z: cmd.upmove });
305
+ } else {
306
+ wishvel = addVec3(wishvel, { x: 0, y: 0, z: 10 });
307
+ }
308
+ let wishspeed = lengthVec3(wishvel);
309
+ if (wishspeed > maxSpeed) {
310
+ const scale = maxSpeed / wishspeed;
311
+ wishvel = scaleVec3(wishvel, scale);
312
+ wishspeed = maxSpeed;
313
+ }
314
+ wishspeed *= 0.5;
315
+ return {
316
+ wishdir: wishspeed === 0 ? wishvel : normalizeVec3(wishvel),
317
+ wishspeed
318
+ };
319
+ }
320
+ var WATERJUMP_CLEAR = 8 | 16 | 32 | 1024;
321
+ function addAngles(cmdAngles, deltaAngles) {
322
+ return {
323
+ x: cmdAngles.x + deltaAngles.x,
324
+ y: cmdAngles.y + deltaAngles.y,
325
+ z: cmdAngles.z + deltaAngles.z
326
+ };
327
+ }
328
+ function clampPitch(pitch) {
329
+ if (pitch > 89 && pitch < 180) {
330
+ return 89;
331
+ }
332
+ if (pitch < 271 && pitch >= 180) {
333
+ return 271;
334
+ }
335
+ return pitch;
336
+ }
337
+ function clampViewAngles(params) {
338
+ const { pmFlags, cmdAngles, deltaAngles } = params;
339
+ let viewangles;
340
+ if ((pmFlags & 32) !== 0) {
341
+ viewangles = {
342
+ x: 0,
343
+ y: cmdAngles.y + deltaAngles.y,
344
+ z: 0
345
+ };
346
+ } else {
347
+ viewangles = addAngles(cmdAngles, deltaAngles);
348
+ viewangles = { ...viewangles, x: clampPitch(viewangles.x) };
349
+ }
350
+ const vectors = angleVectors(viewangles);
351
+ return { viewangles, ...vectors };
352
+ }
353
+ var DEFAULT_FORWARD_SPEED = 200;
354
+ var DEFAULT_SIDE_SPEED = 200;
355
+ var DEFAULT_UP_SPEED = 200;
356
+ var DEFAULT_YAW_SPEED = 140;
357
+ var DEFAULT_PITCH_SPEED = 150;
358
+ var DEFAULT_MOUSE_SENSITIVITY = 3;
359
+ function clampPitch2(pitch) {
360
+ const normalized = angleMod(pitch);
361
+ if (normalized > 89 && normalized < 180) return 89;
362
+ if (normalized < 271 && normalized >= 180) return 271;
363
+ return normalized;
364
+ }
365
+ function addViewAngles(current, delta) {
366
+ return {
367
+ x: clampPitch2(current.x + delta.x),
368
+ y: angleMod(current.y + delta.y),
369
+ z: angleMod(current.z + delta.z)
370
+ };
371
+ }
372
+ function mouseDeltaToViewDelta(delta, options) {
373
+ const yawScale = options.sensitivityX ?? options.sensitivity;
374
+ const pitchScale = (options.sensitivityY ?? options.sensitivity) * (options.invertY ? -1 : 1);
375
+ return {
376
+ x: delta.deltaY * pitchScale,
377
+ y: delta.deltaX * yawScale,
378
+ z: 0
379
+ };
380
+ }
381
+
382
+ // src/prediction.ts
383
+ var DEFAULTS = {
384
+ pmFriction: 6,
385
+ pmStopSpeed: 100,
386
+ pmAccelerate: 10,
387
+ pmAirAccelerate: 1,
388
+ pmWaterAccelerate: 4,
389
+ pmWaterFriction: 1,
390
+ pmMaxSpeed: 300,
391
+ pmDuckSpeed: 100,
392
+ pmWaterSpeed: 400,
393
+ groundIsSlick: false
394
+ };
395
+ var DEFAULT_GRAVITY = 800;
396
+ var ZERO_VEC32 = { x: 0, y: 0, z: 0 };
397
+ var MSEC_MAX = 250;
398
+ function defaultPredictionState() {
399
+ return {
400
+ origin: ZERO_VEC32,
401
+ velocity: ZERO_VEC32,
402
+ viewangles: ZERO_VEC32,
403
+ pmFlags: PmFlag.OnGround,
404
+ pmType: PmType.Normal,
405
+ waterlevel: WaterLevel.None,
406
+ gravity: DEFAULT_GRAVITY,
407
+ deltaAngles: ZERO_VEC32
408
+ };
409
+ }
410
+ function normalizeState(state) {
411
+ if (!state) return defaultPredictionState();
412
+ return {
413
+ ...defaultPredictionState(),
414
+ ...state,
415
+ origin: { ...state.origin },
416
+ velocity: { ...state.velocity },
417
+ viewangles: { ...state.viewangles },
418
+ deltaAngles: state.deltaAngles ? { ...state.deltaAngles } : ZERO_VEC32
419
+ };
420
+ }
421
+ function lerp(a, b, t) {
422
+ return a + (b - a) * t;
423
+ }
424
+ function lerpAngle(a, b, t) {
425
+ let delta = angleMod(b - a);
426
+ if (delta > 180) {
427
+ delta -= 360;
428
+ }
429
+ return angleMod(a + delta * t);
430
+ }
431
+ function interpolatePredictionState(previous, latest, alpha) {
432
+ const clamped = Math.max(0, Math.min(alpha, 1));
433
+ return {
434
+ origin: {
435
+ x: lerp(previous.origin.x, latest.origin.x, clamped),
436
+ y: lerp(previous.origin.y, latest.origin.y, clamped),
437
+ z: lerp(previous.origin.z, latest.origin.z, clamped)
438
+ },
439
+ velocity: {
440
+ x: lerp(previous.velocity.x, latest.velocity.x, clamped),
441
+ y: lerp(previous.velocity.y, latest.velocity.y, clamped),
442
+ z: lerp(previous.velocity.z, latest.velocity.z, clamped)
443
+ },
444
+ viewangles: {
445
+ x: lerpAngle(previous.viewangles.x, latest.viewangles.x, clamped),
446
+ y: lerpAngle(previous.viewangles.y, latest.viewangles.y, clamped),
447
+ z: lerpAngle(previous.viewangles.z, latest.viewangles.z, clamped)
448
+ },
449
+ pmFlags: latest.pmFlags,
450
+ pmType: latest.pmType,
451
+ waterlevel: latest.waterlevel,
452
+ gravity: latest.gravity,
453
+ deltaAngles: latest.deltaAngles
454
+ };
455
+ }
456
+ function simulateCommand(state, cmd, settings) {
457
+ const frametime = Math.min(Math.max(cmd.msec, 0), MSEC_MAX) / 1e3;
458
+ const onGround = hasPmFlag(state.pmFlags, PmFlag.OnGround);
459
+ const onLadder = hasPmFlag(state.pmFlags, PmFlag.OnLadder);
460
+ let velocity = applyPmoveFriction({
461
+ velocity: state.velocity,
462
+ frametime,
463
+ onGround,
464
+ groundIsSlick: settings.groundIsSlick,
465
+ onLadder,
466
+ waterlevel: state.waterlevel,
467
+ pmFriction: settings.pmFriction,
468
+ pmStopSpeed: settings.pmStopSpeed,
469
+ pmWaterFriction: settings.pmWaterFriction
470
+ });
471
+ const { viewangles, forward, right } = clampViewAngles({
472
+ pmFlags: state.pmFlags,
473
+ cmdAngles: cmd.angles,
474
+ deltaAngles: state.deltaAngles ?? ZERO_VEC32
475
+ });
476
+ const wish = state.waterlevel > WaterLevel.None ? buildWaterWish({ forward, right, cmd, maxSpeed: settings.pmWaterSpeed }) : buildAirGroundWish({ forward, right, cmd, maxSpeed: settings.pmMaxSpeed });
477
+ if (state.waterlevel > WaterLevel.None) {
478
+ velocity = applyPmoveAccelerate({
479
+ velocity,
480
+ wishdir: wish.wishdir,
481
+ wishspeed: wish.wishspeed,
482
+ accel: settings.pmWaterAccelerate,
483
+ frametime
484
+ });
485
+ } else if (onGround || onLadder) {
486
+ const maxSpeed = hasPmFlag(state.pmFlags, PmFlag.Ducked) ? settings.pmDuckSpeed : settings.pmMaxSpeed;
487
+ const clampedWish = wish.wishspeed > maxSpeed ? {
488
+ wishdir: wish.wishdir,
489
+ wishspeed: maxSpeed
490
+ } : wish;
491
+ velocity = applyPmoveAccelerate({
492
+ velocity,
493
+ wishdir: clampedWish.wishdir,
494
+ wishspeed: clampedWish.wishspeed,
495
+ accel: settings.pmAccelerate,
496
+ frametime
497
+ });
498
+ } else {
499
+ velocity = applyPmoveAirAccelerate({
500
+ velocity,
501
+ wishdir: wish.wishdir,
502
+ wishspeed: wish.wishspeed,
503
+ accel: settings.pmAirAccelerate,
504
+ frametime
505
+ });
506
+ velocity = { ...velocity, z: velocity.z - state.gravity * frametime };
507
+ }
508
+ const originDelta = scaleVec3(velocity, frametime);
509
+ const origin = addVec3(state.origin, originDelta);
510
+ return {
511
+ ...state,
512
+ origin,
513
+ velocity,
514
+ viewangles
515
+ };
516
+ }
517
+ var ClientPrediction = class {
518
+ constructor(settings = {}) {
519
+ this.baseFrame = {
520
+ frame: 0,
521
+ timeMs: 0,
522
+ state: defaultPredictionState()
523
+ };
524
+ this.commands = [];
525
+ this.predicted = defaultPredictionState();
526
+ this.settings = { ...DEFAULTS, ...settings };
527
+ this.predicted = this.baseFrame.state ?? defaultPredictionState();
528
+ }
529
+ setAuthoritative(frame) {
530
+ const normalized = normalizeState(frame.state);
531
+ this.baseFrame = { ...frame, state: normalized };
532
+ this.commands = this.commands.filter((cmd) => (cmd.serverFrame ?? Number.MAX_SAFE_INTEGER) > frame.frame);
533
+ return this.recompute();
534
+ }
535
+ enqueueCommand(cmd) {
536
+ this.commands.push(cmd);
537
+ return this.recompute();
538
+ }
539
+ getPredictedState() {
540
+ return this.predicted;
541
+ }
542
+ recompute() {
543
+ let state = normalizeState(this.baseFrame.state);
544
+ for (const cmd of this.commands) {
545
+ state = simulateCommand(state, cmd, this.settings);
546
+ }
547
+ this.predicted = state;
548
+ return state;
549
+ }
550
+ };
551
+
552
+ // src/view-effects.ts
553
+ var DEFAULT_SETTINGS = {
554
+ runPitch: 2e-3,
555
+ runRoll: 5e-3,
556
+ bobUp: 5e-3,
557
+ bobPitch: 2e-3,
558
+ bobRoll: 2e-3,
559
+ maxBobHeight: 6,
560
+ maxBobAngle: 1.2
561
+ };
562
+ function clampViewOffset(offset) {
563
+ return {
564
+ x: Math.max(-14, Math.min(14, offset.x)),
565
+ y: Math.max(-14, Math.min(14, offset.y)),
566
+ z: Math.max(-22, Math.min(30, offset.z))
567
+ };
568
+ }
569
+ function computeBobMove(xyspeed, onGround, frameTimeMs) {
570
+ if (!onGround) return 0;
571
+ if (xyspeed > 210) return frameTimeMs / 400;
572
+ if (xyspeed > 100) return frameTimeMs / 800;
573
+ return frameTimeMs / 1600;
574
+ }
575
+ function computeBobValues(previousBobTime, xyspeed, pmFlags, onGround, frameTimeMs) {
576
+ if (xyspeed < 5) {
577
+ return { bobTime: 0, bobCycle: 0, bobCycleRun: 0, bobFracSin: 0 };
578
+ }
579
+ const bobMove = computeBobMove(xyspeed, onGround, frameTimeMs);
580
+ const bobTimeRun = previousBobTime + bobMove;
581
+ const crouched = hasPmFlag(pmFlags, PmFlag.Ducked) && onGround;
582
+ const bobTime = crouched ? bobTimeRun * 4 : bobTimeRun;
583
+ return {
584
+ bobTime: bobTimeRun,
585
+ bobCycle: Math.floor(bobTime),
586
+ bobCycleRun: Math.floor(bobTimeRun),
587
+ bobFracSin: Math.abs(Math.sin(bobTime * Math.PI))
588
+ };
589
+ }
590
+ var ViewEffects = class {
591
+ constructor(settings = {}) {
592
+ this.bobTime = 0;
593
+ this.bobCycle = 0;
594
+ this.bobCycleRun = 0;
595
+ this.bobFracSin = 0;
596
+ this.settings = { ...DEFAULT_SETTINGS, ...settings };
597
+ }
598
+ addKick(kick) {
599
+ if (kick.durationMs <= 0) return;
600
+ this.kick = { ...kick, remainingMs: kick.durationMs };
601
+ }
602
+ get last() {
603
+ return this.lastSample;
604
+ }
605
+ sample(state, frameTimeMs) {
606
+ const { forward, right } = angleVectors(
607
+ clampViewAngles({ pmFlags: state.pmFlags, cmdAngles: state.viewangles, deltaAngles: state.deltaAngles ?? ZERO_VEC3 }).viewangles
608
+ );
609
+ const xyspeed = Math.sqrt(state.velocity.x * state.velocity.x + state.velocity.y * state.velocity.y);
610
+ const onGround = hasPmFlag(state.pmFlags, PmFlag.OnGround);
611
+ const bobValues = computeBobValues(this.bobTime, xyspeed, state.pmFlags, onGround, frameTimeMs);
612
+ this.bobTime = bobValues.bobTime;
613
+ this.bobCycle = bobValues.bobCycle;
614
+ this.bobCycleRun = bobValues.bobCycleRun;
615
+ this.bobFracSin = bobValues.bobFracSin;
616
+ let pitchTilt = dotVec3(state.velocity, forward) * this.settings.runPitch;
617
+ let rollTilt = dotVec3(state.velocity, right) * this.settings.runRoll;
618
+ let pitchDelta = this.bobFracSin * this.settings.bobPitch * xyspeed;
619
+ let rollDelta = this.bobFracSin * this.settings.bobRoll * xyspeed;
620
+ if (hasPmFlag(state.pmFlags, PmFlag.Ducked) && onGround) {
621
+ pitchDelta *= 6;
622
+ rollDelta *= 6;
623
+ }
624
+ pitchTilt += Math.min(pitchDelta, this.settings.maxBobAngle);
625
+ rollDelta = Math.min(rollDelta, this.settings.maxBobAngle);
626
+ if (this.bobCycle & 1) rollDelta = -rollDelta;
627
+ rollTilt += rollDelta;
628
+ const bobHeight = Math.min(this.bobFracSin * xyspeed * this.settings.bobUp, this.settings.maxBobHeight);
629
+ let kickPitch = 0;
630
+ let kickRoll = 0;
631
+ if (this.kick && this.kick.remainingMs > 0) {
632
+ const ratio = Math.max(0, Math.min(1, this.kick.remainingMs / this.kick.durationMs));
633
+ kickPitch += ratio * this.kick.pitch;
634
+ kickRoll += ratio * this.kick.roll;
635
+ this.kick.remainingMs = Math.max(0, this.kick.remainingMs - frameTimeMs);
636
+ if (this.kick.remainingMs === 0) this.kick = void 0;
637
+ }
638
+ const angles = { x: pitchTilt + kickPitch, y: 0, z: rollTilt + kickRoll };
639
+ const offset = { x: 0, y: 0, z: bobHeight };
640
+ const sample = {
641
+ angles,
642
+ offset: clampViewOffset(offset),
643
+ bobCycle: this.bobCycle,
644
+ bobCycleRun: this.bobCycleRun,
645
+ bobFracSin: this.bobFracSin,
646
+ xyspeed
647
+ };
648
+ this.lastSample = sample;
649
+ return sample;
650
+ }
651
+ };
652
+
653
+ // src/input/bindings.ts
654
+ var DEFAULT_BINDINGS = [
655
+ { code: "KeyW", command: "+forward" },
656
+ { code: "ArrowUp", command: "+forward" },
657
+ { code: "KeyS", command: "+back" },
658
+ { code: "ArrowDown", command: "+back" },
659
+ { code: "KeyA", command: "+moveleft" },
660
+ { code: "KeyD", command: "+moveright" },
661
+ { code: "Space", command: "+jump" },
662
+ { code: "ControlLeft", command: "+crouch" },
663
+ { code: "ShiftLeft", command: "+speed" },
664
+ { code: "Mouse1", command: "+attack" },
665
+ { code: "Mouse2", command: "+use" },
666
+ { code: "Mouse3", command: "+zoom" },
667
+ { code: "ArrowLeft", command: "+left" },
668
+ { code: "ArrowRight", command: "+right" },
669
+ { code: "PageUp", command: "+lookup" },
670
+ { code: "PageDown", command: "+lookdown" },
671
+ { code: "Gamepad0-Button7", command: "+attack" },
672
+ { code: "Gamepad0-Button6", command: "+zoom" },
673
+ { code: "Gamepad0-Button0", command: "+jump" },
674
+ { code: "Gamepad0-Button1", command: "+crouch" },
675
+ { code: "Gamepad0-Button2", command: "+use" },
676
+ { code: "Gamepad0-Button4", command: "prevweapon" },
677
+ { code: "Gamepad0-Button5", command: "nextweapon" },
678
+ { code: "Digit1", command: "weapon 1" },
679
+ { code: "Digit2", command: "weapon 2" },
680
+ { code: "Digit3", command: "weapon 3" },
681
+ { code: "Digit4", command: "weapon 4" },
682
+ { code: "Digit5", command: "weapon 5" },
683
+ { code: "Digit6", command: "weapon 6" },
684
+ { code: "Digit7", command: "weapon 7" },
685
+ { code: "Digit8", command: "weapon 8" },
686
+ { code: "Digit9", command: "weapon 9" },
687
+ { code: "Digit0", command: "weapon 10" }
688
+ ];
689
+ var InputBindings = class {
690
+ constructor(entries = DEFAULT_BINDINGS) {
691
+ this.bindings = /* @__PURE__ */ new Map();
692
+ for (const entry of entries) {
693
+ this.bind(entry.code, entry.command);
694
+ }
695
+ }
696
+ bind(code, command) {
697
+ this.bindings.set(code, command);
698
+ }
699
+ unbind(code) {
700
+ this.bindings.delete(code);
701
+ }
702
+ getBinding(code) {
703
+ return this.bindings.get(code);
704
+ }
705
+ entries() {
706
+ return new Map(this.bindings.entries());
707
+ }
708
+ };
709
+ function createDefaultBindings() {
710
+ return new InputBindings();
711
+ }
712
+ function normalizeInputCode(code) {
713
+ return code;
714
+ }
715
+ function normalizeCommand(command) {
716
+ return command.trim().toLowerCase();
717
+ }
718
+
719
+ // src/input/controller.ts
720
+ var MSEC_MAX2 = 250;
721
+ var KeyButton = class {
722
+ constructor() {
723
+ this.activeCodes = /* @__PURE__ */ new Set();
724
+ this.downTime = 0;
725
+ this.msec = 0;
726
+ this.pressed = false;
727
+ }
728
+ press(code, now) {
729
+ if (this.activeCodes.has(code)) return false;
730
+ this.activeCodes.add(code);
731
+ this.pressed = true;
732
+ if (this.activeCodes.size === 1) {
733
+ this.downTime = now;
734
+ return true;
735
+ }
736
+ return false;
737
+ }
738
+ release(code, now) {
739
+ if (!this.activeCodes.delete(code)) return false;
740
+ if (this.activeCodes.size === 0) {
741
+ this.msec += now - this.downTime;
742
+ this.downTime = 0;
743
+ return true;
744
+ }
745
+ return false;
746
+ }
747
+ sample(frameMsec, now) {
748
+ if (frameMsec <= 0) {
749
+ return { active: this.activeCodes.size > 0, wasPressed: this.pressed, fraction: 0 };
750
+ }
751
+ let total = this.msec;
752
+ if (this.activeCodes.size > 0) {
753
+ total += now - this.downTime;
754
+ this.downTime = now;
755
+ }
756
+ this.msec = 0;
757
+ const fraction = Math.min(total / frameMsec, 1);
758
+ const wasPressed = this.pressed;
759
+ this.pressed = false;
760
+ return { active: this.activeCodes.size > 0, wasPressed, fraction };
761
+ }
762
+ };
763
+ var InputAction = /* @__PURE__ */ ((InputAction2) => {
764
+ InputAction2["Forward"] = "+forward";
765
+ InputAction2["Back"] = "+back";
766
+ InputAction2["MoveLeft"] = "+moveleft";
767
+ InputAction2["MoveRight"] = "+moveright";
768
+ InputAction2["MoveUp"] = "+moveup";
769
+ InputAction2["MoveDown"] = "+movedown";
770
+ InputAction2["Jump"] = "+jump";
771
+ InputAction2["Crouch"] = "+crouch";
772
+ InputAction2["Attack"] = "+attack";
773
+ InputAction2["Use"] = "+use";
774
+ InputAction2["Holster"] = "+holster";
775
+ InputAction2["TurnLeft"] = "+left";
776
+ InputAction2["TurnRight"] = "+right";
777
+ InputAction2["LookUp"] = "+lookup";
778
+ InputAction2["LookDown"] = "+lookdown";
779
+ InputAction2["SpeedModifier"] = "+speed";
780
+ InputAction2["Zoom"] = "+zoom";
781
+ return InputAction2;
782
+ })(InputAction || {});
783
+ var BUTTON_ACTIONS = {
784
+ ["+attack" /* Attack */]: PlayerButton.Attack,
785
+ ["+use" /* Use */]: PlayerButton.Use,
786
+ ["+holster" /* Holster */]: PlayerButton.Holster,
787
+ ["+jump" /* Jump */]: PlayerButton.Jump,
788
+ ["+crouch" /* Crouch */]: PlayerButton.Crouch
789
+ };
790
+ var ACTION_LOOKUP = new Map(
791
+ Object.values(InputAction).map((action) => [normalizeCommand(action), action])
792
+ );
793
+ function commandToAction(command) {
794
+ return ACTION_LOOKUP.get(normalizeCommand(command));
795
+ }
796
+ function nowMs() {
797
+ if (typeof performance !== "undefined" && typeof performance.now === "function") {
798
+ return performance.now();
799
+ }
800
+ return Date.now();
801
+ }
802
+ var InputController = class {
803
+ constructor(options = {}, bindings = new InputBindings()) {
804
+ this.buttons = /* @__PURE__ */ new Map();
805
+ this.viewAngles = { x: 0, y: 0, z: 0 };
806
+ this.pointerLocked = false;
807
+ this.mouseDelta = { deltaX: 0, deltaY: 0 };
808
+ this.previousMouseDelta = { deltaX: 0, deltaY: 0 };
809
+ this.anyPressed = false;
810
+ this.commandQueue = [];
811
+ this.gamepadButtons = /* @__PURE__ */ new Map();
812
+ this.gamepadMove = { x: 0, y: 0 };
813
+ this.gamepadLook = { x: 0, y: 0 };
814
+ this.touchButtons = /* @__PURE__ */ new Map();
815
+ this.touchMove = { x: 0, y: 0 };
816
+ this.touchLook = { x: 0, y: 0 };
817
+ this.bindings = bindings;
818
+ this.forwardSpeed = options.forwardSpeed ?? DEFAULT_FORWARD_SPEED;
819
+ this.sideSpeed = options.sideSpeed ?? DEFAULT_SIDE_SPEED;
820
+ this.upSpeed = options.upSpeed ?? DEFAULT_UP_SPEED;
821
+ this.yawSpeed = options.yawSpeed ?? DEFAULT_YAW_SPEED;
822
+ this.pitchSpeed = options.pitchSpeed ?? DEFAULT_PITCH_SPEED;
823
+ this.sensitivity = options.sensitivity ?? DEFAULT_MOUSE_SENSITIVITY;
824
+ this.sensitivityX = options.sensitivityX;
825
+ this.sensitivityY = options.sensitivityY;
826
+ this.invertMouseY = options.invertMouseY ?? false;
827
+ this.runByDefault = options.runByDefault ?? true;
828
+ this.requirePointerLock = options.requirePointerLock ?? true;
829
+ this.jumpAddsUpMove = options.jumpAddsUpMove ?? true;
830
+ this.crouchAddsDownMove = options.crouchAddsDownMove ?? true;
831
+ this.mouseFilter = options.mouseFilter ?? false;
832
+ this.getGamepads = options.getGamepads;
833
+ this.gamepadDeadZone = options.gamepadDeadZone ?? 0.15;
834
+ this.gamepadLookScale = options.gamepadLookScale ?? 1;
835
+ this.invertGamepadY = options.invertGamepadY ?? this.invertMouseY;
836
+ }
837
+ handleKeyDown(code, eventTimeMs = nowMs()) {
838
+ const normalized = normalizeInputCode(code);
839
+ const binding = this.bindings.getBinding(normalized);
840
+ if (!binding) return;
841
+ this.applyCommand(binding, true, normalized, eventTimeMs);
842
+ }
843
+ handleKeyUp(code, eventTimeMs = nowMs()) {
844
+ const normalized = normalizeInputCode(code);
845
+ const binding = this.bindings.getBinding(normalized);
846
+ if (!binding) return;
847
+ this.applyCommand(binding, false, normalized, eventTimeMs);
848
+ }
849
+ handleMouseButtonDown(button, eventTimeMs = nowMs()) {
850
+ const code = this.mouseButtonToCode(button);
851
+ this.applyCommand(this.mouseButtonToCommand(code), true, code, eventTimeMs);
852
+ }
853
+ handleMouseButtonUp(button, eventTimeMs = nowMs()) {
854
+ const code = this.mouseButtonToCode(button);
855
+ this.applyCommand(this.mouseButtonToCommand(code), false, code, eventTimeMs);
856
+ }
857
+ handleMouseMove(deltaX, deltaY) {
858
+ if (this.requirePointerLock && !this.pointerLocked) return;
859
+ this.mouseDelta = {
860
+ deltaX: this.mouseDelta.deltaX + deltaX,
861
+ deltaY: this.mouseDelta.deltaY + deltaY
862
+ };
863
+ }
864
+ setPointerLocked(locked) {
865
+ this.pointerLocked = locked;
866
+ }
867
+ setGamepadState(gamepads) {
868
+ this.pendingGamepads = gamepads;
869
+ }
870
+ setTouchState(state) {
871
+ this.pendingTouchState = state;
872
+ }
873
+ buildCommand(frameMsec, now = nowMs(), serverFrame) {
874
+ this.pollGamepads(now);
875
+ this.applyTouchState(now);
876
+ const yawStep = this.yawSpeed * frameMsec / 1e3;
877
+ const pitchStep = this.pitchSpeed * frameMsec / 1e3;
878
+ const turnLeft = this.sample("+left" /* TurnLeft */, frameMsec, now);
879
+ const turnRight = this.sample("+right" /* TurnRight */, frameMsec, now);
880
+ const lookUp = this.sample("+lookup" /* LookUp */, frameMsec, now);
881
+ const lookDown = this.sample("+lookdown" /* LookDown */, frameMsec, now);
882
+ let viewDelta = {
883
+ x: (lookDown.fraction - lookUp.fraction) * pitchStep,
884
+ y: (turnRight.fraction - turnLeft.fraction) * yawStep,
885
+ z: 0
886
+ };
887
+ if (this.gamepadLook.x !== 0 || this.gamepadLook.y !== 0) {
888
+ const pitch = this.gamepadLook.y * (this.invertGamepadY ? -1 : 1);
889
+ viewDelta = {
890
+ x: viewDelta.x + pitch * pitchStep * this.gamepadLookScale,
891
+ y: viewDelta.y + this.gamepadLook.x * yawStep * this.gamepadLookScale,
892
+ z: 0
893
+ };
894
+ }
895
+ if (this.touchLook.x !== 0 || this.touchLook.y !== 0) {
896
+ const pitch = this.touchLook.y * (this.invertMouseY ? -1 : 1);
897
+ viewDelta = {
898
+ x: viewDelta.x + pitch * pitchStep,
899
+ y: viewDelta.y + this.touchLook.x * yawStep,
900
+ z: 0
901
+ };
902
+ }
903
+ if (this.pointerLocked || !this.requirePointerLock) {
904
+ const sampledDelta = this.sampleMouseDelta();
905
+ const mouseDelta = mouseDeltaToViewDelta(sampledDelta, {
906
+ sensitivity: this.sensitivity,
907
+ sensitivityX: this.sensitivityX,
908
+ sensitivityY: this.sensitivityY,
909
+ invertY: this.invertMouseY
910
+ });
911
+ viewDelta = {
912
+ x: viewDelta.x + mouseDelta.x,
913
+ y: viewDelta.y + mouseDelta.y,
914
+ z: 0
915
+ };
916
+ }
917
+ const angles = addViewAngles(this.viewAngles, viewDelta);
918
+ this.viewAngles = angles;
919
+ const forward = this.sample("+forward" /* Forward */, frameMsec, now);
920
+ const back = this.sample("+back" /* Back */, frameMsec, now);
921
+ const moveLeft = this.sample("+moveleft" /* MoveLeft */, frameMsec, now);
922
+ const moveRight = this.sample("+moveright" /* MoveRight */, frameMsec, now);
923
+ const moveUp = this.sample("+moveup" /* MoveUp */, frameMsec, now);
924
+ const moveDown = this.sample("+movedown" /* MoveDown */, frameMsec, now);
925
+ const speed = this.sample("+speed" /* SpeedModifier */, frameMsec, now);
926
+ const jump = this.sample("+jump" /* Jump */, frameMsec, now);
927
+ const crouch = this.sample("+crouch" /* Crouch */, frameMsec, now);
928
+ const speedScale = this.runByDefault ? speed.active ? 0.5 : 1 : speed.active ? 1 : 0.5;
929
+ let forwardmove = this.forwardSpeed * (forward.fraction - back.fraction) * speedScale;
930
+ let sidemove = this.sideSpeed * (moveRight.fraction - moveLeft.fraction) * speedScale;
931
+ let upmove = this.upSpeed * (moveUp.fraction - moveDown.fraction);
932
+ if (this.gamepadMove.x !== 0 || this.gamepadMove.y !== 0) {
933
+ forwardmove += this.forwardSpeed * this.gamepadMove.y * speedScale;
934
+ sidemove += this.sideSpeed * this.gamepadMove.x * speedScale;
935
+ }
936
+ if (this.touchMove.x !== 0 || this.touchMove.y !== 0) {
937
+ forwardmove += this.forwardSpeed * this.touchMove.y * speedScale;
938
+ sidemove += this.sideSpeed * this.touchMove.x * speedScale;
939
+ }
940
+ if (this.jumpAddsUpMove && jump.fraction > 0) {
941
+ upmove += this.upSpeed * jump.fraction;
942
+ }
943
+ if (this.crouchAddsDownMove && crouch.fraction > 0) {
944
+ upmove -= this.upSpeed * crouch.fraction;
945
+ }
946
+ forwardmove = this.clampMove(forwardmove, this.forwardSpeed);
947
+ sidemove = this.clampMove(sidemove, this.sideSpeed);
948
+ upmove = this.clampMove(upmove, this.upSpeed);
949
+ let buttons = this.collectButtonBits(frameMsec, now);
950
+ const msec = Math.min(Math.max(Math.round(frameMsec), 1), MSEC_MAX2);
951
+ if (this.anyPressed || buttons !== PlayerButton.None) {
952
+ buttons |= PlayerButton.Any;
953
+ }
954
+ this.anyPressed = false;
955
+ return {
956
+ msec,
957
+ buttons,
958
+ angles: { ...this.viewAngles },
959
+ forwardmove,
960
+ sidemove,
961
+ upmove,
962
+ serverFrame
963
+ };
964
+ }
965
+ consumeConsoleCommands() {
966
+ const commands = this.commandQueue;
967
+ this.commandQueue = [];
968
+ return commands;
969
+ }
970
+ pollGamepads(now) {
971
+ const gamepads = this.getGamepads?.() ?? this.pendingGamepads ?? [];
972
+ this.pendingGamepads = void 0;
973
+ this.gamepadMove = { x: 0, y: 0 };
974
+ this.gamepadLook = { x: 0, y: 0 };
975
+ const pressedThisFrame = /* @__PURE__ */ new Set();
976
+ for (const pad of gamepads) {
977
+ if (!pad || pad.connected === false) continue;
978
+ const index = pad.index ?? 0;
979
+ const axes = pad.axes ?? [];
980
+ this.gamepadMove = {
981
+ x: this.mergeAnalog(this.gamepadMove.x, this.applyDeadZone(axes[0] ?? 0)),
982
+ y: this.mergeAnalog(this.gamepadMove.y, -this.applyDeadZone(axes[1] ?? 0))
983
+ };
984
+ this.gamepadLook = {
985
+ x: this.mergeAnalog(this.gamepadLook.x, this.applyDeadZone(axes[2] ?? 0)),
986
+ y: this.mergeAnalog(this.gamepadLook.y, this.applyDeadZone(axes[3] ?? 0))
987
+ };
988
+ const buttons = pad.buttons ?? [];
989
+ for (let i = 0; i < buttons.length; i++) {
990
+ const button = buttons[i];
991
+ if (!button) continue;
992
+ const pressed = button.pressed || button.value > this.gamepadDeadZone;
993
+ const code = this.gamepadButtonCode(index, i);
994
+ if (pressed) pressedThisFrame.add(code);
995
+ const wasPressed = this.gamepadButtons.get(code) ?? false;
996
+ if (pressed !== wasPressed) {
997
+ this.applyCommand(this.bindings.getBinding(code), pressed, code, now);
998
+ this.gamepadButtons.set(code, pressed);
999
+ }
1000
+ }
1001
+ }
1002
+ for (const [code, wasPressed] of this.gamepadButtons.entries()) {
1003
+ if (wasPressed && !pressedThisFrame.has(code)) {
1004
+ this.applyCommand(this.bindings.getBinding(code), false, code, now);
1005
+ this.gamepadButtons.set(code, false);
1006
+ }
1007
+ }
1008
+ }
1009
+ applyTouchState(now) {
1010
+ const state = this.pendingTouchState;
1011
+ if (!state) return;
1012
+ this.pendingTouchState = void 0;
1013
+ if (state.move) {
1014
+ this.touchMove = {
1015
+ x: this.clampAnalog(state.move.x),
1016
+ y: this.clampAnalog(state.move.y)
1017
+ };
1018
+ }
1019
+ if (state.look) {
1020
+ this.touchLook = {
1021
+ x: this.clampAnalog(state.look.x),
1022
+ y: this.clampAnalog(state.look.y)
1023
+ };
1024
+ }
1025
+ if (state.buttons) {
1026
+ for (const [action, pressed] of Object.entries(state.buttons)) {
1027
+ if (pressed === void 0) continue;
1028
+ const wasPressed = this.touchButtons.get(action) ?? false;
1029
+ if (pressed !== wasPressed) {
1030
+ this.applyCommand(action, pressed, this.touchButtonCode(action), now);
1031
+ this.touchButtons.set(action, pressed);
1032
+ }
1033
+ }
1034
+ }
1035
+ }
1036
+ applyCommand(command, isDown, code, eventTimeMs) {
1037
+ if (!command) return;
1038
+ const action = commandToAction(command);
1039
+ if (action) {
1040
+ const button = this.lookupButton(action);
1041
+ if (isDown) {
1042
+ if (button.press(code, eventTimeMs)) {
1043
+ this.commandQueue.push(action);
1044
+ }
1045
+ this.anyPressed = true;
1046
+ } else if (button.release(code, eventTimeMs)) {
1047
+ this.commandQueue.push(action.replace("+", "-"));
1048
+ }
1049
+ } else if (isDown) {
1050
+ this.commandQueue.push(command);
1051
+ }
1052
+ }
1053
+ sampleMouseDelta() {
1054
+ const delta = this.mouseDelta;
1055
+ this.mouseDelta = { deltaX: 0, deltaY: 0 };
1056
+ if (!this.mouseFilter) {
1057
+ this.previousMouseDelta = delta;
1058
+ return delta;
1059
+ }
1060
+ const filtered = {
1061
+ deltaX: (delta.deltaX + this.previousMouseDelta.deltaX) * 0.5,
1062
+ deltaY: (delta.deltaY + this.previousMouseDelta.deltaY) * 0.5
1063
+ };
1064
+ this.previousMouseDelta = delta;
1065
+ return filtered;
1066
+ }
1067
+ collectButtonBits(frameMsec, now) {
1068
+ let buttons = PlayerButton.None;
1069
+ for (const [action, bit] of Object.entries(BUTTON_ACTIONS)) {
1070
+ const sample = this.sample(action, frameMsec, now);
1071
+ if (sample.fraction > 0 || sample.active || sample.wasPressed) {
1072
+ buttons |= bit;
1073
+ }
1074
+ }
1075
+ return buttons;
1076
+ }
1077
+ lookupButton(action) {
1078
+ let button = this.buttons.get(action);
1079
+ if (!button) {
1080
+ button = new KeyButton();
1081
+ this.buttons.set(action, button);
1082
+ }
1083
+ return button;
1084
+ }
1085
+ mouseButtonToCode(button) {
1086
+ if (button === 0) return "Mouse1";
1087
+ if (button === 1) return "Mouse3";
1088
+ if (button === 2) return "Mouse2";
1089
+ return `Mouse${button + 1}`;
1090
+ }
1091
+ mouseButtonToCommand(code) {
1092
+ return this.bindings.getBinding(code);
1093
+ }
1094
+ sample(action, frameMsec, now) {
1095
+ const button = this.lookupButton(action);
1096
+ return button.sample(frameMsec, now);
1097
+ }
1098
+ gamepadButtonCode(index, button) {
1099
+ return `Gamepad${index}-Button${button}`;
1100
+ }
1101
+ touchButtonCode(action) {
1102
+ return `Touch-${action}`;
1103
+ }
1104
+ clampAnalog(value) {
1105
+ return Math.max(-1, Math.min(1, value));
1106
+ }
1107
+ applyDeadZone(value) {
1108
+ return Math.abs(value) < this.gamepadDeadZone ? 0 : value;
1109
+ }
1110
+ mergeAnalog(current, incoming) {
1111
+ return Math.abs(incoming) > Math.abs(current) ? incoming : current;
1112
+ }
1113
+ clampMove(value, max) {
1114
+ return Math.max(-max, Math.min(max, value));
1115
+ }
1116
+ };
1117
+
1118
+ // src/input/command-buffer.ts
1119
+ var InputCommandBuffer = class {
1120
+ constructor(options, controller = new InputController(options)) {
1121
+ this.queued = [];
1122
+ this.controller = controller;
1123
+ }
1124
+ captureFrame(frameMsec, now, serverFrame) {
1125
+ const command = this.controller.buildCommand(frameMsec, now, serverFrame);
1126
+ const console = this.controller.consumeConsoleCommands();
1127
+ const entry = { command, console };
1128
+ this.queued.push(entry);
1129
+ return entry;
1130
+ }
1131
+ consumeQueued() {
1132
+ const queued = [...this.queued];
1133
+ this.queued.length = 0;
1134
+ return queued;
1135
+ }
1136
+ getController() {
1137
+ return this.controller;
1138
+ }
1139
+ };
1140
+
1
1141
  // src/index.ts
2
1142
  function createClient(imports) {
1143
+ const prediction = new ClientPrediction();
1144
+ const view = new ViewEffects();
3
1145
  let latestFrame;
1146
+ let lastRendered;
1147
+ let lastView;
4
1148
  return {
5
1149
  init(initial) {
6
1150
  latestFrame = initial;
1151
+ if (initial?.state) {
1152
+ prediction.setAuthoritative(initial);
1153
+ }
7
1154
  void imports.engine.trace({ x: 0, y: 0, z: 0 }, { x: 1, y: 0, z: 0 });
8
1155
  },
9
- predict(next) {
10
- const { origin, velocity } = next;
11
- return {
12
- origin: {
13
- x: origin.x + velocity.x,
14
- y: origin.y + velocity.y,
15
- z: origin.z + velocity.z
16
- },
17
- velocity
18
- };
1156
+ predict(command) {
1157
+ return prediction.enqueueCommand(command);
19
1158
  },
20
1159
  render(sample) {
21
- latestFrame = sample.latest ?? latestFrame;
1160
+ if (sample.latest?.state) {
1161
+ prediction.setAuthoritative(sample.latest);
1162
+ latestFrame = sample.latest;
1163
+ }
1164
+ if (sample.previous?.state && sample.latest?.state) {
1165
+ lastRendered = interpolatePredictionState(sample.previous.state, sample.latest.state, sample.alpha);
1166
+ } else {
1167
+ lastRendered = sample.latest?.state ?? sample.previous?.state ?? prediction.getPredictedState();
1168
+ }
1169
+ const frameTimeMs = sample.latest && sample.previous ? Math.max(0, sample.latest.timeMs - sample.previous.timeMs) : 0;
1170
+ lastView = view.sample(lastRendered, frameTimeMs);
1171
+ void imports;
22
1172
  void sample;
23
1173
  },
24
1174
  shutdown() {
25
1175
  latestFrame = void 0;
1176
+ lastRendered = void 0;
1177
+ },
1178
+ get prediction() {
1179
+ return prediction;
1180
+ },
1181
+ get lastRendered() {
1182
+ return lastRendered;
1183
+ },
1184
+ get view() {
1185
+ return view;
1186
+ },
1187
+ get lastView() {
1188
+ return lastView;
26
1189
  }
27
1190
  };
28
1191
  }
29
1192
  export {
30
- createClient
1193
+ ClientPrediction,
1194
+ InputAction,
1195
+ InputBindings,
1196
+ InputCommandBuffer,
1197
+ InputController,
1198
+ ViewEffects,
1199
+ createClient,
1200
+ createDefaultBindings,
1201
+ defaultPredictionState,
1202
+ interpolatePredictionState,
1203
+ normalizeCommand,
1204
+ normalizeInputCode
31
1205
  };
32
1206
  //# sourceMappingURL=index.js.map