mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-21 10:47:04 +02:00
huh i forgor
This commit is contained in:
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();
|
||||
|
||||
@@ -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)!;
|
||||
}
|
||||
@@ -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];
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
Reference in new issue
Block a user