Added speed uhc mode table stats
This commit is contained in:
@@ -94,7 +94,7 @@ export function PlayerStats(
|
|||||||
"woolgames": <WoolGamesStats stats={stats.WoolGames} />,
|
"woolgames": <WoolGamesStats stats={stats.WoolGames} />,
|
||||||
"blitz": <BlitzStats stats={stats.Blitz} />,
|
"blitz": <BlitzStats stats={stats.Blitz} />,
|
||||||
"arcade": <ArcadeStats stats={stats.Arcade} />,
|
"arcade": <ArcadeStats stats={stats.Arcade} />,
|
||||||
"speeduhc": <SpeedUHCStats stats={stats.SpeedUHC} />
|
"speeduhc": <SpeedUHCStats stats={stats.SpeedUHC} uhcCoins={stats.UHC?.coins} />
|
||||||
} as const
|
} as const
|
||||||
|
|
||||||
const defaultOrder = Object.keys(statsComponents)
|
const defaultOrder = Object.keys(statsComponents)
|
||||||
|
|||||||
@@ -5,8 +5,10 @@ import { getSpeedUHCStar } from "@/lib/hypixel/speeduhc/general"
|
|||||||
import { NonNullStats } from "@/lib/schema/player"
|
import { NonNullStats } from "@/lib/schema/player"
|
||||||
import GeneralStats from "../GeneralStats"
|
import GeneralStats from "../GeneralStats"
|
||||||
import SpeedUHCProgress from "./progress"
|
import SpeedUHCProgress from "./progress"
|
||||||
|
import SpeedUHCGeneralStats from "./stats"
|
||||||
|
import { SpeedUHCModeStatsTable } from "./table"
|
||||||
|
|
||||||
export default function SpeedUHCStats({ stats }: { stats: NonNullStats["SpeedUHC"] }) {
|
export default function SpeedUHCStats({ stats, uhcCoins }: { stats: NonNullStats["SpeedUHC"], uhcCoins: number | undefined }) {
|
||||||
if (!stats) return null
|
if (!stats) return null
|
||||||
|
|
||||||
const kd = formatNumber(devide(stats.kills, stats.deaths))
|
const kd = formatNumber(devide(stats.kills, stats.deaths))
|
||||||
@@ -38,6 +40,11 @@ export default function SpeedUHCStats({ stats }: { stats: NonNullStats["SpeedUHC
|
|||||||
>
|
>
|
||||||
<Separator className="my-4" />
|
<Separator className="my-4" />
|
||||||
<SpeedUHCProgress level={Math.floor(star)} score={stats.score} />
|
<SpeedUHCProgress level={Math.floor(star)} score={stats.score} />
|
||||||
|
<Separator className="my-4" />
|
||||||
|
<SpeedUHCGeneralStats stats={stats} uhcCoins={uhcCoins} />
|
||||||
|
<Separator className="my-4" />
|
||||||
|
<SpeedUHCModeStatsTable stats={stats} />
|
||||||
|
<Separator className="my-4" />
|
||||||
</GeneralStats>
|
</GeneralStats>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
32
src/app/(stats)/player/[ign]/_stats/speeduhc/stats.tsx
Normal file
32
src/app/(stats)/player/[ign]/_stats/speeduhc/stats.tsx
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import { formatNumber } from "@/lib/formatters"
|
||||||
|
import { devide } from "@/lib/hypixel/general"
|
||||||
|
import { getSpeedUHCStar, getSpeedUHCTitle } from "@/lib/hypixel/speeduhc/general"
|
||||||
|
import { NonNullStats } from "@/lib/schema/player"
|
||||||
|
import { BasicStat } from "../../_components/Stats"
|
||||||
|
|
||||||
|
export default function SpeedUHCGeneralStats({ stats, uhcCoins }: { stats: NonNullable<NonNullStats["SpeedUHC"]>, uhcCoins: number | undefined }) {
|
||||||
|
const star = getSpeedUHCStar(stats.score)
|
||||||
|
const currentTitle = getSpeedUHCTitle(Math.floor(star))
|
||||||
|
const kd = formatNumber(devide(stats.kills, stats.deaths))
|
||||||
|
const wl = formatNumber(devide(stats.wins, stats.losses))
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="flex">
|
||||||
|
<div className="flex-1">
|
||||||
|
<BasicStat title="Score: " value={formatNumber(stats.score)} />
|
||||||
|
<BasicStat title="Title: " value={currentTitle} className="text-mc-white" />
|
||||||
|
<BasicStat title="Coins: " value={formatNumber(uhcCoins ?? 0)} className="text-mc-gold" />
|
||||||
|
</div>
|
||||||
|
<div className="flex-1">
|
||||||
|
<BasicStat title="Kills: " value={formatNumber(stats.kills)} />
|
||||||
|
<BasicStat title="Deaths: " value={formatNumber(stats.deaths)} />
|
||||||
|
<BasicStat title="Kill/Death Ratio: " value={kd} />
|
||||||
|
</div>
|
||||||
|
<div className="flex-1">
|
||||||
|
<BasicStat title="Wins: " value={formatNumber(stats.wins)} />
|
||||||
|
<BasicStat title="Losses: " value={formatNumber(stats.losses)} />
|
||||||
|
<BasicStat title="Win/Loss Ratio: " value={wl} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
57
src/app/(stats)/player/[ign]/_stats/speeduhc/table.tsx
Normal file
57
src/app/(stats)/player/[ign]/_stats/speeduhc/table.tsx
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
|
||||||
|
import { formatNumber } from "@/lib/formatters"
|
||||||
|
import { getSpeedUHCBestMode, getSpeedUHCModeName, getSpeedUHCModeStats } from "@/lib/hypixel/speeduhc/general"
|
||||||
|
import { NonNullStats } from "@/lib/schema/player"
|
||||||
|
import { cn } from "@/lib/utils"
|
||||||
|
|
||||||
|
export function SpeedUHCModeStatsTable({ stats }: { stats: NonNullable<NonNullStats["SpeedUHC"]> }) {
|
||||||
|
return (
|
||||||
|
<Table>
|
||||||
|
<SpeedUHCModeStatsTableHeader />
|
||||||
|
<TableBody>
|
||||||
|
<SpeedUHCStatRow modeId="solo_normal" stats={stats} />
|
||||||
|
<SpeedUHCStatRow modeId="solo_insane" stats={stats} />
|
||||||
|
<SpeedUHCStatRow modeId="team_normal" stats={stats} />
|
||||||
|
<SpeedUHCStatRow modeId="team_insane" stats={stats} />
|
||||||
|
<SpeedUHCStatRow modeId="all_modes" stats={stats} />
|
||||||
|
</TableBody>
|
||||||
|
</Table>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function SpeedUHCStatRow({ modeId, stats }: { modeId: Parameters<typeof getSpeedUHCModeStats>[0], stats: NonNullable<NonNullStats["SpeedUHC"]> }) {
|
||||||
|
const modeStats = getSpeedUHCModeStats(modeId, stats)
|
||||||
|
const modeName = getSpeedUHCModeName(modeId)
|
||||||
|
const isBest = getSpeedUHCBestMode(stats) === modeId
|
||||||
|
|
||||||
|
return (
|
||||||
|
<TableRow className={cn(isBest && "text-mc-light-purple")}>
|
||||||
|
<TableCell>{modeName}</TableCell>
|
||||||
|
{modeStats.map((v, i) => {
|
||||||
|
return <TableCell key={i}>{formatNumber(v)}</TableCell>
|
||||||
|
})}
|
||||||
|
</TableRow>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function SpeedUHCModeStatsTableHeader() {
|
||||||
|
const headerElements = [
|
||||||
|
"Mode",
|
||||||
|
"Kills",
|
||||||
|
"Deaths",
|
||||||
|
"KD",
|
||||||
|
"Wins",
|
||||||
|
"Losses",
|
||||||
|
"WL"
|
||||||
|
]
|
||||||
|
|
||||||
|
return (
|
||||||
|
<TableHeader>
|
||||||
|
<TableRow>
|
||||||
|
{headerElements.map((v, i) => {
|
||||||
|
return <TableHead key={i} className="font-bold">{v}</TableHead>
|
||||||
|
})}
|
||||||
|
</TableRow>
|
||||||
|
</TableHeader>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -1,4 +1,68 @@
|
|||||||
import { TITLES } from "@/data/hypixel/speeduhc"
|
import { MODES, TITLES } from "@/data/hypixel/speeduhc"
|
||||||
|
import { NonNullStats } from "@/lib/schema/player"
|
||||||
|
import { devide } from "../general"
|
||||||
|
|
||||||
|
export function getSpeedUHCModeName(modeId: Exclude<typeof MODES[number]["id"], ""> | "all_modes") {
|
||||||
|
if (modeId === "all_modes") {
|
||||||
|
return MODES.find(m => m.id === "")!.name
|
||||||
|
}
|
||||||
|
|
||||||
|
return MODES.find(m => m.id === modeId)!.name
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getSpeedUHCBestMode(stats: NonNullable<NonNullStats["SpeedUHC"]>) {
|
||||||
|
let bestMode: typeof MODES[number]["id"] | null = null
|
||||||
|
let maxGames = 0
|
||||||
|
|
||||||
|
for (const mode of MODES) {
|
||||||
|
if (mode.id === "") continue
|
||||||
|
|
||||||
|
const wins = stats[`wins_${mode.id}`]
|
||||||
|
const losses = stats[`losses_${mode.id}`]
|
||||||
|
const totalGames = wins + losses
|
||||||
|
|
||||||
|
if (totalGames > maxGames) {
|
||||||
|
maxGames = totalGames
|
||||||
|
bestMode = mode.id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return bestMode
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getSpeedUHCModeStats(modeId: Exclude<typeof MODES[number]["id"], ""> | "all_modes", stats: NonNullable<NonNullStats["SpeedUHC"]>) {
|
||||||
|
if (modeId === "all_modes") {
|
||||||
|
const bestMode = getSpeedUHCBestMode(stats)
|
||||||
|
if (!bestMode) {
|
||||||
|
return [
|
||||||
|
stats.kills,
|
||||||
|
stats.deaths,
|
||||||
|
devide(stats.kills, stats.deaths),
|
||||||
|
stats.wins,
|
||||||
|
stats.losses,
|
||||||
|
devide(stats.wins, stats.losses)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
stats[`kills_${bestMode}`],
|
||||||
|
stats[`deaths_${bestMode}`],
|
||||||
|
devide(stats[`kills_${bestMode}`], stats[`deaths_${bestMode}`]),
|
||||||
|
stats[`wins_${bestMode}`],
|
||||||
|
stats[`losses_${bestMode}`],
|
||||||
|
devide(stats[`wins_${bestMode}`], stats[`losses_${bestMode}`])
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
stats[`kills_${modeId}`],
|
||||||
|
stats[`deaths_${modeId}`],
|
||||||
|
devide(stats[`kills_${modeId}`], stats[`deaths_${modeId}`]),
|
||||||
|
stats[`wins_${modeId}`],
|
||||||
|
stats[`losses_${modeId}`],
|
||||||
|
devide(stats[`wins_${modeId}`], stats[`losses_${modeId}`])
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
export function getSpeedUHCStar(score: number) {
|
export function getSpeedUHCStar(score: number) {
|
||||||
for (let i = 0; i < TITLES.length; i++) {
|
for (let i = 0; i < TITLES.length; i++) {
|
||||||
|
|||||||
@@ -1053,5 +1053,22 @@ export const speedUhcStatsSchema = z.object({
|
|||||||
deaths: z.number().default(0),
|
deaths: z.number().default(0),
|
||||||
wins: z.number().default(0),
|
wins: z.number().default(0),
|
||||||
losses: z.number().default(0),
|
losses: z.number().default(0),
|
||||||
score: z.number().default(0)
|
score: z.number().default(0),
|
||||||
|
coins: z.number().default(0),
|
||||||
|
kills_solo_normal: z.number().default(0),
|
||||||
|
deaths_solo_normal: z.number().default(0),
|
||||||
|
wins_solo_normal: z.number().default(0),
|
||||||
|
losses_solo_normal: z.number().default(0),
|
||||||
|
kills_solo_insane: z.number().default(0),
|
||||||
|
deaths_solo_insane: z.number().default(0),
|
||||||
|
wins_solo_insane: z.number().default(0),
|
||||||
|
losses_solo_insane: z.number().default(0),
|
||||||
|
kills_team_normal: z.number().default(0),
|
||||||
|
deaths_team_normal: z.number().default(0),
|
||||||
|
wins_team_normal: z.number().default(0),
|
||||||
|
losses_team_normal: z.number().default(0),
|
||||||
|
kills_team_insane: z.number().default(0),
|
||||||
|
deaths_team_insane: z.number().default(0),
|
||||||
|
wins_team_insane: z.number().default(0),
|
||||||
|
losses_team_insane: z.number().default(0)
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user