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.
- package/apps/demo/dist/assets/index-BBC0sAl6.js +1 -0
- package/apps/demo/dist/index.html +20 -0
- package/apps/viewer/dist/browser/index.global.js +1 -1
- package/apps/viewer/dist/browser/index.global.js.map +1 -1
- package/apps/viewer/dist/cjs/index.cjs +2627 -414
- package/apps/viewer/dist/cjs/index.cjs.map +1 -1
- package/apps/viewer/dist/esm/index.js +2627 -414
- package/apps/viewer/dist/esm/index.js.map +1 -1
- package/apps/viewer/dist/tsconfig.tsbuildinfo +1 -1
- package/apps/viewer/dist/types/index.d.ts.map +1 -1
- package/package.json +6 -1
- package/packages/client/dist/browser/index.global.js +1 -1
- package/packages/client/dist/browser/index.global.js.map +1 -1
- package/packages/client/dist/cjs/index.cjs +2101 -108
- package/packages/client/dist/cjs/index.cjs.map +1 -1
- package/packages/client/dist/esm/index.js +2107 -108
- package/packages/client/dist/esm/index.js.map +1 -1
- package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/client/dist/types/index.d.ts +3 -2
- package/packages/client/dist/types/index.d.ts.map +1 -1
- package/packages/client/dist/types/prediction.d.ts +3 -1
- package/packages/client/dist/types/prediction.d.ts.map +1 -1
- package/packages/engine/dist/browser/index.global.js +15 -15
- package/packages/engine/dist/browser/index.global.js.map +1 -1
- package/packages/engine/dist/cjs/index.cjs +18 -2
- package/packages/engine/dist/cjs/index.cjs.map +1 -1
- package/packages/engine/dist/esm/index.js +17 -2
- package/packages/engine/dist/esm/index.js.map +1 -1
- package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/engine/dist/types/host.d.ts +5 -2
- package/packages/engine/dist/types/host.d.ts.map +1 -1
- package/packages/engine/dist/types/index.d.ts +3 -2
- package/packages/engine/dist/types/index.d.ts.map +1 -1
- package/packages/engine/dist/types/render/camera.d.ts +8 -0
- package/packages/engine/dist/types/render/camera.d.ts.map +1 -0
- package/packages/engine/dist/types/render/draw.d.ts +9 -0
- package/packages/engine/dist/types/render/draw.d.ts.map +1 -0
- package/packages/game/dist/browser/index.global.js +1 -1
- package/packages/game/dist/browser/index.global.js.map +1 -1
- package/packages/game/dist/cjs/index.cjs +200 -3
- package/packages/game/dist/cjs/index.cjs.map +1 -1
- package/packages/game/dist/esm/index.js +200 -3
- package/packages/game/dist/esm/index.js.map +1 -1
- package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/game/dist/types/entities/spawn.d.ts +1 -0
- package/packages/game/dist/types/entities/spawn.d.ts.map +1 -1
- package/packages/game/dist/types/entities/system.d.ts +1 -0
- package/packages/game/dist/types/entities/system.d.ts.map +1 -1
- package/packages/game/dist/types/index.d.ts +2 -1
- package/packages/game/dist/types/index.d.ts.map +1 -1
- package/packages/shared/dist/browser/index.global.js +1 -1
- package/packages/shared/dist/browser/index.global.js.map +1 -1
- package/packages/shared/dist/cjs/index.cjs +68 -0
- package/packages/shared/dist/cjs/index.cjs.map +1 -1
- package/packages/shared/dist/esm/index.js +67 -0
- package/packages/shared/dist/esm/index.js.map +1 -1
- package/packages/shared/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/shared/dist/types/index.d.ts +2 -1
- package/packages/shared/dist/types/index.d.ts.map +1 -1
- package/packages/shared/dist/types/pmove/apply.d.ts +5 -0
- package/packages/shared/dist/types/pmove/apply.d.ts.map +1 -0
- package/packages/shared/dist/types/pmove/index.d.ts +18 -0
- package/packages/shared/dist/types/pmove/index.d.ts.map +1 -0
- package/packages/shared/dist/types/protocol/index.d.ts +6 -0
- package/packages/shared/dist/types/protocol/index.d.ts.map +1 -0
- package/packages/shared/dist/types/protocol/player-state.d.ts +11 -0
- package/packages/shared/dist/types/protocol/player-state.d.ts.map +1 -0
- 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,
|