From eedd4ff7a3f2816c8e0d3f037c7a1acbb5988495 Mon Sep 17 00:00:00 2001 From: mat <27899617+mat-1@users.noreply.github.com> Date: Sun, 14 Feb 2021 14:07:10 -0600 Subject: add collections --- src/cleaners/skyblock/collections.ts | 113 +++++++++++++++++++++++++++++++++++ src/cleaners/skyblock/inventory.ts | 4 +- src/cleaners/skyblock/itemId.ts | 73 ++++++++++++++++++++++ src/cleaners/skyblock/member.ts | 7 ++- 4 files changed, 193 insertions(+), 4 deletions(-) create mode 100644 src/cleaners/skyblock/collections.ts create mode 100644 src/cleaners/skyblock/itemId.ts (limited to 'src/cleaners/skyblock') diff --git a/src/cleaners/skyblock/collections.ts b/src/cleaners/skyblock/collections.ts new file mode 100644 index 0000000..a70d7b8 --- /dev/null +++ b/src/cleaners/skyblock/collections.ts @@ -0,0 +1,113 @@ +import { cleanItemId, cleanItemNames, hypixelItemNames } from "./itemId" + +const COLLECTIONS = { + 'farming': [ + 'wheat', + 'carrot', + 'potato', + 'pumpkin', + 'melon_slice', + 'wheat_seeds', + 'red_mushroom', + 'cocoa_beans', + 'cactus', + 'sugar_cane', + 'feather', + 'leather', + 'porkchop', + 'chicken', + 'mutton', + 'rabbit', + 'nether_wart' + ], + 'mining': [ + 'cobblestone', + 'coal', + 'iron_ingot', + 'gold_ingot', + 'diamond', + 'lapis_lazuli', + 'emerald', + 'redstone', + 'quartz', + 'obsidian', + 'glowstone_dust', + 'gravel', + 'ice', + 'netherrack', + 'sand', + 'end_stone' + ], + 'combat': [ + 'rotten_flesh', + 'bone', + 'string', + 'spider_eye', + 'gunpowder', + 'ender_pearl', + 'ghast_tear', + 'slime_ball', + 'blaze_rod', + 'magma_cream' + ], + 'foraging': [ + 'oak_log', + 'spruce_log', + 'birch_log', + 'jungle_log', + 'acacia_log', + 'dark_oak_log' + ], + 'fishing': [ + 'cod', + 'salmon', + 'tropical_fish', + 'pufferfish', + 'prismarine_shard', + 'prismarine_crystals', + 'clay_ball', + 'lily_pad', + 'ink_sac', + 'sponge' + ] +} as const + +export interface Collection { + name: string + xp: number + level: number +} + +export function cleanCollections(data: any): Collection[] { + // collection tiers show up like this: [ GRAVEL_3, GOLD_INGOT_2, MELON_-1, LOG_2:1_7, RAW_FISH:3_-1] + // these tiers are the same for all players in a coop + const playerCollectionTiersRaw: string[] = data?.unlocked_coll_tiers ?? [] + const playerCollectionTiers: { [ key: string ]: number } = {} + + for (const collectionTierNameValueRaw of playerCollectionTiersRaw) { + const [ collectionTierNameRaw, collectionTierValueRaw ] = collectionTierNameValueRaw.split(/_(?=-?\d+$)/) + const collectionName = cleanItemId(collectionTierNameRaw) + // ensure it's at least 0 + const collectionValue: number = Math.max(parseInt(collectionTierValueRaw), 0) + + // if the collection hasn't been checked yet, or the new value is higher than the old, replace it + if (!playerCollectionTiers[collectionName] || collectionValue > playerCollectionTiers[collectionName]) + playerCollectionTiers[collectionName] = collectionValue + } + + // collection names show up like this: { LOG: 49789, LOG:2: 26219, MUSHROOM_COLLECTION: 2923} + // these values are different for each player in a coop + const playerCollectionValuesRaw: { [ key in hypixelItemNames ]: number } = data?.collection ?? {} + const playerCollectionValues: Collection[] = [] + + for (const collectionNameRaw in playerCollectionValuesRaw) { + const collectionValue: number = playerCollectionValuesRaw[collectionNameRaw] + const collectionName = cleanItemId(collectionNameRaw) + playerCollectionValues.push({ + name: collectionName, + xp: collectionValue, + level: playerCollectionTiers[collectionName] + }) + } + return playerCollectionValues +} \ No newline at end of file diff --git a/src/cleaners/skyblock/inventory.ts b/src/cleaners/skyblock/inventory.ts index 96cd629..ed9b5ed 100644 --- a/src/cleaners/skyblock/inventory.ts +++ b/src/cleaners/skyblock/inventory.ts @@ -21,7 +21,6 @@ interface Item { enchantments?: { [ name: string ]: number } skull_owner?: string - } export type Inventory = Item[] @@ -29,7 +28,8 @@ export type Inventory = Item[] function cleanItem(rawItem): Item { // if the item doesn't have an id, it isn't an item if (rawItem.id === undefined) return null - const vanillaId: number = rawItem.id && -1 + + const vanillaId: number = rawItem.id const itemCount = rawItem.Count const damageValue = rawItem.Damage const itemTag = rawItem.tag diff --git a/src/cleaners/skyblock/itemId.ts b/src/cleaners/skyblock/itemId.ts new file mode 100644 index 0000000..20bea06 --- /dev/null +++ b/src/cleaners/skyblock/itemId.ts @@ -0,0 +1,73 @@ +// change weird item names to be more consistent with vanilla +const ITEMS = { + 'log': 'oak_log', + 'log:1': 'spruce_log', + 'log:2': 'birch_log', + 'log:3': 'jungle_log', + 'log_2': 'acacia_log', + 'log_2:1': 'dark_oak_log', + + 'ink_sack': 'ink_sac', + 'ink_sack:3': 'cocoa_beans', + 'ink_sack:4': 'lapis_lazuli', + + 'cocoa': 'cocoa_beans', + + 'raw_fish': 'cod', + 'raw_fish:1': 'salmon', + 'raw_fish:2': 'tropical_fish', + 'raw_fish:3': 'pufferfish', + + 'raw_salmon': 'salmon', + 'cooked_fish': 'cooked_cod', + + 'seeds': 'wheat_seeds', + 'sulphur': 'gunpowder', + 'raw_chicken': 'chicken', + 'pork': 'porkchop', + 'potato_item': 'potato', + 'carrot_item': 'carrot', + 'mushroom_collection': 'red_mushroom', + 'nether_stalk': 'nether_wart', + 'water_lily': 'lily_pad', + 'melon': 'melon_slice', + 'ender_stone': 'end_stone', + + 'huge_mushroom_1': 'red_mushroom_block', + 'huge_mushroom_2': 'brown_mushroom_block', + + 'iron_ingot': 'iron_ingot', + + 'iron': 'iron_ingot', + 'gold': 'gold_ingot', + + 'endstone': 'end_stone', + 'lapis_lazuli_block': 'lapis_block', + 'snow_ball': 'snowball', + 'raw_beef': 'beef', + 'eye_of_ender': 'ender_eye', + 'grilled_pork': 'cooked_porkchop', + 'glistering_melon': 'glistering_melon_slice', + 'cactus_green': 'green_dye', + + 'enchanted_lapis_lazuli': 'enchanted_lapis_lazuli', + 'enchanted_potato': 'enchanted_potato', + 'enchanted_birch_log': 'enchanted_birch_log', + 'enchanted_gunpowder': 'enchanted_gunpowder', + 'enchanted_raw_salmon': 'enchanted_salmon', + 'enchanted_raw_chicken': 'enchanted_chicken', + 'enchanted_water_lily': 'enchanted_lily_pad', + 'enchanted_ink_sack': 'enchanted_ink_sac', + 'enchanted_melon': 'enchanted_melon_slice', + 'enchanted_glistering_melon': 'enchanted_glistering_melon_slice' +} as const + +/** Weirdly named items by Hypixel */ +export type hypixelItemNames = keyof typeof ITEMS +/** Cleaner names by us */ +export type cleanItemNames = (typeof ITEMS)[keyof typeof ITEMS] + +/** Clean an item with a weird name (log_2:1) and make it have a better name (dark_oak_log) */ +export function cleanItemId(itemId: string): cleanItemNames { + return ITEMS[itemId.toLowerCase()] ?? itemId.toLowerCase() +} diff --git a/src/cleaners/skyblock/member.ts b/src/cleaners/skyblock/member.ts index e7e6250..f0d2cec 100644 --- a/src/cleaners/skyblock/member.ts +++ b/src/cleaners/skyblock/member.ts @@ -1,5 +1,5 @@ import { CleanProfileStats, cleanProfileStats } from './stats' -import { cleanInventories, Inventories, INVENTORIES } from './inventory' +import { cleanInventories, Inventories } from './inventory' import { cleanFairySouls, FairySouls } from './fairysouls' import { cleanObjectives, Objective } from './objectives' import { CleanMinion, cleanMinions } from './minions' @@ -10,6 +10,7 @@ import { Included } from '../../hypixel' import { CleanPlayer } from '../player' import { Bank } from './bank' import { cleanVisitedZones, Zone } from './zones' +import { cleanCollections, Collection } from './collections' export interface CleanBasicMember { uuid: string @@ -27,6 +28,7 @@ export interface CleanMember extends CleanBasicMember { objectives: Objective[] skills: Skill[] visited_zones: Zone[] + collections: Collection[] } export async function cleanSkyBlockProfileMemberResponseBasic(member, included: Included[] = null): Promise { @@ -56,7 +58,8 @@ export async function cleanSkyBlockProfileMemberResponse(member, included: Inclu inventories: inventoriesIncluded ? await cleanInventories(member) : undefined, objectives: cleanObjectives(member), skills: cleanSkills(member), - visited_zones: cleanVisitedZones(member) + visited_zones: cleanVisitedZones(member), + collections: cleanCollections(member) } } -- cgit