aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormat <27899617+mat-1@users.noreply.github.com>2021-06-02 16:04:59 -0500
committerGitHub <noreply@github.com>2021-06-02 16:04:59 -0500
commit709d428b4cb94e8eca53b6f32e0f8b1be5a323b9 (patch)
treee1581056d7d7ea9fa254184627c9cb71362cdc0f
parent732dfb76766533687982d7232078411af76bd2a9 (diff)
downloadskyblock-api-709d428b4cb94e8eca53b6f32e0f8b1be5a323b9.tar.gz
skyblock-api-709d428b4cb94e8eca53b6f32e0f8b1be5a323b9.tar.bz2
skyblock-api-709d428b4cb94e8eca53b6f32e0f8b1be5a323b9.zip
include more data about skills (#51)
-rw-r--r--build/cleaners/skyblock/member.js2
-rw-r--r--build/cleaners/skyblock/skills.js54
-rw-r--r--build/constants.js10
-rw-r--r--src/cleaners/skyblock/member.ts2
-rw-r--r--src/cleaners/skyblock/skills.ts66
-rw-r--r--src/constants.ts8
-rw-r--r--test-data-generator/index.ts13
-rw-r--r--test/data/constants/manual/skill_xp.json61
-rw-r--r--test/data/constants/manual/skill_xp_easier.json26
-rw-r--r--test/data/constants/minions.json1
-rw-r--r--test/data/constants/slayers.json1
-rw-r--r--test/data/constants/stats.json69
-rw-r--r--test/data/constants/values.json2
-rw-r--r--test/data/constants/zones.json1
-rw-r--r--test/data/player/6536bfed869548fd83a1ecd24cf2a0fd.json214
-rw-r--r--test/data/player/ef3bb867eec048a1a9b92b451f0ffc66.json645
-rw-r--r--test/data/skyblock/profiles/6536bfed869548fd83a1ecd24cf2a0fd.json626
-rw-r--r--test/data/skyblock/profiles/ef3bb867eec048a1a9b92b451f0ffc66.json1428
-rw-r--r--test/test.js27
19 files changed, 2121 insertions, 1135 deletions
diff --git a/build/cleaners/skyblock/member.js b/build/cleaners/skyblock/member.js
index a9a419a..8e72be8 100644
--- a/build/cleaners/skyblock/member.js
+++ b/build/cleaners/skyblock/member.js
@@ -68,7 +68,7 @@ async function cleanSkyBlockProfileMemberResponse(member, included = null) {
fairy_souls: fairySouls,
inventories: inventoriesIncluded ? await inventory_1.cleanInventories(member) : undefined,
objectives: objectives_1.cleanObjectives(member),
- skills: skills_1.cleanSkills(member),
+ skills: await skills_1.cleanSkills(member),
visited_zones: zones_1.cleanVisitedZones(member),
collections: collections_1.cleanCollections(member),
slayers: slayers_1.cleanSlayers(member)
diff --git a/build/cleaners/skyblock/skills.js b/build/cleaners/skyblock/skills.js
index 4ec5ec2..a761ec8 100644
--- a/build/cleaners/skyblock/skills.js
+++ b/build/cleaners/skyblock/skills.js
@@ -1,15 +1,61 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
-exports.cleanSkills = void 0;
-function cleanSkills(data) {
+exports.cleanSkills = exports.levelForSkillXp = void 0;
+const constants_1 = require("../../constants");
+// the highest level you can have in each skill
+// numbers taken from https://hypixel-skyblock.fandom.com/wiki/Skills
+// maybe these should be moved to skyblock-constants?
+const skillsMaxLevel = {
+ farming: 60,
+ mining: 60,
+ combat: 60,
+ foraging: 50,
+ fishing: 50,
+ enchanting: 60,
+ alchemy: 50,
+ taming: 50,
+ dungeoneering: 50,
+ carpentry: 50,
+ runecrafting: 25,
+ social: 25
+};
+// for skills that aren't in maxSkills, default to this
+const skillsDefaultMaxLevel = 50;
+/**
+ * Get the skill level for the amount of total xp
+ * @param xp The xp we're finding the level for
+ * @param easierLevel Whether it should use the alternate leveling xp table (used for cosmetic skills and dungeoneering)
+ */
+async function levelForSkillXp(xp, maxLevel) {
+ const xpTable = maxLevel <= 25 ? await constants_1.fetchSkillXpEasier() : await constants_1.fetchSkillXp();
+ const skillLevel = [...xpTable].reverse().findIndex(levelXp => xp >= levelXp);
+ return skillLevel === -1 ? 0 : xpTable.length - skillLevel;
+}
+exports.levelForSkillXp = levelForSkillXp;
+async function cleanSkills(data) {
+ var _a;
const skills = [];
for (const item in data) {
if (item.startsWith('experience_skill_')) {
const skillName = item.substr('experience_skill_'.length);
- const skillValue = data[item];
+ // the amount of total xp you have in this skill
+ const skillXp = data[item];
+ const skillMaxLevel = (_a = skillsMaxLevel[skillName]) !== null && _a !== void 0 ? _a : skillsDefaultMaxLevel;
+ const xpTable = skillMaxLevel <= 25 ? await constants_1.fetchSkillXpEasier() : await constants_1.fetchSkillXp();
+ // the level you're at for this skill
+ const skillLevel = await levelForSkillXp(skillXp, skillMaxLevel);
+ // the total xp required for the previous level
+ const previousLevelXp = skillLevel >= 1 ? xpTable[skillLevel - 1] : 0;
+ // the extra xp left over
+ const skillLevelXp = skillXp - previousLevelXp;
+ // the amount of extra xp required for this level
+ const skillLevelXpRequired = xpTable[skillLevel] - previousLevelXp;
skills.push({
name: skillName,
- xp: skillValue
+ xp: skillXp,
+ level: skillLevel,
+ levelXp: skillLevelXp,
+ levelXpRequired: skillLevelXpRequired
});
}
}
diff --git a/build/constants.js b/build/constants.js
index c620a32..22327c5 100644
--- a/build/constants.js
+++ b/build/constants.js
@@ -25,7 +25,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
-exports.setConstantValues = exports.fetchConstantValues = exports.addMinions = exports.fetchMinions = exports.addSlayers = exports.fetchSlayers = exports.addZones = exports.fetchZones = exports.addSkills = exports.fetchSkills = exports.addCollections = exports.fetchCollections = exports.addStats = exports.fetchStats = exports.addJSONConstants = exports.fetchJSONConstant = void 0;
+exports.setConstantValues = exports.fetchConstantValues = exports.addMinions = exports.fetchSkillXpEasier = exports.fetchSkillXp = exports.fetchMinions = exports.addSlayers = exports.fetchSlayers = exports.addZones = exports.fetchZones = exports.addSkills = exports.fetchSkills = exports.addCollections = exports.fetchCollections = exports.addStats = exports.fetchStats = exports.addJSONConstants = exports.fetchJSONConstant = void 0;
// we have to do this so we can mock the function from the tests properly
const constants = __importStar(require("./constants"));
const node_cache_1 = __importDefault(require("node-cache"));
@@ -223,6 +223,14 @@ async function fetchMinions() {
return await constants.fetchJSONConstant('minions.json');
}
exports.fetchMinions = fetchMinions;
+async function fetchSkillXp() {
+ return await constants.fetchJSONConstant('manual/skill_xp.json');
+}
+exports.fetchSkillXp = fetchSkillXp;
+async function fetchSkillXpEasier() {
+ return await constants.fetchJSONConstant('manual/skill_xp_easier.json');
+}
+exports.fetchSkillXpEasier = fetchSkillXpEasier;
/** Add skills to skyblock-constants. This has caching so it's fine to call many times */
async function addMinions(addingMinions) {
await constants.addJSONConstants('minions.json', addingMinions, 'minion');
diff --git a/src/cleaners/skyblock/member.ts b/src/cleaners/skyblock/member.ts
index 0ec2c0a..4a2f8cc 100644
--- a/src/cleaners/skyblock/member.ts
+++ b/src/cleaners/skyblock/member.ts
@@ -79,7 +79,7 @@ export async function cleanSkyBlockProfileMemberResponse(member, included: Inclu
fairy_souls: fairySouls,
inventories: inventoriesIncluded ? await cleanInventories(member) : undefined,
objectives: cleanObjectives(member),
- skills: cleanSkills(member),
+ skills: await cleanSkills(member),
visited_zones: cleanVisitedZones(member),
collections: cleanCollections(member),
slayers: cleanSlayers(member)
diff --git a/src/cleaners/skyblock/skills.ts b/src/cleaners/skyblock/skills.ts
index e283379..fa27217 100644
--- a/src/cleaners/skyblock/skills.ts
+++ b/src/cleaners/skyblock/skills.ts
@@ -1,17 +1,77 @@
+import { fetchSkillXp, fetchSkillXpEasier } from '../../constants'
+
export interface Skill {
name: string
xp: number
+ level: number
+
+ levelXp: number
+ levelXpRequired: number
+}
+
+// the highest level you can have in each skill
+// numbers taken from https://hypixel-skyblock.fandom.com/wiki/Skills
+// maybe these should be moved to skyblock-constants?
+const skillsMaxLevel: { [ key: string ]: number } = {
+ farming: 60,
+ mining: 60,
+ combat: 60,
+ foraging: 50,
+ fishing: 50,
+ enchanting: 60,
+ alchemy: 50,
+ taming: 50,
+ dungeoneering: 50,
+ carpentry: 50,
+ runecrafting: 25,
+ social: 25
}
-export function cleanSkills(data: any): Skill[] {
+// for skills that aren't in maxSkills, default to this
+const skillsDefaultMaxLevel: number = 50
+
+/**
+ * Get the skill level for the amount of total xp
+ * @param xp The xp we're finding the level for
+ * @param easierLevel Whether it should use the alternate leveling xp table (used for cosmetic skills and dungeoneering)
+ */
+export async function levelForSkillXp(xp: number, maxLevel: number) {
+ const xpTable = maxLevel <= 25 ? await fetchSkillXpEasier() : await fetchSkillXp()
+ const skillLevel = [...xpTable].reverse().findIndex(levelXp => xp >= levelXp)
+ return skillLevel === -1 ? 0 : xpTable.length - skillLevel
+}
+
+export async function cleanSkills(data: any): Promise<Skill[]> {
const skills: Skill[] = []
for (const item in data) {
if (item.startsWith('experience_skill_')) {
const skillName = item.substr('experience_skill_'.length)
- const skillValue = data[item]
+
+ // the amount of total xp you have in this skill
+ const skillXp = data[item]
+
+ const skillMaxLevel = skillsMaxLevel[skillName] ?? skillsDefaultMaxLevel
+
+ const xpTable = skillMaxLevel <= 25 ? await fetchSkillXpEasier() : await fetchSkillXp()
+
+ // the level you're at for this skill
+ const skillLevel = await levelForSkillXp(skillXp, skillMaxLevel)
+
+ // the total xp required for the previous level
+ const previousLevelXp = skillLevel >= 1 ? xpTable[skillLevel - 1] : 0
+
+ // the extra xp left over
+ const skillLevelXp = skillXp - previousLevelXp
+
+ // the amount of extra xp required for this level
+ const skillLevelXpRequired = xpTable[skillLevel] - previousLevelXp
+
skills.push({
name: skillName,
- xp: skillValue
+ xp: skillXp,
+ level: skillLevel,
+ levelXp: skillLevelXp,
+ levelXpRequired: skillLevelXpRequired
})
}
}
diff --git a/src/constants.ts b/src/constants.ts
index 48f9619..9699e57 100644
--- a/src/constants.ts
+++ b/src/constants.ts
@@ -227,6 +227,14 @@ export async function fetchMinions(): Promise<string[]> {
return await constants.fetchJSONConstant('minions.json')
}
+export async function fetchSkillXp(): Promise<number[]> {
+ return await constants.fetchJSONConstant('manual/skill_xp.json')
+}
+
+export async function fetchSkillXpEasier(): Promise<number[]> {
+ return await constants.fetchJSONConstant('manual/skill_xp_easier.json')
+}
+
/** Add skills to skyblock-constants. This has caching so it's fine to call many times */
export async function addMinions(addingMinions: string[]): Promise<void> {
await constants.addJSONConstants('minions.json', addingMinions, 'minion')
diff --git a/test-data-generator/index.ts b/test-data-generator/index.ts
index 408f76a..b0b3ba6 100644
--- a/test-data-generator/index.ts
+++ b/test-data-generator/index.ts
@@ -20,7 +20,7 @@ const playerUuids = [
async function writeTestData(requestPath: string, name: string, contents: any) {
const dir = path.join(__dirname, '..', 'test', 'data', requestPath)
- await fs.mkdir(dir, { recursive: true })
+ await fs.mkdir(path.dirname(path.join(dir, `${name}.json`)), { recursive: true })
await fs.writeFile(path.join(dir, `${name}.json`), JSON.stringify(contents, null, 2))
}
@@ -35,7 +35,16 @@ async function addResponse(requestPath: string, args: { [ key: string ]: string
async function addConstants() {
- const constantNames = ['collections', 'minions', 'skills', 'slayers', 'stats', 'zones']
+ const constantNames = [
+ 'collections',
+ 'minions',
+ 'skills',
+ 'slayers',
+ 'stats',
+ 'zones',
+ 'manual/skill_xp',
+ 'manual/skill_xp_easier',
+ ]
for (const constantName of constantNames) {
const constantData = await constants.fetchJSONConstant(constantName + '.json')
await writeTestData('constants', constantName, constantData)
diff --git a/test/data/constants/manual/skill_xp.json b/test/data/constants/manual/skill_xp.json
new file mode 100644
index 0000000..2aee873
--- /dev/null
+++ b/test/data/constants/manual/skill_xp.json
@@ -0,0 +1,61 @@
+[ 50,
+ 175,
+ 375,
+ 675,
+ 1175,
+ 1925,
+ 2925,
+ 4425,
+ 6425,
+ 9925,
+ 14925,
+ 22425,
+ 32425,
+ 47425,
+ 67425,
+ 97425,
+ 147425,
+ 222425,
+ 322425,
+ 522425,
+ 822425,
+ 1222425,
+ 1722425,
+ 2322425,
+ 3022425,
+ 3822425,
+ 4722425,
+ 5722425,
+ 6822425,
+ 8022425,
+ 9322425,
+ 10722425,
+ 12222425,
+ 13822425,
+ 15522425,
+ 17322425,
+ 19222425,
+ 21222425,
+ 23322425,
+ 25522425,
+ 27822425,
+ 30222425,
+ 32722425,
+ 35322425,
+ 38072425,
+ 40972425,
+ 44072425,
+ 47472425,
+ 51172425,
+ 55172425,
+ 59472425,
+ 64072425,
+ 68972425,
+ 74172425,
+ 79672425,
+ 85472425,
+ 91572425,
+ 97972425,
+ 104672425,
+ 111672425
+] \ No newline at end of file
diff --git a/test/data/constants/manual/skill_xp_easier.json b/test/data/constants/manual/skill_xp_easier.json
new file mode 100644
index 0000000..b1be10b
--- /dev/null
+++ b/test/data/constants/manual/skill_xp_easier.json
@@ -0,0 +1,26 @@
+[ 50,
+ 150,
+ 275,
+ 435,
+ 635,
+ 885,
+ 1200,
+ 1600,
+ 2100,
+ 2725,
+ 3510,
+ 4510,
+ 5760,
+ 7325,
+ 9325,
+ 11825,
+ 14950,
+ 18950,
+ 23950,
+ 30200,
+ 38050,
+ 47850,
+ 60100,
+ 75400,
+ 94450
+] \ No newline at end of file
diff --git a/test/data/constants/minions.json b/test/data/constants/minions.json
index 5291a34..a44cd62 100644
--- a/test/data/constants/minions.json
+++ b/test/data/constants/minions.json
@@ -50,6 +50,7 @@
"spruce",
"sugar_cane",
"tarantula",
+ "voidling",
"wheat",
"zombie"
] \ No newline at end of file
diff --git a/test/data/constants/slayers.json b/test/data/constants/slayers.json
index f9bc036..f7ba838 100644
--- a/test/data/constants/slayers.json
+++ b/test/data/constants/slayers.json
@@ -1,4 +1,5 @@
[
+ "enderman",
"spider",
"wolf",
"zombie"
diff --git a/test/data/constants/stats.json b/test/data/constants/stats.json
index 89685bd..0632eef 100644
--- a/test/data/constants/stats.json
+++ b/test/data/constants/stats.json
@@ -53,16 +53,22 @@
"deaths_crypt_souleater",
"deaths_crypt_tank_zombie",
"deaths_crypt_undead",
+ "deaths_crypt_undead_adamwho",
"deaths_crypt_undead_agentk",
"deaths_crypt_undead_alexander",
"deaths_crypt_undead_apunch",
+ "deaths_crypt_undead_bembo",
"deaths_crypt_undead_bernhard",
+ "deaths_crypt_undead_blockskey",
+ "deaths_crypt_undead_bloozing",
"deaths_crypt_undead_cecer",
"deaths_crypt_undead_chilynn",
"deaths_crypt_undead_christian",
"deaths_crypt_undead_codename_b",
"deaths_crypt_undead_connorlinfoot",
"deaths_crypt_undead_dctr",
+ "deaths_crypt_undead_donpireso",
+ "deaths_crypt_undead_dueces",
"deaths_crypt_undead_erosemberg",
"deaths_crypt_undead_externalizable",
"deaths_crypt_undead_flameboy101",
@@ -71,8 +77,10 @@
"deaths_crypt_undead_jamiethegeek",
"deaths_crypt_undead_jayavarmen",
"deaths_crypt_undead_judg3",
+ "deaths_crypt_undead_ladybleu",
"deaths_crypt_undead_likaos",
"deaths_crypt_undead_luckykessie",
+ "deaths_crypt_undead_magicboys",
"deaths_crypt_undead_marius",
"deaths_crypt_undead_minikloon",
"deaths_crypt_undead_nicholas",
@@ -84,7 +92,9 @@
"deaths_crypt_undead_relenter",
"deaths_crypt_undead_revengeee",
"deaths_crypt_undead_rezzus",
+ "deaths_crypt_undead_robitybobity",
"deaths_crypt_undead_sfarnham",
+ "deaths_crypt_undead_skyerzz",
"deaths_crypt_undead_sylent",
"deaths_crypt_undead_thorlon",
"deaths_crypt_undead_valentin",
@@ -128,10 +138,12 @@
"deaths_goblin_weakling_melee",
"deaths_great_white_shark",
"deaths_grim_reaper",
+ "deaths_grinch",
"deaths_guardian",
"deaths_guardian_defender",
"deaths_guardian_emperor",
"deaths_headless_horseman",
+ "deaths_horse",
"deaths_horseman_bat",
"deaths_horseman_horse",
"deaths_horseman_zombie",
@@ -161,29 +173,48 @@
"deaths_master_crypt_tank_zombie",
"deaths_master_crypt_undead",
"deaths_master_crypt_undead__fudgiethewhale",
+ "deaths_master_crypt_undead__onah",
"deaths_master_crypt_undead_adamwho",
"deaths_master_crypt_undead_agentk",
+ "deaths_master_crypt_undead_alexander",
"deaths_master_crypt_undead_apunch",
+ "deaths_master_crypt_undead_bernhard",
+ "deaths_master_crypt_undead_bloozing",
+ "deaths_master_crypt_undead_chilynn",
"deaths_master_crypt_undead_codename_b",
"deaths_master_crypt_undead_connorlinfoot",
"deaths_master_crypt_undead_dctr",
+ "deaths_master_crypt_undead_districtgecko",
"deaths_master_crypt_undead_donpireso",
+ "deaths_master_crypt_undead_dueces",
+ "deaths_master_crypt_undead_externalizable",
+ "deaths_master_crypt_undead_flameboy101",
+ "deaths_master_crypt_undead_friedrich",
"deaths_master_crypt_undead_hypixel",
"deaths_master_crypt_undead_jamiethegeek",
"deaths_master_crypt_undead_jayavarmen",
"deaths_master_crypt_undead_judg3",
+ "deaths_master_crypt_undead_ladybleu",
"deaths_master_crypt_undead_likaos",
+ "deaths_master_crypt_undead_magicboys",
"deaths_master_crypt_undead_minikloon",
+ "deaths_master_crypt_undead_mistresseldrid",
"deaths_master_crypt_undead_nicholas",
"deaths_master_crypt_undead_nitroholic_",
"deaths_master_crypt_undead_orangemarshall",
+ "deaths_master_crypt_undead_plancke",
"deaths_master_crypt_undead_plummel",
"deaths_master_crypt_undead_relenter",
+ "deaths_master_crypt_undead_revengeee",
"deaths_master_crypt_undead_rezzus",
"deaths_master_crypt_undead_sfarnham",
+ "deaths_master_crypt_undead_skyerzz",
+ "deaths_master_crypt_undead_sylent",
"deaths_master_crypt_undead_themgrf",
"deaths_master_crypt_undead_thorlon",
+ "deaths_master_crypt_undead_valentin",
"deaths_master_crypt_undead_vinny8ball666",
+ "deaths_master_crypt_undead_williamtiger",
"deaths_master_crypt_witherskeleton",
"deaths_master_deathmite",
"deaths_master_diamond_guy",
@@ -219,6 +250,7 @@
"deaths_master_skeletor_prime",
"deaths_master_sniper_skeleton",
"deaths_master_spirit_bat",
+ "deaths_master_spirit_bull",
"deaths_master_spirit_chicken",
"deaths_master_spirit_miniboss",
"deaths_master_spirit_rabbit",
@@ -265,6 +297,7 @@
"deaths_professor_priest_guardian",
"deaths_professor_warrior_guardian",
"deaths_protector_dragon",
+ "deaths_rabbit",
"deaths_random_slime",
"deaths_redstone_pigman",
"deaths_respawning_skeleton",
@@ -289,6 +322,8 @@
"deaths_sea_witch",
"deaths_shadow_assassin",
"deaths_sheep",
+ "deaths_shrine_charged_creeper",
+ "deaths_shrine_skeleton_horseman",
"deaths_siamese_lynx",
"deaths_silverfish",
"deaths_skeleton",
@@ -304,6 +339,7 @@
"deaths_snowman",
"deaths_soul_of_the_alpha",
"deaths_spider",
+ "deaths_spider_1",
"deaths_spider_jockey",
"deaths_spirit_bat",
"deaths_spirit_bull",
@@ -329,7 +365,10 @@
"deaths_unburried_zombie",
"deaths_unknown",
"deaths_unstable_dragon",
+ "deaths_vicious_wolf",
"deaths_void",
+ "deaths_voidling_extremist",
+ "deaths_voidling_fanatic",
"deaths_voracious_spider",
"deaths_watcher",
"deaths_watcher_bonzo",
@@ -365,6 +404,7 @@
"deaths_zombie_lord",
"deaths_zombie_soldier",
"deaths_zombie_villager",
+ "deaths_lost_adventure",
"dungeon_hub_crystal_core_anything_no_return_best_time",
"dungeon_hub_crystal_core_anything_with_return_best_time",
"dungeon_hub_crystal_core_no_abilities_no_return_best_time",
@@ -538,24 +578,48 @@
"kills_master_crypt_souleater",
"kills_master_crypt_tank_zombie",
"kills_master_crypt_undead",
+ "kills_master_crypt_undead__onah",
+ "kills_master_crypt_undead_agentk",
"kills_master_crypt_undead_alexander",
+ "kills_master_crypt_undead_apunch",
+ "kills_master_crypt_undead_bembo",
"kills_master_crypt_undead_bernhard",
"kills_master_crypt_undead_bloozing",
+ "kills_master_crypt_undead_cecer",
"kills_master_crypt_undead_chilynn",
"kills_master_crypt_undead_christian",
+ "kills_master_crypt_undead_codename_b",
+ "kills_master_crypt_undead_connorlinfoot",
"kills_master_crypt_undead_dctr",
"kills_master_crypt_undead_donpireso",
+ "kills_master_crypt_undead_dueces",
+ "kills_master_crypt_undead_externalizable",
"kills_master_crypt_undead_flameboy101",
"kills_master_crypt_undead_friedrich",
"kills_master_crypt_undead_hypixel",
+ "kills_master_crypt_undead_jamiethegeek",
+ "kills_master_crypt_undead_jayavarmen",
"kills_master_crypt_undead_judg3",
+ "kills_master_crypt_undead_ladybleu",
+ "kills_master_crypt_undead_likaos",
+ "kills_master_crypt_undead_magicboys",
"kills_master_crypt_undead_marius",
+ "kills_master_crypt_undead_minikloon",
"kills_master_crypt_undead_nicholas",
"kills_master_crypt_undead_nitroholic_",
+ "kills_master_crypt_undead_orangemarshall",
"kills_master_crypt_undead_pieter",
+ "kills_master_crypt_undead_plancke",
+ "kills_master_crypt_undead_relenter",
+ "kills_master_crypt_undead_revengeee",
+ "kills_master_crypt_undead_rezzus",
"kills_master_crypt_undead_sfarnham",
"kills_master_crypt_undead_skyerzz",
+ "kills_master_crypt_undead_sylent",
+ "kills_master_crypt_undead_themgrf",
+ "kills_master_crypt_undead_thorlon",
"kills_master_crypt_undead_valentin",
+ "kills_master_crypt_undead_williamtiger",
"kills_master_crypt_witherskeleton",
"kills_master_deathmite",
"kills_master_diamond_guy",
@@ -658,6 +722,8 @@
"kills_sea_witch",
"kills_shadow_assassin",
"kills_sheep",
+ "kills_shrine_charged_creeper",
+ "kills_shrine_skeleton_horseman",
"kills_siamese_lynx",
"kills_silverfish",
"kills_skeleton",
@@ -700,6 +766,9 @@
"kills_unburried_zombie",
"kills_unstable_dragon",
"kills_vicious_wolf",
+ "kills_voidling_enderman",
+ "kills_voidling_extremist",
+ "kills_voidling_fanatic",
"kills_voracious_spider",
"kills_watcher",
"kills_watcher_bonzo",
diff --git a/test/data/constants/values.json b/test/data/constants/values.json
index a7aed8e..4b2a608 100644
--- a/test/data/constants/values.json
+++ b/test/data/constants/values.json
@@ -1,4 +1,4 @@
{
- "max_minions": 609,
+ "max_minions": 613,
"max_fairy_souls": 227
} \ No newline at end of file
diff --git a/test/data/constants/zones.json b/test/data/constants/zones.json
index 9c34487..9943fc4 100644
--- a/test/data/constants/zones.json
+++ b/test/data/constants/zones.json
@@ -87,6 +87,7 @@
"treasure_hunter_camp",
"upper_mines",
"village",
+ "void_sepulture",
"wilderness",
"windmill",
"winter_island",
diff --git a/test/data/player/6536bfed869548fd83a1ecd24cf2a0fd.json b/test/data/player/6536bfed869548fd83a1ecd24cf2a0fd.json
index 9bd0611..4c5ad19 100644
--- a/test/data/player/6536bfed869548fd83a1ecd24cf2a0fd.json
+++ b/test/data/player/6536bfed869548fd83a1ecd24cf2a0fd.json
@@ -274,7 +274,8 @@
"skyblock_fully_evolved",
"tntgames_spleef_repulsor",
"pit_get_endless_quiver_arrows",
- "pit_small_streak"
+ "pit_small_streak",
+ "skyblock_bigger_storage_is_seeded"
],
"displayname": "py5",
"firstLogin": 1424644924085,
@@ -288,12 +289,12 @@
"py5",
"b3abus"
],
- "lastLogin": 1620001797684,
- "networkExp": 14303970,
+ "lastLogin": 1622501301452,
+ "networkExp": 14449927,
"playername": "py5",
"stats": {
"Arcade": {
- "coins": 2113250,
+ "coins": 2122258,
"deaths_throw_out": 13,
"kills_throw_out": 10,
"music": true,
@@ -396,10 +397,10 @@
"legacyachievement10",
"legacyachievement9"
],
- "coins": 162465
+ "coins": 166325
},
"TNTGames": {
- "coins": 66894,
+ "coins": 70584,
"deaths_bowspleef": 15,
"tags_bowspleef": 271,
"new_spleef_repulsor": 1,
@@ -487,7 +488,7 @@
"shoes_active": "GOLD_SHOES",
"jacket_active": "GOLD_JACKET",
"pants_active": "GOLD_PANTS",
- "coins": 66890,
+ "coins": 70395,
"lastTourneyAd": 1596934457455
},
"SkyWars": {
@@ -569,7 +570,7 @@
"losses_kit_basic_solo_default": 59,
"deaths_team_insane": 23,
"survived_players_kit_mining_team_default": 91,
- "coins": 599383,
+ "coins": 603673,
"survived_players_team": 235,
"losses_team_insane": 22,
"losses_kit_mining_team_default": 8,
@@ -1170,7 +1171,7 @@
"melee_kills_lab_kit_mining_team_default": 2
},
"MCGO": {
- "coins": 172085,
+ "coins": 176555,
"packages": [
"legacyachievementnewnewnew",
"achievement_flag_3",
@@ -1205,7 +1206,7 @@
"achievement_flag_3"
],
"kills": 249,
- "coins": 73327,
+ "coins": 76832,
"monthly_kills_b": 110,
"weekly_kills_b": 225,
"deaths": 183,
@@ -1248,7 +1249,7 @@
"achievement_flag_1",
"achievement_flag_2"
],
- "coins": 70402,
+ "coins": 73907,
"favorite_slots": "null,null,null",
"showKillPrefix": true,
"kills": 38,
@@ -1261,7 +1262,7 @@
"updated_stats": true,
"human_deaths": 7,
"zombie_kills": 22,
- "coins": 69174,
+ "coins": 72679,
"vampire_deaths": 20,
"votes_Cavern": 3,
"vampire_kills": 13,
@@ -1657,7 +1658,7 @@
"entity_explosion_final_kills_bedwars": 1
},
"HungerGames": {
- "coins": 119759,
+ "coins": 123789,
"packages": [
"fixachievements2",
"fixachievements1",
@@ -1703,7 +1704,7 @@
"autoarmor": true
},
"Walls": {
- "coins": 71890,
+ "coins": 75395,
"monthly_assists_a": 2,
"assists": 2,
"weekly_assists_a": 1,
@@ -1712,10 +1713,10 @@
"weekly_assists_b": 1
},
"Arena": {
- "coins": 66890
+ "coins": 70395
},
"Walls3": {
- "coins": 69430,
+ "coins": 72950,
"packages": [
"achievement_fix_flag",
"legacy_achievement_a"
@@ -1805,13 +1806,13 @@
"phoenix_wins": 1
},
"UHC": {
- "coins": 60126,
+ "coins": 63301,
"clearup_achievement": true,
"saved_stats": true,
"deaths": 1
},
"SuperSmash": {
- "coins": 113810,
+ "coins": 117850,
"lastLevel_THE_BULK": 0,
"active_class": "THE_BULK",
"win_streak": 0,
@@ -1867,7 +1868,7 @@
]
},
"SpeedUHC": {
- "coins": 203305,
+ "coins": 206600,
"firstJoinLobbyInt": 3,
"killstreak": 0,
"win_streak": 0,
@@ -2475,7 +2476,7 @@
"Duels": {
"kit_menu_option": "off",
"sw_duels_kit": "kit_ranked_ranked_champion",
- "games_played_duels": 16774,
+ "games_played_duels": 16801,
"show_lb_option": "on",
"rematch_option_1": "default",
"duels_recently_played": "BRIDGE_DUEL#SUMO_DUEL#BRIDGE_DUEL",
@@ -2492,17 +2493,17 @@
"duels_winstreak_best_op_duel": 14,
"duels_winstreak_best_combo_duel": 6,
"duels_winstreak_best_classic_duel": 18,
- "melee_swings": 321294,
- "losses": 5354,
- "melee_hits": 113417,
- "rounds_played": 13033,
+ "melee_swings": 322031,
+ "losses": 5366,
+ "melee_hits": 113648,
+ "rounds_played": 13060,
"sw_duel_health_regenerated": 6475,
"sw_duel_losses": 781,
- "deaths": 7425,
+ "deaths": 7435,
"sw_duel_damage_dealt": 16893,
- "health_regenerated": 38179,
+ "health_regenerated": 38180,
"sw_duel_rounds_played": 2035,
- "damage_dealt": 166764,
+ "damage_dealt": 166773,
"sw_duel_deaths": 782,
"sw_duel_melee_hits": 7860,
"sw_duel_melee_swings": 23838,
@@ -2514,19 +2515,19 @@
"combo_duel_deaths": 30,
"combo_duel_melee_swings": 15388,
"combo_duel_wins": 32,
- "wins": 6674,
- "kills": 6071,
+ "wins": 6689,
+ "kills": 6086,
"combo_duel_kills": 26,
- "classic_duel_rounds_played": 7554,
- "classic_duel_melee_hits": 62256,
- "classic_duel_health_regenerated": 14787,
- "classic_duel_damage_dealt": 120525,
- "classic_duel_melee_swings": 171816,
+ "classic_duel_rounds_played": 7555,
+ "classic_duel_melee_hits": 62262,
+ "classic_duel_health_regenerated": 14788,
+ "classic_duel_damage_dealt": 120534,
+ "classic_duel_melee_swings": 171826,
"classic_duel_wins": 4204,
- "bow_shots": 21561,
- "classic_duel_losses": 3176,
- "classic_duel_bow_shots": 18254,
- "classic_duel_deaths": 3176,
+ "bow_shots": 21564,
+ "classic_duel_losses": 3177,
+ "classic_duel_bow_shots": 18257,
+ "classic_duel_deaths": 3177,
"bow_hits": 8914,
"classic_duel_bow_hits": 7928,
"classic_duel_kills": 4176,
@@ -2607,24 +2608,24 @@
},
"current_bow_winstreak": 0,
"best_bow_winstreak": 1,
- "coins": 451678,
+ "coins": 458208,
"bow_duel_wins": 1,
"bow_duel_kills": 1,
- "current_sumo_winstreak": 4,
- "sumo_duel_losses": 759,
- "sumo_duel_melee_swings": 64266,
- "sumo_duel_rounds_played": 1919,
- "sumo_duel_melee_hits": 20398,
- "sumo_duel_deaths": 689,
+ "current_sumo_winstreak": 0,
+ "sumo_duel_losses": 770,
+ "sumo_duel_melee_swings": 64993,
+ "sumo_duel_rounds_played": 1945,
+ "sumo_duel_melee_hits": 20623,
+ "sumo_duel_deaths": 698,
"best_sumo_winstreak": 18,
- "sumo_duel_wins": 849,
+ "sumo_duel_wins": 864,</