huh i forgor

This commit is contained in:
tresabhi committed 2026-09-23 17:37:52 -05:00
1 parent 4247004b13
commit 960279bf00
8 files changed
+96 -48

No files matched your search

@@ -1,4 +1,4 @@
import { EquipmentDefinitions, EquipmentSlot } from "@blitzkit/core";
import { EquipmentDefinitions, EquipmentSlot } from "@blitzkit/protos";
import { Cache } from "./0_base";
import { ServerBlitzKitAPI4 } from "./4_maps";
@@ -4,9 +4,7 @@ import { correctZYTuple } from "../../../core/blitz/correctZYTuple";
import { nameToArmorId } from "../../../core/blitzkit/nameToArmorId";
import { resolveArmor } from "../../../core/blitzkit/resolveThickness";
import { useArmor } from "../../../hooks/useArmor";
import { useTankModelDefinition } from "../../../hooks/useTankModelDefinition";
import { useTankTransform } from "../../../hooks/useTankTransform";
import { Duel } from "../../../stores/duel";
import { DuelModule, useDuel } from "../../../hooks/useDuel";
import { ModelTankWrapper } from "./ModelTankWrapper";
import { PrimaryArmorSceneComponent } from "./PrimaryArmorSceneComponent";
@@ -14,10 +12,10 @@ export const PrimaryArmorScene = memo(() => {
const wrapper = useRef<Group>(null);
const turretContainer = useRef<Group>(null!);
const gunContainer = useRef<Group>(null!);
const tank = Duel.use((state) => state.protagonist.tank);
const track = Duel.use((state) => state.protagonist.track);
const turret = Duel.use((state) => state.protagonist.turret);
const gun = Duel.use((state) => state.protagonist.gun);
const tank = useDuel("protagonist", DuelModule.Tank);
const track = useDuel("protagonist", DuelModule.Track);
const turret = useDuel("protagonist", DuelModule.Turret);
const gun = useDuel("protagonist", DuelModule.Gun);
const armorGltf = useArmor(tank.id).gltf;
const armorNodes = Object.values(armorGltf.nodes);
const tankModelDefinition = useTankModelDefinition();
+74
View File
@@ -0,0 +1,74 @@
import type {
EngineDefinition,
GunDefinition,
ShellDefinition,
TankDefinition,
TrackDefinition,
TurretDefinition,
} from "@blitzkit/protos";
import { api } from "../api/dynamic";
import { Tankopedia } from "../stores/tankopedia";
import type { DuelSide } from "./useEquipment";
export enum DuelModule {
Tank,
Track,
Engine,
Turret,
Gun,
Shell,
}
const tanks = await api.tanks();
export function useDuel(
side: DuelSide,
module: DuelModule.Tank,
): TankDefinition;
export function useDuel(
side: DuelSide,
module: DuelModule.Track,
): TrackDefinition;
export function useDuel(
side: DuelSide,
module: DuelModule.Engine,
): EngineDefinition;
export function useDuel(
side: DuelSide,
module: DuelModule.Turret,
): TurretDefinition;
export function useDuel(side: DuelSide, module: DuelModule.Gun): GunDefinition;
export function useDuel(
side: DuelSide,
module: DuelModule.Shell,
): ShellDefinition;
export function useDuel(side: DuelSide, module: DuelModule) {
const tankId = Tankopedia.use((state) => state[side].tank);
const tank = tanks.tanks[tankId];
if (module === DuelModule.Tank) return tank;
if (module === DuelModule.Track) {
const trackId = Tankopedia.use((state) => state[side].track);
return tank.tracks.find((track) => track.id === trackId)!;
}
if (module === DuelModule.Engine) {
const engineId = Tankopedia.use((state) => state[side].engine);
return tank.engines.find((engine) => engine.id === engineId)!;
}
const turretId = Tankopedia.use((state) => state[side].turret);
const turret = tank.turrets.find((turret) => turret.id === turretId)!;
if (module === DuelModule.Turret) return turret;
const gunId = Tankopedia.use((state) => state[side].gun);
const gun = turret.guns.find((gun) => gun.id === gunId)!;
if (module === DuelModule.Gun) return gun;
const shellId = Tankopedia.use((state) => state[side].shell);
return gun.shells.find((shell) => shell.id === shellId)!;
}
+12 -10
View File
@@ -1,18 +1,20 @@
import { useMemo } from "react";
import { api } from "../api/dynamic";
import { Duel } from "../stores/duel";
import { Tankopedia } from "../stores/tankopedia";
const equipmentDefinitions = await api.equipment();
const equipment = await api.equipment();
const tanks = await api.tanks();
export function useEquipment(id: number, antagonist = false) {
const member = Duel.use(
(state) => state[antagonist ? "antagonist" : "protagonist"]!,
);
const preset = equipmentDefinitions.presets[member.tank.equipment_preset];
const equipmentMatrix = Duel.use(
(state) =>
state[antagonist ? "antagonist" : "protagonist"]!.equipmentMatrix,
export type DuelSide = "protagonist" | "antagonist";
export function useEquipment(id: number, side: DuelSide) {
const member = Tankopedia.use((state) => state[side]);
const tank = tanks.tanks[member.tank];
const preset = equipment.presets[tank.equipment_preset];
const equipmentMatrix = Tankopedia.use(
(state) => state[side].equipment_matrix,
);
const value = useMemo(() => {
return preset.slots.some((slot, index) => {
const row = Math.floor(index / 3);
@@ -1,8 +0,0 @@
import { Tankopedia } from "../stores/tankopedia";
import { useProtagonistTurret } from "./useProtagonistTurret";
export function useProtagonistGun() {
const id = Tankopedia.use((state) => state.protagonist.gun);
const turret = useProtagonistTurret();
return turret.guns[id];
}
@@ -1,9 +0,0 @@
import { api } from "../api/dynamic";
import { Tankopedia } from "../stores/tankopedia";
import { useAwait } from "./useAwait";
export function useProtagonistTank() {
const id = Tankopedia.use((state) => state.protagonist.tank);
const tank = useAwait(() => api.tank(id), `tank-${id}`);
return tank;
}
@@ -1,8 +0,0 @@
import { Tankopedia } from "../stores/tankopedia";
import { useProtagonistTank } from "./useProtagonistTank";
export function useProtagonistTurret() {
const id = Tankopedia.use((state) => state.protagonist.gun);
const tank = useProtagonistTank();
return tank.turrets[id];
}
+4 -5
View File
@@ -1,8 +1,5 @@
import {
createDefaultSkills,
ShellDefinition,
TankDefinition,
} from "@blitzkit/core";
import { createDefaultSkills } from "@blitzkit/core";
import type { ShellDefinition, TankDefinition } from "@blitzkit/protos";
import type { Vector3 } from "three";
import { Varuna } from "varuna";
import { api } from "../api/dynamic";
@@ -83,6 +80,7 @@ interface Tankopedia {
revealed: boolean;
protagonist: TankState;
antagonist: TankState;
shot?: Shot;
skills: Record<string, number>;
@@ -117,6 +115,7 @@ export const Tankopedia = new Varuna<Tankopedia, TankDefinition>((tank) => ({
revealed: false,
protagonist: createTankState(tank),
antagonist: createTankState(tank),
model: models.models[tank.id],
relativeAgainst: TankopediaRelativeAgainst.Class,