airframe.io / src /game /multiplayer /WeaponSystem.ts
LATTICEWORKS's picture
feat: integrate Google Earth 3D Tiles and optimize engine hooks
565f6e7
Raw
History Blame Contribute Delete
1.86 kB
import { Pilot, WeaponType } from "../../types";
import { WEAPON_SPECS_MAP } from "../aircraftData";
import { Vector3 } from "three";
import { spawnOrdnance, spawnGunProjectile } from "./ProjectileSpawner";
export class WeaponSystem {
public handleWeaponFiring(
pilot: Pilot,
triggerPrimary: boolean,
triggerSecondary: boolean,
dt: number,
clientSeq: number | undefined,
inputQueueLength: number,
playerHistory: any[],
triggerSplashDamage: (pos: Vector3, ownerId: string, team: number, type: WeaponType) => void,
projectiles: any[],
mapId: string,
broadcast: (type: string, payload: any) => void
) {
if (!pilot.entity.components.has("weaponized")) return;
const wep = pilot.entity.components.get("weaponized") as any;
if (!wep.cooldowns) wep.cooldowns = {};
pilot.specs.weapons.forEach(wType => {
const spec = WEAPON_SPECS_MAP[wType];
const ammo = wep.ammo[wType] ?? 0;
if (ammo <= 0) return;
const cooldown = wep.cooldowns[wType] ?? 0;
if (cooldown > 0) return;
const isSecondary = wType === WeaponType.ROCKET || wType === WeaponType.BOMB;
if (isSecondary) {
if (!triggerSecondary) return;
broadcast("player_fired", { id: pilot.id, weaponType: wType });
spawnOrdnance(pilot, wType, projectiles);
wep.ammo[wType]--;
wep.cooldowns[wType] = 1 / Math.max(0.01, spec.fireRate);
return;
}
if (!triggerPrimary) return;
const shotChance = spec.fireRate * dt * 0.9;
if (Math.random() < shotChance) {
broadcast("player_fired", { id: pilot.id, weaponType: wType });
spawnGunProjectile(pilot, wType, clientSeq, inputQueueLength, playerHistory, triggerSplashDamage, projectiles, mapId);
wep.ammo[wType]--;
wep.cooldowns[wType] = 0.015;
}
});
}
}