diff --git a/src/app/(stats)/player/[ign]/_stats/skywars/components.tsx b/src/app/(stats)/player/[ign]/_stats/skywars/components.tsx index ea03e2a..ccde119 100644 --- a/src/app/(stats)/player/[ign]/_stats/skywars/components.tsx +++ b/src/app/(stats)/player/[ign]/_stats/skywars/components.tsx @@ -1,6 +1,6 @@ import { formatNumber } from "@/lib/formatters" import { getSkywarsLevel } from "@/lib/hypixel/skywars/level" -import { getPrestigeName, getSkyWarsIcon, getTextColor } from "@/lib/hypixel/skywars/skywars" +import { getPrestige, getSkyWarsIcon } from "@/lib/hypixel/skywars/skywars" import { cn } from "@/lib/utils" import GenericProgress from "../../_components/GenericProgress" import { HeadsBar, PresigeousHeads } from "./client" @@ -95,14 +95,14 @@ export function ShardProgress({ percent, shards }: { percent: number, shards: nu export function SkywarsLevel({ xp, icon }: { xp: number, icon: string | undefined }) { const level = getSkywarsLevel(xp) - const colors = getTextColor(Math.floor(level)) + const pres = getPrestige(Math.floor(level)) const swIcon = getSkyWarsIcon(icon) const val = `${Math.floor(level)}${swIcon}` - if (level > 150) { + if (pres.name.startsWith("Mythic")) { return ( -

- [ +

150 && "font-bold")}> + [ {`${val}`} - ] + ]

) } - if (level === 50) { -

- [ - - {`${val}`} - - ] -

+ function MapSkywarsPrestigeColors() { + if (typeof pres.colormap_2 === "string") { + return {val} + } + + return ( + <> + {val.split("").map((c, i) => { + if (level.toString().length === 2) { + return {c} + } else { + return {c} + } + })} + + ) } return (

- [ - {val} - ] + [ + + ]

) } @@ -158,7 +160,8 @@ export function SkywarsProgress({ level, percent, currentXp, ceilingXp }: { leve } function LevelNumber({ level, className }: { level: number, className?: string }) { - if (level > 150 || level === 50) { + const pres = getPrestige(level) + if (pres.name.startsWith("Mythic")) { return (
150 ? "font-bold" : undefined, className)} @@ -173,23 +176,31 @@ function LevelNumber({ level, className }: { level: number, className?: string } ) } - return
{level}
+ return
{level}
} function Progress({ level, percent, tooltipId, tooltipContent }: { level: number, percent: number, tooltipId: string, tooltipContent: string }) { - if (level > 150 || level === 50) { + const pres = getPrestige(level) + if (pres.name.startsWith("Mythic")) { return } - return + return ( + + ) } export function SkywarsPrestige({ level, icon }: { level: number, icon?: string }) { const swIcon = getSkyWarsIcon(icon) - const pres = getPrestigeName(level) - const val = `${pres} ${swIcon}` + const pres = getPrestige(level) + const val = `${pres.name} ${swIcon}` - if (level > 150 || level === 50) { + if (pres.name.startsWith("Mythic")) { return ( + {val} ) diff --git a/src/data/hypixel/skywars.ts b/src/data/hypixel/skywars.ts index 39a66b4..d3facd3 100644 --- a/src/data/hypixel/skywars.ts +++ b/src/data/hypixel/skywars.ts @@ -2,37 +2,204 @@ export const INITIAL_XP = [0, 20, 70, 150, 250, 500, 1000, 2000, 3500, 6000, 100 export const RECURRING_XP = 10000 as const export const PRESTIGES = [ - { level: 0, color: "gray", b_color: "gray", name: "None" }, - { level: 5, color: "white", b_color: "white", name: "Iron" }, - { level: 10, color: "gold", b_color: "gold", name: "Gold" }, - { level: 15, color: "aqua", b_color: "aqua", name: "Diamond" }, - { level: 20, color: "dark-green", b_color: "dark-green", name: "Emerald" }, - { level: 25, color: "dark-aqua", b_color: "dark-aqua", name: "Sapphire" }, - { level: 30, color: "dark-red", b_color: "dark-red", name: "Ruby" }, - { level: 35, color: "light-purple", b_color: "light-purple", name: "Crystal" }, - { level: 40, color: "blue", b_color: "blue", name: "Opal" }, - { level: 45, color: "purple", b_color: "purple", name: "Amethyst" }, - { level: 50, color: "rainbow", b_color: "red", name: "Rainbow" }, - { level: 55, color: "white", b_color: "gray", name: "First Class" }, - { level: 60, color: "red", b_color: "dark-red", name: "Assassin" }, - { level: 65, color: "white", b_color: "red", name: "Veteran" }, - { level: 70, color: "gold", b_color: "yellow", name: "God Like" }, - { level: 75, color: "blue", b_color: "white", name: "Warrior" }, - { level: 80, color: "aqua", b_color: "white", name: "Captain" }, - { level: 85, color: "dark-aqua", b_color: "white", name: "Soldier" }, - { level: 90, color: "dark-aqua", b_color: "green", name: "Infantry" }, - { level: 95, color: "yellow", b_color: "red", name: "Sergeant" }, - { level: 100, color: "dark-blue", b_color: "blue", name: "Lieutenant" }, - { level: 105, color: "dark-red", b_color: "gold", name: "Admiral" }, - { level: 110, color: "aqua", b_color: "dark-blue", name: "General" }, - { level: 115, color: "gray", b_color: "dark-gray", name: "Villain" }, - { level: 120, color: "purple", b_color: "light-purple", name: "Skilled" }, - { level: 125, color: "yellow", b_color: "white", name: "Sneaky" }, - { level: 130, color: "yellow", b_color: "red", name: "Overlord" }, - { level: 135, color: "red", b_color: "gold", name: "War Chief" }, - { level: 140, color: "red", b_color: "green", name: "Warlock" }, - { level: 145, color: "aqua", b_color: "green", name: "Emperor" }, - { level: 150, color: "rainbow", b_color: "red", name: "Mythic" } + { name: "Stone", level: 0, leftBracket: "gray", rightBracket: "gray", colormap_2: "gray", colormap_3: "gray" }, + { name: "Iron", level: 10, leftBracket: "white", rightBracket: "white", colormap_2: "white", colormap_3: "white" }, + { name: "Gold", level: 20, leftBracket: "gold", rightBracket: "gold", colormap_2: "gold", colormap_3: "gold" }, + { name: "Diamond", level: 30, leftBracket: "aqua", rightBracket: "aqua", colormap_2: "aqua", colormap_3: "aqua" }, + { name: "Ruby", level: 40, leftBracket: "red", rightBracket: "red", colormap_2: "red", colormap_3: "red" }, + { name: "Crystal", level: 50, leftBracket: "light-purple", rightBracket: "light-purple", colormap_2: "light-purple", colormap_3: "light-purple" }, + { name: "Amethyst", level: 60, leftBracket: "dark-purple", rightBracket: "dark-purple", colormap_2: "dark-purple", colormap_3: "dark-purple" }, + { name: "Opal", level: 70, leftBracket: "blue", rightBracket: "blue", colormap_2: "blue", colormap_3: "blue" }, + { name: "Topaz", level: 80, leftBracket: "yellow", rightBracket: "yellow", colormap_2: "yellow", colormap_3: "yellow" }, + { name: "Jade", level: 90, leftBracket: "green", rightBracket: "green", colormap_2: "green", colormap_3: "green" }, + { + name: "Mythic I", + level: 100, + leftBracket: "red", + rightBracket: "light-purple", + colormap_2: ["yellow", "green", "aqua"], + colormap_3: ["gold", "yellow", "green", "aqua"] + }, + { name: "Bloody", level: 110, leftBracket: "dark-red", rightBracket: "dark-red", colormap_2: "red", colormap_3: "red" }, + { name: "Cobalt", level: 120, leftBracket: "dark-blue", rightBracket: "dark-blue", colormap_2: "dark-blue", colormap_3: "dark-blue" }, + { name: "Content", level: 130, leftBracket: "red", rightBracket: "red", colormap_2: "white", colormap_3: "white" }, + { name: "Crimson", level: 140, leftBracket: "dark-red", rightBracket: "dark-red", colormap_2: "dark-red", colormap_3: "dark-red" }, + { name: "Firefly", level: 150, leftBracket: "gold", rightBracket: "gold", colormap_2: "yellow", colormap_3: "yellow" }, + { name: "Emerald", level: 160, leftBracket: "dark-green", rightBracket: "dark-green", colormap_2: "dark-green", colormap_3: "dark-green" }, + { name: "Abyss", level: 170, leftBracket: "dark-blue", rightBracket: "dark-blue", colormap_2: "blue", colormap_3: "blue" }, + { name: "Sapphire", level: 180, leftBracket: "dark-aqua", rightBracket: "dark-aqua", colormap_2: "dark-aqua", colormap_3: "dark-aqua" }, + { name: "Emergency", level: 190, leftBracket: "dark-red", rightBracket: "dark-red", colormap_2: "yellow", colormap_3: "yellow" }, + { + name: "Mythic II", + level: 200, + leftBracket: "gold", + rightBracket: "red", + colormap_2: ["green", "aqua", "light-purple"], + colormap_3: ["yellow", "green", "light-purple", "aqua"] + }, + { name: "Mulberry", level: 210, leftBracket: "dark-purple", rightBracket: "dark-purple", colormap_2: "light-purple", colormap_3: "light-purple" }, + { name: "Slate", level: 220, leftBracket: "dark-gray", rightBracket: "dark-gray", colormap_2: "dark-gray", colormap_3: "dark-gray" }, + { name: "Blood God", level: 230, leftBracket: "light-purple", rightBracket: "light-purple", colormap_2: "aqua", colormap_3: "aqua" }, + { name: "Midnight", level: 240, leftBracket: "black", rightBracket: "black", colormap_2: "black", colormap_3: "black" }, + { + name: "Sun", + level: 250, + leftBracket: "red", + rightBracket: "red", + colormap_2: ["yellow", "yellow", "gold"], + colormap_3: ["gold", "yellow", "yellow", "gold"] + }, + { + name: "Bulb", + level: 260, + leftBracket: "black", + rightBracket: "black", + colormap_2: ["gold", "gold", "yellow"], + colormap_3: ["yellow", "gold", "gold", "yellow"] + }, + { name: "Twilight", level: 270, leftBracket: "dark-blue", rightBracket: "dark-blue", colormap_2: "dark-aqua", colormap_3: "dark-aqua" }, + { + name: "Natural", + level: 280, + leftBracket: "green", + rightBracket: "dark-green", + colormap_2: ["green", "yellow", "green"], + colormap_3: ["dark-green", "green", "yellow", "green"] + }, + { name: "Icicle", level: 290, leftBracket: "blue", rightBracket: "blue", colormap_2: "aqua", colormap_3: "aqua" }, + { + name: "Mythic III", + level: 300, + leftBracket: "yellow", + rightBracket: "gold", + colormap_2: ["aqua", "light-purple", "red"], + colormap_3: ["green", "aqua", "light-purple", "red"] + }, + { name: "Graphite", level: 310, leftBracket: "dark-gray", rightBracket: "dark-gray", colormap_2: "gray", colormap_3: "gray" }, + { name: "Punk", level: 320, leftBracket: "light-purple", rightBracket: "light-purple", colormap_2: "green", colormap_3: "green" }, + { name: "Meltdown", level: 330, leftBracket: "yellow", rightBracket: "yellow", colormap_2: "red", colormap_3: "red" }, + { + name: "Iridescent", + level: 340, + leftBracket: "aqua", + rightBracket: "green", + colormap_2: ["aqua", "light-purple", "green"], + colormap_3: ["green", "aqua", "light-purple", "green"] + }, + { + name: "Marigold", + level: 350, + leftBracket: "white", + rightBracket: "gold", + colormap_2: ["yellow", "yellow", "gold"], + colormap_3: ["white", "yellow", "yellow", "gold"] + }, + { + name: "Beach", + level: 360, + leftBracket: "blue", + rightBracket: "yellow", + colormap_2: ["aqua", "white", "yellow"], + colormap_3: ["dark-aqua", "aqua", "white", "yellow"] + }, + { + name: "Spark", + level: 370, + leftBracket: "yellow", + rightBracket: "dark-gray", + colormap_2: ["white", "white", "dark-gray"], + colormap_3: ["yellow", "white", "white", "dark-gray"] + }, + { + name: "Target", + level: 380, + leftBracket: "red", + rightBracket: "red", + colormap_2: ["red", "red", "white"], + colormap_3: ["white", "red", "red", "white"] + }, + { name: "Limelight", level: 390, leftBracket: "dark-green", rightBracket: "dark-green", colormap_2: "green", colormap_3: "green" }, + { + name: "Mythic IV", + level: 400, + leftBracket: "green", + rightBracket: "yellow", + colormap_2: ["light-purple", "red", "gold"], + colormap_3: ["aqua", "light-purple", "red", "gold"] + }, + { name: "Cerulean", level: 410, leftBracket: "dark-aqua", rightBracket: "dark-aqua", colormap_2: "aqua", colormap_3: "aqua" }, + { + name: "Magical", + level: 420, + leftBracket: "black", + rightBracket: "black", + colormap_2: ["dark-gray", "dark-gray", "dark-purple"], + colormap_3: ["dark-purple", "dark-gray", "dark-gray", "dark-purple"] + }, + { + name: "Luminous", + level: 430, + leftBracket: "gold", + rightBracket: "dark-aqua", + colormap_2: ["white", "white", "aqua"], + colormap_3: ["gold", "white", "white", "aqua"] + }, + { + name: "Synthesis", + level: 440, + leftBracket: "green", + rightBracket: "white", + colormap_2: ["green", "yellow", "white"], + colormap_3: ["dark-green", "green", "yellow", "white"] + }, + { + name: "Burn", + level: 450, + leftBracket: "dark-red", + rightBracket: "white", + colormap_2: ["red", "gold", "yellow"], + colormap_3: ["dark-red", "red", "gold", "yellow"] + }, + { + name: "Dramatic", + level: 460, + leftBracket: "blue", + rightBracket: "dark-red", + colormap_2: ["dark-aqua", "light-purple", "dark-purple"], + colormap_3: ["aqua", "dark-aqua", "light-purple", "dark-purple"] + }, + { + name: "Radiant", + level: 470, + leftBracket: "black", + rightBracket: "dark-gray", + colormap_2: ["gray", "white", "gray"], + colormap_3: ["dark-gray", "gray", "white", "gray"] + }, + { + name: "Tidal", + level: 480, + leftBracket: "dark-blue", + rightBracket: "white", + colormap_2: ["blue", "dark-aqua", "aqua"], + colormap_3: ["dark-blue", "blue", "dark-aqua", "aqua"] + }, + { + name: "Firework", + level: 490, + leftBracket: "blue", + rightBracket: "dark-red", + colormap_2: ["white", "white", "red"], + colormap_3: ["aqua", "white", "white", "red"] + }, + { + name: "Mythic V", + level: 500, + leftBracket: "aqua", + rightBracket: "green", + colormap_2: ["red", "gold", "yellow"], + colormap_3: ["light-purple", "red", "gold", "yellow"] + } ] as const export const ICONS = { @@ -106,3 +273,4 @@ export const HEADS = [ { id: "divine", name: "Divine", color: "gold" }, { id: "heavenly", name: "Heavenly", color: "dark-purple" } ] as const + diff --git a/src/lib/hypixel/skywars/skywars.ts b/src/lib/hypixel/skywars/skywars.ts index 12a7c18..6390d25 100644 --- a/src/lib/hypixel/skywars/skywars.ts +++ b/src/lib/hypixel/skywars/skywars.ts @@ -32,22 +32,14 @@ export function concatSkywarsStats(...stats: SkywarsModeStats[]) { ] } -export function getTextColor(level: number) { - const floored = floorLevel(level, 5) +export function getPrestige(level: number) { + const floored = floorLevel(level, 10) - if (level > 150) { - return { - text: PRESTIGES.at(-1)?.color ?? "gray", - brackets: PRESTIGES.at(-1)?.b_color ?? "gray" - } + if (level > PRESTIGES.at(-1)!.level) { + PRESTIGES.at(-1)! } - const pres = PRESTIGES.find(p => p.level === floored) - - return { - text: pres?.color ?? "gray", - brackets: pres?.b_color ?? "gray" - } + return PRESTIGES.find(p => p.level === floored)! } export function getSkyWarsIcon(icon?: string) { @@ -60,14 +52,6 @@ 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 -} - export type _SkywarsStats = Record type Mode = | "normal" diff --git a/đ b/đ new file mode 100644 index 0000000..01cde9d --- /dev/null +++ b/đ @@ -0,0 +1,236 @@ +import { formatNumber } from "@/lib/formatters" +import { getSkywarsLevel } from "@/lib/hypixel/skywars/level" +import { getPrestige, getSkyWarsIcon } from "@/lib/hypixel/skywars/skywars" +import { cn } from "@/lib/utils" +import GenericProgress from "../../_components/GenericProgress" +import { HeadsBar, PresigeousHeads } from "./client" + +type SkywarsHeadsProps = { + heads: number + heads_special: { + eww: number + yucky: number + meh: number + decent: number + salty: number + tasty: number + succulent: number + sweet: number + divine: number + heavenly: number + } + prestigeous: { username: string, timestamp: number, sacrifice: string }[] +} + +export function SkywarsHeads({ + heads, + heads_special, + prestigeous +}: SkywarsHeadsProps) { + const total_special = Object.values(heads_special).reduce((a, b) => a + b) + const percentages = { + heavenly: heads_special.heavenly, + divine: heads_special.divine, + sweet: heads_special.sweet, + succulent: heads_special.succulent, + tasty: heads_special.tasty, + salty: heads_special.salty, + decent: heads_special.decent, + meh: heads_special.meh, + yucky: heads_special.yucky, + eww: heads_special.eww, + rest: (heads - total_special) + } + + const headsArray = Object.entries(percentages) + + return ( +
+

+ {"Total Heads Gathered: "} + {formatNumber(heads)} +

+ {total_special > 0 ? :

This person has no heads collected.

} +

Prestigious Head Collection

+ {prestigeous.length > 0 ? :

No prestigeous heads. Now what a skill issue.

} +
+ ) +} + +export function AngelOfDeath( + { shards, lifetime_shards, opals, lifetime_opals }: { shards: number, lifetime_shards: number, opals: number, lifetime_opals: number } +) { + return ( +
+

+ {"Shards: "} + {shards} +

+

+ {"Opals: "} + {opals} +

+

+ {"Lifetime Shards: "} + {formatNumber(lifetime_shards)} +

+

+ {"Lifetime Opals: "} + {lifetime_opals} +

+
+ ) +} + +export function ShardProgress({ percent, shards }: { percent: number, shards: number }) { + return ( +
+

Shard Progress

+
+ +
+
+ ) +} + +export function SkywarsLevel({ xp, icon }: { xp: number, icon: string | undefined }) { + const level = getSkywarsLevel(xp) + const pres = getPrestige(Math.floor(level)) + const swIcon = getSkyWarsIcon(icon) + const val = `${Math.floor(level)}${swIcon}` + + // if (level > 150) { + // return ( + //

+ // [ + // + // {`${val}`} + // + // ] + //

+ // ) + // } + // + // if (level === 50) { + //

+ // [ + // + // {`${val}`} + // + // ] + //

+ // } + + function MapSkywarsPrestigeColors() { + if (typeof pres.colormap_2 === "string") { + return {val} + } + + return ( + <> + {val.split("").map((c, i) => { + if (level.toString().length === 2) { + return {c} + } else { + } + })} + + ) + } + + return ( +

+ [ + + ] +

+ ) +} + +export function SkywarsProgress({ level, percent, currentXp, ceilingXp }: { level: number, percent: number, currentXp: number, ceilingXp: 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, tooltipId, tooltipContent }: { level: number, percent: number, tooltipId: string, tooltipContent: string }) { + if (level > 150 || level === 50) { + return + } + + return ( + + ) +} + +export function SkywarsPrestige({ level, icon }: { level: number, icon?: string }) { + const swIcon = getSkyWarsIcon(icon) + const pres = getPrestige(level) + const val = `${pres} ${swIcon}` + + // if (level > 150 || level === 50) { + // return ( + // 150 ? "font-bold" : undefined} + // > + // {val} + // + // ) + // } + + return ( + + {val} + + ) +}