h1z1-server 0.25.3-2 → 0.25.3-3

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.
@@ -1,66 +1,82 @@
1
1
  [
2
2
  {
3
- "iv": "9bdd2548821a980912fab12c9aef9c5c",
4
- "encryptedData": "947e47e8df9e2f731162884274e4e3d1"
3
+ "iv": "429c41f782a4d10b56ac43b15e132cc1",
4
+ "encryptedData": "e88beddbf046bade585cb40c035205fb"
5
5
  },
6
6
  {
7
- "iv": "9bdd2548821a980912fab12c9aef9c5c",
8
- "encryptedData": "4954430770cb8335663b2c7603905a9b"
7
+ "iv": "6f0f727b3edda3a59a7d3d699c6c7589",
8
+ "encryptedData": "541a6af0c674ab59380bfd027d769106"
9
9
  },
10
10
  {
11
- "iv": "9bdd2548821a980912fab12c9aef9c5c",
12
- "encryptedData": "dd4b5855c9051fa0df4568217ed32a33"
11
+ "iv": "506bb383cdccb4d51024f2998bbda954",
12
+ "encryptedData": "de22e03e2c2a2fd98a592d397868c62f"
13
13
  },
14
14
  {
15
- "iv": "9bdd2548821a980912fab12c9aef9c5c",
16
- "encryptedData": "59703a77bfcc16fd80bfd66bb227a3e3"
15
+ "iv": "96a78494d3aa57af1390afff6a5d9eaa",
16
+ "encryptedData": "071327955655cf3872ac053e91d8f1d7"
17
17
  },
18
18
  {
19
- "iv": "9bdd2548821a980912fab12c9aef9c5c",
20
- "encryptedData": "d13c8ffed1f28b19dc8333a99e09200d"
19
+ "iv": "b9f210042e832170423bfa45e713a864",
20
+ "encryptedData": "d607e166aa33267fe1e1e2db1df01df7"
21
21
  },
22
22
  {
23
- "iv": "9bdd2548821a980912fab12c9aef9c5c",
24
- "encryptedData": "2616f54828387e0fb0d92c6689a8a9cf"
23
+ "iv": "cf623230e05783c4432d67e995cf0d03",
24
+ "encryptedData": "e1131f1626db1329b56078e33b8f73f1"
25
25
  },
26
26
  {
27
- "iv": "9bdd2548821a980912fab12c9aef9c5c",
28
- "encryptedData": "6153f99f87d648497b06ab6d2e934860"
27
+ "iv": "8f1937225a6a4b451bba1842d4e93a99",
28
+ "encryptedData": "863ad9d53332e1345489579242d8a177"
29
29
  },
30
30
  {
31
- "iv": "9bdd2548821a980912fab12c9aef9c5c",
32
- "encryptedData": "bf05833bb819c4ae1fbb1fb2293e3b51"
31
+ "iv": "60b523205541eaf0394ac5ded898484e",
32
+ "encryptedData": "5e2e649d2e2db8c892c2e9bf43a21d1d"
33
33
  },
34
34
  {
35
- "iv": "9bdd2548821a980912fab12c9aef9c5c",
36
- "encryptedData": "ab69bf026aa0feafb6df1e27d80f3707"
35
+ "iv": "0952a634abe5a4bcbf6f6965b2d7e94a",
36
+ "encryptedData": "14c5e55691110fbc5199f05b77a63800"
37
37
  },
38
38
  {
39
- "iv": "9bdd2548821a980912fab12c9aef9c5c",
40
- "encryptedData": "0722c7b737c42ad953a7389bd95aaf0f"
39
+ "iv": "50a68da557a2a8f5e2e4e24553d90c1f",
40
+ "encryptedData": "78064ed318a8ffaa5f3c3a5f2cd66ab2"
41
41
  },
42
42
  {
43
- "iv": "9bdd2548821a980912fab12c9aef9c5c",
44
- "encryptedData": "46fef4dab38ea5f2442b840e3dc007bb"
43
+ "iv": "a638bcb701d22edcd2b6eebbca1f43f9",
44
+ "encryptedData": "aae666d3c587d68862b533fe07aeec84"
45
45
  },
46
46
  {
47
- "iv": "9bdd2548821a980912fab12c9aef9c5c",
48
- "encryptedData": "4e6f01bad798b569e1dae68676d8cefd"
47
+ "iv": "965f8d8157a468c6614b10a35017c2b5",
48
+ "encryptedData": "fda0df98eea883ecfcc31a1cdf5237f4"
49
49
  },
50
50
  {
51
- "iv": "9bdd2548821a980912fab12c9aef9c5c",
52
- "encryptedData": "1f562e064e059540d0a0aa42ae19284c"
51
+ "iv": "46dad3078c80081f5f855f2a6571cca9",
52
+ "encryptedData": "9033abad2bb2d845510ddff1a9ca0168"
53
53
  },
54
54
  {
55
- "iv": "9bdd2548821a980912fab12c9aef9c5c",
56
- "encryptedData": "e65f9a873a07982e3b257a00fd3c7aa4620fea877b7eedf5dcb2e0745530667d"
55
+ "iv": "af02c554aaa00b0b90f938d730085da0",
56
+ "encryptedData": "f08c72ee146cba26ff8078b66735a4f0384a1d334b86ee57fd790c139b7b635c"
57
57
  },
58
58
  {
59
- "iv": "9bdd2548821a980912fab12c9aef9c5c",
60
- "encryptedData": "8085c4bbdf7e82eb5988a67d81f6c348"
59
+ "iv": "65f61c9fc78dc39f5a44f636257808db",
60
+ "encryptedData": "5008546353f1f2683aab4b66c0314f02"
61
61
  },
62
62
  {
63
- "iv": "9bdd2548821a980912fab12c9aef9c5c",
64
- "encryptedData": "0c79c3c3203083bb993840b74b91a09571a7d95cf9286db439e46fad5c212ac3"
63
+ "iv": "f67a53aa22ea38fea4fdf575426137b3",
64
+ "encryptedData": "2f0cdbb3a1a4f794431f74eaea9413ab015430c23803cc3b5cfd61af01f23357"
65
+ },
66
+ {
67
+ "iv": "bc3fb49739d5a50bb67e3368220544ad",
68
+ "encryptedData": "27437bf6e73172025a1509c54a6f4226b324310c8ac5e551597a934bd83eb9cd02a81d790df3a4c24cf4fe031283d6d8"
69
+ },
70
+ {
71
+ "iv": "56900d8fd6d729f6727cc2b89b8c0a1b",
72
+ "encryptedData": "8c11e5c29e1d59f578b82d5964753f77d071eee113730686072ae961c588dff6"
73
+ },
74
+ {
75
+ "iv": "45053b47f1b740b82ca6c262960c8baf",
76
+ "encryptedData": "dcf5028d95e69ead7ad58ea38613842a71ab3beb997c785722162ba337ebe4d4421e4c303f5478e8761a3f5978fc8cc4693478b42db090630c1542fed8291c0394cb5f552f6ca8ebc03ffdfd9b54bc46"
77
+ },
78
+ {
79
+ "iv": "305ac9717ec834c8bbeb2b24c6a1a897",
80
+ "encryptedData": "95481274f36bf3102d25115b3db8fc3ae1bc57ee2b7e2391fbb4c909f5dd409d29f36d49a73e3c1de3181a2ea6adc14c1fb718a8e017056ecced9a396bd8d449095cabd370b11ff03673d9868462f618"
65
81
  }
66
82
  ]
@@ -288,7 +288,7 @@
288
288
  "statValue": {
289
289
  "type": 1,
290
290
  "value": {
291
- "base": 0.4,
291
+ "base": 0.6,
292
292
  "modifier": 0
293
293
  }
294
294
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "h1z1-server",
3
- "version": "0.25.3-2",
3
+ "version": "0.25.3-3",
4
4
  "description": "Library for emulating h1z1 servers",
5
5
  "author": "Quentin Gruber <quentingruber@gmail.com> (http://github.com/quentingruber)",
6
6
  "license": "GPL-3.0-only",
@@ -28,6 +28,7 @@ export class ZoneClient2016 {
28
28
  firstLoading: boolean = false;
29
29
  isLoading: boolean = true;
30
30
  characterReleased: boolean = false;
31
+ isSynced: boolean = false;
31
32
  isInteracting: boolean = false;
32
33
  isAdmin: boolean = false;
33
34
  isDebugMode: boolean = false;
@@ -1482,11 +1482,9 @@ export const commands: Array<Command> = [
1482
1482
  `Players: ${Object.values(server._clients)
1483
1483
  .map((c) => {
1484
1484
  return `${c.character.name}: ${c.loginSessionId} | ${
1485
- server.getSoeClient(client.soeClientId)?.getNetworkStats()[2]
1486
- } | ${
1487
- server.getSoeClient(client.soeClientId)?.getNetworkStats()[0]
1488
- } | ${
1489
- server.getSoeClient(client.soeClientId)?.getNetworkStats()[1]
1485
+ server.getSoeClient(c.soeClientId)?.getNetworkStats()[2]
1486
+ } | ${server.getSoeClient(c.soeClientId)?.getNetworkStats()[0]} | ${
1487
+ server.getSoeClient(c.soeClientId)?.getNetworkStats()[1]
1490
1488
  }`;
1491
1489
  })
1492
1490
  .join(",\n")}`
@@ -106,6 +106,7 @@ export class Character2016 extends BaseFullCharacter {
106
106
  spawnGridData: number[] = [];
107
107
  lastJumpTime: number = 0;
108
108
  weaponStance: number = 1;
109
+ stance: number = 0;
109
110
  readonly metrics: CharacterMetrics = {
110
111
  recipesDiscovered: 0,
111
112
  zombiesKilled: 0,
@@ -202,11 +203,11 @@ export class Character2016 extends BaseFullCharacter {
202
203
  (client.vehicle.mountedVehicle == "" ||
203
204
  !client.vehicle.mountedVehicle)
204
205
  ) {
205
- client.character._resources[ResourceIds.STAMINA] -= 4;
206
+ client.character._resources[ResourceIds.STAMINA] -= 8;
206
207
  client.character.isExhausted =
207
208
  client.character._resources[ResourceIds.STAMINA] < 120;
208
209
  } else if (!client.character.isBleeding || !client.character.isMoving) {
209
- client.character._resources[ResourceIds.STAMINA] += 12;
210
+ client.character._resources[ResourceIds.STAMINA] += 16;
210
211
  }
211
212
 
212
213
  // todo: modify sprint stat
@@ -165,11 +165,6 @@ export class zonePacketHandlers {
165
165
  });
166
166
  });
167
167
 
168
- server.sendData(client, "Synchronization", {
169
- serverTime: Int64String(server.getServerTime()),
170
- serverTime2: Int64String(server.getServerTime()),
171
- } as Synchronization);
172
-
173
168
  server.sendData(client, "Character.WeaponStance", {
174
169
  // activates weaponstance key
175
170
  characterId: client.character.characterId,
@@ -380,7 +375,7 @@ export class zonePacketHandlers {
380
375
  });
381
376
  }
382
377
  KeepAlive(server: ZoneServer2016, client: Client, packet: any) {
383
- if (client.isLoading && client.characterReleased) {
378
+ if (client.isLoading && client.characterReleased && client.isSynced) {
384
379
  setTimeout(() => {
385
380
  client.isLoading = false;
386
381
  if (!client.characterReleased) return;
@@ -404,7 +399,9 @@ export class zonePacketHandlers {
404
399
  const obj = { log: packet.data.message, isSuspicious: false };
405
400
  for (let x = 0; x < server._suspiciousList.length; x++) {
406
401
  if (
407
- packet.data.message.toLowerCase().includes(server._suspiciousList[x])
402
+ packet.data.message
403
+ .toLowerCase()
404
+ .includes(server._suspiciousList[x].toLowerCase())
408
405
  ) {
409
406
  obj.isSuspicious = true;
410
407
  if (!server._soloMode) {
@@ -497,6 +494,10 @@ export class zonePacketHandlers {
497
494
  time3: Int64String(Number(packet.data.clientTime)) + 2,
498
495
  };
499
496
  server.sendData(client, "Synchronization", reflectedPacket);
497
+ if (client.isSynced) return;
498
+ client.isSynced = true;
499
+ client.character.lastLoginDate = toHex(Date.now());
500
+ server.constructionManager(client);
500
501
  }
501
502
  CommandExecuteCommand(server: ZoneServer2016, client: Client, packet: any) {
502
503
  this.commandHandler.executeCommand(server, client, packet);
@@ -628,7 +629,7 @@ export class zonePacketHandlers {
628
629
  return;
629
630
  }
630
631
  // for cheaters spawning cars on top of peoples heads
631
- if (client.vehicle.mountedVehicle != vehicle.characterId) return;
632
+ if (!client.managedObjects.includes(vehicle.characterId)) return;
632
633
  if (packet.data.positionUpdate.position) {
633
634
  if (
634
635
  server.vehicleSpeedFairPlayCheck(
@@ -654,13 +655,18 @@ export class zonePacketHandlers {
654
655
  ) > 100
655
656
  ) {
656
657
  kick = true;
658
+ server.kickPlayer(client);
659
+ server.sendChatTextToAdmins(
660
+ `FairPlay: kicking ${client.character.name} for suspeced teleport in vehicle by ${dist} from [${vehicle.positionUpdate.position[0]} ${vehicle.positionUpdate.position[1]} ${vehicle.positionUpdate.position[2]}] to [${packet.data.positionUpdate.position[0]} ${packet.data.positionUpdate.position[1]} ${packet.data.positionUpdate.position[2]}]`,
661
+ false
662
+ );
657
663
  }
658
664
  vehicle.getPassengerList().forEach((passenger: string) => {
659
665
  if (server._characters[passenger]) {
660
666
  if (kick) {
661
667
  const c = server.getClientByCharId(passenger);
662
668
  if (!c) return;
663
- server.kickPlayer(client);
669
+ server.kickPlayer(c);
664
670
  server.sendChatTextToAdmins(
665
671
  `FairPlay: kicking ${c.character.name} for suspeced teleport in vehicle by ${dist} from [${vehicle.positionUpdate.position[0]} ${vehicle.positionUpdate.position[1]} ${vehicle.positionUpdate.position[2]}] to [${packet.data.positionUpdate.position[0]} ${packet.data.positionUpdate.position[1]} ${packet.data.positionUpdate.position[2]}]`,
666
672
  false
@@ -778,6 +784,20 @@ export class zonePacketHandlers {
778
784
  triggerLoadingScreen: true,
779
785
  });
780
786
  }
787
+ // disabled for now
788
+ /*if (packet.data.stance & (1 << 1)) {
789
+ // started crouching
790
+ client.character._resources[ResourceIds.STAMINA] -= 12; // 2% stamina jump penalty
791
+ if (client.character._resources[ResourceIds.STAMINA] < 0)
792
+ client.character._resources[ResourceIds.STAMINA] = 0;
793
+ server.updateResourceToAllWithSpawnedEntity(
794
+ client.character.characterId,
795
+ client.character._resources[ResourceIds.STAMINA],
796
+ ResourceIds.STAMINA,
797
+ ResourceTypes.STAMINA,
798
+ server._characters
799
+ );
800
+ }*/
781
801
  const byte1 = packet.data.stance & 0xff;
782
802
  client.character.isRunning = !!(byte1 & (1 << 2)) ? true : false;
783
803
  if (
@@ -798,6 +818,7 @@ export class zonePacketHandlers {
798
818
  server._characters
799
819
  );
800
820
  }
821
+ client.character.stance = packet.data.stance;
801
822
  }
802
823
  const movingCharacter = server._characters[client.character.characterId];
803
824
  if (movingCharacter) {
@@ -1946,7 +1967,7 @@ export class zonePacketHandlers {
1946
1967
  weaponItem.weapon.ammoCount -= 1;
1947
1968
  }
1948
1969
  const drift = Math.abs(p.gameTime - server.getServerTime());
1949
- if (drift > 500) {
1970
+ if (drift > server._maxPing) {
1950
1971
  server.sendChatText(
1951
1972
  client,
1952
1973
  `FairPlay: Your shots didnt register due to packet loss`
@@ -178,7 +178,7 @@ export class ZoneServer2016 extends EventEmitter {
178
178
  _db!: Db;
179
179
  _soloMode = false;
180
180
  _useFairPlay = true;
181
- maxPing = 250;
181
+ _maxPing = 250;
182
182
  _decryptKey: string = "";
183
183
  _serverName = process.env.SERVER_NAME || "";
184
184
  readonly _mongoAddress: string;
@@ -2402,11 +2402,11 @@ export class ZoneServer2016 extends EventEmitter {
2402
2402
  sequenceTime: number,
2403
2403
  position: Float32Array
2404
2404
  ): boolean {
2405
- if (client.isAdmin || !this._useFairPlay) return false;
2405
+ if (client.isAdmin || !this._useFairPlay || !client.isSynced) return false;
2406
2406
  if (!this.isSaving) {
2407
2407
  const distance = getDistance2d(client.oldPos.position, position);
2408
2408
  if (
2409
- Number(client.character.lastLoginDate) + 20000 <
2409
+ Number(client.character.lastLoginDate) + 5000 <
2410
2410
  new Date().getTime()
2411
2411
  ) {
2412
2412
  const drift = Math.abs(sequenceTime - this.getServerTime());
@@ -3001,7 +3001,7 @@ export class ZoneServer2016 extends EventEmitter {
3001
3001
  maxSpeed = 2600;
3002
3002
  }
3003
3003
  if (
3004
- distance > 40 &&
3004
+ distance > 10 &&
3005
3005
  (speed > maxSpeed || speed <= 0 || speed == Infinity)
3006
3006
  ) {
3007
3007
  this.sendChatTextToAdmins(
@@ -3503,7 +3503,7 @@ export class ZoneServer2016 extends EventEmitter {
3503
3503
  if (
3504
3504
  client.character.isAlive &&
3505
3505
  foundation.isInside(client.character.state.position) &&
3506
- Number(client.character.lastLoginDate) + 15000 < new Date().getTime()
3506
+ Number(client.character.lastLoginDate) + 2000 < new Date().getTime()
3507
3507
  ) {
3508
3508
  const damageInfo: DamageInfo = {
3509
3509
  entity: "Server.Permission",
@@ -3511,7 +3511,7 @@ export class ZoneServer2016 extends EventEmitter {
3511
3511
  };
3512
3512
  this.killCharacter(client, damageInfo);
3513
3513
  }
3514
- }, 2500);
3514
+ }, 2000);
3515
3515
  }
3516
3516
  this.checkFoundationPermission(client, foundation);
3517
3517
  }
@@ -6213,6 +6213,28 @@ export class ZoneServer2016 extends EventEmitter {
6213
6213
  );
6214
6214
  return;
6215
6215
  }
6216
+ if (client.managedObjects.includes(vehicle.characterId)) {
6217
+ setTimeout(() => {
6218
+ this.dropManagedObject(
6219
+ client,
6220
+ vehicle,
6221
+ vehicle.getNextSeatId(this) == "0" ? true : false
6222
+ );
6223
+ this.sendDataToAllWithSpawnedEntity(
6224
+ this._vehicles,
6225
+ vehicle.characterId,
6226
+ "PlayerUpdatePosition",
6227
+ {
6228
+ transientId: vehicle.transientId,
6229
+ positionUpdate: {
6230
+ ...vehicle.positionUpdate,
6231
+ verticalSpeed: 0,
6232
+ horizontalSpeed: 0,
6233
+ },
6234
+ }
6235
+ );
6236
+ }, 3000);
6237
+ }
6216
6238
  if (vehicle.vehicleId == VehicleIds.SPECTATE) {
6217
6239
  this.sendData(client, "Mount.DismountResponse", {
6218
6240
  characterId: client.character.characterId,
@@ -8074,6 +8096,7 @@ export class ZoneServer2016 extends EventEmitter {
8074
8096
  const client = this._clients[a];
8075
8097
  if (!client.isLoading) {
8076
8098
  client.routineCounter++;
8099
+ this.constructionManager(client);
8077
8100
  this.checkInMapBounds(client);
8078
8101
  this.checkZonePing(client);
8079
8102
  if (client.routineCounter >= 3) {
@@ -8086,7 +8109,6 @@ export class ZoneServer2016 extends EventEmitter {
8086
8109
  this.vehicleManager(client);
8087
8110
  this.spawnCharacters(client);
8088
8111
  this.spawnGridObjects(client);
8089
- this.constructionManager(client);
8090
8112
  this.worldConstructionManager(client);
8091
8113
  client.posAtLastRoutine = client.character.state.position;
8092
8114
  }
@@ -8096,13 +8118,13 @@ export class ZoneServer2016 extends EventEmitter {
8096
8118
  }
8097
8119
 
8098
8120
  executeRoutine(client: Client) {
8121
+ this.constructionManager(client);
8099
8122
  this.spawnConstructionParentsInRange(client);
8100
8123
  this.vehicleManager(client);
8101
8124
  //this.npcManager(client);
8102
8125
  this.removeOutOfDistanceEntities(client);
8103
8126
  this.spawnCharacters(client);
8104
8127
  this.spawnGridObjects(client);
8105
- this.constructionManager(client);
8106
8128
  this.worldConstructionManager(client);
8107
8129
  this.POIManager(client);
8108
8130
  client.posAtLastRoutine = client.character.state.position;
@@ -8116,7 +8138,7 @@ export class ZoneServer2016 extends EventEmitter {
8116
8138
  if (soeClient) {
8117
8139
  const ping = soeClient.avgPing;
8118
8140
  client.zonePings.push(ping > 600 ? 600 : ping); // dont push values higher than 600, that would increase average value drasticaly
8119
- if (ping >= this.maxPing) {
8141
+ if (ping >= this._maxPing) {
8120
8142
  this.sendAlert(
8121
8143
  client,
8122
8144
  `Your ping is very high: ${ping}. You may be kicked soon`
@@ -8125,7 +8147,7 @@ export class ZoneServer2016 extends EventEmitter {
8125
8147
  if (client.zonePings.length >= 15) {
8126
8148
  const averagePing =
8127
8149
  client.zonePings.reduce((a, b) => a + b, 0) / client.zonePings.length;
8128
- if (averagePing >= this.maxPing) {
8150
+ if (averagePing >= this._maxPing) {
8129
8151
  this.kickPlayer(client);
8130
8152
  this.sendChatTextToAdmins(
8131
8153
  `${client.character.name} has been been kicked for average ping: ${averagePing}`