From 27a8e89d7b9b9d9b12532b93369ff2f5b084b0a8 Mon Sep 17 00:00:00 2001 From: Taken Date: Thu, 4 Sep 2025 22:25:57 +0200 Subject: [PATCH] Finished uhc genereal stats --- .../(stats)/player/[ign]/_stats/uhc/stats.tsx | 33 +++++++++++ .../(stats)/player/[ign]/_stats/uhc/uhc.tsx | 9 ++- src/data/hypixel/uhc.ts | 16 +++--- src/lib/hypixel/uhc/general.ts | 55 +++++++++++++++++++ src/lib/schema/stats.ts | 36 +++++++++++- 5 files changed, 138 insertions(+), 11 deletions(-) create mode 100644 src/app/(stats)/player/[ign]/_stats/uhc/stats.tsx create mode 100644 src/lib/hypixel/uhc/general.ts diff --git a/src/app/(stats)/player/[ign]/_stats/uhc/stats.tsx b/src/app/(stats)/player/[ign]/_stats/uhc/stats.tsx new file mode 100644 index 0000000..04baf3d --- /dev/null +++ b/src/app/(stats)/player/[ign]/_stats/uhc/stats.tsx @@ -0,0 +1,33 @@ +import { formatNumber } from "@/lib/formatters" +import { devide } from "@/lib/hypixel/general" +import { getUhcStar } from "@/lib/hypixel/uhc/level" +import { NonNullStats } from "@/lib/schema/player" +import { BasicStat } from "../../_components/Stats" + +export default function UHCGeneralStats( + { stats, kills, deaths, wins, heads }: { stats: NonNullable, kills: number, deaths: number, wins: number, heads: number } +) { + const rank = getUhcStar(stats.score) + const kd = formatNumber(devide(kills, deaths)) + const kw = formatNumber(devide(kills, wins)) + return ( +
+
+ + + +
+
+ + + +
+
+ + + + +
+
+ ) +} diff --git a/src/app/(stats)/player/[ign]/_stats/uhc/uhc.tsx b/src/app/(stats)/player/[ign]/_stats/uhc/uhc.tsx index af6688c..7083d98 100644 --- a/src/app/(stats)/player/[ign]/_stats/uhc/uhc.tsx +++ b/src/app/(stats)/player/[ign]/_stats/uhc/uhc.tsx @@ -3,15 +3,18 @@ import { Card, CardContent } from "@/components/ui/card" import { Separator } from "@/components/ui/separator" import { formatNumber } from "@/lib/formatters" import { devide } from "@/lib/hypixel/general" +import { getStatsCombined } from "@/lib/hypixel/uhc/general" import { getUhcStarValue } from "@/lib/hypixel/uhc/level" import { NonNullStats } from "@/lib/schema/player" import CollapsedStats from "../../_components/CollapsedStats" import UHCProgress from "./progress" +import UHCGeneralStats from "./stats" export default function UHCStats({ stats }: { stats: NonNullStats["UHC"] }) { if (!stats) return null - const kd = formatNumber(devide(stats.kills, stats.deaths)) + const combined = getStatsCombined(stats) + const kd = formatNumber(devide(combined.kills, combined.deaths)) const star = getUhcStarValue(stats.score) return ( @@ -33,7 +36,7 @@ export default function UHCStats({ stats }: { stats: NonNullStats["UHC"] }) { }, { title:

Wins

, - stat:

{formatNumber(stats.wins)}

+ stat:

{formatNumber(combined.wins)}

} ]} /> @@ -42,6 +45,8 @@ export default function UHCStats({ stats }: { stats: NonNullStats["UHC"] }) { + + diff --git a/src/data/hypixel/uhc.ts b/src/data/hypixel/uhc.ts index d6ce0db..e4472a4 100644 --- a/src/data/hypixel/uhc.ts +++ b/src/data/hypixel/uhc.ts @@ -1,13 +1,13 @@ export const TITLE = "UHC" as const export const MODES = [ - { id: ["solo"], name: "Solo" }, - { id: [""], name: "Teams" }, - { id: ["red vs blue", "_red_vs_blue"], name: "Red vs. Blue" }, - { id: ["no diamonds", "_no_diamonds"], name: "No Diamonds" }, - { id: ["vanilla doubles", "_vanilla_doubles"], name: "Vanilla Doubles" }, - { id: ["brawl"], name: "Brawl" }, - { id: ["solo brawl", "_solo_brawl"], name: "Solo Brawl" }, - { id: ["duo brawl", "_duo_brawl"], name: "Duo Brawl" } + { id: "solo", name: "Solo" }, + { id: "", name: "Teams" }, + { id: "red_vs_blue", name: "Red vs. Blue" }, + { id: "no_diamonds", name: "No Diamonds" }, + { id: "vanilla_doubles", name: "Vanilla Doubles" }, + { id: "brawl", name: "Brawl" }, + { id: "solo_brawl", name: "Solo Brawl" }, + { id: "duo_brawl", name: "Duo Brawl" } ] as const export const STARS = [ { value: 0, name: "Recruit", color: "gray" }, diff --git a/src/lib/hypixel/uhc/general.ts b/src/lib/hypixel/uhc/general.ts new file mode 100644 index 0000000..39e676a --- /dev/null +++ b/src/lib/hypixel/uhc/general.ts @@ -0,0 +1,55 @@ +import { MODES } from "@/data/hypixel/uhc" +import { NonNullStats } from "@/lib/schema/player" + +export function getStatsCombined(stats: NonNullable) { + return { + wins: getUHCWins(stats), + kills: getUHCKills(stats), + deaths: getUHCDeaths(stats), + heads: getUHCHeads(stats) + } +} + +function getUHCWins(stats: NonNullable) { + let wins = 0 + const ids = MODES.filter(m => m.id !== "").map(m => m.id) + + for (const id of ids) { + wins = wins + stats[`wins_${id}`] + } + + return wins + stats.wins +} + +function getUHCKills(stats: NonNullable) { + let kills = 0 + const ids = MODES.filter(m => m.id !== "").map(m => m.id) + + for (const id of ids) { + kills = kills + stats[`kills_${id}`] + } + + return kills + stats.kills +} + +function getUHCDeaths(stats: NonNullable) { + let deaths = 0 + const ids = MODES.filter(m => m.id !== "").map(m => m.id) + + for (const id of ids) { + deaths = deaths + stats[`deaths_${id}`] + } + + return deaths + stats.deaths +} + +function getUHCHeads(stats: NonNullable) { + let heads = 0 + const ids = MODES.filter(m => m.id !== "").map(m => m.id) + + for (const id of ids) { + heads = heads + stats[`heads_eaten_${id}`] + } + + return heads + stats.heads_eaten +} diff --git a/src/lib/schema/stats.ts b/src/lib/schema/stats.ts index 09780bd..59cad22 100644 --- a/src/lib/schema/stats.ts +++ b/src/lib/schema/stats.ts @@ -405,9 +405,43 @@ export const buildBattleStatsSchema = z.looseObject({ wins_speed_builders_latest: z.number().default(0) }) +function uhcModesStats() { + const ids = [ + "solo", + "red_vs_blue", + "no_diamonds", + "vanilla_doubles", + "brawl", + "solo_brawl", + "duo_brawl" + ] as const + + const stats = [ + "wins", + "kills", + "deaths", + "heads_eaten" + ] as const + + const entries = new Map>() + + for (const id of ids) { + for (const stat of stats) { + entries.set(`${stat}_${id}`, z.number().default(0)) + } + } + + return Object.fromEntries(entries) as Record<`${typeof stats[number]}_${typeof ids[number]}`, z.ZodDefault> +} + export const uhcSchema = z.looseObject({ kills: z.number().default(0), deaths: z.number().default(0), wins: z.number().default(0), - score: z.number().default(0) + heads_eaten: z.number().default(0), + score: z.number().default(0), + coins: z.number().default(0), + ultimates_crafted: z.number().default(0), + ultimates_crafted_solo: z.number().default(0), + ...uhcModesStats() })