Вопрос Предметы в ентити системе

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

Но по каким то странным причинам половина всех предметов так не думает
1658606387351.png
как видно на скрине OnAddEntity не сработал на бкб (ну и на хуйню для ловкости) или может я не там ищу
1658606478776.png
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
мб твой IsItem говно? или мб слишком рано чекаешь?
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
попробуй не в OnAddEntity логать.
я например в хуке OnAddEntity добавляю в entity_queue, потом в хуке CFlattenedSerializers::Decode убираю сущность из entity_queue и кидаю в entity_list(и логаю dispatching entity blablabla), а в хуке OnRemoveEntity убираю сущности из обоих контейнеров. логаю "entity_added blablabla" из CEngineServiceMgr::OnFrameRenderingFinished по приколу(это всё лишь просто тестовая комбинация по фану не думаю что стоит ее использовать в продакшне). поэкспериментируй сам.
1658662815800.png
 
https://qweme.dev
Пользователь
Статус
Оффлайн
Регистрация
25 Май 2022
Сообщения
165
Реакции[?]
87
Поинты[?]
21K
попробуй не в OnAddEntity логать.
я например в хуке OnAddEntity добавляю в entity_queue, потом в хуке CFlattenedSerializers::Decode убираю сущность из entity_queue и кидаю в entity_list(и логаю dispatching entity blablabla), а в хуке OnRemoveEntity убираю сущности из обоих контейнеров. логаю "entity_added blablabla" из CEngineServiceMgr::OnFrameRenderingFinished по приколу(это всё лишь просто тестовая комбинация по фану не думаю что стоит ее использовать в продакшне). поэкспериментируй сам.
Посмотреть вложение 213812
вообще к чему я это пишу у меня в хуке препейр юнет ордерс на танго работает а на фласку нихуя хотя ентити лист там дотавский
только потом уже начал чекать в OnAddEntity

C++:
    if (Config::prevent_fail_action.enable) {
        if (Order == DOTA_UNIT_ORDER_CAST_TARGET_TREE) {
            CBaseEntity* AbilityEnt = vmt.EntitySystem->GetBaseEntity(AbilityIndex);

            if (Config::prevent_fail_action.tango && AbilityEnt && AbilityEnt->IsHeroName("item_tango") && GameData.LocalHero->GetModifierManager()->HasModifier("modifier_tango_heal"))
                return;
        }
        else if (Order == DOTA_UNIT_ORDER_CAST_TARGET) {
            CBaseEntity* AbilityEnt = vmt.EntitySystem->GetBaseEntity(AbilityIndex);
            CBaseEntity* TargetEnt = vmt.EntitySystem->GetBaseEntity(TargetIndex);
              
      

            if (Config::prevent_fail_action.flask && AbilityEnt && AbilityEnt->IsHeroName("item_flask"))
                if (TargetEnt && TargetEnt->GetModifierManager()->HasModifier("modifier_flask_healing"))
                    return;
        }
    }
C++:
class CGameEntitySystem {
public:
    CBaseEntity* GetBaseEntity(int index) {
        if (index <= -1 || index >= (MAX_TOTAL_ENTITIES - 1))
            return nullptr;

        CEntityIdentities* chunkToUse = m_pIdentityChunks[(index / MAX_ENTITIES_IN_LIST)]; // equal to ( index >> 9 )

        if (!chunkToUse)
            return nullptr;

        CEntityIdentity* identity = &chunkToUse->m_pIdentities[index % MAX_ENTITIES_IN_LIST]; // equal to ( index & 1FF )

        if (!identity)
            return nullptr;

        return (CBaseEntity*)identity->BaseEntity;
    }
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
вообще к чему я это пишу у меня в хуке препейр юнет ордерс на танго работает а на фласку нихуя хотя ентити лист там дотавский
только потом уже начал чекать в OnAddEntity

C++:
    if (Config::prevent_fail_action.enable) {
        if (Order == DOTA_UNIT_ORDER_CAST_TARGET_TREE) {
            CBaseEntity* AbilityEnt = vmt.EntitySystem->GetBaseEntity(AbilityIndex);

            if (Config::prevent_fail_action.tango && AbilityEnt && AbilityEnt->IsHeroName("item_tango") && GameData.LocalHero->GetModifierManager()->HasModifier("modifier_tango_heal"))
                return;
        }
        else if (Order == DOTA_UNIT_ORDER_CAST_TARGET) {
            CBaseEntity* AbilityEnt = vmt.EntitySystem->GetBaseEntity(AbilityIndex);
            CBaseEntity* TargetEnt = vmt.EntitySystem->GetBaseEntity(TargetIndex);
             
     

            if (Config::prevent_fail_action.flask && AbilityEnt && AbilityEnt->IsHeroName("item_flask"))
                if (TargetEnt && TargetEnt->GetModifierManager()->HasModifier("modifier_flask_healing"))
                    return;
        }
    }
C++:
class CGameEntitySystem {
public:
    CBaseEntity* GetBaseEntity(int index) {
        if (index <= -1 || index >= (MAX_TOTAL_ENTITIES - 1))
            return nullptr;

        CEntityIdentities* chunkToUse = m_pIdentityChunks[(index / MAX_ENTITIES_IN_LIST)]; // equal to ( index >> 9 )

        if (!chunkToUse)
            return nullptr;

        CEntityIdentity* identity = &chunkToUse->m_pIdentities[index % MAX_ENTITIES_IN_LIST]; // equal to ( index & 1FF )

        if (!identity)
            return nullptr;

        return (CBaseEntity*)identity->BaseEntity;
    }
TargetEnt->GetModifierManager()->HasModifier("modifier_flask_healing")
таргет ент ты чекнул на нуллптр, а модифаерменеджер нет. то что он не может быть нулём(т.к. это член-структура а не член-указатель-на-структуру, то есть ты нихуя не считываешь ты просто оффсет прибавляешь) можно обозначить возвращая референс вместо указателя.
тогда код будет:
TargetEnt->GetModifierManager().HasModifier("modifier_flask_healing")
ну и держу вкурсе у C_BaseEntity нету модифаер менеджера. он есть у сущностей начиная с C_DOTA_BaseNPC. так что неплохо было бы для начала проверить что это нпс перед тем как бафы проверять(которых нету у нон-нпс сущностей).
раз на фласку не работает - сделай лог посмотри что там происходит в хуке какая сущность что где почему откуда блаблабла. не работает - ищи место где конкретно не работает и что конкретно идёт не так и дальше уже разбирайся.
 
https://qweme.dev
Пользователь
Статус
Оффлайн
Регистрация
25 Май 2022
Сообщения
165
Реакции[?]
87
Поинты[?]
21K
1658683142511.png
1658683315564.png
что самое странное

в релизе чеков будет в 10 раз больше это просто прототип функи по этому до кода доебыватся не надо я сам все это понимаю )
сделай лог посмотри что там происходит в хуке какая сущность что где почему откуда блаблабла. не работает - ищи место где конкретно не работает и что конкретно идёт не так и дальше уже разбирайся.
.
 
https://qweme.dev
Пользователь
Статус
Оффлайн
Регистрация
25 Май 2022
Сообщения
165
Реакции[?]
87
Поинты[?]
21K
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
да, там есть обычный нейм а есть дизайнер нейм. можешь как костыль заебашить GetAnyName() которое возвращает любое из этих двух имён которое не ноль(if (m_name == nullptr) {return m_designerName} else {return m_name} условно).
CUtlSymbolLarge m_name(offset 0x18)
CUtlSymbolLarge m_designerName(offset 0x20)
тем не менее, приучайся чекать всегда и всё. вопрос не в релизе или дебаге. не сделаешь щас - потом можешь забыть, не заметить. а так привычку воспитаешь. ну и вопрос был не столько в чеке сколько в том что ты указатель а не референс возвращаешь. референсы не надо чекать. референс это когда ты логически обозначаешь что чек уже был где-то и повторно чекать не надо. GetModifierManager это просто прибавление оффсета без считываний, поэтому тут нечего чекать(потому что ты уже чекнул что то число к котормоу ты прибавляешь(this в данном случае) не ноль). но ты делаешь это указателем зачем-то.
 
Сверху Снизу