mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-24 12:09:51 +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 { Cache } from "./0_base";
|
||||||
import { ServerBlitzKitAPI4 } from "./4_maps";
|
import { ServerBlitzKitAPI4 } from "./4_maps";
|
||||||
|
|
||||||
|
|||||||
@@ -4,9 +4,7 @@ import { correctZYTuple } from "../../../core/blitz/correctZYTuple";
|
|||||||
import { nameToArmorId } from "../../../core/blitzkit/nameToArmorId";
|
import { nameToArmorId } from "../../../core/blitzkit/nameToArmorId";
|
||||||
import { resolveArmor } from "../../../core/blitzkit/resolveThickness";
|
import { resolveArmor } from "../../../core/blitzkit/resolveThickness";
|
||||||
import { useArmor } from "../../../hooks/useArmor";
|
import { useArmor } from "../../../hooks/useArmor";
|
||||||
import { useTankModelDefinition } from "../../../hooks/useTankModelDefinition";
|
import { DuelModule, useDuel } from "../../../hooks/useDuel";
|
||||||
import { useTankTransform } from "../../../hooks/useTankTransform";
|
|
||||||
import { Duel } from "../../../stores/duel";
|
|
||||||
import { ModelTankWrapper } from "./ModelTankWrapper";
|
import { ModelTankWrapper } from "./ModelTankWrapper";
|
||||||
import { PrimaryArmorSceneComponent } from "./PrimaryArmorSceneComponent";
|
import { PrimaryArmorSceneComponent } from "./PrimaryArmorSceneComponent";
|
||||||
|
|
||||||
@@ -14,10 +12,10 @@ export const PrimaryArmorScene = memo(() => {
|
|||||||
const wrapper = useRef<Group>(null);
|
const wrapper = useRef<Group>(null);
|
||||||
const turretContainer = useRef<Group>(null!);
|
const turretContainer = useRef<Group>(null!);
|
||||||
const gunContainer = useRef<Group>(null!);
|
const gunContainer = useRef<Group>(null!);
|
||||||
const tank = Duel.use((state) => state.protagonist.tank);
|
const tank = useDuel("protagonist", DuelModule.Tank);
|
||||||
const track = Duel.use((state) => state.protagonist.track);
|
const track = useDuel("protagonist", DuelModule.Track);
|
||||||
const turret = Duel.use((state) => state.protagonist.turret);
|
const turret = useDuel("protagonist", DuelModule.Turret);
|
||||||
const gun = Duel.use((state) => state.protagonist.gun);
|
const gun = useDuel("protagonist", DuelModule.Gun);
|
||||||
const armorGltf = useArmor(tank.id).gltf;
|
const armorGltf = useArmor(tank.id).gltf;
|
||||||
const armorNodes = Object.values(armorGltf.nodes);
|
const armorNodes = Object.values(armorGltf.nodes);
|
||||||
const tankModelDefinition = useTankModelDefinition();
|
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 { useMemo } from "react";
|
||||||
import { api } from "../api/dynamic";
|
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) {
|
export type DuelSide = "protagonist" | "antagonist";
|
||||||
const member = Duel.use(
|
|
||||||
(state) => state[antagonist ? "antagonist" : "protagonist"]!,
|
export function useEquipment(id: number, side: DuelSide) {
|
||||||
);
|
const member = Tankopedia.use((state) => state[side]);
|
||||||
const preset = equipmentDefinitions.presets[member.tank.equipment_preset];
|
const tank = tanks.tanks[member.tank];
|
||||||
const equipmentMatrix = Duel.use(
|
const preset = equipment.presets[tank.equipment_preset];
|
||||||
(state) =>
|
const equipmentMatrix = Tankopedia.use(
|
||||||
state[antagonist ? "antagonist" : "protagonist"]!.equipmentMatrix,
|
(state) => state[side].equipment_matrix,
|
||||||
);
|
);
|
||||||
|
|
||||||
const value = useMemo(() => {
|
const value = useMemo(() => {
|
||||||
return preset.slots.some((slot, index) => {
|
return preset.slots.some((slot, index) => {
|
||||||
const row = Math.floor(index / 3);
|
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 {
|
import { createDefaultSkills } from "@blitzkit/core";
|
||||||
createDefaultSkills,
|
import type { ShellDefinition, TankDefinition } from "@blitzkit/protos";
|
||||||
ShellDefinition,
|
|
||||||
TankDefinition,
|
|
||||||
} from "@blitzkit/core";
|
|
||||||
import type { Vector3 } from "three";
|
import type { Vector3 } from "three";
|
||||||
import { Varuna } from "varuna";
|
import { Varuna } from "varuna";
|
||||||
import { api } from "../api/dynamic";
|
import { api } from "../api/dynamic";
|
||||||
@@ -83,6 +80,7 @@ interface Tankopedia {
|
|||||||
revealed: boolean;
|
revealed: boolean;
|
||||||
|
|
||||||
protagonist: TankState;
|
protagonist: TankState;
|
||||||
|
antagonist: TankState;
|
||||||
|
|
||||||
shot?: Shot;
|
shot?: Shot;
|
||||||
skills: Record<string, number>;
|
skills: Record<string, number>;
|
||||||
@@ -117,6 +115,7 @@ export const Tankopedia = new Varuna<Tankopedia, TankDefinition>((tank) => ({
|
|||||||
revealed: false,
|
revealed: false,
|
||||||
|
|
||||||
protagonist: createTankState(tank),
|
protagonist: createTankState(tank),
|
||||||
|
antagonist: createTankState(tank),
|
||||||
model: models.models[tank.id],
|
model: models.models[tank.id],
|
||||||
|
|
||||||
relativeAgainst: TankopediaRelativeAgainst.Class,
|
relativeAgainst: TankopediaRelativeAgainst.Class,
|
||||||
|
|||||||
Reference in new issue
Block a user