Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 10 из 10
  1. #1
    Аватар для MarioORG
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2014
    Сообщений
    17
    Репутация:
    0 ±

    Не работает команда /kick

    Привет всем. Помогите с проблемой:
    PHP код:
    Richard_Moretz кикнул игрока 37. Причина1337 
    Вот код:
    PHP код:
    CMD:kick(playerid,params[])
    {
        if(
    pInfo[playerid][pAdmin]>=1){
            new 
    string[128], name[MAX_PLAYER_NAME];
            new 
    kickname[MAX_PLAYER_NAME], giveplayeridreason;
            if (
    sscanf(params"us"giveplayeridreason)) return SendClientMessage(playeridCOLOR_WHITE"Введите {FF0000}/kick [ID] [причина]{FFFFFF}");
            
    GetPlayerName(playerid,name,sizeof(name));
            
    GetPlayerName(giveplayerid,kickname,sizeof(kickname));
            
    format(string,sizeof(string),"%s кикнул игрока %s. Причина: %s"namekicknamereason);
            
    SendClientMessageToAll(COLOR_REDstring);
            
    Kick(giveplayerid);
        }else{
            
    SendClientMessage(playerid,COLOR_RED,"У вас нету прав!");
        }
        return 
    1;

    Искал, искал, да так ошибку и не нашел.

  2. #2
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Нужно указывать в sscanf размер строковой переменной, иначе функция не будет знать, до скольки символов можно считывать, и будет выводить предупреждающие сообщения в консоли сервера.
    В вашем случае должна получиться строка "us[128]".
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  3. #3
    Аватар для MarioORG
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2014
    Сообщений
    17
    Репутация:
    0 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Нужно указывать в sscanf размер строковой переменной, иначе функция не будет знать, до скольки символов можно считывать, и будет выводить предупреждающие сообщения в консоли сервера.
    В вашем случае должна получиться строка "us[128]".
    Дело не в этом. При вводе команды /kick 0 test, в чате отображается только
    PHP код:
    Richard_Moretz кикнул игрока st Причинаtest 
    и меня не кикает. Должно корректно отобразиться сообщение и меня должно кикнуть.

  4. #4
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Только сейчас заметил. Да, дело не только в форматной строке. На объявление reason посмотрите, это должен быть массив.
    Да и зачем создавать ещё один массив, когда можно считать причину кика в string?
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  5. #5
    Аватар для Mazzilla
    Пользователь

    Статус
    Оффлайн
    Регистрация
    27.11.2013
    Адрес
    Нижневартовск
    Сообщений
    256
    Репутация:
    63 ±
    Deimos подробно описал эту проблему, посмотрите.
    http://pro-pawn.ru/showthread.php?93...C%D0%B0-sscanf

  6. #6
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Mazzilla Посмотреть сообщение
    Deimos подробно описал эту проблему, посмотрите.
    http://pro-pawn.ru/showthread.php?93...C%D0%B0-sscanf
    Это совсем другая проблема. Да и решение там, как оказалось, неправильное.
    Недавно только помог разобрать похожий случай, гляньте решение:
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  7. #7
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Это совсем другая проблема. Да и решение там, как оказалось, неправильное.
    Недавно только помог разобрать похожий случай, гляньте решение:
    Можно поинтересоваться, почему там решение не правильное?
    Была подобная проблема, объявил переменные > стало все нормально работать.

    А переменная reason и вправду не правильно объявлена, Вы же вводите текст, нужен массив.
    Последний раз редактировалось $continue$; 14.07.2015 в 14:24. Причина: UPD

  8. #8
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    А разве так сделать нельзя?

    PHP код:
    CMD:kick(playerid,params[])
    {
        if(
    pInfo[playerid][pAdmin] >= 1)
            return 
    SendClientMessage(playerid,COLOR_RED,"У вас нету прав!");
        
        if(
    sscanf(params"us[21]"params[0], params[1])) 
            return 
    SendClientMessage(playeridCOLOR_WHITE"Введите {FF0000}/kick [ID] [причина]");
        
        if(
    params[1] >= 21)
            return 
    SendClientMessage(playeridCOLOR_WHITE"Причина не может привышать 20 символов");
        
        new 
            
    string[128], 
            
    name[MAX_PLAYER_NAME],
            
    kickname[MAX_PLAYER_NAME]
        ;
        
        
    GetPlayerName(playeridnamesizeof(name));
        
    GetPlayerName(params[0], kicknamesizeof(kickname));  

        
    format(stringsizeof(string), "%s кикнул игрока %s. Причина: %s"namekicknameparams[1]);
        
    SendClientMessageToAll(COLOR_REDstring);
        
        return 
    1;


  9. #9
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Bublik_Public Посмотреть сообщение
    Можно поинтересоваться, почему там решение не правильное?
    По поводу коллизии DeimoS был прав, но проблема была ещё и в том, что между "s" и следующим спецификатором нужно было поставить пробел.
    Как результат, топикстартер так и не разобрался до конца и просто убрал второй параметр из команды -_-

    Цитата Сообщение от Darge Посмотреть сообщение
    А разве так сделать нельзя?

    PHP код:
    CMD:kick(playerid,params[])
    {
        if(
    pInfo[playerid][pAdmin] >= 1)
            return 
    SendClientMessage(playerid,COLOR_RED,"У вас нету прав!");
        
        if(
    sscanf(params"us[21]"params[0], params[1])) 
            return 
    SendClientMessage(playeridCOLOR_WHITE"Введите {FF0000}/kick [ID] [причина]");
        
        if(
    params[1] >= 21)
            return 
    SendClientMessage(playeridCOLOR_WHITE"Причина не может привышать 20 символов");
        
        new 
            
    string[128], 
            
    name[MAX_PLAYER_NAME],
            
    kickname[MAX_PLAYER_NAME]
        ;
        
        
    GetPlayerName(playeridnamesizeof(name));
        
    GetPlayerName(params[0], kicknamesizeof(kickname));  

        
    format(stringsizeof(string), "%s кикнул игрока %s. Причина: %s"namekicknameparams[1]);
        
    SendClientMessageToAll(COLOR_REDstring);
        
        return 
    1;

    ИМХО, юзать params[0/1] под одиночные переменные - редкостное извращение. Доступ к ячейкам массива медленнее, чем к обычным переменным, да и инструкций AMX от этого будет только больше => больше кода => больше памяти потребуется серверу для загрузки скрипта. Вообще использование массива params оправдано только если нужно использовать его вместо какого-то другого массива - но только под строковое значение (или под массив значений), считанное с помощью sscanf (оно всегда вместится в массив, т.к. размер params зависит от длины введённых параметров команды), иначе строковое значение может не вместиться в params => словите выход за пределы массива.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  10. 2 пользователя(ей) сказали cпасибо:
    $continue$ (14.07.2015) Desulaid (14.07.2015)
  11. #10
    Аватар для MarioORG
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2014
    Сообщений
    17
    Репутация:
    0 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Только сейчас заметил. Да, дело не только в форматной строке. На объявление reason посмотрите, это должен быть массив.
    Да и зачем создавать ещё один массив, когда можно считать причину кика в string?
    Спасибо за совет, проблема решена. Удалил переменную reason, все записал в string.

 

 

Информация о теме

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

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •