Added smash heros stat table
This commit is contained in:
@@ -5,6 +5,7 @@ import { getSmashHerosDifficultyColor, getSmashHerosMostPlayedHero } from "@/lib
|
|||||||
import { NonNullStats } from "@/lib/schema/player"
|
import { NonNullStats } from "@/lib/schema/player"
|
||||||
import GeneralStats from "../GeneralStats"
|
import GeneralStats from "../GeneralStats"
|
||||||
import SmashHerosGeneralStats from "./stats"
|
import SmashHerosGeneralStats from "./stats"
|
||||||
|
import { SmashHerosModeTable } from "./table"
|
||||||
|
|
||||||
export default function SmashHerosStats({ stats }: { stats: NonNullStats["SmashHeros"] }) {
|
export default function SmashHerosStats({ stats }: { stats: NonNullStats["SmashHeros"] }) {
|
||||||
if (!stats) return null
|
if (!stats) return null
|
||||||
@@ -49,6 +50,8 @@ export default function SmashHerosStats({ stats }: { stats: NonNullStats["SmashH
|
|||||||
<Separator className="my-4" />
|
<Separator className="my-4" />
|
||||||
<SmashHerosGeneralStats stats={stats} />
|
<SmashHerosGeneralStats stats={stats} />
|
||||||
<Separator className="my-4" />
|
<Separator className="my-4" />
|
||||||
|
<SmashHerosModeTable stats={stats} />
|
||||||
|
<Separator className="my-4" />
|
||||||
</GeneralStats>
|
</GeneralStats>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
58
src/app/(stats)/player/[ign]/_stats/smashheros/table.tsx
Normal file
58
src/app/(stats)/player/[ign]/_stats/smashheros/table.tsx
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
|
||||||
|
import { formatNumber } from "@/lib/formatters"
|
||||||
|
import { getSmashHerosModeName, getSmashHerosModeStats, getSmashHerosMostPlayedMode } from "@/lib/hypixel/smashhero/general"
|
||||||
|
import { NonNullStats } from "@/lib/schema/player"
|
||||||
|
import { cn } from "@/lib/utils"
|
||||||
|
|
||||||
|
export function SmashHerosModeTable({ stats }: { stats: NonNullable<NonNullStats["SmashHeros"]> }) {
|
||||||
|
return (
|
||||||
|
<Table>
|
||||||
|
<SmashHerosModeTableHeader />
|
||||||
|
<TableBody>
|
||||||
|
<SmashHerosModeTableStat modeId="normal" stats={stats} />
|
||||||
|
<SmashHerosModeTableStat modeId="2v2" stats={stats} />
|
||||||
|
<SmashHerosModeTableStat modeId="teams" stats={stats} />
|
||||||
|
<SmashHerosModeTableStat modeId="all" stats={stats} />
|
||||||
|
</TableBody>
|
||||||
|
</Table>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function SmashHerosModeTableStat(
|
||||||
|
{ modeId, stats }: { modeId: Parameters<typeof getSmashHerosModeStats>[0], stats: NonNullable<NonNullStats["SmashHeros"]> }
|
||||||
|
) {
|
||||||
|
const modeStats = getSmashHerosModeStats(modeId, stats)
|
||||||
|
const modeName = getSmashHerosModeName(modeId)
|
||||||
|
const mostPlayed = getSmashHerosMostPlayedMode(stats) === modeId
|
||||||
|
|
||||||
|
return (
|
||||||
|
<TableRow className={cn(mostPlayed && "text-mc-light-purple", modeId === "all" && "font-bold")}>
|
||||||
|
<TableCell>{modeName}</TableCell>
|
||||||
|
{modeStats.map((v, i) => {
|
||||||
|
return <TableCell key={i}>{formatNumber(v)}</TableCell>
|
||||||
|
})}
|
||||||
|
</TableRow>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function SmashHerosModeTableHeader() {
|
||||||
|
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,5 +1,53 @@
|
|||||||
import { DIFFICULTY, HEROES } from "@/data/hypixel/smashheros"
|
import { DIFFICULTY, HEROES, MODES } from "@/data/hypixel/smashheros"
|
||||||
import { NonNullStats } from "@/lib/schema/player"
|
import { NonNullStats } from "@/lib/schema/player"
|
||||||
|
import { devide } from "../general"
|
||||||
|
|
||||||
|
export function getSmashHerosModeName(modeId: Exclude<typeof MODES[number]["id"], ""> | "all") {
|
||||||
|
if (modeId === "all") return MODES.find(m => m.id === "")!.name
|
||||||
|
return MODES.find(m => m.id === modeId)!.name
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getSmashHerosMostPlayedMode(stats: NonNullable<NonNullStats["SmashHeros"]>) {
|
||||||
|
const modes: { mode: Exclude<typeof MODES[number]["id"], "">, games: number }[] = [
|
||||||
|
{ mode: "normal", games: stats.wins_normal + stats.losses_normal },
|
||||||
|
{ mode: "2v2", games: stats.wins_2v2 + stats.losses_2v2 },
|
||||||
|
{ mode: "teams", games: stats.wins_teams + stats.losses_teams }
|
||||||
|
]
|
||||||
|
|
||||||
|
let maxGames = 0
|
||||||
|
let mostPlayedMode: Exclude<typeof MODES[number]["id"], ""> | null = null
|
||||||
|
|
||||||
|
for (const { mode, games } of modes) {
|
||||||
|
if (games > maxGames) {
|
||||||
|
maxGames = games
|
||||||
|
mostPlayedMode = mode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return mostPlayedMode
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getSmashHerosModeStats(modeId: Exclude<typeof MODES[number]["id"], ""> | "all", stats: NonNullable<NonNullStats["SmashHeros"]>) {
|
||||||
|
if (modeId === "all") {
|
||||||
|
return [
|
||||||
|
stats.kills,
|
||||||
|
stats.deaths,
|
||||||
|
devide(stats.kills, stats.deaths),
|
||||||
|
stats.wins,
|
||||||
|
stats.losses,
|
||||||
|
devide(stats.wins, stats.losses)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
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 getSmashHerosDifficultyColor(difficulty: number) {
|
export function getSmashHerosDifficultyColor(difficulty: number) {
|
||||||
if (difficulty < 1) return DIFFICULTY.at(0)!
|
if (difficulty < 1) return DIFFICULTY.at(0)!
|
||||||
|
|||||||
@@ -29,5 +29,17 @@ export const smashHerosStats = z.object({
|
|||||||
SPODERMAN: classStats,
|
SPODERMAN: classStats,
|
||||||
TINMAN: classStats,
|
TINMAN: classStats,
|
||||||
DUSK_CRAWLER: classStats
|
DUSK_CRAWLER: classStats
|
||||||
}).optional()
|
}).optional(),
|
||||||
|
kills_normal: z.number().default(0),
|
||||||
|
deaths_normal: z.number().default(0),
|
||||||
|
wins_normal: z.number().default(0),
|
||||||
|
losses_normal: z.number().default(0),
|
||||||
|
kills_2v2: z.number().default(0),
|
||||||
|
deaths_2v2: z.number().default(0),
|
||||||
|
wins_2v2: z.number().default(0),
|
||||||
|
losses_2v2: z.number().default(0),
|
||||||
|
kills_teams: z.number().default(0),
|
||||||
|
deaths_teams: z.number().default(0),
|
||||||
|
wins_teams: z.number().default(0),
|
||||||
|
losses_teams: z.number().default(0)
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user