diff --git a/src/lib/server/constants/mining.ts b/src/lib/server/constants/mining.ts index e0c12b199..872ae0cc3 100644 --- a/src/lib/server/constants/mining.ts +++ b/src/lib/server/constants/mining.ts @@ -2056,3 +2056,12 @@ export const FORGE = { SKELETON_KEY: { name: "Skeleton Key", duration: 1800000 }, PORTABLE_CAMPFIRE: { name: "Portable Campfire", duration: 1800000 } } as Record; + +export const FOSSILS = ["CLAW", "SPINE", "CLUBBED", "UGLY", "HELIX", "FOOTPRINT", "WEBBED", "TUSK"]; + +export const CORPSES = { + lapis: "/api/item/LAPIS_ARMOR_HELMET", + umber: "/api/item/ARMOR_OF_YOG_HELMET", + tungsten: "/api/item/MINERAL_HELMET", + vanguard: "/api/item/VANGUARD_HELMET" +} as Record; diff --git a/src/lib/server/stats/mining.ts b/src/lib/server/stats/mining.ts index ab722e8a6..97d93e8ad 100644 --- a/src/lib/server/stats/mining.ts +++ b/src/lib/server/stats/mining.ts @@ -1,24 +1,20 @@ import * as constants from "$lib/server/constants/constants"; +import * as helper from "$lib/server/helper"; import { getLevelByXp } from "$lib/server/stats/leveling/leveling"; import type { Member } from "$types/global"; import type { Player } from "$types/raw/player/lib"; import { getHotmItems } from "./hotm"; import { stripItems } from "./items/stripping"; -/** - * @param {number} hotmTier - * @param {number} potmTier - * @returns {number} - */ export function calcHotmTokens(hotmTier: number, potmTier: number) { let tokens = 0; for (let tier = 1; tier <= hotmTier; tier++) { - tokens += constants.HOTM.rewards.hotm[tier]?.token_of_the_mountain || 0; + tokens += constants.HOTM.rewards.hotm[tier]?.token_of_the_mountain ?? 0; } for (let tier = 1; tier <= potmTier; tier++) { - tokens += (constants.HOTM.rewards.potm[tier]?.token_of_the_mountain || 0) as number; + tokens += (constants.HOTM.rewards.potm[tier]?.token_of_the_mountain ?? 0) as number; } return tokens; @@ -72,6 +68,34 @@ function getForge(userProfile: Member) { return output; } +function getGlaciteTunnels(userProfile: Member) { + const glaciteData = userProfile.glacite_player_data ?? {}; + const corpseIds = Object.keys(constants.CORPSES); + + return { + mineshaftsEntered: glaciteData.mineshafts_entered ?? 0, + fossilDust: glaciteData.fossil_dust ?? 0, + corpses: { + found: corpseIds.reduce((acc, corpse) => acc + (glaciteData.corpses_looted?.[corpse] ?? 0), 0), + max: corpseIds.length, + corpses: corpseIds.map((corpse) => ({ + name: helper.titleCase(corpse), + amount: glaciteData.corpses_looted?.[corpse] ?? 0, + texture_path: constants.CORPSES[corpse] + })) + }, + fossils: { + found: (glaciteData.fossils_donated ?? []).length, + max: constants.FOSSILS.length, + fossils: constants.FOSSILS.map((fossil) => ({ + name: helper.titleCase(fossil), + found: (glaciteData.fossils_donated ?? []).includes(fossil), + texture_path: `/api/item/${fossil === "HELIX" ? fossil : `${fossil}_FOSSIL`}` + })) + } + }; +} + export function getMining(userProfile: Member, player: Player, packs: string[]) { const HOTM = getLevelByXp(userProfile.mining_core?.experience, { type: "hotm" }); const totalTokens = calcHotmTokens(HOTM.level, userProfile.mining_core?.nodes?.special_0 ?? 0); @@ -96,7 +120,7 @@ export function getMining(userProfile: Member, player: Player, packs: string[]) }, commissions: { milestone: getCommissionMilestone(userProfile), - completions: player.achievements.skyblock_hard_working_miner || 0 + completions: player.achievements?.skyblock_hard_working_miner ?? 0 }, crystalHollows: { crystalHollowsLastAccess: userProfile.mining_core?.greater_mines_last_access, @@ -121,6 +145,7 @@ export function getMining(userProfile: Member, player: Player, packs: string[]) } }, forge: getForge(userProfile), - hotm: stripItems(getHotmItems(userProfile, packs)) + hotm: stripItems(getHotmItems(userProfile, packs)), + glaciteTunnels: getGlaciteTunnels(userProfile) }; } diff --git a/src/lib/types/processed/profile/mining.d.ts b/src/lib/types/processed/profile/mining.d.ts index efb589445..b169149d5 100644 --- a/src/lib/types/processed/profile/mining.d.ts +++ b/src/lib/types/processed/profile/mining.d.ts @@ -88,4 +88,24 @@ export type MiningStats = { }; forge: ForgeItem[]; hotm: ProcessedItem[]; + glaciteTunnels: { + mineshaftsEntered: number; + fossilDust: number; + corpses: { + found: number; + corpses: { + name: string; + amount: number; + texture_path: string; + }[]; + }; + fossils: { + found: number; + fossils: { + name: string; + found: boolean; + texture_path: string; + }[]; + }; + }; }; diff --git a/src/lib/types/raw/profile/lib.d.ts b/src/lib/types/raw/profile/lib.d.ts index eff5441bf..de77387a6 100644 --- a/src/lib/types/raw/profile/lib.d.ts +++ b/src/lib/types/raw/profile/lib.d.ts @@ -64,6 +64,7 @@ export type Member = { confirmed: boolean; }; garden_player_data?: MemberGardenData; + glacite_player_data: GlacitePlayerData; }; export type Medal = "gold" | "silver" | "bronze"; @@ -467,3 +468,10 @@ export type AccessoryBagStorage = { export type MemberGardenData = { copper?: number; }; + +export type GlacitePlayerData = { + fossils_donated: string[]; + fossil_dust: number; + corpses_looted: Record; + mineshafts_entered: number; +};