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
@@ -489,7 +489,167 @@ var WaterLevel = /* @__PURE__ */ ((WaterLevel3) => {
489
489
  WaterLevel3[WaterLevel3["Under"] = 3] = "Under";
490
490
  return WaterLevel3;
491
491
  })(WaterLevel || {});
492
+ function applyPmoveFriction(params) {
493
+ const {
494
+ velocity,
495
+ frametime,
496
+ onGround,
497
+ groundIsSlick,
498
+ onLadder,
499
+ waterlevel,
500
+ pmFriction,
501
+ pmStopSpeed,
502
+ pmWaterFriction
503
+ } = params;
504
+ const speed = lengthVec3(velocity);
505
+ if (speed < 1) {
506
+ return { x: 0, y: 0, z: velocity.z };
507
+ }
508
+ let drop = 0;
509
+ if (onGround && !groundIsSlick || onLadder) {
510
+ const control = speed < pmStopSpeed ? pmStopSpeed : speed;
511
+ const friction = pmFriction;
512
+ drop += control * friction * frametime;
513
+ }
514
+ if (waterlevel > 0 && !onLadder) {
515
+ drop += speed * pmWaterFriction * waterlevel * frametime;
516
+ }
517
+ let newspeed = speed - drop;
518
+ if (newspeed < 0) {
519
+ newspeed = 0;
520
+ }
521
+ if (newspeed === speed) {
522
+ return velocity;
523
+ }
524
+ const scale = newspeed / speed;
525
+ return scaleVec3(velocity, scale);
526
+ }
527
+ function applyPmoveAccelerate(params) {
528
+ const { velocity, wishdir, wishspeed, accel, frametime } = params;
529
+ const currentSpeed = dotVec3(velocity, wishdir);
530
+ const addSpeed = wishspeed - currentSpeed;
531
+ if (addSpeed <= 0) {
532
+ return velocity;
533
+ }
534
+ let accelSpeed = accel * frametime * wishspeed;
535
+ if (accelSpeed > addSpeed) {
536
+ accelSpeed = addSpeed;
537
+ }
538
+ return {
539
+ x: velocity.x + wishdir.x * accelSpeed,
540
+ y: velocity.y + wishdir.y * accelSpeed,
541
+ z: velocity.z + wishdir.z * accelSpeed
542
+ };
543
+ }
544
+ function buildAirGroundWish(params) {
545
+ const { forward, right, cmd, maxSpeed } = params;
546
+ let wishvel = {
547
+ x: forward.x * cmd.forwardmove + right.x * cmd.sidemove,
548
+ y: forward.y * cmd.forwardmove + right.y * cmd.sidemove,
549
+ z: 0
550
+ };
551
+ let wishspeed = lengthVec3(wishvel);
552
+ if (wishspeed > maxSpeed) {
553
+ const scale = maxSpeed / wishspeed;
554
+ wishvel = scaleVec3(wishvel, scale);
555
+ wishspeed = maxSpeed;
556
+ }
557
+ return {
558
+ wishdir: wishspeed === 0 ? wishvel : normalizeVec3(wishvel),
559
+ wishspeed
560
+ };
561
+ }
562
+ function buildWaterWish(params) {
563
+ const { forward, right, cmd, maxSpeed } = params;
564
+ let wishvel = {
565
+ x: forward.x * cmd.forwardmove + right.x * cmd.sidemove,
566
+ y: forward.y * cmd.forwardmove + right.y * cmd.sidemove,
567
+ z: 0
568
+ };
569
+ if (cmd.upmove > 10) {
570
+ wishvel = addVec3(wishvel, { x: 0, y: 0, z: cmd.upmove });
571
+ } else if (cmd.upmove < -10) {
572
+ wishvel = addVec3(wishvel, { x: 0, y: 0, z: cmd.upmove });
573
+ } else {
574
+ wishvel = addVec3(wishvel, { x: 0, y: 0, z: 10 });
575
+ }
576
+ let wishspeed = lengthVec3(wishvel);
577
+ if (wishspeed > maxSpeed) {
578
+ const scale = maxSpeed / wishspeed;
579
+ wishvel = scaleVec3(wishvel, scale);
580
+ wishspeed = maxSpeed;
581
+ }
582
+ wishspeed *= 0.5;
583
+ return {
584
+ wishdir: wishspeed === 0 ? wishvel : normalizeVec3(wishvel),
585
+ wishspeed
586
+ };
587
+ }
492
588
  var WATERJUMP_CLEAR = 8 | 16 | 32 | 1024;
589
+ var FRAMETIME = 0.025;
590
+ var categorizePosition2 = (state, trace) => {
591
+ const point = { ...state.origin };
592
+ point.z -= 0.25;
593
+ const traceResult = trace(state.origin, point);
594
+ return {
595
+ ...state,
596
+ onGround: traceResult.fraction < 1
597
+ };
598
+ };
599
+ var checkWater = (state, pointContents2) => {
600
+ const point = { ...state.origin };
601
+ point.z += state.mins.z + 1;
602
+ const contents = pointContents2(point);
603
+ if (contents & 33554432) {
604
+ return { ...state, waterLevel: 1 };
605
+ }
606
+ return { ...state, waterLevel: 0 };
607
+ };
608
+ var applyPmove = (state, cmd, trace, pointContents2) => {
609
+ let newState = { ...state };
610
+ newState = categorizePosition2(newState, trace);
611
+ newState = checkWater(newState, pointContents2);
612
+ const { origin, velocity, onGround, waterLevel } = newState;
613
+ const frictionedVelocity = applyPmoveFriction({
614
+ velocity,
615
+ frametime: FRAMETIME,
616
+ onGround,
617
+ groundIsSlick: false,
618
+ onLadder: false,
619
+ waterlevel: waterLevel,
620
+ pmFriction: 6,
621
+ pmStopSpeed: 100,
622
+ pmWaterFriction: 1
623
+ });
624
+ const wish = waterLevel >= 2 ? buildWaterWish({
625
+ forward: { x: 1, y: 0, z: 0 },
626
+ right: { x: 0, y: 1, z: 0 },
627
+ cmd,
628
+ maxSpeed: 320
629
+ }) : buildAirGroundWish({
630
+ forward: { x: 1, y: 0, z: 0 },
631
+ right: { x: 0, y: 1, z: 0 },
632
+ cmd,
633
+ maxSpeed: 320
634
+ });
635
+ const finalVelocity = applyPmoveAccelerate({
636
+ velocity: frictionedVelocity,
637
+ wishdir: wish.wishdir,
638
+ wishspeed: wish.wishspeed,
639
+ accel: onGround ? 10 : 1,
640
+ frametime: FRAMETIME
641
+ });
642
+ const traceResult = trace(origin, {
643
+ x: origin.x + finalVelocity.x * FRAMETIME,
644
+ y: origin.y + finalVelocity.y * FRAMETIME,
645
+ z: origin.z + finalVelocity.z * FRAMETIME
646
+ });
647
+ return {
648
+ ...newState,
649
+ origin: traceResult.endpos,
650
+ velocity: finalVelocity
651
+ };
652
+ };
493
653
 
494
654
  // src/entities/entity.ts
495
655
  var MoveType = /* @__PURE__ */ ((MoveType2) => {
@@ -1067,6 +1227,14 @@ var EntitySystem = class {
1067
1227
  callback(entity);
1068
1228
  }
1069
1229
  }
1230
+ find(predicate) {
1231
+ for (const entity of this.pool) {
1232
+ if (predicate(entity)) {
1233
+ return entity;
1234
+ }
1235
+ }
1236
+ return void 0;
1237
+ }
1070
1238
  spawn() {
1071
1239
  return this.pool.spawn();
1072
1240
  }
@@ -2056,6 +2224,11 @@ function spawnEntitiesFromText(text, options) {
2056
2224
  }
2057
2225
  return spawned;
2058
2226
  }
2227
+ function findPlayerStart(entities) {
2228
+ return entities.find(
2229
+ (entity) => entity.classname === "info_player_start"
2230
+ );
2231
+ }
2059
2232
  function registerDefaultSpawns(registry) {
2060
2233
  registry.register("worldspawn", (entity) => {
2061
2234
  entity.movetype = 2 /* Push */;
@@ -4216,7 +4389,7 @@ var WEAPONS = {
4216
4389
 
4217
4390
  // src/index.ts
4218
4391
  var ZERO_VEC32 = { x: 0, y: 0, z: 0 };
4219
- function createGame(engine, options) {
4392
+ function createGame(trace, pointContents, engine, options) {
4220
4393
  const gravity = options.gravity;
4221
4394
  const levelClock = new LevelClock();
4222
4395
  const frameLoop = new GameFrameLoop();
@@ -4265,15 +4438,39 @@ function createGame(engine, options) {
4265
4438
  return {
4266
4439
  init(startTimeMs) {
4267
4440
  resetState(startTimeMs);
4268
- void engine.trace({ x: 0, y: 0, z: 0 }, gravity);
4269
4441
  return snapshot(0);
4270
4442
  },
4271
4443
  shutdown() {
4272
4444
  },
4273
4445
  spawnWorld() {
4446
+ const playerStart = findPlayerStart(entities);
4447
+ if (playerStart) {
4448
+ const player = entities.spawn();
4449
+ player.classname = "player";
4450
+ player.origin = { ...playerStart.origin };
4451
+ player.angles = { ...playerStart.angles };
4452
+ player.health = 100;
4453
+ player.mins = { x: -16, y: -16, z: -24 };
4454
+ player.maxs = { x: 16, y: 16, z: 32 };
4455
+ entities.finalizeSpawn(player);
4456
+ origin = { ...player.origin };
4457
+ }
4274
4458
  },
4275
- frame(step) {
4459
+ frame(step, command) {
4276
4460
  const context = frameLoop.advance(step);
4461
+ const player = entities.find((e) => e.classname === "player");
4462
+ if (command && player) {
4463
+ const pcmd = {
4464
+ forwardmove: command.forwardmove,
4465
+ sidemove: command.sidemove,
4466
+ upmove: command.upmove,
4467
+ buttons: command.buttons
4468
+ };
4469
+ const playerState = { origin: player.origin, velocity: player.velocity, onGround: false, waterLevel: 0, mins: player.mins, maxs: player.maxs };
4470
+ const newState = applyPmove(playerState, pcmd, trace, pointContents);
4471
+ player.origin = newState.origin;
4472
+ player.velocity = newState.velocity;
4473
+ }
4277
4474
  return snapshot(context.frame);
4278
4475
  },
4279
4476
  entities,