diff --git a/src/app/(stats)/player/[ign]/_stats/bedwars/bedwars-table.tsx b/src/app/(stats)/player/[ign]/_stats/bedwars/bedwars-table.tsx index 99596b4..230e71c 100644 --- a/src/app/(stats)/player/[ign]/_stats/bedwars/bedwars-table.tsx +++ b/src/app/(stats)/player/[ign]/_stats/bedwars/bedwars-table.tsx @@ -1,5 +1,6 @@ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { formatNumber } from "@/lib/formatters" +import { concatStatArrays } from "@/lib/funcs" import { _BedwarsStats, getBedwarsModeStats } from "@/lib/hypixel/bedwars" import { Player } from "@/lib/schema/player" @@ -27,6 +28,7 @@ export default function BedwarsStatTable({ stats }: { stats: Player["player"]["s + ) @@ -132,17 +134,7 @@ function CoreModeStats({ stats }: { stats: Player["player"]["stats"]["Bedwars"] const threesStats = getBedwarsModeStats("3s", stats as _BedwarsStats, true) const foursStats = getBedwarsModeStats("4s", stats as _BedwarsStats, true) - const fraction = [2, 5, 8] - - const combinedStats = soloStats.map((v, i) => { - if (v < 0) return "?" - - if (fraction.includes(i) || i === soloStats.length - 1) { - return ((v + doublesStats[i] + threesStats[i] + foursStats[i]) / 4).toFixed(2) - } - - return v + doublesStats[i] + threesStats[i] + foursStats[i] - }) + const combinedStats = concatStatArrays(soloStats, doublesStats, threesStats, foursStats) return ( @@ -363,3 +355,54 @@ function CastleStats({ stats }: { stats: Player["player"]["stats"]["Bedwars"] }) ) } + +function AllModeStats({ stats }: { stats: Player["player"]["stats"]["Bedwars"] }) { + const soloStats = getBedwarsModeStats("solo", stats as _BedwarsStats, true) + const doublesStats = getBedwarsModeStats("doubles", stats as _BedwarsStats, true) + const threesStats = getBedwarsModeStats("3s", stats as _BedwarsStats, true) + const foursStats = getBedwarsModeStats("4s", stats as _BedwarsStats, true) + const fourVFourStats = getBedwarsModeStats("4v4", stats as _BedwarsStats, true) + const rushDoublesStats = getBedwarsModeStats("rush_2s", stats as _BedwarsStats, true) + const rush4sStats = getBedwarsModeStats("rush_4s", stats as _BedwarsStats, true) + const ultimateDoublesStats = getBedwarsModeStats("ultimate_2s", stats as _BedwarsStats, true) + const ultimate4sStats = getBedwarsModeStats("ultimate_4s", stats as _BedwarsStats, true) + const luckyDoublesStats = getBedwarsModeStats("lucky_2s", stats as _BedwarsStats, true) + const lucky4sStats = getBedwarsModeStats("lucky_4s", stats as _BedwarsStats, true) + const voidlessDoublesStats = getBedwarsModeStats("voidless_2s", stats as _BedwarsStats, true) + const voidless4sStats = getBedwarsModeStats("voidless_4s", stats as _BedwarsStats, true) + const armedDoublesStats = getBedwarsModeStats("armed_2s", stats as _BedwarsStats, true) + const armed4sStats = getBedwarsModeStats("armed_4s", stats as _BedwarsStats, true) + const swap4sStats = getBedwarsModeStats("swap_4s", stats as _BedwarsStats, true) + const underworld4sStats = getBedwarsModeStats("underworld_4s", stats as _BedwarsStats, true) + const castleStats = getBedwarsModeStats("castle", stats as _BedwarsStats, true) + + const finalStats = concatStatArrays( + soloStats, + doublesStats, + threesStats, + foursStats, + fourVFourStats, + rushDoublesStats, + rush4sStats, + ultimateDoublesStats, + ultimate4sStats, + luckyDoublesStats, + lucky4sStats, + voidlessDoublesStats, + voidless4sStats, + armedDoublesStats, + armed4sStats, + swap4sStats, + underworld4sStats, + castleStats + ) + + return ( + + All Modes + {finalStats.map((v, i) => { + return {typeof v === "number" ? formatNumber(v) : v} + })} + + ) +} diff --git a/src/lib/funcs.ts b/src/lib/funcs.ts new file mode 100644 index 0000000..ac15ba1 --- /dev/null +++ b/src/lib/funcs.ts @@ -0,0 +1,17 @@ +export function concatStatArrays(...arrays: number[][]) { + if (arrays.length === 0) return [] + + const indexes = [2, 5, 8] + + const result = arrays[0].map((v, index) => { + if (v < 0) return "?" + + if (indexes.includes(index) || index === arrays[0].length - 1) { + return arrays.reduce((sum, array) => sum + array[index], 0) / arrays.length + } + + return arrays.reduce((sum, array) => sum + array[index], 0) + }) + + return result +} diff --git a/src/lib/hypixel/bedwars.ts b/src/lib/hypixel/bedwars.ts index b0003f6..c733db5 100644 --- a/src/lib/hypixel/bedwars.ts +++ b/src/lib/hypixel/bedwars.ts @@ -127,38 +127,44 @@ export function getBedwarsModeStats(mode: Mode, stats: _BedwarsStats, raw = fals } } +function devide(num: number, num2: number) { + if (num2 === 0) return num + + return num / num2 +} + function bedwarsModeStats(prefix: string, stats: _BedwarsStats, raw = false) { if (raw) { return [ stats[`${prefix}_kills_bedwars`], stats[`${prefix}_deaths_bedwars`], - stats[`${prefix}_kills_bedwars`] / stats[`${prefix}_deaths_bedwars`], + devide(stats[`${prefix}_kills_bedwars`], stats[`${prefix}_deaths_bedwars`]), stats[`${prefix}_final_kills_bedwars`], stats[`${prefix}_final_deaths_bedwars`], - stats[`${prefix}_final_kills_bedwars`] / stats[`${prefix}_final_deaths_bedwars`], + devide(stats[`${prefix}_final_kills_bedwars`], stats[`${prefix}_final_deaths_bedwars`]), stats[`${prefix}_wins_bedwars`], stats[`${prefix}_losses_bedwars`], - stats[`${prefix}_wins_bedwars`] / stats[`${prefix}_losses_bedwars`], + devide(stats[`${prefix}_wins_bedwars`], stats[`${prefix}_losses_bedwars`]), stats[`${prefix}_winstreak`] ?? -1, stats[`${prefix}_beds_broken_bedwars`], stats[`${prefix}_beds_lost_bedwars`], - stats[`${prefix}_beds_broken_bedwars`] / stats[`${prefix}_beds_lost_bedwars`] + devide(stats[`${prefix}_beds_broken_bedwars`], stats[`${prefix}_beds_lost_bedwars`]) ] } return [ stats[`${prefix}_kills_bedwars`], stats[`${prefix}_deaths_bedwars`], - (stats[`${prefix}_kills_bedwars`] / stats[`${prefix}_deaths_bedwars`]).toFixed(2), + devide(stats[`${prefix}_kills_bedwars`], stats[`${prefix}_deaths_bedwars`]).toFixed(2), stats[`${prefix}_final_kills_bedwars`], stats[`${prefix}_final_deaths_bedwars`], - (stats[`${prefix}_final_kills_bedwars`] / stats[`${prefix}_final_deaths_bedwars`]).toFixed(2), + devide(stats[`${prefix}_final_kills_bedwars`], stats[`${prefix}_final_deaths_bedwars`]).toFixed(2), stats[`${prefix}_wins_bedwars`], stats[`${prefix}_losses_bedwars`], - (stats[`${prefix}_wins_bedwars`] / stats[`${prefix}_losses_bedwars`]).toFixed(2), + devide(stats[`${prefix}_wins_bedwars`], stats[`${prefix}_losses_bedwars`]).toFixed(2), stats[`${prefix}_winstreak`] ?? "?", stats[`${prefix}_beds_broken_bedwars`], stats[`${prefix}_beds_lost_bedwars`], - (stats[`${prefix}_beds_broken_bedwars`] / stats[`${prefix}_beds_lost_bedwars`]).toFixed(2) + devide(stats[`${prefix}_beds_broken_bedwars`], stats[`${prefix}_beds_lost_bedwars`]).toFixed(2) ] } diff --git a/src/lib/schema/player.ts b/src/lib/schema/player.ts index 02ad2c3..b6780de 100644 --- a/src/lib/schema/player.ts +++ b/src/lib/schema/player.ts @@ -36,7 +36,169 @@ export const playerSchema = z.looseObject({ total_tickets_earned: z.number(), doublers: z.number(), room: z.record(z.string(), z.boolean()) - }).optional() + }).optional(), + eight_one_winstreak: z.number().optional(), + eight_one_kills_bedwars: z.number().default(0), + eight_one_deaths_bedwars: z.number().default(0), + eight_one_final_kills_bedwars: z.number().default(0), + eight_one_final_deaths_bedwars: z.number().default(0), + eight_one_wins_bedwars: z.number().default(0), + eight_one_losses_bedwars: z.number().default(0), + eight_one_beds_broken_bedwars: z.number().default(0), + eight_one_beds_lost_bedwars: z.number().default(0), + eight_two_winstreak: z.number().optional(), + eight_two_kills_bedwars: z.number().default(0), + eight_two_deaths_bedwars: z.number().default(0), + eight_two_final_kills_bedwars: z.number().default(0), + eight_two_final_deaths_bedwars: z.number().default(0), + eight_two_wins_bedwars: z.number().default(0), + eight_two_losses_bedwars: z.number().default(0), + eight_two_beds_broken_bedwars: z.number().default(0), + eight_two_beds_lost_bedwars: z.number().default(0), + four_three_winstreak: z.number().optional(), + four_three_kills_bedwars: z.number().default(0), + four_three_deaths_bedwars: z.number().default(0), + four_three_final_kills_bedwars: z.number().default(0), + four_three_final_deaths_bedwars: z.number().default(0), + four_three_wins_bedwars: z.number().default(0), + four_three_losses_bedwars: z.number().default(0), + four_three_beds_broken_bedwars: z.number().default(0), + four_three_beds_lost_bedwars: z.number().default(0), + four_four_winstreak: z.number().optional(), + four_four_kills_bedwars: z.number().default(0), + four_four_deaths_bedwars: z.number().default(0), + four_four_final_kills_bedwars: z.number().default(0), + four_four_final_deaths_bedwars: z.number().default(0), + four_four_wins_bedwars: z.number().default(0), + four_four_losses_bedwars: z.number().default(0), + four_four_beds_broken_bedwars: z.number().default(0), + four_four_beds_lost_bedwars: z.number().default(0), + two_four_winstreak: z.number().optional(), + two_four_kills_bedwars: z.number().default(0), + two_four_deaths_bedwars: z.number().default(0), + two_four_final_kills_bedwars: z.number().default(0), + two_four_final_deaths_bedwars: z.number().default(0), + two_four_wins_bedwars: z.number().default(0), + two_four_losses_bedwars: z.number().default(0), + two_four_beds_broken_bedwars: z.number().default(0), + two_four_beds_lost_bedwars: z.number().default(0), + eight_two_rush_winstreak: z.number().optional(), + eight_two_rush_kills_bedwars: z.number().default(0), + eight_two_rush_deaths_bedwars: z.number().default(0), + eight_two_rush_final_kills_bedwars: z.number().default(0), + eight_two_rush_final_deaths_bedwars: z.number().default(0), + eight_two_rush_wins_bedwars: z.number().default(0), + eight_two_rush_losses_bedwars: z.number().default(0), + eight_two_rush_beds_broken_bedwars: z.number().default(0), + eight_two_rush_beds_lost_bedwars: z.number().default(0), + four_four_rush_winstreak: z.number().optional(), + four_four_rush_kills_bedwars: z.number().default(0), + four_four_rush_deaths_bedwars: z.number().default(0), + four_four_rush_final_kills_bedwars: z.number().default(0), + four_four_rush_final_deaths_bedwars: z.number().default(0), + four_four_rush_wins_bedwars: z.number().default(0), + four_four_rush_losses_bedwars: z.number().default(0), + four_four_rush_beds_broken_bedwars: z.number().default(0), + four_four_rush_beds_lost_bedwars: z.number().default(0), + eight_two_ultimate_winstreak: z.number().optional(), + eight_two_ultimate_kills_bedwars: z.number().default(0), + eight_two_ultimate_deaths_bedwars: z.number().default(0), + eight_two_ultimate_final_kills_bedwars: z.number().default(0), + eight_two_ultimate_final_deaths_bedwars: z.number().default(0), + eight_two_ultimate_wins_bedwars: z.number().default(0), + eight_two_ultimate_losses_bedwars: z.number().default(0), + eight_two_ultimate_beds_broken_bedwars: z.number().default(0), + eight_two_ultimate_beds_lost_bedwars: z.number().default(0), + four_four_ultimate_winstreak: z.number().optional(), + four_four_ultimate_kills_bedwars: z.number().default(0), + four_four_ultimate_deaths_bedwars: z.number().default(0), + four_four_ultimate_final_kills_bedwars: z.number().default(0), + four_four_ultimate_final_deaths_bedwars: z.number().default(0), + four_four_ultimate_wins_bedwars: z.number().default(0), + four_four_ultimate_losses_bedwars: z.number().default(0), + four_four_ultimate_beds_broken_bedwars: z.number().default(0), + four_four_ultimate_beds_lost_bedwars: z.number().default(0), + eight_two_lucky_winstreak: z.number().optional(), + eight_two_lucky_kills_bedwars: z.number().default(0), + eight_two_lucky_deaths_bedwars: z.number().default(0), + eight_two_lucky_final_kills_bedwars: z.number().default(0), + eight_two_lucky_final_deaths_bedwars: z.number().default(0), + eight_two_lucky_wins_bedwars: z.number().default(0), + eight_two_lucky_losses_bedwars: z.number().default(0), + eight_two_lucky_beds_broken_bedwars: z.number().default(0), + eight_two_lucky_beds_lost_bedwars: z.number().default(0), + four_four_lucky_winstreak: z.number().optional(), + four_four_lucky_kills_bedwars: z.number().default(0), + four_four_lucky_deaths_bedwars: z.number().default(0), + four_four_lucky_final_kills_bedwars: z.number().default(0), + four_four_lucky_final_deaths_bedwars: z.number().default(0), + four_four_lucky_wins_bedwars: z.number().default(0), + four_four_lucky_losses_bedwars: z.number().default(0), + four_four_lucky_beds_broken_bedwars: z.number().default(0), + four_four_lucky_beds_lost_bedwars: z.number().default(0), + eight_two_voidless_winstreak: z.number().optional(), + eight_two_voidless_kills_bedwars: z.number().default(0), + eight_two_voidless_deaths_bedwars: z.number().default(0), + eight_two_voidless_final_kills_bedwars: z.number().default(0), + eight_two_voidless_final_deaths_bedwars: z.number().default(0), + eight_two_voidless_wins_bedwars: z.number().default(0), + eight_two_voidless_losses_bedwars: z.number().default(0), + eight_two_voidless_beds_broken_bedwars: z.number().default(0), + eight_two_voidless_beds_lost_bedwars: z.number().default(0), + four_four_voidless_winstreak: z.number().optional(), + four_four_voidless_kills_bedwars: z.number().default(0), + four_four_voidless_deaths_bedwars: z.number().default(0), + four_four_voidless_final_kills_bedwars: z.number().default(0), + four_four_voidless_final_deaths_bedwars: z.number().default(0), + four_four_voidless_wins_bedwars: z.number().default(0), + four_four_voidless_losses_bedwars: z.number().default(0), + four_four_voidless_beds_broken_bedwars: z.number().default(0), + four_four_voidless_beds_lost_bedwars: z.number().default(0), + eight_two_armed_winstreak: z.number().optional(), + eight_two_armed_kills_bedwars: z.number().default(0), + eight_two_armed_deaths_bedwars: z.number().default(0), + eight_two_armed_final_kills_bedwars: z.number().default(0), + eight_two_armed_final_deaths_bedwars: z.number().default(0), + eight_two_armed_wins_bedwars: z.number().default(0), + eight_two_armed_losses_bedwars: z.number().default(0), + eight_two_armed_beds_broken_bedwars: z.number().default(0), + eight_two_armed_beds_lost_bedwars: z.number().default(0), + four_four_armed_winstreak: z.number().optional(), + four_four_armed_kills_bedwars: z.number().default(0), + four_four_armed_deaths_bedwars: z.number().default(0), + four_four_armed_final_kills_bedwars: z.number().default(0), + four_four_armed_final_deaths_bedwars: z.number().default(0), + four_four_armed_wins_bedwars: z.number().default(0), + four_four_armed_losses_bedwars: z.number().default(0), + four_four_armed_beds_broken_bedwars: z.number().default(0), + four_four_armed_beds_lost_bedwars: z.number().default(0), + four_four_swap_winstreak: z.number().optional(), + four_four_swap_kills_bedwars: z.number().default(0), + four_four_swap_deaths_bedwars: z.number().default(0), + four_four_swap_final_kills_bedwars: z.number().default(0), + four_four_swap_final_deaths_bedwars: z.number().default(0), + four_four_swap_wins_bedwars: z.number().default(0), + four_four_swap_losses_bedwars: z.number().default(0), + four_four_swap_beds_broken_bedwars: z.number().default(0), + four_four_swap_beds_lost_bedwars: z.number().default(0), + four_four_underworld_winstreak: z.number().optional(), + four_four_underworld_kills_bedwars: z.number().default(0), + four_four_underworld_deaths_bedwars: z.number().default(0), + four_four_underworld_final_kills_bedwars: z.number().default(0), + four_four_underworld_final_deaths_bedwars: z.number().default(0), + four_four_underworld_wins_bedwars: z.number().default(0), + four_four_underworld_losses_bedwars: z.number().default(0), + four_four_underworld_beds_broken_bedwars: z.number().default(0), + four_four_underworld_beds_lost_bedwars: z.number().default(0), + castle_winstreak: z.number().optional(), + castle_kills_bedwars: z.number().default(0), + castle_deaths_bedwars: z.number().default(0), + castle_final_kills_bedwars: z.number().default(0), + castle_final_deaths_bedwars: z.number().default(0), + castle_wins_bedwars: z.number().default(0), + castle_losses_bedwars: z.number().default(0), + castle_beds_broken_bedwars: z.number().default(0), + castle_beds_lost_bedwars: z.number().default(0) }).optional() }), quests: z.record(