quake2ts 0.0.213 → 0.0.214
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/server/dist/index.cjs +165 -23
- package/packages/server/dist/index.js +158 -16
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "quake2ts",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.214",
|
|
4
4
|
"description": "Quake II re-release port to TypeScript with WebGL renderer - A complete game engine with physics, networking, and BSP rendering",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "pnpm@8.15.7",
|
|
@@ -302,7 +302,7 @@ var ClientMessageParser = class {
|
|
|
302
302
|
};
|
|
303
303
|
|
|
304
304
|
// src/dedicated.ts
|
|
305
|
-
var
|
|
305
|
+
var import_shared4 = require("@quake2ts/shared");
|
|
306
306
|
var import_engine = require("@quake2ts/engine");
|
|
307
307
|
var import_promises = __toESM(require("fs/promises"), 1);
|
|
308
308
|
var import_game2 = require("@quake2ts/game");
|
|
@@ -549,6 +549,113 @@ function writePlayerState(writer, ps) {
|
|
|
549
549
|
}
|
|
550
550
|
}
|
|
551
551
|
|
|
552
|
+
// src/protocol/write.ts
|
|
553
|
+
var import_shared3 = require("@quake2ts/shared");
|
|
554
|
+
function writeServerCommand(writer, event, ...args) {
|
|
555
|
+
writer.writeByte(event);
|
|
556
|
+
switch (event) {
|
|
557
|
+
case import_shared3.ServerCommand.print: {
|
|
558
|
+
const level = args[0];
|
|
559
|
+
const text = args[1];
|
|
560
|
+
writer.writeByte(level);
|
|
561
|
+
writer.writeString(text);
|
|
562
|
+
break;
|
|
563
|
+
}
|
|
564
|
+
case import_shared3.ServerCommand.muzzleflash: {
|
|
565
|
+
const entIndex = args[0];
|
|
566
|
+
const flashType = args[1];
|
|
567
|
+
writer.writeShort(entIndex);
|
|
568
|
+
writer.writeByte(flashType);
|
|
569
|
+
break;
|
|
570
|
+
}
|
|
571
|
+
case import_shared3.ServerCommand.temp_entity: {
|
|
572
|
+
const type = args[0];
|
|
573
|
+
writer.writeByte(type);
|
|
574
|
+
writeTempEntity(writer, type, args.slice(1));
|
|
575
|
+
break;
|
|
576
|
+
}
|
|
577
|
+
default:
|
|
578
|
+
console.warn(`writeServerCommand: Unhandled command ${event}`);
|
|
579
|
+
break;
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
function writeTempEntity(writer, type, args) {
|
|
583
|
+
switch (type) {
|
|
584
|
+
case import_shared3.TempEntity.ROCKET_EXPLOSION:
|
|
585
|
+
case import_shared3.TempEntity.GRENADE_EXPLOSION:
|
|
586
|
+
case import_shared3.TempEntity.EXPLOSION1:
|
|
587
|
+
case import_shared3.TempEntity.EXPLOSION2:
|
|
588
|
+
case import_shared3.TempEntity.ROCKET_EXPLOSION_WATER:
|
|
589
|
+
case import_shared3.TempEntity.GRENADE_EXPLOSION_WATER:
|
|
590
|
+
case import_shared3.TempEntity.BFG_EXPLOSION:
|
|
591
|
+
case import_shared3.TempEntity.BFG_BIGEXPLOSION:
|
|
592
|
+
case import_shared3.TempEntity.PLASMA_EXPLOSION:
|
|
593
|
+
case import_shared3.TempEntity.PLAIN_EXPLOSION:
|
|
594
|
+
case import_shared3.TempEntity.TRACKER_EXPLOSION:
|
|
595
|
+
case import_shared3.TempEntity.EXPLOSION1_BIG:
|
|
596
|
+
case import_shared3.TempEntity.EXPLOSION1_NP:
|
|
597
|
+
case import_shared3.TempEntity.EXPLOSION1_NL:
|
|
598
|
+
case import_shared3.TempEntity.EXPLOSION2_NL:
|
|
599
|
+
case import_shared3.TempEntity.BERSERK_SLAM:
|
|
600
|
+
writer.writePos(args[0]);
|
|
601
|
+
break;
|
|
602
|
+
case import_shared3.TempEntity.BLASTER:
|
|
603
|
+
case import_shared3.TempEntity.FLECHETTE:
|
|
604
|
+
writer.writePos(args[0]);
|
|
605
|
+
writer.writeDir(args[1]);
|
|
606
|
+
break;
|
|
607
|
+
case import_shared3.TempEntity.RAILTRAIL:
|
|
608
|
+
case import_shared3.TempEntity.DEBUGTRAIL:
|
|
609
|
+
case import_shared3.TempEntity.BUBBLETRAIL:
|
|
610
|
+
case import_shared3.TempEntity.BUBBLETRAIL2:
|
|
611
|
+
case import_shared3.TempEntity.BFG_LASER:
|
|
612
|
+
case import_shared3.TempEntity.LIGHTNING_BEAM:
|
|
613
|
+
case import_shared3.TempEntity.LIGHTNING:
|
|
614
|
+
writer.writePos(args[0]);
|
|
615
|
+
writer.writePos(args[1]);
|
|
616
|
+
break;
|
|
617
|
+
case import_shared3.TempEntity.LASER_SPARKS:
|
|
618
|
+
case import_shared3.TempEntity.WELDING_SPARKS:
|
|
619
|
+
case import_shared3.TempEntity.TUNNEL_SPARKS:
|
|
620
|
+
case import_shared3.TempEntity.ELECTRIC_SPARKS:
|
|
621
|
+
case import_shared3.TempEntity.HEATBEAM_SPARKS:
|
|
622
|
+
case import_shared3.TempEntity.HEATBEAM_STEAM:
|
|
623
|
+
case import_shared3.TempEntity.STEAM:
|
|
624
|
+
writer.writeByte(args[0]);
|
|
625
|
+
writer.writePos(args[1]);
|
|
626
|
+
writer.writeDir(args[2]);
|
|
627
|
+
writer.writeByte(args[3] || 0);
|
|
628
|
+
break;
|
|
629
|
+
case import_shared3.TempEntity.PARASITE_ATTACK:
|
|
630
|
+
case import_shared3.TempEntity.MEDIC_CABLE_ATTACK:
|
|
631
|
+
const ent = args[0];
|
|
632
|
+
writer.writeShort(ent ? ent.index : 0);
|
|
633
|
+
writer.writePos(args[1]);
|
|
634
|
+
writer.writePos(args[2]);
|
|
635
|
+
break;
|
|
636
|
+
case import_shared3.TempEntity.GUNSHOT:
|
|
637
|
+
case import_shared3.TempEntity.BLOOD:
|
|
638
|
+
case import_shared3.TempEntity.SPARKS:
|
|
639
|
+
case import_shared3.TempEntity.BULLET_SPARKS:
|
|
640
|
+
case import_shared3.TempEntity.SCREEN_SPARKS:
|
|
641
|
+
case import_shared3.TempEntity.SHIELD_SPARKS:
|
|
642
|
+
writer.writePos(args[0]);
|
|
643
|
+
writer.writeDir(args[1]);
|
|
644
|
+
break;
|
|
645
|
+
case import_shared3.TempEntity.SPLASH:
|
|
646
|
+
case import_shared3.TempEntity.POWER_SPLASH:
|
|
647
|
+
case import_shared3.TempEntity.WIDOWSPLASH:
|
|
648
|
+
writer.writeByte(args[0]);
|
|
649
|
+
writer.writePos(args[1]);
|
|
650
|
+
writer.writeDir(args[2]);
|
|
651
|
+
writer.writeByte(args[3] || 0);
|
|
652
|
+
break;
|
|
653
|
+
default:
|
|
654
|
+
console.warn(`writeTempEntity: Unhandled TempEntity ${type}`);
|
|
655
|
+
break;
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
|
|
552
659
|
// src/dedicated.ts
|
|
553
660
|
var MAX_CLIENTS = 16;
|
|
554
661
|
var FRAME_RATE = 10;
|
|
@@ -579,11 +686,11 @@ var DedicatedServer = class {
|
|
|
579
686
|
frame: 0,
|
|
580
687
|
name: "",
|
|
581
688
|
collisionModel: null,
|
|
582
|
-
configStrings: new Array(
|
|
583
|
-
baselines: new Array(
|
|
689
|
+
configStrings: new Array(import_shared4.MAX_CONFIGSTRINGS).fill(""),
|
|
690
|
+
baselines: new Array(import_shared4.MAX_EDICTS).fill(null),
|
|
584
691
|
multicastBuf: new Uint8Array(0)
|
|
585
692
|
};
|
|
586
|
-
this.entityIndex = new
|
|
693
|
+
this.entityIndex = new import_shared4.CollisionEntityIndex();
|
|
587
694
|
}
|
|
588
695
|
async start(mapName) {
|
|
589
696
|
console.log(`Starting Dedicated Server on port ${this.port}...`);
|
|
@@ -634,7 +741,7 @@ var DedicatedServer = class {
|
|
|
634
741
|
ent: hitEntity
|
|
635
742
|
};
|
|
636
743
|
}
|
|
637
|
-
const worldResult = this.sv.collisionModel ? (0,
|
|
744
|
+
const worldResult = this.sv.collisionModel ? (0, import_shared4.traceBox)({
|
|
638
745
|
start,
|
|
639
746
|
end,
|
|
640
747
|
mins: mins || void 0,
|
|
@@ -755,14 +862,14 @@ var DedicatedServer = class {
|
|
|
755
862
|
client.userInfo = userInfo;
|
|
756
863
|
console.log(`Client ${client.index} connected: ${userInfo}`);
|
|
757
864
|
this.sendServerData(client);
|
|
758
|
-
const writer = new
|
|
759
|
-
writer.writeByte(
|
|
865
|
+
const writer = new import_shared4.BinaryWriter();
|
|
866
|
+
writer.writeByte(import_shared4.ServerCommand.stufftext);
|
|
760
867
|
writer.writeString("precache\n");
|
|
761
868
|
client.net.send(writer.getData());
|
|
762
869
|
} else {
|
|
763
870
|
console.log(`Client ${client.index} rejected: ${result}`);
|
|
764
|
-
const writer = new
|
|
765
|
-
writer.writeByte(
|
|
871
|
+
const writer = new import_shared4.BinaryWriter();
|
|
872
|
+
writer.writeByte(import_shared4.ServerCommand.print);
|
|
766
873
|
writer.writeByte(2);
|
|
767
874
|
writer.writeString(`Connection rejected: ${result}
|
|
768
875
|
`);
|
|
@@ -786,31 +893,31 @@ var DedicatedServer = class {
|
|
|
786
893
|
console.log(`Client ${client.index} entered game`);
|
|
787
894
|
}
|
|
788
895
|
sendServerData(client) {
|
|
789
|
-
const writer = new
|
|
790
|
-
writer.writeByte(
|
|
896
|
+
const writer = new import_shared4.BinaryWriter();
|
|
897
|
+
writer.writeByte(import_shared4.ServerCommand.serverdata);
|
|
791
898
|
writer.writeLong(34);
|
|
792
899
|
writer.writeLong(this.sv.frame);
|
|
793
900
|
writer.writeByte(0);
|
|
794
901
|
writer.writeString("baseq2");
|
|
795
902
|
writer.writeShort(client.index);
|
|
796
903
|
writer.writeString("maps/test.bsp");
|
|
797
|
-
for (let i = 0; i <
|
|
904
|
+
for (let i = 0; i < import_shared4.MAX_CONFIGSTRINGS; i++) {
|
|
798
905
|
if (this.sv.configStrings[i]) {
|
|
799
906
|
this.SV_WriteConfigString(writer, i, this.sv.configStrings[i]);
|
|
800
907
|
}
|
|
801
908
|
}
|
|
802
|
-
for (let i = 0; i <
|
|
909
|
+
for (let i = 0; i < import_shared4.MAX_EDICTS; i++) {
|
|
803
910
|
if (this.sv.baselines[i]) {
|
|
804
|
-
writer.writeByte(
|
|
911
|
+
writer.writeByte(import_shared4.ServerCommand.spawnbaseline);
|
|
805
912
|
writeDeltaEntity({}, this.sv.baselines[i], writer, true, true);
|
|
806
913
|
}
|
|
807
914
|
}
|
|
808
915
|
client.net.send(writer.getData());
|
|
809
916
|
}
|
|
810
917
|
SV_SetConfigString(index, value) {
|
|
811
|
-
if (index < 0 || index >=
|
|
918
|
+
if (index < 0 || index >= import_shared4.MAX_CONFIGSTRINGS) return;
|
|
812
919
|
this.sv.configStrings[index] = value;
|
|
813
|
-
const writer = new
|
|
920
|
+
const writer = new import_shared4.BinaryWriter();
|
|
814
921
|
this.SV_WriteConfigString(writer, index, value);
|
|
815
922
|
const data = writer.getData();
|
|
816
923
|
for (const client of this.svs.clients) {
|
|
@@ -820,7 +927,7 @@ var DedicatedServer = class {
|
|
|
820
927
|
}
|
|
821
928
|
}
|
|
822
929
|
SV_WriteConfigString(writer, index, value) {
|
|
823
|
-
writer.writeByte(
|
|
930
|
+
writer.writeByte(import_shared4.ServerCommand.configstring);
|
|
824
931
|
writer.writeShort(index);
|
|
825
932
|
writer.writeString(value);
|
|
826
933
|
}
|
|
@@ -830,7 +937,7 @@ var DedicatedServer = class {
|
|
|
830
937
|
while (client.messageQueue.length > 0) {
|
|
831
938
|
const data = client.messageQueue.shift();
|
|
832
939
|
if (!data) continue;
|
|
833
|
-
const reader = new
|
|
940
|
+
const reader = new import_shared4.BinaryStream(data.buffer);
|
|
834
941
|
const parser = new ClientMessageParser(reader, {
|
|
835
942
|
onMove: (checksum, lastFrame, cmd) => this.handleMove(client, cmd),
|
|
836
943
|
onUserInfo: (info) => this.handleUserInfo(client, info),
|
|
@@ -876,13 +983,13 @@ var DedicatedServer = class {
|
|
|
876
983
|
}
|
|
877
984
|
}
|
|
878
985
|
SV_SendClientFrame(client, snapshot) {
|
|
879
|
-
const writer = new
|
|
880
|
-
writer.writeByte(
|
|
986
|
+
const writer = new import_shared4.BinaryWriter();
|
|
987
|
+
writer.writeByte(import_shared4.ServerCommand.frame);
|
|
881
988
|
writer.writeLong(this.sv.frame);
|
|
882
989
|
writer.writeLong(0);
|
|
883
990
|
writer.writeByte(0);
|
|
884
991
|
writer.writeByte(0);
|
|
885
|
-
writer.writeByte(
|
|
992
|
+
writer.writeByte(import_shared4.ServerCommand.playerinfo);
|
|
886
993
|
const ps = {
|
|
887
994
|
pm_type: snapshot.pmType,
|
|
888
995
|
origin: snapshot.origin,
|
|
@@ -910,7 +1017,7 @@ var DedicatedServer = class {
|
|
|
910
1017
|
stats: snapshot.stats
|
|
911
1018
|
};
|
|
912
1019
|
writePlayerState(writer, ps);
|
|
913
|
-
writer.writeByte(
|
|
1020
|
+
writer.writeByte(import_shared4.ServerCommand.packetentities);
|
|
914
1021
|
const entities = snapshot.packetEntities || [];
|
|
915
1022
|
for (const entity of entities) {
|
|
916
1023
|
writeDeltaEntity({}, entity, writer, false, true);
|
|
@@ -924,10 +1031,45 @@ var DedicatedServer = class {
|
|
|
924
1031
|
return { fraction: 1 };
|
|
925
1032
|
}
|
|
926
1033
|
multicast(origin, type, event, ...args) {
|
|
1034
|
+
const writer = new import_shared4.BinaryWriter();
|
|
1035
|
+
writeServerCommand(writer, event, ...args);
|
|
1036
|
+
const data = writer.getData();
|
|
1037
|
+
const reliable = event === import_shared4.ServerCommand.print || event === import_shared4.ServerCommand.configstring;
|
|
1038
|
+
for (const client of this.svs.clients) {
|
|
1039
|
+
if (!client || client.state < 4 /* Active */ || !client.edict) {
|
|
1040
|
+
continue;
|
|
1041
|
+
}
|
|
1042
|
+
let send = false;
|
|
1043
|
+
switch (type) {
|
|
1044
|
+
case import_game.MulticastType.All:
|
|
1045
|
+
send = true;
|
|
1046
|
+
break;
|
|
1047
|
+
case import_game.MulticastType.Pvs:
|
|
1048
|
+
if (this.sv.collisionModel) {
|
|
1049
|
+
send = (0, import_shared4.inPVS)(origin, client.edict.origin, this.sv.collisionModel);
|
|
1050
|
+
} else {
|
|
1051
|
+
send = true;
|
|
1052
|
+
}
|
|
1053
|
+
break;
|
|
1054
|
+
case import_game.MulticastType.Phs:
|
|
1055
|
+
if (this.sv.collisionModel) {
|
|
1056
|
+
send = (0, import_shared4.inPHS)(origin, client.edict.origin, this.sv.collisionModel);
|
|
1057
|
+
} else {
|
|
1058
|
+
send = true;
|
|
1059
|
+
}
|
|
1060
|
+
break;
|
|
1061
|
+
}
|
|
1062
|
+
if (send) {
|
|
1063
|
+
client.net.send(data);
|
|
1064
|
+
}
|
|
1065
|
+
}
|
|
927
1066
|
}
|
|
928
1067
|
unicast(ent, reliable, event, ...args) {
|
|
929
1068
|
const client = this.svs.clients.find((c) => c?.edict === ent);
|
|
930
|
-
if (client) {
|
|
1069
|
+
if (client && client.state >= 2 /* Connected */) {
|
|
1070
|
+
const writer = new import_shared4.BinaryWriter();
|
|
1071
|
+
writeServerCommand(writer, event, ...args);
|
|
1072
|
+
client.net.send(writer.getData());
|
|
931
1073
|
}
|
|
932
1074
|
}
|
|
933
1075
|
configstring(index, value) {
|
|
@@ -112,7 +112,7 @@ var WebSocketNetDriver = class {
|
|
|
112
112
|
|
|
113
113
|
// src/dedicated.ts
|
|
114
114
|
import { WebSocketServer } from "ws";
|
|
115
|
-
import { createGame } from "@quake2ts/game";
|
|
115
|
+
import { createGame, MulticastType } from "@quake2ts/game";
|
|
116
116
|
|
|
117
117
|
// src/client.ts
|
|
118
118
|
import { UPDATE_BACKUP } from "@quake2ts/shared";
|
|
@@ -262,7 +262,7 @@ var ClientMessageParser = class {
|
|
|
262
262
|
};
|
|
263
263
|
|
|
264
264
|
// src/dedicated.ts
|
|
265
|
-
import { BinaryWriter, ServerCommand, BinaryStream as BinaryStream2, traceBox, MAX_CONFIGSTRINGS as MAX_CONFIGSTRINGS2, MAX_EDICTS, CollisionEntityIndex } from "@quake2ts/shared";
|
|
265
|
+
import { BinaryWriter as BinaryWriter2, ServerCommand as ServerCommand2, BinaryStream as BinaryStream2, traceBox, MAX_CONFIGSTRINGS as MAX_CONFIGSTRINGS2, MAX_EDICTS, CollisionEntityIndex, inPVS, inPHS } from "@quake2ts/shared";
|
|
266
266
|
import { parseBsp } from "@quake2ts/engine";
|
|
267
267
|
import fs from "fs/promises";
|
|
268
268
|
import { createPlayerInventory, createPlayerWeaponStates } from "@quake2ts/game";
|
|
@@ -509,6 +509,113 @@ function writePlayerState(writer, ps) {
|
|
|
509
509
|
}
|
|
510
510
|
}
|
|
511
511
|
|
|
512
|
+
// src/protocol/write.ts
|
|
513
|
+
import { ServerCommand, TempEntity } from "@quake2ts/shared";
|
|
514
|
+
function writeServerCommand(writer, event, ...args) {
|
|
515
|
+
writer.writeByte(event);
|
|
516
|
+
switch (event) {
|
|
517
|
+
case ServerCommand.print: {
|
|
518
|
+
const level = args[0];
|
|
519
|
+
const text = args[1];
|
|
520
|
+
writer.writeByte(level);
|
|
521
|
+
writer.writeString(text);
|
|
522
|
+
break;
|
|
523
|
+
}
|
|
524
|
+
case ServerCommand.muzzleflash: {
|
|
525
|
+
const entIndex = args[0];
|
|
526
|
+
const flashType = args[1];
|
|
527
|
+
writer.writeShort(entIndex);
|
|
528
|
+
writer.writeByte(flashType);
|
|
529
|
+
break;
|
|
530
|
+
}
|
|
531
|
+
case ServerCommand.temp_entity: {
|
|
532
|
+
const type = args[0];
|
|
533
|
+
writer.writeByte(type);
|
|
534
|
+
writeTempEntity(writer, type, args.slice(1));
|
|
535
|
+
break;
|
|
536
|
+
}
|
|
537
|
+
default:
|
|
538
|
+
console.warn(`writeServerCommand: Unhandled command ${event}`);
|
|
539
|
+
break;
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
function writeTempEntity(writer, type, args) {
|
|
543
|
+
switch (type) {
|
|
544
|
+
case TempEntity.ROCKET_EXPLOSION:
|
|
545
|
+
case TempEntity.GRENADE_EXPLOSION:
|
|
546
|
+
case TempEntity.EXPLOSION1:
|
|
547
|
+
case TempEntity.EXPLOSION2:
|
|
548
|
+
case TempEntity.ROCKET_EXPLOSION_WATER:
|
|
549
|
+
case TempEntity.GRENADE_EXPLOSION_WATER:
|
|
550
|
+
case TempEntity.BFG_EXPLOSION:
|
|
551
|
+
case TempEntity.BFG_BIGEXPLOSION:
|
|
552
|
+
case TempEntity.PLASMA_EXPLOSION:
|
|
553
|
+
case TempEntity.PLAIN_EXPLOSION:
|
|
554
|
+
case TempEntity.TRACKER_EXPLOSION:
|
|
555
|
+
case TempEntity.EXPLOSION1_BIG:
|
|
556
|
+
case TempEntity.EXPLOSION1_NP:
|
|
557
|
+
case TempEntity.EXPLOSION1_NL:
|
|
558
|
+
case TempEntity.EXPLOSION2_NL:
|
|
559
|
+
case TempEntity.BERSERK_SLAM:
|
|
560
|
+
writer.writePos(args[0]);
|
|
561
|
+
break;
|
|
562
|
+
case TempEntity.BLASTER:
|
|
563
|
+
case TempEntity.FLECHETTE:
|
|
564
|
+
writer.writePos(args[0]);
|
|
565
|
+
writer.writeDir(args[1]);
|
|
566
|
+
break;
|
|
567
|
+
case TempEntity.RAILTRAIL:
|
|
568
|
+
case TempEntity.DEBUGTRAIL:
|
|
569
|
+
case TempEntity.BUBBLETRAIL:
|
|
570
|
+
case TempEntity.BUBBLETRAIL2:
|
|
571
|
+
case TempEntity.BFG_LASER:
|
|
572
|
+
case TempEntity.LIGHTNING_BEAM:
|
|
573
|
+
case TempEntity.LIGHTNING:
|
|
574
|
+
writer.writePos(args[0]);
|
|
575
|
+
writer.writePos(args[1]);
|
|
576
|
+
break;
|
|
577
|
+
case TempEntity.LASER_SPARKS:
|
|
578
|
+
case TempEntity.WELDING_SPARKS:
|
|
579
|
+
case TempEntity.TUNNEL_SPARKS:
|
|
580
|
+
case TempEntity.ELECTRIC_SPARKS:
|
|
581
|
+
case TempEntity.HEATBEAM_SPARKS:
|
|
582
|
+
case TempEntity.HEATBEAM_STEAM:
|
|
583
|
+
case TempEntity.STEAM:
|
|
584
|
+
writer.writeByte(args[0]);
|
|
585
|
+
writer.writePos(args[1]);
|
|
586
|
+
writer.writeDir(args[2]);
|
|
587
|
+
writer.writeByte(args[3] || 0);
|
|
588
|
+
break;
|
|
589
|
+
case TempEntity.PARASITE_ATTACK:
|
|
590
|
+
case TempEntity.MEDIC_CABLE_ATTACK:
|
|
591
|
+
const ent = args[0];
|
|
592
|
+
writer.writeShort(ent ? ent.index : 0);
|
|
593
|
+
writer.writePos(args[1]);
|
|
594
|
+
writer.writePos(args[2]);
|
|
595
|
+
break;
|
|
596
|
+
case TempEntity.GUNSHOT:
|
|
597
|
+
case TempEntity.BLOOD:
|
|
598
|
+
case TempEntity.SPARKS:
|
|
599
|
+
case TempEntity.BULLET_SPARKS:
|
|
600
|
+
case TempEntity.SCREEN_SPARKS:
|
|
601
|
+
case TempEntity.SHIELD_SPARKS:
|
|
602
|
+
writer.writePos(args[0]);
|
|
603
|
+
writer.writeDir(args[1]);
|
|
604
|
+
break;
|
|
605
|
+
case TempEntity.SPLASH:
|
|
606
|
+
case TempEntity.POWER_SPLASH:
|
|
607
|
+
case TempEntity.WIDOWSPLASH:
|
|
608
|
+
writer.writeByte(args[0]);
|
|
609
|
+
writer.writePos(args[1]);
|
|
610
|
+
writer.writeDir(args[2]);
|
|
611
|
+
writer.writeByte(args[3] || 0);
|
|
612
|
+
break;
|
|
613
|
+
default:
|
|
614
|
+
console.warn(`writeTempEntity: Unhandled TempEntity ${type}`);
|
|
615
|
+
break;
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
|
|
512
619
|
// src/dedicated.ts
|
|
513
620
|
var MAX_CLIENTS = 16;
|
|
514
621
|
var FRAME_RATE = 10;
|
|
@@ -715,14 +822,14 @@ var DedicatedServer = class {
|
|
|
715
822
|
client.userInfo = userInfo;
|
|
716
823
|
console.log(`Client ${client.index} connected: ${userInfo}`);
|
|
717
824
|
this.sendServerData(client);
|
|
718
|
-
const writer = new
|
|
719
|
-
writer.writeByte(
|
|
825
|
+
const writer = new BinaryWriter2();
|
|
826
|
+
writer.writeByte(ServerCommand2.stufftext);
|
|
720
827
|
writer.writeString("precache\n");
|
|
721
828
|
client.net.send(writer.getData());
|
|
722
829
|
} else {
|
|
723
830
|
console.log(`Client ${client.index} rejected: ${result}`);
|
|
724
|
-
const writer = new
|
|
725
|
-
writer.writeByte(
|
|
831
|
+
const writer = new BinaryWriter2();
|
|
832
|
+
writer.writeByte(ServerCommand2.print);
|
|
726
833
|
writer.writeByte(2);
|
|
727
834
|
writer.writeString(`Connection rejected: ${result}
|
|
728
835
|
`);
|
|
@@ -746,8 +853,8 @@ var DedicatedServer = class {
|
|
|
746
853
|
console.log(`Client ${client.index} entered game`);
|
|
747
854
|
}
|
|
748
855
|
sendServerData(client) {
|
|
749
|
-
const writer = new
|
|
750
|
-
writer.writeByte(
|
|
856
|
+
const writer = new BinaryWriter2();
|
|
857
|
+
writer.writeByte(ServerCommand2.serverdata);
|
|
751
858
|
writer.writeLong(34);
|
|
752
859
|
writer.writeLong(this.sv.frame);
|
|
753
860
|
writer.writeByte(0);
|
|
@@ -761,7 +868,7 @@ var DedicatedServer = class {
|
|
|
761
868
|
}
|
|
762
869
|
for (let i = 0; i < MAX_EDICTS; i++) {
|
|
763
870
|
if (this.sv.baselines[i]) {
|
|
764
|
-
writer.writeByte(
|
|
871
|
+
writer.writeByte(ServerCommand2.spawnbaseline);
|
|
765
872
|
writeDeltaEntity({}, this.sv.baselines[i], writer, true, true);
|
|
766
873
|
}
|
|
767
874
|
}
|
|
@@ -770,7 +877,7 @@ var DedicatedServer = class {
|
|
|
770
877
|
SV_SetConfigString(index, value) {
|
|
771
878
|
if (index < 0 || index >= MAX_CONFIGSTRINGS2) return;
|
|
772
879
|
this.sv.configStrings[index] = value;
|
|
773
|
-
const writer = new
|
|
880
|
+
const writer = new BinaryWriter2();
|
|
774
881
|
this.SV_WriteConfigString(writer, index, value);
|
|
775
882
|
const data = writer.getData();
|
|
776
883
|
for (const client of this.svs.clients) {
|
|
@@ -780,7 +887,7 @@ var DedicatedServer = class {
|
|
|
780
887
|
}
|
|
781
888
|
}
|
|
782
889
|
SV_WriteConfigString(writer, index, value) {
|
|
783
|
-
writer.writeByte(
|
|
890
|
+
writer.writeByte(ServerCommand2.configstring);
|
|
784
891
|
writer.writeShort(index);
|
|
785
892
|
writer.writeString(value);
|
|
786
893
|
}
|
|
@@ -836,13 +943,13 @@ var DedicatedServer = class {
|
|
|
836
943
|
}
|
|
837
944
|
}
|
|
838
945
|
SV_SendClientFrame(client, snapshot) {
|
|
839
|
-
const writer = new
|
|
840
|
-
writer.writeByte(
|
|
946
|
+
const writer = new BinaryWriter2();
|
|
947
|
+
writer.writeByte(ServerCommand2.frame);
|
|
841
948
|
writer.writeLong(this.sv.frame);
|
|
842
949
|
writer.writeLong(0);
|
|
843
950
|
writer.writeByte(0);
|
|
844
951
|
writer.writeByte(0);
|
|
845
|
-
writer.writeByte(
|
|
952
|
+
writer.writeByte(ServerCommand2.playerinfo);
|
|
846
953
|
const ps = {
|
|
847
954
|
pm_type: snapshot.pmType,
|
|
848
955
|
origin: snapshot.origin,
|
|
@@ -870,7 +977,7 @@ var DedicatedServer = class {
|
|
|
870
977
|
stats: snapshot.stats
|
|
871
978
|
};
|
|
872
979
|
writePlayerState(writer, ps);
|
|
873
|
-
writer.writeByte(
|
|
980
|
+
writer.writeByte(ServerCommand2.packetentities);
|
|
874
981
|
const entities = snapshot.packetEntities || [];
|
|
875
982
|
for (const entity of entities) {
|
|
876
983
|
writeDeltaEntity({}, entity, writer, false, true);
|
|
@@ -884,10 +991,45 @@ var DedicatedServer = class {
|
|
|
884
991
|
return { fraction: 1 };
|
|
885
992
|
}
|
|
886
993
|
multicast(origin, type, event, ...args) {
|
|
994
|
+
const writer = new BinaryWriter2();
|
|
995
|
+
writeServerCommand(writer, event, ...args);
|
|
996
|
+
const data = writer.getData();
|
|
997
|
+
const reliable = event === ServerCommand2.print || event === ServerCommand2.configstring;
|
|
998
|
+
for (const client of this.svs.clients) {
|
|
999
|
+
if (!client || client.state < 4 /* Active */ || !client.edict) {
|
|
1000
|
+
continue;
|
|
1001
|
+
}
|
|
1002
|
+
let send = false;
|
|
1003
|
+
switch (type) {
|
|
1004
|
+
case MulticastType.All:
|
|
1005
|
+
send = true;
|
|
1006
|
+
break;
|
|
1007
|
+
case MulticastType.Pvs:
|
|
1008
|
+
if (this.sv.collisionModel) {
|
|
1009
|
+
send = inPVS(origin, client.edict.origin, this.sv.collisionModel);
|
|
1010
|
+
} else {
|
|
1011
|
+
send = true;
|
|
1012
|
+
}
|
|
1013
|
+
break;
|
|
1014
|
+
case MulticastType.Phs:
|
|
1015
|
+
if (this.sv.collisionModel) {
|
|
1016
|
+
send = inPHS(origin, client.edict.origin, this.sv.collisionModel);
|
|
1017
|
+
} else {
|
|
1018
|
+
send = true;
|
|
1019
|
+
}
|
|
1020
|
+
break;
|
|
1021
|
+
}
|
|
1022
|
+
if (send) {
|
|
1023
|
+
client.net.send(data);
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
887
1026
|
}
|
|
888
1027
|
unicast(ent, reliable, event, ...args) {
|
|
889
1028
|
const client = this.svs.clients.find((c) => c?.edict === ent);
|
|
890
|
-
if (client) {
|
|
1029
|
+
if (client && client.state >= 2 /* Connected */) {
|
|
1030
|
+
const writer = new BinaryWriter2();
|
|
1031
|
+
writeServerCommand(writer, event, ...args);
|
|
1032
|
+
client.net.send(writer.getData());
|
|
891
1033
|
}
|
|
892
1034
|
}
|
|
893
1035
|
configstring(index, value) {
|