import EventEmitter from 'eventemitter3'; import PartyTracker from '../../resources/party'; import ZoneInfo from '../../resources/zone_info'; import { JobDetail } from '../../types/event'; import { Job } from '../../types/job'; import { NetFields } from '../../types/net_fields'; import { ComboCallback, ComboTracker } from './combo_tracker'; import { JobsEventEmitter, PartialFieldMatches } from './event_emitter'; import { FfxivVersion } from './jobs'; export type Stats = Omit, 'type' | 'timestamp' | 'job' | 'localContentId'>; export type SpeedBuffs = { presenceOfMind: boolean; fuka: boolean; huton: boolean; paeonStacks: number; museStacks: number; circleOfPower: boolean; swiftscaled: boolean; }; export type GainCallback = (id: string, matches: PartialFieldMatches<'GainsEffect'>) => void; export type LoseCallback = (id: string, matches: PartialFieldMatches<'LosesEffect'>) => void; export type AbilityCallback = (id: string, matches: PartialFieldMatches<'Ability'>) => void; export type ZoneChangeCallback = (id: number, name: string, info?: typeof ZoneInfo[number]) => void; export interface EventMap { 'hp': (info: { hp: number; maxHp: number; prevHp: number; shield: number; prevShield: number; }) => void; 'mp': (info: { mp: number; maxMp: number; prevMp: number; }) => void; 'cp': (info: { cp: number; maxCp: number; prevCp: number; }) => void; 'gp': (info: { gp: number; maxGp: number; prevGp: number; }) => void; 'job': (job: Job) => void; 'level': (level: number, prevLevel: number) => void; 'pos': (pos: { x: number; y: number; z: number; }, rotation: number) => void; 'job-detail': (job: JobKey, jobDetail: JobKey extends keyof JobDetail ? JobDetail[JobKey] : never) => void; 'stat': (stat: Stats, gcd: { gcdSkill: number; gcdSpell: number; }) => void; 'player': (player: Player) => void; 'action': (actionId: string, info: PartialFieldMatches<'Ability'>) => void; 'action/you': (actionId: string, info: PartialFieldMatches<'Ability'>) => void; 'action/party': (actionId: string, info: PartialFieldMatches<'Ability'>) => void; 'action/other': (actionId: string, info: PartialFieldMatches<'Ability'>) => void; 'action/combo': (actionId: string | undefined, combo: ComboTracker) => void; 'effect/gain': (effectId: string, info: PartialFieldMatches<'GainsEffect'>) => void; 'effect/lose': (effectId: string, info: PartialFieldMatches<'LosesEffect'>) => void; 'effect/gain/you': (effectId: string, info: PartialFieldMatches<'GainsEffect'>) => void; 'effect/lose/you': (effectId: string, info: PartialFieldMatches<'LosesEffect'>) => void; } /** Player data */ export declare class PlayerBase { ffxivVersion: FfxivVersion; id: number; /** player id in hex, upper case */ idHex: string; name: string; level: number; job: Job; hp: number; maxHp: number; shield: number; mp: number; maxMp: number; cp: number; maxCp: number; gp: number; maxGp: number; pos: { x: number; y: number; z: number; }; rotation: number; stats: Stats; speedBuffs: SpeedBuffs; jobDetail?: JobDetail[keyof JobDetail]; constructor(ffxivVersion: FfxivVersion); get gcdSkill(): number; get gcdSpell(): number; /** compute cooldown based on the current player's stat data */ getActionCooldown(originalCd: number, type: 'skill' | 'spell'): number; } export declare class Player extends PlayerBase { ee: EventEmitter; jobsEmitter: JobsEventEmitter; partyTracker: PartyTracker; combo: ComboTracker; constructor(jobsEmitter: JobsEventEmitter, partyTracker: PartyTracker, ffxivVersion: FfxivVersion); onCombo(callback: ComboCallback): void; onMobGainsEffectFromYou(callback: GainCallback): void; onMobLosesEffectFromYou(callback: LoseCallback): void; onYouGainEffect(callback: GainCallback): void; onYouLoseEffect(callback: LoseCallback): void; onStatChange(job: string, callback: (gcd: { gcdSkill: number; gcdSpell: number; }) => void): void; onUseAbility(callback: AbilityCallback): void; onZoneChange(callback: ZoneChangeCallback): void; onJobDetailUpdate(job: JobKey, callback: (e: JobDetail[JobKey]) => void): void; private processPlayerChangedEvent; private processPlayerStatsLogLine; private processLogLines; on(event: Key, listener: EventMap[Key], context?: unknown): this; once(event: Key, listener: EventMap[Key], context?: unknown): this; off(event: Key, listener: EventMap[Key], context?: unknown): this; emit(event: Key, ...args: Parameters): boolean; }