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

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
775
Реакции
291
Помог
11 раз(а)
Komap, write_file(szFileDir, szBuffer, i_LineCount - 1); - работает, но как-то хардкорно
29 Июн 2022
Все, разобрался... огромное спасибо Javekson , который все разжевал
29 Июн 2022
Komap, ты прав. В случае, когда read_file(szFileDir, i_LineCount++, szBuffer, charsmax(szBuffer), null) счетчик в условии, результат будет на 1 больше и твой вариант write_file(szFileDir, szBuffer, i_LineCount - 1); - самое оптимальное решение. Чтобы так не хардкорить, пихаем счетчик внутрь цикла и получаем нужный результат
29 Июн 2022
Код:
#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 = 0, 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;
                }
            }
           
            i_LineCount++;
        }

        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);
}
Финальная рабочая версия. Возможно кому-то поможет координаты сохранять.
Огромная благодарность Komap, Javekson, Shadows Adi
 
Последнее редактирование:
Сообщения
576
Реакции
1,003
Помог
18 раз(а)
maFFyoZZyk,
Код:
new szFilePointer = fopen(szFileDir, "rt");
if(!szFilePointer)
что это и где оно потом закрывается?
 
Сообщения
775
Реакции
291
Помог
11 раз(а)
Mistrick, Благодарю.


Код:
#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 = 0, null;

        while (read_file(szFileDir, i_LineCount, szBuffer, charsmax(szBuffer), null))
        {   
            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;
                }
            }
            
            i_LineCount++;
        }

        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;
    }
    fclose(szFilePointer);
    
    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 раз(а)
Если советов или замечаний больше нет, тему можно закрывать. Всем спасибо.
 
Сообщения
775
Реакции
291
Помог
11 раз(а)
Начал подгружать данный код в плагин и начал падать сервер. Пока не добавил на 137 строку
fgets(szFilePointer, szBuffer, sizeof(szBuffer) - 1);
 
Сообщения
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 iLineCount;
        
        while (!feof(szFilePointer))
        {
            fgets(szFilePointer, szBuffer, charsmax(szBuffer));
            if(!szBuffer[0]) 
                continue;

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

        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, iLineCount);
        else 
            write_file(szFileDir, szBuffer);
        
        g_bExists = false;
    }
    fclose(szFilePointer);
    
    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);
}

Для интеграции в другой плагин, лучше использовать этот код.
Изменил условие цикла, а именно использовал функцию feof
В цикле использовал fgets и счетчик.
Запись оставил так же, через write_file

Решение найдено, тему можно закрывать
 
Сообщения
271
Реакции
347
Помог
15 раз(а)
maFFyoZZyk, если проверка на 70 строке выполнится, то функция завершится и файл не закроется. Нужно использовать break, а не return. Тоже самое с ретурном и в другом месте.
 
Статус
В этой теме нельзя размещать новые ответы.

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

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