quake2ts 0.0.52 → 0.0.55

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 (68) hide show
  1. package/apps/demo/dist/assets/index-BBC0sAl6.js +1 -0
  2. package/apps/demo/dist/index.html +20 -0
  3. package/apps/viewer/dist/browser/index.global.js +1 -1
  4. package/apps/viewer/dist/browser/index.global.js.map +1 -1
  5. package/apps/viewer/dist/cjs/index.cjs +2627 -414
  6. package/apps/viewer/dist/cjs/index.cjs.map +1 -1
  7. package/apps/viewer/dist/esm/index.js +2627 -414
  8. package/apps/viewer/dist/esm/index.js.map +1 -1
  9. package/apps/viewer/dist/tsconfig.tsbuildinfo +1 -1
  10. package/apps/viewer/dist/types/index.d.ts.map +1 -1
  11. package/package.json +6 -1
  12. package/packages/client/dist/browser/index.global.js +1 -1
  13. package/packages/client/dist/browser/index.global.js.map +1 -1
  14. package/packages/client/dist/cjs/index.cjs +2101 -108
  15. package/packages/client/dist/cjs/index.cjs.map +1 -1
  16. package/packages/client/dist/esm/index.js +2107 -108
  17. package/packages/client/dist/esm/index.js.map +1 -1
  18. package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
  19. package/packages/client/dist/types/index.d.ts +3 -2
  20. package/packages/client/dist/types/index.d.ts.map +1 -1
  21. package/packages/client/dist/types/prediction.d.ts +3 -1
  22. package/packages/client/dist/types/prediction.d.ts.map +1 -1
  23. package/packages/engine/dist/browser/index.global.js +15 -15
  24. package/packages/engine/dist/browser/index.global.js.map +1 -1
  25. package/packages/engine/dist/cjs/index.cjs +18 -2
  26. package/packages/engine/dist/cjs/index.cjs.map +1 -1
  27. package/packages/engine/dist/esm/index.js +17 -2
  28. package/packages/engine/dist/esm/index.js.map +1 -1
  29. package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
  30. package/packages/engine/dist/types/host.d.ts +5 -2
  31. package/packages/engine/dist/types/host.d.ts.map +1 -1
  32. package/packages/engine/dist/types/index.d.ts +3 -2
  33. package/packages/engine/dist/types/index.d.ts.map +1 -1
  34. package/packages/engine/dist/types/render/camera.d.ts +8 -0
  35. package/packages/engine/dist/types/render/camera.d.ts.map +1 -0
  36. package/packages/engine/dist/types/render/draw.d.ts +9 -0
  37. package/packages/engine/dist/types/render/draw.d.ts.map +1 -0
  38. package/packages/game/dist/browser/index.global.js +1 -1
  39. package/packages/game/dist/browser/index.global.js.map +1 -1
  40. package/packages/game/dist/cjs/index.cjs +200 -3
  41. package/packages/game/dist/cjs/index.cjs.map +1 -1
  42. package/packages/game/dist/esm/index.js +200 -3
  43. package/packages/game/dist/esm/index.js.map +1 -1
  44. package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
  45. package/packages/game/dist/types/entities/spawn.d.ts +1 -0
  46. package/packages/game/dist/types/entities/spawn.d.ts.map +1 -1
  47. package/packages/game/dist/types/entities/system.d.ts +1 -0
  48. package/packages/game/dist/types/entities/system.d.ts.map +1 -1
  49. package/packages/game/dist/types/index.d.ts +2 -1
  50. package/packages/game/dist/types/index.d.ts.map +1 -1
  51. package/packages/shared/dist/browser/index.global.js +1 -1
  52. package/packages/shared/dist/browser/index.global.js.map +1 -1
  53. package/packages/shared/dist/cjs/index.cjs +68 -0
  54. package/packages/shared/dist/cjs/index.cjs.map +1 -1
  55. package/packages/shared/dist/esm/index.js +67 -0
  56. package/packages/shared/dist/esm/index.js.map +1 -1
  57. package/packages/shared/dist/tsconfig.tsbuildinfo +1 -1
  58. package/packages/shared/dist/types/index.d.ts +2 -1
  59. package/packages/shared/dist/types/index.d.ts.map +1 -1
  60. package/packages/shared/dist/types/pmove/apply.d.ts +5 -0
  61. package/packages/shared/dist/types/pmove/apply.d.ts.map +1 -0
  62. package/packages/shared/dist/types/pmove/index.d.ts +18 -0
  63. package/packages/shared/dist/types/pmove/index.d.ts.map +1 -0
  64. package/packages/shared/dist/types/protocol/index.d.ts +6 -0
  65. package/packages/shared/dist/types/protocol/index.d.ts.map +1 -0
  66. package/packages/shared/dist/types/protocol/player-state.d.ts +11 -0
  67. package/packages/shared/dist/types/protocol/player-state.d.ts.map +1 -0
  68. package/packages/tools/dist/tsconfig.tsbuildinfo +1 -1
@@ -358,7 +358,167 @@ var WaterLevel = /* @__PURE__ */ ((WaterLevel3) => {
358
358
  WaterLevel3[WaterLevel3["Under"] = 3] = "Under";
359
359
  return WaterLevel3;
360
360
  })(WaterLevel || {});
361
+ function applyPmoveFriction(params) {
362
+ const {
363
+ velocity,
364
+ frametime,
365
+ onGround,
366
+ groundIsSlick,
367
+ onLadder,
368
+ waterlevel,
369
+ pmFriction,
370
+ pmStopSpeed,
371
+ pmWaterFriction
372
+ } = params;
373
+ const speed = lengthVec3(velocity);
374
+ if (speed < 1) {
375
+ return { x: 0, y: 0, z: velocity.z };
376
+ }
377
+ let drop = 0;
378
+ if (onGround && !groundIsSlick || onLadder) {
379
+ const control = speed < pmStopSpeed ? pmStopSpeed : speed;
380
+ const friction = pmFriction;
381
+ drop += control * friction * frametime;
382
+ }
383
+ if (waterlevel > 0 && !onLadder) {
384
+ drop += speed * pmWaterFriction * waterlevel * frametime;
385
+ }
386
+ let newspeed = speed - drop;
387
+ if (newspeed < 0) {
388
+ newspeed = 0;
389
+ }
390
+ if (newspeed === speed) {
391
+ return velocity;
392
+ }
393
+ const scale = newspeed / speed;
394
+ return scaleVec3(velocity, scale);
395
+ }
396
+ function applyPmoveAccelerate(params) {
397
+ const { velocity, wishdir, wishspeed, accel, frametime } = params;
398
+ const currentSpeed = dotVec3(velocity, wishdir);
399
+ const addSpeed = wishspeed - currentSpeed;
400
+ if (addSpeed <= 0) {
401
+ return velocity;
402
+ }
403
+ let accelSpeed = accel * frametime * wishspeed;
404
+ if (accelSpeed > addSpeed) {
405
+ accelSpeed = addSpeed;
406
+ }
407
+ return {
408
+ x: velocity.x + wishdir.x * accelSpeed,
409
+ y: velocity.y + wishdir.y * accelSpeed,
410
+ z: velocity.z + wishdir.z * accelSpeed
411
+ };
412
+ }
413
+ function buildAirGroundWish(params) {
414
+ const { forward, right, cmd, maxSpeed } = params;
415
+ let wishvel = {
416
+ x: forward.x * cmd.forwardmove + right.x * cmd.sidemove,
417
+ y: forward.y * cmd.forwardmove + right.y * cmd.sidemove,
418
+ z: 0
419
+ };
420
+ let wishspeed = lengthVec3(wishvel);
421
+ if (wishspeed > maxSpeed) {
422
+ const scale = maxSpeed / wishspeed;
423
+ wishvel = scaleVec3(wishvel, scale);
424
+ wishspeed = maxSpeed;
425
+ }
426
+ return {
427
+ wishdir: wishspeed === 0 ? wishvel : normalizeVec3(wishvel),
428
+ wishspeed
429
+ };
430
+ }
431
+ function buildWaterWish(params) {
432
+ const { forward, right, cmd, maxSpeed } = params;
433
+ let wishvel = {
434
+ x: forward.x * cmd.forwardmove + right.x * cmd.sidemove,
435
+ y: forward.y * cmd.forwardmove + right.y * cmd.sidemove,
436
+ z: 0
437
+ };
438
+ if (cmd.upmove > 10) {
439
+ wishvel = addVec3(wishvel, { x: 0, y: 0, z: cmd.upmove });
440
+ } else if (cmd.upmove < -10) {
441
+ wishvel = addVec3(wishvel, { x: 0, y: 0, z: cmd.upmove });
442
+ } else {
443
+ wishvel = addVec3(wishvel, { x: 0, y: 0, z: 10 });
444
+ }
445
+ let wishspeed = lengthVec3(wishvel);
446
+ if (wishspeed > maxSpeed) {
447
+ const scale = maxSpeed / wishspeed;
448
+ wishvel = scaleVec3(wishvel, scale);
449
+ wishspeed = maxSpeed;
450
+ }
451
+ wishspeed *= 0.5;
452
+ return {
453
+ wishdir: wishspeed === 0 ? wishvel : normalizeVec3(wishvel),
454
+ wishspeed
455
+ };
456
+ }
361
457
  var WATERJUMP_CLEAR = 8 | 16 | 32 | 1024;
458
+ var FRAMETIME = 0.025;
459
+ var categorizePosition2 = (state, trace) => {
460
+ const point = { ...state.origin };
461
+ point.z -= 0.25;
462
+ const traceResult = trace(state.origin, point);
463
+ return {
464
+ ...state,
465
+ onGround: traceResult.fraction < 1
466
+ };
467
+ };
468
+ var checkWater = (state, pointContents2) => {
469
+ const point = { ...state.origin };
470
+ point.z += state.mins.z + 1;
471
+ const contents = pointContents2(point);
472
+ if (contents & 33554432) {
473
+ return { ...state, waterLevel: 1 };
474
+ }
475
+ return { ...state, waterLevel: 0 };
476
+ };
477
+ var applyPmove = (state, cmd, trace, pointContents2) => {
478
+ let newState = { ...state };
479
+ newState = categorizePosition2(newState, trace);
480
+ newState = checkWater(newState, pointContents2);
481
+ const { origin, velocity, onGround, waterLevel } = newState;
482
+ const frictionedVelocity = applyPmoveFriction({
483
+ velocity,
484
+ frametime: FRAMETIME,
485
+ onGround,
486
+ groundIsSlick: false,
487
+ onLadder: false,
488
+ waterlevel: waterLevel,
489
+ pmFriction: 6,
490
+ pmStopSpeed: 100,
491
+ pmWaterFriction: 1
492
+ });
493
+ const wish = waterLevel >= 2 ? buildWaterWish({
494
+ forward: { x: 1, y: 0, z: 0 },
495
+ right: { x: 0, y: 1, z: 0 },
496
+ cmd,
497
+ maxSpeed: 320
498
+ }) : buildAirGroundWish({
499
+ forward: { x: 1, y: 0, z: 0 },
500
+ right: { x: 0, y: 1, z: 0 },
501
+ cmd,
502
+ maxSpeed: 320
503
+ });
504
+ const finalVelocity = applyPmoveAccelerate({
505
+ velocity: frictionedVelocity,
506
+ wishdir: wish.wishdir,
507
+ wishspeed: wish.wishspeed,
508
+ accel: onGround ? 10 : 1,
509
+ frametime: FRAMETIME
510
+ });
511
+ const traceResult = trace(origin, {
512
+ x: origin.x + finalVelocity.x * FRAMETIME,
513
+ y: origin.y + finalVelocity.y * FRAMETIME,
514
+ z: origin.z + finalVelocity.z * FRAMETIME
515
+ });
516
+ return {
517
+ ...newState,
518
+ origin: traceResult.endpos,
519
+ velocity: finalVelocity
520
+ };
521
+ };
362
522
 
363
523
  // src/entities/entity.ts
364
524
  var MoveType = /* @__PURE__ */ ((MoveType2) => {
@@ -936,6 +1096,14 @@ var EntitySystem = class {
936
1096
  callback(entity);
937
1097
  }
938
1098
  }
1099
+ find(predicate) {
1100
+ for (const entity of this.pool) {
1101
+ if (predicate(entity)) {
1102
+ return entity;
1103
+ }
1104
+ }
1105
+ return void 0;
1106
+ }
939
1107
  spawn() {
940
1108
  return this.pool.spawn();
941
1109
  }
@@ -1925,6 +2093,11 @@ function spawnEntitiesFromText(text, options) {
1925
2093
  }
1926
2094
  return spawned;
1927
2095
  }
2096
+ function findPlayerStart(entities) {
2097
+ return entities.find(
2098
+ (entity) => entity.classname === "info_player_start"
2099
+ );
2100
+ }
1928
2101
  function registerDefaultSpawns(registry) {
1929
2102
  registry.register("worldspawn", (entity) => {
1930
2103
  entity.movetype = 2 /* Push */;
@@ -4085,7 +4258,7 @@ var WEAPONS = {
4085
4258
 
4086
4259
  // src/index.ts
4087
4260
  var ZERO_VEC32 = { x: 0, y: 0, z: 0 };
4088
- function createGame(engine, options) {
4261
+ function createGame(trace, pointContents, engine, options) {
4089
4262
  const gravity = options.gravity;
4090
4263
  const levelClock = new LevelClock();
4091
4264
  const frameLoop = new GameFrameLoop();
@@ -4134,15 +4307,39 @@ function createGame(engine, options) {
4134
4307
  return {
4135
4308
  init(startTimeMs) {
4136
4309
  resetState(startTimeMs);
4137
- void engine.trace({ x: 0, y: 0, z: 0 }, gravity);
4138
4310
  return snapshot(0);
4139
4311
  },
4140
4312
  shutdown() {
4141
4313
  },
4142
4314
  spawnWorld() {
4315
+ const playerStart = findPlayerStart(entities);
4316
+ if (playerStart) {
4317
+ const player = entities.spawn();
4318
+ player.classname = "player";
4319
+ player.origin = { ...playerStart.origin };
4320
+ player.angles = { ...playerStart.angles };
4321
+ player.health = 100;
4322
+ player.mins = { x: -16, y: -16, z: -24 };
4323
+ player.maxs = { x: 16, y: 16, z: 32 };
4324
+ entities.finalizeSpawn(player);
4325
+ origin = { ...player.origin };
4326
+ }
4143
4327
  },
4144
- frame(step) {
4328
+ frame(step, command) {
4145
4329
  const context = frameLoop.advance(step);
4330
+ const player = entities.find((e) => e.classname === "player");
4331
+ if (command && player) {
4332
+ const pcmd = {
4333
+ forwardmove: command.forwardmove,
4334
+ sidemove: command.sidemove,
4335
+ upmove: command.upmove,
4336
+ buttons: command.buttons
4337
+ };
4338
+ const playerState = { origin: player.origin, velocity: player.velocity, onGround: false, waterLevel: 0, mins: player.mins, maxs: player.maxs };
4339
+ const newState = applyPmove(playerState, pcmd, trace, pointContents);
4340
+ player.origin = newState.origin;
4341
+ player.velocity = newState.velocity;
4342
+ }
4146
4343
  return snapshot(context.frame);
4147
4344
  },
4148
4345
  entities,