Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 3 из 3 ПерваяПервая 1 2 3
Показано с 21 по 29 из 29

Тема: CMD: id

  1. #21
    Аватар для BENGO
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2017
    Сообщений
    16
    Репутация:
    0 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Там много ошибок в коде (playerid, например, в GetPlayerName)
    Как-то так:
    PHP код:
    CMD:id(playeridparams[])
    {
        if(!(
    <= strlen(params) <= MAX_PLAYER_NAME-4))
        {
            return 
    SendClientMessage(playerid, -1"Используйте: /id [часть имени игрока]");
        }

        
    SendClientMessage(playerid, -1"Результаты поиска:");
        
        new 
    message[12+11+MAX_PLAYER_NAME];
            
    bool:isfound false;
        for(new 
    iMAX_PLAYERSi++)
        {
            if(
    GetPlayerName(imessageMAX_PLAYER_NAME))
            {
                if(
    strfind(messageparamstrue) != -1)
                {
                    
    isfound true;
                    
    format(messagesizeof(message), "ID: %d | Имя: %s"imessage);
                    
    SendClientMessage(playerid, -1message);
                }
            }
        }
        if(
    isfound == false)
        {
            
    SendClientMessage(playerid, -1"Поиск не дал результатов!");
        }
        return 
    1;

    В этом твоем варианте не возможен поиск по id игрока, а только по части имени, я не много доделал:
    Код:
    CMD:id(playerid, params[])
    {
        if(isnull(params))
    		return SCM(playerid,-1,#Hint"Введите: /id [name / id игрока]");
    	new targetid = strval(params),
    		message[13+3+MAX_PLAYER_NAME],
    	    bool:isfound = false;
    	if(IsNumeric(params) && IsPlayerConnected(strval(params))) {
    		SCM(playerid,COLOR_BLUE,"Результаты поиска:");
            format(message,sizeof(message),"ID: %d | Name: %s",targetid,Name(targetid));
            return SCM(playerid,-1,message);
    	}
    	else if(!IsPlayerConnected(strval(params)))
    		return SCM(playerid,-1,#Error"Поиск не дал результатов.");
    	if((3 <= strlen(params) <= MAX_PLAYER_NAME-4)) {
    		foreach(new i: Player)
    	    {
    	        if(!IsPlayerConnected(i)) continue;
    	        if(GetPlayerName(i,message,MAX_PLAYER_NAME)) {
    	            if(strfind(message,params,true) != -1) {
    	                isfound = true;
    	                SCM(playerid,COLOR_BLUE,"Результаты поиска:");
    	                format(message,sizeof(message),"ID: %d | Name: %s",i,message);
    	                SCM(playerid,-1,message);
    	            }
    	        }
    	    }
    	    if(isfound == false) SCM(playerid,-1,#Error"Поиск не дал результатов.");
        }
        else if(!(3 <= strlen(params) <= MAX_PLAYER_NAME-4))
    		return SCM(playerid,-1,#Error"Минимальное кол-во символом - 3.");
    	return true;
    }
    P.S Видок правда не очень, но работает=)

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Угадывать наперёд: сколько же там будет максимальный онлайн в следующих версиях - тоже ничего хорошего, ибо получится тот же самый вариант с магическими числами.
    А чего там угадывать? Если больше 1000 ещё можно себе представить (есть несколько проектов, которые держат по несколько серверов с онлайном 1000), то больше 10 000 - едва ли. Есть, конечно, несколько успешных русскоязычных проектов, но они всё ж не настолько успешные, чтобы кому-то из них понадобился сервер на 10k игроков.


    Цитата Сообщение от DeimoS Посмотреть сообщение
    но тогда и от MAX_PLAYER_NAME следовало отнимать 4
    Точно такой же принцип: в будущих версиях лимит символов для ника в клиенте может увеличиться. От куя не было подтверждения подобных планов, но и опровержения (т.е. утверждения о том, что он не собирается ничего делать с этой константой по той или иной объективной причине) тоже нет.
    Не столько предусмотрительность, сколько просто здравый смысл, ИМХО.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  3. #23
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Geebrox Посмотреть сообщение
    Вот именно! Для этого и нужно такой медот, чтобы удобно было поддерживать изменение строки. А ты говорил:
    Ну так и в чём удобство? Формулу любом случае придётся переписывать. И ради этого единственного случая изменения текста в моде добавится дополнительная строка (и каждый такой случай будет всё больше и больше необязательного кода привносить, который делает код удобнее, только при словах: "А ВОТ ВДРУГ ТЫ РЕШИШЬ ИЗМЕНИТЬ ТЕКСТ", - хотя даже и тут, опять же, стоит помнить, что формулу в любом случае придётся менять, что чаще гораздо дольше, чем ручной подсчёт)

    Цитата Сообщение от Geebrox Посмотреть сообщение
    Да серьезно, удобнее. Так как мне всего лишь нужно выйти из тела цикла и перед моими глазами будет содержимое формата строки.
    А в твоем случае, если будет такой код, ты будешь искать этот сранный format по всем блокам кода
    Не "всего лишь выйти из тела цикла", а сначала найти нужные переменные среди format, потом выйти из тела цикла, найти обявление static const, изменить содержимое, найти объявление массива, переписать строку и только тогда всё будет готово. И не факт, что ты не перепутаешь порядок переменных с заполнителями, ибо они находятся в разных местах.

    Когда в моём случае просто меняешь текст, сразу же правя переменные, сверяя их порядок, а после составляешь ту же самую формулу, только подсчёт строки перенося не на плечи компилятора, а на плечи редактора, просто выделяя весь текст.

    Цитата Сообщение от Geebrox Посмотреть сообщение
    Я думаю это удобнее, чем искать саму функцию среди куча кодов, менять строку, менять переменные, потом найти где был объявлен массив для хранение строки, подсчитать новый размер строки и изменить его. У тебя уходит больше времени поверь. Мне лишь необъодимо найти нужную переменную.
    Эмм, что? Тебе нужно всё то же самое сделать, только ещё придётся дополнительно "прыгать" глазами между static const и format, сверяя порядок переменных. А так: что формулу, что переменные в format, что сам текст - всё это нужно искать и менять точно так же.


    Цитата Сообщение от Geebrox Посмотреть сообщение
    Совершенно верно, только тебе необходимо определить кто тут пытается есть суп вилкой м?
    Получается, что ты. Только ты отчаянно веришь, что если однажды суп станет очень густым, то твой вариант будет гораздо удобнее.









    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    А чего там угадывать? Если больше 1000 ещё можно себе представить (есть несколько проектов, которые держат по несколько серверов с онлайном 1000), то больше 10 000 - едва ли. Есть, конечно, несколько успешных русскоязычных проектов, но они всё ж не настолько успешные, чтобы кому-то из них понадобился сервер на 10k игроков.

    Точно такой же принцип: в будущих версиях лимит символов для ника в клиенте может увеличиться. От куя не было подтверждения подобных планов, но и опровержения (т.е. утверждения о том, что он не собирается ничего делать с этой константой по той или иной объективной причине) тоже нет.
    Не столько предусмотрительность, сколько просто здравый смысл, ИМХО.
    Ну это ты сегодня считаешь так, а завтра Куй делает поддержку сингловых пешеходов, которые будут жрать определённое количество слотов, и расширяет лимит до 100к слотов, из которых 99к будут занимать эти боты.
    Утрирую, конечно, но такое рассуждение ничуть не лучше моего варианта с "+3". Адекватным выходом будет именно макрос, либо размер, равен лимиту Integer, дабы уж наверняка перестраховаться (как, например, с экранированием символов ника в запросе на поиск аккаунта при входе на сервер. Казалось бы, в сампе есть своё ограничение на символы и символы, при помощи которых можно сделать SQL-инъекцию, невалидны. Но кто даёт гарантии, что завтра не найдут дыру в клиенте, которая позволит обходить это ограничение? Или Куй не напортачит?). Всё остальное, хоть и маловероятно, но рискует быть невалидным однажды.

    - - - Добавлено - - -

    Цитата Сообщение от BENGO Посмотреть сообщение
    В этом твоем варианте не возможен поиск по id игрока, а только по части имени, я не много доделал:
    Код:
    CMD:id(playerid, params[])
    {
        if(isnull(params))
    		return SCM(playerid,-1,#Hint"Введите: /id [name / id игрока]");
    	new targetid = strval(params),
    		message[13+3+MAX_PLAYER_NAME],
    	    bool:isfound = false;
    	if(IsNumeric(params) && IsPlayerConnected(strval(params))) {
    		SCM(playerid,COLOR_BLUE,"Результаты поиска:");
            format(message,sizeof(message),"ID: %d | Name: %s",targetid,Name(targetid));
            return SCM(playerid,-1,message);
    	}
    	else if(!IsPlayerConnected(strval(params)))
    		return SCM(playerid,-1,#Error"Поиск не дал результатов.");
    	if((3 <= strlen(params) <= MAX_PLAYER_NAME-4)) {
    		foreach(new i: Player)
    	    {
    	        if(!IsPlayerConnected(i)) continue;
    	        if(GetPlayerName(i,message,MAX_PLAYER_NAME)) {
    	            if(strfind(message,params,true) != -1) {
    	                isfound = true;
    	                SCM(playerid,COLOR_BLUE,"Результаты поиска:");
    	                format(message,sizeof(message),"ID: %d | Name: %s",i,message);
    	                SCM(playerid,-1,message);
    	            }
    	        }
    	    }
    	    if(isfound == false) SCM(playerid,-1,#Error"Поиск не дал результатов.");
        }
        else if(!(3 <= strlen(params) <= MAX_PLAYER_NAME-4))
    		return SCM(playerid,-1,#Error"Минимальное кол-во символом - 3.");
    	return true;
    }
    P.S Видок правда не очень, но работает=)
    Зачем в foreach проверка на онлайн? Да ещё и когда в GetPlayerName она и так встроена (функция вернёт 0, если игрок не подключён).
    Да и флудить будет сообщением "Результаты поиска" в случае поиска по части ника

    Как-то так (не проверял):
    PHP код:
    CMD:id(playeridparams[])
    {
        if(
    isnull(params))
            return 
    SCM(playerid,-1,#Hint"Введите: /id [name / id игрока]");

        
    if(IsNumeric(params)) 
        {
            new 
    targetid strval(params);
            if(!
    IsPlayerConnected(targetid))
            {
                
    SCM(playerid,-1,#Error"Поиск не дал результатов.");
                
    return 1;
            }

            new 
    message[13+3+MAX_PLAYER_NAME];
            
    SCM(playerid,COLOR_BLUE,"Результаты поиска:");
            
    format(message,sizeof(message),"ID: %d | Name: %s"targetidName(targetid));
            
    SCM(playerid,-1,message);
            return 
    1;
        }
        else
        {
            if(!(
    <= strlen(params) <= MAX_PLAYER_NAME-4)) 
            {
                
    SCM(playerid,-1,#Error"Минимальное кол-во символом - 3.");
                
    return 1;
            }
            new 
    message[13+3+MAX_PLAYER_NAME],
                
    bool:isfound false;

            
    SCM(playeridCOLOR_BLUE"Результаты поиска:");
            foreach(new 
    iPlayer)
            {
                if(
    GetPlayerName(imessageMAX_PLAYER_NAME)) 
                {
                    if(
    strfind(messageparamstrue) != -1
                    {
                        
    isfound true;
                        
    format(message,sizeof(message),"ID: %d | Name: %s",i,message);
                        
    SCM(playerid, -1message);
                    }
                }
            }
            if(
    isfound == false
            {
                
    SCM(playerid,-1,#Error"Поиск не дал результатов.");
            
    }
        }
        return 
    true;

    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  4. Пользователь сказал cпасибо:
    BENGO (26.12.2017)
  5. #24
    Аватар для BENGO
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2017
    Сообщений
    16
    Репутация:
    0 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Да и флудить будет сообщением "Результаты поиска" в случае поиска по части ника
    [/PHP]
    Тут не очень понял, когда проверял флуда не было.

  6. #25
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от BENGO Посмотреть сообщение
    Тут не очень понял, когда проверял флуда не было.
    Ну у тебя на каждого найденного игрока по новой выводило бы сообщение "Результаты поиска". То бишь, нашло 3-х игроков и было бы так:
    PHP код:
    Результаты поиска:
    ID: %Name: %s
    Результаты поиска
    :
    ID: %Name: %s
    Результаты поиска
    :
    ID: %Name: %
    Сообщение за тело цикла нужно было убрать. Ну там, как видишь, не только его можно было убрать, но и от кучи лишних вызовов функций избавиться, да и не только
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  7. Пользователь сказал cпасибо:
    BENGO (26.12.2017)
  8. #26
    Аватар для BENGO
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2017
    Сообщений
    16
    Репутация:
    0 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Ну у тебя на каждого найденного игрока по новой выводило бы сообщение "Результаты поиска". То бишь, нашло 3-х игроков и было бы так:
    PHP код:
    Результаты поиска:
    ID: %Name: %s
    Результаты поиска
    :
    ID: %Name: %s
    Результаты поиска
    :
    ID: %Name: %
    Сообщение за тело цикла нужно было убрать. Ну там, как видишь, не только его можно было убрать, но и от кучи лишних вызовов функций избавиться, да и не только
    Понятно спасибо, но тогда же сообщение будет появляться, даже если никого не найдет верно? То бишь будет вывод:
    Код:
    SCM(playerid,COLOR_BLUE,"Результаты поиска:");
    if(isfound == false) 
    {
         SCM(playerid,-1,#Error"Поиск не дал результатов.");
    }
    Или я не прав?

  9. #27
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от BENGO Посмотреть сообщение
    Понятно спасибо, но тогда же сообщение будет появляться, даже если никого не найдет верно? То бишь будет вывод:
    Код:
    SCM(playerid,COLOR_BLUE,"Результаты поиска:");
    if(isfound == false) 
    {
         SCM(playerid,-1,#Error"Поиск не дал результатов.");
    }
    Или я не прав?
    Прав. Можно сделать так:
    PHP код:
    CMD:id(playeridparams[])
    {
        if(
    isnull(params))
            return 
    SCM(playerid,-1,#Hint"Введите: /id [name / id игрока]");

        
    if(IsNumeric(params)) 
        {
            new 
    targetid strval(params);
            if(!
    IsPlayerConnected(targetid))
            {
                
    SCM(playerid,-1,#Error"Поиск не дал результатов.");
                
    return 1;
            }

            new 
    message[13+3+MAX_PLAYER_NAME];
            
    SCM(playerid,COLOR_BLUE,"Результаты поиска:");
            
    format(message,sizeof(message),"ID: %d | Name: %s"targetidName(targetid));
            
    SCM(playerid,-1,message);
            return 
    1;
        }
        else
        {
            if(!(
    <= strlen(params) <= MAX_PLAYER_NAME-4)) 
            {
                
    SCM(playerid,-1,#Error"Минимальное кол-во символом - 3.");
                
    return 1;
            }
            new 
    message[13+3+MAX_PLAYER_NAME],
                
    bool:isfound false;

            foreach(new 
    iPlayer)
            {
                if(
    GetPlayerName(imessageMAX_PLAYER_NAME)) 
                {
                    if(
    strfind(messageparamstrue) != -1
                    {
                        if(
    isfound == false)
                        {
                            
    isfound true;
                            
    SCM(playeridCOLOR_BLUE"Результаты поиска:");
                        }
                        
    format(message,sizeof(message),"ID: %d | Name: %s",i,message);
                        
    SCM(playerid, -1message);
                    }
                }
            }
            if(
    isfound == false
            {
                
    SCM(playerid,-1,#Error"Поиск не дал результатов.");
            
    }
        }
        return 
    true;

    добавив в цикл дополнительное условие и сделав вывод только в случае нахождения игроков
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  10. Пользователь сказал cпасибо:
    BENGO (29.12.2017)
  11. #28
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Ну это ты сегодня считаешь так, а завтра Куй делает поддержку сингловых пешеходов, которые будут жрать определённое количество слотов, и расширяет лимит до 100к слотов, из которых 99к будут занимать эти боты.
    Утрирую, конечно, но такое рассуждение ничуть не лучше моего варианта с "+3".
    С такими утрированными примерами твоя "предусмотрительность" только ещё больше походит на паранойю, без обид.


    Цитата Сообщение от DeimoS Посмотреть сообщение
    Адекватным выходом будет именно макрос, либо размер, равен лимиту Integer, дабы уж наверняка перестраховаться
    Не упрёка ради, а корректности для: то, что ты пытаешься описать, называется ячейкой. Даже английский вариант "cell" звучал бы куда приемлимее - мы же с тобой оба прекрасно знаем, что в Pawn нет типа "Integer".


    Цитата Сообщение от DeimoS Посмотреть сообщение
    как, например, с экранированием символов ника в запросе на поиск аккаунта при входе на сервер
    Экранирование тривиально в стольких видах приложений и на стольких разных ЯП, что нет смысла перечислять. Сравнение его со специфичными для SA-MP проблемами выглядит, мягко говоря, странно.


    Цитата Сообщение от DeimoS Посмотреть сообщение
    Казалось бы, в сампе есть своё ограничение на символы и символы, при помощи которых можно сделать SQL-инъекцию, невалидны. Но кто даёт гарантии, что завтра не найдут дыру в клиенте, которая позволит обходить это ограничение? Или Куй не напортачит?)
    В случае с MySQL поднимется шум (ибо эта СУБД много где используется) и быстро выйдут хотфиксы для всех поддерживаемых версий.
    Если же речь о SQLite, то с такой критической уязвимостью выход обновы SA-MP с закрытием дыры и парой новых моделек тоже должен произойти сравнительно быстро.


    Цитата Сообщение от DeimoS Посмотреть сообщение
    Всё остальное, хоть и маловероятно, но рискует быть невалидным однажды.
    Богатый простор для паранойи, да.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  12. #29
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    В случае с MySQL поднимется шум (ибо эта СУБД много где используется) и быстро выйдут хотфиксы для всех поддерживаемых версий.
    Если же речь о SQLite, то с такой критической уязвимостью выход обновы SA-MP с закрытием дыры и парой новых моделек тоже должен произойти сравнительно быстро.
    Речь о самом SA-MP (в сервер встроена проверка на символы в ники, которую если убрать, можно много дел наделать как с БД, так и с самим сервером при "умелых" настройках хоста)

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Богатый простор для паранойи, да.
    Никто не спорит, что это сродни паранойи. Как и твои утверждения насчёт того, что 3-х символов не хватит однажды. Только свою паранойю ты почему-то оправдываешь, а мою считаешь чем-то нелогичным, ибо, в твоём понимании, такого не произойдёт никогда, а значит и вариант с магическими числами (ну чтоб поставить не 3, а 4) вполне уместен.
    Как я уже выше писал, самым правильным вариантом будет создание соответствующей константы/макроса, которая уже будет хранить актуальное значение. А так же я объяснял почему в данной теме советовать эту самую константу не совсем уместно, из-за чего и будет логичнее всего просто пожертвовать чуть больше памяти, но наверняка оградить себя от проблем в будущем.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

 

 
Страница 3 из 3 ПерваяПервая 1 2 3

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

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

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

Ваши права

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