Fixed other arcade stats

This commit is contained in:
2025-09-15 11:14:15 +02:00
parent 3db30213e0
commit 4d3956b1ee
5 changed files with 187 additions and 8 deletions

View File

@@ -4,6 +4,7 @@ import { getArcadeTotalWins } from "@/lib/hypixel/arcade/general"
import { NonNullStats } from "@/lib/schema/player" import { NonNullStats } from "@/lib/schema/player"
import { BasicStat } from "../../_components/Stats" import { BasicStat } from "../../_components/Stats"
import GeneralStats from "../GeneralStats" import GeneralStats from "../GeneralStats"
import ArcadeOtherStats from "./other"
import { ArcadeMiniWallsStats, ArcadePixelPartyStats, ArcadeZombieStats } from "./stats" import { ArcadeMiniWallsStats, ArcadePixelPartyStats, ArcadeZombieStats } from "./stats"
export default function ArcadeStats({ stats }: { stats: NonNullStats["Arcade"] }) { export default function ArcadeStats({ stats }: { stats: NonNullStats["Arcade"] }) {
@@ -31,6 +32,8 @@ export default function ArcadeStats({ stats }: { stats: NonNullStats["Arcade"] }
<Separator className="my-4" /> <Separator className="my-4" />
<ArcadeZombieStats stats={stats} /> <ArcadeZombieStats stats={stats} />
<Separator className="my-4" /> <Separator className="my-4" />
<ArcadeOtherStats stats={stats} />
<Separator className="my-4" />
</GeneralStats> </GeneralStats>
) )
} }

View File

@@ -0,0 +1,122 @@
import { formatMillisecondsToTime, formatNumber } from "@/lib/formatters"
import { devide } from "@/lib/hypixel/general"
import { NonNullStats } from "@/lib/schema/player"
import { capitalizeFirstLetter } from "@/lib/utils"
import { ReactNode } from "react"
import { BasicStat } from "../../_components/Stats"
export default function ArcadeOtherStats({ stats }: { stats: NonNullable<NonNullStats["Arcade"]> }) {
return (
<div className="grid grid-cols-3 gap-2">
<ArcadeOtherStat title="Blocking Dead">
<BasicStat title="Wins: " value={formatNumber(stats.wins_dayone)} />
<BasicStat title="Kills: " value={formatNumber(stats.kills_dayone)} />
<BasicStat title="Headshots: " value={formatNumber(stats.headshots_dayone)} />
<BasicStat
title="Melee Weapon: "
value={stats.melee_weapon?.toLowerCase() !== undefined
? capitalizeFirstLetter(stats.melee_weapon?.toLowerCase()).split("_").join(" ")
: "Unknown"}
/>
</ArcadeOtherStat>
<ArcadeOtherStat title="Bounty Hunters">
<BasicStat title="Wins: " value={formatNumber(stats.wins_oneinthequiver)} />
<BasicStat title="Kills: " value={formatNumber(stats.kills_oneinthequiver)} />
<BasicStat title="Deaths: " value={formatNumber(stats.deaths_oneinthequiver)} />
<BasicStat title="Kill/Death Ratio: " value={formatNumber(devide(stats.kills_oneinthequiver, stats.deaths_oneinthequiver))} />
</ArcadeOtherStat>
<ArcadeOtherStat title="Creeper Attack">
<BasicStat title="Best Wave: " value={formatNumber(stats.max_wave)} />
</ArcadeOtherStat>
<ArcadeOtherStat title="Dragon Wars">
<BasicStat title="Wins: " value={formatNumber(stats.wins_dragonwars2)} />
<BasicStat title="Kills: " value={formatNumber(stats.kills_dragonwars2)} />
</ArcadeOtherStat>
<ArcadeOtherStat title="Dropper">
<BasicStat title="Wins: " value={formatNumber(stats.dropper?.wins || 0)} />
<BasicStat title="Flawless Games: " value={formatNumber(stats.dropper?.flawless_games || 0)} />
<BasicStat title="Games Completed: " value={formatNumber(stats.dropper?.games_finished || 0)} />
<BasicStat title="Maps Completed: " value={formatNumber(stats.dropper?.maps_completed || 0)} />
<BasicStat title="Fastest Game: " value={formatMillisecondsToTime(stats.dropper?.fastest_game || 0)} />
<BasicStat title="Fails: " value={formatNumber(stats.dropper?.fails || 0)} />
</ArcadeOtherStat>
<ArcadeOtherStat title="Easter Simulator">
<BasicStat title="Wins: " value={formatNumber(stats.wins_easter_simulator)} />
<BasicStat title="Eggs Found: " value={formatNumber(stats.eggs_found_easter_simulator)} />
</ArcadeOtherStat>
<ArcadeOtherStat title="Ender Spleef">
<BasicStat title="Wins: " value={formatNumber(stats.wins_ender)} />
</ArcadeOtherStat>
<ArcadeOtherStat title="Farm Hunt">
<BasicStat title="Wins: " value={formatNumber(stats.wins_farm_hunt)} />
<BasicStat title="Poop Collected: " value={formatNumber(stats.poop_collected)} />
</ArcadeOtherStat>
<ArcadeOtherStat title="Football">
<BasicStat title="Wins: " value={formatNumber(stats.wins_soccer)} />
<BasicStat title="Goals: " value={formatNumber(stats.goals_soccer)} />
<BasicStat title="Kicks: " value={formatNumber(stats.kicks_soccer)} />
<BasicStat title="Powerkicks: " value={formatNumber(stats.powerkicks_soccer)} />
</ArcadeOtherStat>
<ArcadeOtherStat title="Galaxy Wars">
<BasicStat title="Wins: " value={formatNumber(stats.sw_game_wins)} />
<BasicStat title="Kills: " value={formatNumber(stats.sw_kills)} />
<BasicStat title="Empire Kills: " value={formatNumber(stats.sw_empire_kills)} />
<BasicStat title="Rebel Kills: " value={formatNumber(stats.sw_rebel_kills)} />
<BasicStat title="Deaths: " value={formatNumber(stats.sw_deaths)} />
<BasicStat title="Kill/Death Ratio: " value={formatNumber(devide(stats.sw_kills, stats.sw_deaths))} />
<BasicStat title="Shots Fired: " value={formatNumber(stats.sw_shots_fired)} />
</ArcadeOtherStat>
<ArcadeOtherStat title="Grinch Simulator v2">
<BasicStat title="Wins: " value={formatNumber(stats.wins_grinch_simulator_v2)} />
<BasicStat title="Presents Stolen: " value={formatNumber(stats.gifts_grinch_simulator_v2)} />
</ArcadeOtherStat>
<ArcadeOtherStat title="Halloween Simulator">
<BasicStat title="Wins: " value={formatNumber(stats.wins_halloween_simulator)} />
<BasicStat title="Candy Found: " value={formatNumber(stats.candy_found_halloween_simulator)} />
</ArcadeOtherStat>
<ArcadeOtherStat title="Hide and Seek">
<BasicStat title="Wins as Seeker: " value={formatNumber(stats.seeker_wins_hide_and_seek)} />
<BasicStat title="Wins as Hider: " value={formatNumber(stats.hider_wins_hide_and_seek)} />
</ArcadeOtherStat>
<ArcadeOtherStat title="Hole in the Wall">
<BasicStat title="Wins: " value={formatNumber(stats.wins_hole_in_the_wall)} />
<BasicStat title="Highest Score Qualifications: " value={formatNumber(stats.hitw_record_q)} />
<BasicStat title="Highest Score Finals: " value={formatNumber(stats.hitw_record_f)} />
</ArcadeOtherStat>
<ArcadeOtherStat title="Hypixel Says">
<BasicStat title="Wins: " value={formatNumber(stats.wins_simon_says)} />
<BasicStat title="Rounds: " value={formatNumber(stats.rounds_simon_says)} />
</ArcadeOtherStat>
<ArcadeOtherStat title="Party Games">
<BasicStat title="Wins: " value={formatNumber(stats.wins_party + stats.wins_party_2 + stats.wins_party_3)} />
</ArcadeOtherStat>
<ArcadeOtherStat title="Pixel Painters">
<BasicStat title="Wins: " value={formatNumber(stats.wins_draw_their_thing)} />
</ArcadeOtherStat>
<ArcadeOtherStat title="Santa Simulator">
<BasicStat title="Presents Delivered: " value={formatNumber(stats.delivered_santa_simulator)} />
<BasicStat title="Times Spotted: " value={formatNumber(stats.spotted_santa_simulator)} />
</ArcadeOtherStat>
<ArcadeOtherStat title="Scuba Simulator">
<BasicStat title="Wins: " value={formatNumber(stats.wins_scuba_simulator)} />
<BasicStat title="Items Found: " value={formatNumber(stats.items_found_scuba_simulator)} />
<BasicStat title="Total Points: " value={formatNumber(stats.total_points_scuba_simulator)} />
</ArcadeOtherStat>
<ArcadeOtherStat title="Throw Out">
<BasicStat title="Wins: " value={formatNumber(stats.wins_throw_out)} />
<BasicStat title="Kills: " value={formatNumber(stats.kills_throw_out)} />
<BasicStat title="Deaths: " value={formatNumber(stats.deaths_throw_out)} />
<BasicStat title="Kill/Death Ratio: " value={formatNumber(devide(stats.kills_throw_out, stats.deaths_throw_out))} />
</ArcadeOtherStat>
</div>
)
}
function ArcadeOtherStat({ title, children }: { title: string, children: ReactNode }) {
return (
<div>
<h2 className="pb-5 text-xl font-bold">{title}</h2>
{children}
</div>
)
}

View File

@@ -78,24 +78,24 @@ export function ArcadeMiniWallsStats({ stats }: { stats: NonNullable<NonNullStat
<h2 className="pb-5 text-xl font-bold">Mini Walls</h2> <h2 className="pb-5 text-xl font-bold">Mini Walls</h2>
<div className="flex"> <div className="flex">
<div className="flex-1"> <div className="flex-1">
<BasicStat title="Wins: " value={stats.wins_mini_walls} /> <BasicStat title="Wins: " value={formatNumber(stats.wins_mini_walls)} />
<BasicStat <BasicStat
title="Kit Seleted: " title="Kit Seleted: "
value={stats.miniwalls_activeKit !== undefined value={stats.miniwalls_activeKit !== undefined
? capitalizeFirstLetter(stats.miniwalls_activeKit) ? capitalizeFirstLetter(stats.miniwalls_activeKit)
: "Unknown"} : "Unknown"}
/> />
<BasicStat title="Withers Killed: " value={stats.wither_kills_mini_walls} /> <BasicStat title="Withers Killed: " value={formatNumber(stats.wither_kills_mini_walls)} />
</div> </div>
<div className="flex-1"> <div className="flex-1">
<BasicStat title="Kills: " value={stats.kills_mini_walls} /> <BasicStat title="Kills: " value={formatNumber(stats.kills_mini_walls)} />
<BasicStat title="Final Kills: " value={stats.final_kills_mini_walls} /> <BasicStat title="Final Kills: " value={formatNumber(stats.final_kills_mini_walls)} />
<BasicStat title="Deaths: " value={stats.deaths_mini_walls} /> <BasicStat title="Deaths: " value={formatNumber(stats.deaths_mini_walls)} />
<BasicStat title="Kill/Death Ratio: " value={kd} /> <BasicStat title="Kill/Death Ratio: " value={kd} />
</div> </div>
<div className="flex-1"> <div className="flex-1">
<BasicStat title="Arrows Hit: " value={stats.arrows_hit_mini_walls} /> <BasicStat title="Arrows Hit: " value={formatNumber(stats.arrows_hit_mini_walls)} />
<BasicStat title="Arrows Shot: " value={stats.arrows_shot_mini_walls} /> <BasicStat title="Arrows Shot: " value={formatNumber(stats.arrows_shot_mini_walls)} />
<BasicStat title="Arrow Hit Accuracy: " value={ac} /> <BasicStat title="Arrow Hit Accuracy: " value={ac} />
</div> </div>
</div> </div>

View File

@@ -36,6 +36,27 @@ export function formatSecondsToTime(seconds: number) {
return parts.join(" ") return parts.join(" ")
} }
export function formatMillisecondsToTime(milliseconds: number) {
if (!Number.isFinite(milliseconds)) return "0ms"
milliseconds = Math.floor(Math.max(0, milliseconds))
const seconds = Math.floor(milliseconds / 1000)
const ms = milliseconds % 1000
const days = Math.floor(seconds / 86400)
const hours = Math.floor((seconds % 86400) / 3600)
const minutes = Math.floor((seconds % 3600) / 60)
const secs = seconds % 60
const parts: string[] = []
if (days) parts.push(days + "d")
if (hours) parts.push(hours + "h")
if (minutes) parts.push(minutes + "m")
if (secs) parts.push(secs + "s")
if (ms || parts.length === 0) parts.push(ms + "ms")
return parts.join(" ")
}
export function formatRelativeTime(timestamp: number, type: "past" | "future") { export function formatRelativeTime(timestamp: number, type: "past" | "future") {
const now = Date.now() const now = Date.now()
let diffMs = timestamp - now let diffMs = timestamp - now

View File

@@ -991,7 +991,35 @@ export const arcadeStatsSchema = z.object({
times_knocked_down_zombies: z.number().default(0), times_knocked_down_zombies: z.number().default(0),
doors_opened_zombies: z.number().default(0), doors_opened_zombies: z.number().default(0),
windows_repaired_zombies: z.number().default(0), windows_repaired_zombies: z.number().default(0),
kills_dayone: z.number().default(0),
headshots_dayone: z.number().default(0),
melee_weapon: z.string().optional(),
kills_oneinthequiver: z.number().default(0),
deaths_oneinthequiver: z.number().default(0),
max_wave: z.number().default(0),
kills_dragonwars2: z.number().default(0),
eggs_found_easter_simulator: z.number().default(0),
poop_collected: z.number().default(0),
goals_soccer: z.number().default(0),
kicks_soccer: z.number().default(0),
powerkicks_soccer: z.number().default(0),
coins: z.number().default(0), coins: z.number().default(0),
sw_kills: z.number().default(0),
sw_empire_kills: z.number().default(0),
sw_rebel_kills: z.number().default(0),
sw_deaths: z.number().default(0),
sw_shots_fired: z.number().default(0),
gifts_grinch_simulator_v2: z.number().default(0),
candy_found_halloween_simulator: z.number().default(0),
hitw_record_q: z.number().default(0),
hitw_record_f: z.number().default(0),
rounds_simon_says: z.number().default(0),
delivered_santa_simulator: z.number().default(0),
spotted_santa_simulator: z.number().default(0),
items_found_scuba_simulator: z.number().default(0),
total_points_scuba_simulator: z.number().default(0),
kills_throw_out: z.number().default(0),
deaths_throw_out: z.number().default(0),
pixel_party: z.object({ pixel_party: z.object({
wins: z.number().default(0), wins: z.number().default(0),
games_played: z.number().default(0), games_played: z.number().default(0),
@@ -1008,7 +1036,12 @@ export const arcadeStatsSchema = z.object({
power_ups_collected_hyper: z.number().default(0) power_ups_collected_hyper: z.number().default(0)
}).optional(), }).optional(),
dropper: z.object({ dropper: z.object({
wins: z.number().default(0) wins: z.number().default(0),
flawless_games: z.number().default(0),
games_finished: z.number().default(0),
maps_completed: z.number().default(0),
fastest_game: z.number().default(0),
fails: z.number().default(0)
}).optional(), }).optional(),
...arcadeModeWins(), ...arcadeModeWins(),
...arcadeZombiesModeStats(), ...arcadeZombiesModeStats(),