Вопрос Усилитель маг урона

Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
326
Реакции[?]
24
Поинты[?]
12K
Я пробовал найти функцию в доте которая бы давала спелламп. Но единственное что из хорошего нашел так это базовое значение брони, магЗащиты, скорость передвижения. А вот магамп никак не могу найти. очень не хочу делать ручную калькулацию по каждым источникам.
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Я пробовал найти функцию в доте которая бы давала спелламп. Но единственное что из хорошего нашел так это базовое значение брони, магЗащиты, скорость передвижения. А вот магамп никак не могу найти. очень не хочу делать ручную калькулацию по каждым источникам.
хвбп на текст лейбла(DOTAHud -> DOTATooltipManager#Tooltips -> DOTATooltipUnitDamageArmor#DOTAHUDDamageArmorTooltip -> Panel.TooltipRow -> TooltipContents#Contents -> Panel#AttackDefenseContainer -> Panel#AttackContainer -> Panel#SpellAmpRow -> Panel.LeftRightFlow -> Label#SpellAmp)
1727785900243.png
1727785984495.png
1727785925410.png
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
326
Реакции[?]
24
Поинты[?]
12K
хвбп на текст лейбла(DOTAHud -> DOTATooltipManager#Tooltips -> DOTATooltipUnitDamageArmor#DOTAHUDDamageArmorTooltip -> Panel.TooltipRow -> TooltipContents#Contents -> Panel#AttackDefenseContainer -> Panel#AttackContainer -> Panel#SpellAmpRow -> Panel.LeftRightFlow -> Label#SpellAmp)
Посмотреть вложение 287023
Посмотреть вложение 287025
Посмотреть вложение 287024
Ставил бп на значение 0.0% и когда ловилось то оно меня постояно ( в чит енджине) перенаправляло на tier0.dll или панорама на какие-то функции.Я немного поразмыслил мозгами и почему то мне кажется что оно чето похоже на функцию GetDamageBonus. Или это хуевое направление?Я конкретно имею в виду модификаторы. Конечно это всеравно хуевина связанная с расчетами. Кстати это значение SpellAmpLabel оно токо обновляется когда я мышкой навожу на панельку
Ты говорил вроде что хорошим источником является документалка валве. Я вот смотрю нашел функу пытаюсь её найти в клиенте но чето нихера не выходит. Они ее спрятали или что?
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Ставил бп на значение 0.0% и когда ловилось то оно меня постояно ( в чит енджине) перенаправляло на tier0.dll или панорама на какие-то функции.Я немного поразмыслил мозгами и почему то мне кажется что оно чето похоже на функцию GetDamageBonus. Или это хуевое направление?Я конкретно имею в виду модификаторы. Конечно это всеравно хуевина связанная с расчетами. Кстати это значение SpellAmpLabel оно токо обновляется когда я мышкой навожу на панельку
Ты говорил вроде что хорошим источником является документалка валве. Я вот смотрю нашел функу пытаюсь её найти в клиенте но чето нихера не выходит. Они ее спрятали или что?
ну логично что тебя на tier0 перенаправляло(не будет же сам клиентский код руками напрямую в буфере строки символы менять). ты не хочешь по коллстеку ниже посмотреть кто эти функции вызывает, нет?) (тебе клиент нужен)
1727810897976.png
тот скрин что ты скинул это документация по серверной апи(для людей которые плагины кастомки и тд делают). поэтому ты ее в клиенте найти не можешь.
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
326
Реакции[?]
24
Поинты[?]
12K
ну логично что тебя на tier0 перенаправляло(не будет же сам клиентский код руками напрямую в буфере строки символы менять). ты не хочешь по коллстеку ниже посмотреть кто эти функции вызывает, нет?) (тебе клиент нужен)
Посмотреть вложение 287053
тот скрин что ты скинул это документация по серверной апи(для людей которые плагины кастомки и тд делают). поэтому ты ее в клиенте найти не можешь.
я не умею ставить бп в x64dbg. ты ставишь бп на само значение (текст 0.0%) ?
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
326
Реакции[?]
24
Поинты[?]
12K
на символы текста да, на один байт(на первый). в дампе пкм -> breakpoint->hardware, write->byte
ебать я мозг включил и походу врубил как это работает. Благодаря тебе и дилибам. Подскажешь как в шеме найти описание модификаторов? видать в функцию передается какая-то константная:
AttackSpeed:

BaseSpellAmp(но функции кстати разные)

немогу выяснить что за третий параметр
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
ебать я мозг включил и походу врубил как это работает. Благодаря тебе и дилибам. Подскажешь как в шеме найти описание модификаторов? видать в функцию передается какая-то константная:
AttackSpeed:

BaseSpellAmp(но функции кстати разные)

немогу выяснить что за третий параметр
schema\client.dll\enums\modifierfunction.txt
Код:
    MODIFIER_PROPERTY_ATTACKSPEED_BASE_OVERRIDE = 29,
        ^MScriptDescription "GetModifierAttackSpeedBaseOverride"
    ...
    MODIFIER_PROPERTY_SPELL_AMPLIFY_PERCENTAGE_UNIQUE = 47,
        ^MScriptDescription "GetModifierSpellAmplify_PercentageUnique"
третий парам это скорее всего адрес инта где лежит -1(нужен для модифаерфункции вроде)
old
C++:
class ModifierFunction
{
    CDOTA_Buff* buff{};
    void* func{};
    void* unk{};
public:
    float Get() const noexcept
    {
        struct result
        {
            int has_result{};
            float float_result{};
            void* unk1{};
            void* unk2{};
        };
        if (func)
        {
            result _result{};
            std::uint32_t unk{ std::numeric_limits<std::uint32_t>::max() };
            reinterpret_cast<void* (*)(CDOTA_Buff*, result*, void*)>(func)(buff, &_result, &unk);
            if (_result.has_result)
                return _result.float_result;
        }
        return 0.0f;
    }
};
...
    CUtlVector<ModifierFunction>* CDOTA_ModifierManager::GetModifierFunction(modifierfunction id) const noexcept
    {
        if (const auto index = modifierfunction_indexes[id];
            index != modifierfunction::MODIFIER_FUNCTION_INVALID)
        {
            if(index < modifierfunctions.size())
                return &modifierfunctions.at(index);
        }
        return nullptr;
    }
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
326
Реакции[?]
24
Поинты[?]
12K
schema\client.dll\enums\modifierfunction.txt
Код:
    MODIFIER_PROPERTY_ATTACKSPEED_BASE_OVERRIDE = 29,
        ^MScriptDescription "GetModifierAttackSpeedBaseOverride"
    ...
    MODIFIER_PROPERTY_SPELL_AMPLIFY_PERCENTAGE_UNIQUE = 47,
        ^MScriptDescription "GetModifierSpellAmplify_PercentageUnique"
третий парам это скорее всего адрес инта где лежит -1(нужен для модифаерфункции вроде)
old
C++:
class ModifierFunction
{
    CDOTA_Buff* buff{};
    void* func{};
    void* unk{};
public:
    float Get() const noexcept
    {
        struct result
        {
            int has_result{};
            float float_result{};
            void* unk1{};
            void* unk2{};
        };
        if (func)
        {
            result _result{};
            std::uint32_t unk{ std::numeric_limits<std::uint32_t>::max() };
            reinterpret_cast<void* (*)(CDOTA_Buff*, result*, void*)>(func)(buff, &_result, &unk);
            if (_result.has_result)
                return _result.float_result;
        }
        return 0.0f;
    }
};
...
    CUtlVector<ModifierFunction>* CDOTA_ModifierManager::GetModifierFunction(modifierfunction id) const noexcept
    {
        if (const auto index = modifierfunction_indexes[id];
            index != modifierfunction::MODIFIER_FUNCTION_INVALID)
        {
            if(index < modifierfunctions.size())
                return &modifierfunctions.at(index);
        }
        return nullptr;
    }
У меня почемут ебашит ошибку Run-Time Check Failure #2 - Stack around the variable 'Result' was corrupted.

C++:
float GetValue()
    {
        
        struct param
        {
            int resultInt;
            float resultFloat;
            void* unk{};
            void* unk1{};
        }Result; 
        struct argument
        {
            int a = -1;
            int b = 0;
        }arg;
         
        if (functionmodifier)
        {
            param* result = (param*)(*(__int64(__fastcall*)(CDOTA_Buff*, param*,argument*))(functionmodifier))(buff, &Result,&arg);
            return result->resultFloat;
        }
        return 0.0;
    }
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
326
Реакции[?]
24
Поинты[?]
12K
У меня почемут ебашит ошибку Run-Time Check Failure #2 - Stack around the variable 'Result' was corrupted.

C++:
float GetValue()
    {
       
        struct param
        {
            int resultInt;
            float resultFloat;
            void* unk{};
            void* unk1{};
        }Result;
        struct argument
        {
            int a = -1;
            int b = 0;
        }arg;
        
        if (functionmodifier)
        {
            param* result = (param*)(*(__int64(__fastcall*)(CDOTA_Buff*, param*,argument*))(functionmodifier))(buff, &Result,&arg);
            return result->resultFloat;
        }
        return 0.0;
    }
хот фикс


C++:
        struct param
        {
            int resultInt;
            float resultFloat;
            void* unk{};
            void* unk1{};
            void* unk2{};
        }Result;
 
Сверху Снизу