diff --git a/src/app/(stats)/player/[ign]/_stats/copsandcrims/copsandcrims.tsx b/src/app/(stats)/player/[ign]/_stats/copsandcrims/copsandcrims.tsx index afbc121..ea92df9 100644 --- a/src/app/(stats)/player/[ign]/_stats/copsandcrims/copsandcrims.tsx +++ b/src/app/(stats)/player/[ign]/_stats/copsandcrims/copsandcrims.tsx @@ -8,6 +8,7 @@ import { NonNullStats } from "@/lib/schema/player" import CollapsedStats from "../../_components/CollapsedStats" import CopsAndCrimsGeneralStats from "./stats" import CopsAndCrimsStatTable from "./table" +import CopsAndCrimsWeaponStats from "./weapons" export default function CopsAndCrimsStats({ stats }: { stats: NonNullStats["CopsAndCrims"] }) { if (!stats) return null @@ -55,6 +56,8 @@ export default function CopsAndCrimsStats({ stats }: { stats: NonNullStats["Cops + + diff --git a/src/app/(stats)/player/[ign]/_stats/copsandcrims/weapons.tsx b/src/app/(stats)/player/[ign]/_stats/copsandcrims/weapons.tsx new file mode 100644 index 0000000..97074f1 --- /dev/null +++ b/src/app/(stats)/player/[ign]/_stats/copsandcrims/weapons.tsx @@ -0,0 +1,62 @@ +import { + getCopsAndCrimsGunName, + getCopsAndCrimsGunUgrade, + getCopsAndCrimsGunUgradeColor, + getCopsAndCrimsUpgardeName +} from "@/lib/hypixel/copsandcrims/general" +import { romanize } from "@/lib/hypixel/general" +import { NonNullStats } from "@/lib/schema/player" +import { GenericProgressNoTooltip } from "../../_components/GenericProgress" + +export default function CopsAndCrimsWeaponStats({ stats }: { stats: NonNullable }) { + return ( +
+

Weapons

+
+ + + + + + + + + + + + +
+
+ ) +} + +function KnifeStats({ gunId, stats }: { gunId: Parameters[0], stats: NonNullable }) { + const name = getCopsAndCrimsGunName(gunId) + const upgrades = getCopsAndCrimsGunUgrade(gunId, stats) + return ( +
+

{name}

+
+
+ {upgrades.map((u, i) => { + const upgrade = getCopsAndCrimsUpgardeName(u.upgradeId) + return

{upgrade}

+ })} +
+
+ {upgrades.map((u, i) => { + const color = getCopsAndCrimsGunUgradeColor(u.value) + const percent = u.value / 9 * 100 + return ( +
+ {percent !== 0 ? + : +
-
} +
+ ) + })} +
+
+
+ ) +} diff --git a/src/lib/hypixel/copsandcrims/general.ts b/src/lib/hypixel/copsandcrims/general.ts index 42c2693..48d13f9 100644 --- a/src/lib/hypixel/copsandcrims/general.ts +++ b/src/lib/hypixel/copsandcrims/general.ts @@ -1,7 +1,39 @@ -import { MODES, SCORE } from "@/data/hypixel/copsandcrims" +import { GUNS, MODES, SCORE, UPGRADELEVELS, UPGRADES } from "@/data/hypixel/copsandcrims" import { NonNullStats } from "@/lib/schema/player" import { devide } from "../general" +export function getCopsAndCrimsGunUgradeColor(num: number) { + for (const upgradeLevel of UPGRADELEVELS.slice().reverse()) { + if (upgradeLevel.level <= num) return upgradeLevel.color + } + + return UPGRADELEVELS.at(0)!.color +} + +export function getCopsAndCrimsUpgardeName(upgradeId: typeof UPGRADES[number]["id"]) { + return UPGRADES.find(g => g.id === upgradeId)!.name +} + +export function getCopsAndCrimsGunName(gunId: typeof GUNS[number]["id"]) { + return GUNS.find(g => g.id === gunId)!.name +} + +export function getCopsAndCrimsGunUgrade(gunId: typeof GUNS[number]["id"], stats: NonNullable) { + return UPGRADES.map(upgrade => { + if (upgrade.id === "charge_bonus") return -1 + if (upgrade.id === "attack_delay") return -1 + + return { upgradeId: upgrade.id, value: stats[`${gunId}_${upgrade.id}`] } + }).filter(v => typeof v !== "number") +} + +export function getCopsAndCrimsExtraUpgrade(stats: NonNullable) { + return { + sniper: stats["sniper_charge_bonus"], + knife: stats["knife_attack_delay"] + } +} + export function getCopsAndCrimsModeName(modeId: typeof MODES[number]["id"]) { return MODES.find(m => m.id === modeId)!.name } diff --git a/src/lib/schema/stats.ts b/src/lib/schema/stats.ts index cafe92c..38d1514 100644 --- a/src/lib/schema/stats.ts +++ b/src/lib/schema/stats.ts @@ -660,6 +660,40 @@ export const megawallsStats = z.looseObject({ ...megawallsModeStats() }) +function copsAndCrimsGunUpgrades() { + const ids = [ + "knife", + "pistol", + "handgun", + "magnum", + "sniper", + "bullpup", + "smg", + "rifle", + "carbine", + "scoped_rifle", + "shotgun", + "auto_shotgun" + ] as const + + const upgrades = [ + "damage_increase", + "recoil_reduction", + "reload_speed_reduction", + "cost_reduction" + ] as const + + const entries = new Map>() + + for (const id of ids) { + for (const upgrade of upgrades) { + entries.set(`${id}_${upgrade}`, z.number().default(0)) + } + } + + return Object.fromEntries(entries) as Record<`${typeof ids[number]}_${typeof upgrades[number]}`, z.ZodDefault> +} + export const copsAndCrimsStatsSchema = z.looseObject({ kills: z.number().default(0), assists: z.number().default(0), @@ -684,5 +718,8 @@ export const copsAndCrimsStatsSchema = z.looseObject({ shots_fired: z.number().default(0), coins: z.number().default(0), round_wins: z.number().default(0), - headshot_kills: z.number().default(0) + headshot_kills: z.number().default(0), + knife_attack_delay: z.number().default(0), + sniper_charge_bonus: z.number().default(0), + ...copsAndCrimsGunUpgrades() })