import { NetworkMessageHandler, FrameData, EntityState, ProtocolPlayerState } from './parser.js'; import { FrameDiff, DemoEvent, DemoEventType, EventSummary, DemoHeader, ServerInfo, DemoStatistics, PlayerStatistics, WeaponStatistics } from './analysis.js'; import { Vec3 } from '@quake2ts/shared'; import { DemoCameraMode } from './camera.js'; import { ResourceLoadTracker, ResourceLoadLog } from '../assets/resourceTracker.js'; export declare enum PlaybackState { Stopped = 0, Playing = 1, Paused = 2, Finished = 3 } export interface DemoMetadata { mapName: string; playerName: string; serverName?: string; recordingDate?: Date; demoVersion: number; tickRate: number; } export interface DemoPlaybackCallbacks { onPlaybackStateChange?: (state: PlaybackState) => void; onTimeUpdate?: (time: number) => void; onPlaybackComplete?: () => void; onSeekComplete?: () => void; onCaptureSnapshot?: (frame: number) => any; onRestoreSnapshot?: (snapshot: any) => void; onFrameUpdate?: (frame: FrameData) => void; onPlaybackError?: (error: Error) => void; } export type FrameOffset = { type: 'frame'; frame: number; }; export type TimeOffset = { type: 'time'; seconds: number; }; export type PlaybackOffset = FrameOffset | TimeOffset; export declare class DemoPlaybackController { private reader; private buffer; private state; private playbackSpeed; private handler?; private callbacks?; private currentProtocolVersion; private currentFrameIndex; private lastFrameData; private accumulatedTime; private frameDuration; private snapshotInterval; private snapshots; private cachedEvents; private cachedSummary; private cachedHeader; private cachedConfigStrings; private cachedServerInfo; private cachedStatistics; private cachedPlayerStats; private cachedWeaponStats; private tracker; private cameraMode; private thirdPersonDistance; private thirdPersonOffset; constructor(); setHandler(handler: NetworkMessageHandler): void; setCallbacks(callbacks: DemoPlaybackCallbacks): void; loadDemo(buffer: ArrayBuffer): void; play(): void; pause(): void; stop(): void; private transitionState; setFrameDuration(ms: number): void; setSpeed(speed: number): void; getSpeed(): number; getPlaybackSpeed(): number; /** * Returns the interpolation factor (0.0 to 1.0) for the current frame. * Used for smooth rendering between demo frames. */ getInterpolationFactor(): number; update(dt: number): void; stepForward(): void; stepBackward(): void; seekToTime(seconds: number): void; seekToFrame(frameIndex: number): void; frameToTime(frame: number): number; timeToFrame(seconds: number): number; playFrom(offset: PlaybackOffset): void; playRange(start: PlaybackOffset, end: PlaybackOffset): void; /** * Seeks to a specific frame number. */ seek(frameNumber: number): void; private processNextFrame; getState(): PlaybackState; getCurrentTime(): number; getFrameCount(): number; getTotalFrames(): number; getCurrentFrame(): number; getDuration(): number; getTotalBytes(): number; getProcessedBytes(): number; getFrameData(frameIndex: number): FrameData | null; getFramePlayerState(frameIndex: number): ProtocolPlayerState | null; getFrameEntities(frameIndex: number): EntityState[]; compareFrames(frameA: number, frameB: number): FrameDiff; getEntityTrajectory(entityId: number, startFrame: number, endFrame: number): Vec3[]; /** * Extract notable events from demo for timeline markers */ getEvents(): DemoEvent[]; getDemoEvents(): DemoEvent[]; filterEvents(type: DemoEventType, entityId?: number): DemoEvent[]; getEventSummary(): EventSummary; getMetadata(): DemoMetadata | null; getDemoHeader(): DemoHeader | null; getDemoConfigStrings(): Map; getDemoServerInfo(): ServerInfo; getDemoStatistics(): DemoStatistics | null; getPlayerStatistics(playerIndex: number): PlayerStatistics | null; getWeaponStatistics(entityId: number): WeaponStatistics[] | null; private ensureAnalysis; setCameraMode(mode: DemoCameraMode): void; getCameraMode(): DemoCameraMode; setThirdPersonDistance(distance: number): void; setThirdPersonOffset(offset: Vec3): void; playWithTracking(tracker: ResourceLoadTracker, options?: { fastForward?: boolean; }): Promise; playRangeWithTracking(start: PlaybackOffset, end: PlaybackOffset, tracker: ResourceLoadTracker, options?: { fastForward?: boolean; }): Promise; } //# sourceMappingURL=playback.d.ts.map