From cb06002780bce1b3c8f178c7024c1f52f2c17197 Mon Sep 17 00:00:00 2001 From: Jacob Date: Thu, 29 Aug 2024 18:57:18 +0800 Subject: [PATCH] NEU --- src/Client.ts | 4 + src/Private/NEU-REPO.ts | 141 ++++ src/Private/Requests.ts | 48 +- src/Private/Updater.ts | 2 +- src/utils/Constants.ts | 1281 ------------------------------------ src/utils/SkyblockUtils.ts | 5 +- src/utils/decolorize.ts | 3 + 7 files changed, 198 insertions(+), 1286 deletions(-) create mode 100644 src/Private/NEU-REPO.ts create mode 100644 src/utils/decolorize.ts diff --git a/src/Client.ts b/src/Client.ts index 8714cbb..9a9a294 100644 --- a/src/Client.ts +++ b/src/Client.ts @@ -5,6 +5,7 @@ import Requests from './Private/Requests'; import Updater from './Private/Updater'; import Errors from './Errors'; import API from './API'; +import NEURepo from './Private/NEU-REPO'; const clients: Client[] = []; @@ -15,8 +16,10 @@ class Client { declare updater: Updater; declare errors: Errors; declare rateLimit: RateLimit; + declare NEU: NEURepo; readonly key: string; declare interval: NodeJS.Timeout; + constructor(key: string, options?: ClientOptions) { this.key = key; this.errors = new Errors(); @@ -27,6 +30,7 @@ class Client { this.updater = new Updater(this); this.rateLimit = new RateLimit(this); if ('NONE' !== this.options.rateLimit) this.rateLimit.initialize(); + this.NEU = new NEURepo(this); for (const func in API) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error diff --git a/src/Private/NEU-REPO.ts b/src/Private/NEU-REPO.ts new file mode 100644 index 0000000..7bd39a3 --- /dev/null +++ b/src/Private/NEU-REPO.ts @@ -0,0 +1,141 @@ +/* eslint-disable camelcase */ +import { decolorizeString } from '../utils/decolorize'; +import Client from '../Client'; + +export interface NEUBestiaryData { + brackets: { [key: number]: number[] }; + dynamic: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] }; + hub: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] }; + farming_1: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] }; + combat_1: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] }; + combat_3: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] }; + crimson_isle: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] }; + mining_2: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] }; + mining_3: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] }; + crystal_hollows: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] }; + foraging_1: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] }; + spooky_festival: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] }; + mythological_creatures: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] }; + jerry: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] }; + kuudra: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] }; + catacombs: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] }; + garden: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] }; +} + +class NEURepo { + readonly client: Client; + constructor(client: Client) { + this.client = client; + } + + async getBestiary(): Promise { + const res = await this.client.requests.fetchExternalData( + 'https://raw.githubusercontent.com/NotEnoughUpdates/NotEnoughUpdates-REPO/master/constants/bestiary.json' + ); + const data: NEUBestiaryData = { + brackets: {}, + dynamic: { name: 'Private Island', mobs: [] }, + hub: { name: 'Hub', mobs: [] }, + farming_1: { name: 'The Farming Islands', mobs: [] }, + combat_1: { name: 'Spiders Den', mobs: [] }, + combat_3: { name: 'The End', mobs: [] }, + crimson_isle: { name: 'Crimson Isle', mobs: [] }, + mining_2: { name: 'Deep Caverns', mobs: [] }, + mining_3: { name: 'Dwarven Mines', mobs: [] }, + crystal_hollows: { name: 'Crystal Hollows', mobs: [] }, + foraging_1: { name: 'The Park', mobs: [] }, + spooky_festival: { name: 'Spooky Festival', mobs: [] }, + mythological_creatures: { name: 'Mythological Creatures', mobs: [] }, + jerry: { name: 'Jerry', mobs: [] }, + kuudra: { name: 'Kuudra', mobs: [] }, + catacombs: { name: 'Catacombs', mobs: [] }, + garden: { name: 'Garden', mobs: [] } + }; + Object.keys(res.data.brackets).forEach((key) => { + data.brackets[Number(key)] = res.data.brackets[key]; + }); + res.data.dynamic.mobs.forEach((mob: string | number) => { + const mobInfo = res.data.dynamic.mobs[mob]; + mobInfo.name = decolorizeString(mobInfo.name); + data.dynamic.mobs.push(mobInfo); + }); + res.data.hub.mobs.forEach((mob: string | number) => { + const mobInfo = res.data.hub.mobs[mob]; + mobInfo.name = decolorizeString(mobInfo.name); + data.hub.mobs.push(mobInfo); + }); + res.data.farming_1.mobs.forEach((mob: string | number) => { + const mobInfo = res.data.farming_1.mobs[mob]; + mobInfo.name = decolorizeString(mobInfo.name); + data.farming_1.mobs.push(mobInfo); + }); + res.data.combat_1.mobs.forEach((mob: string | number) => { + const mobInfo = res.data.combat_1.mobs[mob]; + mobInfo.name = decolorizeString(mobInfo.name); + data.combat_1.mobs.push(mobInfo); + }); + res.data.combat_3.mobs.forEach((mob: string | number) => { + const mobInfo = res.data.combat_3.mobs[mob]; + mobInfo.name = decolorizeString(mobInfo.name); + data.combat_3.mobs.push(mobInfo); + }); + res.data.crimson_isle.mobs.forEach((mob: string | number) => { + const mobInfo = res.data.crimson_isle.mobs[mob]; + mobInfo.name = decolorizeString(mobInfo.name); + data.crimson_isle.mobs.push(mobInfo); + }); + res.data.mining_2.mobs.forEach((mob: string | number) => { + const mobInfo = res.data.mining_2.mobs[mob]; + mobInfo.name = decolorizeString(mobInfo.name); + data.mining_2.mobs.push(mobInfo); + }); + res.data.mining_3.mobs.forEach((mob: string | number) => { + const mobInfo = res.data.mining_3.mobs[mob]; + mobInfo.name = decolorizeString(mobInfo.name); + data.mining_3.mobs.push(mobInfo); + }); + res.data.crystal_hollows.mobs.forEach((mob: string | number) => { + const mobInfo = res.data.crystal_hollows.mobs[mob]; + mobInfo.name = decolorizeString(mobInfo.name); + data.crystal_hollows.mobs.push(mobInfo); + }); + res.data.foraging_1.mobs.forEach((mob: string | number) => { + const mobInfo = res.data.foraging_1.mobs[mob]; + mobInfo.name = decolorizeString(mobInfo.name); + data.foraging_1.mobs.push(mobInfo); + }); + res.data.spooky_festival.mobs.forEach((mob: string | number) => { + const mobInfo = res.data.spooky_festival.mobs[mob]; + mobInfo.name = decolorizeString(mobInfo.name); + data.spooky_festival.mobs.push(mobInfo); + }); + res.data.mythological_creatures.mobs.forEach((mob: string | number) => { + const mobInfo = res.data.mythological_creatures.mobs[mob]; + mobInfo.name = decolorizeString(mobInfo.name); + data.mythological_creatures.mobs.push(mobInfo); + }); + res.data.jerry.mobs.forEach((mob: string | number) => { + const mobInfo = res.data.jerry.mobs[mob]; + mobInfo.name = decolorizeString(mobInfo.name); + data.jerry.mobs.push(mobInfo); + }); + res.data.kuudra.mobs.forEach((mob: string | number) => { + const mobInfo = res.data.kuudra.mobs[mob]; + mobInfo.name = decolorizeString(mobInfo.name); + data.kuudra.mobs.push(mobInfo); + }); + res.data.catacombs.mobs.forEach((mob: string | number) => { + const mobInfo = res.data.catacombs.mobs[mob]; + mobInfo.name = decolorizeString(mobInfo.name); + data.catacombs.mobs.push(mobInfo); + }); + res.data.garden.mobs.forEach((mob: string | number) => { + const mobInfo = res.data.garden.mobs[mob]; + mobInfo.name = decolorizeString(mobInfo.name); + data.garden.mobs.push(mobInfo); + }); + return data; + } +} + +export default NEURepo; diff --git a/src/Private/Requests.ts b/src/Private/Requests.ts index 5a588d6..3dac845 100644 --- a/src/Private/Requests.ts +++ b/src/Private/Requests.ts @@ -1,4 +1,4 @@ -const BASE_URL = 'https://api.hypixel.net/v2'; +const BASE_URL = 'http://localhost:3000/hypixel/v2'; import isUUID from '../utils/isUUID'; import Client from '../Client'; import axios from 'axios'; @@ -93,7 +93,7 @@ class Requests { if (!input) throw new Error(this.client.errors.NO_NICKNAME_UUID); if ('string' !== typeof input) throw new Error(this.client.errors.UUID_NICKNAME_MUST_BE_A_STRING); if (isUUID(input)) return input.replace(/-/g, ''); - const url = `https://mowojang.matdoes.dev/${input}`; + const url = `http://localhost:3000/uuid/${input}`; if (this.client.cacheHandler.has(url)) { return this.client.cacheHandler.get(url); } @@ -123,6 +123,50 @@ class Requests { } return parsedRes.id; } + + async fetchExternalData(url: string, options?: RequestOptions): Promise { + options = { raw: options?.raw ?? false, noCache: options?.noCache ?? false }; + if (this.client.cacheHandler.has(url)) { + const data = this.client.cacheHandler.get(url); + return new RequestData(data.data, data.headers, { + status: 200, + options, + url: url, + cached: true, + timestamp: data.timestamp + }); + } + const res = await axios.get(url); + if (500 <= res.status && 528 > res.status) { + throw new Error( + this.client.errors.ERROR_STATUSTEXT.replace(/{statustext}/, `Server Error : ${res.status} ${res.statusText}`) + ); + } + const parsedRes = await res.data; + if (400 === res.status) { + throw new Error( + this.client.errors.ERROR_CODE_CAUSE.replace(/{code}/, '400 Bad Request').replace( + /{cause}/, + parsedRes.cause || '' + ) + ); + } + if (422 === res.status) throw new Error(this.client.errors.UNEXPECTED_ERROR); + if (200 !== res.status) { + throw new Error(this.client.errors.ERROR_STATUSTEXT.replace(/{statustext}/, res.statusText)); + } + const requestData = new RequestData(parsedRes, res.headers, { + status: res.status, + options, + url: url, + cached: false + }); + if (options.noCache) return requestData; + if (this.client.options.cache && !options.raw) { + this.client.cacheHandler.set(url, requestData); + } + return requestData; + } } export default Requests; diff --git a/src/Private/Updater.ts b/src/Private/Updater.ts index 971028d..8549c18 100644 --- a/src/Private/Updater.ts +++ b/src/Private/Updater.ts @@ -26,7 +26,7 @@ class Updater { } async getLatestVersion(): Promise { - const request = await axios.get('https://registry.npmjs.org/hypixel-api-reborn'); + const request = await axios.get('https://localhost:3000/npm/hypixel-api-reborn'); if (200 !== request.status) throw new Error(this.client.errors.UPDATER_REQUEST_NOT_OK); return request.data['dist-tags'].latest; } diff --git a/src/utils/Constants.ts b/src/utils/Constants.ts index ec44a50..47aef4a 100644 --- a/src/utils/Constants.ts +++ b/src/utils/Constants.ts @@ -839,1287 +839,6 @@ export default { { name: 'Tournament Lobby', code: 'TOURNAMENT_LOBBY', id: -5 }, { name: 'Idle', code: 'IDLE', id: -6 } ], - /* eslint-disable camelcase */ bestiary: { - dynamic: { - name: 'Private Island', - mobs: [ - { name: 'Creeper', cap: 200, mobs: ['creeper_1'], bracket: 1 }, - { - name: 'Enderman', - cap: 200, - mobs: [ - 'enderman_1', - 'enderman_2', - 'enderman_3', - 'enderman_4', - 'enderman_5', - 'enderman_6', - 'enderman_7', - 'enderman_8', - 'enderman_9', - 'enderman_10', - 'enderman_11', - 'enderman_12', - 'enderman_13', - 'enderman_14', - 'enderman_15' - ], - bracket: 1 - }, - { - name: 'Skeleton', - cap: 200, - mobs: [ - 'skeleton_1', - 'skeleton_2', - 'skeleton_3', - 'skeleton_4', - 'skeleton_5', - 'skeleton_6', - 'skeleton_7', - 'skeleton_8', - 'skeleton_9', - 'skeleton_10', - 'skeleton_11', - 'skeleton_12', - 'skeleton_13', - 'skeleton_14', - 'skeleton_15' - ], - bracket: 1 - }, - { - name: 'Slime', - cap: 200, - mobs: [ - 'slime_1', - 'slime_2', - 'slime_3', - 'slime_4', - 'slime_5', - 'slime_6', - 'slime_7', - 'slime_8', - 'slime_9', - 'slime_10', - 'slime_11', - 'slime_12', - 'slime_13', - 'slime_14', - 'slime_15' - ], - bracket: 1 - }, - { - name: 'Spider', - cap: 200, - mobs: [ - 'spider_1', - 'spider_2', - 'spider_3', - 'spider_4', - 'spider_5', - 'spider_6', - 'spider_7', - 'spider_8', - 'spider_9', - 'spider_10', - 'spider_11', - 'spider_12', - 'spider_13', - 'spider_14', - 'spider_15' - ], - bracket: 1 - }, - { - name: 'Witch', - cap: 200, - mobs: [ - 'witch_1', - 'witch_2', - 'witch_3', - 'witch_4', - 'witch_5', - 'witch_6', - 'witch_7', - 'witch_8', - 'witch_9', - 'witch_10', - 'witch_11', - 'witch_12', - 'witch_13', - 'witch_14', - 'witch_15' - ], - bracket: 1 - }, - { - name: 'Zombie', - cap: 200, - mobs: [ - 'zombie_1', - 'zombie_2', - 'zombie_3', - 'zombie_4', - 'zombie_5', - 'zombie_6', - 'zombie_7', - 'zombie_8', - 'zombie_9', - 'zombie_10', - 'zombie_11', - 'zombie_12', - 'zombie_13', - 'zombie_14', - 'zombie_15' - ], - bracket: 1 - } - ] - }, - hub: { - name: 'Hub', - mobs: [ - { name: 'Crypt Ghoul', cap: 40000, mobs: ['unburried_zombie_30'], bracket: 1 }, - { name: 'Golden Ghoul', cap: 4000, mobs: ['unburried_zombie_60'], bracket: 3 }, - { name: 'Graveyard Zombie', cap: 200, mobs: ['graveyard_zombie_1'], bracket: 1 }, - { name: 'Old Wolf', cap: 4000, mobs: ['old_wolf_50'], bracket: 3 }, - { name: 'Wolf', cap: 40000, mobs: ['ruin_wolf_15'], bracket: 1 }, - { name: 'Zombie Villager', cap: 1000, mobs: ['zombie_villager_1'], bracket: 4 } - ] - }, - farming_1: { - name: 'The Farming Islands', - mobs: [ - { name: 'Chicken', cap: 200, mobs: ['farming_chicken_1'], bracket: 1 }, - { name: 'Cow', cap: 200, mobs: ['farming_cow_1'], bracket: 1 }, - { name: 'Mushroom Cow', cap: 200, mobs: ['mushroom_cow_1'], bracket: 1 }, - { name: 'Pig', cap: 200, mobs: ['farming_pig_1'], bracket: 1 }, - { name: 'Rabbit', cap: 200, mobs: ['farming_rabbit_1'], bracket: 1 }, - { name: 'Sheep', cap: 200, mobs: ['farming_sheep_1'], bracket: 1 } - ] - }, - combat_1: { - name: 'Spiders Den', - mobs: [ - { name: 'Arachne', cap: 500, mobs: ['arachne_500', 'arachne_300'], bracket: 7 }, - { name: "Arachne's Brood", cap: 1000, mobs: ['arachne_brood_200', 'arachne_brood_100'], bracket: 4 }, - { name: "Arachne's Keeper", cap: 400, mobs: ['arachne_keeper_100'], bracket: 5 }, - { name: 'Brood Mother', cap: 400, mobs: ['brood_mother_spider_12'], bracket: 5 }, - { - name: 'Dasher Spider', - cap: 10000, - mobs: ['dasher_spider_50', 'dasher_spider_45', 'dasher_spider_42', 'dasher_spider_4', 'dasher_spider_6'], - bracket: 2 - }, - { name: 'Gravel Skeleton', cap: 4000, mobs: ['respawning_skeleton_2'], bracket: 3 }, - { name: 'Rain Slime', cap: 1000, mobs: ['random_slime_8', 'random_slime_20'], bracket: 4 }, - { - name: 'Silverfish', - cap: 40000, - mobs: [ - 'jockey_shot_silverfish_3', - 'splitter_spider_silverfish_2', - 'splitter_spider_silverfish_45', - 'splitter_spider_silverfish_42', - 'splitter_spider_silverfish_50', - 'jockey_shot_silverfish_42' - ], - bracket: 1 - }, - { - name: 'Spider Jockey', - cap: 10000, - mobs: ['spider_jockey_3', 'spider_jockey_42', 'spider_jockey_5'], - bracket: 2 - }, - { - name: 'Splitter Spider', - cap: 10000, - mobs: [ - 'splitter_spider_2', - 'splitter_spider_45', - 'splitter_spider_42', - 'splitter_spider_50', - 'splitter_spider_4', - 'splitter_spider_6' - ], - bracket: 2 - }, - { - name: 'Voracious Spider', - cap: 40000, - mobs: ['voracious_spider_50', 'voracious_spider_42', 'voracious_spider_45', 'voracious_spider_10'], - bracket: 1 - }, - { - name: 'Weaver Spider', - cap: 10000, - mobs: [ - 'weaver_spider_3', - 'weaver_spider_4', - 'weaver_spider_5', - 'weaver_spider_6', - 'weaver_spider_42', - 'weaver_spider_45', - 'weaver_spider_50' - ], - bracket: 2 - } - ] - }, - combat_3: { - name: 'The End', - mobs: [ - { - name: 'Dragon', - cap: 1000, - mobs: [ - 'protector_dragon_100', - 'old_dragon_100', - 'young_dragon_100', - 'wise_dragon_100', - 'superior_dragon_100', - 'strong_dragon_100', - 'unstable_dragon_100' - ], - bracket: 5 - }, - { name: 'Enderman', cap: 25000, mobs: ['enderman_50', 'enderman_45', 'enderman_42'], bracket: 4 }, - { name: 'Endermite', cap: 10000, mobs: ['nest_endermite_50', 'endermite_37', 'endermite_40'], bracket: 5 }, - { name: 'Endstone Protector', cap: 500, mobs: ['corrupted_protector_100'], bracket: 7 }, - { name: 'Obsidian Defender', cap: 25000, mobs: ['obsidian_wither_55'], bracket: 4 }, - { name: 'Voidling Extremist', cap: 4000, mobs: ['voidling_extremist_100'], bracket: 3 }, - { name: 'Voidling Fanatic', cap: 25000, mobs: ['voidling_fanatic_85'], bracket: 4 }, - { name: 'Watcher', cap: 25000, mobs: ['watcher_55'], bracket: 4 }, - { name: 'Zealot', cap: 100000, mobs: ['zealot_bruiser_100', 'zealot_enderman_55'], bracket: 3 } - ] - }, - crimson_isle: { - name: 'Crimson Isle', - mobs: [ - { name: 'Ashfang', cap: 1000, mobs: ['ashfang_200'], bracket: 5 }, - { name: 'Barbarian Duke X', cap: 1000, mobs: ['barbarian_duke_x_200'], bracket: 5 }, - { name: 'Bladesoul', cap: 1000, mobs: ['bladesoul_200'], bracket: 5 }, - { name: 'Blaze', cap: 3000, mobs: ['blaze_25', 'blaze_70', 'bezal_80', 'mutated_blaze_70'], bracket: 4 }, - { name: 'Smoldering Blaze', cap: 25000, mobs: ['smoldering_blaze_95'], bracket: 2 }, - { name: 'Millenia-Aged Blaze', cap: 4000, mobs: ['old_blaze_110'], bracket: 3 }, - { name: 'Flaming Spider', cap: 10000, mobs: ['flaming_spider_80'], bracket: 3 }, - { name: 'Flare', cap: 100000, mobs: ['flare_90'], bracket: 1 }, - { name: 'Ghast', cap: 1000, mobs: ['ghast_85', 'dive_ghast_90'], bracket: 4 }, - { name: 'Mage Outlaw', cap: 1000, mobs: ['mage_outlaw_200'], bracket: 5 }, - { - name: 'Magma Cube', - cap: 10000, - mobs: ['pack_magma_cube_90', 'magma_cube_75', 'fireball_magma_cube_75'], - bracket: 3 - }, - { name: 'Magma Boss', cap: 1000, mobs: ['magma_boss_500'], bracket: 5 }, - { name: 'Matcho', cap: 400, mobs: ['matcho_100'], bracket: 5 }, - { name: 'Mushroom Bull', cap: 10000, mobs: ['charging_mushroom_cow_80'], bracket: 3 }, - { name: 'Pigman', cap: 10000, mobs: ['kada_knight_90', 'magma_cube_rider_90', 'pigman_12'], bracket: 3 }, - { name: 'Wither Skeleton', cap: 10000, mobs: ['wither_skeleton_70'], bracket: 3 }, - { name: 'Wither Spectre', cap: 10000, mobs: ['wither_spectre_70'], bracket: 3 }, - { name: 'Tentacle', cap: 1000, mobs: ['hellwisp_100'], bracket: 5 }, - { name: 'Vanquisher', cap: 1000, mobs: ['vanquisher_100'], bracket: 5 } - ] - }, - mining_2: { - name: 'Deep Caverns', - mobs: [ - { - name: 'Emerald Slime', - cap: 3000, - mobs: ['emerald_slime_5', 'emerald_slime_10', 'emerald_slime_15'], - bracket: 1 - }, - { name: 'Miner Skeleton', cap: 3000, mobs: ['diamond_skeleton_15', 'diamond_skeleton_20'], bracket: 1 }, - { name: 'Miner Zombie', cap: 3000, mobs: ['diamond_zombie_15', 'diamond_zombie_20'], bracket: 1 }, - { name: 'Redstone Pigman', cap: 3000, mobs: ['redstone_pigman_10'], bracket: 1 }, - { name: 'Sneaky Creeper', cap: 300, mobs: ['invisible_creeper_3'], bracket: 3 }, - { name: 'Lapis Zombie', cap: 3000, mobs: ['lapis_zombie_7'], bracket: 1 } - ] - }, - mining_3: { - name: 'Dwarven Mines', - mobs: [ - { name: 'Ghost', cap: 250000, mobs: ['caverns_ghost_250'], bracket: 2 }, - { - name: 'Goblin', - cap: 25000, - mobs: [ - 'goblin_weakling_melee_25', - 'goblin_weakling_melee_40', - 'goblin_weakling_bow_25', - 'goblin_weakling_bow_40', - 'goblin_creepertamer_100', - 'goblin_pitfighter_70', - 'goblin_knife_thrower_25', - 'goblin_knife_thrower_40', - 'goblin_flamethrower_100', - 'goblin_murderlover_200' - ], - bracket: 2 - }, - { - name: 'Goblin Raiders', - cap: 1000, - mobs: [ - 'goblin_weakling_melee_5', - 'goblin_weakling_bow_5', - 'goblin_creepertamer_90', - 'goblin_creeper_20', - 'goblin_battler_60', - 'goblin_murderlover_150', - 'goblin_golem_150' - ], - bracket: 4 - }, - { name: 'Golden Goblin', cap: 400, mobs: ['goblin_50'], bracket: 5 }, - { name: 'Ice Walker', cap: 10000, mobs: ['ice_walker_45'], bracket: 2 }, - { name: 'Powder Ghast', cap: 200, mobs: ['powder_ghast_1'], bracket: 1 }, - { name: 'Star Sentry', cap: 1000, mobs: ['crystal_sentry_50'], bracket: 4 }, - { name: 'Treasure Hoarder', cap: 3000, mobs: ['treasure_hoarder_70'], bracket: 3 } - ] - }, - crystal_hollows: { - name: 'Crystal Hollows', - mobs: [ - { name: 'Thyst', cap: 4000, mobs: ['thyst_20'], bracket: 3 }, - { name: 'Worm', cap: 400, mobs: ['worm_5', 'scatha_10'], bracket: 5 }, - { name: 'Yog', cap: 4000, mobs: ['yog_100'], bracket: 3 }, - { name: 'Sludge', cap: 10000, mobs: ['sludge_5', 'sludge_10', 'sludge_100'], bracket: 2 }, - { name: 'Automaton', cap: 10000, mobs: ['automaton_100', 'automaton_150'], bracket: 2 }, - { name: 'Butterfly', cap: 1000, mobs: ['butterfly_100'], bracket: 4 }, - { - name: 'Grunt', - cap: 4000, - mobs: [ - 'team_treasurite_grunt_50', - 'team_treasurite_viper_100', - 'team_treasurite_wendy_100', - 'team_treasurite_sebastian_100', - 'team_treasurite_corleone_200' - ], - bracket: 3 - }, - { name: 'Bal', cap: 250, mobs: ['bal_boss_100'], bracket: 6 }, - { name: 'Key Guardian', cap: 250, mobs: ['key_guardian_100'], bracket: 6 } - ] - }, - foraging_1: { - name: 'The Park', - mobs: [ - { name: 'Howling Spirit', cap: 10000, mobs: ['howling_spirit_35'], bracket: 2 }, - { name: 'Pack Spirit', cap: 10000, mobs: ['pack_spirit_30'], bracket: 2 }, - { name: 'Soul of the Alpha', cap: 1000, mobs: ['soul_of_the_alpha_55'], bracket: 4 } - ] - }, - spooky_festival: { - name: 'Spooky Festival', - mobs: [ - { name: 'Crazy Witch', cap: 750, mobs: ['batty_witch_60'], bracket: 2 }, - { name: 'Headless Horseman', cap: 500, mobs: ['horseman_horse_100'], bracket: 7 }, - { name: 'Phantom Spirit', cap: 750, mobs: ['phantom_spirit_35'], bracket: 2 }, - { name: 'Scary Jerry', cap: 750, mobs: ['scary_jerry_30'], bracket: 2 }, - { name: 'Trick or Treater', cap: 750, mobs: ['trick_or_treater_30'], bracket: 2 }, - { name: 'Wither Gourd', cap: 750, mobs: ['wither_gourd_40'], bracket: 2 }, - { name: 'Wraith', cap: 750, mobs: ['wraith_50'], bracket: 2 } - ] - }, - mythological_creatures: { - name: 'Mythological Creatures', - mobs: [ - { name: 'Gaia Construct', cap: 3000, mobs: ['gaia_construct_140', 'gaia_construct_260'], bracket: 4 }, - { name: 'Minos Champion', cap: 1000, mobs: ['minos_champion_175', 'minos_champion_310'], bracket: 5 }, - { - name: 'Minos Hunter', - cap: 1000, - mobs: ['minos_hunter_125', 'minos_hunter_15', 'minos_hunter_60'], - bracket: 5 - }, - { name: 'Minos Inquisitor', cap: 500, mobs: ['minos_inquisitor_750'], bracket: 7 }, - { name: 'Minotaur', cap: 3000, mobs: ['minotaur_45', 'minotaur_120', 'minotaur_210'], bracket: 4 }, - { - name: 'Siamese Lynx', - cap: 3000, - mobs: ['siamese_lynx_25', 'siamese_lynx_85', 'siamese_lynx_155'], - bracket: 4 - } - ] - }, - jerry: { - name: 'Jerry', - mobs: [ - { name: 'Green Jerry', cap: 75, mobs: ['mayor_jerry_green_1'], bracket: 4 }, - { name: 'Blue Jerry', cap: 30, mobs: ['mayor_jerry_blue_2'], bracket: 5 }, - { name: 'Purple Jerry', cap: 25, mobs: ['mayor_jerry_purple_3'], bracket: 6 }, - { name: 'Golden Jerry', cap: 20, mobs: ['mayor_jerry_golden_5'], bracket: 7 } - ] - }, - kuudra: { - name: 'Kuudra', - mobs: [ - { - name: 'Blazing Golem', - cap: 300, - mobs: [ - 'blazing_golem_100', - 'blazing_golem_200', - 'blazing_golem_300', - 'blazing_golem_400', - 'blazing_golem_500' - ], - bracket: 3 - }, - { - name: 'Blight', - cap: 10000, - mobs: ['blight_100', 'blight_200', 'blight_300', 'blight_400', 'blight_500'], - bracket: 3 - }, - { - name: 'Dropship', - cap: 300, - mobs: ['dropship_100', 'dropship_200', 'dropship_300', 'dropship_400', 'dropship_500'], - bracket: 3 - }, - { - name: 'Explosive Imp', - cap: 10000, - mobs: [ - 'explosive_imp_100', - 'explosive_imp_200', - 'explosive_imp_300', - 'explosive_imp_400', - 'explosive_imp_500' - ], - bracket: 3 - }, - { - name: 'Inferno Magma Cube', - cap: 10000, - mobs: [ - 'inferno_magma_cube_100', - 'inferno_magma_cube_200', - 'inferno_magma_cube_300', - 'inferno_magma_cube_400', - 'inferno_magma_cube_500' - ], - bracket: 3 - }, - { - name: 'Kuudra Berserker', - cap: 10000, - mobs: [ - 'kuudra_berserker_100', - 'kuudra_berserker_200', - 'kuudra_berserker_300', - 'kuudra_berserker_400', - 'kuudra_berserker_500' - ], - bracket: 3 - }, - { - name: 'Kuudra Follower', - cap: 25000, - mobs: [ - 'kuudra_follower_100', - 'kuudra_follower_200', - 'kuudra_follower_300', - 'kuudra_follower_400', - 'kuudra_follower_500' - ], - bracket: 2 - }, - { - name: 'Kuudra Knocker', - cap: 10000, - mobs: [ - 'kuudra_knocker_100', - 'kuudra_knocker_200', - 'kuudra_knocker_300', - 'kuudra_knocker_400', - 'kuudra_knocker_500' - ], - bracket: 3 - }, - { - name: 'Kuudra Landmine', - cap: 10000, - mobs: [ - 'kuudra_landmine_100', - 'kuudra_landmine_200', - 'kuudra_landmine_300', - 'kuudra_landmine_400', - 'kuudra_landmine_500' - ], - bracket: 3 - }, - { - name: 'Kuudra Slasher', - cap: 30, - mobs: [ - 'kuudra_slasher_100', - 'kuudra_slasher_200', - 'kuudra_slasher_300', - 'kuudra_slasher_400', - 'kuudra_slasher_500' - ], - bracket: 5 - }, - { - name: 'Magma Follower', - cap: 30, - mobs: [ - 'magma_follower_100', - 'magma_follower_200', - 'magma_follower_300', - 'magma_follower_400', - 'magma_follower_500' - ], - bracket: 5 - }, - { - name: 'Wandering Blaze', - cap: 3000, - mobs: [ - 'wandering_blaze_100', - 'wandering_blaze_200', - 'wandering_blaze_300', - 'wandering_blaze_400', - 'wandering_blaze_500' - ], - bracket: 4 - }, - { - name: 'Wither Sentry', - cap: 75, - mobs: [ - 'wither_sentry_100', - 'wither_sentry_200', - 'wither_sentry_300', - 'wither_sentry_400', - 'wither_sentry_500' - ], - bracket: 4 - } - ] - }, - fishing: { - fishing: { - name: 'Fishing', - mobs: [ - { name: 'Agarimoo', cap: 4000, mobs: ['agarimoo_35'], bracket: 3 }, - { name: 'Carrot King', cap: 400, mobs: ['carrot_king_25'], bracket: 5 }, - { name: 'Catfish', cap: 1000, mobs: ['catfish_23'], bracket: 4 }, - { name: 'Deep Sea Protector', cap: 1000, mobs: ['deep_sea_protector_60'], bracket: 4 }, - { name: 'Guardian Defender', cap: 1000, mobs: ['guardian_defender_45'], bracket: 4 }, - { name: 'Night Squid', cap: 1000, mobs: ['night_squid_6'], bracket: 4 }, - { name: 'Oasis Rabbit', cap: 300, mobs: ['oasis_rabbit_10'], bracket: 3 }, - { name: 'Oasis Sheep', cap: 300, mobs: ['oasis_sheep_10'], bracket: 3 }, - { name: 'Poisoned Water Worm', cap: 1000, mobs: ['poisoned_water_worm_25'], bracket: 4 }, - { name: 'Rider of the Deep', cap: 4000, mobs: ['zombie_deep_20', 'chicken_deep_20'], bracket: 3 }, - { name: 'Sea Archer', cap: 4000, mobs: ['sea_archer_15'], bracket: 3 }, - { name: 'Sea Guardian', cap: 4000, mobs: ['sea_guardian_10'], bracket: 3 }, - { name: 'Sea Leech', cap: 1000, mobs: ['sea_leech_30'], bracket: 4 }, - { name: 'Sea Walker', cap: 4000, mobs: ['sea_walker_4'], bracket: 3 }, - { name: 'Sea Witch', cap: 4000, mobs: ['sea_witch_15'], bracket: 3 }, - { name: 'Squid', cap: 10000, mobs: ['pond_squid_1'], bracket: 2 }, - { name: 'The Sea Emperor', cap: 100, mobs: ['skeleton_emperor_150', 'guardian_emperor_150'], bracket: 7 }, - { name: 'Water Hydra', cap: 400, mobs: ['water_hydra_100'], bracket: 5 }, - { name: 'Water Worm', cap: 1000, mobs: ['water_worm_20'], bracket: 4 }, - { name: 'Zombie Miner', cap: 250, mobs: ['zombie_miner_150'], bracket: 6 } - ] - }, - lava: { - name: 'Lava Fishing', - mobs: [ - { name: 'Fire Eel', cap: 1000, mobs: ['fire_eel_240'], bracket: 4 }, - { name: 'Flaming Worm', cap: 4000, mobs: ['flaming_worm_50'], bracket: 3 }, - { name: 'Lava Blaze', cap: 1000, mobs: ['lava_blaze_100'], bracket: 4 }, - { name: 'Lava Flame', cap: 1000, mobs: ['lava_flame_230'], bracket: 4 }, - { name: 'Lava Leech', cap: 4000, mobs: ['lava_leech_220'], bracket: 3 }, - { name: 'Lava Pigman', cap: 1000, mobs: ['lava_pigman_100'], bracket: 4 }, - { name: 'Lord Jawbus', cap: 250, mobs: ['lord_jawbus_600'], bracket: 6 }, - { name: 'Magma Slug', cap: 10000, mobs: ['magma_slug_200'], bracket: 2 }, - { name: 'Moogma', cap: 4000, mobs: ['moogma_210'], bracket: 3 }, - { name: 'Plhlegblast', cap: 7, mobs: ['pond_squid_300'], bracket: 7 }, - { name: 'Pyroclastic Worm', cap: 4000, mobs: ['pyroclastic_worm_240'], bracket: 3 }, - { name: 'Taurus', cap: 1000, mobs: ['pig_rider_250'], bracket: 4 }, - { name: 'Thunder', cap: 400, mobs: ['thunder_400'], bracket: 5 } - ] - }, - spooky_festival: { - name: 'Spooky Festival Fishing', - mobs: [ - { name: 'Grim Reaper', cap: 100, mobs: ['grim_reaper_190'], bracket: 7 }, - { name: 'Nightmare', cap: 1000, mobs: ['nightmare_24'], bracket: 4 }, - { name: 'Phantom Fisher', cap: 250, mobs: ['phantom_fisherman_160'], bracket: 6 }, - { name: 'Scarecrow', cap: 4000, mobs: ['scarecrow_9'], bracket: 3 }, - { name: 'Werewolf', cap: 1000, mobs: ['werewolf_50'], bracket: 4 } - ] - }, - fishing_festival: { - name: 'Fishing Festival', - mobs: [ - { name: 'Blue Shark', cap: 1000, mobs: ['blue_shark_20'], bracket: 4 }, - { name: 'Great White Shark', cap: 400, mobs: ['great_white_shark_180'], bracket: 5 }, - { name: 'Nurse Shark', cap: 4000, mobs: ['nurse_shark_6'], bracket: 3 }, - { name: 'Tiger Shark', cap: 1000, mobs: ['tiger_shark_50'], bracket: 4 } - ] - }, - winter: { - name: 'Winter Fishing', - mobs: [ - { name: 'Frosty', cap: 4000, mobs: ['frosty_the_snowman_13'], bracket: 3 }, - { name: 'Frozen Steve', cap: 4000, mobs: ['frozen_steve_7'], bracket: 3 }, - { name: 'Grinch', cap: 250, mobs: ['grinch_21'], bracket: 6 }, - { name: 'Nutcracker', cap: 400, mobs: ['nutcracker_50'], bracket: 5 }, - { name: 'Reindrake', cap: 100, mobs: ['reindrake_100'], bracket: 7 }, - { name: 'Yeti', cap: 250, mobs: ['yeti_175'], bracket: 6 } - ] - } - }, - catacombs: { - name: 'Catacombs', - mobs: [ - { - name: 'Angry Archeologist', - cap: 10000, - mobs: [ - 'diamond_guy_80', - 'diamond_guy_90', - 'diamond_guy_100', - 'diamond_guy_110', - 'diamond_guy_120', - 'diamond_guy_130', - 'diamond_guy_140', - 'diamond_guy_150', - 'diamond_guy_160', - 'diamond_guy_170', - 'master_diamond_guy_80', - 'master_diamond_guy_90', - 'master_diamond_guy_100', - 'master_diamond_guy_110', - 'master_diamond_guy_120', - 'master_diamond_guy_130', - 'master_diamond_guy_140', - 'master_diamond_guy_150', - 'master_diamond_guy_160', - 'master_diamond_guy_170' - ], - bracket: 5 - }, - { - name: 'Lonely Spider', - cap: 25000, - mobs: [ - 'lonely_spider_35', - 'lonely_spider_55', - 'lonely_spider_65', - 'lonely_spider_75', - 'lonely_spider_85', - 'lonely_spider_95', - 'lonely_spider_105', - 'lonely_spider_115', - 'master_lonely_spider_35', - 'master_lonely_spider_55', - 'master_lonely_spider_65', - 'master_lonely_spider_75', - 'master_lonely_spider_85', - 'master_lonely_spider_95', - 'master_lonely_spider_105', - 'master_lonely_spider_115' - ], - bracket: 4 - }, - { name: 'Bat', cap: 1000, mobs: ['dungeon_secret_bat_1'], bracket: 4 }, - { - name: 'Cellar Spider', - cap: 1000, - mobs: [ - 'cellar_spider_45', - 'cellar_spider_65', - 'cellar_spider_75', - 'cellar_spider_85', - 'cellar_spider_95', - 'cellar_spider_105', - 'cellar_spider_115', - 'cellar_spider_125', - 'master_cellar_spider_45', - 'master_cellar_spider_65', - 'master_cellar_spider_75', - 'master_cellar_spider_85', - 'master_cellar_spider_95', - 'master_cellar_spider_105', - 'master_cellar_spider_115', - 'master_cellar_spider_125' - ], - bracket: 4 - }, - { - name: 'Crypt Dreadlord', - cap: 25000, - mobs: [ - 'crypt_dreadlord_47', - 'crypt_dreadlord_67', - 'crypt_dreadlord_77', - 'crypt_dreadlord_87', - 'crypt_dreadlord_97', - 'crypt_dreadlord_107', - 'crypt_dreadlord_117', - 'crypt_dreadlord_127', - 'master_crypt_dreadlord_47', - 'master_crypt_dreadlord_67', - 'master_crypt_dreadlord_77', - 'master_crypt_dreadlord_87', - 'master_crypt_dreadlord_97', - 'master_crypt_dreadlord_107', - 'master_crypt_dreadlord_117', - 'master_crypt_dreadlord_127' - ], - bracket: 4 - }, - { - name: 'Crypt Lurker', - cap: 25000, - mobs: [ - 'crypt_lurker_41', - 'crypt_lurker_61', - 'crypt_lurker_71', - 'crypt_lurker_81', - 'crypt_lurker_91', - 'crypt_lurker_101', - 'crypt_lurker_111', - 'crypt_lurker_121', - 'master_crypt_lurker_41', - 'master_crypt_lurker_61', - 'master_crypt_lurker_71', - 'master_crypt_lurker_81', - 'master_crypt_lurker_91', - 'master_crypt_lurker_101', - 'master_crypt_lurker_111', - 'master_crypt_lurker_121' - ], - bracket: 4 - }, - { - name: 'Crypt Souleater', - cap: 25000, - mobs: [ - 'crypt_souleater_45', - 'crypt_souleater_65', - 'crypt_souleater_75', - 'crypt_souleater_85', - 'crypt_souleater_95', - 'crypt_souleater_105', - 'crypt_souleater_115', - 'crypt_souleater_125', - 'master_crypt_souleater_45', - 'master_crypt_souleater_65', - 'master_crypt_souleater_75', - 'master_crypt_souleater_85', - 'master_crypt_souleater_95', - 'master_crypt_souleater_105', - 'master_crypt_souleater_115', - 'master_crypt_souleater_125' - ], - bracket: 4 - }, - { - name: 'Fels', - cap: 25000, - mobs: [ - 'tentaclees_90', - 'tentaclees_100', - 'tentaclees_110', - 'master_tentaclees_90', - 'master_tentaclees_100', - 'master_tentaclees_110' - ], - bracket: 4 - }, - { name: 'Golem', cap: 1000, mobs: ['sadan_golem_1', 'master_sadan_golem_1'], bracket: 4 }, - { - name: 'King Midas', - cap: 1000, - mobs: [ - 'king_midas_130', - 'king_midas_140', - 'king_midas_150', - 'king_midas_160', - 'king_midas_170', - 'master_king_midas_130', - 'master_king_midas_140', - 'master_king_midas_150', - 'master_king_midas_160', - 'master_king_midas_170' - ], - bracket: 5 - }, - { - name: 'Lost Adventurer', - cap: 10000, - mobs: [ - 'lost_adventurer_80', - 'lost_adventurer_81', - 'lost_adventurer_82', - 'lost_adventurer_83', - 'lost_adventurer_85', - 'lost_adventurer_86', - 'lost_adventurer_87', - 'lost_adventurer_88', - 'lost_adventurer_90', - 'lost_adventurer_91', - 'lost_adventurer_92', - 'lost_adventurer_93', - 'lost_adventurer_100', - 'lost_adventurer_101', - 'lost_adventurer_102', - 'lost_adventurer_103', - 'lost_adventurer_110', - 'lost_adventurer_111', - 'lost_adventurer_112', - 'lost_adventurer_113', - 'lost_adventurer_120', - 'lost_adventurer_121', - 'lost_adventurer_122', - 'lost_adventurer_123', - 'lost_adventurer_130', - 'lost_adventurer_131', - 'lost_adventurer_132', - 'lost_adventurer_133', - 'lost_adventurer_134', - 'lost_adventurer_135', - 'lost_adventurer_140', - 'lost_adventurer_141', - 'lost_adventurer_142', - 'lost_adventurer_143', - 'lost_adventurer_144', - 'lost_adventurer_150', - 'lost_adventurer_151', - 'lost_adventurer_152', - 'lost_adventurer_153', - 'lost_adventurer_154', - 'lost_adventurer_160', - 'lost_adventurer_161', - 'lost_adventurer_162', - 'lost_adventurer_163', - 'lost_adventurer_164', - 'master_lost_adventurer_80', - 'master_lost_adventurer_81', - 'master_lost_adventurer_82', - 'master_lost_adventurer_83', - 'master_lost_adventurer_85', - 'master_lost_adventurer_86', - 'master_lost_adventurer_87', - 'master_lost_adventurer_88', - 'master_lost_adventurer_90', - 'master_lost_adventurer_91', - 'master_lost_adventurer_92', - 'master_lost_adventurer_93', - 'master_lost_adventurer_100', - 'master_lost_adventurer_101', - 'master_lost_adventurer_102', - 'master_lost_adventurer_103', - 'master_lost_adventurer_110', - 'master_lost_adventurer_111', - 'master_lost_adventurer_112', - 'master_lost_adventurer_113', - 'master_lost_adventurer_120', - 'master_lost_adventurer_121', - 'master_lost_adventurer_122', - 'master_lost_adventurer_123', - 'master_lost_adventurer_130', - 'master_lost_adventurer_131', - 'master_lost_adventurer_132', - 'master_lost_adventurer_133', - 'master_lost_adventurer_134', - 'master_lost_adventurer_135', - 'master_lost_adventurer_140', - 'master_lost_adventurer_141', - 'master_lost_adventurer_142', - 'master_lost_adventurer_143', - 'master_lost_adventurer_144', - 'master_lost_adventurer_150', - 'master_lost_adventurer_151', - 'master_lost_adventurer_152', - 'master_lost_adventurer_153', - 'master_lost_adventurer_154', - 'master_lost_adventurer_160', - 'master_lost_adventurer_161', - 'master_lost_adventurer_162', - 'master_lost_adventurer_163', - 'master_lost_adventurer_164' - ], - bracket: 5 - }, - { - name: 'Mimic', - cap: 1000, - mobs: ['mimic_115', 'mimic_125', 'master_mimic_115', 'master_mimic_125'], - bracket: 4 - }, - { - name: 'Scared Skeleton', - cap: 4000, - mobs: [ - 'scared_skeleton_42', - 'scared_skeleton_62', - 'scared_skeleton_72', - 'master_scared_skeleton_42', - 'master_scared_skeleton_62', - 'master_scared_skeleton_72' - ], - bracket: 3 - }, - { - name: 'Shadow Assassin', - cap: 10000, - mobs: [ - 'shadow_assassin_120', - 'shadow_assassin_130', - 'shadow_assassin_140', - 'shadow_assassin_150', - 'shadow_assassin_160', - 'shadow_assassin_170', - 'shadow_assassin_171', - 'master_shadow_assassin_120', - 'master_shadow_assassin_130', - 'master_shadow_assassin_140', - 'master_shadow_assassin_150', - 'master_shadow_assassin_160', - 'master_shadow_assassin_170', - 'master_shadow_assassin_171' - ], - bracket: 5 - }, - { - name: 'Skeleton Grunt', - cap: 4000, - mobs: [ - 'skeleton_grunt_40', - 'skeleton_grunt_60', - 'skeleton_grunt_70', - 'skeleton_grunt_80', - 'master_skeleton_grunt_40', - 'master_skeleton_grunt_60', - 'master_skeleton_grunt_70', - 'master_skeleton_grunt_80' - ], - bracket: 3 - }, - { name: 'Skeleton Lord', cap: 1000, mobs: ['skeleton_lord_150', 'master_skeleton_lord_150'], bracket: 5 }, - { - name: 'Skeleton Master', - cap: 25000, - mobs: [ - 'skeleton_master_48', - 'skeleton_master_68', - 'skeleton_master_78', - 'skeleton_master_88', - 'skeleton_master_98', - 'skeleton_master_108', - 'skeleton_master_118', - 'skeleton_master_128', - 'master_skeleton_master_48', - 'master_skeleton_master_68', - 'master_skeleton_master_78', - 'master_skeleton_master_88', - 'master_skeleton_master_98', - 'master_skeleton_master_108', - 'master_skeleton_master_118', - 'master_skeleton_master_128' - ], - bracket: 4 - }, - { - name: 'Skeleton Soldier', - cap: 40000, - mobs: [ - 'skeleton_soldier_46', - 'skeleton_soldier_66', - 'skeleton_soldier_76', - 'skeleton_soldier_86', - 'skeleton_soldier_96', - 'skeleton_soldier_106', - 'skeleton_soldier_116', - 'skeleton_soldier_126', - 'master_skeleton_soldier_46', - 'master_skeleton_soldier_66', - 'master_skeleton_soldier_76', - 'master_skeleton_soldier_86', - 'master_skeleton_soldier_96', - 'master_skeleton_soldier_106', - 'master_skeleton_soldier_116', - 'master_skeleton_soldier_126' - ], - bracket: 1 - }, - { - name: 'Skeletor', - cap: 10000, - mobs: [ - 'skeletor_80', - 'skeletor_90', - 'skeletor_100', - 'skeletor_101', - 'skeletor_110', - 'skeletor_120', - 'skeletor_prime_100', - 'skeletor_prime_110', - 'skeletor_prime_120', - 'master_skeletor_80', - 'master_skeletor_90', - 'master_skeletor_100', - 'master_skeletor_101', - 'master_skeletor_110', - 'master_skeletor_120', - 'master_skeletor_prime_100', - 'master_skeletor_prime_110', - 'master_skeletor_prime_120' - ], - bracket: 5 - }, - { - name: 'Sniper', - cap: 4000, - mobs: [ - 'sniper_skeleton_43', - 'sniper_skeleton_63', - 'sniper_skeleton_73', - 'sniper_skeleton_83', - 'sniper_skeleton_93', - 'sniper_skeleton_103', - 'sniper_skeleton_113', - 'sniper_skeleton_123', - 'master_sniper_skeleton_43', - 'master_sniper_skeleton_63', - 'master_sniper_skeleton_73', - 'master_sniper_skeleton_83', - 'master_sniper_skeleton_93', - 'master_sniper_skeleton_103', - 'master_sniper_skeleton_113', - 'master_sniper_skeleton_123' - ], - bracket: 3 - }, - { - name: 'Super Archer', - cap: 10000, - mobs: [ - 'super_archer_90', - 'super_archer_100', - 'super_archer_110', - 'super_archer_120', - 'master_super_archer_90', - 'master_super_archer_100', - 'master_super_archer_110', - 'master_super_archer_120' - ], - bracket: 5 - }, - { - name: 'Super Tank Zombie', - cap: 25000, - mobs: [ - 'super_tank_zombie_90', - 'super_tank_zombie_100', - 'super_tank_zombie_110', - 'super_tank_zombie_120', - 'master_super_tank_zombie_90', - 'master_super_tank_zombie_100', - 'master_super_tank_zombie_110', - 'master_super_tank_zombie_120' - ], - bracket: 4 - }, - { - name: 'Tank Zombie', - cap: 4000, - mobs: [ - 'crypt_tank_zombie_40', - 'crypt_tank_zombie_60', - 'crypt_tank_zombie_70', - 'crypt_tank_zombie_80', - 'crypt_tank_zombie_90', - 'master_crypt_tank_zombie_40', - 'master_crypt_tank_zombie_60', - 'master_crypt_tank_zombie_70', - 'master_crypt_tank_zombie_80', - 'master_crypt_tank_zombie_90' - ], - bracket: 3 - }, - { - name: 'Withermancer', - cap: 25000, - mobs: [ - 'crypt_witherskeleton_90', - 'crypt_witherskeleton_100', - 'crypt_witherskeleton_110', - 'crypt_witherskeleton_120', - 'master_crypt_witherskeleton_90', - 'master_crypt_witherskeleton_100', - 'master_crypt_witherskeleton_110', - 'master_crypt_witherskeleton_120' - ], - bracket: 4 - }, - { name: 'Terracotta', cap: 40000, mobs: ['sadan_statue_1', 'master_sadan_statue_1'], bracket: 1 }, - { - name: 'Undead', - cap: 10000, - mobs: [ - 'watcher_summon_undead_1', - 'watcher_summon_undead_2', - 'watcher_summon_undead_3', - 'watcher_summon_undead_4', - 'watcher_summon_undead_5', - 'watcher_summon_undead_6', - 'watcher_summon_undead_7', - 'watcher_summon_undead_8', - 'master_watcher_summon_undead_1', - 'master_watcher_summon_undead_2', - 'master_watcher_summon_undead_3', - 'master_watcher_summon_undead_4', - 'master_watcher_summon_undead_5', - 'master_watcher_summon_undead_6', - 'master_watcher_summon_undead_7', - 'master_watcher_summon_undead_8' - ], - bracket: 2 - }, - { - name: 'Undead Skeleton', - cap: 25000, - mobs: [ - 'dungeon_respawning_skeleton_40', - 'dungeon_respawning_skeleton_40', - 'dungeon_respawning_skeleton_60', - 'dungeon_respawning_skeleton_60', - 'dungeon_respawning_skeleton_70', - 'dungeon_respawning_skeleton_70', - 'dungeon_respawning_skeleton_80', - 'dungeon_respawning_skeleton_80', - 'dungeon_respawning_skeleton_90', - 'dungeon_respawning_skeleton_90', - 'dungeon_respawning_skeleton_100', - 'dungeon_respawning_skeleton_100', - 'dungeon_respawning_skeleton_110', - 'dungeon_respawning_skeleton_110', - 'dungeon_respawning_skeleton_120', - 'dungeon_respawning_skeleton_120', - 'master_dungeon_respawning_skeleton_40', - 'master_dungeon_respawning_skeleton_40', - 'master_dungeon_respawning_skeleton_60', - 'master_dungeon_respawning_skeleton_60', - 'master_dungeon_respawning_skeleton_70', - 'master_dungeon_respawning_skeleton_70', - 'master_dungeon_respawning_skeleton_80', - 'master_dungeon_respawning_skeleton_80', - 'master_dungeon_respawning_skeleton_90', - 'master_dungeon_respawning_skeleton_90', - 'master_dungeon_respawning_skeleton_100', - 'master_dungeon_respawning_skeleton_100', - 'master_dungeon_respawning_skeleton_110', - 'master_dungeon_respawning_skeleton_110', - 'master_dungeon_respawning_skeleton_120' - ], - bracket: 4 - }, - { name: 'Wither Guard', cap: 10000, mobs: ['wither_guard_100', 'master_wither_guard_100'], bracket: 5 }, - { name: 'Wither Husk', cap: 10000, mobs: ['master_wither_husk_100'], bracket: 5 }, - { name: 'Wither Miner', cap: 25000, mobs: ['wither_miner_100', 'master_wither_miner_100'], bracket: 4 }, - { - name: 'Zombie Commander', - cap: 3000, - mobs: [ - 'zombie_commander_110', - 'zombie_commander_120', - 'master_zombie_commander_110', - 'master_zombie_commander_120' - ], - bracket: 4 - }, - { - name: 'Zombie Grunt', - cap: 4000, - mobs: [ - 'zombie_grunt_40', - 'zombie_grunt_60', - 'zombie_grunt_70', - 'zombie_grunt_80', - 'master_zombie_grunt_40', - 'master_zombie_grunt_60', - 'master_zombie_grunt_70', - 'master_zombie_grunt_80' - ], - bracket: 3 - }, - { - name: 'Zombie Knight', - cap: 25000, - mobs: [ - 'zombie_knight_86', - 'zombie_knight_96', - 'zombie_knight_106', - 'zombie_knight_116', - 'zombie_knight_126', - 'master_zombie_knight_86', - 'master_zombie_knight_96', - 'master_zombie_knight_106', - 'master_zombie_knight_116', - 'master_zombie_knight_126' - ], - bracket: 4 - }, - { name: 'Zombie Lord', cap: 1000, mobs: ['zombie_lord_150', 'master_zombie_lord_150'], bracket: 5 }, - { - name: 'Zombie Soldier', - cap: 40000, - mobs: [ - 'zombie_soldier_83', - 'zombie_soldier_93', - 'zombie_soldier_103', - 'zombie_soldier_113', - 'zombie_soldier_123', - 'master_zombie_soldier_83', - 'master_zombie_soldier_93', - 'master_zombie_soldier_103', - 'master_zombie_soldier_113', - 'master_zombie_soldier_123' - ], - bracket: 1 - } - ] - } - }, - bestiaryBrackets: { - 1: [ - 20, 40, 60, 100, 200, 400, 800, 1400, 2000, 3000, 6000, 12000, 20000, 30000, 40000, 50000, 60000, 72000, 86000, - 100000, 200000, 400000, 600000, 800000, 1000000 - ], - 2: [ - 5, 10, 15, 25, 50, 100, 200, 350, 500, 750, 1500, 3000, 5000, 7500, 10000, 12500, 15000, 18000, 21500, 25000, - 50000, 100000, 150000, 200000, 250000 - ], - 3: [ - 4, 8, 12, 16, 20, 40, 80, 140, 200, 300, 600, 1200, 2000, 3000, 4000, 5000, 6000, 7200, 8600, 10000, 20000, 40000, - 60000, 80000, 100000 - ], - 4: [ - 2, 4, 6, 10, 15, 20, 25, 35, 50, 75, 150, 300, 500, 750, 1000, 1350, 1650, 2000, 2500, 3000, 5000, 10000, 15000, - 20000, 25000 - ], - 5: [ - 1, 2, 3, 5, 7, 10, 15, 20, 25, 30, 60, 120, 200, 300, 400, 500, 600, 720, 860, 1000, 2000, 4000, 6000, 8000, 10000 - ], - 6: [1, 2, 3, 5, 7, 9, 14, 17, 21, 25, 50, 80, 125, 175, 250, 325, 425, 525, 625, 750, 1500], - 7: [1, 2, 3, 5, 7, 9, 11, 14, 17, 20, 30, 40, 55, 75, 100, 150, 200, 275, 375, 500, 1000] - }, // Credits (pit) https://github.com/PitPanda/PitPandaProduction/blob/b1971f56ea1aa8c829b722cbb33247c96591c0cb/structures/Pit.js pit: { Prestiges: [ diff --git a/src/utils/SkyblockUtils.ts b/src/utils/SkyblockUtils.ts index 1a0ea6e..65cd6ac 100644 --- a/src/utils/SkyblockUtils.ts +++ b/src/utils/SkyblockUtils.ts @@ -1,5 +1,5 @@ import { parse, simplify } from 'prismarine-nbt'; -import Constants from './Constants'; +import Constants, { bestiaryBrackets } from './Constants'; export type SkyblockRarity = | 'COMMON' @@ -322,10 +322,11 @@ export function getSkills(data: Record): SkyblockMemberSkills { skillsObject.average = levels.reduce((a, b) => a + b, 0) / levels.length; return skillsObject; } + function formatBestiaryMobs(userProfile: Record, mobs: any) { const output = []; for (const mob of mobs) { - const mobBracket = (Constants.bestiaryBrackets as { [key: number]: number[] })[mob.bracket]; + const mobBracket = bestiaryBrackets[mob.bracket]; const totalKills = mob.mobs.reduce((acc: any, cur: any) => { return acc + (userProfile.bestiary.kills[cur] ?? 0); }, 0); diff --git a/src/utils/decolorize.ts b/src/utils/decolorize.ts new file mode 100644 index 0000000..d1f7f77 --- /dev/null +++ b/src/utils/decolorize.ts @@ -0,0 +1,3 @@ +export function decolorizeString(str: string): string { + return str.replace(/ยง[a-f0-9]/gi, ''); +}