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.
- package/data/2016/encryptedData/encryptedData.json +48 -32
- package/data/2016/sampleData/stats.json +1 -1
- package/package.json +1 -1
- package/src/servers/ZoneServer2016/classes/zoneclient.ts +1 -0
- package/src/servers/ZoneServer2016/commands/commands.ts +3 -5
- package/src/servers/ZoneServer2016/entities/character.ts +3 -2
- package/src/servers/ZoneServer2016/zonepackethandlers.ts +31 -10
- package/src/servers/ZoneServer2016/zoneserver.ts +32 -10
|
@@ -1,66 +1,82 @@
|
|
|
1
1
|
[
|
|
2
2
|
{
|
|
3
|
-
"iv": "
|
|
4
|
-
"encryptedData": "
|
|
3
|
+
"iv": "429c41f782a4d10b56ac43b15e132cc1",
|
|
4
|
+
"encryptedData": "e88beddbf046bade585cb40c035205fb"
|
|
5
5
|
},
|
|
6
6
|
{
|
|
7
|
-
"iv": "
|
|
8
|
-
"encryptedData": "
|
|
7
|
+
"iv": "6f0f727b3edda3a59a7d3d699c6c7589",
|
|
8
|
+
"encryptedData": "541a6af0c674ab59380bfd027d769106"
|
|
9
9
|
},
|
|
10
10
|
{
|
|
11
|
-
"iv": "
|
|
12
|
-
"encryptedData": "
|
|
11
|
+
"iv": "506bb383cdccb4d51024f2998bbda954",
|
|
12
|
+
"encryptedData": "de22e03e2c2a2fd98a592d397868c62f"
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
|
-
"iv": "
|
|
16
|
-
"encryptedData": "
|
|
15
|
+
"iv": "96a78494d3aa57af1390afff6a5d9eaa",
|
|
16
|
+
"encryptedData": "071327955655cf3872ac053e91d8f1d7"
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
|
-
"iv": "
|
|
20
|
-
"encryptedData": "
|
|
19
|
+
"iv": "b9f210042e832170423bfa45e713a864",
|
|
20
|
+
"encryptedData": "d607e166aa33267fe1e1e2db1df01df7"
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
|
-
"iv": "
|
|
24
|
-
"encryptedData": "
|
|
23
|
+
"iv": "cf623230e05783c4432d67e995cf0d03",
|
|
24
|
+
"encryptedData": "e1131f1626db1329b56078e33b8f73f1"
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
|
-
"iv": "
|
|
28
|
-
"encryptedData": "
|
|
27
|
+
"iv": "8f1937225a6a4b451bba1842d4e93a99",
|
|
28
|
+
"encryptedData": "863ad9d53332e1345489579242d8a177"
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
|
-
"iv": "
|
|
32
|
-
"encryptedData": "
|
|
31
|
+
"iv": "60b523205541eaf0394ac5ded898484e",
|
|
32
|
+
"encryptedData": "5e2e649d2e2db8c892c2e9bf43a21d1d"
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
|
-
"iv": "
|
|
36
|
-
"encryptedData": "
|
|
35
|
+
"iv": "0952a634abe5a4bcbf6f6965b2d7e94a",
|
|
36
|
+
"encryptedData": "14c5e55691110fbc5199f05b77a63800"
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
|
-
"iv": "
|
|
40
|
-
"encryptedData": "
|
|
39
|
+
"iv": "50a68da557a2a8f5e2e4e24553d90c1f",
|
|
40
|
+
"encryptedData": "78064ed318a8ffaa5f3c3a5f2cd66ab2"
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
|
-
"iv": "
|
|
44
|
-
"encryptedData": "
|
|
43
|
+
"iv": "a638bcb701d22edcd2b6eebbca1f43f9",
|
|
44
|
+
"encryptedData": "aae666d3c587d68862b533fe07aeec84"
|
|
45
45
|
},
|
|
46
46
|
{
|
|
47
|
-
"iv": "
|
|
48
|
-
"encryptedData": "
|
|
47
|
+
"iv": "965f8d8157a468c6614b10a35017c2b5",
|
|
48
|
+
"encryptedData": "fda0df98eea883ecfcc31a1cdf5237f4"
|
|
49
49
|
},
|
|
50
50
|
{
|
|
51
|
-
"iv": "
|
|
52
|
-
"encryptedData": "
|
|
51
|
+
"iv": "46dad3078c80081f5f855f2a6571cca9",
|
|
52
|
+
"encryptedData": "9033abad2bb2d845510ddff1a9ca0168"
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
|
-
"iv": "
|
|
56
|
-
"encryptedData": "
|
|
55
|
+
"iv": "af02c554aaa00b0b90f938d730085da0",
|
|
56
|
+
"encryptedData": "f08c72ee146cba26ff8078b66735a4f0384a1d334b86ee57fd790c139b7b635c"
|
|
57
57
|
},
|
|
58
58
|
{
|
|
59
|
-
"iv": "
|
|
60
|
-
"encryptedData": "
|
|
59
|
+
"iv": "65f61c9fc78dc39f5a44f636257808db",
|
|
60
|
+
"encryptedData": "5008546353f1f2683aab4b66c0314f02"
|
|
61
61
|
},
|
|
62
62
|
{
|
|
63
|
-
"iv": "
|
|
64
|
-
"encryptedData": "
|
|
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
|
]
|
package/package.json
CHANGED
|
@@ -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(
|
|
1486
|
-
} | ${
|
|
1487
|
-
server.getSoeClient(
|
|
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] -=
|
|
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] +=
|
|
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
|
|
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.
|
|
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(
|
|
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 >
|
|
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
|
-
|
|
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) +
|
|
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 >
|
|
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) +
|
|
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
|
-
},
|
|
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.
|
|
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.
|
|
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}`
|