Finished warlords stats
This commit is contained in:
@@ -7,6 +7,7 @@ import GeneralStats from "../GeneralStats"
|
|||||||
import { WarlordsWeaponsBar } from "./client"
|
import { WarlordsWeaponsBar } from "./client"
|
||||||
import WarlordsGeneralStats from "./stats"
|
import WarlordsGeneralStats from "./stats"
|
||||||
import { WarlordsClassStatsTable, WarlordsModeStatsTable } from "./table"
|
import { WarlordsClassStatsTable, WarlordsModeStatsTable } from "./table"
|
||||||
|
import WarlordsWeaponsList from "./weapons"
|
||||||
|
|
||||||
export default function WarlordsStats({ stats }: { stats: NonNullStats["Warlords"] }) {
|
export default function WarlordsStats({ stats }: { stats: NonNullStats["Warlords"] }) {
|
||||||
if (!stats) return null
|
if (!stats) return null
|
||||||
@@ -44,6 +45,8 @@ export default function WarlordsStats({ stats }: { stats: NonNullStats["Warlords
|
|||||||
<Separator className="my-4" />
|
<Separator className="my-4" />
|
||||||
<WarlordsWeaponsBar stats={stats} />
|
<WarlordsWeaponsBar stats={stats} />
|
||||||
<Separator className="my-4" />
|
<Separator className="my-4" />
|
||||||
|
<WarlordsWeaponsList weapons={stats.weapon_inventory} />
|
||||||
|
<Separator className="my-4" />
|
||||||
<WarlordsClassStatsTable stats={stats} />
|
<WarlordsClassStatsTable stats={stats} />
|
||||||
<Separator className="my-4" />
|
<Separator className="my-4" />
|
||||||
<WarlordsModeStatsTable stats={stats} />
|
<WarlordsModeStatsTable stats={stats} />
|
||||||
|
|||||||
41
src/app/(stats)/player/[ign]/_stats/warlords/weapons.tsx
Normal file
41
src/app/(stats)/player/[ign]/_stats/warlords/weapons.tsx
Normal 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>
|
||||||
|
}
|
||||||
@@ -79,12 +79,12 @@ export const MATERIALS = {
|
|||||||
"COOKED_PORKCHOP": "Gemini",
|
"COOKED_PORKCHOP": "Gemini",
|
||||||
"GOLDEN_CARROT": "Void Edge"
|
"GOLDEN_CARROT": "Void Edge"
|
||||||
} as const
|
} as const
|
||||||
export const PLAYERCLASSES = {
|
export const PLAYERCLASSES = [
|
||||||
mage: ["Pyromancer", "Cryomancer", "Aquamancer"],
|
["Pyromancer", "Cryomancer", "Aquamancer"],
|
||||||
warrior: ["Berserker", "Defender", "Revenant"],
|
["Berserker", "Defender", "Revenant"],
|
||||||
paladin: ["Avenger", "Crusader", "Protector"],
|
["Avenger", "Crusader", "Protector"],
|
||||||
shaman: ["Thunderlord", "Earthwarden", "Spiritguard"]
|
["Thunderlord", "Earthwarden", "Spiritguard"]
|
||||||
} as const
|
] as const
|
||||||
export const SCORES = {
|
export const SCORES = {
|
||||||
COMMON: [
|
COMMON: [
|
||||||
{ score: 276, prefix: "Crumbly" },
|
{ score: 276, prefix: "Crumbly" },
|
||||||
|
|||||||
@@ -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 { NonNullStats } from "@/lib/schema/player"
|
||||||
import { devide } from "../general"
|
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"]>) {
|
export function getWarlordsClassLevel(classId: Exclude<typeof CLASSES[number]["id"], "">, stats: NonNullable<NonNullStats["Warlords"]>) {
|
||||||
let level = 0
|
let level = 0
|
||||||
|
|
||||||
|
|||||||
@@ -71,6 +71,23 @@ export const warlordsStatsSchema = z.object({
|
|||||||
kills_capturetheflag: z.number().default(0),
|
kills_capturetheflag: z.number().default(0),
|
||||||
kills_domination: z.number().default(0),
|
kills_domination: z.number().default(0),
|
||||||
kills_teamdeathmatch: 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().left_right,
|
||||||
...warlordsClassStats().right_left
|
...warlordsClassStats().right_left
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user