Перезапись координат по ключу

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
775
Реакции
291
Помог
11 раз(а)
Доброго времени суток.
Интересует такой вопрос, каким образом можно переписать строку файла по ключу.
Допустим есть плагин, которому на 1 карте, нужна только одна точка для создания. Ради одной точки создавать файлик, не целесообразно.
Так, что к примеру фалик назовем spawn.ini
Ключом для координат, будем использовать название карты.
В итоге у нас получится файлик вида
Код:
# <Map Name> <Position X Y Z> <Angles X Y Z>
[de_dust2] -576.3 2146.5 -91.9 -5.3 176.3 0.0
[de_inferno] 2276.1 1952.2 116.0 -1.6 -130.6 0.0
[$2000$] -1031.0 1400.0 -143.9 0.0 -90.0 0.0
Сделать одну запись на карте у меня вышло, а вот куда идти чтобы если мне забожалось переписать эту точку, я понять не могу.
Т.е. я захожу на инферно и переписываю точку.

P.S. пока ковырялся схлопотал ошибку
Код:
L 06/28/2022 - 08:26:21: Invalid menu id 0(0)
L 06/28/2022 - 08:26:21: [AMXX] Displaying debug trace (plugin "scoord.amxx", version "1.0")
L 06/28/2022 - 08:26:21: [AMXX] Run time error 10: native error (native "menu_display")
L 06/28/2022 - 08:26:21: [AMXX]    [0] scoord.sma::SaveCoord (line 142)
Странно, ведь на 151 и 152 строке, id юзверя работает как нужно.

Пока могу пользоваться менюшкой, только при создании точки в первый раз.
А именно, захожу на карту, ну допустим de_nuke и создаю точку, следом перехожу на другую точку и жму клавишу создания точки.
Срабатывает нахождение по ключу, что говорит нам, о том что точка для карты уже существует и выскакивает меню
Где говорится, о том что точка у нас уже есть и точно ли мы хотим ее перезаписать
1. Да
2. Нет

0. Выход

Если же я жму 1, у меня меню просто закроется, я вызову его еще раз и так до бесконечности.
Если же я нажму 2, У меня снимается блокировка на запись точки и теперь после нажатия заветной кнопки я просто создаю далее кучу точек для этой карты,
А именно получаем файлик вида:
Код:
[de_dust2] -576.3 2146.5 -91.9 -5.3 176.3 0.0
[de_inferno] 2276.1 1952.2 116.0 -1.6 -130.6 0.0
[$2000$] -1031.0 1400.0 -143.9 0.0 -90.0 0.0
[de_nuke] 3296.2 -645.5 -315.9 0.0 180.0 0.0
[de_nuke] 2537.2 -476.7 -315.9 0.0 180.0 0.0
[de_nuke] 2487.2 -476.5 -315.9 0.0 180.0 0.0
[de_nuke] 2445.4 -476.4 -315.9 0.0 180.0 0.0
[de_nuke] 2403.7 -476.4 -315.9 0.0 180.0 0.0
[de_nuke] 2366.2 -476.3 -315.9 0.0 180.0 0.0
[de_nuke] 2032.9 -476.3 -315.9 0.0 180.0 0.0
[de_nuke] 1832.9 -476.3 -315.9 0.0 180.0 0.0
[de_nuke] 1687.2 -476.3 -315.9 0.0 180.0 0.0
[de_nuke] 1570.4 -476.3 -354.0 0.0 180.0 0.0
[de_nuke] 1487.2 -476.3 -379.9 0.0 180.0 0.0
[de_nuke] 1424.7 -476.3 -379.9 0.0 180.0 0.0
[de_nuke] 1378.7 -476.3 -379.9 0.0 180.0 0.0
[de_nuke] 1328.9 -476.3 -379.9 0.0 180.0 0.0
Перезашел на карту, меню теперь сыпет ошибки. (Может потому как я не убил его в конце карты)
Знатоки взываю к вам, я сломал себе уже всю голову, Да и глаз уже замылен, туплю

Код:
#include <amxmodx>
#include <reapi>

#define PLUGIN "Saving coordinates"
#define VERSION "1.0"
#define AUTHOR "maFFyoZZyk"

#define    MAX_COORDINATES            3

new const FOLDER_NAME[]    =        "spawns";                             // Папка в которой хранятся файлы с настройками для карт (Название файла будет идентично)
new const FILE_FORMAT[]    =        "ini";                                // Формат файлов

new g_iMenu;
new bool: g_bExists = false;
new Float: g_fOrigin[MAX_COORDINATES], Float: g_fAngles[MAX_COORDINATES];
new g_szFileName[MAX_PLAYERS*2], g_szMapName[MAX_PLAYERS];

public plugin_init ()
{
    register_plugin(PLUGIN, VERSION, AUTHOR);
    
    register_clcmd("nightvision", "SaveCoord", ADMIN_RCON, "Save coordinatesd");                                // Сохраняем координаты.
}

public plugin_cfg()
{
    get_log_path();

    rh_get_mapname(g_szMapName, charsmax(g_szMapName));
    log_to_file(g_szFileName, "Мы на карте %s", g_szMapName);

    new szPath[64], szLoadedConfig[96];
    get_localinfo("amxx_configsdir", szPath, charsmax(szPath));

    formatex(szLoadedConfig, charsmax(szLoadedConfig), "%s/%s/%s.%s", szPath, FOLDER_NAME, FOLDER_NAME, FILE_FORMAT);

    new szFilePointer = fopen(szLoadedConfig, "rt"); 
    if(szFilePointer)
    {
        new szBuffer[128], szMapName[32];
        new szArgPosX[8], szArgPosY[8], szArgPosZ[8];
        new szArgAngX[8], szArgAngY[8], szArgAngZ[8];

        while(!feof(szFilePointer))
        {
            fgets(szFilePointer, szBuffer, charsmax(szBuffer));
            trim(szBuffer);

            if(!(szBuffer[0]) || szBuffer[0] == ';' || szBuffer[0] == '#')
                continue;

            parse(szBuffer, szMapName, charsmax(szMapName),
                szArgPosX, charsmax(szArgPosX), szArgPosY, charsmax(szArgPosY), szArgPosZ, charsmax(szArgPosZ),
                szArgAngX, charsmax(szArgAngX), szArgAngY, charsmax(szArgAngY), szArgAngZ, charsmax(szArgAngZ)
            );

            if (contain(szBuffer, g_szMapName) != -1)
            {
                g_fOrigin[0] = str_to_float(szArgPosX);
                g_fOrigin[1] = str_to_float(szArgPosY);
                g_fOrigin[2] = str_to_float(szArgPosZ);

                g_fAngles[0] = str_to_float(szArgAngX);// + 5.0;
                g_fAngles[1] = str_to_float(szArgAngY);
                g_fAngles[2] = str_to_float(szArgAngZ);

                log_to_file(g_szFileName, "Считываем координаты на карте %s: X:%.1f | Y:%.1f | Z:%.1f", g_szMapName, g_fOrigin[0], g_fOrigin[1], g_fOrigin[2]);
                log_to_file(g_szFileName, "Считываем углы точки на карте %s: X:%.1f | Y:%.1f | Z:%.1f", g_szMapName, g_fAngles[0], g_fAngles[1], g_fAngles[2]);

                return;
            }
        }

        fclose(szFilePointer);
    }

    static szTitle[75], szKeyYes[75], szKeyNo[75], szKeyExit[75];

    formatex(szTitle,    charsmax(szTitle),    "%L", LANG_PLAYER, "MENU_TITLE");
    formatex(szKeyYes,    charsmax(szKeyYes),    "%L", LANG_PLAYER, "MENU_KEY_YES");
    formatex(szKeyNo,    charsmax(szKeyNo),    "%L", LANG_PLAYER, "MENU_KEY_NO");
    formatex(szKeyExit,    charsmax(szKeyNo),    "%L", LANG_PLAYER, "MENU_KEY_EXIT");

    new g_iMenu = menu_create(szTitle, "MenuHandler");
    menu_additem(g_iMenu, szKeyYes);
    menu_additem(g_iMenu, szKeyNo);
    menu_setprop(g_iMenu, MPROP_EXITNAME, szKeyExit);
    menu_setprop(g_iMenu, MPROP_EXIT, MEXIT_ALL);
}

public SaveCoord(id, level)
{
    if(!is_user_alive(id))
        return PLUGIN_CONTINUE;
    
    if(~get_user_flags(id) & level)
    {
        client_print(id, print_notify, "* Недостаточно прав для использования этой команды!");
        return PLUGIN_HANDLED;
    }
    
    new szFileDir[128], szBuffer[128];

    get_localinfo("amxx_configsdir", szFileDir, charsmax(szFileDir));

    formatex(szFileDir, charsmax(szFileDir), "%s/%s/", szFileDir,FOLDER_NAME);

    if(!dir_exists(szFileDir))
    {
        mkdir(szFileDir);
        log_to_file(g_szFileName, "Каталог [%s] - отсутсвует. Создаю новый", FOLDER_NAME);
    }

    formatex(szFileDir, charsmax(szFileDir), "%s/%s.%s", szFileDir, FOLDER_NAME, FILE_FORMAT);

    new szFilePointer = fopen(szFileDir, "rt");
    if(!szFilePointer)
    {
        formatex(szBuffer, charsmax(szBuffer), "\
            # File was created for %s.amxx^n\
            # Autor %s | Version number %s^n\
            # <Map Name> <Position X Y Z> <Angles X Y Z>^n\
            ^n",
            PLUGIN, AUTHOR, VERSION
        );
        write_file(szFileDir, szBuffer);
        log_to_file(g_szFileName, "Файл [%s.%s] - отсутсвует. Создаю новый", FOLDER_NAME, FILE_FORMAT);
    }
    else
    {       
        while (!feof(szFilePointer))
        {
            fgets(szFilePointer, szBuffer, sizeof(szBuffer) - 1)
            if(!szBuffer[0])
                continue;

            if (contain(szBuffer, g_szMapName) != -1)
            {
                log_to_file(g_szFileName, "Запись по карте [%s] - уже существует", g_szMapName);
                if(!g_bExists)
                {
                    menu_display(id, g_iMenu, 0);
                    log_to_file(g_szFileName, "Сделана перезапись координат на карте [%s]", g_szMapName);
                    return PLUGIN_CONTINUE;
                }
            }
        }

        // TODO: условие на уже существование данной строки
        new Float: fOrigin[MAX_COORDINATES], Float: fAngles[MAX_COORDINATES];
        get_entvar(id, var_origin, fOrigin);
        get_entvar(id, var_angles, fAngles);

        formatex(szBuffer, charsmax(szBuffer), "[%s] %.1f %.1f %.1f %.1f %.1f %.1f",
            g_szMapName, fOrigin[0], fOrigin[1], fOrigin[2],
            fAngles[0], fAngles[1], fAngles[2]   
        );

        log_to_file(g_szFileName,
            "Добавлена точка на карте [%s] с координатами X:%.1f | Y:%.1f | Z:%.1f",
            g_szMapName, fOrigin[0], fOrigin[1], fOrigin[2]
        );       
        log_to_file(g_szFileName,
            "Добавлены углы точки на карте [%s] с координатами X:%.1f | Y:%.1f | Z:%.1f",
            g_szMapName, fAngles[0], fAngles[1], fAngles[2]
        );

        write_file(szFileDir, szBuffer);
    }
    return PLUGIN_CONTINUE;
}
    
public MenuHandler(id, menu, item)
{
    if (item == MENU_EXIT) {
        return PLUGIN_CONTINUE;
    }

    switch (item)
    {
        case 0:
        {
            g_bExists = false;
            log_to_file(g_szFileName, "Администратор сделал перезапись координат");
        }
        case 1:
        {
            g_bExists = true;
            log_to_file(g_szFileName, "В перезаписи координат отказано Администратором");
        }
    }

    return PLUGIN_HANDLED;
}

get_log_path()
{
    new logsDir[64], DirName[64];
    get_localinfo("amxx_logs", logsDir, charsmax(logsDir));
    formatex(DirName, charsmax(DirName), "/%s", PLUGIN);
    add(logsDir, charsmax(logsDir), DirName);

    if(!dir_exists(logsDir))
        mkdir(logsDir);

    new logDate[24];
    get_time("%d%m%Y", logDate, charsmax(logDate));
    formatex(g_szFileName, charsmax(g_szFileName), "%s/%s.log", logsDir, logDate);
}
P.s. Понял что значение булевых в меню нужно поменять, с остальным пока не разберусь
 

Вложения

Сообщения
96
Реакции
69
Помог
1 раз(а)
Line 13: new g_iMenu;
Line 84: new g_iMenu = menu_create(szTitle, "MenuHandler");

Fix ( line 84, remove "new" ): g_iMenu = menu_create(szTitle, "MenuHandler");
 
Сообщения
775
Реакции
291
Помог
11 раз(а)
Shadows Adi, благодарю, ну говорю же глаз замылен, уже не вижу очевидного
 
Сообщения
775
Реакции
291
Помог
11 раз(а)
Komap, по факту, перенес создание меню на верх и все начало работать, без ошибок.
Спасибо что помогли решить причину ошибки. Но вопрос остается тем же
 
Сообщения
27
Реакции
17
Помог
2 раз(а)
maFFyoZZyk, как вариант - находишь номер строки с твоем ключем и для write_file указываешь номер строки :dntknw:
 
Сообщения
1,016
Реакции
818
Помог
10 раз(а)
Я думаю здесь будет удобнее изучить json например, и использовать его, ключом будет карта и в нем массив данных или объектов, которые так же можно искать по ключу, будет гораздо удобнее, имхо, парсить файл не придется "вручную", скажем так.
28 Июн 2022
Какие еще варианты: при старте карты парсить файл и искать ключ/карту, записать номер строки в переменную и при необходимости юзать write_file для перезаписи строки, кое она будет известно уже, в принципе выше уже сказали об этом
 
Сообщения
775
Реакции
291
Помог
11 раз(а)
Что я делаю не так?
Вот код, с моими последними манипуляциями

Код:
#include <amxmodx>
#include <reapi>

#define PLUGIN "Saving coordinates"
#define VERSION "1.0"
#define AUTHOR "maFFyoZZyk"

#define    MAX_COORDINATES            3

new const FOLDER_NAME[]    =        "spawns";                             // Папка в которой хранятся файлы с настройками для карт (Название файла будет идентично)
new const FILE_FORMAT[]    =        "ini";                                // Формат файлов

new g_iMenu;
new bool: g_bExists = false;
new Float: g_fOrigin[MAX_COORDINATES], Float: g_fAngles[MAX_COORDINATES];
new g_szFileName[MAX_PLAYERS*2], g_szMapName[MAX_PLAYERS];

public plugin_init ()
{
    register_plugin(PLUGIN, VERSION, AUTHOR);
    
    register_clcmd("nightvision", "SaveCoord", ADMIN_RCON, "Save coordinatesd");                                // Сохраняем координаты.
}

public plugin_cfg()
{
    get_log_path();

    static szTitle[75], szKeyYes[75], szKeyNo[75], szKeyExit[75];

    formatex(szTitle,    charsmax(szTitle),    "%L", LANG_PLAYER, "MENU_TITLE");
    formatex(szKeyYes,    charsmax(szKeyYes),    "%L", LANG_PLAYER, "MENU_KEY_YES");
    formatex(szKeyNo,    charsmax(szKeyNo),    "%L", LANG_PLAYER, "MENU_KEY_NO");
    formatex(szKeyExit,    charsmax(szKeyNo),    "%L", LANG_PLAYER, "MENU_KEY_EXIT");

    g_iMenu = menu_create(szTitle, "MenuHandler");
    menu_additem(g_iMenu, szKeyYes);
    menu_additem(g_iMenu, szKeyNo);
    menu_setprop(g_iMenu, MPROP_EXITNAME, szKeyExit);
    menu_setprop(g_iMenu, MPROP_EXIT, MEXIT_ALL);

    rh_get_mapname(g_szMapName, charsmax(g_szMapName));
    log_to_file(g_szFileName, "Мы на карте %s", g_szMapName);

    new szPath[64], szLoadedConfig[96];
    get_localinfo("amxx_configsdir", szPath, charsmax(szPath));

    formatex(szLoadedConfig, charsmax(szLoadedConfig), "%s/%s/%s.%s", szPath, FOLDER_NAME, FOLDER_NAME, FILE_FORMAT);

    new szFilePointer = fopen(szLoadedConfig, "rt"); 
    if(szFilePointer)
    {
        new szBuffer[128], szMapName[32];
        new szArgPosX[8], szArgPosY[8], szArgPosZ[8];
        new szArgAngX[8], szArgAngY[8], szArgAngZ[8];

        while(!feof(szFilePointer))
        {
            fgets(szFilePointer, szBuffer, charsmax(szBuffer));
            trim(szBuffer);

            if(!(szBuffer[0]) || szBuffer[0] == ';' || szBuffer[0] == '#')
                continue;

            parse(szBuffer, szMapName, charsmax(szMapName),
                szArgPosX, charsmax(szArgPosX), szArgPosY, charsmax(szArgPosY), szArgPosZ, charsmax(szArgPosZ),
                szArgAngX, charsmax(szArgAngX), szArgAngY, charsmax(szArgAngY), szArgAngZ, charsmax(szArgAngZ)
            );

            if (contain(szBuffer, g_szMapName) != -1)
            {
                g_fOrigin[0] = str_to_float(szArgPosX);
                g_fOrigin[1] = str_to_float(szArgPosY);
                g_fOrigin[2] = str_to_float(szArgPosZ);

                g_fAngles[0] = str_to_float(szArgAngX);// + 5.0;
                g_fAngles[1] = str_to_float(szArgAngY);
                g_fAngles[2] = str_to_float(szArgAngZ);

                log_to_file(g_szFileName, "Считываем координаты на карте %s: X:%.1f | Y:%.1f | Z:%.1f", g_szMapName, g_fOrigin[0], g_fOrigin[1], g_fOrigin[2]);
                log_to_file(g_szFileName, "Считываем углы точки на карте %s: X:%.1f | Y:%.1f | Z:%.1f", g_szMapName, g_fAngles[0], g_fAngles[1], g_fAngles[2]);

                return;
            }
            else log_to_file(g_szFileName, "Точек для карты %s - не существует", g_szMapName);
        }

        fclose(szFilePointer);
    }
}

public SaveCoord(id, level)
{
    if(!is_user_alive(id))
        return PLUGIN_CONTINUE;
    
    if(~get_user_flags(id) & level)
    {
        client_print(id, print_notify, "* Недостаточно прав для использования этой команды!");
        return PLUGIN_HANDLED;
    }
    
    new szFileDir[128], szBuffer[128];
    new Float: fOrigin[MAX_COORDINATES], Float: fAngles[MAX_COORDINATES];
    
    get_localinfo("amxx_configsdir", szFileDir, charsmax(szFileDir));

    formatex(szFileDir, charsmax(szFileDir), "%s/%s/", szFileDir,FOLDER_NAME);

    if(!dir_exists(szFileDir))
    {
        mkdir(szFileDir);
        log_to_file(g_szFileName, "Каталог [%s] - отсутсвует. Создаю новый", FOLDER_NAME);
    }

    formatex(szFileDir, charsmax(szFileDir), "%s/%s.%s", szFileDir, FOLDER_NAME, FILE_FORMAT);

    new szFilePointer = fopen(szFileDir, "rt");
    if(!szFilePointer)
    {
        formatex(szBuffer, charsmax(szBuffer), "\
            # File was created for %s.amxx^n\
            # Autor %s | Version number %s^n\
            # <Map Name> <Position X Y Z> <Angles X Y Z>^n\
            ^n",
            PLUGIN, AUTHOR, VERSION
        );
        write_file(szFileDir, szBuffer);
        log_to_file(g_szFileName, "Файл [%s.%s] - отсутсвует. Создаю новый", FOLDER_NAME, FILE_FORMAT);
    }
    else
    {   
        new i_LineCount, null;

        while (read_file(szFileDir, i_LineCount++, szBuffer, charsmax(szBuffer), null))
        {
            // fgets(szFilePointer, szBuffer, sizeof(szBuffer) - 1)
            
            if(!szBuffer[0])
                continue;

            if (contain(szBuffer, g_szMapName) != -1)
            {
                log_to_file(g_szFileName, "Запись по карте [%s] - уже существует", g_szMapName);
                if(!g_bExists)
                {
                    menu_display(id, g_iMenu, 0);
                    log_to_file(g_szFileName, "Открываем меню для перезаписи координат, на карте [%s]", g_szMapName);
                    log_to_file(g_szFileName, "Номер строки [%d]", i_LineCount);
                    return PLUGIN_CONTINUE;
                }
            }
        }

        get_entvar(id, var_origin, fOrigin);
        get_entvar(id, var_angles, fAngles);
        
        formatex(szBuffer, charsmax(szBuffer), "[%s] %.1f %.1f %.1f %.1f %.1f %.1f",
            g_szMapName, fOrigin[0], fOrigin[1], fOrigin[2],
            fAngles[0], fAngles[1], fAngles[2]   
        );

        log_to_file(g_szFileName,
            "Добавлена точка на карте [%s] с координатами X:%.1f | Y:%.1f | Z:%.1f",
            g_szMapName, fOrigin[0], fOrigin[1], fOrigin[2]
        );       
        log_to_file(g_szFileName,
            "Добавлены углы точки на карте [%s] с координатами X:%.1f | Y:%.1f | Z:%.1f",
            g_szMapName, fAngles[0], fAngles[1], fAngles[2]
        );
        
        if(g_bExists)
        {
            write_file(szFileDir, szBuffer, i_LineCount);
        }
        else write_file(szFileDir, szBuffer);
        
        g_bExists = false;
    }
    return PLUGIN_CONTINUE;
}
    
public MenuHandler(id, menu, item)
{
    if (item == MENU_EXIT) {
        return PLUGIN_CONTINUE;
    }

    switch (item)
    {
        case 0:
        {
            g_bExists = true;
            SaveCoord(id, ADMIN_RCON);
            log_to_file(g_szFileName, "Администратор сделал перезапись координат");
            
        }
        case 1:
        {
            g_bExists = false;
            log_to_file(g_szFileName, "В перезаписи координат отказано Администратором");
        }
    }
    return PLUGIN_HANDLED;
}

public plugin_end() {
    menu_destroy(g_iMenu);
}
get_log_path()
{
    new logsDir[64], DirName[64];
    get_localinfo("amxx_logs", logsDir, charsmax(logsDir));
    formatex(DirName, charsmax(DirName), "/%s", PLUGIN);
    add(logsDir, charsmax(logsDir), DirName);

    if(!dir_exists(logsDir))
        mkdir(logsDir);

    new logDate[24];
    get_time("%d%m%Y", logDate, charsmax(logDate));
    formatex(g_szFileName, charsmax(g_szFileName), "%s/%s.log", logsDir, logDate);
}
лог

Код:
L 06/28/2022 - 22:52:29: Добавлена точка на карте [$2000$] с координатами X:-903.0 | Y:1272.0 | Z:-143.9
L 06/28/2022 - 22:52:29: Добавлены углы точки на карте [$2000$] с координатами X:0.0 | Y:90.0 | Z:0.0
L 06/28/2022 - 22:52:29: Администратор сделал перезапись координат
L 06/28/2022 - 22:52:29: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:29: Открываем меню для перезаписи координат, на карте [$2000$]
L 06/28/2022 - 22:52:29: Номер строки [5]
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Добавлена точка на карте [$2000$] с координатами X:-903.0 | Y:1272.0 | Z:-143.9
L 06/28/2022 - 22:52:30: Добавлены углы точки на карте [$2000$] с координатами X:0.0 | Y:90.0 | Z:0.0
L 06/28/2022 - 22:52:30: Администратор сделал перезапись координат
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Открываем меню для перезаписи координат, на карте [$2000$]
L 06/28/2022 - 22:52:30: Номер строки [5]
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Запись по карте [$2000$] - уже существует
L 06/28/2022 - 22:52:30: Добавлена точка на карте [$2000$] с координатами X:-903.0 | Y:1272.0 | Z:-143.9
L 06/28/2022 - 22:52:30: Добавлены углы точки на карте [$2000$] с координатами X:0.0 | Y:90.0 | Z:0.0
L 06/28/2022 - 22:52:30: Администратор сделал перезапись координат
Файл с данными
Код:
# File was created for Saving coordinates.amxx
# Autor maFFyoZZyk | Version number 1.0
# <Map Name> <Position X Y Z> <Angles X

[$2000$] -747.5 1451.7 -143.9 -3.4 -22.4 0.0
[de_inferno] 1969.1 2713.6 164.0 0.0 180.0 0.0
[de_inferno] 2400.0 2464.0 116.0 0.0 180.0 0.0
[$2000$] -903.0 1272.0 -143.9 0.0 90.0 0.0

[$2000$] -1031.0 1400.0 -143.9 0.0 -90.4 0.0

[de_inferno] 2400.0 2464.0 116.0 0.0 180.0 0.0

[$2000$] -903.0 1272.0 -143.9 0.0 90.0 0.0

[$2000$] -903.0 1272.0 -143.9 0.0 90.0 0.0

[$2000$] -644.0 252.0 -143.9 0.0 -90.0 0.0

[$2000$] -644.0 252.0 -143.9 0.0 -90.0 0.0

[$2000$] -903.0 1272.0 -143.9 0.0 90.0 0.0

[$2000$] -903.0 1272.0 -143.9 0.0 90.0 0.0

[$2000$] -903.0 1272.0 -143.9 0.0 90.0 0.0

[$2000$] -903.0 1272.0 -143.9 0.0 90.0 0.0

[$2000$] -903.0 1272.0 -143.9 0.0 90.0 0.0

[$2000$] -903.0 1272.0 -143.9 0.0 90.0 0.0

[$2000$] -903.0 1272.0 -143.9 0.0 90.0 0.0

[$2000$] -903.0 1272.0 -143.9 0.0 90.0 0.0

[$2000$] -903.0 1272.0 -143.9 0.0 90.0 0.0

[$2000$] -903.0 1272.0 -143.9 0.0 90.0 0.0

[$2000$] -903.0 1272.0 -143.9 0.0 90.0 0.0
При чем пробелы стал после манипуляций тыкать

(Починил сохранение точки после выбора результата, добавив)
Код:
        case 0:
        {
            g_bExists = true;
            SaveCoord(id, ADMIN_RCON);
            log_to_file(g_szFileName, "Администратор сделал перезапись координат");
            
        }
 
Сообщения
27
Реакции
17
Помог
2 раз(а)
Попробуй так

C-like:
#include <amxmodx>
#include <reapi>

#define PLUGIN "Saving coordinates"
#define VERSION "1.0"
#define AUTHOR "maFFyoZZyk"

#define    MAX_COORDINATES            3

new const FOLDER_NAME[]    =        "spawns";                             // Папка в которой хранятся файлы с настройками для карт (Название файла будет идентично)
new const FILE_FORMAT[]    =        "ini";                                // Формат файлов

new g_iMenu;
new bool: g_bExists = false;
new Float: g_fOrigin[MAX_COORDINATES], Float: g_fAngles[MAX_COORDINATES];
new g_szFileName[MAX_PLAYERS*2], g_szMapName[MAX_PLAYERS];

public plugin_init ()
{
    register_plugin(PLUGIN, VERSION, AUTHOR);
    
    register_clcmd("nightvision", "SaveCoord", ADMIN_RCON, "Save coordinatesd");                                // Сохраняем координаты.
}

public plugin_cfg()
{
    get_log_path();

    static szTitle[75], szKeyYes[75], szKeyNo[75], szKeyExit[75];

    formatex(szTitle,    charsmax(szTitle),    "%L", LANG_PLAYER, "MENU_TITLE");
    formatex(szKeyYes,    charsmax(szKeyYes),    "%L", LANG_PLAYER, "MENU_KEY_YES");
    formatex(szKeyNo,    charsmax(szKeyNo),    "%L", LANG_PLAYER, "MENU_KEY_NO");
    formatex(szKeyExit,    charsmax(szKeyNo),    "%L", LANG_PLAYER, "MENU_KEY_EXIT");

    g_iMenu = menu_create(szTitle, "MenuHandler");
    menu_additem(g_iMenu, szKeyYes);
    menu_additem(g_iMenu, szKeyNo);
    menu_setprop(g_iMenu, MPROP_EXITNAME, szKeyExit);
    menu_setprop(g_iMenu, MPROP_EXIT, MEXIT_ALL);

    rh_get_mapname(g_szMapName, charsmax(g_szMapName));
    log_to_file(g_szFileName, "Мы на карте %s", g_szMapName);

    new szPath[64], szLoadedConfig[96];
    get_localinfo("amxx_configsdir", szPath, charsmax(szPath));

    formatex(szLoadedConfig, charsmax(szLoadedConfig), "%s/%s/%s.%s", szPath, FOLDER_NAME, FOLDER_NAME, FILE_FORMAT);

    new szFilePointer = fopen(szLoadedConfig, "rt");
    if(szFilePointer)
    {
        new szBuffer[128], szMapName[32];
        new szArgPosX[8], szArgPosY[8], szArgPosZ[8];
        new szArgAngX[8], szArgAngY[8], szArgAngZ[8];

        while(!feof(szFilePointer))
        {
            fgets(szFilePointer, szBuffer, charsmax(szBuffer));
            trim(szBuffer);

            if(!(szBuffer[0]) || szBuffer[0] == ';' || szBuffer[0] == '#')
                continue;

            parse(szBuffer, szMapName, charsmax(szMapName),
                szArgPosX, charsmax(szArgPosX), szArgPosY, charsmax(szArgPosY), szArgPosZ, charsmax(szArgPosZ),
                szArgAngX, charsmax(szArgAngX), szArgAngY, charsmax(szArgAngY), szArgAngZ, charsmax(szArgAngZ)
            );

            if (contain(szBuffer, g_szMapName) != -1)
            {
                g_fOrigin[0] = str_to_float(szArgPosX);
                g_fOrigin[1] = str_to_float(szArgPosY);
                g_fOrigin[2] = str_to_float(szArgPosZ);

                g_fAngles[0] = str_to_float(szArgAngX);// + 5.0;
                g_fAngles[1] = str_to_float(szArgAngY);
                g_fAngles[2] = str_to_float(szArgAngZ);

                log_to_file(g_szFileName, "Считываем координаты на карте %s: X:%.1f | Y:%.1f | Z:%.1f", g_szMapName, g_fOrigin[0], g_fOrigin[1], g_fOrigin[2]);
                log_to_file(g_szFileName, "Считываем углы точки на карте %s: X:%.1f | Y:%.1f | Z:%.1f", g_szMapName, g_fAngles[0], g_fAngles[1], g_fAngles[2]);

                return;
            }
            else log_to_file(g_szFileName, "Точек для карты %s - не существует", g_szMapName);
        }

        fclose(szFilePointer);
    }
}

public SaveCoord(id, level)
{
    if(!is_user_alive(id))
        return PLUGIN_CONTINUE;
    
    if(~get_user_flags(id) & level)
    {
        client_print(id, print_notify, "* Недостаточно прав для использования этой команды!");
        return PLUGIN_HANDLED;
    }
    
    new szFileDir[128], szBuffer[128];
    new Float: fOrigin[MAX_COORDINATES], Float: fAngles[MAX_COORDINATES];
    
    get_localinfo("amxx_configsdir", szFileDir, charsmax(szFileDir));

    formatex(szFileDir, charsmax(szFileDir), "%s/%s/", szFileDir,FOLDER_NAME);

    if(!dir_exists(szFileDir))
    {
        mkdir(szFileDir);
        log_to_file(g_szFileName, "Каталог [%s] - отсутсвует. Создаю новый", FOLDER_NAME);
    }

    formatex(szFileDir, charsmax(szFileDir), "%s/%s.%s", szFileDir, FOLDER_NAME, FILE_FORMAT);

    new szFilePointer = fopen(szFileDir, "rt");
    if(!szFilePointer)
    {
        formatex(szBuffer, charsmax(szBuffer), "\
            # File was created for %s.amxx^n\
            # Autor %s | Version number %s^n\
            # <Map Name> <Position X Y Z> <Angles X Y Z>^n\
            ^n",
            PLUGIN, AUTHOR, VERSION
        );
        write_file(szFileDir, szBuffer);
        log_to_file(g_szFileName, "Файл [%s.%s] - отсутсвует. Создаю новый", FOLDER_NAME, FILE_FORMAT);
    }
    else
    {   
        new i_LineCount, null;

        while (read_file(szFileDir, i_LineCount++, szBuffer, charsmax(szBuffer), null))
        {
            // fgets(szFilePointer, szBuffer, sizeof(szBuffer) - 1)
            
            if(!szBuffer[0])
                continue;

            if (contain(szBuffer, g_szMapName) != -1)
            {
                log_to_file(g_szFileName, "Запись по карте [%s] - уже существует", g_szMapName);
                if(g_bExists)
                    break;
                    
                if(!g_bExists)
                {
                    menu_display(id, g_iMenu, 0);
                    log_to_file(g_szFileName, "Открываем меню для перезаписи координат, на карте [%s]", g_szMapName);
                    log_to_file(g_szFileName, "Номер строки [%d]", i_LineCount);
                    return PLUGIN_CONTINUE;
                }
            }
        }

        get_entvar(id, var_origin, fOrigin);
        get_entvar(id, var_angles, fAngles);
        
        formatex(szBuffer, charsmax(szBuffer), "[%s] %.1f %.1f %.1f %.1f %.1f %.1f",
            g_szMapName, fOrigin[0], fOrigin[1], fOrigin[2],
            fAngles[0], fAngles[1], fAngles[2]   
        );

        log_to_file(g_szFileName,
            "Добавлена точка на карте [%s] с координатами X:%.1f | Y:%.1f | Z:%.1f",
            g_szMapName, fOrigin[0], fOrigin[1], fOrigin[2]
        );       
        log_to_file(g_szFileName,
            "Добавлены углы точки на карте [%s] с координатами X:%.1f | Y:%.1f | Z:%.1f",
            g_szMapName, fAngles[0], fAngles[1], fAngles[2]
        );
        
        if(g_bExists)
        {
            write_file(szFileDir, szBuffer, i_LineCount);
        }
        else write_file(szFileDir, szBuffer);
        
        g_bExists = false;
    }
    return PLUGIN_CONTINUE;
}
    
public MenuHandler(id, menu, item)
{
    if (item == MENU_EXIT) {
        return PLUGIN_CONTINUE;
    }

    switch (item)
    {
        case 0:
        {
            g_bExists = true;
            SaveCoord(id, ADMIN_RCON);
            log_to_file(g_szFileName, "Администратор сделал перезапись координат");
            
        }
        case 1:
        {
            g_bExists = false;
            log_to_file(g_szFileName, "В перезаписи координат отказано Администратором");
        }
    }
    return PLUGIN_HANDLED;
}

public plugin_end() {
    menu_destroy(g_iMenu);
}
get_log_path()
{
    new logsDir[64], DirName[64];
    get_localinfo("amxx_logs", logsDir, charsmax(logsDir));
    formatex(DirName, charsmax(DirName), "/%s", PLUGIN);
    add(logsDir, charsmax(logsDir), DirName);

    if(!dir_exists(logsDir))
        mkdir(logsDir);

    new logDate[24];
    get_time("%d%m%Y", logDate, charsmax(logDate));
    formatex(g_szFileName, charsmax(g_szFileName), "%s/%s.log", logsDir, logDate);
}
 
Сообщения
775
Реакции
291
Помог
11 раз(а)
Komap, Попробовал, все изумительно, кроме одного.
Код:
# File was created for Saving coordinates.amxx
# Autor maFFyoZZyk | Version number 1.0
# <Map Name> <Position X Y Z> <Angles X
[$2000$] -1031.0 1400.0 -143.9 0.0 -90.0 0.0
[$2000$] -371.9 442.5 -143.9 -2.4 -87.6 0.0
[de_dust2] 1168.8 2181.6 36.0 1.8 5.2 0.0
[de_dust2] 1473.9 1236.2 36.0 1.8 5.2 0.0
[de_inferno] 2241.9 2560.5 134.7 -4.3 150.4 0.0
[de_inferno] 432.7 2031.9 164.0 -0.9 -109.6 0.0
Перезапись работает, только пишет он 2 строчки
 
Сообщения
678
Реакции
56
Помог
16 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
maFFyoZZyk, наверное потому что эти две строчки это два разных значения?)
Код:
log_to_file(g_szFileName, "Считываем координаты на карте %s: X:%.1f | Y:%.1f | Z:%.1f", g_szMapName, g_fOrigin[0], g_fOrigin[1], g_fOrigin[2]);
log_to_file(g_szFileName, "Считываем углы точки на карте %s: X:%.1f | Y:%.1f | Z:%.1f", g_szMapName, g_fAngles[0], g_fAngles[1], g_fAngles[2]);
 
Сообщения
678
Реакции
56
Помог
16 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
maFFyoZZyk, log_to_file у тебя понатыканы везде и вся... Убери то что тебе не нужно и думаю со второй строчкой проблема решится.
 
Сообщения
775
Реакции
291
Помог
11 раз(а)
Как-то странно... С каким скриптером, не начни разговор, ответ будет прост:" Не получается? Логируй". А тут наоборот.... Убери... Ну сколько людей, столько и мнений. Спасибо за подсказку. Данный вариант решения задачи, не подходит
 
Сообщения
678
Реакции
56
Помог
16 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
maFFyoZZyk, когда логируют - дебажат, а что-то где-то поменять/закомментить и тупо чисто банально проверить - не тяжко, тем более ты написал, что всё работает.)
Вроде ясно всё написано что и как сохраняется...
1656482894694.png
29 Июн 2022
Либо старые знаения идут, а уж потом новые, я не вникал особо ибо с телефона не оч.
 
Сообщения
775
Реакции
291
Помог
11 раз(а)
Komap, либо наверное изначально переменную приравнять к нулю. Тоже как вариант. Спасибо тебе за помощь, дома буду, испробую и о результатах напишу
 
Сообщения
580
Реакции
338
Предупреждения
1
Помог
9 раз(а)
maFFyoZZyk, не слушай его, он ничего не понимает
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу