# Коллбеки

Все события, которые обрабатывает чит, передаются в коллбеки скриптов, что позволяет понимать ситуацию в игре и делать определенные действия

# OnUpdate

Один из самых частоиспользуемых коллбеков. Вызывается каждый тик, каждый вызов обновляет данные и информацию на игровой карте.

ПОДСКАЗКА

Именно в этот коллбек мы рекомендуем класть ВСЮ "тяжёлую" логику скриптов, которая требует просчёта каждый тик.

Пример логики: автохук пуджа, автосанстрайк инвокера, все прокасты, просчёт инвентарей противника и прочее.

ПОДСКАЗКА

В этом коллбеке можно вызывать функции отрисовки, но из-за того, что он вызывается намного реже значения FPS отрисовка не будет плавной. Для всей отрисовки рекомендуем использовать коллбек OnDraw

Пример использования:

let exampleScript = {};

exampleScript.OnUpdate = () => {
    console.log('OnUpdate works!');
};

RegisterScript(exampleScript);

GetElapsedTime

# OnDraw

Вызывается КАЖДЫЙ кадр, из-за этого в этом коллбеке не должно быть сложной логики, в противном случае у пользователей скриптов будут просадки FPS.

Обсуждение на форуме:

ВНИМАНИЕ

Никогда не используйте этот коллбек для сложной логики. Если у вас есть возможность перенести вычисления, то сделайте их в OnUpdate

Пример использования:

let exampleScript = {};

exampleScript.OnDraw = () => {
    // Set white color
    Renderer.SetDrawColor(255, 255, 255, 255);

    // then draw the square
    Renderer.DrawFilledRect(0, 0, 300, 300);
    
    // and draw one more square, but with red color
    Renderer.SetDrawColor(255, 0, 0, 255);
    Renderer.DrawFilledRect(150, 150, 300, 300);
};

RegisterScript(exampleScript);

# OnUnitAnimation

Вызывается когда какой-то из юнитов атакует кого-либо даже в тумане войны, а также при анимации некоторых способностей (но это неточно).

Пример использования:

let exampleScript = {};

exampleScript.OnUnitAnimation = (animation) => {
    console.log('OnUnitAnimation works!', JSON.stringify(animation));
};

RegisterScript(exampleScript);

// animation object declaration:
declare interface UnitAnimationCallbackObject {
    unit: NPC | null;
    sequenceVariant: number; // Attack animation index 2
    playbackRate: number; // Animation speed scales
    castpoint: number; // Time from start to the poke
    type: number;
    activity: number; // Dota 2 action variant
    sequence: number; // Attack animation index
    sequenceName: string; // Attack animation name
}

# OnUnitAnimationEnd

Вызывается при окончании анимации.

Пример использования:

let exampleScript = {};

exampleScript.OnUnitAnimationEnd = (animation) => {
    console.log('OnUnitAnimationEnd works!', JSON.stringify(animation));
};

RegisterScript(exampleScript);

// animation object declaration:
declare interface UnitAnimationEndCallbackObject {
    unit: NPC | null;
    snap; // I don't really know
}

# OnProjectile

Вызывается при создании прожектайла.

Пример использования:

let exampleScript = {};

exampleScript.OnProjectile = (projectile) => {
    console.log('OnProjectile works!', JSON.stringify(projectile));
};

RegisterScript(exampleScript);

// projectile object declaration:
declare class Projectile {
    source: NPC | Hero | null;
    target: NPC | Hero | null;
    moveSpeed: number;
    sourceAttachment: Enum.ParticleAttachment;
    particleSystemHandle: number;
    dodgeable: boolean;
    isAttack: boolean;
    isEvaded: boolean;
    expireTime: number;
    maxImpactTime: number;
    colorGemColor: number;
    fullName: string;
    name: string;
    handle: number;
}

# OnLinearProjectileCreate

Вызывается при создании линеарного прожектайла (Sacred Arrow и прочие способности).

Пример использования:

let exampleScript = {};

exampleScript.OnLinearProjectileCreate = (linearProjectile) => {
    console.log('OnLinearProjectileCreate works!', JSON.stringify(projectile));
};

RegisterScript(exampleScript);

// linearProjectile object declaration:
declare class LinearProjectile {
    maxDist: number;
    fowRadius: number;
    source: NPC | Entity | Hero | null;
    origin: Vector;
    velocity: Vector;
    particleIndex: number;
    handle: number;
    acceleration: Vector;
    latency: number;
    maxSpeed: number;
    fullName: string;
    name: string;
}

# OnLinearProjectileCreate

Вызывается при создании линеарного прожектайла (Sacred Arrow и прочие способности).

ПОДСКАЗКА

Для связи с объектами из OnLinearProjectileCreate используйте handle

Пример использования:

let exampleScript = {};

exampleScript.OnLinearProjectileDestroy = (handle /* <-- integer */) => {
    console.log('OnLinearProjectileDestroy works!', handle);
};

RegisterScript(exampleScript);

# OnParticleCreate

Вызывается при создании партикла.

Пример использования:

let exampleScript = {};

exampleScript.OnLinearProjectileDestroy = (particle) => {
    console.log('OnParticleCreate works!', JSON.stringify(particle));
};

RegisterScript(exampleScript);

// particle object declaration:
declare interface CreatedParticle {
    index: number;
    entity: NPC | Entity | Hero | null;
    particleNameIndex: number;
    attachType: number;
    entityForModifiers: NPC | Hero | null;
    fullName: string;
    name: string;
}

# OnParticleUpdate

Вызывается при обновлении партикла (например, обновление позиции).

Пример использования:

let exampleScript = {};

exampleScript.OnParticleUpdate = (particle) => {
    console.log('OnParticleUpdate works!', JSON.stringify(particle));
};

RegisterScript(exampleScript);

// particle object declaration:
declare interface UpdatedParticle {
    index: number;
    position: Vector;
    controlPoint: number;
}

# OnParticleUpdateEntity

Вызывается когда к партиклю привязывается или обновляется Entity.

Пример использования:

let exampleScript = {};

exampleScript.OnParticleUpdateEntity = (particle) => {
    console.log('OnParticleUpdateEntity works!', JSON.stringify(particle));
};

RegisterScript(exampleScript);

// particle object declaration:
declare interface ParticleUpdateEntity {
    index: number;
    controlPoint: number;
    entity: NPC | Entity | Hero | null;
    attachType: number;
    attachment: Enum.ParticleAttachment;
    position: Vector;
    includeWearables: boolean;
}

# OnParticleDestroy

Вызывается при удалении партикля.

Пример использования:

let exampleScript = {};

exampleScript.OnParticleDestroy = (particle) => {
    console.log('OnParticleDestroy works!', JSON.stringify(particle));
};

RegisterScript(exampleScript);

// particle object declaration:
declare interface DestroyedParticle {
    index: number;
    destroyImmediately: boolean;
}

# OnParticleDestroy

Вызывается при удалении партикля.

Пример использования:

let exampleScript = {};

exampleScript.OnParticleDestroy = (particle) => {
    console.log('OnParticleDestroy works!', particle);
};

RegisterScript(exampleScript);

// particle object declaration:
declare interface DestroyedParticle {
    index: number;
    destroyImmediately: boolean;
}

# OnEntityCreate

Вызывается при создании Entity.

ПРЕДУПРЕЖДЕНИЕ

Когда Entity только создался, у него не заполнена информация о Unit Name и многие другие поля. Чтобы избежать этого необходимо ставить таймаут внутри коллбека, см. пример использования.

Пример использования:

let exampleScript = {};

exampleScript.OnEntityCreate = (entity) => {
    console.log('OnEntityCreate works!', entity);

    // GetUnitName будет работать только лишь в следующем тике!!!
    console.log(entity.GetClassName());

    setTimeout(() => {
        // Так как тик прошёл, GetUnitName уже будет работать :)
        console.log(entity.GetUnitName());
    }, 33);
};

RegisterScript(exampleScript);

# OnModifierCreate

Вызывается при создании модификатора.

Пример использования:

let exampleScript = {};

exampleScript.OnModifierCreate = (entity, modifier) => {
    console.log('OnModifierCreate works!', 
        entity.GetUnitName(), 
        modifier.GetName());
};

RegisterScript(exampleScript);

# OnModifierDestroy

Вызывается при удалении модификатора.

Пример использования:

let exampleScript = {};

exampleScript.OnModifierDestroy = (entity, modifier) => {
    console.log('OnModifierDestroy works!', 
        entity.GetUnitName(), 
        modifier.GetName());
};

RegisterScript(exampleScript);

# OnStartSound

Вызывается когда начинает проигрываться звук. Работает не со всеми звуками Dota 2.

Пример использования:

let exampleScript = {};

exampleScript.OnStartSound = (sound) => {
    console.log('OnStartSound works!', JSON.stringify(sound));
};

RegisterScript(exampleScript);

// sound object declaration:
declare class Sound {
    source: Entity | null;
    name: string;
    hash: number;
    guid: number;
    seed: number;
}

# OnPrepareUnitOrders

Вызывается когда игрок отправил приказ персонажу либо любому другому подконтрольному юниту.

ВНИМАНИЕ

Этот коллбек НЕ работает на приказы, которые были отданы скриптами.

Пример использования:

let exampleScript = {};

exampleScript.OnPrepareUnitOrders = (order) => {
    console.log('OnPrepareUnitOrders works!', JSON.stringify(order));
};

RegisterScript(exampleScript);

// order object declaration:
declare interface PreparedOrder {
    player: Player;
    order: Enum.UnitOrder;
    target: NPC | null;
    position: Vector | null;
    ability: Ability | null;
    abilityIndex: Number | null;
    orderIssuer: Enum.PlayerOrderIssuer;
    npc: NPC | null;
    queue: boolean;
    showEffects: boolean;
}

# OnGameStart

Вызывается сразу после появление персонажей на карте, либо же после переподключения в игру.

ВНИМАНИЕ

Данный коллбек пока что не отрабатывает при начале просмотра игры.

Пример использования:

let exampleScript = {};

exampleScript.OnGameStart = () => {
    console.log('OnGameStart works!');
};

RegisterScript(exampleScript);

# OnGameEnd

Вызывается после окончания игры после выхода в главное меню.

ВНИМАНИЕ

Данный коллбек пока что не отрабатывает при начале просмотра игры.

Пример использования:

let exampleScript = {};

exampleScript.OnGameEnd = () => {
    console.log('OnGameEnd works!');
};

RegisterScript(exampleScript);

# OnScriptLoad

Вызывается после полной загрузки скрипта.

Пример использования:

let exampleScript = {};

exampleScript.OnScriptLoad = () => {
    console.log('OnScriptLoad works!');
};

RegisterScript(exampleScript);

# OnScriptUnload

Вызывается после перед выгрузкой скрипта.

Пример использования:

let exampleScript = {};

exampleScript.OnScriptUnload = () => {
    console.log('OnScriptUnload works!');
};

RegisterScript(exampleScript);

# OnKeyEvent

Вызывается при нажатии кнопок, а также скролле.н

Пример использования:

let exampleScript = {};

exampleScript.OnKeyEvent = (keyEvent) => {
    console.log('OnKeyEvent works!');

    if(keyEvent.event === Enum.KeyEvent.SCROLL_DOWN) {
        console.log('Mousewheel scrolled down!');
    } else if(keyEvent.event === Enum.KeyEvent.SCROLL_UP) {
        console.log('Mousewheel scrolled up!');
    }
};

RegisterScript(exampleScript);

// keyEvent object declaration:
declare interface KeyEventObject {
    event: Enum.KeyEvent;
    key: Enum.ButtonCode;
}