use actual registered datablocks, remove hardcoded mappings

This commit is contained in:
Brian Beck 2025-12-04 22:17:33 -08:00
parent d320fbd694
commit 8b86c2f05d
4 changed files with 50 additions and 131 deletions

View file

@ -6,50 +6,7 @@ import { DebugPlaceholder, ShapeModel, ShapePlaceholder } from "./GenericShape";
import { ShapeInfoProvider } from "./ShapeInfoProvider"; import { ShapeInfoProvider } from "./ShapeInfoProvider";
import { useSimGroup } from "./SimGroup"; import { useSimGroup } from "./SimGroup";
import { FloatingLabel } from "./FloatingLabel"; import { FloatingLabel } from "./FloatingLabel";
import { useDatablock } from "./useDatablock";
const dataBlockToShapeName = {
AmmoPack: "pack_upgrade_ammo.dts",
Beacon: "beacon.dts",
Chaingun: "weapon_chaingun.dts",
ChaingunAmmo: "ammo_chaingun.dts",
CloakingPack: "pack_upgrade_cloaking.dts",
ConcussionGrenade: "grenade.dts",
DiscAmmo: "ammo_disc.dts",
ELFGun: "weapon_elf.dts",
EnergyPack: "pack_upgrade_energy.dts",
Flag: "flag.dts",
FlareGrenade: "grenade.dts",
Grenade: "grenade.dts",
GrenadeLauncher: "weapon_grenade_launcher.dts",
GrenadeLauncherAmmo: "ammo_grenade.dts",
InventoryDeployable: "pack_deploy_inventory.dts",
Mine: "ammo_mine.dts",
MotionSensorDeployable: "pack_deploy_sensor_motion.dts",
Plasma: "weapon_plasma.dts",
PlasmaAmmo: "ammo_plasma.dts",
PulseSensorDeployable: "pack_deploy_sensor_pulse.dts",
RepairKit: "repair_kit.dts",
RepairPack: "pack_upgrade_repair.dts",
RepairPatch: "repair_patch.dts",
SatchelCharge: "pack_upgrade_satchel.dts",
SensorJammerPack: "pack_upgrade_sensorjammer.dts",
ShieldPack: "pack_upgrade_shield.dts",
ShockLance: "weapon_shocklance.dts",
SniperRifle: "weapon_sniper.dts",
};
let _caseInsensitiveLookup: Record<string, string>;
function getDataBlockShape(dataBlock: string) {
if (!_caseInsensitiveLookup) {
_caseInsensitiveLookup = Object.fromEntries(
Object.entries(dataBlockToShapeName).map(([key, value]) => {
return [key.toLowerCase(), value];
}),
);
}
return _caseInsensitiveLookup[dataBlock.toLowerCase()];
}
const TEAM_NAMES = { const TEAM_NAMES = {
1: "Storm", 1: "Storm",
@ -58,19 +15,20 @@ const TEAM_NAMES = {
export function Item({ object }: { object: TorqueObject }) { export function Item({ object }: { object: TorqueObject }) {
const simGroup = useSimGroup(); const simGroup = useSimGroup();
const dataBlock = getProperty(object, "dataBlock") ?? ""; const datablockName = getProperty(object, "dataBlock") ?? "";
const datablock = useDatablock(datablockName);
const position = useMemo(() => getPosition(object), [object]); const position = useMemo(() => getPosition(object), [object]);
const scale = useMemo(() => getScale(object), [object]); const scale = useMemo(() => getScale(object), [object]);
const q = useMemo(() => getRotation(object), [object]); const q = useMemo(() => getRotation(object), [object]);
const shapeName = getDataBlockShape(dataBlock); const shapeName = getProperty(datablock, "shapeFile");
if (!shapeName) { if (!shapeName) {
console.error(`<Item> missing shape for dataBlock: ${dataBlock}`); console.error(`<Item> missing shape for datablock: ${datablockName}`);
} }
const isFlag = dataBlock?.toLowerCase() === "flag"; const isFlag = datablockName?.toLowerCase() === "flag";
const team = simGroup?.team ?? null; const team = simGroup?.team ?? null;
const teamName = team > 0 ? TEAM_NAMES[team] : null; const teamName = team > 0 ? TEAM_NAMES[team] : null;
const label = isFlag && teamName ? `${teamName} Flag` : null; const label = isFlag && teamName ? `${teamName} Flag` : null;

View file

@ -91,10 +91,28 @@ function useExecutedMission(
progress: progressTracker, progress: progressTracker,
ignoreScripts: [ ignoreScripts: [
"scripts/admin.cs", "scripts/admin.cs",
// `ignoreScripts` supports globs, but out of an abundance of caution
// we don't want to do `ai*.cs` in case there's some non-AI related
// word like "air" in a script name.
"scripts/ai.cs", "scripts/ai.cs",
"scripts/aiBotProfiles.cs",
"scripts/aiBountyGame.cs",
"scripts/aiChat.cs",
"scripts/aiCnH.cs",
"scripts/aiCTF.cs", "scripts/aiCTF.cs",
"scripts/aiTDM.cs", "scripts/aiDeathMatch.cs",
"scripts/aiDebug.cs",
"scripts/aiDefaultTasks.cs",
"scripts/aiDnD.cs",
"scripts/aiHumanTasks.cs",
"scripts/aiHunters.cs", "scripts/aiHunters.cs",
"scripts/aiInventory.cs",
"scripts/aiObjectiveBuilder.cs",
"scripts/aiObjectives.cs",
"scripts/aiRabbit.cs",
"scripts/aiSiege.cs",
"scripts/aiTDM.cs",
"scripts/aiTeamHunters.cs",
"scripts/deathMessages.cs", "scripts/deathMessages.cs",
"scripts/graphBuild.cs", "scripts/graphBuild.cs",
"scripts/navGraph.cs", "scripts/navGraph.cs",

View file

@ -4,54 +4,22 @@ import type { TorqueObject } from "../torqueScript";
import { getPosition, getProperty, getRotation, getScale } from "../mission"; import { getPosition, getProperty, getRotation, getScale } from "../mission";
import { DebugPlaceholder, ShapeModel, ShapePlaceholder } from "./GenericShape"; import { DebugPlaceholder, ShapeModel, ShapePlaceholder } from "./GenericShape";
import { ShapeInfoProvider } from "./ShapeInfoProvider"; import { ShapeInfoProvider } from "./ShapeInfoProvider";
import { useDatablock } from "./useDatablock";
const dataBlockToShapeName = {
Banner_Honor: "banner_honor.dts",
Banner_Strength: "banner_strength.dts",
Banner_Unity: "banner_unity.dts",
CreativityPad: "station_teleport.dts",
ExteriorFlagStand: "ext_flagstand.dts",
FlipFlop: "switch.dts",
GeneratorLarge: "station_generator_large.dts",
InteriorFlagStand: "int_flagstand.dts",
LightMaleHuman_Dead: "light_male_dead.dts",
MediumMaleHuman_Dead: "medium_male_dead.dts",
HeavyMaleHuman_Dead: "heavy_male_dead.dts",
LogoProjector: "teamlogo_projector.dts",
SensorLargePulse: "sensor_pulse_large.dts",
SensorMediumPulse: "sensor_pulse_medium.dts",
SolarPanel: "solarpanel.dts",
StaticShape: "switch.dts",
StationInventory: "station_inv_human.dts",
StationVehicle: "vehicle_pad_station.dts",
StationVehiclePad: "vehicle_pad.dts",
Teleporter: "nexusbase.dts",
};
let _caseInsensitiveLookup: Record<string, string>;
function getDataBlockShape(dataBlock: string) {
if (!_caseInsensitiveLookup) {
_caseInsensitiveLookup = Object.fromEntries(
Object.entries(dataBlockToShapeName).map(([key, value]) => {
return [key.toLowerCase(), value];
}),
);
}
return _caseInsensitiveLookup[dataBlock.toLowerCase()];
}
export function StaticShape({ object }: { object: TorqueObject }) { export function StaticShape({ object }: { object: TorqueObject }) {
const dataBlock = getProperty(object, "dataBlock") ?? ""; const datablockName = getProperty(object, "dataBlock") ?? "";
const datablock = useDatablock(datablockName);
const position = useMemo(() => getPosition(object), [object]); const position = useMemo(() => getPosition(object), [object]);
const q = useMemo(() => getRotation(object), [object]); const q = useMemo(() => getRotation(object), [object]);
const scale = useMemo(() => getScale(object), [object]); const scale = useMemo(() => getScale(object), [object]);
const shapeName = getDataBlockShape(dataBlock); const shapeName = getProperty(datablock, "shapeFile");
if (!shapeName) { if (!shapeName) {
console.error(`<StaticShape> missing shape for dataBlock: ${dataBlock}`); console.error(
`<StaticShape> missing shape for datablock: ${datablockName}`,
);
} }
return ( return (

View file

@ -4,52 +4,29 @@ import type { TorqueObject } from "../torqueScript";
import { getPosition, getProperty, getRotation, getScale } from "../mission"; import { getPosition, getProperty, getRotation, getScale } from "../mission";
import { DebugPlaceholder, ShapeModel, ShapePlaceholder } from "./GenericShape"; import { DebugPlaceholder, ShapeModel, ShapePlaceholder } from "./GenericShape";
import { ShapeInfoProvider } from "./ShapeInfoProvider"; import { ShapeInfoProvider } from "./ShapeInfoProvider";
import { useDatablock } from "./useDatablock";
const dataBlockToShapeName = {
AABarrelLarge: "turret_aa_large.dts",
ELFBarrelLarge: "turret_elf_large.dts",
MissileBarrelLarge: "turret_missile_large.dts",
MortarBarrelLarge: "turret_mortar_large.dts",
PlasmaBarrelLarge: "turret_fusion_large.dts",
SentryTurret: "turret_sentry.dts",
TurretBaseLarge: "turret_base_large.dts",
SentryTurretBarrel: "turret_muzzlepoint.dts",
};
let _caseInsensitiveLookup: Record<string, string>;
function getDataBlockShape(dataBlock: string) {
if (!_caseInsensitiveLookup) {
_caseInsensitiveLookup = Object.fromEntries(
Object.entries(dataBlockToShapeName).map(([key, value]) => {
return [key.toLowerCase(), value];
}),
);
}
return _caseInsensitiveLookup[dataBlock.toLowerCase()];
}
export function Turret({ object }: { object: TorqueObject }) { export function Turret({ object }: { object: TorqueObject }) {
const dataBlock = getProperty(object, "dataBlock") ?? ""; const datablockName = getProperty(object, "dataBlock") ?? "";
const initialBarrel = getProperty(object, "initialBarrel"); const barrelDatablockName = getProperty(object, "initialBarrel");
const datablock = useDatablock(datablockName);
const barrelDatablock = useDatablock(barrelDatablockName);
const position = useMemo(() => getPosition(object), [object]); const position = useMemo(() => getPosition(object), [object]);
const q = useMemo(() => getRotation(object), [object]); const q = useMemo(() => getRotation(object), [object]);
const scale = useMemo(() => getScale(object), [object]); const scale = useMemo(() => getScale(object), [object]);
const shapeName = getDataBlockShape(dataBlock); const shapeName = getProperty(datablock, "shapeFile");
const barrelShapeName = getProperty(barrelDatablock, "shapeFile");
const barrelShapeName =
typeof initialBarrel === "string"
? getDataBlockShape(initialBarrel)
: undefined;
if (!shapeName) { if (!shapeName) {
console.error(`<Turret> missing shape for dataBlock: ${dataBlock}`); console.error(`<Turret> missing shape for datablock: ${datablockName}`);
} }
if (!barrelShapeName) { // `initialBarrel` is optional - turrets can exist without a barrel mounted.
// But if we do have one, it needs a shape name.
if (barrelDatablockName && !barrelShapeName) {
console.error( console.error(
`<Turret> missing shape for initialBarrel dataBlock: ${initialBarrel}`, `<Turret> missing shape for barrel datablock: ${barrelDatablockName}`,
); );
} }
@ -67,9 +44,9 @@ export function Turret({ object }: { object: TorqueObject }) {
) : ( ) : (
<DebugPlaceholder color="orange" /> <DebugPlaceholder color="orange" />
)} )}
<ShapeInfoProvider shapeName={barrelShapeName} type="Turret"> {barrelShapeName ? (
<group position={[0, 1.5, 0]}> <ShapeInfoProvider shapeName={barrelShapeName} type="Turret">
{barrelShapeName ? ( <group position={[0, 1.5, 0]}>
<ErrorBoundary <ErrorBoundary
fallback={ fallback={
<DebugPlaceholder color="red" label={barrelShapeName} /> <DebugPlaceholder color="red" label={barrelShapeName} />
@ -79,11 +56,9 @@ export function Turret({ object }: { object: TorqueObject }) {
<ShapeModel /> <ShapeModel />
</Suspense> </Suspense>
</ErrorBoundary> </ErrorBoundary>
) : ( </group>
<DebugPlaceholder color="orange" /> </ShapeInfoProvider>
)} ) : null}
</group>
</ShapeInfoProvider>
</group> </group>
</ShapeInfoProvider> </ShapeInfoProvider>
); );