Вопрос по созданию системы выбора игры.
 

0 Пользователей и 1 Гость просматривают эту тему.

nvm

  • *
  • Сообщений: 124
    • Просмотр профиля
Привет всем, я пытаюсь перенести систему выбора игры(эпохи) из беты уже 2 неделю, но без успешно. Всё время система берёт игры из source sdk 2013, а не из папки мода. Есть
у кого-то идеи как исправить?//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//

#include "cbase.h"
#ifdef _XBOX
#include "xbox/xbox_platform.h"
#include "xbox/xbox_win32stubs.h"
#endif


#pragma warning(push)
#pragma warning(disable: 4005)
#pragma warning(disable: 4668)
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#ifndef NOMINMAX
#define NOMINMAX
#endif
#include <windows.h>
#pragma warning(pop)

#include <stdio.h>
#include "filesystem.h"
#include "gameversiondialog.h"
#include "ModInfo.h"


#include <vgui_controls/ListPanel.h>
#include <KeyValues.h>

// memdbgon must be the last include file in a .cpp file!!!
#include <tier0/memdbgon.h>

using namespace vgui;

//-----------------------------------------------------------------------------
// Purpose: Constructor
//-----------------------------------------------------------------------------
CChangeGameDialog::CChangeGameDialog(vgui::Panel* parent) : Frame(parent, "ChangeGameDialog")
{
SetSize(400, 340);
SetMinimumSize(400, 340);
SetTitle("#GameUI_ChangeGame", true);

m_pModList = new ListPanel(this, "ModList");
m_pModList->SetEmptyListText("#GameUI_NoOtherGamesAvailable");
m_pModList->AddColumnHeader(0, "ModName", "#GameUI_Game", 128);

LoadModList();
LoadControlSettings("Resource/ChangeGameDialog.res");

// if there's a mod in the list, select the first one
if (m_pModList->GetItemCount() > 0)
{
m_pModList->SetSingleSelectedItem(m_pModList->GetItemIDFromRow(0));
}
}

//-----------------------------------------------------------------------------
// Purpose: Destructor
//-----------------------------------------------------------------------------
CChangeGameDialog::~CChangeGameDialog()
{
}

//-----------------------------------------------------------------------------
// Purpose: Fills the mod list
//-----------------------------------------------------------------------------
void CChangeGameDialog::LoadModList()
{
    char szSearchPath[_MAX_PATH + 5];
    Q_strncpy(szSearchPath, "*.*", sizeof(szSearchPath));

    WIN32_FIND_DATA wfd;
    HANDLE hResult = FindFirstFile(szSearchPath, &wfd);
    if (hResult == INVALID_HANDLE_VALUE)
        return;

    do
    {
        if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && Q_strnicmp(wfd.cFileName, ".", 1))
        {
            // Build path to gameinfo.txt
            char szGameInfoPath[MAX_PATH + 16];
            Q_snprintf(szGameInfoPath, sizeof(szGameInfoPath), "%s\\gameinfo.txt", wfd.cFileName);

            // Use engine file system
            FileHandle_t f = g_pFullFileSystem->Open(szGameInfoPath, "rb");
            if (f)
            {
                // Get file size
                int size = g_pFullFileSystem->Size(f);
                if (size > 0)
                {
                    char* buf = (char*)malloc(size + 1);
                    if (g_pFullFileSystem->Read(buf, size, f) == size)
                    {
                        buf[size] = 0;

                        CModInfo modInfo;
                        modInfo.LoadGameInfoFromBuffer(buf);

                        if (strcmp(modInfo.GetGameName(), ModInfo().GetGameName()))
                        {
                            strlwr(wfd.cFileName);
                            KeyValues* itemData = new KeyValues("Mod");
                            itemData->SetString("ModName", modInfo.GetGameName());
                            itemData->SetString("ModDir", wfd.cFileName);
                            m_pModList->AddItem(itemData, 0, false, false);
                        }
                    }
                    free(buf);
                }
                g_pFullFileSystem->Close(f);
            }
        }
    } while (FindNextFile(hResult, &wfd));

    FindClose(hResult);
}

//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CChangeGameDialog::OnCommand(const char* command)
{
if (!stricmp(command, "OK"))
{
if (m_pModList->GetSelectedItemsCount() > 0)
{
KeyValues* kv = m_pModList->GetItem(m_pModList->GetSelectedItem(0));
if (kv)
{
// change the game dir and restart the engine
char szCmd[256];
Q_snprintf(szCmd, sizeof(szCmd), "_setgamedir %s\n", kv->GetString("ModDir"));
engine->ClientCmd_Unrestricted(szCmd);

// Force restart of entire engine
engine->ClientCmd_Unrestricted("_restart\n");
}
}
}
else if (!stricmp(command, "Cancel"))
{
Close();
}
else
{
BaseClass::OnCommand(command);
}
}


Единственный разработчик Half-life 2!PreRelease.
  • *
  • Сообщений: 583
    • Просмотр профиля
Привет всем, я пытаюсь перенести систему выбора игры(эпохи) из беты уже 2 неделю, но без успешно. Всё время система берёт игры из source sdk 2013, а не из папки мода. Есть
у кого-то идеи как исправить?//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//

#include "cbase.h"
#ifdef _XBOX
#include "xbox/xbox_platform.h"
#include "xbox/xbox_win32stubs.h"
#endif


#pragma warning(push)
#pragma warning(disable: 4005)
#pragma warning(disable: 4668)
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#ifndef NOMINMAX
#define NOMINMAX
#endif
#include <windows.h>
#pragma warning(pop)

#include <stdio.h>
#include "filesystem.h"
#include "gameversiondialog.h"
#include "ModInfo.h"


#include <vgui_controls/ListPanel.h>
#include <KeyValues.h>

// memdbgon must be the last include file in a .cpp file!!!
#include <tier0/memdbgon.h>

using namespace vgui;

//-----------------------------------------------------------------------------
// Purpose: Constructor
//-----------------------------------------------------------------------------
CChangeGameDialog::CChangeGameDialog(vgui::Panel* parent) : Frame(parent, "ChangeGameDialog")
{
SetSize(400, 340);
SetMinimumSize(400, 340);
SetTitle("#GameUI_ChangeGame", true);

m_pModList = new ListPanel(this, "ModList");
m_pModList->SetEmptyListText("#GameUI_NoOtherGamesAvailable");
m_pModList->AddColumnHeader(0, "ModName", "#GameUI_Game", 128);

LoadModList();
LoadControlSettings("Resource/ChangeGameDialog.res");

// if there's a mod in the list, select the first one
if (m_pModList->GetItemCount() > 0)
{
m_pModList->SetSingleSelectedItem(m_pModList->GetItemIDFromRow(0));
}
}

//-----------------------------------------------------------------------------
// Purpose: Destructor
//-----------------------------------------------------------------------------
CChangeGameDialog::~CChangeGameDialog()
{
}

//-----------------------------------------------------------------------------
// Purpose: Fills the mod list
//-----------------------------------------------------------------------------
void CChangeGameDialog::LoadModList()
{
    char szSearchPath[_MAX_PATH + 5];
    Q_strncpy(szSearchPath, "*.*", sizeof(szSearchPath));

    WIN32_FIND_DATA wfd;
    HANDLE hResult = FindFirstFile(szSearchPath, &wfd);
    if (hResult == INVALID_HANDLE_VALUE)
        return;

    do
    {
        if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && Q_strnicmp(wfd.cFileName, ".", 1))
        {
            // Build path to gameinfo.txt
            char szGameInfoPath[MAX_PATH + 16];
            Q_snprintf(szGameInfoPath, sizeof(szGameInfoPath), "%s\\gameinfo.txt", wfd.cFileName);

            // Use engine file system
            FileHandle_t f = g_pFullFileSystem->Open(szGameInfoPath, "rb");
            if (f)
            {
                // Get file size
                int size = g_pFullFileSystem->Size(f);
                if (size > 0)
                {
                    char* buf = (char*)malloc(size + 1);
                    if (g_pFullFileSystem->Read(buf, size, f) == size)
                    {
                        buf[size] = 0;

                        CModInfo modInfo;
                        modInfo.LoadGameInfoFromBuffer(buf);

                        if (strcmp(modInfo.GetGameName(), ModInfo().GetGameName()))
                        {
                            strlwr(wfd.cFileName);
                            KeyValues* itemData = new KeyValues("Mod");
                            itemData->SetString("ModName", modInfo.GetGameName());
                            itemData->SetString("ModDir", wfd.cFileName);
                            m_pModList->AddItem(itemData, 0, false, false);
                        }
                    }
                    free(buf);
                }
                g_pFullFileSystem->Close(f);
            }
        }
    } while (FindNextFile(hResult, &wfd));

    FindClose(hResult);
}

//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CChangeGameDialog::OnCommand(const char* command)
{
if (!stricmp(command, "OK"))
{
if (m_pModList->GetSelectedItemsCount() > 0)
{
KeyValues* kv = m_pModList->GetItem(m_pModList->GetSelectedItem(0));
if (kv)
{
// change the game dir and restart the engine
char szCmd[256];
Q_snprintf(szCmd, sizeof(szCmd), "_setgamedir %s\n", kv->GetString("ModDir"));
engine->ClientCmd_Unrestricted(szCmd);

// Force restart of entire engine
engine->ClientCmd_Unrestricted("_restart\n");
}
}
}
else if (!stricmp(command, "Cancel"))
{
Close();
}
else
{
BaseClass::OnCommand(command);
}
}


Вот что ответил ИИ:Похоже, у вас проблема в том, что система по-прежнему выбирает игры из source SDK 2013, а не из папки мода. Обычно это связано с тем, что engine или скрипты запуска используют неправильный путь или переменную для определения текущего модифицированного игрового окружения.

Вот несколько идей и возможных решений:

1. Проверить правильность пути к модам
В коде у вас используется FindFirstFile и FindNextFile без указания конкретной папки. По умолчанию, это ищет в текущей рабочей папке.
Возможно, стоит явно указать путь к папке модов. Например, если ваши моды находятся в папке mods, попробуйте изменить вызов поиска:
cpp

Q_snprintf(szSearchPath, sizeof(szSearchPath), "mods\\*.*");
Или, чтобы искать в конкретной папке:

cpp

Q_snprintf(szSearchPath, sizeof(szSearchPath), "%s\\mods\\*.*", some_base_path);
2. Убедиться, что gameinfo.txt находится в правильной папке модов
Логика загрузки модов основана на чтении файла gameinfo.txt.
Проверьте, что в папке модов есть файл gameinfo.txt, и путь к нему правильно формируется.
3. Проверить параметры запуска
Проверьте, как вы запускаете игру. Обычно переменная окружения или параметры командной строки определяют текущий мод.
Например, убедитесь, что запускаете игру с правильным -game параметром, указывающим на папку мода, а не на основную игру.
4. Вызов _setgamedir или _setgamedir правильный?
В коде вы вызываете engine->ClientCmd_Unrestricted("_setgamedir ..."). Убедитесь, что ModDir содержит правильное название папки мода.
Попробуйте вывести в лог значение ModDir, чтобы убедиться, что оно корректное.
5. Проверьте, как определяются активные конфигурации
В настройках конфигурации или скриптах запуска ищите переменные, влияющие на выбор директории игры.
Итог
Возможно, стоит явно задать путь к папке модов, убедившись, что ModDir содержит правильное название.
В папке мода должны находиться все необходимые файлы, например gameinfo.txt, и путь должен быть правильно прописан.
Игра должна запускаться с параметром -game <название папки мода>.
Если хотите, я могу помочь вам получить более точную конфигурацию или подсказку, что именно искать в конфигурациях или командах запуска. Также, если есть конкретная структура папок и команд, присылайте — вместе посмотрим!
Попробуй как ИИ говорит сделать.
Внимание РКН, люди пользуются интернетом! Люди пользуются интернетом?!

nvm

  • *
  • Сообщений: 124
    • Просмотр профиля
Пытался, -game в параметрах запуска действительно запускает игры. Проблема в том, что игры он запускает как раз из sdk. Я подозреваю что где-то в остальном коде находится link на sdk, вопрос где? Я ещё пытался изменять gamerules для запуска через другие версии, но это не принесло успеха. Link на sdk зашит где-то глубже в коде. Единственный кто в теории может помочь с этим так это тот, кто эту систему и сделал, то есть VXP или другой человек который понимает код не через ии.
Единственный разработчик Half-life 2!PreRelease.
  • *
  • Сообщений: 583
    • Просмотр профиля
Значит тебе надо найти файл или создать с изменением эпох. Только ты сначала попробуй сделать в файле autoexec360 или просто autoexec параметр запуска игры с открытым окном выбора эпохи, типо как лаунчер или то самое окно с проверкой CD Диска. Советую второе. И ещё, ты сначала сделай папки для эпох, засунь уникальные для каждой скрипты и модели с картами, протесть эпохи, а потом запусти игру с окном в духе окна с проверкой лицензии. Потом, в коде этого окна поменяй строчки с вводом на строчки выбора эпохи и потом добавь строки с результатом выбора каждой эпохи, в строчке должно быть указан какой параметр запуска игры поменяется после -game.
Работать должно так: Окно, выбираешь эпоху (условно с HL2 2000), игра закрывается и загружается с параметром -game HalfLife!PreRealese!2000. (подставь нужное название эпохи.)
Внимание РКН, люди пользуются интернетом! Люди пользуются интернетом?!

nvm

  • *
  • Сообщений: 124
    • Просмотр профиля
Я решил использовать лаунчер из leaknet. Всё запускается, но есть 1 но... Мне придётся делать кастомную базу по типу source sdk 2013. Как я понял эта функция уже есть в файлах оригинального sdk, и она не работает должным образом. Я решил скачать полный слитый код за 2018, но там everything.sln не создаётся почему-то. Никто не знает с чем это связанно?
Единственный разработчик Half-life 2!PreRelease.