Вопрос У меня не перекрашивается иллюзия

Начинающий
Статус
Оффлайн
Регистрация
26 Янв 2022
Сообщения
70
Реакции[?]
7
Поинты[?]
0
Python:
#мой ентити класс
class DotaEntity(object):
    def __init__(self, ent_addr) -> None:
        self.addr = ent_addr

    @property
    def name(self):
        _name = "unknown"

        try:
            _name = dota.read_string(ui(ui(ui(self.addr) + 0x10) + 0x18))

        except pymem.exception.MemoryReadError:
            try:
                _name = dota.read_string(ui(ui(ui(self.addr) + 0x10) + 0x20))
            except pymem.exception.MemoryReadError:
                pass

        return _name

    @property
    def health(self):
        _health = None

        try:
            _health = dota.read_int(ui(self.addr) + 0x32C)
        except pymem.exception.MemoryReadError:
            pass

        return _health

    @property
    def owner(self):
        _owner = None

        try:
            _owner = dota.read_int(ui(self.addr) + 1096)
        except pymem.exception.MemoryReadError:
            pass
        
        #code
        return _owner

    @property
    def inVision(self):
        _value = None

        try:
            _value = dota.read_int(ui(self.addr) + 3572)

            if _value == 22:
                return False

            elif _value == 30:
                return True
        except pymem.exception.MemoryReadError:
            pass

        return _value

    @property
    def isIllusion(self):
        _value = None

        try:
            _value = dota.read_int(ui(self.addr) + 0x17E4)

            if _value < 0:
                _value = False
            else:
                _value = True

        except pymem.exception.MemoryReadError:
            pass

        return _value

    @property
    def color(self):
        _lenght = 1
        return int_from_bytes(dota.read_bytes(ui(self.addr) + 0x594 + 0, _lenght)), \
                int_from_bytes(dota.read_bytes(ui(self.addr) + 0x594 + 1, _lenght)), \
                int_from_bytes(dota.read_bytes(ui(self.addr) + 0x594 + 2, _lenght)), \
                int_from_bytes(dota.read_bytes(ui(self.addr) + 0x594 + 3, _lenght))

    def setColor(self, r, g, b, a):
        dota.write_bytes(ui(self.addr) + 0x594 + 0, int_to_bytes(r), 1)
        dota.write_bytes(ui(self.addr) + 0x594 + 1, int_to_bytes(g), 1)
        dota.write_bytes(ui(self.addr) + 0x594 + 2, int_to_bytes(b), 1)
        dota.write_bytes(ui(self.addr) + 0x594 + 3, int_to_bytes(a), 1)


#__main__
for ent in entList:
    entity = DotaEntity(ent)

    if "npc_dota_hero_" in entity.name:
        print(entity.name)
        if entity.isIllusion:
            entity.setColor(0, 0, 0 , 255)
проблема в том что когда я крашуу иллюзий красится портрет вместо моделььке с чем может быть связанно?

это до выполнение моей перекраски
1645536642673.png
это после
1645536694012.png
мне нужно чтобы сама моделька черной стала
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
а как игра должна узнать что ты цвет поменял? сама догадается?
оповести ее через OnColorChanged коллбек, с хрефа найдешь.
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
324
Реакции[?]
24
Поинты[?]
12K
Дота только обновляет саму картинку твоего персонажа каждую секунду( ну портрет это еще называется). А саму модельку либо ждать какогото евента( хз это может быть всечтоугодно а может и вообще не произойти) Поэтому тебе нужно вызвать функцию OnColorChanged, которая обновляет цвет модели юнита.
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
а как игра должна узнать что ты цвет поменял? сама догадается?
оповести ее через OnColorChanged коллбек, с хрефа найдешь.
Похоже, это уже не работает, вызываю OnColorChanged, всё равно только портрет меняет цвет.

C++:
global::g_pOnColorChanged = reinterpret_cast<oOnColorChanged>(util::FPat("client.dll", "83 F9 01 0F 85 ? ? ? ? 48 8B C4 55 48 8D 68 B8 48 81 EC 40 01 00 00 48 89 58 08 48 8D ? ? ? ? ? 48 89 70 10 48 8D 5C 24 60 48 89 78 18 48 8D ? ? ? ? ? 48 8B ? ? ? ? ? 48 89 44 24 50 48 8D ? ? ? ? ? 48 89 44 24 68 48 8D ? ? ? ? ? 48 89 45 80"));

void SetEntityRenderColor(unsigned char r, unsigned char g, unsigned char b, unsigned char a) {
      if (!this->DoesExists()) return;

    *reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 0) = r;
    *reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 1) = g;
    *reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 2) = b;
    *reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 3) = a;
    global::g_pOnColorChanged(CEntityIdentity);
}
1657371023997.png
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Похоже, это уже не работает, вызываю OnColorChanged, всё равно только портрет меняет цвет.

C++:
global::g_pOnColorChanged = reinterpret_cast<oOnColorChanged>(util::FPat("client.dll", "83 F9 01 0F 85 ? ? ? ? 48 8B C4 55 48 8D 68 B8 48 81 EC 40 01 00 00 48 89 58 08 48 8D ? ? ? ? ? 48 89 70 10 48 8D 5C 24 60 48 89 78 18 48 8D ? ? ? ? ? 48 8B ? ? ? ? ? 48 89 44 24 50 48 8D ? ? ? ? ? 48 89 44 24 68 48 8D ? ? ? ? ? 48 89 45 80"));

void SetEntityRenderColor(unsigned char r, unsigned char g, unsigned char b, unsigned char a) {
      if (!this->DoesExists()) return;

    *reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 0) = r;
    *reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 1) = g;
    *reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 2) = b;
    *reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 3) = a;
    global::g_pOnColorChanged(CEntityIdentity);
}
Посмотреть вложение 211570
shot_0001.jpg
называй вещи своим именами, CEntityIdentity это не сущность, это ее "пасспорт"(имя фамилия айди серийник и тд). у CEntityIdentity нету "цвета" и подобных понятий. C_BaseEntity - вот это уже сама сущность, у нее есть цвет и тд(точнее цвет есть у C_BaseModelEntity но это не важно). если меняется портрет - значит цвет(нетвар) успешно меняется. если не меняется цвет на модельке - значит коллбек не вызывается(нетвар изменился но дота об этом не знает и как следствие не перерисовывает модельку в новом цвете).
ты уверен что ты правильно находишь функцию?
твоя сига ведёт сюда, а это явно не то что тебе нужно. каких-то прибавлений оффсетов я у тебя не вижу.
1657373409600.png
 
Последнее редактирование:
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
ты уверен что ты правильно находишь функцию?
Подумал, что это вот эта функция, но при её вызове крашит
1657375512823.png
Поставил брейкпоинт на неё,скорее всего это тоже не то, что нужно, в rax+8 не только OnColorChanged помещается
1657375599780.png
1657375618196.png
При спавне героев
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Подумал, что это вот эта функция, но при её вызове крашит
Посмотреть вложение 211586
Поставил брейкпоинт на неё,скорее всего это тоже не то, что нужно, в rax+8 не только OnColorChanged помещается
Посмотреть вложение 211587
Посмотреть вложение 211588
При спавне героев
да всё правильно ее и вызывай(0x7ffaab071c50 на твоем скрине)
из дампа:
class "CBaseModelEntity" callback "OnColorChanged" function 0x7ff84f6d1c50 (бля надо тут RVA сделать но мне лень пока xD)
rax+8 это ты не туда смотришь
ты брякаешь на 7FFAAB071C50
а rax+8 у тебя референсит на 7FFAAB071C6A. к этому моменту RAX уже будет другой(он меняется на 7FFAAB071C60 -> mov rax, [rcx]). ты же смотришь rax+8 до изменения(что неправильно)
мораль такова, что на момент твоего брейкпоинта ПОЕБАТЬ какой rax. это НАЧАЛО ФУНКЦИИ. функция не несёт ответственности за волатильный регистр RAX который ей передали. ответственность несёт тот кто вызывает. он может туда хоть член положить, функции будет поебать это не ее собачье дело. так что смотреть rax брякнув на начале функции это как минимум бред. там может лежать в прямом смысле всё что угодно, это МУСОР, и смысла смотреть туда очень мало.
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
да всё правильно ее и вызывай(0x7ffaab071c50 на твоем скрине)
Вызываю, но ловлю краш при спавне иллюзии
1657378520083.png
C++:
typedef __int64(__fastcall* oOnColorChanged)(__int64);

global::g_pOnColorChanged = reinterpret_cast<oOnColorChanged>(util::FPat("client.dll", "40 53 48 83 EC 20 48 8B D9 48 8B 89 ? ? ? ? 48 8B 01 0F B6 93 ? ? ? ?"));

void SetEntityRenderColor(unsigned char r, unsigned char g, unsigned char b, unsigned char a) {
        if (!this->DoesExists()) return;

        *reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 0) = r;
        *reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 1) = g;
        *reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 2) = b;
        *reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 3) = a;
       
        global::g_pOnColorChanged(CEntityIdentity);
    }

ты брякаешь на 7FFAAB071C50
а rax+8 у тебя референсит на 7FFAAB071C6A. к этому моменту RAX уже будет другой(он меняется на 7FFAAB071C60 -> mov rax, [rcx]). ты же смотришь rax+8 до изменения(что неправильно)
мораль такова, что на момент твоего брейкпоинта ПОЕБАТЬ какой rax. это НАЧАЛО ФУНКЦИИ. функция не несёт ответственности за волатильный регистр RAX который ей передали. ответственность несёт тот кто вызывает. он может туда хоть член положить, функции будет поебать это не ее собачье дело. так что смотреть rax брякнув на начале функции это как минимум бред. там может лежать в прямом смысле всё что угодно, это МУСОР, и смысла смотреть туда очень мало.
Я уже понял это)
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Вызываю, но ловлю краш при спавне иллюзии
Посмотреть вложение 211593
C++:
typedef __int64(__fastcall* oOnColorChanged)(__int64);

global::g_pOnColorChanged = reinterpret_cast<oOnColorChanged>(util::FPat("client.dll", "40 53 48 83 EC 20 48 8B D9 48 8B 89 ? ? ? ? 48 8B 01 0F B6 93 ? ? ? ?"));

void SetEntityRenderColor(unsigned char r, unsigned char g, unsigned char b, unsigned char a) {
        if (!this->DoesExists()) return;

        *reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 0) = r;
        *reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 1) = g;
        *reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 2) = b;
        *reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 3) = a;
     
        global::g_pOnColorChanged(CEntityIdentity);
    }



Я уже понял это)
ну во-первых зачем вопросики в самом конце сиги? вопросики это "любой байт". после конца сиги итак идут любые байты.
40 53 48 83 EC 20 48 8B D9 48 8B 89 ? ? ? ? 48 8B 01 0F B6 93 ? ? ? ?
->
40 53 48 83 EC 20 48 8B D9 48 8B 89 ? ? ? ? 48 8B 01 0F B6 93
во-вторых ты так свою кашу и не пофиксил с CEntityIdentity
еще раз повторяю нельзя так писать
*reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 0) = r;//нельзя так писать
потому что у CEntityIdentity нету никаких m_clrRender. ты тут где-то видишь m_clrRender? правильно. не видишь. потому что его тут нет. потому что он в C_BaseEntity(а точнее в одном из ее детищ C_BaseModelEntity). называй вещи своими именами.
1657379101800.png
в-третьих насколько я знаю баги обычно фиксятся деБАГером поэтому ДЕБАЖЬ хули. мне твоё окошко в визуалке мало о чём говорит.
в-четвертых ты уверен что тебе находит сигу успешно? если ты сидишь с дебагера и у тебя стоит бп на этой функции - ее не найдет по сиге(потому что там первый байт функции будет CC, дебагер байтпатчит когда бп ставит)
так что логни адрес функи перед тем как вызывать ее.
если же действительно g_pOnColorChanged равен 0(то есть сигу не нашло) и тебя о том что сигу не нашло никак не уведомил твой код(хотя бы MessageBox Can't find signature "blablabla" idi nahooy), твой код - говно и надо переделывать чтобы в будущем таких ситуаций не было.
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
ну во-первых зачем вопросики в самом конце сиги? вопросики это "любой байт". после конца сиги итак идут любые байты.
40 53 48 83 EC 20 48 8B D9 48 8B 89 ? ? ? ? 48 8B 01 0F B6 93 ? ? ? ?
->
40 53 48 83 EC 20 48 8B D9 48 8B 89 ? ? ? ? 48 8B 01 0F B6 93
во-вторых ты так свою кашу и не пофиксил с CEntityIdentity
еще раз повторяю нельзя так писать
*reinterpret_cast<unsigned char*>(*reinterpret_cast<uintptr_t*>(CEntityIdentity) + global::offsets::m_clrRender + 0) = r;//нельзя так писать
потому что у CEntityIdentity нету никаких m_clrRender. ты тут где-то видишь m_clrRender? правильно. не видишь. потому что его тут нет. потому что он в C_BaseEntity(а точнее в одном из ее детищ C_BaseModelEntity). называй вещи своими именами.
Посмотреть вложение 211595
в-третьих насколько я знаю баги обычно фиксятся деБАГером поэтому ДЕБАЖЬ хули. мне твоё окошко в визуалке мало о чём говорит.
в-четвертых ты уверен что тебе находит сигу успешно? если ты сидишь с дебагера и у тебя стоит бп на этой функции - ее не найдет по сиге(потому что там первый байт функции будет CC, дебагер байтпатчит когда бп ставит)
так что логни адрес функи перед тем как вызывать ее.
если же действительно g_pOnColorChanged равен 0(то есть сигу не нашло) и тебя о том что сигу не нашло никак не уведомил твой код(хотя бы MessageBox Can't find signature "blablabla" idi nahooy), твой код - говно и надо переделывать чтобы в будущем таких ситуаций не было.
Окей, я переименовал, но сига то верная, там не 0, и я без дебаггера пытался, всё равно
 
https://qweme.dev
Пользователь
Статус
Оффлайн
Регистрация
25 Май 2022
Сообщения
165
Реакции[?]
87
Поинты[?]
21K
Окей, я переименовал, но сига то верная, там не 0, и я без дебаггера пытался, всё равно
я не знаю как ты искал… но это же база :neutral:
40 ? 48 83 EC ? 48 8B ? 48 8B ? ? ? ? ? 48 8B ? 0F B6

и либералист правильно подметил что за нахуй айдентити в ней вообще нету того что тебе нужно

UPD. так так и есть ебать ты в своем же говне поплыл в OnColorChanged передается CBaseEntity лол

CBaseEntity:
    void ChangeModelColor(int r, int g, int b, int a = 255) {
        uintptr_t Base = ((uintptr_t)this + Netvars::Offsets.m_clrRender);

        *(BYTE*)(Base + 0) = static_cast<BYTE>(r);
        *(BYTE*)(Base + 1) = static_cast<BYTE>(g);
        *(BYTE*)(Base + 2) = static_cast<BYTE>(b);
        *(BYTE*)(Base + 3) = static_cast<BYTE>(a);

        NVFunc.OnColorChanged(this);
    }
 
Последнее редактирование:
🤡
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2014
Сообщения
127
Реакции[?]
163
Поинты[?]
21K
Я все думал, отвечать в теме или нет, чел просто 3 дня считай пытается разобраться и нехуя. Либералист уже и так и сяк. Нехуя.
Как же тяжко иногда. 🤡
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
я не знаю как ты искал… но это же база :neutral:
40 ? 48 83 EC ? 48 8B ? 48 8B ? ? ? ? ? 48 8B ? 0F B6

и либералист правильно подметил что за нахуй айдентити в ней вообще нету того что тебе нужно

UPD. так так и есть ебать ты в своем же говне поплыл в OnColorChanged передается CBaseEntity лол

CBaseEntity:
    void ChangeModelColor(int r, int g, int b, int a = 255) {
        uintptr_t Base = ((uintptr_t)this + Netvars::Offsets.m_clrRender);

        *(BYTE*)(Base + 0) = static_cast<BYTE>(r);
        *(BYTE*)(Base + 1) = static_cast<BYTE>(g);
        *(BYTE*)(Base + 2) = static_cast<BYTE>(b);
        *(BYTE*)(Base + 3) = static_cast<BYTE>(a);

        NVFunc.OnColorChanged(this);
    }
твоя сига ведёт туда же, куда и моя.

и либералист правильно подметил что за нахуй айдентити в ней вообще нету того что тебе нужно

UPD. так так и есть ебать ты в своем же говне поплыл в OnColorChanged передается CBaseEntity лол
я же написал, что уже переименовал
 
https://qweme.dev
Пользователь
Статус
Оффлайн
Регистрация
25 Май 2022
Сообщения
165
Реакции[?]
87
Поинты[?]
21K
твоя сига ведёт туда же, куда и моя.


я же написал, что уже переименовал
а ну да ебать у тебя компутер особенный навверное дота x32 да? :tearsofjoy::tearsofjoy:

я наверное шизоид просто
 

Вложения

Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
а ну да ебать у тебя компутер особенный навверное дота x32 да? :tearsofjoy::tearsofjoy:

я наверное шизоид просто
причем тут x32 и компьютер мой вообще? ты думаешь я в разных версиях дебагера смотрел или что? и я переименовал в проекте, а не в сообщении
Что такое CBaseEntity\CEntityIdentity. Почему не this?
то что с итерации энтити получаю, буду this использовать
 
https://qweme.dev
Пользователь
Статус
Оффлайн
Регистрация
25 Май 2022
Сообщения
165
Реакции[?]
87
Поинты[?]
21K
причем тут x32 и компьютер мой вообще? ты думаешь я в разных версиях дебагера смотрел или что? и я переименовал в проекте, а не в сообщении

то что с итерации энтити получаю, буду this использовать
про x32 это рофл ты че
а в OnColorChenged ты и правда не то пихаешь
 
🤡
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2014
Сообщения
127
Реакции[?]
163
Поинты[?]
21K
причем тут x32 и компьютер мой вообще? ты думаешь я в разных версиях дебагера смотрел или что? и я переименовал в проекте, а не в сообщении

то что с итерации энтити получаю, буду this использовать
То есть CEntityIdentity (CBaseEntity) у тебя класс. И ты прибавляешь класс + нетвар.

Или что эт у тебя. Блять, еще бы понимать.

Это переменная у тебя? типо void* CBaseEntity\CEntityIdentity?
Или же это class CEntityIdentity?

Если же ты итерируешь ентити, то как?

Есть как минимум 3 варианта итерации. И один из них реально возвращает CEntityIdentity. Тогда я не понял, почему у тебя портрет перекрасился.
У меня очень много вопросов к твоему коду. И так мало ответов.
 
Сверху Снизу