quake2ts 0.0.407 → 0.0.410
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 +16 -16
- package/packages/client/dist/browser/index.global.js.map +1 -1
- package/packages/client/dist/cjs/index.cjs +463 -74
- package/packages/client/dist/cjs/index.cjs.map +1 -1
- package/packages/client/dist/esm/index.js +463 -74
- package/packages/client/dist/esm/index.js.map +1 -1
- package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/client/dist/types/demo/handler.d.ts +3 -0
- package/packages/client/dist/types/demo/handler.d.ts.map +1 -1
- package/packages/client/dist/types/effects-system.d.ts +17 -0
- package/packages/client/dist/types/effects-system.d.ts.map +1 -0
- package/packages/client/dist/types/index.d.ts +2 -0
- package/packages/client/dist/types/index.d.ts.map +1 -1
- package/packages/client/dist/types/net/connection.d.ts +21 -4
- package/packages/client/dist/types/net/connection.d.ts.map +1 -1
- package/packages/engine/dist/browser/index.global.js +14 -14
- package/packages/engine/dist/browser/index.global.js.map +1 -1
- package/packages/engine/dist/cjs/index.cjs +91 -7
- package/packages/engine/dist/cjs/index.cjs.map +1 -1
- package/packages/engine/dist/esm/index.js +90 -7
- package/packages/engine/dist/esm/index.js.map +1 -1
- package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/engine/dist/types/assets/headlessLoader.d.ts +11 -0
- package/packages/engine/dist/types/assets/headlessLoader.d.ts.map +1 -0
- package/packages/engine/dist/types/index.d.ts +1 -1
- package/packages/engine/dist/types/index.d.ts.map +1 -1
- package/packages/engine/dist/types/render/bsp/generator.d.ts +25 -0
- package/packages/engine/dist/types/render/bsp/generator.d.ts.map +1 -0
- package/packages/engine/dist/types/render/bsp/geometry.d.ts.map +1 -1
- package/packages/engine/dist/types/render/camera.d.ts +11 -0
- package/packages/engine/dist/types/render/camera.d.ts.map +1 -1
- package/packages/engine/dist/types/render/cameraController.d.ts +23 -0
- package/packages/engine/dist/types/render/cameraController.d.ts.map +1 -0
- package/packages/engine/dist/types/render/debug.d.ts +20 -0
- package/packages/engine/dist/types/render/debug.d.ts.map +1 -0
- package/packages/engine/dist/types/render/options.d.ts +9 -0
- package/packages/engine/dist/types/render/options.d.ts.map +1 -0
- package/packages/engine/dist/types/render/renderer.d.ts +4 -1
- package/packages/engine/dist/types/render/renderer.d.ts.map +1 -1
- package/packages/engine/dist/types/render/types.d.ts +22 -0
- package/packages/engine/dist/types/render/types.d.ts.map +1 -0
- package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
|
@@ -1880,6 +1880,7 @@ var DEG_TO_RAD = Math.PI / 180;
|
|
|
1880
1880
|
var DEG2RAD_FACTOR = Math.PI / 180;
|
|
1881
1881
|
var RAD2DEG_FACTOR = 180 / Math.PI;
|
|
1882
1882
|
var DEG2RAD = DEG2RAD_FACTOR;
|
|
1883
|
+
var RAD2DEG = RAD2DEG_FACTOR;
|
|
1883
1884
|
var ANORMS = [
|
|
1884
1885
|
[-0.525731, 0, 0.850651],
|
|
1885
1886
|
[-0.442863, 0.238856, 0.864188],
|
|
@@ -2220,72 +2221,72 @@ var ServerCommand = /* @__PURE__ */ ((ServerCommand22) => {
|
|
|
2220
2221
|
ServerCommand22[ServerCommand22["achievement"] = 33] = "achievement";
|
|
2221
2222
|
return ServerCommand22;
|
|
2222
2223
|
})(ServerCommand || {});
|
|
2223
|
-
var TempEntity = /* @__PURE__ */ ((
|
|
2224
|
-
|
|
2225
|
-
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
|
|
2229
|
-
|
|
2230
|
-
|
|
2231
|
-
|
|
2232
|
-
|
|
2233
|
-
|
|
2234
|
-
|
|
2235
|
-
|
|
2236
|
-
|
|
2237
|
-
|
|
2238
|
-
|
|
2239
|
-
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
|
|
2244
|
-
|
|
2245
|
-
|
|
2246
|
-
|
|
2247
|
-
|
|
2248
|
-
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
|
|
2255
|
-
|
|
2256
|
-
|
|
2257
|
-
|
|
2258
|
-
|
|
2259
|
-
|
|
2260
|
-
|
|
2261
|
-
|
|
2262
|
-
|
|
2263
|
-
|
|
2264
|
-
|
|
2265
|
-
|
|
2266
|
-
|
|
2267
|
-
|
|
2268
|
-
|
|
2269
|
-
|
|
2270
|
-
|
|
2271
|
-
|
|
2272
|
-
|
|
2273
|
-
|
|
2274
|
-
|
|
2275
|
-
|
|
2276
|
-
|
|
2277
|
-
|
|
2278
|
-
|
|
2279
|
-
|
|
2280
|
-
|
|
2281
|
-
|
|
2282
|
-
|
|
2283
|
-
|
|
2284
|
-
|
|
2285
|
-
|
|
2286
|
-
|
|
2287
|
-
|
|
2288
|
-
return
|
|
2224
|
+
var TempEntity = /* @__PURE__ */ ((TempEntity22) => {
|
|
2225
|
+
TempEntity22[TempEntity22["GUNSHOT"] = 0] = "GUNSHOT";
|
|
2226
|
+
TempEntity22[TempEntity22["BLOOD"] = 1] = "BLOOD";
|
|
2227
|
+
TempEntity22[TempEntity22["BLASTER"] = 2] = "BLASTER";
|
|
2228
|
+
TempEntity22[TempEntity22["RAILTRAIL"] = 3] = "RAILTRAIL";
|
|
2229
|
+
TempEntity22[TempEntity22["SHOTGUN"] = 4] = "SHOTGUN";
|
|
2230
|
+
TempEntity22[TempEntity22["EXPLOSION1"] = 5] = "EXPLOSION1";
|
|
2231
|
+
TempEntity22[TempEntity22["EXPLOSION2"] = 6] = "EXPLOSION2";
|
|
2232
|
+
TempEntity22[TempEntity22["ROCKET_EXPLOSION"] = 7] = "ROCKET_EXPLOSION";
|
|
2233
|
+
TempEntity22[TempEntity22["GRENADE_EXPLOSION"] = 8] = "GRENADE_EXPLOSION";
|
|
2234
|
+
TempEntity22[TempEntity22["SPARKS"] = 9] = "SPARKS";
|
|
2235
|
+
TempEntity22[TempEntity22["SPLASH"] = 10] = "SPLASH";
|
|
2236
|
+
TempEntity22[TempEntity22["BUBBLETRAIL"] = 11] = "BUBBLETRAIL";
|
|
2237
|
+
TempEntity22[TempEntity22["SCREEN_SPARKS"] = 12] = "SCREEN_SPARKS";
|
|
2238
|
+
TempEntity22[TempEntity22["SHIELD_SPARKS"] = 13] = "SHIELD_SPARKS";
|
|
2239
|
+
TempEntity22[TempEntity22["BULLET_SPARKS"] = 14] = "BULLET_SPARKS";
|
|
2240
|
+
TempEntity22[TempEntity22["LASER_SPARKS"] = 15] = "LASER_SPARKS";
|
|
2241
|
+
TempEntity22[TempEntity22["PARASITE_ATTACK"] = 16] = "PARASITE_ATTACK";
|
|
2242
|
+
TempEntity22[TempEntity22["ROCKET_EXPLOSION_WATER"] = 17] = "ROCKET_EXPLOSION_WATER";
|
|
2243
|
+
TempEntity22[TempEntity22["GRENADE_EXPLOSION_WATER"] = 18] = "GRENADE_EXPLOSION_WATER";
|
|
2244
|
+
TempEntity22[TempEntity22["MEDIC_CABLE_ATTACK"] = 19] = "MEDIC_CABLE_ATTACK";
|
|
2245
|
+
TempEntity22[TempEntity22["BFG_EXPLOSION"] = 20] = "BFG_EXPLOSION";
|
|
2246
|
+
TempEntity22[TempEntity22["BFG_BIGEXPLOSION"] = 21] = "BFG_BIGEXPLOSION";
|
|
2247
|
+
TempEntity22[TempEntity22["BOSSTPORT"] = 22] = "BOSSTPORT";
|
|
2248
|
+
TempEntity22[TempEntity22["BFG_LASER"] = 23] = "BFG_LASER";
|
|
2249
|
+
TempEntity22[TempEntity22["GRAPPLE_CABLE"] = 24] = "GRAPPLE_CABLE";
|
|
2250
|
+
TempEntity22[TempEntity22["WELDING_SPARKS"] = 25] = "WELDING_SPARKS";
|
|
2251
|
+
TempEntity22[TempEntity22["GREENBLOOD"] = 26] = "GREENBLOOD";
|
|
2252
|
+
TempEntity22[TempEntity22["BLUEHYPERBLASTER"] = 27] = "BLUEHYPERBLASTER";
|
|
2253
|
+
TempEntity22[TempEntity22["PLASMA_EXPLOSION"] = 28] = "PLASMA_EXPLOSION";
|
|
2254
|
+
TempEntity22[TempEntity22["TUNNEL_SPARKS"] = 29] = "TUNNEL_SPARKS";
|
|
2255
|
+
TempEntity22[TempEntity22["BLASTER2"] = 30] = "BLASTER2";
|
|
2256
|
+
TempEntity22[TempEntity22["RAILTRAIL2"] = 31] = "RAILTRAIL2";
|
|
2257
|
+
TempEntity22[TempEntity22["FLAME"] = 32] = "FLAME";
|
|
2258
|
+
TempEntity22[TempEntity22["LIGHTNING"] = 33] = "LIGHTNING";
|
|
2259
|
+
TempEntity22[TempEntity22["DEBUGTRAIL"] = 34] = "DEBUGTRAIL";
|
|
2260
|
+
TempEntity22[TempEntity22["PLAIN_EXPLOSION"] = 35] = "PLAIN_EXPLOSION";
|
|
2261
|
+
TempEntity22[TempEntity22["FLASHLIGHT"] = 36] = "FLASHLIGHT";
|
|
2262
|
+
TempEntity22[TempEntity22["FORCEWALL"] = 37] = "FORCEWALL";
|
|
2263
|
+
TempEntity22[TempEntity22["HEATBEAM"] = 38] = "HEATBEAM";
|
|
2264
|
+
TempEntity22[TempEntity22["MONSTER_HEATBEAM"] = 39] = "MONSTER_HEATBEAM";
|
|
2265
|
+
TempEntity22[TempEntity22["STEAM"] = 40] = "STEAM";
|
|
2266
|
+
TempEntity22[TempEntity22["BUBBLETRAIL2"] = 41] = "BUBBLETRAIL2";
|
|
2267
|
+
TempEntity22[TempEntity22["MOREBLOOD"] = 42] = "MOREBLOOD";
|
|
2268
|
+
TempEntity22[TempEntity22["HEATBEAM_SPARKS"] = 43] = "HEATBEAM_SPARKS";
|
|
2269
|
+
TempEntity22[TempEntity22["HEATBEAM_STEAM"] = 44] = "HEATBEAM_STEAM";
|
|
2270
|
+
TempEntity22[TempEntity22["CHAINFIST_SMOKE"] = 45] = "CHAINFIST_SMOKE";
|
|
2271
|
+
TempEntity22[TempEntity22["ELECTRIC_SPARKS"] = 46] = "ELECTRIC_SPARKS";
|
|
2272
|
+
TempEntity22[TempEntity22["TRACKER_EXPLOSION"] = 47] = "TRACKER_EXPLOSION";
|
|
2273
|
+
TempEntity22[TempEntity22["TELEPORT_EFFECT"] = 48] = "TELEPORT_EFFECT";
|
|
2274
|
+
TempEntity22[TempEntity22["DBALL_GOAL"] = 49] = "DBALL_GOAL";
|
|
2275
|
+
TempEntity22[TempEntity22["WIDOWBEAMOUT"] = 50] = "WIDOWBEAMOUT";
|
|
2276
|
+
TempEntity22[TempEntity22["NUKEBLAST"] = 51] = "NUKEBLAST";
|
|
2277
|
+
TempEntity22[TempEntity22["WIDOWSPLASH"] = 52] = "WIDOWSPLASH";
|
|
2278
|
+
TempEntity22[TempEntity22["EXPLOSION1_BIG"] = 53] = "EXPLOSION1_BIG";
|
|
2279
|
+
TempEntity22[TempEntity22["EXPLOSION1_NP"] = 54] = "EXPLOSION1_NP";
|
|
2280
|
+
TempEntity22[TempEntity22["FLECHETTE"] = 55] = "FLECHETTE";
|
|
2281
|
+
TempEntity22[TempEntity22["BLUEHYPERBLASTER_KEX"] = 56] = "BLUEHYPERBLASTER_KEX";
|
|
2282
|
+
TempEntity22[TempEntity22["BFG_ZAP"] = 57] = "BFG_ZAP";
|
|
2283
|
+
TempEntity22[TempEntity22["BERSERK_SLAM"] = 58] = "BERSERK_SLAM";
|
|
2284
|
+
TempEntity22[TempEntity22["GRAPPLE_CABLE_2"] = 59] = "GRAPPLE_CABLE_2";
|
|
2285
|
+
TempEntity22[TempEntity22["POWER_SPLASH"] = 60] = "POWER_SPLASH";
|
|
2286
|
+
TempEntity22[TempEntity22["LIGHTNING_BEAM"] = 61] = "LIGHTNING_BEAM";
|
|
2287
|
+
TempEntity22[TempEntity22["EXPLOSION1_NL"] = 62] = "EXPLOSION1_NL";
|
|
2288
|
+
TempEntity22[TempEntity22["EXPLOSION2_NL"] = 63] = "EXPLOSION2_NL";
|
|
2289
|
+
return TempEntity22;
|
|
2289
2290
|
})(TempEntity || {});
|
|
2290
2291
|
var AMMO_MAX = 12;
|
|
2291
2292
|
var NUM_BITS_FOR_AMMO = 9;
|
|
@@ -3096,6 +3097,43 @@ var BSP_VERTEX_LAYOUT = [
|
|
|
3096
3097
|
{ index: 2, size: 2, type: 5126, stride: STRIDE, offset: 5 * FLOAT_BYTES }
|
|
3097
3098
|
];
|
|
3098
3099
|
var MAX_DLIGHTS = 32;
|
|
3100
|
+
var DynamicLightManager = class {
|
|
3101
|
+
constructor() {
|
|
3102
|
+
this.lights = [];
|
|
3103
|
+
}
|
|
3104
|
+
/**
|
|
3105
|
+
* Adds a dynamic light or updates an existing one with the same key.
|
|
3106
|
+
*/
|
|
3107
|
+
addLight(dlight, time) {
|
|
3108
|
+
if (dlight.key !== void 0) {
|
|
3109
|
+
const index = this.lights.findIndex((l) => l.key === dlight.key);
|
|
3110
|
+
if (index !== -1) {
|
|
3111
|
+
this.lights[index] = dlight;
|
|
3112
|
+
return;
|
|
3113
|
+
}
|
|
3114
|
+
}
|
|
3115
|
+
this.lights.push(dlight);
|
|
3116
|
+
}
|
|
3117
|
+
/**
|
|
3118
|
+
* Clears all lights (e.g., map change).
|
|
3119
|
+
*/
|
|
3120
|
+
clear() {
|
|
3121
|
+
this.lights = [];
|
|
3122
|
+
}
|
|
3123
|
+
/**
|
|
3124
|
+
* Updates the list of active lights, removing expired ones.
|
|
3125
|
+
* @param time Current game time in seconds.
|
|
3126
|
+
*/
|
|
3127
|
+
update(time) {
|
|
3128
|
+
this.lights = this.lights.filter((l) => l.die > time);
|
|
3129
|
+
}
|
|
3130
|
+
/**
|
|
3131
|
+
* Returns the current list of active lights.
|
|
3132
|
+
*/
|
|
3133
|
+
getActiveLights() {
|
|
3134
|
+
return this.lights;
|
|
3135
|
+
}
|
|
3136
|
+
};
|
|
3099
3137
|
var BSP_SURFACE_FRAGMENT_SOURCE = `#version 300 es
|
|
3100
3138
|
precision highp float;
|
|
3101
3139
|
|
|
@@ -3403,15 +3441,21 @@ var Camera = class {
|
|
|
3403
3441
|
return this._position;
|
|
3404
3442
|
}
|
|
3405
3443
|
set position(value) {
|
|
3406
|
-
vec3_exports.
|
|
3407
|
-
|
|
3444
|
+
if (!vec3_exports.equals(this._position, value)) {
|
|
3445
|
+
vec3_exports.copy(this._position, value);
|
|
3446
|
+
this._dirty = true;
|
|
3447
|
+
this.triggerMoveEvent();
|
|
3448
|
+
}
|
|
3408
3449
|
}
|
|
3409
3450
|
get angles() {
|
|
3410
3451
|
return this._angles;
|
|
3411
3452
|
}
|
|
3412
3453
|
set angles(value) {
|
|
3413
|
-
vec3_exports.
|
|
3414
|
-
|
|
3454
|
+
if (!vec3_exports.equals(this._angles, value)) {
|
|
3455
|
+
vec3_exports.copy(this._angles, value);
|
|
3456
|
+
this._dirty = true;
|
|
3457
|
+
this.triggerMoveEvent();
|
|
3458
|
+
}
|
|
3415
3459
|
}
|
|
3416
3460
|
get bobAngles() {
|
|
3417
3461
|
return this._bobAngles;
|
|
@@ -3455,6 +3499,47 @@ var Camera = class {
|
|
|
3455
3499
|
this._aspect = value;
|
|
3456
3500
|
this._dirty = true;
|
|
3457
3501
|
}
|
|
3502
|
+
// API Methods
|
|
3503
|
+
setPosition(x, y, z) {
|
|
3504
|
+
const newPos = vec3_exports.fromValues(x, y, z);
|
|
3505
|
+
if (!vec3_exports.equals(this._position, newPos)) {
|
|
3506
|
+
vec3_exports.copy(this._position, newPos);
|
|
3507
|
+
this._dirty = true;
|
|
3508
|
+
this.triggerMoveEvent();
|
|
3509
|
+
}
|
|
3510
|
+
}
|
|
3511
|
+
setRotation(pitch, yaw, roll) {
|
|
3512
|
+
const newAngles = vec3_exports.fromValues(pitch, yaw, roll);
|
|
3513
|
+
if (!vec3_exports.equals(this._angles, newAngles)) {
|
|
3514
|
+
vec3_exports.copy(this._angles, newAngles);
|
|
3515
|
+
this._dirty = true;
|
|
3516
|
+
this.triggerMoveEvent();
|
|
3517
|
+
}
|
|
3518
|
+
}
|
|
3519
|
+
setFov(fov) {
|
|
3520
|
+
this.fov = fov;
|
|
3521
|
+
}
|
|
3522
|
+
setAspectRatio(aspect) {
|
|
3523
|
+
this.aspect = aspect;
|
|
3524
|
+
}
|
|
3525
|
+
lookAt(target) {
|
|
3526
|
+
const direction = vec3_exports.create();
|
|
3527
|
+
vec3_exports.subtract(direction, target, this._position);
|
|
3528
|
+
const len2 = vec3_exports.length(direction);
|
|
3529
|
+
if (len2 < 1e-3) return;
|
|
3530
|
+
const yaw = Math.atan2(direction[1], direction[0]) * RAD2DEG;
|
|
3531
|
+
const hyp = Math.hypot(direction[0], direction[1]);
|
|
3532
|
+
const pitch = -Math.atan2(direction[2], hyp) * RAD2DEG;
|
|
3533
|
+
this.setRotation(pitch, yaw, 0);
|
|
3534
|
+
}
|
|
3535
|
+
triggerMoveEvent() {
|
|
3536
|
+
if (this.onCameraMove) {
|
|
3537
|
+
this.onCameraMove({
|
|
3538
|
+
position: vec3_exports.clone(this._position),
|
|
3539
|
+
angles: vec3_exports.clone(this._angles)
|
|
3540
|
+
});
|
|
3541
|
+
}
|
|
3542
|
+
}
|
|
3458
3543
|
get viewMatrix() {
|
|
3459
3544
|
this.updateMatrices();
|
|
3460
3545
|
return this._viewMatrix;
|
|
@@ -3530,11 +3615,8 @@ var Camera = class {
|
|
|
3530
3615
|
vec3_exports.transformMat4(rotatedPosQuake, negativePosition, rotationQuake);
|
|
3531
3616
|
const translationGl = vec3_exports.fromValues(
|
|
3532
3617
|
rotatedPosQuake[1] || 0,
|
|
3533
|
-
// Y in Quake -> X in WebGL (negation already applied above)
|
|
3534
3618
|
rotatedPosQuake[2] || 0,
|
|
3535
|
-
// Z in Quake -> Y in WebGL
|
|
3536
3619
|
rotatedPosQuake[0] || 0
|
|
3537
|
-
// X in Quake -> Z in WebGL (negation already applied above)
|
|
3538
3620
|
);
|
|
3539
3621
|
mat4_exports.copy(this._viewMatrix, rotationGl);
|
|
3540
3622
|
this._viewMatrix[12] = translationGl[0];
|
|
@@ -9895,6 +9977,73 @@ var ClientCommand = /* @__PURE__ */ ((ClientCommand2) => {
|
|
|
9895
9977
|
ClientCommand2[ClientCommand2["stringcmd"] = 4] = "stringcmd";
|
|
9896
9978
|
return ClientCommand2;
|
|
9897
9979
|
})(ClientCommand || {});
|
|
9980
|
+
var TempEntity2 = /* @__PURE__ */ ((TempEntity22) => {
|
|
9981
|
+
TempEntity22[TempEntity22["GUNSHOT"] = 0] = "GUNSHOT";
|
|
9982
|
+
TempEntity22[TempEntity22["BLOOD"] = 1] = "BLOOD";
|
|
9983
|
+
TempEntity22[TempEntity22["BLASTER"] = 2] = "BLASTER";
|
|
9984
|
+
TempEntity22[TempEntity22["RAILTRAIL"] = 3] = "RAILTRAIL";
|
|
9985
|
+
TempEntity22[TempEntity22["SHOTGUN"] = 4] = "SHOTGUN";
|
|
9986
|
+
TempEntity22[TempEntity22["EXPLOSION1"] = 5] = "EXPLOSION1";
|
|
9987
|
+
TempEntity22[TempEntity22["EXPLOSION2"] = 6] = "EXPLOSION2";
|
|
9988
|
+
TempEntity22[TempEntity22["ROCKET_EXPLOSION"] = 7] = "ROCKET_EXPLOSION";
|
|
9989
|
+
TempEntity22[TempEntity22["GRENADE_EXPLOSION"] = 8] = "GRENADE_EXPLOSION";
|
|
9990
|
+
TempEntity22[TempEntity22["SPARKS"] = 9] = "SPARKS";
|
|
9991
|
+
TempEntity22[TempEntity22["SPLASH"] = 10] = "SPLASH";
|
|
9992
|
+
TempEntity22[TempEntity22["BUBBLETRAIL"] = 11] = "BUBBLETRAIL";
|
|
9993
|
+
TempEntity22[TempEntity22["SCREEN_SPARKS"] = 12] = "SCREEN_SPARKS";
|
|
9994
|
+
TempEntity22[TempEntity22["SHIELD_SPARKS"] = 13] = "SHIELD_SPARKS";
|
|
9995
|
+
TempEntity22[TempEntity22["BULLET_SPARKS"] = 14] = "BULLET_SPARKS";
|
|
9996
|
+
TempEntity22[TempEntity22["LASER_SPARKS"] = 15] = "LASER_SPARKS";
|
|
9997
|
+
TempEntity22[TempEntity22["PARASITE_ATTACK"] = 16] = "PARASITE_ATTACK";
|
|
9998
|
+
TempEntity22[TempEntity22["ROCKET_EXPLOSION_WATER"] = 17] = "ROCKET_EXPLOSION_WATER";
|
|
9999
|
+
TempEntity22[TempEntity22["GRENADE_EXPLOSION_WATER"] = 18] = "GRENADE_EXPLOSION_WATER";
|
|
10000
|
+
TempEntity22[TempEntity22["MEDIC_CABLE_ATTACK"] = 19] = "MEDIC_CABLE_ATTACK";
|
|
10001
|
+
TempEntity22[TempEntity22["BFG_EXPLOSION"] = 20] = "BFG_EXPLOSION";
|
|
10002
|
+
TempEntity22[TempEntity22["BFG_BIGEXPLOSION"] = 21] = "BFG_BIGEXPLOSION";
|
|
10003
|
+
TempEntity22[TempEntity22["BOSSTPORT"] = 22] = "BOSSTPORT";
|
|
10004
|
+
TempEntity22[TempEntity22["BFG_LASER"] = 23] = "BFG_LASER";
|
|
10005
|
+
TempEntity22[TempEntity22["GRAPPLE_CABLE"] = 24] = "GRAPPLE_CABLE";
|
|
10006
|
+
TempEntity22[TempEntity22["WELDING_SPARKS"] = 25] = "WELDING_SPARKS";
|
|
10007
|
+
TempEntity22[TempEntity22["GREENBLOOD"] = 26] = "GREENBLOOD";
|
|
10008
|
+
TempEntity22[TempEntity22["BLUEHYPERBLASTER"] = 27] = "BLUEHYPERBLASTER";
|
|
10009
|
+
TempEntity22[TempEntity22["PLASMA_EXPLOSION"] = 28] = "PLASMA_EXPLOSION";
|
|
10010
|
+
TempEntity22[TempEntity22["TUNNEL_SPARKS"] = 29] = "TUNNEL_SPARKS";
|
|
10011
|
+
TempEntity22[TempEntity22["BLASTER2"] = 30] = "BLASTER2";
|
|
10012
|
+
TempEntity22[TempEntity22["RAILTRAIL2"] = 31] = "RAILTRAIL2";
|
|
10013
|
+
TempEntity22[TempEntity22["FLAME"] = 32] = "FLAME";
|
|
10014
|
+
TempEntity22[TempEntity22["LIGHTNING"] = 33] = "LIGHTNING";
|
|
10015
|
+
TempEntity22[TempEntity22["DEBUGTRAIL"] = 34] = "DEBUGTRAIL";
|
|
10016
|
+
TempEntity22[TempEntity22["PLAIN_EXPLOSION"] = 35] = "PLAIN_EXPLOSION";
|
|
10017
|
+
TempEntity22[TempEntity22["FLASHLIGHT"] = 36] = "FLASHLIGHT";
|
|
10018
|
+
TempEntity22[TempEntity22["FORCEWALL"] = 37] = "FORCEWALL";
|
|
10019
|
+
TempEntity22[TempEntity22["HEATBEAM"] = 38] = "HEATBEAM";
|
|
10020
|
+
TempEntity22[TempEntity22["MONSTER_HEATBEAM"] = 39] = "MONSTER_HEATBEAM";
|
|
10021
|
+
TempEntity22[TempEntity22["STEAM"] = 40] = "STEAM";
|
|
10022
|
+
TempEntity22[TempEntity22["BUBBLETRAIL2"] = 41] = "BUBBLETRAIL2";
|
|
10023
|
+
TempEntity22[TempEntity22["MOREBLOOD"] = 42] = "MOREBLOOD";
|
|
10024
|
+
TempEntity22[TempEntity22["HEATBEAM_SPARKS"] = 43] = "HEATBEAM_SPARKS";
|
|
10025
|
+
TempEntity22[TempEntity22["HEATBEAM_STEAM"] = 44] = "HEATBEAM_STEAM";
|
|
10026
|
+
TempEntity22[TempEntity22["CHAINFIST_SMOKE"] = 45] = "CHAINFIST_SMOKE";
|
|
10027
|
+
TempEntity22[TempEntity22["ELECTRIC_SPARKS"] = 46] = "ELECTRIC_SPARKS";
|
|
10028
|
+
TempEntity22[TempEntity22["TRACKER_EXPLOSION"] = 47] = "TRACKER_EXPLOSION";
|
|
10029
|
+
TempEntity22[TempEntity22["TELEPORT_EFFECT"] = 48] = "TELEPORT_EFFECT";
|
|
10030
|
+
TempEntity22[TempEntity22["DBALL_GOAL"] = 49] = "DBALL_GOAL";
|
|
10031
|
+
TempEntity22[TempEntity22["WIDOWBEAMOUT"] = 50] = "WIDOWBEAMOUT";
|
|
10032
|
+
TempEntity22[TempEntity22["NUKEBLAST"] = 51] = "NUKEBLAST";
|
|
10033
|
+
TempEntity22[TempEntity22["WIDOWSPLASH"] = 52] = "WIDOWSPLASH";
|
|
10034
|
+
TempEntity22[TempEntity22["EXPLOSION1_BIG"] = 53] = "EXPLOSION1_BIG";
|
|
10035
|
+
TempEntity22[TempEntity22["EXPLOSION1_NP"] = 54] = "EXPLOSION1_NP";
|
|
10036
|
+
TempEntity22[TempEntity22["FLECHETTE"] = 55] = "FLECHETTE";
|
|
10037
|
+
TempEntity22[TempEntity22["BLUEHYPERBLASTER_KEX"] = 56] = "BLUEHYPERBLASTER_KEX";
|
|
10038
|
+
TempEntity22[TempEntity22["BFG_ZAP"] = 57] = "BFG_ZAP";
|
|
10039
|
+
TempEntity22[TempEntity22["BERSERK_SLAM"] = 58] = "BERSERK_SLAM";
|
|
10040
|
+
TempEntity22[TempEntity22["GRAPPLE_CABLE_2"] = 59] = "GRAPPLE_CABLE_2";
|
|
10041
|
+
TempEntity22[TempEntity22["POWER_SPLASH"] = 60] = "POWER_SPLASH";
|
|
10042
|
+
TempEntity22[TempEntity22["LIGHTNING_BEAM"] = 61] = "LIGHTNING_BEAM";
|
|
10043
|
+
TempEntity22[TempEntity22["EXPLOSION1_NL"] = 62] = "EXPLOSION1_NL";
|
|
10044
|
+
TempEntity22[TempEntity22["EXPLOSION2_NL"] = 63] = "EXPLOSION2_NL";
|
|
10045
|
+
return TempEntity22;
|
|
10046
|
+
})(TempEntity2 || {});
|
|
9898
10047
|
var CMD_BACKUP = 64;
|
|
9899
10048
|
var MZ_BLASTER = 0;
|
|
9900
10049
|
var MZ_MACHINEGUN = 1;
|
|
@@ -9908,6 +10057,7 @@ var MZ_GRENADE = 8;
|
|
|
9908
10057
|
var MZ_SSHOTGUN = 11;
|
|
9909
10058
|
var MZ_BFG = 12;
|
|
9910
10059
|
var MZ_HYPERBLASTER = 13;
|
|
10060
|
+
var MZ_BLUEHYPERBLASTER = 17;
|
|
9911
10061
|
function readUint16LE(stats, startIndex, byteOffset) {
|
|
9912
10062
|
const elementIndex = Math.floor(byteOffset / 2);
|
|
9913
10063
|
const isOdd = byteOffset % 2 !== 0;
|
|
@@ -11654,6 +11804,9 @@ var ClientNetworkHandler = class {
|
|
|
11654
11804
|
}
|
|
11655
11805
|
}
|
|
11656
11806
|
onTempEntity(type, pos, pos2, dir, cnt, color, ent, srcEnt, destEnt) {
|
|
11807
|
+
if (this.callbacks?.onTempEntity) {
|
|
11808
|
+
this.callbacks.onTempEntity(type, pos, pos2, dir, cnt, color, ent, srcEnt, destEnt);
|
|
11809
|
+
}
|
|
11657
11810
|
}
|
|
11658
11811
|
onLayout(layout) {
|
|
11659
11812
|
}
|
|
@@ -11661,8 +11814,14 @@ var ClientNetworkHandler = class {
|
|
|
11661
11814
|
this.inventory = [...inventory];
|
|
11662
11815
|
}
|
|
11663
11816
|
onMuzzleFlash(ent, weapon) {
|
|
11817
|
+
if (this.callbacks?.onMuzzleFlash) {
|
|
11818
|
+
this.callbacks.onMuzzleFlash(ent, weapon);
|
|
11819
|
+
}
|
|
11664
11820
|
}
|
|
11665
11821
|
onMuzzleFlash2(ent, weapon) {
|
|
11822
|
+
if (this.callbacks?.onMuzzleFlash2) {
|
|
11823
|
+
this.callbacks.onMuzzleFlash2(ent, weapon);
|
|
11824
|
+
}
|
|
11666
11825
|
}
|
|
11667
11826
|
onMuzzleFlash3(ent, weapon) {
|
|
11668
11827
|
const isLocalPlayer = ent === this.playerNum + 1;
|
|
@@ -13170,6 +13329,7 @@ var MultiplayerConnection = class {
|
|
|
13170
13329
|
this.levelName = "";
|
|
13171
13330
|
this.configStrings = /* @__PURE__ */ new Map();
|
|
13172
13331
|
this.baselines = /* @__PURE__ */ new Map();
|
|
13332
|
+
this.entities = /* @__PURE__ */ new Map();
|
|
13173
13333
|
this.challenge = 0;
|
|
13174
13334
|
this.connectPacketCount = 0;
|
|
13175
13335
|
this.connectPacketTime = 0;
|
|
@@ -13200,6 +13360,9 @@ var MultiplayerConnection = class {
|
|
|
13200
13360
|
setDemoRecorder(recorder) {
|
|
13201
13361
|
this.demoRecorder = recorder;
|
|
13202
13362
|
}
|
|
13363
|
+
setEffectSystem(system) {
|
|
13364
|
+
this.effectSystem = system;
|
|
13365
|
+
}
|
|
13203
13366
|
async connectToServer(address, port) {
|
|
13204
13367
|
const url = `ws://${address}:${port}`;
|
|
13205
13368
|
return this.connect(url);
|
|
@@ -13235,6 +13398,7 @@ var MultiplayerConnection = class {
|
|
|
13235
13398
|
cleanup() {
|
|
13236
13399
|
this.configStrings.clear();
|
|
13237
13400
|
this.baselines.clear();
|
|
13401
|
+
this.entities.clear();
|
|
13238
13402
|
this.commandHistory = [];
|
|
13239
13403
|
this.latestServerFrame = 0;
|
|
13240
13404
|
this.parser = null;
|
|
@@ -13369,6 +13533,13 @@ var MultiplayerConnection = class {
|
|
|
13369
13533
|
if (frame.serverFrame > this.latestServerFrame) {
|
|
13370
13534
|
this.latestServerFrame = frame.serverFrame;
|
|
13371
13535
|
}
|
|
13536
|
+
const packetEntities = frame.packetEntities;
|
|
13537
|
+
if (!packetEntities.delta) {
|
|
13538
|
+
this.entities.clear();
|
|
13539
|
+
}
|
|
13540
|
+
for (const ent of packetEntities.entities) {
|
|
13541
|
+
this.entities.set(ent.number, ent);
|
|
13542
|
+
}
|
|
13372
13543
|
if (this.prediction && frame.playerState) {
|
|
13373
13544
|
const ps = frame.playerState;
|
|
13374
13545
|
const predState = {
|
|
@@ -13397,15 +13568,29 @@ var MultiplayerConnection = class {
|
|
|
13397
13568
|
onSound(flags, soundNum, volume, attenuation, offset, ent, pos) {
|
|
13398
13569
|
}
|
|
13399
13570
|
onTempEntity(type, pos, pos2, dir, cnt, color, ent, srcEnt, destEnt) {
|
|
13571
|
+
if (this.effectSystem) {
|
|
13572
|
+
const time = Date.now() / 1e3;
|
|
13573
|
+
this.effectSystem.onTempEntity(type, pos, time);
|
|
13574
|
+
}
|
|
13400
13575
|
}
|
|
13401
13576
|
onLayout(layout) {
|
|
13402
13577
|
}
|
|
13403
13578
|
onInventory(inventory) {
|
|
13404
13579
|
}
|
|
13405
13580
|
onMuzzleFlash(ent, weapon) {
|
|
13581
|
+
if (this.effectSystem) {
|
|
13582
|
+
const time = Date.now() / 1e3;
|
|
13583
|
+
this.effectSystem.onMuzzleFlash(ent, weapon, time);
|
|
13584
|
+
}
|
|
13406
13585
|
}
|
|
13407
13586
|
onMuzzleFlash2(ent, weapon) {
|
|
13408
13587
|
}
|
|
13588
|
+
onMuzzleFlash3(ent, weapon) {
|
|
13589
|
+
if (this.effectSystem) {
|
|
13590
|
+
const time = Date.now() / 1e3;
|
|
13591
|
+
this.effectSystem.onMuzzleFlash(ent, weapon, time);
|
|
13592
|
+
}
|
|
13593
|
+
}
|
|
13409
13594
|
onDisconnect() {
|
|
13410
13595
|
this.disconnect();
|
|
13411
13596
|
}
|
|
@@ -13413,6 +13598,31 @@ var MultiplayerConnection = class {
|
|
|
13413
13598
|
}
|
|
13414
13599
|
onDownload(size, percent, data) {
|
|
13415
13600
|
}
|
|
13601
|
+
// New handlers stubs
|
|
13602
|
+
onSplitClient(clientNum) {
|
|
13603
|
+
}
|
|
13604
|
+
onConfigBlast(index, data) {
|
|
13605
|
+
}
|
|
13606
|
+
onSpawnBaselineBlast(entity) {
|
|
13607
|
+
}
|
|
13608
|
+
onLevelRestart() {
|
|
13609
|
+
}
|
|
13610
|
+
onDamage(indicators) {
|
|
13611
|
+
}
|
|
13612
|
+
onLocPrint(flags, base, args) {
|
|
13613
|
+
}
|
|
13614
|
+
onFog(data) {
|
|
13615
|
+
}
|
|
13616
|
+
onWaitingForPlayers(count) {
|
|
13617
|
+
}
|
|
13618
|
+
onBotChat(msg) {
|
|
13619
|
+
}
|
|
13620
|
+
onPoi(flags, pos) {
|
|
13621
|
+
}
|
|
13622
|
+
onHelpPath(pos) {
|
|
13623
|
+
}
|
|
13624
|
+
onAchievement(id) {
|
|
13625
|
+
}
|
|
13416
13626
|
};
|
|
13417
13627
|
|
|
13418
13628
|
// src/ui/demo-controls.ts
|
|
@@ -13560,6 +13770,152 @@ function processEntityEffects(entity, dlights, time) {
|
|
|
13560
13770
|
}
|
|
13561
13771
|
}
|
|
13562
13772
|
|
|
13773
|
+
// src/effects-system.ts
|
|
13774
|
+
var copyVec3 = (v) => ({ x: v.x, y: v.y, z: v.z });
|
|
13775
|
+
var vectorMA = (start, scale3, dir) => ({
|
|
13776
|
+
x: start.x + dir.x * scale3,
|
|
13777
|
+
y: start.y + dir.y * scale3,
|
|
13778
|
+
z: start.z + dir.z * scale3
|
|
13779
|
+
});
|
|
13780
|
+
var ClientEffectSystem = class {
|
|
13781
|
+
constructor(dlightManager, engine, entityProvider) {
|
|
13782
|
+
this.dlightManager = dlightManager;
|
|
13783
|
+
this.engine = engine;
|
|
13784
|
+
this.entityProvider = entityProvider;
|
|
13785
|
+
}
|
|
13786
|
+
// Helper to add dlight
|
|
13787
|
+
addLight(key, origin, color, radius, minLight, time) {
|
|
13788
|
+
this.dlightManager.addLight({
|
|
13789
|
+
key,
|
|
13790
|
+
origin: copyVec3(origin),
|
|
13791
|
+
color,
|
|
13792
|
+
intensity: radius,
|
|
13793
|
+
minLight,
|
|
13794
|
+
die: time
|
|
13795
|
+
}, 0);
|
|
13796
|
+
}
|
|
13797
|
+
playSound(pos, ent, soundName, vol = 1, attn = 1) {
|
|
13798
|
+
if (!this.engine.audio) return;
|
|
13799
|
+
const index = this.engine.audio.soundindex(soundName);
|
|
13800
|
+
if (index === 0) return;
|
|
13801
|
+
if (pos) {
|
|
13802
|
+
this.engine.audio.positioned_sound(pos, index, vol, attn);
|
|
13803
|
+
} else {
|
|
13804
|
+
this.engine.audio.sound(ent, 0, index, vol, attn, 0);
|
|
13805
|
+
}
|
|
13806
|
+
}
|
|
13807
|
+
onMuzzleFlash(entNum, weapon, time) {
|
|
13808
|
+
const ent = this.entityProvider.getEntity(entNum);
|
|
13809
|
+
if (!ent) return;
|
|
13810
|
+
const origin = { x: ent.origin.x, y: ent.origin.y, z: ent.origin.z };
|
|
13811
|
+
const angles = { x: ent.angles.x, y: ent.angles.y, z: ent.angles.z };
|
|
13812
|
+
const vectors = angleVectors(angles);
|
|
13813
|
+
let flashOrigin = vectorMA(origin, 18, vectors.forward);
|
|
13814
|
+
flashOrigin = vectorMA(flashOrigin, 16, vectors.right);
|
|
13815
|
+
const silenced = (weapon & 128) !== 0;
|
|
13816
|
+
weapon &= ~128;
|
|
13817
|
+
let radius = silenced ? 100 + Math.random() * 31 : 200 + Math.random() * 31;
|
|
13818
|
+
const minLight = 32;
|
|
13819
|
+
const duration = 0.1;
|
|
13820
|
+
const die = time + duration;
|
|
13821
|
+
const volume = silenced ? 0.2 : 1;
|
|
13822
|
+
let color = { x: 1, y: 1, z: 0 };
|
|
13823
|
+
switch (weapon) {
|
|
13824
|
+
case MZ_BLASTER:
|
|
13825
|
+
case MZ_HYPERBLASTER:
|
|
13826
|
+
case MZ_MACHINEGUN:
|
|
13827
|
+
case MZ_SHOTGUN:
|
|
13828
|
+
case MZ_SSHOTGUN:
|
|
13829
|
+
case MZ_CHAINGUN1:
|
|
13830
|
+
case MZ_CHAINGUN2:
|
|
13831
|
+
case MZ_CHAINGUN3:
|
|
13832
|
+
color = { x: 1, y: 1, z: 0 };
|
|
13833
|
+
break;
|
|
13834
|
+
case MZ_BLUEHYPERBLASTER:
|
|
13835
|
+
color = { x: 0, y: 0, z: 1 };
|
|
13836
|
+
break;
|
|
13837
|
+
case MZ_RAILGUN:
|
|
13838
|
+
color = { x: 0.5, y: 0.5, z: 1 };
|
|
13839
|
+
break;
|
|
13840
|
+
case MZ_ROCKET:
|
|
13841
|
+
case MZ_GRENADE:
|
|
13842
|
+
color = { x: 1, y: 0.5, z: 0.2 };
|
|
13843
|
+
break;
|
|
13844
|
+
case MZ_BFG:
|
|
13845
|
+
color = { x: 0, y: 1, z: 0 };
|
|
13846
|
+
break;
|
|
13847
|
+
}
|
|
13848
|
+
this.addLight(entNum, flashOrigin, color, radius, minLight, die);
|
|
13849
|
+
let soundName = "";
|
|
13850
|
+
switch (weapon) {
|
|
13851
|
+
case MZ_BLASTER:
|
|
13852
|
+
soundName = "weapons/blastf1a.wav";
|
|
13853
|
+
break;
|
|
13854
|
+
case MZ_SHOTGUN:
|
|
13855
|
+
soundName = "weapons/shotgf1b.wav";
|
|
13856
|
+
break;
|
|
13857
|
+
case MZ_SSHOTGUN:
|
|
13858
|
+
soundName = "weapons/sshotf1b.wav";
|
|
13859
|
+
break;
|
|
13860
|
+
case MZ_MACHINEGUN:
|
|
13861
|
+
soundName = `weapons/machgf${Math.floor(Math.random() * 5) + 1}b.wav`;
|
|
13862
|
+
break;
|
|
13863
|
+
case MZ_RAILGUN:
|
|
13864
|
+
soundName = "weapons/railgf1a.wav";
|
|
13865
|
+
break;
|
|
13866
|
+
case MZ_ROCKET:
|
|
13867
|
+
soundName = "weapons/rocklf1a.wav";
|
|
13868
|
+
break;
|
|
13869
|
+
case MZ_GRENADE:
|
|
13870
|
+
soundName = "weapons/grenlf1a.wav";
|
|
13871
|
+
break;
|
|
13872
|
+
case MZ_BFG:
|
|
13873
|
+
soundName = "weapons/bfg__f1y.wav";
|
|
13874
|
+
break;
|
|
13875
|
+
case MZ_HYPERBLASTER:
|
|
13876
|
+
soundName = "weapons/hyprbf1a.wav";
|
|
13877
|
+
break;
|
|
13878
|
+
case MZ_BLUEHYPERBLASTER:
|
|
13879
|
+
soundName = "weapons/hyprbf1a.wav";
|
|
13880
|
+
break;
|
|
13881
|
+
case MZ_CHAINGUN1:
|
|
13882
|
+
case MZ_CHAINGUN2:
|
|
13883
|
+
case MZ_CHAINGUN3:
|
|
13884
|
+
soundName = `weapons/machgf${Math.floor(Math.random() * 5) + 1}b.wav`;
|
|
13885
|
+
break;
|
|
13886
|
+
}
|
|
13887
|
+
if (soundName) {
|
|
13888
|
+
this.playSound(null, entNum, soundName, volume, 1);
|
|
13889
|
+
}
|
|
13890
|
+
}
|
|
13891
|
+
onTempEntity(type, pos, time) {
|
|
13892
|
+
switch (type) {
|
|
13893
|
+
case TempEntity2.EXPLOSION1:
|
|
13894
|
+
case TempEntity2.EXPLOSION1_BIG:
|
|
13895
|
+
case TempEntity2.EXPLOSION1_NP:
|
|
13896
|
+
case TempEntity2.ROCKET_EXPLOSION:
|
|
13897
|
+
case TempEntity2.GRENADE_EXPLOSION:
|
|
13898
|
+
case TempEntity2.ROCKET_EXPLOSION_WATER:
|
|
13899
|
+
case TempEntity2.GRENADE_EXPLOSION_WATER:
|
|
13900
|
+
{
|
|
13901
|
+
const color = { x: 1, y: 0.5, z: 0.2 };
|
|
13902
|
+
const duration = 0.5;
|
|
13903
|
+
this.addLight(void 0, pos, color, 300, 0, time + duration);
|
|
13904
|
+
this.playSound(pos, 0, "weapons/rocklx1a.wav", 1, 0.5);
|
|
13905
|
+
}
|
|
13906
|
+
break;
|
|
13907
|
+
case TempEntity2.BFG_EXPLOSION:
|
|
13908
|
+
case TempEntity2.BFG_BIGEXPLOSION:
|
|
13909
|
+
{
|
|
13910
|
+
const color = { x: 0, y: 1, z: 0 };
|
|
13911
|
+
this.addLight(void 0, pos, color, 300, 0, time + 0.5);
|
|
13912
|
+
this.playSound(pos, 0, "weapons/bfg__x1b.wav", 1, 0.5);
|
|
13913
|
+
}
|
|
13914
|
+
break;
|
|
13915
|
+
}
|
|
13916
|
+
}
|
|
13917
|
+
};
|
|
13918
|
+
|
|
13563
13919
|
// src/input/bindings.ts
|
|
13564
13920
|
var DEFAULT_BINDINGS = [
|
|
13565
13921
|
{ code: "KeyW", command: "+forward" },
|
|
@@ -14221,6 +14577,23 @@ function createClient(imports) {
|
|
|
14221
14577
|
const demoHandler = new ClientNetworkHandler(imports);
|
|
14222
14578
|
const demoRecorder = new DemoRecorder();
|
|
14223
14579
|
demoHandler.setView(view);
|
|
14580
|
+
const dlightManager = new DynamicLightManager();
|
|
14581
|
+
const entityProvider = {
|
|
14582
|
+
getEntity(entNum) {
|
|
14583
|
+
if (isDemoPlaying) {
|
|
14584
|
+
return demoHandler.entities.get(entNum);
|
|
14585
|
+
} else {
|
|
14586
|
+
if (multiplayer.isConnected()) {
|
|
14587
|
+
return multiplayer.entities.get(entNum);
|
|
14588
|
+
}
|
|
14589
|
+
}
|
|
14590
|
+
return void 0;
|
|
14591
|
+
},
|
|
14592
|
+
getPlayerNum() {
|
|
14593
|
+
return multiplayer.playerNum;
|
|
14594
|
+
}
|
|
14595
|
+
};
|
|
14596
|
+
const effectSystem = new ClientEffectSystem(dlightManager, imports.engine, entityProvider);
|
|
14224
14597
|
let isDemoPlaying = false;
|
|
14225
14598
|
let currentDemoName = null;
|
|
14226
14599
|
let clientMode = 0 /* Normal */;
|
|
@@ -14283,6 +14656,7 @@ function createClient(imports) {
|
|
|
14283
14656
|
}
|
|
14284
14657
|
});
|
|
14285
14658
|
multiplayer.setDemoRecorder(demoRecorder);
|
|
14659
|
+
multiplayer.setEffectSystem(effectSystem);
|
|
14286
14660
|
const multiplayerFactory = new MultiplayerMenuFactory(menuSystem, multiplayer);
|
|
14287
14661
|
demoHandler.setCallbacks({
|
|
14288
14662
|
onCenterPrint: (msg) => cg.ParseCenterPrint(msg, 0, false),
|
|
@@ -14297,6 +14671,19 @@ function createClient(imports) {
|
|
|
14297
14671
|
} else {
|
|
14298
14672
|
demoPlayback.setFrameDuration(100);
|
|
14299
14673
|
}
|
|
14674
|
+
},
|
|
14675
|
+
// New hooks for effects
|
|
14676
|
+
onMuzzleFlash: (ent, weapon) => {
|
|
14677
|
+
const time = demoPlayback.getCurrentTime() / 1e3;
|
|
14678
|
+
effectSystem.onMuzzleFlash(ent, weapon, time);
|
|
14679
|
+
},
|
|
14680
|
+
onMuzzleFlash2: (ent, weapon) => {
|
|
14681
|
+
},
|
|
14682
|
+
onTempEntity: (type, pos, pos2, dir, cnt, color, ent, srcEnt, destEnt) => {
|
|
14683
|
+
const time = demoPlayback.getCurrentTime() / 1e3;
|
|
14684
|
+
if (pos) {
|
|
14685
|
+
effectSystem.onTempEntity(type, pos, time);
|
|
14686
|
+
}
|
|
14300
14687
|
}
|
|
14301
14688
|
});
|
|
14302
14689
|
demoPlayback.setHandler(demoHandler);
|
|
@@ -14410,6 +14797,7 @@ function createClient(imports) {
|
|
|
14410
14797
|
const clientExports = {
|
|
14411
14798
|
loadingScreen,
|
|
14412
14799
|
errorDialog,
|
|
14800
|
+
dlightManager,
|
|
14413
14801
|
init(initial) {
|
|
14414
14802
|
this.Init(initial);
|
|
14415
14803
|
},
|
|
@@ -14608,8 +14996,9 @@ function createClient(imports) {
|
|
|
14608
14996
|
const frameTimeMs = sample.latest && sample.previous ? Math.max(0, sample.latest.timeMs - sample.previous.timeMs) : 0;
|
|
14609
14997
|
lastView = view.sample(lastRendered, frameTimeMs);
|
|
14610
14998
|
const command = {};
|
|
14611
|
-
const dlights = [];
|
|
14612
14999
|
const timeSeconds = sample.nowMs / 1e3;
|
|
15000
|
+
dlightManager.update(timeSeconds);
|
|
15001
|
+
const dlights = [...dlightManager.getActiveLights()];
|
|
14613
15002
|
for (const ent of currentPacketEntities) {
|
|
14614
15003
|
processEntityEffects(ent, dlights, timeSeconds);
|
|
14615
15004
|
}
|