• Ищем качественного (не новичок) разработчиков Xenforo для этого форума! В идеале, чтобы ты был фулл стек программистом. Если у тебя есть что показать, то свяжись с нами по контактным данным: https://t.me/DREDD

Вопрос Краш без какой-либо причины

  • Автор темы Автор темы CrayZ
  • Дата начала Дата начала
Статус
В этой теме нельзя размещать новые ответы.
классы в доте какие-то другие или просто ctrl + c со слитых сурсов?
ну как сказать. суть одна и та же но придется тебе там подредачить оффсеты хуеты и тд
 
а ты через че меняешь кеш?
C++:
Expand Collapse Copy
void DispatchSOUpdate(
        SOID_t id,
        SharedObject* obj,
        ESOCacheEvent event_type
    ) const
    {
        for (const auto& listener : GetSOListeners())
        {
            listener->CallVFunc<SOUpdated_VFTable_Index>(id, obj, event_type);
        }
    }
 
C++:
Expand Collapse Copy
void DispatchSOUpdate(
        SOID_t id,
        SharedObject* obj,
        ESOCacheEvent event_type
    ) const
    {
        for (const auto& listener : GetSOListeners())
        {
            listener->CallVFunc<SOUpdated_VFTable_Index>(id, obj, event_type);
        }
    }
я имею ввиду, ты используешь gc чтобы работать с кешем?
 
я имею ввиду, ты используешь gc чтобы работать с кешем?
через клиент. клиент содержит слушателей(и также является диспетчером. у меня ребилд диспатча, есть еще габеновская функа для диспатча). слушатели реагируют на апдейты.
 
через клиент. клиент содержит слушателей(и также является диспетчером. у меня ребилд диспатча, есть еще габеновская функа для диспатча). слушатели реагируют на апдейты.
CGameEventManager?
 
C++:
Expand Collapse Copy
void DispatchSOUpdate(
        SOID_t id,
        SharedObject* obj,
        ESOCacheEvent event_type
    ) const
    {
        for (const auto& listener : GetSOListeners())
        {
            listener->CallVFunc<SOUpdated_VFTable_Index>(id, obj, event_type);
        }
    }
Один не скромный вопрос, как ты нашел ее? Я ищу ее по хрефам и как-то все впустую
 
Один не скромный вопрос, как ты нашел ее? Я ищу ее по хрефам и как-то все впустую
это ребилд если ты не заметил, я ничего не искал.
DispatchSOUpdate это ребилд.(DispatchSOUpdated точнее оригинальная функция называется но я посчитал что без d лучше по смыслу подходит)
GetSOListeners просто член с оффсета берет.
 
так ты ее вызываешь через индекс, а как ты его нашел?
? а сурсы и дилибы нафига нужны? "ничего не искал" имелось ввиду внутри игры(сиги и тд). искал я как раз в дилибах и сурсах.
 
? а сурсы и дилибы нафига нужны? "ничего не искал" имелось ввиду внутри игры(сиги и тд). искал я как раз в дилибах и сурсах.
так в дибилах класс очень маленький, все остальное функи вызываются другими, как ты нашел индекс?
 
Последнее редактирование:
так в дибилах класс очень маленький, все остальное функи вызываются другими, как ты нашел индекс?
чет ты тупишь жоска.
ты думал нахуя мне символьная константа SOUpdated_VFTable_Index ? для того чтобы понимать что это и откуда оно взялось
SOUpdated очевидно это имя функции
_VFTable_Index это значит что константа представляет индекс в виртуальной таблице.
1652529778600.png

1652529810900.png

1652529924100.png

либо еще проще
bJFOxJE.png
 
чет ты тупишь жоска.
ты думал нахуя мне символьная константа SOUpdated_VFTable_Index ? для того чтобы понимать что это и откуда оно взялось
SOUpdated очевидно это имя функции
_VFTable_Index это значит что константа представляет индекс в виртуальной таблице.
Посмотреть вложение 203651
Посмотреть вложение 203652
Посмотреть вложение 203653
либо еще проще
bJFOxJE.png
Код:
Expand Collapse Copy
export
void UnlockDotaPlus()//invoke from main thread
{
    const auto* SOCachePtr = GCClient::GetInstance()->GetInventorySOCache();
    if (SOCachePtr) {
        auto PlusCache = SOCachePtr->GetPlusAccountCache();
        Logger::LogInfo("SOTypeCache GameAccountPlus Cache 0x%p\n", PlusCache);
        if (PlusCache) {
            for (const auto& objs = PlusCache->GetObjects(); const auto & obj : objs)
            {
                if (obj->IsGameAccountPlus())
                {
                    Logger::LogInfo("SOTypeCache GameAccountPlus 0x%p\n", obj);
                    auto& accountProto = static_cast<CDOTAGameAccountPlus*>(obj)->GetProto();

                    accountProto.set_plus_flags(0);
                    accountProto.set_plus_status(1);//0 = lock, 1 = unlock
                    GCClient::GetInstance()->
                        DispatchSOUpdate(
                            SOCachePtr->GetOwner(),
                            obj,
                            ESOCacheEvent::eSOCacheEvent_Incremental
                        );
                    return;
                }
            }
            Logger::LogError("UnlockDotaPlus: Could not get GameAccountPlus from cache");
        }
        else Logger::LogError("UnlockDotaPlus: PlusCache is nullptr");
    }
    else Logger::LogError("UnlockDotaPlus: SOCache is nullptr");
    throw std::runtime_error{"UnlockDotaPlus -> failed to unlock dota plus."};
}
как вот тут ты получил SOCachePtr?
 
Последнее редактирование:
Код:
Expand Collapse Copy
export
void UnlockDotaPlus()//invoke from main thread
{
    const auto* SOCachePtr = GCClient::GetInstance()->GetInventorySOCache();
    if (SOCachePtr) {
        auto PlusCache = SOCachePtr->GetPlusAccountCache();
        Logger::LogInfo("SOTypeCache GameAccountPlus Cache 0x%p\n", PlusCache);
        if (PlusCache) {
            for (const auto& objs = PlusCache->GetObjects(); const auto & obj : objs)
            {
                if (obj->IsGameAccountPlus())
                {
                    Logger::LogInfo("SOTypeCache GameAccountPlus 0x%p\n", obj);
                    auto& accountProto = static_cast<CDOTAGameAccountPlus*>(obj)->GetProto();

                    accountProto.set_plus_flags(0);
                    accountProto.set_plus_status(1);//0 = lock, 1 = unlock
                    GCClient::GetInstance()->
                        DispatchSOUpdate(
                            SOCachePtr->GetOwner(),
                            obj,
                            ESOCacheEvent::eSOCacheEvent_Incremental
                        );
                    return;
                }
            }
            Logger::LogError("UnlockDotaPlus: Could not get GameAccountPlus from cache");
        }
        else Logger::LogError("UnlockDotaPlus: PlusCache is nullptr");
    }
    else Logger::LogError("UnlockDotaPlus: SOCache is nullptr");
    throw std::runtime_error{"UnlockDotaPlus -> failed to unlock dota plus."};
}
как вот тут ты получил SOCachePtr?
SOCache* GCClient::GetInventorySOCache() const
{
return GetSOCache(CDOTALocalInventory::GetInstance()->m_OwnerID);
}
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху Снизу