Русское сообщество по скриптингу

get_configsdir, не читает файл  [Решено]

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

get_configsdir, не читает файл

Сообщение DoNotFollowMe » 13 янв 2017, 13:29

Пытаюсь разобраться с чтение файлов, и не могу понять.
Если использую get_configsdir, то файл не читается. Если путь вручную пишу, то все пашет.
Код: Выделить всё
#include <amxmodx>
#include <amxmisc>

//#define cfgPatch "addons\amxmodx\configs\test.ini"

new bool:BlockMaps;

public plugin_init()
{
    register_plugin("ini", "1.0", "IIPU3PAK")
    
    register_clcmd
("test", "func")
}

public plugin_precache()
{
    new cfgPatch[64], fMapName[400], getMapName[32], fSize, len;
    get_mapname(getMapName, 31);
    
    get_configsdir
(cfgPatch, 63)
    server_cmd("exec %s/test.ini", cfgPatch)
    
    fSize 
= file_size(cfgPatch, 1);
    
    if
(!file_exists(cfgPatch)) return;
    for(new line; line < fSize; line++)
    {
        read_file(cfgPatch, line, fMapName, 399, len)
        if(equali(getMapName, fMapName))
            BlockMaps = true;
    }
}

public func(id)
{
    if(BlockMaps)
    {
        client_print(id, print_chat, "Карта заблокирована");
        return;
    }
    
    client_print
(id, print_chat, "Карта не заблокирована")
}


Перенесено в раздел "Скриптинг" // liFe iS GoOD
Аватара пользователя
DoNotFollowMe
 
Сообщения: 117
Зарегистрирован: 29 фев 2016, 20:25
Благодарил (а): 41 раз.
Поблагодарили: 3 раз.
Опыт программирования: Меньше недели
Языки программирования: Counter-Strike 1.6

Re: get_configsdir, не читает файл

Сообщение liFe iS GoOD » 13 янв 2017, 13:35

Код: Выделить всё
new szDirectory[ 64 ] ;
get_configsdir( szDirectory , charsmax( szDirectory ) );

format( szDirectory , charsmax( szDirectory ) , "%s/test/test.ini" , szDirectory );
Аватара пользователя
liFe iS GoOD
Модератор
 
Сообщения: 1416
Зарегистрирован: 24 май 2012, 19:48
Благодарил (а): 116 раз.
Поблагодарили: 472 раз.

Re: get_configsdir, не читает файл

Сообщение DoNotFollowMe » 13 янв 2017, 13:47

Спасибо, шикардос. :-)
Вот кому надо, блокировка функции на картах указанных в test.ini
Код: Выделить всё
#include <amxmodx>
#include <amxmisc>

new bool:BlockMaps;

public plugin_init()
{
    register_plugin("ini", "1.0", "IIPU3PAK")
    
    register_clcmd
("test", "func")
}

public 
plugin_precache()
{
    new 
cfgPatch[64], cfgMapName[32], getMapName[32], fSizelen;
    
get_mapname(getMapName31);
    
    
get_configsdir(cfgPatchcharsmax(cfgPatch));
    
format(cfgPatchcharsmax(cfgPatch), "%s/test.ini"cfgPatch)
    
    
fSize file_size(cfgPatch1);
    
    if(!
file_exists(cfgPatch)) return;
    for(new 
lineline fSizeline++)
    {
        
read_file(cfgPatchlinecfgMapNamecharsmax(cfgMapName), len)
        if(
equali(getMapNamecfgMapName))
            
BlockMaps true;
    }
}

public func(id)
{
    if(BlockMaps)
    {
        client_print(id, print_chat, "Карта заблокирована");
        return;
    }
    
    client_print
(id, print_chat, "Карта не заблокирована")
}


Код: Выделить всё

//test.ini

35hp_2
$2000$
awp_india
Последний раз редактировалось DoNotFollowMe 13 янв 2017, 14:08, всего редактировалось 1 раз.
Аватара пользователя
DoNotFollowMe
 
Сообщения: 117
Зарегистрирован: 29 фев 2016, 20:25
Благодарил (а): 41 раз.
Поблагодарили: 3 раз.
Опыт программирования: Меньше недели
Языки программирования: Counter-Strike 1.6

Re: get_configsdir, не читает файл

Сообщение NEoMASTERR » 13 янв 2017, 13:52

Код: Выделить всё
if(equali(getMapName, fMapName))
            BlockMaps = true;
-->
if(
equali(getMapName, fMapName))
{
    BlockMaps = true;
    break


Код: Выделить всё
fMapName[400], getMapName[32]
-->
fMapName[32], getMapName[32


Код: Выделить всё
read_file(cfgPatch, line, fMapName, 399, len)
-->
read_file(cfgPatch, line, fMapName, charsmax(fMapName)/*31*/, len)
Аватара пользователя
NEoMASTERR
 
Сообщения: 832
Зарегистрирован: 05 янв 2015, 16:38
Благодарил (а): 43 раз.
Поблагодарили: 188 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: get_configsdir, не читает файл

Сообщение DoNotFollowMe » 13 янв 2017, 14:43

NEoMASTERR писал(а):
Код: Выделить всё
if(equali(getMapName, fMapName))
            BlockMaps = true;
-->
if(
equali(getMapName, fMapName))
{
    BlockMaps = true;
    break


Код: Выделить всё

fMapName
[400], getMapName[32]
-->
fMapName[32], getMapName[32


Код: Выделить всё

read_file
(cfgPatch, line, fMapName, 399, len)
-->
read_file(cfgPatch, line, fMapName, charsmax(fMapName), len)

Ну я ток учусь :-D, что такое charsmax не знаю, не дошел еше. И почему не надо писать максимальную длинну? 31
read_file(cfgPatch, line, fMapName, 31, len)

Добавлено спустя 5 минут 52 секунды:
Все, я прочел и понял. Он определяет размер всего массива :-)
Спасибо :thumbs_up

Добавлено спустя 35 минут 20 секунд:
Понял еще как эту штучку юзать
Код: Выделить всё
if(!strlen(cfgMapName) || cfgMapName[0] == ';')
            continue; 

До вчерашнего дня, я понятие не имел что и для чего там нужно. А ночью сидел, прям по маслу пошло, начал понимать. Вот еще с parse разберусь, и буду крут :dance4: :-D
Аватара пользователя
DoNotFollowMe
 
Сообщения: 117
Зарегистрирован: 29 фев 2016, 20:25
Благодарил (а): 41 раз.
Поблагодарили: 3 раз.
Опыт программирования: Меньше недели
Языки программирования: Counter-Strike 1.6

Re: get_configsdir, не читает файл

Сообщение NEoMASTERR » 13 янв 2017, 14:48

Код: Выделить всё
if(!strlen(cfgMapName) || cfgMapName[0] == ';'

можно заменить на
Код: Выделить всё
if(!cfgMapName[0] || cfgMapName[0] == ';'
Аватара пользователя
NEoMASTERR
 
Сообщения: 832
Зарегистрирован: 05 янв 2015, 16:38
Благодарил (а): 43 раз.
Поблагодарили: 188 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: get_configsdir, не читает файл

Сообщение DoNotFollowMe » 13 янв 2017, 15:27

NEoMASTERR писал(а):
Код: Выделить всё
if(!strlen(cfgMapName) || cfgMapName[0] == ';')

можно заменить на
Код: Выделить всё
if(!cfgMapName[0] || cfgMapName[0] == ';')

тип лишний натив не пихать, прикольно :-D
Аватара пользователя
DoNotFollowMe
 
Сообщения: 117
Зарегистрирован: 29 фев 2016, 20:25
Благодарил (а): 41 раз.
Поблагодарили: 3 раз.
Опыт программирования: Меньше недели
Языки программирования: Counter-Strike 1.6

Re: get_configsdir, не читает файл

Сообщение DoNotFollowMe » 14 янв 2017, 00:10

Еще вопросик.
Переделал код, тип под новую систему чтение файла. Как пустые строки пропустить?

Код: Выделить всё
#include <amxmodx>
#include <amxmisc>

public plugin_init()
{
    register_plugin("ini", "1.0", "IIPU3PAK")
}

public plugin_cfg()
{
    new cfgPatch[64], cfgMapName[32], getMapName[32];
    get_mapname(getMapName, 31);
    
    get_configsdir
(cfgPatch, charsmax(cfgPatch));
    format(cfgPatch, charsmax(cfgPatch), "%s/test.ini", cfgPatch)
    
    new FileID 
= fopen(cfgPatch, "rt")
    new cfgSize = file_size (cfgPatch, 1)
    
    if
(!file_exists(cfgPatch)) return;
    
    for
(new line; line < cfgSize; line++)
    {
        fgets(FileID, cfgMapName, charsmax(cfgMapName))
        
        if
(!strlen(cfgMapName) || cfgMapName[0] == ';'|| cfgMapName[0] == '#' || cfgMapName[0] == '/')
            continue;
            
        server_print
("%s", cfgMapName)
    }
    fclose(FileID)
}


так строки остаются
Код: Выделить всё
if(!strlen(cfgMapName) || cfgMapName[0] == ';'|| cfgMapName[0] == '#' || cfgMapName[0] == '/')


и так выводятся
Код: Выделить всё
if(!cfgMapName[0] || cfgMapName[0] == ';'|| cfgMapName[0] == '#' || cfgMapName[0] == '/')
Аватара пользователя
DoNotFollowMe
 
Сообщения: 117
Зарегистрирован: 29 фев 2016, 20:25
Благодарил (а): 41 раз.
Поблагодарили: 3 раз.
Опыт программирования: Меньше недели
Языки программирования: Counter-Strike 1.6

Re: get_configsdir, не читает файл

Сообщение NEoMASTERR » 14 янв 2017, 00:59

Они выводятся с переносом строки в конце. Делай
Код: Выделить всё
trim(cfgMapName

перед проверкой

Добавлено спустя 5 минут 40 секунд:
Или
Код: Выделить всё
    static len;
    for(new line; line < cfgSize; line++)
    {
        len = fgets(FileID, cfgMapName, charsmax(cfgMapName))-1
        if 
(cfgMapName[len] == '^n') cfgMapName[len] = '^0'
        
        if
(!cfgMapName[0] || cfgMapName[0] == ';'|| cfgMapName[0] == '#' || cfgMapName[0] == '/')
            continue;
            
        server_print
("%s", cfgMapName)
    }


Но лучше trim. Вдруг пробелов напихонят
Аватара пользователя
NEoMASTERR
 
Сообщения: 832
Зарегистрирован: 05 янв 2015, 16:38
Благодарил (а): 43 раз.
Поблагодарили: 188 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: get_configsdir, не читает файл

Сообщение DoNotFollowMe » 14 янв 2017, 02:29

Вот конечный вариант :-D
Код: Выделить всё
#include <amxmodx>
#include <amxmisc>

new bool:BlockMaps;

public plugin_init()
{
    register_plugin("ini", "1.0", "IIPU3PAK")
    
    register_clcmd
("test", "func")
}

public plugin_cfg()
{
    new cfgPatch[64], cfgMapName[32], getMapName[32];
    get_mapname(getMapName, 31);
    
    get_configsdir
(cfgPatch, charsmax(cfgPatch));
    format(cfgPatch, charsmax(cfgPatch), "%s/test.ini", cfgPatch)
    
    new FileID 
= fopen(cfgPatch, "rt")
    
    if
(!file_exists(cfgPatch)) return;
    
    while
(!feof(FileID))
    {
        fgets(FileID, cfgMapName, charsmax(cfgMapName))
        trim(cfgMapName)
        
        if
(!cfgMapName[0] || cfgMapName[0] == ';'|| cfgMapName[0] == '#' || cfgMapName[0] == '/')
            continue;
            
        if
(equali(getMapName, cfgMapName))
        {
            BlockMaps = true;
            break;
        }
    }
    
fclose(FileID)
}

public func(id)
{
    if(BlockMaps)
    {
        client_print(id, print_chat, "Карта заблокирована");
        return;
    }
    
    client_print
(id, print_chat, "Карта не заблокирована")
}
Аватара пользователя
DoNotFollowMe
 
Сообщения: 117
Зарегистрирован: 29 фев 2016, 20:25
Благодарил (а): 41 раз.
Поблагодарили: 3 раз.
Опыт программирования: Меньше недели
Языки программирования: Counter-Strike 1.6

След.

Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10