Получить char из ArrayList и KeyValues

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
Здравствуйте, хочу сделать легкий чат бот, но не могу получить строку, только целые числа.
Реализация в плагине Simple Chatter Bot не нравится.
Хочу по ключу получить строковое значение.
C-подобный:
#pragma semicolon 1

ArrayList hVopros, hOtvet;

public void OnPluginStart()
{
    HookEvent("player_say", player_say);

    char szPath[256];
    BuildPath(Path_SM, szPath, sizeof(szPath), "data/botforchat.ini"); // Формируем путь к файлу
    KeyValues hKeyValues = new KeyValues("botforchat");
    if(!(hKeyValues.ImportFromFile(szPath))) SetFailState("Не удалось загрузить файл конфигурации '%s'.", szPath); // Загружаем из файла

    hVopros = new ArrayList(ByteCountToCells(256));
    hOtvet = new ArrayList();

    if(hKeyValues.GotoFirstSubKey(false))
    {
        do
        {
            if(hKeyValues.GetSectionName(szPath, sizeof(szPath)))
            {
                hVopros.PushString(szPath);
                hOtvet.Push(hKeyValues.GetNum(NULL_STRING));
                // hOtvet.PushString(hKeyValues.GetString(NULL_STRING)); // Не работает, ошибка
            }
        }
        while(hKeyValues.GotoNextKey(false));
    }
    delete hKeyValues;

    if(!hVopros.Length)
    {
        delete hVopros;
        delete hOtvet;
    }
}

public void player_say(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));

    char text[256];
    GetEventString(hEvent, "text", text, sizeof(text));
    char iNum;
    if((iNum = hVopros.FindString(text)) != -1)
    {
        PrintToChat(iClient, "%s |", hOtvet.GetString(iNum, text, sizeof(text))); //Не отображается не чего кроме |
        PrintToChat(iClient, "%d |", hOtvet.Get(iNum)); //Отображает число
    }
}
 
Решение
// hOtvet.PushString(hKeyValues.GetString(NULL_STRING)); // Не работает, ошибка
Потому что строки не так работают в Павне.
Строки - массивы символов, их функции возвращать напрямую не могут, если размер заранее неизвестен. KeyValues.GetString() не знает размер строки, потому хочет буфер на вход:
C-подобный:
char szBuffer[128];

hKeyValues.GetString(NULL_STRING, szBuffer, sizeof(szBuffer));
hOtvet.PushString(szBuffer);

RudikS

Участник
Сообщения
130
Реакции
61
Здравствуйте, хочу сделать легкий чат бот, но не могу получить строку, только целые числа.
Реализация в плагине Simple Chatter Bot не нравится.
Хочу по ключу получить строковое значение.
C-подобный:
#pragma semicolon 1

ArrayList hVopros, hOtvet;

public void OnPluginStart()
{
    HookEvent("player_say", player_say);

    char szPath[256];
    BuildPath(Path_SM, szPath, sizeof(szPath), "data/botforchat.ini"); // Формируем путь к файлу
    KeyValues hKeyValues = new KeyValues("botforchat");
    if(!(hKeyValues.ImportFromFile(szPath))) SetFailState("Не удалось загрузить файл конфигурации '%s'.", szPath); // Загружаем из файла

    hVopros = new ArrayList(ByteCountToCells(256));
    hOtvet = new ArrayList();

    if(hKeyValues.GotoFirstSubKey(false))
    {
        do
        {
            if(hKeyValues.GetSectionName(szPath, sizeof(szPath)))
            {
                hVopros.PushString(szPath);
                hOtvet.Push(hKeyValues.GetNum(NULL_STRING));
                // hOtvet.PushString(hKeyValues.GetString(NULL_STRING)); // Не работает, ошибка
            }
        }
        while(hKeyValues.GotoNextKey(false));
    }
    delete hKeyValues;

    if(!hVopros.Length)
    {
        delete hVopros;
        delete hOtvet;
    }
}

public void player_say(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));

    char text[256];
    GetEventString(hEvent, "text", text, sizeof(text));
    char iNum;
    if((iNum = hVopros.FindString(text)) != -1)
    {
     
[/SPOILER]
[/QUOTE]
[CODE]hOtvet.GetString(iNum, text, sizeof(text))
PrintToChat(iClient, "%s |", text); //Не отображается не чего кроме |
PrintToChat(iClient, "%d |", hOtvet.Get(iNum)); //Отображает число
}
}
[/CODE]
C-подобный:
hOtvet.GetString(iNum, text, sizeof(text))
PrintToChat(iClient, "%s |", text); //Не отображается не чего кроме |
 

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
@RudikS, У меня меняется цвет ' | ', строчки в файле у меня такие:
"botforchat"
{
"hi" "hhh"
"пр" "4hi"
"qw" "3пр"
"йц" "6тт"
}
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #4
// hOtvet.PushString(hKeyValues.GetString(NULL_STRING)); // Не работает, ошибка
Потому что строки не так работают в Павне.
Строки - массивы символов, их функции возвращать напрямую не могут, если размер заранее неизвестен. KeyValues.GetString() не знает размер строки, потому хочет буфер на вход:
C-подобный:
char szBuffer[128];

hKeyValues.GetString(NULL_STRING, szBuffer, sizeof(szBuffer));
hOtvet.PushString(szBuffer);
 
Решение

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
@Kruzya, Почему то получаю только первые 3 символа, как так?
C-подобный:
ArrayList hVopros, hOtvet;

public void OnPluginStart()
{
    HookEvent("player_say", player_say);

    char szPath[256];
    BuildPath(Path_SM, szPath, sizeof(szPath), "data/botforchat.ini");
    KeyValues hKeyValues = new KeyValues("botforchat");
    if(!(hKeyValues.ImportFromFile(szPath))) SetFailState("Не удалось загрузить файл конфигурации '%s'.", szPath);

    hVopros = new ArrayList(ByteCountToCells(256));
    hOtvet = new ArrayList();

    if(hKeyValues.GotoFirstSubKey(false))
    {
        do
        {
            if(hKeyValues.GetSectionName(szPath, sizeof(szPath)))
            {
                hVopros.PushString(szPath);
                char szBuffer[256];
                hKeyValues.GetString(NULL_STRING, szBuffer, sizeof(szBuffer));
                hOtvet.PushString(szBuffer);
            }
        }
        while(hKeyValues.GotoNextKey(false));
    }
    delete hKeyValues;

    if(!hVopros.Length)
    {
        delete hVopros;
        delete hOtvet;
    }
}

public void player_say(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));

    char text[256];
    GetEventString(hEvent, "text", text, sizeof(text));
    char iNum;
    if((iNum = hVopros.FindString(text)) != -1)
    {
        hOtvet.GetString(iNum, text, sizeof(text));
        PrintToChat(iClient, "%s", text);
    }
}


C-подобный:
"botforchat"
{
    "Привет"                    "BOT Привет!"
    "Кто админ?"                "KiKiEEKi, AZAZA"
    "Сколько стоит вип?"        "BOT 100 рублей"
    "Группа вк"                    "vk.com/ofaystrike"
    "Скиньте вк админа"            "vk.com/kikieeki"
    "бот кто кто главный?"        "ADMIN123"
    "Бот какие команды есть?"    "!rs, !res, !vk, !roll, !viptest, !jump, !rpg, !wcs"
}
 
Сверху Снизу