Updated pixel party stats
This commit is contained in:
@@ -1,7 +1,10 @@
|
||||
import { Separator } from "@/components/ui/separator"
|
||||
import { formatNumber } from "@/lib/formatters"
|
||||
import { getArcadeTotalWins } from "@/lib/hypixel/arcade/general"
|
||||
import { NonNullStats } from "@/lib/schema/player"
|
||||
import { BasicStat } from "../../_components/Stats"
|
||||
import GeneralStats from "../GeneralStats"
|
||||
import { ArcadeMiniWallsStats, ArcadePixelPartyStats } from "./stats"
|
||||
|
||||
export default function ArcadeStats({ stats }: { stats: NonNullStats["Arcade"] }) {
|
||||
if (!stats) return null
|
||||
@@ -18,6 +21,14 @@ export default function ArcadeStats({ stats }: { stats: NonNullStats["Arcade"] }
|
||||
}]}
|
||||
>
|
||||
<Separator className="my-4" />
|
||||
<div>
|
||||
<BasicStat title="Arcade Coins: " value={formatNumber(stats.coins)} className="text-mc-gold" />
|
||||
</div>
|
||||
<Separator className="my-4" />
|
||||
<ArcadeMiniWallsStats stats={stats} />
|
||||
<Separator className="my-4" />
|
||||
<ArcadePixelPartyStats stats={stats} />
|
||||
<Separator className="my-4" />
|
||||
</GeneralStats>
|
||||
)
|
||||
}
|
||||
|
||||
65
src/app/(stats)/player/[ign]/_stats/arcade/stats.tsx
Normal file
65
src/app/(stats)/player/[ign]/_stats/arcade/stats.tsx
Normal file
@@ -0,0 +1,65 @@
|
||||
import { formatNumber } from "@/lib/formatters"
|
||||
import { devide } from "@/lib/hypixel/general"
|
||||
import { NonNullStats } from "@/lib/schema/player"
|
||||
import { capitalizeFirstLetter } from "@/lib/utils"
|
||||
import { BasicStat } from "../../_components/Stats"
|
||||
import { PixelPartyStatsTable } from "./table"
|
||||
|
||||
export function ArcadePixelPartyStats({ stats }: { stats: NonNullable<NonNullStats["Arcade"]> }) {
|
||||
const losses = (stats.pixel_party?.games_played || 0) - (stats.pixel_party?.wins || 0)
|
||||
const wl = formatNumber(devide(stats.pixel_party?.wins || 0, losses))
|
||||
return (
|
||||
<>
|
||||
<h2 className="pb-5 text-xl font-bold">Pixel Party</h2>
|
||||
<div className="flex pb-5">
|
||||
<div className="flex-1">
|
||||
<BasicStat title="Wins: " value={formatNumber(stats.pixel_party?.wins || 0)} />
|
||||
<BasicStat title="Losses: " value={formatNumber(losses)} />
|
||||
<BasicStat title="Win/Loss Ratio: " value={wl} />
|
||||
</div>
|
||||
<div className="flex-1">
|
||||
<BasicStat title="Games Played: " value={formatNumber(stats.pixel_party?.games_played || 0)} />
|
||||
<BasicStat title="Rounds Completed: " value={formatNumber(stats.pixel_party?.rounds_completed || 0)} />
|
||||
<BasicStat title="Highest Round: " value={formatNumber(stats.pixel_party?.highest_round || 0)} />
|
||||
</div>
|
||||
<div className="flex-1">
|
||||
<BasicStat title="Power-ups Collected: " value={formatNumber(stats.pixel_party?.power_ups_collected || 0)} />
|
||||
</div>
|
||||
</div>
|
||||
<PixelPartyStatsTable stats={stats.pixel_party} />
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
export function ArcadeMiniWallsStats({ stats }: { stats: NonNullable<NonNullStats["Arcade"]> }) {
|
||||
const kd = formatNumber(devide(stats.kills_mini_walls + stats.final_kills_mini_walls, stats.deaths_mini_walls))
|
||||
const ac = formatNumber(devide(stats.arrows_hit_mini_walls, stats.arrows_shot_mini_walls))
|
||||
return (
|
||||
<>
|
||||
<h2 className="pb-5 text-xl font-bold">Mini Walls</h2>
|
||||
<div className="flex">
|
||||
<div className="flex-1">
|
||||
<BasicStat title="Wins: " value={stats.wins_mini_walls} />
|
||||
<BasicStat
|
||||
title="Kit Seleted: "
|
||||
value={stats.miniwalls_activeKit !== undefined
|
||||
? capitalizeFirstLetter(stats.miniwalls_activeKit)
|
||||
: "Unknown"}
|
||||
/>
|
||||
<BasicStat title="Withers Killed: " value={stats.wither_kills_mini_walls} />
|
||||
</div>
|
||||
<div className="flex-1">
|
||||
<BasicStat title="Kills: " value={stats.kills_mini_walls} />
|
||||
<BasicStat title="Final Kills: " value={stats.final_kills_mini_walls} />
|
||||
<BasicStat title="Deaths: " value={stats.deaths_mini_walls} />
|
||||
<BasicStat title="Kill/Death Ratio: " value={kd} />
|
||||
</div>
|
||||
<div className="flex-1">
|
||||
<BasicStat title="Arrows Hit: " value={stats.arrows_hit_mini_walls} />
|
||||
<BasicStat title="Arrows Shot: " value={stats.arrows_shot_mini_walls} />
|
||||
<BasicStat title="Arrow Hit Accuracy: " value={ac} />
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
}
|
||||
56
src/app/(stats)/player/[ign]/_stats/arcade/table.tsx
Normal file
56
src/app/(stats)/player/[ign]/_stats/arcade/table.tsx
Normal file
@@ -0,0 +1,56 @@
|
||||
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
|
||||
import { formatNumber } from "@/lib/formatters"
|
||||
import { getArcadeMostPlayedPixelPartyMode, getArcadePixelPartyModeName, getArcadePixelPartyModeStats } from "@/lib/hypixel/arcade/general"
|
||||
import { NonNullStats } from "@/lib/schema/player"
|
||||
import { cn } from "@/lib/utils"
|
||||
|
||||
export function PixelPartyStatsTable({ stats }: { stats: NonNullable<NonNullStats["Arcade"]>["pixel_party"] }) {
|
||||
return (
|
||||
<Table>
|
||||
<PixelPartyStatsTableHeader />
|
||||
<TableBody>
|
||||
<PixelPartyTableStat modeId="normal" stats={stats} />
|
||||
<PixelPartyTableStat modeId="hyper" stats={stats} />
|
||||
<PixelPartyTableStat modeId="all_modes" stats={stats} />
|
||||
</TableBody>
|
||||
</Table>
|
||||
)
|
||||
}
|
||||
|
||||
function PixelPartyTableStat(
|
||||
{ modeId, stats }: { modeId: Parameters<typeof getArcadePixelPartyModeStats>[0], stats: NonNullable<NonNullStats["Arcade"]>["pixel_party"] }
|
||||
) {
|
||||
const modeName = getArcadePixelPartyModeName(modeId)
|
||||
const modeStats = getArcadePixelPartyModeStats(modeId, stats)
|
||||
const mostPlayed = getArcadeMostPlayedPixelPartyMode(stats) === modeId
|
||||
const isMostPlayed = modeId !== "all_modes" && mostPlayed
|
||||
|
||||
return (
|
||||
<TableRow className={cn(modeName === "Overall" && "font-bold", isMostPlayed && "text-mc-light-purple")}>
|
||||
<TableCell>{modeName}</TableCell>
|
||||
{modeStats.map((v, i) => {
|
||||
return <TableCell key={i}>{formatNumber(v)}</TableCell>
|
||||
})}
|
||||
</TableRow>
|
||||
)
|
||||
}
|
||||
|
||||
function PixelPartyStatsTableHeader() {
|
||||
const headerElements = [
|
||||
"Mode",
|
||||
"Wins",
|
||||
"Losses",
|
||||
"WL",
|
||||
"Games Played",
|
||||
"Rounds Completed",
|
||||
"Power-Ups Collected"
|
||||
]
|
||||
|
||||
return (
|
||||
<TableHeader>
|
||||
<TableRow>
|
||||
{headerElements.map((v, i) => <TableHead key={i} className="font-bold">{v}</TableHead>)}
|
||||
</TableRow>
|
||||
</TableHeader>
|
||||
)
|
||||
}
|
||||
@@ -2,6 +2,7 @@ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@
|
||||
import { formatNumber } from "@/lib/formatters"
|
||||
import { getUHCModeName, getUHCModeStats } from "@/lib/hypixel/uhc/general"
|
||||
import { NonNullStats } from "@/lib/schema/player"
|
||||
import { cn } from "@/lib/utils"
|
||||
|
||||
export default function UHCStatTable({ stats }: { stats: NonNullable<NonNullStats["UHC"]> }) {
|
||||
return (
|
||||
@@ -50,8 +51,8 @@ function TableStat(
|
||||
const modeName = getUHCModeName(modeId === "teams" || modeId === "all_modes" ? "" : modeId)
|
||||
|
||||
return (
|
||||
<TableRow>
|
||||
<TableCell className={modeId === "all_modes" ? "font-bold" : undefined}>{modeId === "all_modes" ? "Overall" : modeName}</TableCell>
|
||||
<TableRow className={cn(modeId === "all_modes" && "font-bold")}>
|
||||
<TableCell>{modeId === "all_modes" ? "Overall" : modeName}</TableCell>
|
||||
{modeStats.map((v, i) => {
|
||||
return (
|
||||
<TableCell key={i}>
|
||||
|
||||
Reference in New Issue
Block a user