diff --git a/src/app/(stats)/player/[ign]/_stats/skywars/skywars-components.tsx b/src/app/(stats)/player/[ign]/_stats/skywars/skywars-components.tsx index e881df1..502f34e 100644 --- a/src/app/(stats)/player/[ign]/_stats/skywars/skywars-components.tsx +++ b/src/app/(stats)/player/[ign]/_stats/skywars/skywars-components.tsx @@ -1,5 +1,6 @@ -import { getSkyWarsIcon, getTextColor } from "@/lib/hypixel/skywars" +import { getPrestigeName, getSkyWarsIcon, getTextColor } from "@/lib/hypixel/skywars" import { getSkywarsLevel } from "@/lib/hypixel/skyWarsLevel" +import { cn } from "@/lib/utils" export function SkywarsLevel({ xp, icon }: { xp: number, icon: string | undefined }) { const level = getSkywarsLevel(xp) @@ -49,3 +50,77 @@ export function SkywarsLevel({ xp, icon }: { xp: number, icon: string | undefine

) } + +export function SkywarsProgress({ level, percent }: { level: number, percent: number }) { + return ( +
+ + +
+ +
+ ) +} + +function LevelNumber({ level, className }: { level: number, className?: string }) { + if (level > 150 || level === 50) { + return ( +
150 ? "font-bold" : undefined, className)} + style={{ + backgroundImage: "linear-gradient(to left,#a0a,#f5f,#5ff,#5f5,#ff5,#fa0,#f55)", + WebkitBackgroundClip: "text", + color: "transparent" + }} + > + {level} +
+ ) + } + + return
{level}
+} + +function Progress({ level, percent }: { level: number, percent: number }) { + if (level > 150 || level === 50) { + return ( +
+
+ ) + } + + return
+} + +export function SkywarsPrestige({ level, icon }: { level: number, icon?: string }) { + const swIcon = getSkyWarsIcon(icon) + const pres = getPrestigeName(level) + const val = `${pres} ${swIcon}` + + if (level > 150 || level === 50) { + return ( + 150 ? "font-bold" : undefined} + > + {val} + + ) + } + + return ( + + {val} + + ) +} diff --git a/src/app/(stats)/player/[ign]/_stats/skywars/skywars.tsx b/src/app/(stats)/player/[ign]/_stats/skywars/skywars.tsx index b978804..48a70c8 100644 --- a/src/app/(stats)/player/[ign]/_stats/skywars/skywars.tsx +++ b/src/app/(stats)/player/[ign]/_stats/skywars/skywars.tsx @@ -4,11 +4,14 @@ import { Card, CardContent } from "@/components/ui/card" import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible" import { Separator } from "@/components/ui/separator" import { formatNumber } from "@/lib/formatters" +import { getProgress } from "@/lib/hypixel/general" +import { getSkywarsLevel, getSkywarsXpForLevel } from "@/lib/hypixel/skyWarsLevel" import { Player } from "@/lib/schema/player" import { ChevronDown, ChevronUp } from "lucide-react" import { useEffect, useRef, useState } from "react" import CollapsedStats from "../../_components/CollapsedStats" -import { SkywarsLevel } from "./skywars-components" +import { SkywarsLevel, SkywarsProgress } from "./skywars-components" +import SkyWarsGeneralStats from "./stats" export default function SkyWarsStats({ stats }: { stats: Player["player"]["stats"]["SkyWars"] }) { const ref = useRef(null) @@ -36,9 +39,16 @@ export default function SkyWarsStats({ stats }: { stats: Player["player"]["stats if (!stats) return null + const level = getSkywarsLevel(stats.skywars_experience) const kd = (stats.kills / stats.deaths).toFixed(2) const wl = (stats.wins / stats.losses).toFixed(2) + const percent = getProgress( + getSkywarsXpForLevel(Math.floor(level)), + stats.skywars_experience, + getSkywarsXpForLevel(Math.floor(level) + 1) + ) + return ( @@ -73,6 +83,8 @@ export default function SkyWarsStats({ stats }: { stats: Player["player"]["stats + + diff --git a/src/app/(stats)/player/[ign]/_stats/skywars/stats.tsx b/src/app/(stats)/player/[ign]/_stats/skywars/stats.tsx new file mode 100644 index 0000000..727ed0e --- /dev/null +++ b/src/app/(stats)/player/[ign]/_stats/skywars/stats.tsx @@ -0,0 +1,29 @@ +import { formatNumber } from "@/lib/formatters" +import { Player } from "@/lib/schema/player" +import { BasicStat, Stat } from "../../_components/Stats" +import { SkywarsPrestige } from "./skywars-components" + +export default function SkyWarsGeneralStats({ + statsChecked, + level +}: { + statsChecked: Player["player"]["stats"]["SkyWars"] + level: number +}) { + const stats = statsChecked! + + return ( +
+
+ + + + + + +
+
+
+
+ ) +} diff --git a/src/lib/hypixel/skyWarsLevel.ts b/src/lib/hypixel/skyWarsLevel.ts index 02d3d7f..3fa5595 100644 --- a/src/lib/hypixel/skyWarsLevel.ts +++ b/src/lib/hypixel/skyWarsLevel.ts @@ -11,3 +11,27 @@ export function getSkywarsLevel(xp: number) { return 0 } + +export function getSkywarsXpForLevel(level: number) { + const xps = [0, 20, 70, 150, 250, 500, 1000, 2000, 3500, 6000, 10000, 15000] + + if (level >= 12) { + return (level - 12) * 10000 + 15000 + } + + const baseLevel = Math.floor(level) + const progress = level - baseLevel + + if (baseLevel >= xps.length) { + return xps[xps.length - 1] + } + + if (baseLevel === 0) { + return progress * xps[1] + } + + const baseXp = xps[baseLevel] + const nextXp = xps[baseLevel + 1] || 15000 + + return baseXp + progress * (nextXp - baseXp) +} diff --git a/src/lib/hypixel/skywars.ts b/src/lib/hypixel/skywars.ts index 3952c71..cb5c979 100644 --- a/src/lib/hypixel/skywars.ts +++ b/src/lib/hypixel/skywars.ts @@ -28,3 +28,11 @@ export function getSkyWarsIcon(icon?: string) { return icons[icon] ?? ICONS.default } + +export function getPrestigeName(level: number) { + const floored = floorLevel(level, 5) + + if (level > 150) return PRESTIGES.at(-1)!.name + + return PRESTIGES.find(p => p.level === floored)!.name +} diff --git a/src/lib/schema/stats.ts b/src/lib/schema/stats.ts index b6374dc..ecd0264 100644 --- a/src/lib/schema/stats.ts +++ b/src/lib/schema/stats.ts @@ -195,5 +195,7 @@ export const skywarsStatsSchema = z.looseObject({ kills: z.number().default(0), deaths: z.number().default(0), wins: z.number().default(0), - losses: z.number().default(0) + losses: z.number().default(0), + cosmetic_tokens: z.number().default(0), + coins: z.number().default(0) })