Finished first column of duels stats
This commit is contained in:
@@ -1,15 +1,18 @@
|
|||||||
import { AccordionContent, AccordionItem, AccordionTrigger } from "@/components/ui/accordion"
|
import { AccordionContent, AccordionItem, AccordionTrigger } from "@/components/ui/accordion"
|
||||||
import { Card, CardContent } from "@/components/ui/card"
|
import { Card, CardContent } from "@/components/ui/card"
|
||||||
|
import { Separator } from "@/components/ui/separator"
|
||||||
import { formatNumber } from "@/lib/formatters"
|
import { formatNumber } from "@/lib/formatters"
|
||||||
import { getDivision, getMostPlayed } from "@/lib/hypixel/duels/duels"
|
import { getDivision, getMostPlayed } from "@/lib/hypixel/duels/duels"
|
||||||
import { romanize } from "@/lib/hypixel/general"
|
import { romanize } from "@/lib/hypixel/general"
|
||||||
import { NonNullStats } from "@/lib/schema/player"
|
import { NonNullStats } from "@/lib/schema/player"
|
||||||
import CollapsedStats from "../../_components/CollapsedStats"
|
import CollapsedStats from "../../_components/CollapsedStats"
|
||||||
|
import DuelsGeneralStats from "./stats"
|
||||||
|
|
||||||
export default function DuelsStats({ stats }: { stats: NonNullStats["Duels"] }) {
|
export default function DuelsStats({ stats }: { stats: NonNullStats["Duels"] }) {
|
||||||
if (!stats) return null
|
if (!stats) return null
|
||||||
|
|
||||||
const wl = formatNumber(stats.wins / stats.losses)
|
const wl = stats.wins / stats.losses
|
||||||
|
const kd = stats.kills / stats.deaths
|
||||||
const div = getDivision("all_modes", stats)
|
const div = getDivision("all_modes", stats)
|
||||||
const mostPlayed = getMostPlayed(stats)
|
const mostPlayed = getMostPlayed(stats)
|
||||||
|
|
||||||
@@ -57,13 +60,15 @@ export default function DuelsStats({ stats }: { stats: NonNullStats["Duels"] })
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: <p>WL</p>,
|
title: <p>WL</p>,
|
||||||
stat: <p className="text-muted-foreground">{wl}</p>
|
stat: <p className="text-muted-foreground">{formatNumber(wl)}</p>
|
||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</AccordionTrigger>
|
</AccordionTrigger>
|
||||||
<AccordionContent>
|
<AccordionContent>
|
||||||
|
<Separator className="my-4" />
|
||||||
|
<DuelsGeneralStats statsChecked={stats} div={div} kd={kd} />
|
||||||
</AccordionContent>
|
</AccordionContent>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
|
|||||||
40
src/app/(stats)/player/[ign]/_stats/duels/stats.tsx
Normal file
40
src/app/(stats)/player/[ign]/_stats/duels/stats.tsx
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
import { formatNumber } from "@/lib/formatters"
|
||||||
|
import { Div } from "@/lib/hypixel/duels/duels"
|
||||||
|
import { romanize } from "@/lib/hypixel/general"
|
||||||
|
import { NonNullStats } from "@/lib/schema/player"
|
||||||
|
import { cn } from "@/lib/utils"
|
||||||
|
import { BasicStat } from "../../_components/Stats"
|
||||||
|
|
||||||
|
export default function DuelsGeneralStats({ statsChecked, div, kd }: { statsChecked: NonNullStats["Duels"], div: Div | null, kd: number }) {
|
||||||
|
const stats = statsChecked!
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="flex mb-10">
|
||||||
|
<div className="flex-1">
|
||||||
|
<BasicStat title="Tokens: " value={formatNumber(stats.coins)} className="text-mc-dark-green" />
|
||||||
|
<BasicStat
|
||||||
|
title="Overall division: "
|
||||||
|
value={div !== null ? `${div.name} ${romanize(div.level)}` : "-"}
|
||||||
|
className={cn("font-bold", div !== null ? `text-mc-${div.color}` : undefined)}
|
||||||
|
/>
|
||||||
|
<p>
|
||||||
|
<br />
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<br />
|
||||||
|
</p>
|
||||||
|
<BasicStat title="Kills: " value={formatNumber(stats.kills)} />
|
||||||
|
<BasicStat title="Deaths: " value={formatNumber(stats.deaths)} />
|
||||||
|
<BasicStat title="Kill/Death Ratio: " value={formatNumber(kd)} />
|
||||||
|
<p>
|
||||||
|
<br />
|
||||||
|
</p>
|
||||||
|
<BasicStat title="Melee Swings: " value={formatNumber(stats.melee_swings)} />
|
||||||
|
<BasicStat title="Melee Hits: " value={formatNumber(stats.melee_hits)} />
|
||||||
|
<BasicStat title="Melee Hit Accuracy: " value={`${formatNumber(stats.melee_hits / stats.melee_swings * 100)}%`} />
|
||||||
|
</div>
|
||||||
|
<div className="flex-1">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -2,6 +2,11 @@ import { DIVISIONS, MODES } from "@/data/hypixel/duels"
|
|||||||
import { NonNullStats } from "@/lib/schema/player"
|
import { NonNullStats } from "@/lib/schema/player"
|
||||||
|
|
||||||
type DuelType = "all_modes"
|
type DuelType = "all_modes"
|
||||||
|
export type Div = {
|
||||||
|
name: typeof DIVISIONS[number]["name"]
|
||||||
|
level: number
|
||||||
|
color: typeof DIVISIONS[number]["color"]
|
||||||
|
}
|
||||||
|
|
||||||
export function getDivision(duelType: DuelType, stats: NonNullable<NonNullStats["Duels"]>) {
|
export function getDivision(duelType: DuelType, stats: NonNullable<NonNullStats["Duels"]>) {
|
||||||
for (const div of DIVISIONS.slice().reverse()) {
|
for (const div of DIVISIONS.slice().reverse()) {
|
||||||
|
|||||||
@@ -272,6 +272,12 @@ export const skywarsStatsSchema = z.looseObject({
|
|||||||
export const duelsStatsSchema = z.looseObject({
|
export const duelsStatsSchema = z.looseObject({
|
||||||
wins: z.number().default(0),
|
wins: z.number().default(0),
|
||||||
losses: z.number().default(0),
|
losses: z.number().default(0),
|
||||||
|
coins: z.number().default(0),
|
||||||
|
kills: z.number().default(0),
|
||||||
|
deaths: z.number().default(0),
|
||||||
|
melee_swings: z.number().default(0),
|
||||||
|
melee_hits: z.number().default(0),
|
||||||
|
//
|
||||||
all_modes_rookie_title_prestige: z.number().default(-1),
|
all_modes_rookie_title_prestige: z.number().default(-1),
|
||||||
all_modes_iron_title_prestige: z.number().default(-1),
|
all_modes_iron_title_prestige: z.number().default(-1),
|
||||||
all_modes_gold_title_prestige: z.number().default(-1),
|
all_modes_gold_title_prestige: z.number().default(-1),
|
||||||
|
|||||||
Reference in New Issue
Block a user