1094 lines
34 KiB
TypeScript
1094 lines
34 KiB
TypeScript
import z from "zod"
|
|
|
|
function bedwarsModeStats() {
|
|
const ids = [
|
|
"eight_one",
|
|
"eight_two",
|
|
"four_three",
|
|
"four_four",
|
|
"two_four",
|
|
"eight_two_rush",
|
|
"four_four_rush",
|
|
"eight_two_ultimate",
|
|
"four_four_ultimate",
|
|
"eight_two_lucky",
|
|
"four_four_lucky",
|
|
"eight_two_voidless",
|
|
"four_four_voidless",
|
|
"eight_two_armed",
|
|
"four_four_armed",
|
|
"four_four_swap",
|
|
"four_four_underworld",
|
|
"castle"
|
|
] as const
|
|
|
|
const stats = [
|
|
"winstreak",
|
|
"kills_bedwars",
|
|
"deaths_bedwars",
|
|
"final_kills_bedwars",
|
|
"final_deaths_bedwars",
|
|
"wins_bedwars",
|
|
"losses_bedwars",
|
|
"beds_broken_bedwars",
|
|
"beds_lost_bedwars"
|
|
] as const
|
|
|
|
const entries = new Map<string, z.ZodDefault<z.ZodNumber>>()
|
|
const winstreak = new Map<string, z.ZodOptional<z.ZodNumber>>()
|
|
|
|
for (const id of ids) {
|
|
for (const stat of stats) {
|
|
if (stat === "winstreak") {
|
|
winstreak.set(`${id}_${stat}`, z.number().optional())
|
|
} else {
|
|
entries.set(`${id}_${stat}`, z.number().default(0))
|
|
}
|
|
}
|
|
}
|
|
|
|
type Modes = typeof ids[number]
|
|
type Stats = Exclude<typeof stats[number], "winstreak">
|
|
|
|
return {
|
|
all: Object.fromEntries(entries) as Record<`${Modes}_${Stats}`, z.ZodDefault<z.ZodNumber>>,
|
|
winstreak: Object.fromEntries(winstreak) as Record<`${Modes}_winstreak`, z.ZodOptional<z.ZodNumber>>
|
|
}
|
|
}
|
|
|
|
export const bedwarsStatsSchema = z.object({
|
|
Experience: z.number().default(0),
|
|
coins: z.number().default(0),
|
|
winstreak: z.number().optional(),
|
|
kills_bedwars: z.number().default(0),
|
|
deaths_bedwars: z.number().default(0),
|
|
final_kills_bedwars: z.number().default(0),
|
|
final_deaths_bedwars: z.number().default(0),
|
|
wins_bedwars: z.number().default(0),
|
|
losses_bedwars: z.number().default(0),
|
|
beds_broken_bedwars: z.number().default(0),
|
|
beds_lost_bedwars: z.number().default(0),
|
|
total_challenges_completed: z.number().default(0),
|
|
iron_resources_collected_bedwars: z.number().default(0),
|
|
gold_resources_collected_bedwars: z.number().default(0),
|
|
diamond_resources_collected_bedwars: z.number().default(0),
|
|
emerald_resources_collected_bedwars: z.number().default(0),
|
|
_items_purchased_bedwars: z.number().default(0),
|
|
slumber: z.object({
|
|
tickets: z.number().default(0),
|
|
bag_type: z.string().optional(),
|
|
total_tickets_earned: z.number().default(0),
|
|
doublers: z.number().default(0),
|
|
room: z.record(z.string(), z.boolean()).optional()
|
|
}).optional(),
|
|
...bedwarsModeStats().all,
|
|
...bedwarsModeStats().winstreak
|
|
})
|
|
|
|
function skywarsModeStats() {
|
|
const ids = [
|
|
"solo_normal",
|
|
"solo_insane",
|
|
"team_normal",
|
|
"team_insane",
|
|
"mega",
|
|
"mega_doubles",
|
|
"ranked_normal"
|
|
] as const
|
|
|
|
const stats = [
|
|
"kills",
|
|
"deaths",
|
|
"wins",
|
|
"losses"
|
|
] as const
|
|
|
|
const entries = new Map<string, z.ZodDefault<z.ZodNumber>>()
|
|
|
|
for (const id of ids) {
|
|
for (const stat of stats) {
|
|
entries.set(`${stat}_${id}`, z.number().default(0))
|
|
}
|
|
}
|
|
|
|
return Object.fromEntries(entries) as Record<`${typeof stats[number]}_${typeof ids[number]}`, z.ZodDefault<z.ZodNumber>>
|
|
}
|
|
|
|
export const skywarsStatsSchema = z.object({
|
|
skywars_experience: z.number().default(0),
|
|
selected_prestige_icon: z.string().optional(),
|
|
kills: z.number().default(0),
|
|
deaths: z.number().default(0),
|
|
assists: z.number().default(0),
|
|
wins: z.number().default(0),
|
|
losses: z.number().default(0),
|
|
cosmetic_tokens: z.number().default(0),
|
|
coins: z.number().default(0),
|
|
blocks_placed: z.number().default(0),
|
|
blocks_broken: z.number().default(0),
|
|
chests_opened: z.number().default(0),
|
|
arrows_hit: z.number().default(0),
|
|
arrows_shot: z.number().default(0),
|
|
melee_kills: z.number().default(0),
|
|
void_kills: z.number().default(0),
|
|
bow_kills: z.number().default(0),
|
|
mobs_kills: z.number().default(0),
|
|
enderpearls_thrown: z.number().default(0),
|
|
egg_thrown: z.number().default(0),
|
|
wins_lab: z.number().default(0),
|
|
heads: z.number().default(0),
|
|
angel_of_death_level: z.number().default(0),
|
|
angels_offering: z.number().default(0),
|
|
souls_gathered: z.number().default(0),
|
|
souls: z.number().default(0),
|
|
paid_souls: z.number().default(0),
|
|
soul_well: z.number().default(0),
|
|
packages: z.array(z.string()),
|
|
shard: z.number().default(0),
|
|
opals: z.number().default(0),
|
|
heads_eww: z.number().default(0),
|
|
heads_yucky: z.number().default(0),
|
|
heads_meh: z.number().default(0),
|
|
heads_decent: z.number().default(0),
|
|
heads_salty: z.number().default(0),
|
|
heads_tasty: z.number().default(0),
|
|
heads_succulent: z.number().default(0),
|
|
heads_sweet: z.number().default(0),
|
|
heads_divine: z.number().default(0),
|
|
heads_heavenly: z.number().default(0),
|
|
heads_ethereal: z.number().default(0),
|
|
heads_indescribable: z.number().default(0),
|
|
head_collection: z.object({
|
|
prestigious: z.array(z.object({
|
|
username: z.string().nullable().default(null),
|
|
timestamp: z.number(),
|
|
mode: z.string(),
|
|
sacrifice: z.string()
|
|
}))
|
|
}).optional(),
|
|
...skywarsModeStats()
|
|
})
|
|
|
|
function duelsModeStats() {
|
|
const ids = [
|
|
"uhc_duel",
|
|
"uhc_doubles",
|
|
"uhc_four",
|
|
"uhc_meetup",
|
|
"op_duel",
|
|
"op_doubles",
|
|
"sw_duel",
|
|
"sw_doubles",
|
|
"bow_duel",
|
|
"blitz_duel",
|
|
"mw_duel",
|
|
"mw_doubles",
|
|
"sumo_duel",
|
|
"bowspleef_duel",
|
|
"spleef_duel",
|
|
"parkour_eight",
|
|
"boxing_duel",
|
|
"classic_duel",
|
|
"classic_doubles",
|
|
"potion_duel",
|
|
"combo_duel",
|
|
"duel_arena",
|
|
"quake_duel",
|
|
"bedwars_two_one_duels",
|
|
"bedwars_two_one_duels_rush"
|
|
] as const
|
|
|
|
const bridgeIds = [
|
|
"bridge_duel",
|
|
"bridge_doubles",
|
|
"bridge_threes",
|
|
"bridge_four",
|
|
"bridge_2v2v2v2",
|
|
"bridge_3v3v3v3"
|
|
] as const
|
|
|
|
const bridgeStats = [
|
|
"bridge_kills",
|
|
"bridge_deaths",
|
|
"goals"
|
|
] as const
|
|
|
|
const stats = [
|
|
"kills",
|
|
"deaths",
|
|
"wins",
|
|
"losses",
|
|
"melee_swings",
|
|
"melee_hits",
|
|
"bow_shots",
|
|
"bow_hits",
|
|
"current_winstreak_mode",
|
|
"best_winstreak_mode"
|
|
] as const
|
|
|
|
const entries = new Map<string, z.ZodDefault<z.ZodNumber>>()
|
|
const ws = new Map<string, z.ZodOptional<z.ZodNumber>>()
|
|
const bestWs = new Map<string, z.ZodOptional<z.ZodNumber>>()
|
|
const bridge = new Map<string, z.ZodDefault<z.ZodNumber>>()
|
|
|
|
for (const id of ids) {
|
|
for (const stat of stats) {
|
|
if (stat === "current_winstreak_mode") {
|
|
ws.set(`${stat}_${id}`, z.number().optional())
|
|
} else if (stat === "best_winstreak_mode") {
|
|
bestWs.set(`${stat}_${id}`, z.number().optional())
|
|
} else {
|
|
entries.set(`${id}_${stat}`, z.number().default(0))
|
|
}
|
|
}
|
|
}
|
|
|
|
const combined = [...stats, ...bridgeStats]
|
|
for (const id of bridgeIds) {
|
|
for (const stat of combined) {
|
|
if (stat === "bridge_kills" || stat === "bridge_deaths" || stat === "goals") {
|
|
bridge.set(`${id}_${stat}`, z.number().default(0))
|
|
} else if (stat === "best_winstreak_mode") {
|
|
ws.set(`${stat}_${id}`, z.number().optional())
|
|
} else if (stat === "current_winstreak_mode") {
|
|
ws.set(`${stat}_${id}`, z.number().optional())
|
|
} else {
|
|
entries.set(`${id}_${stat}`, z.number().default(0))
|
|
}
|
|
}
|
|
}
|
|
|
|
type Modes = typeof ids[number]
|
|
type BridgeModes = typeof bridgeIds[number]
|
|
type Stats = Exclude<typeof stats[number], "current_winstreak_mode" | "best_winstreak_mode">
|
|
type BridgeStats = typeof bridgeStats[number]
|
|
|
|
return {
|
|
all: Object.fromEntries(entries) as Record<`${Modes | BridgeModes}_${Stats}`, z.ZodDefault<z.ZodNumber>>,
|
|
ws: Object.fromEntries(ws) as Record<`current_winstreak_mode_${Modes | BridgeModes}`, z.ZodOptional<z.ZodNumber>>,
|
|
bestWs: Object.fromEntries(bestWs) as Record<`best_winstreak_mode_${Modes | BridgeModes}`, z.ZodOptional<z.ZodNumber>>,
|
|
bridge: Object.fromEntries(bridge) as Record<`${BridgeModes}_${BridgeStats}`, z.ZodDefault<z.ZodNumber>>
|
|
}
|
|
}
|
|
|
|
function devisionTitles() {
|
|
const devisions = [
|
|
"all_modes",
|
|
"uhc",
|
|
"op",
|
|
"skywars",
|
|
"bow",
|
|
"blitz",
|
|
"mega_walls",
|
|
"sumo",
|
|
"tnt_games",
|
|
"parkour",
|
|
"boxing",
|
|
"classic",
|
|
"no_debuff",
|
|
"combo",
|
|
"bridge"
|
|
] as const
|
|
|
|
const titles = [
|
|
"rookie",
|
|
"iron",
|
|
"gold",
|
|
"diamond",
|
|
"master",
|
|
"legend",
|
|
"grandmaster",
|
|
"godlike",
|
|
"celestial",
|
|
"divine",
|
|
"ascended"
|
|
] as const
|
|
const entries = new Map<string, z.ZodDefault<z.ZodNumber>>()
|
|
|
|
for (const div of devisions) {
|
|
for (const title of titles) {
|
|
entries.set(`${div}_${title}_title_prestige`, z.number().default(-1))
|
|
}
|
|
}
|
|
|
|
return Object.fromEntries(entries) as Record<`${typeof devisions[number]}_${typeof titles[number]}_title_prestige`, z.ZodDefault<z.ZodNumber>>
|
|
}
|
|
|
|
export const duelsStatsSchema = z.object({
|
|
wins: z.number().default(0),
|
|
losses: z.number().default(0),
|
|
coins: z.number().default(0),
|
|
kills: z.number().default(0),
|
|
deaths: z.number().default(0),
|
|
melee_swings: z.number().default(0),
|
|
melee_hits: z.number().default(0),
|
|
bow_shots: z.number().default(0),
|
|
bow_hits: z.number().default(0),
|
|
current_winstreak: z.number().optional(),
|
|
best_overall_winstreak: z.number().optional(),
|
|
...devisionTitles(),
|
|
...duelsModeStats().all,
|
|
...duelsModeStats().ws,
|
|
...duelsModeStats().bestWs,
|
|
...duelsModeStats().bridge
|
|
})
|
|
|
|
function murderMysteryModeStats() {
|
|
const ids = [
|
|
"MURDER_CLASSIC",
|
|
"MURDER_ASSASSINS",
|
|
"MURDER_DOUBLE_UP",
|
|
"MURDER_HARDCORE",
|
|
"MURDER_SHOWDOWN"
|
|
] as const
|
|
|
|
const stats = [
|
|
"kills",
|
|
"bow_kills",
|
|
"knife_kills",
|
|
"thrown_knife_kills",
|
|
"wins",
|
|
"games",
|
|
"coins_pickedup"
|
|
] as const
|
|
|
|
const entries = new Map<string, z.ZodDefault<z.ZodNumber>>()
|
|
|
|
for (const id of ids) {
|
|
for (const stat of stats) {
|
|
entries.set(`${stat}_${id}`, z.number().default(0))
|
|
}
|
|
}
|
|
|
|
return Object.fromEntries(entries) as Record<`${typeof stats[number]}_${typeof ids[number]}`, z.ZodDefault<z.ZodNumber>>
|
|
}
|
|
|
|
export const murderMysteryStatsSchema = z.object({
|
|
kills: z.number().default(0),
|
|
deaths: z.number().default(0),
|
|
wins: z.number().default(0),
|
|
losses: z.number().default(0),
|
|
coins: z.number().default(0),
|
|
games: z.number().default(0),
|
|
bow_kills: z.number().default(0),
|
|
knife_kills: z.number().default(0),
|
|
coins_pickedup: z.number().default(0),
|
|
kills_as_murderer: z.number().default(0),
|
|
thrown_knife_kills: z.number().default(0),
|
|
active_knife_skin: z.string().optional(),
|
|
quickest_detective_win_time_seconds: z.number().default(0),
|
|
quickest_murderer_win_time_seconds: z.number().default(0),
|
|
kills_as_infected_MURDER_INFECTION: z.number().default(0),
|
|
kills_as_survivor_MURDER_INFECTION: z.number().default(0),
|
|
kills_MURDER_INFECTION: z.number().default(0),
|
|
wins_MURDER_INFECTION: z.number().default(0),
|
|
games_MURDER_INFECTION: z.number().default(0),
|
|
total_time_survived_seconds_MURDER_INFECTION: z.number().default(0),
|
|
coins_pickedup_MURDER_INFECTION: z.number().default(0),
|
|
...murderMysteryModeStats()
|
|
})
|
|
|
|
export const buildBattleStatsSchema = z.object({
|
|
wins: z.number().default(0),
|
|
score: z.number().default(0),
|
|
coins: z.number().default(0),
|
|
games_played: z.number().default(0),
|
|
correct_guesses: z.number().default(0),
|
|
super_votes: z.number().default(0),
|
|
wins_solo_normal: z.number().default(0),
|
|
wins_teams_normal: z.number().default(0),
|
|
wins_guess_the_build: z.number().default(0),
|
|
wins_solo_pro: z.number().default(0),
|
|
wins_speed_builders: z.number().default(0),
|
|
wins_solo_normal_latest: z.number().default(0),
|
|
wins_teams_normal_latest: z.number().default(0),
|
|
wins_guess_the_build_latest: z.number().default(0),
|
|
wins_solo_pro_latest: z.number().default(0),
|
|
wins_speed_builders_latest: z.number().default(0)
|
|
})
|
|
|
|
function uhcModesStats() {
|
|
const ids = [
|
|
"solo",
|
|
"red_vs_blue",
|
|
"no_diamonds",
|
|
"vanilla_doubles",
|
|
"brawl",
|
|
"solo_brawl",
|
|
"duo_brawl"
|
|
] as const
|
|
|
|
const stats = [
|
|
"wins",
|
|
"kills",
|
|
"deaths",
|
|
"heads_eaten"
|
|
] as const
|
|
|
|
const entries = new Map<string, z.ZodDefault<z.ZodNumber>>()
|
|
|
|
for (const id of ids) {
|
|
for (const stat of stats) {
|
|
entries.set(`${stat}_${id}`, z.number().default(0))
|
|
}
|
|
}
|
|
|
|
return Object.fromEntries(entries) as Record<`${typeof stats[number]}_${typeof ids[number]}`, z.ZodDefault<z.ZodNumber>>
|
|
}
|
|
|
|
export const uhcSchema = z.object({
|
|
kills: z.number().default(0),
|
|
deaths: z.number().default(0),
|
|
wins: z.number().default(0),
|
|
heads_eaten: z.number().default(0),
|
|
score: z.number().default(0),
|
|
coins: z.number().default(0),
|
|
ultimates_crafted: z.number().default(0),
|
|
ultimates_crafted_solo: z.number().default(0),
|
|
...uhcModesStats()
|
|
})
|
|
|
|
export const pitStats = z.object({
|
|
pit_stats_ptl: z.object({
|
|
kills: z.number().default(0),
|
|
deaths: z.number().default(0),
|
|
cash_earned: z.number().default(0),
|
|
playtime_minutes: z.number().default(0),
|
|
assists: z.number().default(0),
|
|
max_streak: z.number().default(0),
|
|
damage_dealt: z.number().default(0),
|
|
damage_received: z.number().default(0),
|
|
melee_damage_dealt: z.number().default(0),
|
|
melee_damage_received: z.number().default(0),
|
|
bow_damage_dealt: z.number().default(0),
|
|
bow_damage_received: z.number().default(0),
|
|
sword_hits: z.number().default(0),
|
|
left_clicks: z.number().default(0),
|
|
arrow_hits: z.number().default(0),
|
|
arrows_fired: z.number().default(0),
|
|
contracts_completed: z.number().default(0),
|
|
jumped_into_pit: z.number().default(0),
|
|
launched_by_launchers: z.number().default(0),
|
|
gapple_eaten: z.number().default(0),
|
|
ghead_eaten: z.number().default(0),
|
|
soups_drank: z.number().default(0),
|
|
rage_potatoes_eaten: z.number().default(0),
|
|
fishing_rod_launched: z.number().default(0),
|
|
lava_bucket_emptied: z.number().default(0),
|
|
diamond_items_purchased: z.number().default(0),
|
|
blocks_placed: z.number().default(0),
|
|
blocks_broken: z.number().default(0),
|
|
enchanted_tier1: z.number().default(0),
|
|
enchanted_tier2: z.number().default(0),
|
|
enchanted_tier3: z.number().default(0),
|
|
dark_pants_crated: z.number().default(0),
|
|
wheat_farmed: z.number().default(0),
|
|
fished_anything: z.number().default(0),
|
|
fishes_fished: z.number().default(0),
|
|
king_quest_completion: z.number().default(0),
|
|
sewer_treasures_found: z.number().default(0)
|
|
}),
|
|
profile: z.object({
|
|
prestiges: z.array(z.object({
|
|
index: z.number(),
|
|
xp_on_prestige: z.number(),
|
|
timestamp: z.number()
|
|
})).optional(),
|
|
xp: z.number().default(0),
|
|
cash: z.number().default(0),
|
|
renown: z.number().default(0)
|
|
})
|
|
}).transform(({ profile, pit_stats_ptl, ...rest }) => ({
|
|
profile,
|
|
...pit_stats_ptl,
|
|
...rest
|
|
}))
|
|
|
|
function tntGamesModeStats() {
|
|
const ids = [
|
|
"ancient",
|
|
"blood",
|
|
"fire",
|
|
"hydro",
|
|
"ice",
|
|
"kinetic",
|
|
"storm",
|
|
"toxic",
|
|
"wither"
|
|
] as const
|
|
|
|
const stats = [
|
|
"kills",
|
|
"deaths",
|
|
"assists",
|
|
"explode",
|
|
"regen"
|
|
] as const
|
|
|
|
const entries = new Map<string, z.ZodDefault<z.ZodNumber>>()
|
|
|
|
for (const id of ids) {
|
|
for (const stat of stats) {
|
|
entries.set(`new_${id}wizard_${stat}`, z.number().default(0))
|
|
}
|
|
}
|
|
|
|
return Object.fromEntries(entries) as Record<`new_${typeof ids[number]}wizard_${typeof stats[number]}`, z.ZodDefault<z.ZodNumber>>
|
|
}
|
|
|
|
export const tntGamesStatsSchema = z.object({
|
|
wins: z.number().default(0),
|
|
coins: z.number().default(0),
|
|
kills_tntag: z.number().default(0),
|
|
wins_tntag: z.number().default(0),
|
|
wins_tntrun: z.number().default(0),
|
|
record_tntrun: z.number().default(0),
|
|
kills_pvprun: z.number().default(0),
|
|
wins_pvprun: z.number().default(0),
|
|
record_pvprun: z.number().default(0),
|
|
wins_bowspleef: z.number().default(0),
|
|
deaths_bowspleef: z.number().default(0),
|
|
wins_capture: z.number().default(0),
|
|
kills_capture: z.number().default(0),
|
|
deaths_capture: z.number().default(0),
|
|
...tntGamesModeStats()
|
|
})
|
|
|
|
function megawallsClassStats() {
|
|
const ids = [
|
|
"angel",
|
|
"arcanist",
|
|
"assassin",
|
|
"automaton",
|
|
"blaze",
|
|
"cow",
|
|
"creeper",
|
|
"dragon",
|
|
"dreadlord",
|
|
"enderman",
|
|
"golem",
|
|
"herobrine",
|
|
"hunter",
|
|
"moleman",
|
|
"phoenix",
|
|
"pigman",
|
|
"pirate",
|
|
"renegade",
|
|
"shaman",
|
|
"shark",
|
|
"sheep",
|
|
"skeleton",
|
|
"snowman",
|
|
"spider",
|
|
"squid",
|
|
"werewolf",
|
|
"zombie"
|
|
] as const
|
|
|
|
const stats = [
|
|
"kills",
|
|
"deaths",
|
|
"final_kills",
|
|
"final_deaths",
|
|
"wins",
|
|
"losses"
|
|
] as const
|
|
|
|
const entries = new Map<string, z.ZodDefault<z.ZodNumber>>()
|
|
const classes = new Map<
|
|
string,
|
|
z.ZodOptional<z.ZodObject<{ prestige: z.ZodDefault<z.ZodNumber>, enderchest_rows: z.ZodDefault<z.ZodNumber> }>>
|
|
>()
|
|
|
|
for (const id of ids) {
|
|
for (const stat of stats) {
|
|
entries.set(`${id}_${stat}`, z.number().default(0))
|
|
}
|
|
classes.set(id, z.object({ prestige: z.number().default(0), enderchest_rows: z.number().default(0) }).optional())
|
|
}
|
|
|
|
return {
|
|
classStats: Object.fromEntries(entries) as Record<`${typeof ids[number]}_${typeof stats[number]}`, z.ZodDefault<z.ZodNumber>>,
|
|
classOther: Object.fromEntries(classes) as Record<
|
|
`${typeof ids[number]}`,
|
|
z.ZodOptional<z.ZodObject<{ prestige: z.ZodDefault<z.ZodNumber>, enderchest_rows: z.ZodDefault<z.ZodNumber> }>>
|
|
>
|
|
}
|
|
}
|
|
|
|
function megawallsModeStats() {
|
|
const ids = [
|
|
"standard",
|
|
"face_off",
|
|
"gvg"
|
|
] as const
|
|
|
|
const stats = [
|
|
"kills",
|
|
"deaths",
|
|
"wins",
|
|
"losses"
|
|
] as const
|
|
|
|
const entries = new Map<string, z.ZodDefault<z.ZodNumber>>()
|
|
|
|
for (const id of ids) {
|
|
for (const stat of stats) {
|
|
entries.set(`${stat}_${id}`, z.number().default(0))
|
|
}
|
|
}
|
|
|
|
return Object.fromEntries(entries) as Record<`${typeof stats[number]}_${typeof ids[number]}`, z.ZodDefault<z.ZodNumber>>
|
|
}
|
|
|
|
export const megawallsStats = z.object({
|
|
kills: z.number().default(0),
|
|
assists: z.number().default(0),
|
|
deaths: z.number().default(0),
|
|
wins: z.number().default(0),
|
|
wins_practice: z.number().default(0),
|
|
losses: z.number().default(0),
|
|
losses_practice: z.number().default(0),
|
|
final_kills: z.number().default(0),
|
|
final_assists: z.number().default(0),
|
|
final_deaths: z.number().default(0),
|
|
coins: z.number().default(0),
|
|
wither_damage: z.number().default(0),
|
|
witherDamage: z.number().default(0),
|
|
classes: z.object(megawallsClassStats().classOther).optional(),
|
|
...megawallsClassStats().classStats,
|
|
...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<string, z.ZodDefault<z.ZodNumber>>()
|
|
|
|
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<z.ZodNumber>>
|
|
}
|
|
|
|
export const copsAndCrimsStatsSchema = z.object({
|
|
kills: z.number().default(0),
|
|
assists: z.number().default(0),
|
|
deaths: z.number().default(0),
|
|
game_wins: z.number().default(0),
|
|
cop_kills: z.number().default(0),
|
|
criminal_kills: z.number().default(0),
|
|
kills_deathmatch: z.number().default(0),
|
|
assists_deathmatch: z.number().default(0),
|
|
deaths_deathmatch: z.number().default(0),
|
|
game_wins_deathmatch: z.number().default(0),
|
|
cop_kills_deathmatch: z.number().default(0),
|
|
criminal_kills_deathmatch: z.number().default(0),
|
|
kills_gungame: z.number().default(0),
|
|
assists_gungame: z.number().default(0),
|
|
deaths_gungame: z.number().default(0),
|
|
game_wins_gungame: z.number().default(0),
|
|
cop_kills_gungame: z.number().default(0),
|
|
criminal_kills_gungame: z.number().default(0),
|
|
bombs_planted: z.number().default(0),
|
|
bombs_defused: z.number().default(0),
|
|
shots_fired: z.number().default(0),
|
|
coins: z.number().default(0),
|
|
round_wins: 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()
|
|
})
|
|
|
|
const woolGamesClassStats = z.object({
|
|
kills: z.number().default(0),
|
|
assists: z.number().default(0),
|
|
deaths: z.number().default(0),
|
|
wool_placed: z.number().default(0),
|
|
blocks_broken: z.number().default(0),
|
|
powerups_gotten: z.number().default(0)
|
|
})
|
|
|
|
export const woolGamesStatsSchema = z.object({
|
|
wool_wars_prestige_icon: z.string().optional(),
|
|
playtime: z.number().default(0),
|
|
coins: z.number().default(0),
|
|
progression: z.object({
|
|
experience: z.number().default(0),
|
|
available_layers: z.number().default(0)
|
|
}).optional(),
|
|
capture_the_wool: z.object({
|
|
stats: z.object({
|
|
kills: z.number().default(0),
|
|
assits: z.number().default(0),
|
|
deaths: z.number().default(0),
|
|
participated_wins: z.number().default(0),
|
|
participated_losses: z.number().default(0),
|
|
fastest_win: z.number().default(0),
|
|
longest_game: z.number().default(0),
|
|
wools_stolen: z.number().default(0),
|
|
wools_captured: z.number().default(0),
|
|
fastest_wool_capture: z.number().default(0),
|
|
gold_earned: z.number().default(0),
|
|
gold_spent: z.number().default(0)
|
|
}).optional()
|
|
}).optional(),
|
|
sheep_wars: z.object({
|
|
stats: z.object({
|
|
kills: z.number().default(0),
|
|
deaths: z.number().default(0),
|
|
wins: z.number().default(0),
|
|
losses: z.number().default(0),
|
|
sheep_thrown: z.number().default(0),
|
|
damage_dealt: z.number().default(0)
|
|
}).optional()
|
|
}).optional(),
|
|
wool_wars: z.object({
|
|
selected_class: z.string().optional(),
|
|
stats: z.object({
|
|
kills: z.number().default(0),
|
|
assits: z.number().default(0),
|
|
deaths: z.number().default(0),
|
|
wins: z.number().default(0),
|
|
losses: z.number().default(0),
|
|
wool_placed: z.number().default(0),
|
|
blocks_broken: z.number().default(0),
|
|
powerups_gotten: z.number().default(0),
|
|
classes: z.object({
|
|
tank: woolGamesClassStats.optional(),
|
|
archer: woolGamesClassStats.optional(),
|
|
swordsman: woolGamesClassStats.optional(),
|
|
engineer: woolGamesClassStats.optional(),
|
|
golem: woolGamesClassStats.optional(),
|
|
assault: woolGamesClassStats.optional()
|
|
}).default({})
|
|
}).optional()
|
|
}).optional()
|
|
})
|
|
|
|
function blitzKitPlayedStats() {
|
|
const ids = [
|
|
"arachnologist",
|
|
"archer",
|
|
"armorer",
|
|
"astronaut",
|
|
"baker",
|
|
"blaze",
|
|
"creepertamer",
|
|
"diver",
|
|
"donkeytamer",
|
|
"farmer",
|
|
"fisherman",
|
|
"florist",
|
|
"golem",
|
|
"guardian",
|
|
"horsetamer",
|
|
"hunter",
|
|
"hype train",
|
|
"jockey",
|
|
"knight",
|
|
"meatmaster",
|
|
"milkman",
|
|
"necromancer",
|
|
"paladin",
|
|
"phoenix",
|
|
"pigman",
|
|
"ranger",
|
|
"reaper",
|
|
"reddragon",
|
|
"rogue",
|
|
"scout",
|
|
"shadow knight",
|
|
"shark",
|
|
"slimeyslime",
|
|
"snowman",
|
|
"speleologist",
|
|
"tim",
|
|
"toxicologist",
|
|
"troll",
|
|
"viking",
|
|
"warlock",
|
|
"warrior",
|
|
"wolftamer"
|
|
] as const
|
|
|
|
const stats = [
|
|
"wins",
|
|
"wins_teams",
|
|
"time_played",
|
|
"exp",
|
|
"kills",
|
|
"games_played"
|
|
] as const
|
|
|
|
const entries = new Map<string, z.ZodDefault<z.ZodNumber>>()
|
|
const kits = new Map<string, z.ZodDefault<z.ZodNumber>>()
|
|
const prestiges = new Map<string, z.ZodDefault<z.ZodNumber>>()
|
|
|
|
for (const id of ids) {
|
|
for (const stat of stats) {
|
|
entries.set(`${stat}_${id}`, z.number().default(0))
|
|
kits.set(`${id}`, z.number().default(-1))
|
|
prestiges.set(`p${id}`, z.number().default(0))
|
|
}
|
|
}
|
|
|
|
return {
|
|
stats: Object.fromEntries(entries) as Record<`${typeof stats[number]}_${typeof ids[number]}`, z.ZodDefault<z.ZodNumber>>,
|
|
kits: Object.fromEntries(kits) as Record<`${typeof ids[number]}`, z.ZodDefault<z.ZodNumber>>,
|
|
prestiges: Object.fromEntries(prestiges) as Record<`p${typeof ids[number]}`, z.ZodDefault<z.ZodNumber>>
|
|
}
|
|
}
|
|
|
|
export const blitzStatsSchema = z.object({
|
|
kills: z.number().default(0),
|
|
deaths: z.number().default(0),
|
|
kills_solo_normal: z.number().default(0),
|
|
kills_teams_normal: z.number().default(0),
|
|
wins_solo_normal: z.number().default(0),
|
|
wins_teams_normal: z.number().default(0),
|
|
coins: z.number().default(0),
|
|
damage: z.number().default(0),
|
|
damage_taken: z.number().default(0),
|
|
...blitzKitPlayedStats().stats,
|
|
...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<string, z.ZodDefault<z.ZodNumber>>()
|
|
for (const id of ids) {
|
|
entries.set(`${id}`, z.number().default(0))
|
|
}
|
|
return Object.fromEntries(entries) as Record<`${typeof ids[number]}`, z.ZodDefault<z.ZodNumber>>
|
|
}
|
|
|
|
function arcadeZombiesModeStats() {
|
|
const ids = [
|
|
"deadend",
|
|
"badblood",
|
|
"alienarcadium"
|
|
] as const
|
|
|
|
const stats = [
|
|
"times_knocked_down_zombies",
|
|
"players_revived_zombies",
|
|
"doors_opened_zombies",
|
|
"windows_repaired_zombies",
|
|
"zombie_kills_zombies",
|
|
"deaths_zombies",
|
|
"best_round_zombies",
|
|
"wins_zombies"
|
|
] as const
|
|
|
|
const entries = new Map<string, z.ZodDefault<z.ZodNumber>>()
|
|
for (const id of ids) {
|
|
for (const stat of stats) {
|
|
entries.set(`${stat}_${id}`, z.number().default(0))
|
|
}
|
|
}
|
|
|
|
return Object.fromEntries(entries) as Record<`${typeof stats[number]}_${typeof ids[number]}`, z.ZodDefault<z.ZodNumber>>
|
|
}
|
|
|
|
function arcadeZombiesTypeStats() {
|
|
const ids = [
|
|
"basic",
|
|
"blaze",
|
|
"empowered",
|
|
"ender",
|
|
"endermite",
|
|
"fire",
|
|
"guardian",
|
|
"magma",
|
|
"magma_cube",
|
|
"pig_zombie",
|
|
"skelefish",
|
|
"tnt_baby",
|
|
"tnt",
|
|
"inferno",
|
|
"broodmother",
|
|
"king_slime",
|
|
"wither",
|
|
"herobrine",
|
|
"mega_blob",
|
|
"mega_magma",
|
|
"world_ender"
|
|
] as const
|
|
|
|
const entries = new Map<string, z.ZodDefault<z.ZodNumber>>()
|
|
for (const id of ids) {
|
|
entries.set(`${id}_zombie_kills_zombies`, z.number().default(0))
|
|
}
|
|
|
|
return Object.fromEntries(entries) as Record<`${typeof ids[number]}_zombie_kills_zombies`, z.ZodDefault<z.ZodNumber>>
|
|
}
|
|
|
|
export const arcadeStatsSchema = z.object({
|
|
miniwalls_activeKit: z.string().optional(),
|
|
wither_kills_mini_walls: z.number().default(0),
|
|
kills_mini_walls: z.number().default(0),
|
|
final_kills_mini_walls: z.number().default(0),
|
|
deaths_mini_walls: z.number().default(0),
|
|
arrows_hit_mini_walls: z.number().default(0),
|
|
arrows_shot_mini_walls: z.number().default(0),
|
|
total_rounds_survived_zombies: z.number().default(0),
|
|
best_round_zombies: z.number().default(0),
|
|
zombie_kills_zombies: z.number().default(0),
|
|
bullets_hit_zombies: z.number().default(0),
|
|
bullets_shot_zombies: z.number().default(0),
|
|
headshots_zombies: z.number().default(0),
|
|
players_revived_zombies: z.number().default(0),
|
|
times_knocked_down_zombies: z.number().default(0),
|
|
doors_opened_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),
|
|
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({
|
|
wins: z.number().default(0),
|
|
games_played: z.number().default(0),
|
|
rounds_completed: z.number().default(0),
|
|
highest_round: z.number().default(0),
|
|
power_ups_collected: z.number().default(0),
|
|
wins_normal: z.number().default(0),
|
|
games_played_normal: z.number().default(0),
|
|
rounds_completed_normal: z.number().default(0),
|
|
power_ups_collected_normal: z.number().default(0),
|
|
wins_hyper: z.number().default(0),
|
|
games_played_hyper: z.number().default(0),
|
|
rounds_completed_hyper: z.number().default(0),
|
|
power_ups_collected_hyper: z.number().default(0)
|
|
}).optional(),
|
|
dropper: z.object({
|
|
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(),
|
|
...arcadeModeWins(),
|
|
...arcadeZombiesModeStats(),
|
|
...arcadeZombiesTypeStats()
|
|
})
|
|
|
|
function speedUhcModeModeMasteryStats() {
|
|
const ids = [
|
|
"mastery_wild_specialist",
|
|
"mastery_sniper",
|
|
"mastery_berserk",
|
|
"mastery_fortune",
|
|
"mastery_master_baker",
|
|
"mastery_invigorate",
|
|
"mastery_huntsman",
|
|
"mastery_vampirism",
|
|
"mastery_guardian",
|
|
"solo_normal",
|
|
"solo_insane",
|
|
"team_normal",
|
|
"team_insane"
|
|
] as const
|
|
|
|
const stats = [
|
|
"kills",
|
|
"deaths",
|
|
"wins",
|
|
"losses"
|
|
] as const
|
|
|
|
const entries = new Map<string, z.ZodDefault<z.ZodNumber>>()
|
|
for (const id of ids) {
|
|
for (const stat of stats) {
|
|
entries.set(`${stat}_${id}`, z.number().default(0))
|
|
}
|
|
}
|
|
|
|
return Object.fromEntries(entries) as Record<`${typeof stats[number]}_${typeof ids[number]}`, z.ZodDefault<z.ZodNumber>>
|
|
}
|
|
|
|
export const speedUhcStatsSchema = z.object({
|
|
kills: z.number().default(0),
|
|
deaths: z.number().default(0),
|
|
wins: z.number().default(0),
|
|
losses: z.number().default(0),
|
|
score: z.number().default(0),
|
|
coins: z.number().default(0),
|
|
...speedUhcModeModeMasteryStats()
|
|
})
|