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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "quake2ts",
3
- "version": "0.0.213",
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 import_shared3 = require("@quake2ts/shared");
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(import_shared3.MAX_CONFIGSTRINGS).fill(""),
583
- baselines: new Array(import_shared3.MAX_EDICTS).fill(null),
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 import_shared3.CollisionEntityIndex();
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, import_shared3.traceBox)({
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 import_shared3.BinaryWriter();
759
- writer.writeByte(import_shared3.ServerCommand.stufftext);
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 import_shared3.BinaryWriter();
765
- writer.writeByte(import_shared3.ServerCommand.print);
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 import_shared3.BinaryWriter();
790
- writer.writeByte(import_shared3.ServerCommand.serverdata);
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 < import_shared3.MAX_CONFIGSTRINGS; 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 < import_shared3.MAX_EDICTS; i++) {
909
+ for (let i = 0; i < import_shared4.MAX_EDICTS; i++) {
803
910
  if (this.sv.baselines[i]) {
804
- writer.writeByte(import_shared3.ServerCommand.spawnbaseline);
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 >= import_shared3.MAX_CONFIGSTRINGS) return;
918
+ if (index < 0 || index >= import_shared4.MAX_CONFIGSTRINGS) return;
812
919
  this.sv.configStrings[index] = value;
813
- const writer = new import_shared3.BinaryWriter();
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(import_shared3.ServerCommand.configstring);
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 import_shared3.BinaryStream(data.buffer);
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 import_shared3.BinaryWriter();
880
- writer.writeByte(import_shared3.ServerCommand.frame);
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(import_shared3.ServerCommand.playerinfo);
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(import_shared3.ServerCommand.packetentities);
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 BinaryWriter();
719
- writer.writeByte(ServerCommand.stufftext);
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 BinaryWriter();
725
- writer.writeByte(ServerCommand.print);
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 BinaryWriter();
750
- writer.writeByte(ServerCommand.serverdata);
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(ServerCommand.spawnbaseline);
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 BinaryWriter();
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(ServerCommand.configstring);
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 BinaryWriter();
840
- writer.writeByte(ServerCommand.frame);
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(ServerCommand.playerinfo);
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(ServerCommand.packetentities);
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) {