import type { Vec3 } from '@quake2ts/shared'; import { RandomGenerator } from '@quake2ts/shared'; import { GameImports, GameEngine, TraceFunction, PointContentsFunction, MulticastType } from '../imports.js'; import { ENTITY_FIELD_METADATA, Entity } from './entity.js'; import { type EntityPoolSnapshot } from './pool.js'; import { type ThinkScheduleEntry } from './thinkScheduler.js'; import { ServerCommand } from '@quake2ts/shared'; import type { CallbackRegistry } from './callbacks.js'; import type { TargetAwarenessState } from '../ai/targeting.js'; import type { SpawnFunction, SpawnRegistry } from './spawn.js'; import { ScriptHookRegistry } from '../scripting/hooks.js'; type SerializableVec3 = readonly [number, number, number]; type SerializableInventory = Record; type SerializableEntityFieldValue = number | string | boolean | null | SerializableVec3 | SerializableInventory; type SerializableFieldName = (typeof ENTITY_FIELD_METADATA)[number]['name']; export interface SerializedEntityState { readonly index: number; readonly fields: Partial>; } export interface SerializedTargetAwareness { readonly frameNumber: number; readonly sightEntityIndex: number | null; readonly sightEntityFrame: number; readonly soundEntityIndex: number | null; readonly soundEntityFrame: number; readonly sound2EntityIndex: number | null; readonly sound2EntityFrame: number; readonly sightClientIndex: number | null; } export interface EntitySystemSnapshot { readonly timeSeconds: number; readonly pool: EntityPoolSnapshot; readonly entities: SerializedEntityState[]; readonly thinks: ThinkScheduleEntry[]; readonly awareness: SerializedTargetAwareness; readonly crossLevelFlags: number; readonly crossUnitFlags: number; readonly level: LevelState; } export interface LevelState { next_auto_save: number; health_bar_entities: (Entity | null)[]; intermission_angle: Vec3; intermission_origin: Vec3; helpmessage1: string; helpmessage2: string; help1changed: number; help2changed: number; mapname?: string; } interface ExtendedTargetAwarenessState extends TargetAwarenessState { activePlayers: Entity[]; monsterAlertedByPlayers(monster: Entity): Entity | null; soundClient(): Entity | null; } export declare class EntitySystem { readonly friendlyFire: boolean; private readonly pool; private readonly thinkScheduler; private readonly targetNameIndex; private readonly random; private readonly callbackToName; private spawnRegistry?; private currentTimeSeconds; private currentDeltaSeconds; private frameNumber; private spawnCount; private spatialGrid; get scriptHooks(): ScriptHookRegistry | undefined; readonly targetAwareness: ExtendedTargetAwarenessState; crossLevelFlags: number; crossUnitFlags: number; level: LevelState; get rng(): RandomGenerator; setSpawnRegistry(registry: SpawnRegistry): void; registerEntityClass(classname: string, factory: SpawnFunction): void; getSpawnFunction(classname: string): SpawnFunction | undefined; readonly engine: GameEngine; readonly imports: GameImports; private readonly gravity; readonly deathmatch: boolean; readonly skill: number; readonly coop: boolean; get trace(): TraceFunction; get traceModel(): import("../imports.js").TraceModelFunction | undefined; get pointcontents(): PointContentsFunction; get areaEdicts(): (mins: Vec3, maxs: Vec3) => number[] | null; get game(): any; get maxClients(): number; get entities(): ArrayLike; get deltaSeconds(): number; constructor(engine: GameEngine, imports?: Partial, gravity?: Vec3, maxEntities?: number, callbackRegistry?: CallbackRegistry, deathmatch?: boolean, skill?: number, random?: RandomGenerator, coop?: boolean, friendlyFire?: boolean); get world(): Entity; get activeCount(): number; get timeSeconds(): number; forEachEntity(callback: (entity: Entity) => void): void; find(predicate: (entity: Entity) => boolean): Entity | undefined; getByIndex(index: number): Entity | undefined; spawn(): Entity; free(entity: Entity): void; freeImmediate(entity: Entity): void; sound(entity: Entity, channel: number, sound: string, volume: number, attenuation: number, timeofs: number): void; soundIndex(sound: string): number; configStringIndex(str: string): number; modelIndex(model: string): number; linkentity(ent: Entity): void; link(ent: Entity): void; unlink(ent: Entity): void; multicast(origin: Vec3, type: MulticastType, ServerCommand: ServerCommand, ...args: any[]): void; unicast(ent: Entity, reliable: boolean, event: ServerCommand, ...args: any[]): void; scheduleThink(entity: Entity, nextThinkSeconds: number): void; beginFrame(timeSeconds: number): void; finalizeSpawn(entity: Entity): void; findByClassname(classname: string): Entity[]; findByTargetName(targetname: string): Entity[]; findInBox(mins: Vec3, maxs: Vec3): Entity[]; findByRadius(origin: Vec3, radius: number): Entity[]; pickTarget(targetname: string | undefined): Entity | null; killBox(entity: Entity): void; useTargets(entity: Entity, activator?: Entity | null): void; runFrame(): void; createSnapshot(): EntitySystemSnapshot; restore(snapshot: EntitySystemSnapshot, callbackRegistry?: CallbackRegistry): void; private runTouches; private registerTarget; private unregisterTarget; private useTargetsImmediate; } export {}; //# sourceMappingURL=system.d.ts.map