Finished quake craft stats
This commit is contained in:
@@ -109,7 +109,7 @@ export function PlayerStats(
|
||||
"paintball": <PaintballStats stats={stats.Paintball} />,
|
||||
"walls": <WallsStats stats={stats.Walls} />,
|
||||
"vampirez": <VampireZStats stats={stats.VampireZ} />,
|
||||
"quakecraft": <QuakecraftStats stats={stats.Quakecraft} />
|
||||
"quakecraft": <QuakecraftStats stats={stats.Quakecraft} godlikes={achievements?.["quake_godlikes"] ?? 0} />
|
||||
} as const
|
||||
|
||||
const defaultOrder = Object.keys(statsComponents)
|
||||
|
||||
@@ -3,8 +3,10 @@ import { formatNumber } from "@/lib/formatters"
|
||||
import { devide } from "@/lib/hypixel/general"
|
||||
import { NonNullStats } from "@/lib/schema/player"
|
||||
import { EmptyStats, GeneralStats } from "../stats-components"
|
||||
import { QuakeCraftGeneralStats } from "./stats"
|
||||
import { QuakecraftModeStatsTable } from "./table"
|
||||
|
||||
export default function QuakecraftStats({ stats }: { stats: NonNullStats["Quakecraft"] }) {
|
||||
export default function QuakecraftStats({ stats, godlikes }: { stats: NonNullStats["Quakecraft"], godlikes: number }) {
|
||||
if (!stats) return <EmptyStats title="Quakecraft" />
|
||||
|
||||
const kd = formatNumber(devide(stats.kills + stats.kills_teams, stats.deaths + stats.deaths_teams))
|
||||
@@ -29,6 +31,10 @@ export default function QuakecraftStats({ stats }: { stats: NonNullStats["Quakec
|
||||
]}
|
||||
>
|
||||
<Separator className="my-4" />
|
||||
<QuakeCraftGeneralStats stats={stats} godlikes={godlikes} />
|
||||
<Separator className="my-4" />
|
||||
<QuakecraftModeStatsTable stats={stats} />
|
||||
<Separator className="my-4" />
|
||||
</GeneralStats>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -87,3 +87,32 @@ export function VampireZGeneralStats({ stats }: { stats: NonNullable<NonNullStat
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
export function QuakeCraftGeneralStats({ stats, godlikes }: { stats: NonNullable<NonNullStats["Quakecraft"]>, godlikes: number }) {
|
||||
return (
|
||||
<div className="flex mt-4">
|
||||
<div className="flex-1">
|
||||
<BasicStat title="Coins: " value={formatNumber(stats.coins)} className="text-mc-gold" />
|
||||
<p>
|
||||
<br />
|
||||
</p>
|
||||
<BasicStat title="Kills: " value={formatNumber(stats.kills + stats.kills_teams)} />
|
||||
<BasicStat title="Deaths: " value={formatNumber(stats.deaths + stats.deaths_teams)} />
|
||||
<BasicStat
|
||||
title="Kill/Death Ratio: "
|
||||
value={formatNumber(devide(stats.kills + stats.kills_teams, stats.deaths + stats.deaths_teams))}
|
||||
/>
|
||||
</div>
|
||||
<div className="flex-1">
|
||||
<BasicStat title="Wins: " value={formatNumber(stats.wins + stats.wins_teams)} />
|
||||
<p>
|
||||
<br />
|
||||
</p>
|
||||
<BasicStat title="Godlikes: " value={formatNumber(godlikes)} />
|
||||
<BasicStat title="Highest Killstreak: " value={formatNumber(stats.highest_killstreak)} />
|
||||
<BasicStat title="Dash Cooldown: " value={stats.dash_cooldown + 1} />
|
||||
<BasicStat title="Dash Power: " value={stats.dash_power + 1} />
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1,9 +1,82 @@
|
||||
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
|
||||
import { formatNumber } from "@/lib/formatters"
|
||||
import { getArenaBrawlModeName, getArenaBrawlModeStats, getArenaBrawlMostPlayedMode, getArenaBrawlOverallStats } from "@/lib/hypixel/classic/general"
|
||||
import {
|
||||
getArenaBrawlModeName,
|
||||
getArenaBrawlModeStats,
|
||||
getArenaBrawlMostPlayedMode,
|
||||
getArenaBrawlOverallStats,
|
||||
getQuakecraftModeName,
|
||||
getQuakecraftModeStats,
|
||||
getQuakecraftMostPlayedMode
|
||||
} from "@/lib/hypixel/classic/general"
|
||||
import { NonNullStats } from "@/lib/schema/player"
|
||||
import { cn } from "@/lib/utils"
|
||||
|
||||
export function QuakecraftModeStatsTable({ stats }: { stats: NonNullable<NonNullStats["Quakecraft"]> }) {
|
||||
return (
|
||||
<Table>
|
||||
<QuakecraftModeStatsTableHeader />
|
||||
<TableBody>
|
||||
<QuakecraftModeStat modeId="solo" stats={stats} />
|
||||
<QuakecraftModeStat modeId="teams" stats={stats} />
|
||||
<QuakecraftModeStat modeId="all" stats={stats} />
|
||||
</TableBody>
|
||||
</Table>
|
||||
)
|
||||
}
|
||||
|
||||
function QuakecraftModeStat(
|
||||
{ modeId, stats }: { modeId: Parameters<typeof getQuakecraftModeStats>[0], stats: NonNullable<NonNullStats["Quakecraft"]> }
|
||||
) {
|
||||
if (modeId === "all") {
|
||||
const modeStats = getQuakecraftModeStats(modeId, stats)
|
||||
return (
|
||||
<TableRow className="font-bold">
|
||||
<TableCell>Overall</TableCell>
|
||||
{modeStats.map((v, i) => {
|
||||
return <TableCell key={i}>{formatNumber(v)}</TableCell>
|
||||
})}
|
||||
</TableRow>
|
||||
)
|
||||
}
|
||||
|
||||
const modeStats = getQuakecraftModeStats(modeId, stats)
|
||||
const modeName = getQuakecraftModeName(modeId)
|
||||
const mostPlayed = getQuakecraftMostPlayedMode(stats) === modeId
|
||||
|
||||
return (
|
||||
<TableRow className={cn(mostPlayed && "text-mc-light-purple")}>
|
||||
<TableCell>{modeName}</TableCell>
|
||||
{modeStats.map((v, i) => {
|
||||
return <TableCell key={i}>{formatNumber(v)}</TableCell>
|
||||
})}
|
||||
</TableRow>
|
||||
)
|
||||
}
|
||||
|
||||
function QuakecraftModeStatsTableHeader() {
|
||||
const headerElements = [
|
||||
"Mode",
|
||||
"Kills",
|
||||
"Deaths",
|
||||
"KD",
|
||||
"Wins",
|
||||
"Killstreaks",
|
||||
"Headshots",
|
||||
"Shots Fired",
|
||||
"HK",
|
||||
"KS"
|
||||
]
|
||||
|
||||
return (
|
||||
<TableHeader>
|
||||
<TableRow>
|
||||
{headerElements.map((v, i) => <TableHead key={i} className="font-bold">{v}</TableHead>)}
|
||||
</TableRow>
|
||||
</TableHeader>
|
||||
)
|
||||
}
|
||||
|
||||
export function ArenaBrawlModeStatsTable({ stats }: { stats: NonNullable<NonNullStats["ArenaBrawl"]> }) {
|
||||
return (
|
||||
<Table>
|
||||
|
||||
@@ -1,7 +1,61 @@
|
||||
import { ARENABRAWLMODES } from "@/data/hypixel/classic"
|
||||
import { ARENABRAWLMODES, QUAKECRAFTMODES } from "@/data/hypixel/classic"
|
||||
import { NonNullStats } from "@/lib/schema/player"
|
||||
import { devide } from "../general"
|
||||
|
||||
export function getQuakecraftModeName(modeId: Exclude<typeof QUAKECRAFTMODES[number]["id"], ""> | "solo") {
|
||||
if (modeId === "solo") return QUAKECRAFTMODES.find(m => m.id === "")!.name
|
||||
return QUAKECRAFTMODES.find(m => m.id === modeId)!.name
|
||||
}
|
||||
|
||||
export function getQuakecraftMostPlayedMode(stats: NonNullable<NonNullStats["Quakecraft"]>) {
|
||||
if (stats.wins + stats.wins_teams === 0) return null
|
||||
|
||||
return stats.wins > stats.wins_teams ? "solo" : "teams"
|
||||
}
|
||||
|
||||
export function getQuakecraftModeStats(
|
||||
modeId: Exclude<typeof QUAKECRAFTMODES[number]["id"], ""> | "solo" | "all",
|
||||
stats: NonNullable<NonNullStats["Quakecraft"]>
|
||||
) {
|
||||
if (modeId === "all") {
|
||||
return [
|
||||
stats.kills + stats.kills_teams,
|
||||
stats.deaths + stats.deaths_teams,
|
||||
devide(stats.kills + stats.kills_teams, stats.deaths + stats.deaths_teams),
|
||||
stats.wins + stats.wins_teams,
|
||||
stats.killstreaks + stats.killstreaks_teams,
|
||||
stats.headshots + stats.headshots_teams,
|
||||
stats.shots_fired + stats.shots_fired_teams,
|
||||
devide(stats.headshots + stats.headshots_teams, stats.kills_since_update_feb_2017 + stats.kills_since_update_feb_2017_teams),
|
||||
devide(stats.kills_since_update_feb_2017 + stats.kills_since_update_feb_2017_teams, stats.shots_fired + stats.shots_fired_teams)
|
||||
]
|
||||
} else if (modeId === "solo") {
|
||||
return [
|
||||
stats.kills,
|
||||
stats.deaths,
|
||||
devide(stats.kills, stats.deaths),
|
||||
stats.wins,
|
||||
stats.killstreaks,
|
||||
stats.headshots,
|
||||
stats.shots_fired,
|
||||
devide(stats.headshots, stats.kills_since_update_feb_2017),
|
||||
devide(stats.kills_since_update_feb_2017, stats.shots_fired)
|
||||
]
|
||||
} else {
|
||||
return [
|
||||
stats[`kills_${modeId}`],
|
||||
stats[`deaths_${modeId}`],
|
||||
devide(stats[`kills_${modeId}`], stats[`deaths_${modeId}`]),
|
||||
stats[`wins_${modeId}`],
|
||||
stats[`killstreaks_${modeId}`],
|
||||
stats[`headshots_${modeId}`],
|
||||
stats[`shots_fired_${modeId}`],
|
||||
devide(stats[`headshots_${modeId}`], stats[`kills_since_update_feb_2017_${modeId}`]),
|
||||
devide(stats[`kills_since_update_feb_2017_${modeId}`], stats[`shots_fired_${modeId}`])
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
export function getArenaBrawlModeName(modeId: typeof ARENABRAWLMODES[number]["id"]) {
|
||||
return ARENABRAWLMODES.find(m => m.id === modeId)!.name
|
||||
}
|
||||
|
||||
@@ -50,16 +50,22 @@ export const vampireZStatsSchema = z.object({
|
||||
})
|
||||
|
||||
export const quakecraftStatsSchema = z.object({
|
||||
coins: z.number().default(0),
|
||||
kills: z.number().default(0),
|
||||
deaths: z.number().default(0),
|
||||
killstreaks: z.number().default(0),
|
||||
wins: z.number().default(0),
|
||||
headshots: z.number().default(0),
|
||||
kills_since_update_feb_2017: z.number().default(0),
|
||||
shots_fired: z.number().default(0),
|
||||
kills_teams: z.number().default(0),
|
||||
deaths_teams: z.number().default(0),
|
||||
killstreaks_teams: z.number().default(0),
|
||||
wins_teams: z.number().default(0),
|
||||
headshots_teams: z.number().default(0),
|
||||
kills_since_update_feb_2017_teams: z.number().default(0),
|
||||
shots_fired_teams: z.number().default(0)
|
||||
shots_fired_teams: z.number().default(0),
|
||||
highest_killstreak: z.number().default(0),
|
||||
dash_cooldown: z.coerce.number().default(0),
|
||||
dash_power: z.coerce.number().default(0)
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user