diff --git a/src/app/(stats)/player/[ign]/_stats/duels/table.tsx b/src/app/(stats)/player/[ign]/_stats/duels/table.tsx index 63ecf1c..fb5569e 100644 --- a/src/app/(stats)/player/[ign]/_stats/duels/table.tsx +++ b/src/app/(stats)/player/[ign]/_stats/duels/table.tsx @@ -8,9 +8,12 @@ export default function DuelsStatTable({ stats }: { stats: NonNullStats["Duels"] + + + @@ -20,14 +23,22 @@ export default function DuelsStatTable({ stats }: { stats: NonNullStats["Duels"] + + + + + + + +
) @@ -61,6 +72,40 @@ function DuelsTableHeader() { ) } +function Bedwars1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { + if (!stats) return null + + const modeStats = getDuelsModeStats("bedwars_two_one_duels", stats) + const title = getModeTitle("bedwars_two_one_duels") + + return ( + + {title} + I + {modeStats.map((v, i) => { + return {typeof v === "number" ? formatNumber(v) : v} + })} + + ) +} + +function Bedwars1v1RushStats({ stats }: { stats: NonNullStats["Duels"] }) { + if (!stats) return null + + const modeStats = getDuelsModeStats("bedwars_two_one_duels_rush", stats) + const title = getModeTitle("bedwars_two_one_duels_rush") + + return ( + + {title} + I + {modeStats.map((v, i) => { + return {typeof v === "number" ? formatNumber(v) : v} + })} + + ) +} + function UHC1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { if (!stats) return null @@ -112,6 +157,23 @@ function UHC4v4Stats({ stats }: { stats: NonNullStats["Duels"] }) { ) } +function UHCMeetupStats({ stats }: { stats: NonNullStats["Duels"] }) { + if (!stats) return null + + const modeStats = getDuelsModeStats("uhc_meetup", stats) + const title = getModeTitle("uhc_meetup") + + return ( + + {title} + I + {modeStats.map((v, i) => { + return {typeof v === "number" ? formatNumber(v) : v} + })} + + ) +} + function OP1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { if (!stats) return null @@ -265,6 +327,23 @@ function Sumo1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { ) } +function BowSpleef1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { + if (!stats) return null + + const modeStats = getDuelsModeStats("bowspleef_duel", stats) + const title = getModeTitle("bowspleef_duel") + + return ( + + {title} + I + {modeStats.map((v, i) => { + return {typeof v === "number" ? formatNumber(v) : v} + })} + + ) +} + function ParkourFFAStats({ stats }: { stats: NonNullStats["Duels"] }) { if (!stats) return null @@ -316,6 +395,57 @@ function Classic1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { ) } +function Classic2v2Stats({ stats }: { stats: NonNullStats["Duels"] }) { + if (!stats) return null + + const modeStats = getDuelsModeStats("classic_doubles", stats) + const title = getModeTitle("classic_doubles") + + return ( + + {title} + I + {modeStats.map((v, i) => { + return {typeof v === "number" ? formatNumber(v) : v} + })} + + ) +} + +function Potion1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { + if (!stats) return null + + const modeStats = getDuelsModeStats("potion_duel", stats) + const title = getModeTitle("potion_duel") + + return ( + + {title} + I + {modeStats.map((v, i) => { + return {typeof v === "number" ? formatNumber(v) : v} + })} + + ) +} + +function Combo1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { + if (!stats) return null + + const modeStats = getDuelsModeStats("combo_duel", stats) + const title = getModeTitle("combo_duel") + + return ( + + {title} + I + {modeStats.map((v, i) => { + return {typeof v === "number" ? formatNumber(v) : v} + })} + + ) +} + function Bridge1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { if (!stats) return null @@ -350,6 +480,23 @@ function Bridge2v2Stats({ stats }: { stats: NonNullStats["Duels"] }) { ) } +function Bridge3v3Stats({ stats }: { stats: NonNullStats["Duels"] }) { + if (!stats) return null + + const modeStats = getDuelsModeStats("bridge_threes", stats) + const title = getModeTitle("bridge_threes") + + return ( + + {title} + I + {modeStats.map((v, i) => { + return {typeof v === "number" ? formatNumber(v) : v} + })} + + ) +} + function Bridge4v4Stats({ stats }: { stats: NonNullStats["Duels"] }) { if (!stats) return null @@ -400,3 +547,54 @@ function Bridge3v3v3v3Stats({ stats }: { stats: NonNullStats["Duels"] }) { ) } + +function DuelArenaStats({ stats }: { stats: NonNullStats["Duels"] }) { + if (!stats) return null + + const modeStats = getDuelsModeStats("duel_arena", stats) + const title = getModeTitle("duel_arena") + + return ( + + {title} + I + {modeStats.map((v, i) => { + return {typeof v === "number" ? formatNumber(v) : v} + })} + + ) +} + +function Quake1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { + if (!stats) return null + + const modeStats = getDuelsModeStats("quake_duel", stats) + const title = getModeTitle("quake_duel") + + return ( + + {title} + I + {modeStats.map((v, i) => { + return {typeof v === "number" ? formatNumber(v) : v} + })} + + ) +} + +function Spleef1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { + if (!stats) return null + + const modeStats = getDuelsModeStats("spleef_duel", stats) + const title = getModeTitle("spleef_duel") + + return ( + + {title} + I + {modeStats.map((v, i) => { + return {typeof v === "number" ? formatNumber(v) : v} + })} + + ) +} diff --git a/src/data/hypixel/duels.ts b/src/data/hypixel/duels.ts index 0479610..33d2ea9 100644 --- a/src/data/hypixel/duels.ts +++ b/src/data/hypixel/duels.ts @@ -27,9 +27,11 @@ export const MODES = [ { id: "mw_doubles", divisionId: "mega_walls", name: "MegaWalls Doubles" }, { id: "sumo_duel", divisionId: "sumo", name: "Sumo 1v1" }, { id: "bowspleef_duel", divisionId: "tnt_games", name: "Bow Spleef 1v1" }, + { id: "spleef_duel", divisionId: "", name: "Spleef 1v1" }, { id: "parkour_eight", divisionId: "parkour", name: "Parkour FFA" }, { id: "boxing_duel", divisionId: "boxing", name: "Boxing 1v1" }, { id: "classic_duel", divisionId: "classic", name: "Classic 1v1" }, + { id: "classic_doubles", divisionId: "classic", name: "Classic 2v2" }, { id: "potion_duel", divisionId: "no_debuff", name: "NoDebuff 1v1" }, { id: "combo_duel", divisionId: "combo", name: "Combo 1v1" }, { id: "bridge_duel", divisionId: "bridge", name: "Bridge 1v1" }, @@ -38,6 +40,8 @@ export const MODES = [ { id: "bridge_four", divisionId: "bridge", name: "Bridge 4v4" }, { id: "bridge_2v2v2v2", divisionId: "bridge", name: "Bridge 2v2v2v2" }, { id: "bridge_3v3v3v3", divisionId: "bridge", name: "Bridge 3v3v3v3" }, - { id: "capture_threes", divisionId: "bridge", name: "Bridge CTF 3v3" }, - { id: "duel_arena", divisionId: "", name: "Duel Arena" } + { id: "duel_arena", divisionId: "", name: "Duel Arena" }, + { id: "quake_duel", divisionId: "quake", name: "Quakecraft 1v1" }, + { id: "bedwars_two_one_duels", divisionId: "bedwars", name: "Bedwars 1v1" }, + { id: "bedwars_two_one_duels_rush", divisionId: "bedwars", name: "Bedwars Rush 1v1" } ] as const diff --git a/src/lib/hypixel/duels/duels.ts b/src/lib/hypixel/duels/duels.ts index 9fef6a2..60028d6 100644 --- a/src/lib/hypixel/duels/duels.ts +++ b/src/lib/hypixel/duels/duels.ts @@ -74,8 +74,8 @@ export function getDuelsModeStats(mode: Mode, stats: NonNullable) { if (index.startsWith("bridge_")) { - const kills = (stats[`${index}_kills`] === undefined ? 0 : stats[`${index}_kills`]) + (stats[`${index}_bridge_kills`] as number) - const deaths = (stats[`${index}_deaths`] === undefined ? 0 : stats[`${index}_deaths`]) + (stats[`${index}_bridge_deaths`] as number) + const kills = (stats[`${index}_kills`] as number) + (stats[`${index}_bridge_kills`] as number) + const deaths = (stats[`${index}_deaths`] as number) + (stats[`${index}_bridge_deaths`] as number) return [ kills, diff --git a/src/lib/schema/stats.ts b/src/lib/schema/stats.ts index 0e90518..08af67d 100644 --- a/src/lib/schema/stats.ts +++ b/src/lib/schema/stats.ts @@ -183,26 +183,37 @@ function duelsModeStats() { "mw_doubles", "sumo_duel", "bowspleef_duel", + "spleef_duel", "parkour_eight", "boxing_duel", "classic_duel", + "classic_doubles", "potion_duel", "combo_duel", + "duel_arena", + "quake_duel", + "bedwars_two_one_duels", + "bedwars_two_one_duels_rush" + ] as const + + const bridgeIds = [ "bridge_duel", "bridge_doubles", "bridge_threes", "bridge_four", "bridge_2v2v2v2", - "bridge_3v3v3v3", - "capture_threes", - "duel_arena" + "bridge_3v3v3v3" + ] as const + + const bridgeStats = [ + "bridge_kills", + "bridge_deaths", + "goals" ] as const const stats = [ "kills", - "bridge_kills", "deaths", - "bridge_deaths", "wins", "losses", "melee_swings", @@ -210,8 +221,7 @@ function duelsModeStats() { "bow_shots", "bow_hits", "current_winstreak_mode", - "best_winstreak_mode", - "goals" + "best_winstreak_mode" ] as const const entries = new Map>() @@ -221,21 +231,6 @@ function duelsModeStats() { for (const id of ids) { for (const stat of stats) { - if (id.startsWith("bridge_")) { - if (stat === "goals") { - bridge.set(`${id}_${stat}`, z.number().default(0)) - } - - if (stat === "bridge_kills") { - bridge.set(`${id}_${stat}`, z.number().default(0)) - } - - if (stat === "bridge_deaths") { - bridge.set(`${id}_${stat}`, z.number().default(0)) - } - continue - } - if (stat === "current_winstreak_mode") { ws.set(`${stat}_${id}`, z.number().optional()) } else if (stat === "best_winstreak_mode") { @@ -246,15 +241,31 @@ function duelsModeStats() { } } + const combined = [...stats, ...bridgeStats] + for (const id of bridgeIds) { + for (const stat of combined) { + if (stat === "bridge_kills" || stat === "bridge_deaths" || stat === "goals") { + bridge.set(`${id}_${stat}`, z.number().default(0)) + } else if (stat === "best_winstreak_mode") { + ws.set(`${stat}_${id}`, z.number().optional()) + } else if (stat === "current_winstreak_mode") { + ws.set(`${stat}_${id}`, z.number().optional()) + } else { + entries.set(`${id}_${stat}`, z.number().default(0)) + } + } + } + type Modes = typeof ids[number] - type Stats = Exclude - type BridgeModes = Extract + type BridgeModes = typeof bridgeIds[number] + type Stats = Exclude + type BridgeStats = typeof bridgeStats[number] return { - all: Object.fromEntries(entries) as Record<`${Modes}_${Stats}`, z.ZodDefault>, - ws: Object.fromEntries(ws) as Record<`current_winstreak_mode_${Modes}`, z.ZodOptional>, - bestWs: Object.fromEntries(bestWs) as Record<`best_winstreak_mode_${Modes}`, z.ZodOptional>, - bridge: Object.fromEntries(bridge) as Record<`${BridgeModes}_goals`, z.ZodDefault> + all: Object.fromEntries(entries) as Record<`${Modes | BridgeModes}_${Stats}`, z.ZodDefault>, + ws: Object.fromEntries(ws) as Record<`current_winstreak_mode_${Modes | BridgeModes}`, z.ZodOptional>, + bestWs: Object.fromEntries(bestWs) as Record<`best_winstreak_mode_${Modes | BridgeModes}`, z.ZodOptional>, + bridge: Object.fromEntries(bridge) as Record<`${BridgeModes}_${BridgeStats}`, z.ZodDefault> } }