/**
 * `game.self` — объект-носитель текущего скрипта.
 *
 * Если скрипт привязан к блоку/модели/примитиву/GUI — self содержит ссылку
 * на этот объект. Если скрипт глобальный — self === null.
 */
declare namespace game {
    interface Self {
        /** Тип носителя: 'block' | 'model' | 'primitive' | 'gui'. */
        readonly kind: string;

        /** ref-идентификатор объекта для использования в scene API. */
        readonly ref: string;

        /** Текущая позиция (для 3D-объектов). */
        readonly position: game.Vector3;

        /** Свойства GUI-элемента (если kind='gui'). */
        readonly props: game.GuiProps | null;

        /** Клик по 3D-объекту (луч от игрока) или клик мышью по GUI. */
        onClick(fn: (event: { type: 'click'; point?: game.Vector3 }) => void): void;

        /** Игрок коснулся объекта. */
        onTouch(fn: (event: { type: 'touch' }) => void): void;

        /** Игрок ВЫШЕЛ из объекта (был внутри AABB и вышел). */
        onUntouch(fn: (event: { type: 'untouch' }) => void): void;

        /**
         * ProximityPrompt — подсказка «нажми E чтобы…».
         * Игрок подходит ближе чем distance, видит подсказку, жмёт клавишу — срабатывает fn.
         * @example
         * game.self.onInteract(() => {
         *     game.ui.showText('Дверь открыта!', 2);
         * }, { text: 'Открыть', distance: 4, key: 'e' });
         */
        onInteract(fn: () => void, opts?: {
            text?: string;
            distance?: number;
            key?: string;
        }): void;

        /** Переместить объект (модели/примитивы). */
        move(x: number, y: number, z: number): void;

        /** Удалить объект-носитель. */
        delete(): void;

        /** Изменить свойства GUI-элемента (только для kind='gui'). */
        update(patch: Partial<game.GuiProps>): void;

        /** Шорткат для смены текста GUI-элемента. */
        setText(text: string): void;

        /** Показать GUI-элемент. */
        show(): void;

        /** Скрыть GUI-элемент. */
        hide(): void;

        /** Сохранить произвольное данное на объекте. */
        setData(key: string, value: any): void;

        /** Прочитать данное. */
        getData(key: string): any;
    }
    const self: Self | null;
}
