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

Статус
В этой теме нельзя размещать новые ответы.
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
классы в доте какие-то другие или просто ctrl + c со слитых сурсов?
ну как сказать. суть одна и та же но придется тебе там подредачить оффсеты хуеты и тд
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Начинающий
Статус
Оффлайн
Регистрация
26 Фев 2018
Сообщения
43
Реакции[?]
1
Поинты[?]
0
C++:
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 чтобы работать с кешем?
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
я имею ввиду, ты используешь gc чтобы работать с кешем?
через клиент. клиент содержит слушателей(и также является диспетчером. у меня ребилд диспатча, есть еще габеновская функа для диспатча). слушатели реагируют на апдейты.
 
Начинающий
Статус
Оффлайн
Регистрация
26 Фев 2018
Сообщения
43
Реакции[?]
1
Поинты[?]
0
через клиент. клиент содержит слушателей(и также является диспетчером. у меня ребилд диспатча, есть еще габеновская функа для диспатча). слушатели реагируют на апдейты.
CGameEventManager?
 
Начинающий
Статус
Оффлайн
Регистрация
26 Фев 2018
Сообщения
43
Реакции[?]
1
Поинты[?]
0
C++:
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);
        }
    }
Один не скромный вопрос, как ты нашел ее? Я ищу ее по хрефам и как-то все впустую
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Один не скромный вопрос, как ты нашел ее? Я ищу ее по хрефам и как-то все впустую
это ребилд если ты не заметил, я ничего не искал.
DispatchSOUpdate это ребилд.(DispatchSOUpdated точнее оригинальная функция называется но я посчитал что без d лучше по смыслу подходит)
GetSOListeners просто член с оффсета берет.
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
так ты ее вызываешь через индекс, а как ты его нашел?
? а сурсы и дилибы нафига нужны? "ничего не искал" имелось ввиду внутри игры(сиги и тд). искал я как раз в дилибах и сурсах.
 
Начинающий
Статус
Оффлайн
Регистрация
26 Фев 2018
Сообщения
43
Реакции[?]
1
Поинты[?]
0
? а сурсы и дилибы нафига нужны? "ничего не искал" имелось ввиду внутри игры(сиги и тд). искал я как раз в дилибах и сурсах.
так в дибилах класс очень маленький, все остальное функи вызываются другими, как ты нашел индекс?
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
так в дибилах класс очень маленький, все остальное функи вызываются другими, как ты нашел индекс?
чет ты тупишь жоска.
ты думал нахуя мне символьная константа SOUpdated_VFTable_Index ? для того чтобы понимать что это и откуда оно взялось
SOUpdated очевидно это имя функции
_VFTable_Index это значит что константа представляет индекс в виртуальной таблице.
1652529778600.png
1652529810900.png
1652529924100.png
либо еще проще
 
Начинающий
Статус
Оффлайн
Регистрация
26 Фев 2018
Сообщения
43
Реакции[?]
1
Поинты[?]
0
чет ты тупишь жоска.
ты думал нахуя мне символьная константа SOUpdated_VFTable_Index ? для того чтобы понимать что это и откуда оно взялось
SOUpdated очевидно это имя функции
_VFTable_Index это значит что константа представляет индекс в виртуальной таблице.
Посмотреть вложение 203651
Посмотреть вложение 203652
Посмотреть вложение 203653
либо еще проще
Код:
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?
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Код:
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);
}
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу