import { type OnDeathSpec } from "../../combat/death.js"; import type { Drop } from "../../game/lootTable.js"; import { type WorldItemSpawnInput } from "../../game/worldItem.js"; import type { GameContextContent } from "../gameContext.js"; /** @internal Inputs for routing a resolved lethal kill into bag grants and/or ground-item spawns. */ export interface LethalLootInput { /** Drops produced by the death system's resolution (already rolled). */ drops: readonly Drop[]; /** Resolved killer identity; environmental kills have no player recipient. */ recipientUserId: string | undefined; /** Explicit any-death world rules may spawn items without a player recipient. */ allowUnownedWorldDrops?: boolean; /** Catalog `onDeath` for the dying entity (drop mode + scatter). */ onDeath: OnDeathSpec | undefined; /** World position of the dying entity — required for `dropMode: "world"`. */ position: readonly [number, number, number] | undefined; /** Catalog id of the dying entity — used as loot source tag when present. */ catalogId: string | undefined; content: GameContextContent; spawnWorldItem: (input: WorldItemSpawnInput) => void; grantToPlayer: (userId: string, drops: Drop[], source?: string) => void; /** The world's seeded stream — scatter positions must replay with the rest of the simulation. */ rng: () => number; } /** @internal Only an explicit rule opts a catalog into unowned world drops. */ export declare function allowsUnownedWorldDrops(onDeath: OnDeathSpec | undefined): boolean; /** * Pure death→loot policy: scatter world items or grant straight into player bags. * Unowned deaths require explicit opt-in and never grant currency. Extracted from `createGameContext` * so combat install stays free of nested loot branching. * @internal */ export declare function applyLethalLoot(input: LethalLootInput): void;