From 6c19b059c4fe7f1383a7ede3bd7e2ac5279c29ab Mon Sep 17 00:00:00 2001
From: Taken
Date: Sun, 14 Sep 2025 13:59:58 +0200
Subject: [PATCH] Added arcade stat card
---
.../player/[ign]/_stats/arcade/arcade.tsx | 23 ++++++++++
src/app/(stats)/player/[ign]/page.tsx | 2 +
src/data/hypixel/arcade.ts | 24 +++++++++++
src/lib/hypixel/arcade/general.ts | 14 ++++++
src/lib/schema/player.ts | 4 +-
src/lib/schema/stats.ts | 43 +++++++++++++++++++
6 files changed, 109 insertions(+), 1 deletion(-)
create mode 100644 src/app/(stats)/player/[ign]/_stats/arcade/arcade.tsx
create mode 100644 src/data/hypixel/arcade.ts
create mode 100644 src/lib/hypixel/arcade/general.ts
diff --git a/src/app/(stats)/player/[ign]/_stats/arcade/arcade.tsx b/src/app/(stats)/player/[ign]/_stats/arcade/arcade.tsx
new file mode 100644
index 0000000..7601d37
--- /dev/null
+++ b/src/app/(stats)/player/[ign]/_stats/arcade/arcade.tsx
@@ -0,0 +1,23 @@
+import { Separator } from "@/components/ui/separator"
+import { getArcadeTotalWins } from "@/lib/hypixel/arcade/general"
+import { NonNullStats } from "@/lib/schema/player"
+import GeneralStats from "../GeneralStats"
+
+export default function ArcadeStats({ stats }: { stats: NonNullStats["Arcade"] }) {
+ if (!stats) return null
+
+ const wins = getArcadeTotalWins(stats)
+
+ return (
+ Wins
,
+ stat: {wins}
+ }]}
+ >
+
+
+ )
+}
diff --git a/src/app/(stats)/player/[ign]/page.tsx b/src/app/(stats)/player/[ign]/page.tsx
index a9d1871..0b3b6b1 100644
--- a/src/app/(stats)/player/[ign]/page.tsx
+++ b/src/app/(stats)/player/[ign]/page.tsx
@@ -12,6 +12,7 @@ import { Metadata } from "next"
import { Suspense } from "react"
import { PlayerPageLoadText } from "./_client"
import Sidebar from "./_components/Sidebar"
+import ArcadeStats from "./_stats/arcade/arcade"
import BedwarsStats from "./_stats/bedwars/bedwars"
import BlitzStats from "./_stats/blitz/blitz"
import BuildBattleStats from "./_stats/build-battle/build-battle"
@@ -132,6 +133,7 @@ async function SuspendedPage({ params }: Pick, "param
+
) :
diff --git a/src/data/hypixel/arcade.ts b/src/data/hypixel/arcade.ts
new file mode 100644
index 0000000..b302128
--- /dev/null
+++ b/src/data/hypixel/arcade.ts
@@ -0,0 +1,24 @@
+export const WINS = [
+ "wins_dayone",
+ "wins_oneinthequiver",
+ "wins_dragonwars2",
+ "wins_easter_simulator",
+ "wins_ender",
+ "wins_farm_hunt",
+ "wins_soccer",
+ "sw_game_wins",
+ "wins_grinch_simulator_v2",
+ "wins_halloween_simulator",
+ "seeker_wins_hide_and_seek",
+ "hider_wins_hide_and_seek",
+ "wins_hole_in_the_wall",
+ "wins_simon_says",
+ "wins_party",
+ "wins_party_2",
+ "wins_party_3",
+ "wins_draw_their_thing",
+ "wins_scuba_simulator",
+ "wins_throw_out",
+ "wins_mini_walls",
+ "wins_zombies"
+] as const
diff --git a/src/lib/hypixel/arcade/general.ts b/src/lib/hypixel/arcade/general.ts
new file mode 100644
index 0000000..3a3a32f
--- /dev/null
+++ b/src/lib/hypixel/arcade/general.ts
@@ -0,0 +1,14 @@
+import { WINS } from "@/data/hypixel/arcade"
+import { NonNullStats } from "@/lib/schema/player"
+
+export function getArcadeTotalWins(stats: NonNullable) {
+ let wins = 0
+ for (const win of WINS) {
+ wins = wins + stats[win]
+ }
+
+ if (stats.dropper) wins = wins + stats.dropper.wins
+ if (stats.pixel_party) wins = wins + stats.pixel_party.wins
+
+ return wins
+}
diff --git a/src/lib/schema/player.ts b/src/lib/schema/player.ts
index 8c93088..3fd8288 100644
--- a/src/lib/schema/player.ts
+++ b/src/lib/schema/player.ts
@@ -1,5 +1,6 @@
import z from "zod"
import {
+ arcadeStatsSchema,
bedwarsStatsSchema,
blitzStatsSchema,
buildBattleStatsSchema,
@@ -38,7 +39,8 @@ export const playerSchema = z.looseObject({
Walls3: megawallsStats.optional(),
MCGO: copsAndCrimsStatsSchema.optional(),
WoolGames: woolGamesStatsSchema.optional(),
- HungerGames: blitzStatsSchema.optional()
+ HungerGames: blitzStatsSchema.optional(),
+ Arcade: arcadeStatsSchema.optional()
}).transform(({ Walls3, MCGO, HungerGames, ...rest }) => {
return {
MegaWalls: Walls3,
diff --git a/src/lib/schema/stats.ts b/src/lib/schema/stats.ts
index 9736fc2..c6dfa1f 100644
--- a/src/lib/schema/stats.ts
+++ b/src/lib/schema/stats.ts
@@ -878,3 +878,46 @@ export const blitzStatsSchema = z.object({
...blitzKitPlayedStats().kits,
...blitzKitPlayedStats().prestiges
})
+
+function arcadeModeWins() {
+ const ids = [
+ "wins_dayone",
+ "wins_oneinthequiver",
+ "wins_dragonwars2",
+ "wins_easter_simulator",
+ "wins_ender",
+ "wins_farm_hunt",
+ "wins_soccer",
+ "sw_game_wins",
+ "wins_grinch_simulator_v2",
+ "wins_halloween_simulator",
+ "seeker_wins_hide_and_seek",
+ "hider_wins_hide_and_seek",
+ "wins_hole_in_the_wall",
+ "wins_simon_says",
+ "wins_party",
+ "wins_party_2",
+ "wins_party_3",
+ "wins_draw_their_thing",
+ "wins_scuba_simulator",
+ "wins_throw_out",
+ "wins_mini_walls",
+ "wins_zombies"
+ ] as const
+
+ const entries = new Map>()
+ for (const id of ids) {
+ entries.set(`${id}`, z.number().default(0))
+ }
+ return Object.fromEntries(entries) as Record<`${typeof ids[number]}`, z.ZodDefault>
+}
+
+export const arcadeStatsSchema = z.object({
+ pixel_party: z.object({
+ wins: z.number().default(0)
+ }).optional(),
+ dropper: z.object({
+ wins: z.number().default(0)
+ }).optional(),
+ ...arcadeModeWins()
+})