Finished warlords stats

This commit is contained in:
2025-09-20 00:33:15 +02:00
parent 6ce2775058
commit b13d6023ff
5 changed files with 104 additions and 7 deletions

View File

@@ -7,6 +7,7 @@ import GeneralStats from "../GeneralStats"
import { WarlordsWeaponsBar } from "./client"
import WarlordsGeneralStats from "./stats"
import { WarlordsClassStatsTable, WarlordsModeStatsTable } from "./table"
import WarlordsWeaponsList from "./weapons"
export default function WarlordsStats({ stats }: { stats: NonNullStats["Warlords"] }) {
if (!stats) return null
@@ -44,6 +45,8 @@ export default function WarlordsStats({ stats }: { stats: NonNullStats["Warlords
<Separator className="my-4" />
<WarlordsWeaponsBar stats={stats} />
<Separator className="my-4" />
<WarlordsWeaponsList weapons={stats.weapon_inventory} />
<Separator className="my-4" />
<WarlordsClassStatsTable stats={stats} />
<Separator className="my-4" />
<WarlordsModeStatsTable stats={stats} />

View File

@@ -0,0 +1,41 @@
import {
getWarlordsPlayerClass,
getWarlordsWeaponMaterial,
getWarlordsWeaponPrefix,
getWarlordsWeaponRarityColor
} from "@/lib/hypixel/warlords/general"
import { NonNullStats } from "@/lib/schema/player"
export default function WarlordsWeaponsList({ weapons }: { weapons: NonNullable<NonNullStats["Warlords"]>["weapon_inventory"] }) {
return (
<div>
<p className="font-bold">Weapon Inventory</p>
{weapons !== undefined ?
(
<div>
{weapons.map((w, i) => {
return <Weapon key={i} data={w} />
})}
</div>
) :
<p>This person has no weapons.</p>}
</div>
)
}
function Weapon({ data }: { data: NonNullable<NonNullable<NonNullStats["Warlords"]>["weapon_inventory"]>[number] }) {
const score = data.damage * (1 + data.upgradeTimes * 0.075)
+ data.chance
+ data.multiplier
+ data.abilityBoost * (1 + data.upgradeTimes * 0.075)
+ data.health * (1 + data.upgradeTimes * 0.25)
+ data.energy * (1 + data.upgradeTimes * 0.1)
+ data.cooldown * (1 + data.upgradeTimes * 0.075)
+ data.movement * (1 + data.upgradeTimes * 0.075)
const prefix = getWarlordsWeaponPrefix(score, data.category) ?? "Unknown"
const material = getWarlordsWeaponMaterial(data.material) ?? "Unknown"
const playerClass = getWarlordsPlayerClass(0, 0) ?? "Unknown"
const rarityColor = getWarlordsWeaponRarityColor(data.category)
return <p className={`text-mc-${rarityColor}`}>{`${prefix} ${material} of the ${playerClass}`}</p>
}

View File

@@ -79,12 +79,12 @@ export const MATERIALS = {
"COOKED_PORKCHOP": "Gemini",
"GOLDEN_CARROT": "Void Edge"
} as const
export const PLAYERCLASSES = {
mage: ["Pyromancer", "Cryomancer", "Aquamancer"],
warrior: ["Berserker", "Defender", "Revenant"],
paladin: ["Avenger", "Crusader", "Protector"],
shaman: ["Thunderlord", "Earthwarden", "Spiritguard"]
} as const
export const PLAYERCLASSES = [
["Pyromancer", "Cryomancer", "Aquamancer"],
["Berserker", "Defender", "Revenant"],
["Avenger", "Crusader", "Protector"],
["Thunderlord", "Earthwarden", "Spiritguard"]
] as const
export const SCORES = {
COMMON: [
{ score: 276, prefix: "Crumbly" },

View File

@@ -1,7 +1,43 @@
import { CLASSES, MODES, RARITIES, UPGRADES } from "@/data/hypixel/warlords"
import { CLASSES, MATERIALS, MODES, PLAYERCLASSES, RARITIES, SCORES, UPGRADES } from "@/data/hypixel/warlords"
import { NonNullStats } from "@/lib/schema/player"
import { devide } from "../general"
export function getWarlordsWeaponRarityColor(category?: string) {
const rarity = RARITIES.find(r => r.id === category?.toLowerCase())
return rarity?.color || RARITIES.find(r => r.id === "common")!.color
}
export function getWarlordsPlayerClass(playerClass: number | undefined, spec: number | undefined) {
if (playerClass === undefined || spec === undefined) return null
const klass = PLAYERCLASSES[playerClass][spec]
return klass || null
}
export function getWarlordsWeaponMaterial(material?: string) {
const mats = Object.entries(MATERIALS)
const mat = mats.find(m => m[0] === material)?.[1]
return mat || null
}
export function getWarlordsWeaponPrefix(score: number, category?: string) {
let prefix = ""
const scores = Object.entries(SCORES)
const indexed = scores.find(s => s[0] === category)?.[1]
if (!indexed) return null
for (const s of indexed.slice().reverse()) {
if (score > s.score) {
prefix = s.prefix
break
}
}
return prefix
}
export function getWarlordsClassLevel(classId: Exclude<typeof CLASSES[number]["id"], "">, stats: NonNullable<NonNullStats["Warlords"]>) {
let level = 0

View File

@@ -71,6 +71,23 @@ export const warlordsStatsSchema = z.object({
kills_capturetheflag: z.number().default(0),
kills_domination: z.number().default(0),
kills_teamdeathmatch: z.number().default(0),
weapon_inventory: z.array(z.object({
damage: z.number().default(0),
chance: z.number().default(0),
multiplier: z.number().default(0),
abilityBoost: z.number().default(0),
health: z.number().default(0),
energy: z.number().default(0),
cooldown: z.number().default(0),
movement: z.number().default(0),
upgradeTimes: z.number().default(0),
category: z.string().optional(),
material: z.string().optional(),
spec: z.object({
spec: z.number(),
playerClass: z.number()
})
})).optional(),
...warlordsClassStats().left_right,
...warlordsClassStats().right_left
})