hypixel-api-reborn 11.0.1 → 11.2.0
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/.prettierrc +13 -13
- package/LICENSE +20 -20
- package/README.md +67 -65
- package/package.json +20 -18
- package/src/API/getAPIStatus.js +1 -1
- package/src/API/getAchievements.js +6 -0
- package/src/API/getChallenges.js +6 -0
- package/src/API/getGuild.js +1 -1
- package/src/API/getGuildAchievements.js +6 -0
- package/src/API/getLeaderboards.js +3 -1
- package/src/API/getPlayer.js +1 -1
- package/src/API/getQuests.js +6 -0
- package/src/API/getRecentGames.js +1 -1
- package/src/API/getServerInfo.js +3 -1
- package/src/API/getStatus.js +1 -1
- package/src/API/index.js +28 -17
- package/src/API/skyblock/getAuction.js +19 -0
- package/src/API/skyblock/{getSkyblockAuctions.js → getAuctions.js} +6 -2
- package/src/API/skyblock/{getSkyblockAuctionsByPlayer.js → getAuctionsByPlayer.js} +1 -1
- package/src/API/skyblock/getBingo.js +8 -0
- package/src/API/skyblock/getBingoByPlayer.js +14 -0
- package/src/API/skyblock/getFireSales.js +7 -0
- package/src/API/skyblock/getGovernment.js +8 -0
- package/src/API/skyblock/{getSkyblockMember.js → getMember.js} +10 -6
- package/src/API/skyblock/getMuseum.js +14 -0
- package/src/API/skyblock/{getSkyblockProfiles.js → getProfiles.js} +14 -12
- package/src/Client.js +91 -17
- package/src/Errors.js +39 -17
- package/src/Private/rateLimit.js +10 -2
- package/src/Private/requests.js +20 -8
- package/src/Private/updater.js +10 -20
- package/src/Private/uuidCache.js +23 -29
- package/src/Private/validate.js +20 -9
- package/src/index.js +9 -0
- package/src/structures/APIIncident.js +3 -9
- package/src/structures/Boosters/Booster.js +5 -5
- package/src/structures/Color.js +93 -48
- package/src/structures/Game.js +3 -1
- package/src/structures/Guild/Guild.js +21 -17
- package/src/structures/Guild/GuildMember.js +6 -6
- package/src/structures/Guild/GuildRank.js +2 -2
- package/src/structures/MiniGames/Arcade.js +22 -17
- package/src/structures/MiniGames/BedWars.js +152 -24
- package/src/structures/MiniGames/Duels.js +84 -23
- package/src/structures/MiniGames/MegaWalls.js +3 -1
- package/src/structures/MiniGames/MurderMystery.js +2 -2
- package/src/structures/MiniGames/Pit.js +231 -2
- package/src/structures/MiniGames/PitInventoryItem.js +43 -0
- package/src/structures/MiniGames/SkyWars.js +19 -14
- package/src/structures/MiniGames/SmashHeroes.js +1 -1
- package/src/structures/MiniGames/TNTGames.js +1 -1
- package/src/structures/MiniGames/UHC.js +21 -3
- package/src/structures/MiniGames/WoolWars.js +1 -1
- package/src/structures/Player.js +16 -20
- package/src/structures/PlayerCosmetics.js +64 -10
- package/src/structures/ServerInfo.js +1 -1
- package/src/structures/SkyBlock/Auctions/Auction.js +3 -1
- package/src/structures/SkyBlock/Auctions/AuctionInfo.js +1 -0
- package/src/structures/SkyBlock/Auctions/BaseAuction.js +1 -0
- package/src/structures/SkyBlock/Auctions/Bid.js +1 -0
- package/src/structures/SkyBlock/Auctions/PartialAuction.js +1 -0
- package/src/structures/SkyBlock/PlayerBingo.js +56 -0
- package/src/structures/SkyBlock/SkyblockInventoryItem.js +86 -18
- package/src/structures/SkyBlock/SkyblockMember.js +252 -144
- package/src/structures/SkyBlock/SkyblockMuseum.js +60 -0
- package/src/structures/SkyBlock/SkyblockMuseumItem.js +54 -0
- package/src/structures/SkyBlock/SkyblockPet.js +1 -0
- package/src/structures/SkyBlock/SkyblockProfile.js +37 -23
- package/src/structures/SkyBlock/Static/Bingo.js +102 -0
- package/src/structures/SkyBlock/Static/BingoData.js +45 -0
- package/src/structures/SkyBlock/Static/Candidate.js +40 -0
- package/src/structures/SkyBlock/Static/FireSale.js +55 -0
- package/src/structures/SkyBlock/Static/Government.js +74 -0
- package/src/structures/SkyBlock/Static/Perk.js +24 -0
- package/src/structures/Static/Achievement.js +86 -0
- package/src/structures/Static/AchievementTier.js +33 -0
- package/src/structures/Static/Achievements.js +30 -0
- package/src/structures/Static/Challenges.js +29 -0
- package/src/structures/Static/GameAchievements.js +36 -0
- package/src/structures/Static/GameChallenges.js +40 -0
- package/src/structures/Static/GameQuests.js +24 -0
- package/src/structures/Static/GuildAchievements.js +34 -0
- package/src/structures/Static/Quest.js +66 -0
- package/src/structures/Static/Quests.js +31 -0
- package/src/structures/Status.js +2 -2
- package/src/utils/Constants.js +385 -42
- package/src/utils/SkyblockUtils.js +12 -7
- package/src/utils/guildExp.js +4 -1
- package/src/utils/removeSnakeCase.js +9 -2
- package/src/utils/romanize.js +32 -1
- package/src/utils/toIGN.js +6 -2
- package/src/utils/toUuid.js +10 -5
- package/typings/index.d.ts +989 -297
- /package/src/API/skyblock/{getSkyblockBazaar.js → getBazaar.js} +0 -0
- /package/src/API/skyblock/{getEndedSkyblockAuctions.js → getEndedAuctions.js} +0 -0
- /package/src/API/skyblock/{getSkyblockNews.js → getNews.js} +0 -0
|
@@ -6,6 +6,7 @@ const { duels_divisions } = require('../../utils/Constants');
|
|
|
6
6
|
|
|
7
7
|
// eslint-disable-next-line require-jsdoc
|
|
8
8
|
function getDivision(data, mode = null) {
|
|
9
|
+
// eslint-disable-next-line camelcase
|
|
9
10
|
for (const div of duels_divisions.slice().reverse()) {
|
|
10
11
|
const prestige = data[`${mode ? mode : 'all_modes'}_${div.key}_title_prestige`];
|
|
11
12
|
if (prestige) {
|
|
@@ -39,10 +40,10 @@ class Duels {
|
|
|
39
40
|
*/
|
|
40
41
|
constructor(data) {
|
|
41
42
|
/**
|
|
42
|
-
*
|
|
43
|
+
* Tokens
|
|
43
44
|
* @type {number}
|
|
44
45
|
*/
|
|
45
|
-
this.
|
|
46
|
+
this.tokens = data.coins || 0;
|
|
46
47
|
/**
|
|
47
48
|
* All modes division
|
|
48
49
|
* @type {string|null}
|
|
@@ -102,19 +103,51 @@ class Duels {
|
|
|
102
103
|
division: getDivision(data, 'uhc'),
|
|
103
104
|
winstreak: data.current_uhc_winstreak || 0,
|
|
104
105
|
bestWinstreak: data.best_uhc_winstreak || 0,
|
|
105
|
-
kills:
|
|
106
|
-
|
|
106
|
+
kills:
|
|
107
|
+
(data.uhc_duel_kills || 0) +
|
|
108
|
+
(data.uhc_doubles_kills || 0) +
|
|
109
|
+
(data.uhc_four_kills || 0) +
|
|
110
|
+
(data.uhc_meetup_kills || 0),
|
|
111
|
+
deaths:
|
|
112
|
+
(data.uhc_duel_deaths || 0) +
|
|
113
|
+
(data.uhc_doubles_deaths || 0) +
|
|
114
|
+
(data.uhc_four_deaths || 0) +
|
|
115
|
+
(data.uhc_meetup_deaths || 0),
|
|
107
116
|
KDRatio: divide(
|
|
108
|
-
(data.uhc_duel_kills || 0) +
|
|
109
|
-
|
|
117
|
+
(data.uhc_duel_kills || 0) +
|
|
118
|
+
(data.uhc_doubles_kills || 0) +
|
|
119
|
+
(data.uhc_four_kills || 0) +
|
|
120
|
+
(data.uhc_meetup_kills || 0),
|
|
121
|
+
(data.uhc_duel_deaths || 0) +
|
|
122
|
+
(data.uhc_doubles_deaths || 0) +
|
|
123
|
+
(data.uhc_four_deaths || 0) +
|
|
124
|
+
(data.uhc_meetup_deaths || 0)
|
|
110
125
|
),
|
|
111
|
-
wins:
|
|
112
|
-
|
|
126
|
+
wins:
|
|
127
|
+
(data.uhc_duel_wins || 0) +
|
|
128
|
+
(data.uhc_doubles_wins || 0) +
|
|
129
|
+
(data.uhc_four_wins || 0) +
|
|
130
|
+
(data.uhc_meetup_wins || 0),
|
|
131
|
+
losses:
|
|
132
|
+
(data.uhc_duel_losses || 0) +
|
|
133
|
+
(data.uhc_doubles_losses || 0) +
|
|
134
|
+
(data.uhc_four_losses || 0) +
|
|
135
|
+
(data.uhc_meetup_losses || 0),
|
|
113
136
|
WLRatio: divide(
|
|
114
|
-
(data.uhc_duel_wins || 0) +
|
|
115
|
-
|
|
137
|
+
(data.uhc_duel_wins || 0) +
|
|
138
|
+
(data.uhc_doubles_wins || 0) +
|
|
139
|
+
(data.uhc_four_wins || 0) +
|
|
140
|
+
(data.uhc_meetup_wins || 0),
|
|
141
|
+
(data.uhc_duel_losses || 0) +
|
|
142
|
+
(data.uhc_doubles_losses || 0) +
|
|
143
|
+
(data.uhc_four_losses || 0) +
|
|
144
|
+
(data.uhc_meetup_losses || 0)
|
|
116
145
|
),
|
|
117
|
-
playedGames:
|
|
146
|
+
playedGames:
|
|
147
|
+
(data.uhc_duel_rounds_played || 0) +
|
|
148
|
+
(data.uhc_doubles_rounds_played || 0) +
|
|
149
|
+
(data.uhc_four_rounds_played || 0) +
|
|
150
|
+
(data.uhc_meetup_rounds_played || 0)
|
|
118
151
|
},
|
|
119
152
|
'1v1': {
|
|
120
153
|
division: getDivision(data, 'uhc'),
|
|
@@ -242,10 +275,16 @@ class Duels {
|
|
|
242
275
|
bestWinstreak: data.best_op_winstreak || 0,
|
|
243
276
|
kills: (data.op_duel_kills || 0) + (data.op_doubles_kills || 0),
|
|
244
277
|
deaths: (data.op_duel_deaths || 0) + (data.op_doubles_deaths || 0),
|
|
245
|
-
KDRatio: divide(
|
|
278
|
+
KDRatio: divide(
|
|
279
|
+
(data.op_duel_kills || 0) + (data.op_doubles_kills || 0),
|
|
280
|
+
(data.op_duel_deaths || 0) + (data.op_doubles_deaths || 0)
|
|
281
|
+
),
|
|
246
282
|
wins: (data.op_duel_wins || 0) + (data.op_doubles_wins || 0),
|
|
247
283
|
losses: (data.op_duel_losses || 0) + (data.op_doubles_losses || 0),
|
|
248
|
-
WLRatio: divide(
|
|
284
|
+
WLRatio: divide(
|
|
285
|
+
(data.op_duel_wins || 0) + (data.op_doubles_wins || 0),
|
|
286
|
+
(data.op_duel_losses || 0) + (data.op_doubles_losses || 0)
|
|
287
|
+
),
|
|
249
288
|
playedGames: (data.op_duel_rounds_played || 0) + (data.op_doubles_rounds_played || 0)
|
|
250
289
|
},
|
|
251
290
|
'1v1': {
|
|
@@ -284,10 +323,16 @@ class Duels {
|
|
|
284
323
|
bestWinstreak: data.best_skywars_winstreak || 0,
|
|
285
324
|
kills: (data.sw_duel_kills || 0) + (data.sw_doubles_kills || 0),
|
|
286
325
|
deaths: (data.sw_duel_deaths || 0) + (data.sw_doubles_deaths || 0),
|
|
287
|
-
KDRatio: divide(
|
|
326
|
+
KDRatio: divide(
|
|
327
|
+
(data.sw_duel_kills || 0) + (data.sw_doubles_kills || 0),
|
|
328
|
+
(data.sw_duel_deaths || 0) + (data.sw_doubles_deaths || 0)
|
|
329
|
+
),
|
|
288
330
|
wins: (data.sw_duel_wins || 0) + (data.sw_doubles_wins || 0),
|
|
289
331
|
losses: (data.sw_duel_losses || 0) + (data.sw_doubles_losses || 0),
|
|
290
|
-
WLRatio: divide(
|
|
332
|
+
WLRatio: divide(
|
|
333
|
+
(data.sw_duel_wins || 0) + (data.sw_doubles_wins || 0),
|
|
334
|
+
(data.sw_duel_losses || 0) + (data.sw_doubles_losses || 0)
|
|
335
|
+
),
|
|
291
336
|
playedGames: (data.sw_duel_rounds_played || 0) + (data.sw_doubles_rounds_played || 0)
|
|
292
337
|
},
|
|
293
338
|
'1v1': {
|
|
@@ -443,7 +488,15 @@ class Duels {
|
|
|
443
488
|
(data.bridge_3v3v3v3_rounds_played || 0) +
|
|
444
489
|
(data.bridge_four_rounds_played || 0) +
|
|
445
490
|
(data.bridge_threes_bridge_rounds_played || 0) +
|
|
446
|
-
(data.capture_threes_rounds_played || 0)
|
|
491
|
+
(data.capture_threes_rounds_played || 0),
|
|
492
|
+
goals:
|
|
493
|
+
(data.bridge_duel_goals || 0) +
|
|
494
|
+
(data.bridge_doubles_goals || 0) +
|
|
495
|
+
(data.bridge_2v2v2v2_goals || 0) +
|
|
496
|
+
(data.bridge_3v3v3v3_goals || 0) +
|
|
497
|
+
(data.bridge_four_goals || 0) +
|
|
498
|
+
(data.bridge_threes_bridge_goals || 0) +
|
|
499
|
+
(data.capture_threes_goals || 0)
|
|
447
500
|
},
|
|
448
501
|
'1v1': {
|
|
449
502
|
division: getDivision(data, 'bridge'),
|
|
@@ -455,7 +508,8 @@ class Duels {
|
|
|
455
508
|
wins: data.bridge_duel_wins || 0,
|
|
456
509
|
losses: data.bridge_duel_losses || 0,
|
|
457
510
|
WLRatio: divide(data.bridge_duel_wins, data.bridge_duel_losses),
|
|
458
|
-
playedGames: data.bridge_duel_rounds_played || 0
|
|
511
|
+
playedGames: data.bridge_duel_rounds_played || 0,
|
|
512
|
+
goals: data.bridge_duel_goals || 0
|
|
459
513
|
},
|
|
460
514
|
'2v2': {
|
|
461
515
|
division: getDivision(data, 'bridge'),
|
|
@@ -467,7 +521,8 @@ class Duels {
|
|
|
467
521
|
wins: data.bridge_doubles_wins || 0,
|
|
468
522
|
losses: data.bridge_doubles_losses || 0,
|
|
469
523
|
WLRatio: divide(data.bridge_doubles_wins, data.bridge_doubles_losses),
|
|
470
|
-
playedGames: data.bridge_doubles_rounds_played || 0
|
|
524
|
+
playedGames: data.bridge_doubles_rounds_played || 0,
|
|
525
|
+
goals: data.bridge_doubles_goals || 0
|
|
471
526
|
},
|
|
472
527
|
'3v3': {
|
|
473
528
|
division: getDivision(data, 'bridge'),
|
|
@@ -479,7 +534,8 @@ class Duels {
|
|
|
479
534
|
wins: data.bridge_threes_wins || 0,
|
|
480
535
|
losses: data.bridge_threes_losses || 0,
|
|
481
536
|
WLRatio: divide(data.bridge_threes_wins, data.bridge_threes_losses),
|
|
482
|
-
playedGames: data.bridge_threes_rounds_played || 0
|
|
537
|
+
playedGames: data.bridge_threes_rounds_played || 0,
|
|
538
|
+
goals: data.bridge_threes_goals || 0
|
|
483
539
|
},
|
|
484
540
|
'2v2v2v2': {
|
|
485
541
|
division: getDivision(data, 'bridge'),
|
|
@@ -491,7 +547,8 @@ class Duels {
|
|
|
491
547
|
wins: data.bridge_2v2v2v2_wins || 0,
|
|
492
548
|
losses: data.bridge_2v2v2v2_losses || 0,
|
|
493
549
|
WLRatio: divide(data.bridge_2v2v2v2_wins, data.bridge_2v2v2v2_losses),
|
|
494
|
-
playedGames: data.bridge_2v2v2v2_rounds_played || 0
|
|
550
|
+
playedGames: data.bridge_2v2v2v2_rounds_played || 0,
|
|
551
|
+
goals: data.bridge_2v2v2v2_goals || 0
|
|
495
552
|
},
|
|
496
553
|
'3v3v3v3': {
|
|
497
554
|
division: getDivision(data, 'bridge'),
|
|
@@ -503,7 +560,8 @@ class Duels {
|
|
|
503
560
|
wins: data.bridge_3v3v3v3_wins || 0,
|
|
504
561
|
losses: data.bridge_3v3v3v3_losses || 0,
|
|
505
562
|
WLRatio: divide(data.bridge_3v3v3v3_wins, data.bridge_3v3v3v3_losses),
|
|
506
|
-
playedGames: data.bridge_3v3v3v3_rounds_played || 0
|
|
563
|
+
playedGames: data.bridge_3v3v3v3_rounds_played || 0,
|
|
564
|
+
goals: data.bridge_3v3v3v3_goals || 0
|
|
507
565
|
},
|
|
508
566
|
'4v4': {
|
|
509
567
|
division: getDivision(data, 'bridge'),
|
|
@@ -515,7 +573,8 @@ class Duels {
|
|
|
515
573
|
wins: data.bridge_four_wins || 0,
|
|
516
574
|
losses: data.bridge_four_losses || 0,
|
|
517
575
|
WLRatio: divide(data.bridge_four_wins, data.bridge_four_losses),
|
|
518
|
-
playedGames: data.bridge_four_rounds_played || 0
|
|
576
|
+
playedGames: data.bridge_four_rounds_played || 0,
|
|
577
|
+
goals: data.bridge_four_goals || 0
|
|
519
578
|
},
|
|
520
579
|
// eslint-disable-next-line quote-props
|
|
521
580
|
ctf: {
|
|
@@ -527,7 +586,8 @@ class Duels {
|
|
|
527
586
|
losses: data.capture_threes_losses || 0,
|
|
528
587
|
WLRatio: divide(data.capture_threes_wins, data.capture_threes_losses),
|
|
529
588
|
captures: data.capture_threes_captures || 0,
|
|
530
|
-
playedGames: data.capture_threes_rounds_played || 0
|
|
589
|
+
playedGames: data.capture_threes_rounds_played || 0,
|
|
590
|
+
goals: data.capture_threes_goals || 0
|
|
531
591
|
}
|
|
532
592
|
};
|
|
533
593
|
/**
|
|
@@ -605,6 +665,7 @@ class Duels {
|
|
|
605
665
|
* @property {number} KDRatio Kill/Death ratio
|
|
606
666
|
* @property {number} WLRatio Win/Loss ratio
|
|
607
667
|
* @property {number} playedGames Played games
|
|
668
|
+
* @property {number} goals Goals
|
|
608
669
|
*/
|
|
609
670
|
/**
|
|
610
671
|
* @typedef {object} DuelsBowspleef
|
|
@@ -66,7 +66,9 @@ class MegaWalls {
|
|
|
66
66
|
* Final deaths
|
|
67
67
|
* @type {number}
|
|
68
68
|
*/
|
|
69
|
-
this.finalDeaths = isNaN((data.final_deaths || 0) + (data.finalDeaths || 0))
|
|
69
|
+
this.finalDeaths = isNaN((data.final_deaths || 0) + (data.finalDeaths || 0))
|
|
70
|
+
? 0
|
|
71
|
+
: Math.floor((data.final_deaths || 0) + (data.finalDeaths || 0));
|
|
70
72
|
/**
|
|
71
73
|
* Final Kill Death ratio
|
|
72
74
|
* @type {number}
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
const { decode } = require('../../utils/SkyblockUtils');
|
|
2
|
+
const PitInventoryItem = require('./PitInventoryItem');
|
|
3
|
+
const { divide } = require('../../utils');
|
|
4
|
+
const {
|
|
5
|
+
pit: { Levels, Prestiges }
|
|
6
|
+
} = require('../../utils/Constants');
|
|
7
|
+
|
|
2
8
|
/**
|
|
3
9
|
* Pit Class
|
|
4
10
|
*/
|
|
@@ -8,12 +14,235 @@ class Pit {
|
|
|
8
14
|
* @param {Record<string,unknown>} data Data from API
|
|
9
15
|
*/
|
|
10
16
|
constructor(data) {
|
|
17
|
+
const stats = data.pit_stats_ptl || {};
|
|
18
|
+
/**
|
|
19
|
+
* Prestige
|
|
20
|
+
* @type {number}
|
|
21
|
+
*/
|
|
22
|
+
this.prestige = data.profile?.prestiges?.[data.profile?.prestiges?.length - 1].index || 0;
|
|
23
|
+
/**
|
|
24
|
+
* Xp
|
|
25
|
+
* @type {number}
|
|
26
|
+
*/
|
|
27
|
+
this.xp = data.profile?.xp || 0;
|
|
28
|
+
/**
|
|
29
|
+
* Level
|
|
30
|
+
* @type {number}
|
|
31
|
+
*/
|
|
32
|
+
this.level =
|
|
33
|
+
Pit.calcLevel(this.prestige, this.prestige > 0 ? this.xp - Prestiges[this.prestige - 1].SumXp : this.xp).level ??
|
|
34
|
+
0;
|
|
11
35
|
/**
|
|
12
36
|
* Kills
|
|
13
37
|
* @type {number}
|
|
14
38
|
*/
|
|
15
|
-
this.kills =
|
|
39
|
+
this.kills = stats.kills || 0;
|
|
40
|
+
/**
|
|
41
|
+
* Deaths
|
|
42
|
+
* @type {number}
|
|
43
|
+
*/
|
|
44
|
+
this.deaths = stats.deaths || 0;
|
|
45
|
+
/**
|
|
46
|
+
* KDR
|
|
47
|
+
* @type {number}
|
|
48
|
+
*/
|
|
49
|
+
this.KDRatio = divide(this.kills, this.deaths);
|
|
50
|
+
/**
|
|
51
|
+
* Assists
|
|
52
|
+
* @type {number}
|
|
53
|
+
*/
|
|
54
|
+
this.assists = stats.assists || 0;
|
|
55
|
+
/**
|
|
56
|
+
* Max kill streak
|
|
57
|
+
* @type {number}
|
|
58
|
+
*/
|
|
59
|
+
this.maxKillStreak = stats.max_streak || 0;
|
|
60
|
+
/**
|
|
61
|
+
* Playtime in SECONDS
|
|
62
|
+
* @type {number}
|
|
63
|
+
*/
|
|
64
|
+
this.playtime = (stats.playtime_minutes || 0) * 60;
|
|
65
|
+
/**
|
|
66
|
+
* Times the played joined Pit
|
|
67
|
+
* @type {number}
|
|
68
|
+
*/
|
|
69
|
+
this.joins = stats.joins || 0;
|
|
70
|
+
|
|
71
|
+
// Damage section (overall)
|
|
72
|
+
/**
|
|
73
|
+
* Damage received overall
|
|
74
|
+
* @type {number}
|
|
75
|
+
*/
|
|
76
|
+
this.damageReceived = stats.damage_received || 0;
|
|
77
|
+
/**
|
|
78
|
+
* Damage dealt overall
|
|
79
|
+
* @type {number}
|
|
80
|
+
*/
|
|
81
|
+
this.damageDealt = stats.damage_dealt || 0;
|
|
82
|
+
/**
|
|
83
|
+
* Damage dealt to damage received ratio
|
|
84
|
+
* @type {number}
|
|
85
|
+
*/
|
|
86
|
+
this.damageRatio = divide(this.damageDealt, this.damageReceived);
|
|
87
|
+
// Melee damage
|
|
88
|
+
/**
|
|
89
|
+
* Damage received in melee
|
|
90
|
+
* @type {number}
|
|
91
|
+
*/
|
|
92
|
+
this.meleeDamageReceived = stats.melee_damage_received || 0;
|
|
93
|
+
/**
|
|
94
|
+
* Damage dealt in melee
|
|
95
|
+
* @type {number}
|
|
96
|
+
*/
|
|
97
|
+
this.meleeDamageDealt = stats.melee_damage_dealt || 0;
|
|
98
|
+
/**
|
|
99
|
+
* Sword hits
|
|
100
|
+
* @type {number}
|
|
101
|
+
*/
|
|
102
|
+
this.swordHits = stats.sword_hits || 0;
|
|
103
|
+
/**
|
|
104
|
+
* Left Clicks (sword clicks, hit or miss)
|
|
105
|
+
* @type {number}
|
|
106
|
+
*/
|
|
107
|
+
this.leftClicks = stats.left_clicks || 0;
|
|
108
|
+
/**
|
|
109
|
+
* Hits divided by left clicks
|
|
110
|
+
* @type {number}
|
|
111
|
+
*/
|
|
112
|
+
this.meleeAccuracy = divide(this.swordHits, this.leftClicks);
|
|
113
|
+
/**
|
|
114
|
+
* Damage dealt to damage received ratio in melee
|
|
115
|
+
* @type {number}
|
|
116
|
+
*/
|
|
117
|
+
this.meleeDamageRatio = divide(this.meleeDamageDealt, this.meleeDamageReceived);
|
|
118
|
+
// Arrow damage
|
|
119
|
+
/**
|
|
120
|
+
* Damage received by arrow
|
|
121
|
+
* @type {number}
|
|
122
|
+
*/
|
|
123
|
+
this.bowDamageReceived = stats.bow_damage_received || 0;
|
|
124
|
+
/**
|
|
125
|
+
* Damage dealt with bow
|
|
126
|
+
* @type {number}
|
|
127
|
+
*/
|
|
128
|
+
this.bowDamageDealt = stats.bow_damage_dealt || 0;
|
|
129
|
+
/**
|
|
130
|
+
* Arrows hit
|
|
131
|
+
* @type {number}
|
|
132
|
+
*/
|
|
133
|
+
this.arrowsHit = stats.arrow_hits || 0;
|
|
134
|
+
/**
|
|
135
|
+
* Arrows fired (hit + missed)
|
|
136
|
+
* @type {number}
|
|
137
|
+
*/
|
|
138
|
+
this.arrowsFired = stats.arrows_fired || 0;
|
|
139
|
+
/**
|
|
140
|
+
* Hit divided by Fired
|
|
141
|
+
* @type {number}
|
|
142
|
+
*/
|
|
143
|
+
this.bowAccuracy = divide(this.arrowsHit, this.arrowsFired);
|
|
144
|
+
/**
|
|
145
|
+
* Damage dealt to damage received ratio in ranged (bow/arrow)
|
|
146
|
+
* @type {number}
|
|
147
|
+
*/
|
|
148
|
+
this.bowDamageRatio = divide(this.bowDamageDealt, this.bowDamageReceived);
|
|
149
|
+
/**
|
|
150
|
+
* Golden Heads eaten
|
|
151
|
+
* @type {number}
|
|
152
|
+
*/
|
|
153
|
+
this.goldenHeadsEaten = stats.ghead_eaten || 0;
|
|
154
|
+
/**
|
|
155
|
+
* Pit Player Inv
|
|
156
|
+
* @return {Promise<PitInventoryItem[]>}
|
|
157
|
+
*/
|
|
158
|
+
this.getInventory = async () => {
|
|
159
|
+
let inventory = data.profile.inv_contents;
|
|
160
|
+
if (!inventory) return [];
|
|
161
|
+
|
|
162
|
+
try {
|
|
163
|
+
inventory = await decode(inventory.data);
|
|
164
|
+
const edited = [];
|
|
165
|
+
for (let i = 1; i < inventory.length; i++) {
|
|
166
|
+
if (!inventory[i].id) {
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
edited.push(new PitInventoryItem(inventory[i]));
|
|
170
|
+
}
|
|
171
|
+
return edited;
|
|
172
|
+
} catch (e) {
|
|
173
|
+
return [];
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
/**
|
|
177
|
+
* Pit Player Ender Chest
|
|
178
|
+
* @return {Promise<PitInventoryItem[]>}
|
|
179
|
+
*/
|
|
180
|
+
this.getEnterChest = async () => {
|
|
181
|
+
let chest = data.profile.inv_enderchest;
|
|
182
|
+
if (!chest) return [];
|
|
183
|
+
|
|
184
|
+
try {
|
|
185
|
+
chest = await decode(chest.data);
|
|
186
|
+
const edited = [];
|
|
187
|
+
for (let i = 1; i < chest.length; i++) {
|
|
188
|
+
if (!chest[i].id) {
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
edited.push(new PitInventoryItem(chest[i]));
|
|
192
|
+
}
|
|
193
|
+
return edited;
|
|
194
|
+
} catch (e) {
|
|
195
|
+
return [];
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
/**
|
|
199
|
+
* Pit Player Armor
|
|
200
|
+
* @return {Promise<PitArmor>}
|
|
201
|
+
*/
|
|
202
|
+
this.getArmor = async () => {
|
|
203
|
+
const base64 = data.profile.inv_armor;
|
|
204
|
+
const decoded = await decode(base64.data);
|
|
205
|
+
const armor = {
|
|
206
|
+
helmet: decoded[3].id ? new PitInventoryItem(decoded[3]) : null,
|
|
207
|
+
chestplate: decoded[2].id ? new PitInventoryItem(decoded[2]) : null,
|
|
208
|
+
leggings: decoded[1].id ? new PitInventoryItem(decoded[1]) : null,
|
|
209
|
+
boots: decoded[0].id ? new PitInventoryItem(decoded[0]) : null
|
|
210
|
+
};
|
|
211
|
+
return armor;
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
// Credit https://github.com/PitPanda/PitPandaProduction/blob/b1971f56ea1aa8c829b722cbb33247c96591c0cb/structures/Pit.js
|
|
215
|
+
/**
|
|
216
|
+
* Converts XP to Level
|
|
217
|
+
* @param {number} prestige Prestige Level
|
|
218
|
+
* @param {number} xp Current xp into the prestige
|
|
219
|
+
* @return {number}
|
|
220
|
+
*/
|
|
221
|
+
static calcLevel(prestige, xp) {
|
|
222
|
+
const multiplier = Prestiges[prestige].Multiplier;
|
|
223
|
+
let level = 0;
|
|
224
|
+
while (xp > 0 && level < 120) {
|
|
225
|
+
const levelXp = Levels[Math.floor(level / 10)].Xp * multiplier;
|
|
226
|
+
if (xp >= levelXp * 10) {
|
|
227
|
+
xp -= levelXp * 10;
|
|
228
|
+
level += 10;
|
|
229
|
+
} else {
|
|
230
|
+
const gain = Math.floor(xp / levelXp);
|
|
231
|
+
level += gain;
|
|
232
|
+
xp -= gain * levelXp;
|
|
233
|
+
xp = 0;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return level;
|
|
16
237
|
}
|
|
17
238
|
}
|
|
18
239
|
|
|
240
|
+
/**
|
|
241
|
+
* @typedef {object} PitArmor Equipped armor
|
|
242
|
+
* @property {PitInventoryItem|null} helmet Helmet
|
|
243
|
+
* @property {PitInventoryItem|null} chestplate Chestplate
|
|
244
|
+
* @property {PitInventoryItem|null} leggings Leggings
|
|
245
|
+
* @property {PitInventoryItem|null} boots Boots
|
|
246
|
+
*/
|
|
247
|
+
|
|
19
248
|
module.exports = Pit;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Item class
|
|
3
|
+
*/
|
|
4
|
+
class PitInventoryItem {
|
|
5
|
+
/**
|
|
6
|
+
* @param {object} data Item data
|
|
7
|
+
*/
|
|
8
|
+
constructor(data) {
|
|
9
|
+
/**
|
|
10
|
+
* Item ID
|
|
11
|
+
* @type {number}
|
|
12
|
+
*/
|
|
13
|
+
this.itemId = data.id || 0;
|
|
14
|
+
/**
|
|
15
|
+
* Item count
|
|
16
|
+
* @type {number}
|
|
17
|
+
*/
|
|
18
|
+
this.count = data.Count || 0;
|
|
19
|
+
/**
|
|
20
|
+
* Item name
|
|
21
|
+
* @type {string|null}
|
|
22
|
+
*/
|
|
23
|
+
this.name = data?.tag?.display?.Name ? data.tag.display.Name.toString().replace(/§([1-9]|[a-f])|§/gm, '') : null;
|
|
24
|
+
/**
|
|
25
|
+
* Item lore
|
|
26
|
+
* @type {string|null}
|
|
27
|
+
*/
|
|
28
|
+
this.lore = data?.tag?.display?.Lore ? data.tag.display.Lore.join('\n') : null;
|
|
29
|
+
/**
|
|
30
|
+
* Item lore
|
|
31
|
+
* @type {string[]}
|
|
32
|
+
*/
|
|
33
|
+
this.loreArray = data?.tag?.display?.Lore ?? [];
|
|
34
|
+
/**
|
|
35
|
+
* Item Extra Attributes
|
|
36
|
+
* @type {object|null}
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
this.extraAttributes = data?.tag?.ExtraAttributes ?? null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
module.exports = PitInventoryItem;
|
|
@@ -59,16 +59,6 @@ class SkyWars {
|
|
|
59
59
|
* @type {number}
|
|
60
60
|
*/
|
|
61
61
|
this.wins = data.wins || 0;
|
|
62
|
-
/**
|
|
63
|
-
* Loot Chests
|
|
64
|
-
* @type {number}
|
|
65
|
-
*/
|
|
66
|
-
this.lootChests = data.skywars_chests || 0;
|
|
67
|
-
/**
|
|
68
|
-
* Opened Loot Chests
|
|
69
|
-
* @type {number}
|
|
70
|
-
*/
|
|
71
|
-
this.openedLootChests = data.SkyWars_openedChests || 0;
|
|
72
62
|
/**
|
|
73
63
|
* Heads
|
|
74
64
|
* @type {number}
|
|
@@ -113,7 +103,12 @@ class SkyWars {
|
|
|
113
103
|
* Games Played ( Total )
|
|
114
104
|
* @type {number}
|
|
115
105
|
*/
|
|
116
|
-
this.playedGames =
|
|
106
|
+
this.playedGames =
|
|
107
|
+
(data.games_solo || 0) +
|
|
108
|
+
(data.games_team || 0) +
|
|
109
|
+
(data.games_mega || 0) +
|
|
110
|
+
(data.games_mega_doubles || 0) +
|
|
111
|
+
(data.games_lab || 0);
|
|
117
112
|
/**
|
|
118
113
|
* Global Kill Death Ratio
|
|
119
114
|
* @type {number}
|
|
@@ -207,8 +202,14 @@ class SkyWars {
|
|
|
207
202
|
wins: (data.wins_mega || 0) + (data.wins_mega_doubles || 0),
|
|
208
203
|
losses: (data.losses_mega || 0) + (data.losses_mega_doubles || 0),
|
|
209
204
|
deaths: (data.deaths_mega || 0) + (data.deaths_mega_doubles || 0),
|
|
210
|
-
KDRatio: divide(
|
|
211
|
-
|
|
205
|
+
KDRatio: divide(
|
|
206
|
+
(data.kills_mega || 0) + (data.kills_mega_doubles || 0),
|
|
207
|
+
(data.deaths_mega || 0) + (data.deaths_mega_doubles || 0)
|
|
208
|
+
),
|
|
209
|
+
WLRatio: divide(
|
|
210
|
+
(data.wins_mega || 0) + (data.wins_mega_doubles || 0),
|
|
211
|
+
(data.losses_mega || 0) + (data.losses_mega_doubles || 0)
|
|
212
|
+
)
|
|
212
213
|
},
|
|
213
214
|
solo: {
|
|
214
215
|
playedGames: data.games_mega || 0,
|
|
@@ -333,7 +334,11 @@ module.exports = SkyWars;
|
|
|
333
334
|
// eslint-disable-next-line require-jsdoc
|
|
334
335
|
function getSkyWarsPrestige(level) {
|
|
335
336
|
if (level >= 60) return 'Mythic';
|
|
336
|
-
return
|
|
337
|
+
return (
|
|
338
|
+
['Iron', 'Iron', 'Gold', 'Diamond', 'Emerald', 'Sapphire', 'Ruby', 'Crystal', 'Opal', 'Amethyst', 'Rainbow'][
|
|
339
|
+
Math.floor(level / 5)
|
|
340
|
+
] || 'Iron'
|
|
341
|
+
);
|
|
337
342
|
}
|
|
338
343
|
// eslint-disable-next-line require-jsdoc
|
|
339
344
|
function getSkyWarsLevel(xp) {
|
|
@@ -67,7 +67,7 @@ class TNTGames {
|
|
|
67
67
|
*/
|
|
68
68
|
this.wizards = {
|
|
69
69
|
points: data.points_capture || 0,
|
|
70
|
-
class: data.capture_class
|
|
70
|
+
class: data.capture_class ?? null,
|
|
71
71
|
kills: data.kills_capture || 0,
|
|
72
72
|
assists: data.assists_capture || 0,
|
|
73
73
|
wins: data.wins_capture || 0,
|
|
@@ -52,7 +52,13 @@ class UHC {
|
|
|
52
52
|
* @type {number}
|
|
53
53
|
*/
|
|
54
54
|
this.wins =
|
|
55
|
-
(data.wins || 0) +
|
|
55
|
+
(data.wins || 0) +
|
|
56
|
+
(data.wins_solo || 0) +
|
|
57
|
+
(data['wins_red vs blue'] || 0) +
|
|
58
|
+
(data['wins_no diamonds'] || 0) +
|
|
59
|
+
(data.wins_brawl || 0) +
|
|
60
|
+
(data['wins_solo brawl'] || 0) +
|
|
61
|
+
(data['wins_duo brawl'] || 0);
|
|
56
62
|
/**
|
|
57
63
|
* Heads eaten
|
|
58
64
|
* @type {number}
|
|
@@ -145,9 +151,21 @@ class UHC {
|
|
|
145
151
|
// eslint-disable-next-line require-jsdoc
|
|
146
152
|
function getStarLevel(data) {
|
|
147
153
|
const kills =
|
|
148
|
-
(data.kills || 0) +
|
|
154
|
+
(data.kills || 0) +
|
|
155
|
+
(data.kills_solo || 0) +
|
|
156
|
+
(data['kills_red vs blue'] || 0) +
|
|
157
|
+
(data['kills_no diamonds'] || 0) +
|
|
158
|
+
(data.kills_brawl || 0) +
|
|
159
|
+
(data['kills_solo brawl'] || 0) +
|
|
160
|
+
(data['kills_duo brawl'] || 0);
|
|
149
161
|
const wins =
|
|
150
|
-
(data.wins || 0) +
|
|
162
|
+
(data.wins || 0) +
|
|
163
|
+
(data.wins_solo || 0) +
|
|
164
|
+
(data['wins_red vs blue'] || 0) +
|
|
165
|
+
(data['wins_no diamonds'] || 0) +
|
|
166
|
+
(data.wins_brawl || 0) +
|
|
167
|
+
(data['wins_solo brawl'] || 0) +
|
|
168
|
+
(data['wins_duo brawl'] || 0);
|
|
151
169
|
const sum = kills * 1 + wins * 10;
|
|
152
170
|
let starLevel = 1;
|
|
153
171
|
const sums = [0, 1, 6, 21, 46, 96, 171, 271, 521, 1021, 1321, 1621, 1921, 2221, 2521, Infinity];
|
|
@@ -83,7 +83,7 @@ class WoolWars {
|
|
|
83
83
|
*/
|
|
84
84
|
static generateStatsFor(data, _class) {
|
|
85
85
|
// N.B i called it _class instead of class because reserved keyword
|
|
86
|
-
const workingData = (_class ? data?.['classes'][_class] : data) || {};
|
|
86
|
+
const workingData = (_class ? data?.['classes']?.[_class] : data) || {};
|
|
87
87
|
return {
|
|
88
88
|
roundWins: workingData.wins || 0,
|
|
89
89
|
gamesPlayed: workingData.games_played || 0,
|