Updated bw stats
This commit is contained in:
20
src/app/(stats)/player/[ign]/_components/Stats.tsx
Normal file
20
src/app/(stats)/player/[ign]/_components/Stats.tsx
Normal file
@@ -0,0 +1,20 @@
|
||||
import { cn } from "@/lib/utils"
|
||||
import { ReactNode } from "react"
|
||||
|
||||
export function BasicStat({ title, value, className }: { title: string, value: string | number, className?: string }) {
|
||||
return (
|
||||
<p>
|
||||
<span className="font-bold">{title}</span>
|
||||
<span className={cn("text-muted-foreground", className)}>{value}</span>
|
||||
</p>
|
||||
)
|
||||
}
|
||||
|
||||
export function Stat({ title, children }: { title: string, children: ReactNode }) {
|
||||
return (
|
||||
<p>
|
||||
<span className="font-bold">{title}</span>
|
||||
{children}
|
||||
</p>
|
||||
)
|
||||
}
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
import { Card, CardContent } from "@/components/ui/card"
|
||||
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"
|
||||
import { formatNumber } from "@/lib/formatters"
|
||||
import { getBWLevelForExp, getTotalExpForLevel } from "@/lib/hypixel/bedwarsLevel"
|
||||
import { getProgress } from "@/lib/hypixel/general"
|
||||
import { Player } from "@/lib/schema/player"
|
||||
@@ -10,7 +9,8 @@ import { Separator } from "@radix-ui/react-separator"
|
||||
import { ChevronDown, ChevronUp, Menu } from "lucide-react"
|
||||
import { useEffect, useRef, useState } from "react"
|
||||
import CollapsedStats from "../../_components/CollapsedStats"
|
||||
import { BedwarsLevel, BedWarsPrestige, BedwarsProgress } from "./bedwars-components"
|
||||
import { BedwarsLevel, BedwarsProgress } from "./bedwars-components"
|
||||
import BedwarsGeneralStats from "./stats"
|
||||
|
||||
export default function BedwarsStats({ stats }: { stats: Player["player"]["stats"]["Bedwars"] }) {
|
||||
const ref = useRef<HTMLDivElement>(null)
|
||||
@@ -65,23 +65,23 @@ export default function BedwarsStats({ stats }: { stats: Player["player"]["stats
|
||||
},
|
||||
{
|
||||
title: <p>WS</p>,
|
||||
stat: <p>{stats.winstreak ?? "?"}</p>
|
||||
stat: <p className="text-muted-foreground">{stats.winstreak ?? "?"}</p>
|
||||
},
|
||||
{
|
||||
title: <p>KD</p>,
|
||||
stat: <p>{kd}</p>
|
||||
stat: <p className="text-muted-foreground">{kd}</p>
|
||||
},
|
||||
{
|
||||
title: <p>FKD</p>,
|
||||
stat: <p>{fkd}</p>
|
||||
stat: <p className="text-muted-foreground">{fkd}</p>
|
||||
},
|
||||
{
|
||||
title: <p>WL</p>,
|
||||
stat: <p>{wl}</p>
|
||||
stat: <p className="text-muted-foreground">{wl}</p>
|
||||
},
|
||||
{
|
||||
title: <p>BBL</p>,
|
||||
stat: <p>{bbl}</p>
|
||||
stat: <p className="text-muted-foreground">{bbl}</p>
|
||||
}
|
||||
]}
|
||||
/>
|
||||
@@ -96,91 +96,7 @@ export default function BedwarsStats({ stats }: { stats: Player["player"]["stats
|
||||
<CollapsibleContent>
|
||||
<Separator className="my-4" />
|
||||
<BedwarsProgress level={level} percent={percent} />
|
||||
<div className="flex">
|
||||
<div className="flex flex-col flex-1 gap-4">
|
||||
<div>
|
||||
<p>
|
||||
<span className="font-bold">{"Level: "}</span>
|
||||
<span>{`${level}.${percent.toFixed(0)}`}</span>
|
||||
</p>
|
||||
<p>
|
||||
<span className="font-bold">{"Prestige: "}</span>
|
||||
<BedWarsPrestige level={level} />
|
||||
</p>
|
||||
<p>
|
||||
<span className="font-bold">{"Tokens: "}</span>
|
||||
<span className="text-mc-dark-green">{formatNumber(stats.coins)}</span>
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<p>
|
||||
<span className="font-bold">{"Kills: "}</span>
|
||||
<span>{formatNumber(stats.kills_bedwars)}</span>
|
||||
</p>
|
||||
<p>
|
||||
<span className="font-bold">{"Deaths: "}</span>
|
||||
<span>{formatNumber(stats.deaths_bedwars)}</span>
|
||||
</p>
|
||||
<p>
|
||||
<span className="font-bold">{"Kill/Death Ratio: "}</span>
|
||||
<span>{kd}</span>
|
||||
</p>
|
||||
<p>
|
||||
<span className="font-bold">{"Final Kills: "}</span>
|
||||
<span>{formatNumber(stats.final_kills_bedwars)}</span>
|
||||
</p>
|
||||
<p>
|
||||
<span className="font-bold">{"Final Deaths: "}</span>
|
||||
<span>{formatNumber(stats.final_deaths_bedwars)}</span>
|
||||
</p>
|
||||
<p>
|
||||
<span className="font-bold">{"Final Kill/Death Ratio: "}</span>
|
||||
<span>{fkd}</span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex flex-col flex-1 gap-4">
|
||||
<div>
|
||||
<p>
|
||||
<span className="font-bold">{"Winstreak: "}</span>
|
||||
<span>{stats.winstreak ?? "?"}</span>
|
||||
</p>
|
||||
<p>
|
||||
<span className="font-bold">{"Wins: "}</span>
|
||||
<span>{formatNumber(stats.wins_bedwars)}</span>
|
||||
</p>
|
||||
<p>
|
||||
<span className="font-bold">{"Losses: "}</span>
|
||||
<span>{formatNumber(stats.losses_bedwars)}</span>
|
||||
</p>
|
||||
<p>
|
||||
<span className="font-bold">{"Win/Loss Ratio: "}</span>
|
||||
<span>{wl}</span>
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<p>
|
||||
<span className="font-bold">{"Beds Broken: "}</span>
|
||||
<span>{stats.beds_broken_bedwars}</span>
|
||||
</p>
|
||||
<p>
|
||||
<span className="font-bold">{"Beds Lost: "}</span>
|
||||
<span>{stats.beds_lost_bedwars}</span>
|
||||
</p>
|
||||
<p>
|
||||
<span className="font-bold">{"Beds Broken/Lost: "}</span>
|
||||
<span>{bbl}</span>
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<p>
|
||||
<span className="font-bold">{"Total Challenges Completed: "}</span>
|
||||
<span>{stats.total_challenges_completed}</span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex-1"></div>
|
||||
</div>
|
||||
<BedwarsGeneralStats statsChecked={stats} level={level} percent={percent} bbl={bbl} kd={kd} fkd={fkd} wl={wl} />
|
||||
</CollapsibleContent>
|
||||
</Collapsible>
|
||||
</CardContent>
|
||||
|
||||
81
src/app/(stats)/player/[ign]/_stats/bedwars/stats.tsx
Normal file
81
src/app/(stats)/player/[ign]/_stats/bedwars/stats.tsx
Normal file
@@ -0,0 +1,81 @@
|
||||
import { formatNumber } from "@/lib/formatters"
|
||||
import { getLatestRoom, getWalletMax } from "@/lib/hypixel/bedwars"
|
||||
import { Player } from "@/lib/schema/player"
|
||||
import { BasicStat, Stat } from "../../_components/Stats"
|
||||
import { BedWarsPrestige } from "./bedwars-components"
|
||||
|
||||
export default function BedwarsGeneralStats(
|
||||
{ statsChecked, level, percent, kd, fkd, bbl, wl }: {
|
||||
statsChecked: Player["player"]["stats"]["Bedwars"]
|
||||
level: number
|
||||
percent: number
|
||||
kd: string
|
||||
fkd: string
|
||||
bbl: string
|
||||
wl: string
|
||||
}
|
||||
) {
|
||||
const stats = statsChecked!
|
||||
|
||||
return (
|
||||
<div className="flex">
|
||||
<div className="flex-1">
|
||||
<BasicStat title="Level: " value={`${level}.${percent.toFixed(0)}`} />
|
||||
<Stat title="Prestige: ">
|
||||
<BedWarsPrestige level={level} />
|
||||
</Stat>
|
||||
<BasicStat title="Tokens: " value={formatNumber(stats.coins)} className="text-mc-dark-green" />
|
||||
<p>
|
||||
<br />
|
||||
</p>
|
||||
<BasicStat title="Kills: " value={formatNumber(stats.kills_bedwars)} />
|
||||
<BasicStat title="Deaths: " value={formatNumber(stats.deaths_bedwars)} />
|
||||
<BasicStat title="Kill/Death Ratio: " value={kd} />
|
||||
<BasicStat title="Final Kills: " value={formatNumber(stats.final_kills_bedwars)} />
|
||||
<BasicStat title="Final Deaths: " value={formatNumber(stats.final_deaths_bedwars)} />
|
||||
<BasicStat title="Final Kill/Death Ratio: " value={fkd} />
|
||||
</div>
|
||||
<div className="flex-1">
|
||||
<BasicStat title="Winstreak: " value={stats.winstreak ?? "?"} />
|
||||
<BasicStat title="Wins: " value={formatNumber(stats.wins_bedwars)} />
|
||||
<BasicStat title="Losses: " value={formatNumber(stats.losses_bedwars)} />
|
||||
<BasicStat title="Win/Loss Ratio: " value={wl} />
|
||||
<p>
|
||||
<br />
|
||||
</p>
|
||||
<BasicStat title="Beds Broken: " value={stats.beds_broken_bedwars} />
|
||||
<BasicStat title="Beds Lost: " value={stats.beds_lost_bedwars} />
|
||||
<BasicStat title="Beds Broken/Lost: " value={bbl} />
|
||||
<p>
|
||||
<br />
|
||||
</p>
|
||||
<BasicStat title="Total Challenges Completed: " value={stats.total_challenges_completed} />
|
||||
</div>
|
||||
<div className="flex-1">
|
||||
<Stat title={"Slumber Tickets: "}>
|
||||
<span className="text-mc-aqua">
|
||||
{stats.slumber?.tickets === undefined ? "None" : formatNumber(stats.slumber.tickets)}
|
||||
</span>
|
||||
<span className="text-muted-foreground">
|
||||
{`/${formatNumber(getWalletMax(stats.slumber?.bag_type))}`}
|
||||
</span>
|
||||
</Stat>
|
||||
<BasicStat
|
||||
title="Lifetime Slumber Tickets: "
|
||||
value={formatNumber(stats.slumber?.total_tickets_earned ?? 0)}
|
||||
className="text-mc-aqua"
|
||||
/>
|
||||
<BasicStat title="Doors Unlocked: " value={getLatestRoom(stats.slumber?.room) ?? "None"} />
|
||||
<BasicStat title="XP Doublers: " value={formatNumber(stats.slumber?.doublers ?? 0)} className="text-mc-dark-aqua" />
|
||||
<p>
|
||||
<br />
|
||||
</p>
|
||||
<BasicStat title="Iron Collected: " value={formatNumber(stats.iron_resources_collected_bedwars)} />
|
||||
<BasicStat title="Gold Collected: " value={formatNumber(stats.gold_resources_collected_bedwars)} />
|
||||
<BasicStat title="Diamonds Collected: " value={formatNumber(stats.diamond_resources_collected_bedwars)} />
|
||||
<BasicStat title="Emeralds Collected: " value={formatNumber(stats.emerald_resources_collected_bedwars)} />
|
||||
<BasicStat title="Total Shop Purchases: " value={formatNumber(stats._items_purchased_bedwars)} />
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
import { PRESTIGE_ICONS, PRESTIGES } from "@/data/hypixel/bedwars"
|
||||
import { PRESTIGE_ICONS, PRESTIGES, SLUMBER_ROOMS, SLUMBER_WALLETS } from "@/data/hypixel/bedwars"
|
||||
import { floorLevel } from "./formatters"
|
||||
|
||||
export function getBedwarsStar(level: number) {
|
||||
@@ -36,3 +36,27 @@ export function getPrestigeName(level: number) {
|
||||
|
||||
return PRESTIGES.find(p => p.level === floored)!.name
|
||||
}
|
||||
|
||||
export function getWalletMax(name?: string) {
|
||||
if (!name) return 25
|
||||
|
||||
const wallets = SLUMBER_WALLETS as Record<string, number>
|
||||
|
||||
if (!wallets[name]) return 25
|
||||
|
||||
return wallets[name]
|
||||
}
|
||||
|
||||
export function getLatestRoom(rooms?: Record<string, boolean>) {
|
||||
if (!rooms) return null
|
||||
|
||||
let latestRoom = null
|
||||
|
||||
for (const room of SLUMBER_ROOMS) {
|
||||
if (rooms[room.id]) {
|
||||
latestRoom = room.name
|
||||
}
|
||||
}
|
||||
|
||||
return latestRoom
|
||||
}
|
||||
|
||||
@@ -24,7 +24,19 @@ export const playerSchema = z.looseObject({
|
||||
losses_bedwars: z.number().default(0),
|
||||
beds_broken_bedwars: z.number().default(0),
|
||||
beds_lost_bedwars: z.number().default(0),
|
||||
total_challenges_completed: z.number().default(0)
|
||||
total_challenges_completed: z.number().default(0),
|
||||
iron_resources_collected_bedwars: z.number().default(0),
|
||||
gold_resources_collected_bedwars: z.number().default(0),
|
||||
diamond_resources_collected_bedwars: z.number().default(0),
|
||||
emerald_resources_collected_bedwars: z.number().default(0),
|
||||
_items_purchased_bedwars: z.number().default(0),
|
||||
slumber: z.looseObject({
|
||||
tickets: z.number().default(0),
|
||||
bag_type: z.string(),
|
||||
total_tickets_earned: z.number(),
|
||||
doublers: z.number(),
|
||||
room: z.record(z.string(), z.boolean())
|
||||
}).optional()
|
||||
}).optional()
|
||||
}),
|
||||
quests: z.record(
|
||||
|
||||
Reference in New Issue
Block a user