Написание конфига

oleg_nelasy

Участник
Сообщения
664
Реакции
46
Всем привет. Вопрос такой надо из файла в зависимости от карты и игры помещать помещать путь mdl в чар.
На данный момент разобрался только как читать сам конфиг а как сделать структуру в тупике.

На данный момент код выглядит так просто читаю файл. То что событие начало раунда это просто для проверки. Разумеется чтение будет происходить при старте новой карты.
C-подобный:
#include <sdktools_functions.inc>

public void OnPluginStart()
{
    HookEvent("round_start", Event_OnStart);
    //HookEvent("round_end", OnEnd);
}

public Action Event_OnStart(Handle event, const char[] name, bool dontBroadcast)
{
    char ConfigPath[255];
    BuildPath(Path_SM, ConfigPath, 255, "configs/krabik/test.cfg");
    Handle hFile = OpenFile(ConfigPath, "r");
 
    char sBuffer[255];

    while (ReadFileLine(hFile, sBuffer, sizeof(sBuffer)))
    {
        PrintToChatAll("%s", sBuffer);
    }
}

Пример конфига:
"CSGO"
{
    "default"
    {
        "t"        "models/player/custom_player/legacy/tm_leet_variantE.mdl"
        "ct"    "models/player/custom_player/legacy/ctm_idf_variantB.mdl"
    }
    "de_dust2"
    {
        "t"        "models/player/custom_player/legacy/tm_leet_variantE.mdl"
        "ct"    "models/player/custom_player/legacy/ctm_idf_variantB.mdl"
    }
}

"CSS"
{
    "default"
    {
        "t"        "models/player/t_leet.mdl"
        "ct"    "models/player/ct_sas.mdl"
    }
    "de_dust2"
    {
     
        "t"      "models/player/t_leet.mdl"
        "ct"    "models/player/ct_sas.mdl"
    }
}

Нужно делать проверку на игру после на карту. Проверка на игру уже реализована достаточно if(CSS) или if(CSGO) далее если карта совпала положить в sModelT и sModelCT пути. Если нужная карта не найдена положить default они будут предварительно кэшированы.
 

Paranoiiik

хачю клиентмод
Сообщения
2,047
Реакции
1,490
C-подобный:
char szCT[256], szTT[256];

public void OnPluginStart()
{
    HookEvent("round_start", eventRoundStart);
}

public Action eventRoundStart(Event event, const char[] name, bool dontBroadcast)
{
    char szSettings[PLATFORM_MAX_PATH];
    BuildPath(Path_SM, szSettings, sizeof szSettings, "configs/krabik/test.ini");
   
    KeyValues kvSettings = new KeyValues("MapModels");
   
    if(!kvSettings.ImportFromFile(szSettings)) SetFailState("хачю конфек иво нет");
   
    kvSettings.Rewind();
    if(GetEngineVersion() == Engine_CSGO)    kvSettings.JumpToKey("CSGO");
    else                                    kvSettings.JumpToKey("CSS");
   
    char sMap[128];
    GetCurrentMap(sMap, sizeof sMap);
    GetMapDisplayName(sMap, sMap, sizeof sMap);
   
    if(kvSettings.JumpToKey(sMap))
    {
        kvSettings.GetString("ct", szCT, 256);
        kvSettings.GetString("tt", szTT, 256);
    }
    else if(kvSettings.JumpToKey("default"))
    {
        kvSettings.GetString("ct", szCT, 256);
        kvSettings.GetString("tt", szTT, 256);
    }
    else SetFailState("Для этой карты нет моделей, хотя бы блок \"default\" впишите");
   
    kvSettings.Close();
}
C-подобный:
"MapModels"
{
    "CSGO"
    {
        "de_dust2"
        {
            "ct"    "../.mdl"
            "tt"    "../.mdl"
        }
        "default"
        {
            "ct"    "../.mdl"
            "tt"    "../.mdl"
        }
    }
    "CSS"
    {
        "de_dust2"
        {
            "ct"    "../.mdl"
            "tt"    "../.mdl"
        }
        "default"
        {
            "ct"    "../.mdl"
            "tt"    "../.mdl"
        }
    }
}
Как-то примерно так
 

oleg_nelasy

Участник
Сообщения
664
Реакции
46
Просто я так захотел. Это не важно
Спасибо. Все работает.

kvSettings.GetString("ct", szCT, 256);
kvSettings.GetString("tt", szTT, 256);
Не подскажете можно сделать проверку от идиотов на соответствие пути или это нецелесообразно? Чтобы фаил по пути реально был если нет останавливал плагин ну и сообщение в лог?
 
Последнее редактирование:

Paranoiiik

хачю клиентмод
Сообщения
2,047
Реакции
1,490
Спасибо. Все работает.

kvSettings.GetString("ct", szCT, 256);
kvSettings.GetString("tt", szTT, 256);
Не подскажете можно сделать проверку от идиотов на соответствие пути или это нецелесообразно? Чтобы фаил по пути реально был если нет останавливал плагин ну и сообщение в лог?
Д фиг знает, if(StrContains(szCT, ".mdl", false) != -1), например.. надо в сторону DirectoryListing, наверное, смотреть, чтоб проверить, точно ли указанный файл лежит там.
То есть сначала смотрим, есть ли вообще что-то if(szCT[0]), после, для убедительности, смотрим, расширение модели указано ли if(StrContains(szCT, ".mdl", false) != -1), после ищем этот файл (но искать я не умею).
Можно проверить ещё if(!strncmp(szCT, "models/", 7, false)) что-то такое, чтобы чекнуть, что первые 7 символов в пути это models/
 
Последнее редактирование:

Rolzzandik

Участник
Сообщения
492
Реакции
234

oleg_nelasy

Участник
Сообщения
664
Реакции
46
Убрал GetMapDisplayName для записи полного пути карты это имеет значение. При проверке получаю sMap = workshop/125621707/aim_deagle7k
в конфиге
"workshop/125621707/aim_deagle7k"
{
"ct" "models/player/custom_player/legacy/ctm_fbi.mdl"
"t" "models/player/custom_player/legacy/tm_phoenix_variantb.mdl"
}
Но все равно попадаю на default. Проблема только с картами из воркшоп если брать обычные там все четко.

C-подобный:
char sMap[128];
    GetCurrentMap(sMap, sizeof sMap);
    //GetMapDisplayName(sMap, sMap, sizeof sMap);
 
    if(kvSettings.JumpToKey(sMap))
    {
        kvSettings.GetString("ct", szCT, 256);
        kvSettings.GetString("tt", szTT, 256);
    }
    else if(kvSettings.JumpToKey("default"))
    {
        kvSettings.GetString("ct", szCT, 256);
        kvSettings.GetString("tt", szTT, 256);
    }
 

Paranoiiik

хачю клиентмод
Сообщения
2,047
Реакции
1,490
Убрал GetMapDisplayName для записи полного пути карты это имеет значение. При проверке получаю sMap = workshop/125621707/aim_deagle7k
в конфиге
"workshop/125621707/aim_deagle7k"
{
"ct" "models/player/custom_player/legacy/ctm_fbi.mdl"
"t" "models/player/custom_player/legacy/tm_phoenix_variantb.mdl"
}
Но все равно попадаю на default. Проблема только с картами из воркшоп если брать обычные там все четко.

C-подобный:
char sMap[128];
    GetCurrentMap(sMap, sizeof sMap);
    //GetMapDisplayName(sMap, sMap, sizeof sMap);
 
    if(kvSettings.JumpToKey(sMap))
    {
        kvSettings.GetString("ct", szCT, 256);
        kvSettings.GetString("tt", szTT, 256);
    }
    else if(kvSettings.JumpToKey("default"))
    {
        kvSettings.GetString("ct", szCT, 256);
        kvSettings.GetString("tt", szTT, 256);
    }
Выведи в лог, что отдаёт GetCurrentMap, от этого отталкивайся. А, может, оно вообще, например, слеши прочесть не может
 

oleg_nelasy

Участник
Сообщения
664
Реакции
46
Выведи в лог, что отдаёт GetCurrentMap, от этого отталкивайся. А, может, оно вообще, например, слеши прочесть не может
Функция считывает все четко, результат проверки я писал выше. Подозреваю проблема в if(kvSettings.JumpToKey(sMap)), но как проверить что оно из конфига вытягивает?
 

Rolzzandik

Участник
Сообщения
492
Реакции
234
@Rolzzandik, оно не видит файлы в *.vpk, емнип
емае я чет не заметил, что в впк файлы лежат
но как проверить что оно из конфига вытягивает?
Проверить, попадает ли туда вообще выполнение (проходит ли проверку)
LogToFile("test.log", "im ok")
После if
файл появится в директории игры (у тя csgo по идее)
Ну или банальный
PrintToServer

Вообще лично я не люблю наличие / в сабкеях. Просто выглядит убого
Можно сделать так:
C-подобный:
char sMap[128];
GetCurrentMap(sMap, sizeof sMap);
if(StrContains(sMap, "/") != -1){
    char sExploded[3][64];
    ExplodeString(sMap, "/", sExploded, 3, 64)
}
//Теперь у нас в sExploded[2] название карты
Можно еще булеану впихнуть для тернарого ?, что бы потом в jumptokey юзать, но это все уже мои шизы
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,981
емае я чет не заметил, что в впк файлы лежат
например скины агентов или скины оружия, мало ли какую фигню в конфиг запихнули
Сообщения автоматически склеены:

проще вместо ExplodeString() сделать замену слэша на подчёркивание, например
Имя секции будет длинным, но будет читаться
 

oleg_nelasy

Участник
Сообщения
664
Реакции
46
Проверить, попадает ли туда вообще выполнение (проходит ли проверку)
LogToFile("test.log", "im ok")
После if
файл появится в директории игры (у тя csgo по идее)
Ну или банальный
PrintToServer
По результату видено что if(kvSettings.JumpToKey(sMap)) что условие не выполнилось и я попадаю в дефолт. Нужно понять что именно в этой строке происходит, может некоректно считывает слеши?

Вариант делать только название карты мне не подходит. В кс го воркшопе авторы любители делать одно и тоже название но карты разные и модели тоже разные. Поэтому надо считывать полное название. Может подскажите способ чтобы в sMap удалять слеши? Получить такой вид
workshop125621707aim_deagle7k
 
Последнее редактирование:
Сверху Снизу