Исходник CGameRoom & CFlowchartManager

Забаненный
Статус
Оффлайн
Регистрация
16 Фев 2021
Сообщения
45
Реакции[?]
40
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Привет всем кто это читает.

Все адреса актуальны на "22.05.21".
Клиент 'GameDX11'


Создание комнат и обновление статуса игрока в комнате:
Код:
enum EGameRoomType {

    eGRT_None = 0,
    eGRT_PvE_Private = 1,
    eGRT_PvP_Public = 2,
    eGRT_PvP_ClanWar = 4,
    eGRT_PvP_Autostart = 8,
    eGRT_PvE_Autostart = 0x10,
    eGRT_PvE = 0x11,
    eGRT_PvP_Rating = 0x20,
    eGRT_PvP = 0x2E,
    eGRT_All = 0x3F
};

enum EGameRoomPlayerStatus {

    eGRPS_NotReady,
    eGRPS_Ready,
    eGRPS_CantBeReady
};

Код:
struct RestrictionValue {

    union unnamed_type_m_values {

        bool boolean;
        int int32;
        __int64 int64;
    };

    BYTE m_valueType[1];
    RestrictionValue::unnamed_type_m_values m_values;
};

struct SRoomCustomParameters {

    RestrictionValue friendlyFire;
    RestrictionValue enemyOutlines;
    RestrictionValue autobalance;
    RestrictionValue joinInTheProcess;
    RestrictionValue classes[5];
    RestrictionValue lockedSpectatorCamera;
    RestrictionValue highLatencyAutoKick;
    RestrictionValue overtimeMode;
    RestrictionValue inventorySlots;
    RestrictionValue maxPlayers;
    RestrictionValue roundLimit;
    RestrictionValue preRoundTime;
};

Код:
class CGameRoom {
public:
    using fnOpenRoom = bool(__fastcall*)(CGameRoom*, EGameRoomType, const char*, const SRoomCustomParameters*, bool, const char*);
    using fnUpdatePvPRoom = bool(__fastcall*)(CGameRoom*, const char*, bool, const SRoomCustomParameters*);
    using fnSetRoomMission = bool(__fastcall*)(CGameRoom*, const char*);
    using fnSetPlayerStatus = bool(__fastcall*)(CGameRoom*, EGameRoomPlayerStatus);

    bool OpenRoom(EGameRoomType eRoomType, const char* roomName, const SRoomCustomParameters* params, bool isPrivate, const char* mission_key) { return fnOpenRoom(0x141191470)(this, eRoomType, roomName, params, isPrivate, mission_key); } // Find -> gameroom_open 0xEC LAST XREF
    bool UpdatePVPRoom(const char* missionKey, bool isPrivate, const SRoomCustomParameters* params) { return fnUpdatePvPRoom(0x1411923C0)(this, missionKey, isPrivate, params); } // Find -> room_settings_close + 102
    bool SetRoomMission(const char* missionKey) { return fnSetRoomMission(0x141191940)(this, missionKey); } // Find -> gameroom_setinfo 0xB7 LAST XREF
    bool SetPlayerStatus(EGameRoomPlayerStatus status) { return fnSetPlayerStatus(0x141192200)(this, status); } // Find -> gameroom_ready_status_changed LAST XREF (else __unsigned int8)
};

Пример использования CGameRoom:
Код:
SRoomCustomParameters m_params;
::memset(&m_params, 0, sizeof SRoomCustomParameters);
{
    params.friendlyFire.m_values.boolean = false;
    params.enemyOutlines.m_values.boolean = false;
    params.autobalance.m_values.boolean = false;
    params.joinInTheProcess.m_values.boolean = false;

    params.classes[0].m_values.boolean = true;
    params.classes[1].m_values.boolean = true;
    params.classes[2].m_values.boolean = true;
    params.classes[3].m_values.boolean = true;
    params.classes[4].m_values.boolean = true;
    
    params.lockedSpectatorCamera.m_values.boolean = false;
    params.highLatencyAutoKick.m_values.boolean = true;
    
    params.overtimeMode.m_values.boolean = true;
    params.inventorySlots.m_values.int64 = 34326183935;
    
    params.maxPlayers.m_values.int32 = 8;
    params.roundLimit.m_values.int32 = 11;
    params.preRoundTime.m_values.boolean = true;
}

/* Обновление комнаты */
m_ptr->UpdatePVPRoom("e5981b6a-325d-42eb-a3fe-e6eed0bc4bf2", false, &m_params); // tdm_hangar_up

/* Создание комнаты */
m_ptr->OpenRoom(EGameRoomType::eGRT_PvP_Public, u8"Комната игрока", &m_params, false, "e5981b6a-325d-42eb-a3fe-e6eed0bc4bf2"); // tdm_hangar_up

/* Смена карты */
m_ptr->SetRoomMission("e5981b6a-325d-42eb-a3fe-e6eed0bc4bf2"); // tdm_hangar_up
Автоматический запуск в рейтинговые матчи:

Код:
enum EFlowchartState {

    eFS_None = 0xFFFFFFFF,
    eFS_First = 0x0,
    eFS_NoUI = 0x0,
    eFS_Login = 0x1,
    eFS_LoadingLobby = 0x2,
    eFS_CharacterCreation = 0x3,
    eFS_Lobby = 0x4,
    eFS_LoadingLevel = 0x5,
    eFS_Ingame = 0x6,
    eFS_Renaming = 0x7,
    eFS_PromoTutorial = 0x8,
    eFS_PostGame = 0x9,
    eFS_Count = 0xA,
};

class CFlowchartManager {
public:

    using fnSpawnAction = void(__fastcall*)(CFlowchartManager*, const char*);
    void SpawnAction(const char* action) { fnSpawnAction(0x141089D20)(this, action); } // Find -> room_settings_close

public:
    std::byte m_padding[48];
    EFlowchartState m_currentState;
};
Пример использования CFlowchartManager:
Код:
if (m_ptr->m_currentState == EFlowchartState::eFS_Lobby) {
    
    m_ptr->SpawnAction("quickplay_rating");
}
Указатели на данные классы:
Код:
CGame {
    CFlowchartManager* m_pFlowchartManager; //0x0210
    CGameRoom* m_pGameRoom; //0x0268
}
 
Сверху Снизу