242 lines
6.3 KiB
TypeScript
242 lines
6.3 KiB
TypeScript
/**
|
|
* Protocol-neutral `ServerEvent` discriminated union (PROJECT.md § Interface Contracts).
|
|
*/
|
|
|
|
import type {
|
|
Hand,
|
|
ItemContainer,
|
|
ItemData,
|
|
ItemStat,
|
|
Pt,
|
|
SkillLevel,
|
|
UnitRef,
|
|
UnitSnapshot,
|
|
UnitType,
|
|
} from './ids.ts'
|
|
|
|
export type ServerEvent =
|
|
| { readonly type: 'GameLoading' }
|
|
| {
|
|
readonly type: 'GameFlags'
|
|
readonly difficulty: 0 | 1 | 2
|
|
readonly hardcore: boolean
|
|
readonly expansion: boolean
|
|
readonly ladder: boolean
|
|
}
|
|
| {
|
|
readonly type: 'LoadAct'
|
|
readonly act: number
|
|
readonly mapSeed: number
|
|
readonly areaId: number
|
|
readonly objectSeed?: number | undefined
|
|
}
|
|
| { readonly type: 'LoadComplete' }
|
|
| { readonly type: 'UnloadComplete' }
|
|
| { readonly type: 'GameLogout' }
|
|
| {
|
|
readonly type: 'RoomReveal'
|
|
readonly areaId: number
|
|
readonly tileX: number
|
|
readonly tileY: number
|
|
}
|
|
| {
|
|
readonly type: 'RoomHide'
|
|
readonly areaId: number
|
|
readonly tileX: number
|
|
readonly tileY: number
|
|
}
|
|
| {
|
|
readonly type: 'UnitAssign'
|
|
readonly unit: UnitSnapshot
|
|
readonly isSelf?: boolean | undefined
|
|
}
|
|
| {
|
|
readonly type: 'UnitRemove'
|
|
readonly unitType: UnitType
|
|
readonly id: number
|
|
}
|
|
| {
|
|
readonly type: 'UnitMove'
|
|
readonly unitType: UnitType
|
|
readonly id: number
|
|
readonly mode: 'walk' | 'run' | 'knockback' | 'stop'
|
|
readonly from?: Pt | undefined
|
|
readonly to: Pt
|
|
readonly target?: UnitRef | undefined
|
|
}
|
|
| {
|
|
readonly type: 'UnitReassign'
|
|
readonly unitType: UnitType
|
|
readonly id: number
|
|
readonly at: Pt
|
|
readonly snap: boolean
|
|
}
|
|
| {
|
|
readonly type: 'UnitMode'
|
|
readonly unitType: UnitType
|
|
readonly id: number
|
|
readonly mode: number
|
|
readonly at?: Pt | undefined
|
|
readonly lifePct?: number | undefined
|
|
}
|
|
| {
|
|
readonly type: 'SkillCast'
|
|
readonly caster: UnitRef
|
|
readonly skill: number
|
|
readonly level: number
|
|
readonly target: UnitRef | Pt
|
|
}
|
|
| {
|
|
readonly type: 'StatSet'
|
|
readonly stat: number
|
|
readonly value: number
|
|
readonly param?: number | undefined
|
|
readonly unit?: UnitRef | undefined
|
|
}
|
|
| {
|
|
readonly type: 'LifeMana'
|
|
readonly life: number
|
|
readonly mana: number
|
|
readonly stamina: number
|
|
readonly lifeRegen?: number | undefined
|
|
readonly manaRegen?: number | undefined
|
|
readonly at?: Pt | undefined
|
|
readonly vx?: number | undefined
|
|
readonly vy?: number | undefined
|
|
}
|
|
| {
|
|
readonly type: 'Experience'
|
|
readonly value: number
|
|
readonly isDelta?: boolean | undefined
|
|
}
|
|
| {
|
|
readonly type: 'StateSet'
|
|
readonly unit: UnitRef
|
|
readonly state: number
|
|
readonly stats?: readonly ItemStat[] | undefined
|
|
}
|
|
| {
|
|
readonly type: 'StateEnd'
|
|
readonly unit: UnitRef
|
|
readonly state: number
|
|
}
|
|
| {
|
|
readonly type: 'ItemEvent'
|
|
readonly action: number
|
|
readonly item: ItemData
|
|
readonly container: ItemContainer
|
|
readonly at?: Pt | undefined
|
|
}
|
|
| {
|
|
readonly type: 'SkillList'
|
|
readonly unitId: number
|
|
readonly skills: readonly SkillLevel[]
|
|
}
|
|
| {
|
|
readonly type: 'ActiveSkill'
|
|
readonly unitId: number
|
|
readonly hand: Hand
|
|
readonly skill: number
|
|
readonly itemId?: number | undefined
|
|
}
|
|
| {
|
|
readonly type: 'Npc'
|
|
readonly kind: 'info' | 'menu' | 'heal'
|
|
readonly npcId: number
|
|
readonly result?: number | undefined
|
|
readonly raw?: Uint8Array | undefined
|
|
}
|
|
| {
|
|
/** 0x2A NPCTransaction result (D2Game 0x6fcaac90). `itemId` 0xFFFFFFFF = none. */
|
|
readonly type: 'NpcTransaction'
|
|
readonly result: number
|
|
readonly flag: number
|
|
readonly itemId: number
|
|
/** Server's stat 14 at send time; informational only (the client uses stat 14 updates). */
|
|
readonly gold: number
|
|
}
|
|
| {
|
|
readonly type: 'WaypointMenu'
|
|
readonly unitId: number
|
|
readonly open: readonly number[]
|
|
}
|
|
| {
|
|
readonly type: 'QuestState'
|
|
readonly kind?: 'log' | 'update' | 'item' | undefined
|
|
readonly quests: Uint16Array
|
|
}
|
|
| {
|
|
readonly type: 'Party'
|
|
readonly kind: 'roster' | 'relation' | 'memberState' | 'memberPos'
|
|
readonly unitId?: number | undefined
|
|
readonly otherId?: number | undefined
|
|
readonly partyId?: number | undefined
|
|
readonly relation?: number | undefined
|
|
readonly lifePct?: number | undefined
|
|
readonly areaId?: number | undefined
|
|
readonly at?: Pt | undefined
|
|
readonly charName?: string | undefined
|
|
readonly charClass?: number | undefined
|
|
readonly charLevel?: number | undefined
|
|
}
|
|
| {
|
|
readonly type: 'Trade'
|
|
readonly action: number
|
|
readonly partnerId?: number | undefined
|
|
readonly gold?: number | undefined
|
|
}
|
|
| {
|
|
readonly type: 'Chat'
|
|
readonly kind: 'say' | 'whisper' | 'overhead' | 'system' | 'event'
|
|
readonly from?: string | undefined
|
|
readonly unit?: UnitRef | undefined
|
|
readonly text: string
|
|
readonly color?: number | undefined
|
|
readonly eventType?: number | undefined
|
|
}
|
|
| {
|
|
readonly type: 'PlaySound'
|
|
readonly unit?: UnitRef | undefined
|
|
readonly sound: number
|
|
}
|
|
| {
|
|
readonly type: 'Merc'
|
|
readonly kind: 'assign' | 'hireList' | 'stat' | 'exp'
|
|
readonly ownerId?: number | undefined
|
|
readonly mercId?: number | undefined
|
|
readonly classId?: number | undefined
|
|
readonly nameId?: number | undefined
|
|
readonly stat?: number | undefined
|
|
readonly value?: number | undefined
|
|
}
|
|
| {
|
|
readonly type: 'Portal'
|
|
readonly ownerName?: string | undefined
|
|
readonly ownerId?: number | undefined
|
|
readonly areaId: number
|
|
readonly localId: number
|
|
readonly remoteId?: number | undefined
|
|
readonly flags?: number | undefined
|
|
}
|
|
| {
|
|
readonly type: 'Pong'
|
|
readonly rttMs: number
|
|
readonly tickCount: number
|
|
}
|
|
| {
|
|
readonly type: 'Warden'
|
|
readonly payload: Uint8Array
|
|
}
|
|
| {
|
|
readonly type: 'SaveChunk'
|
|
readonly isFirst: boolean
|
|
readonly totalSize: number
|
|
readonly chunk: Uint8Array
|
|
}
|
|
| {
|
|
readonly type: 'Opaque'
|
|
readonly proto: string
|
|
readonly id: number
|
|
readonly raw: Uint8Array
|
|
}
|