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

Как передать в натив строку и как вернуть её  [Решено]

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

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

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

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

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

Как передать в натив строку и как вернуть её

Сообщение Bahar » 29 июл 2019, 12:59

у меня есть 5 плагинов, с одиним и тем же кодом. Что бы не изменять каждый плагин, решил всё сделать в одном через нативы. Но появилась загвоска, не могу передать в натив строку. Вот пример кода:
Код: Выделить всё
#include <amxmodx>
#include <amxmisc>
#include <ActionAvalible>
 
#define PLUGIN "ActionAvalible"
#define VERSION "1.0"
#define AUTHOR "R1k3"

public plugin_init() {
    register_plugin(PLUGIN, VERSION, AUTHOR)
}
public  plugin_natives ( ){
    register_native("check_flags", "native_check_flags", 1)
}

public native_check_flags(id, const szFlagsCheck[]) {
    if (containi("all", szFlagsCheck) != -1) {
        return 1
    
}
    new szFlagsPlayer[27], iFlagsPlayer;
    iFlagsPlayer = get_user_flags(id);
    get_flags(iFlagsPlayer, szFlagsPlayer, charsmax(szFlagsPlayer));
    
     if 
(containi(szFlagsPlayer, szFlagsCheck) != -1) {
        return 1
    
}
    return 0
}

добавил одну строчку в нативе и понял что строка пустая:
Код: Выделить всё

console_print
(id, "szFlagsCheck = %s", szFlagsCheck);


Из ActionAvalible.inc
Код: Выделить всё
native check_flags(id, const szFlagsCheck[]) 


Если обойтись без натива, то работает. Так же мне нужно будет что бы натив возращал строку. Я вычитал что-то про set_string и get_string, но не могу понять как это работает. Может кто-то уже сталкивался с подобным.
Последний раз редактировалось Bahar 29 июл 2019, 16:00, всего редактировалось 2 раз(а).
Аватара пользователя
Bahar
 
Сообщения: 2
Зарегистрирован: 29 июл 2019, 12:46
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Опыт программирования: Больше трех лет
Языки программирования: amxx, python, pascal

Re: Как передать в натив строку и как вернуть её

Сообщение Mistrick » 29 июл 2019, 14:30

Bahar писал(а):добавил одну строчку в нативе и понял что строка пустая:
Код: Выделить всё

console_print
(id, "szFlagsCheck = ", szFlagsCheck);

Вы строку не вывели, где спецификатор для форматирования строки?

Примеров миллион. Можете и другие плагины в репо посмотреть.
Вы должны зарегистрироваться, чтобы видеть ссылки. ... e.sma#L215

И юзать нативы с style = 1 не желательно. В моих плагинах все нативы с style = 0.
Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2940
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1247 раз.
Языки программирования: PAWN
С/С++(few above zero)

Re: Как передать в натив строку и как вернуть её  [Решено]

Сообщение Bahar » 29 июл 2019, 16:09

Всё, спасибо огромное. У тебя очень понятный код. Для тех кто столкнётся с подобной проблемой, вот как я решил свою проблему:
ActionAvalible.sma
Код: Выделить всё
#include <amxmodx>
#include <ActionAvalible>
 
#define PLUGIN "ActionAvalible"
#define VERSION "1.0"
#define AUTHOR "R1k3"
 
public plugin_init
() {
    register_plugin(PLUGIN, VERSION, AUTHOR)
}
public  plugin_natives ( ) {
    register_native("check_flags2", "native_check_flags", 0)
}

public native_check_flags(plugin, params) {
    enum {
        arg_id = 1,
        arg_flags
    
};
    new id = get_param(arg_id)
    new szFlagsCheck[33]
    get_string(arg_flags, szFlagsCheck, charsmax(szFlagsCheck));
    console_print(id, "szFlagsCheck = %s", szFlagsCheck);
    if (containi("all", szFlagsCheck) != -1) {
        return 1
    
}
    new szFlagsPlayer[27], iFlagsPlayer;
    iFlagsPlayer = get_user_flags(id);
    get_flags(iFlagsPlayer, szFlagsPlayer, charsmax(szFlagsPlayer));
    
     if 
(containi(szFlagsPlayer, szFlagsCheck) != -1) {
        return 1
    
}
    return 0
}


ActionAvalible.inc
Код: Выделить всё
native check_flags(id, szFlagsCheck[]) 
Аватара пользователя
Bahar
 
Сообщения: 2
Зарегистрирован: 29 июл 2019, 12:46
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Опыт программирования: Больше трех лет
Языки программирования: amxx, python, pascal


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

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

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