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

    Статус
    Оффлайн
    Регистрация
    15.01.2016
    Адрес
    Приморье, Спасск-Дальний
    Сообщений
    165
    Репутация:
    7 ±

    /setname [стандартный движок + sscanf] [MySQL R39-2]

    Всем привет. Перед началом написания этой команды, искал на форумах, похожего найти не смог, поэтому выкладываю. Проверенное, рабочее. Пользуйтесь.

    PHP код:
    #define clightred                                     0xFF6347AA
    #define cgrey                                         0xAFAFAFAA
    #define cwhite                                         0xFFFFFFAA 
    CMD:
    PHP код:
        if(Command("/setname"))
        {
            if(
    GetPVarInt(playerid"Admin") < 3) return 1;
            if(
    sscanf(params"us[32]"params[0], params[1])) return SendClientMessage(playeridcwhite"***Используйте: /setname [ID/Имя_Фамилия] [New_Name]");
            if(!
    IsPlayerConnected(params[0])) return SendClientMessage(playeridcgrey"**Персонаж отсутствует на сервере.");
            if(
    GetPVarInt(params[0], "Login") == 0) return SendClientMessage(playeridcgrey"**Не авторизирован.");
            new 
    query_string[128];
            
    f(query_string,"SELECT * FROM `players` WHERE `NAME` = '%s'"params[1]);
            
    mysql_function_query(mysql_connect_IDquery_stringfalse"OnPlayerSetName""ds"params[0], params[1]);
            return 
    1;
        } 
    Public:
    PHP код:
    forward OnPlayerSetName(playeridtext[]);
    public 
    OnPlayerSetName(playeridtext[])
    {
        static 
    rowsfields;
        
    cache_get_data(rowsfields);
        switch(
    rows)
        {
               case 
    0:
               {
                   new 
    query_string[128];
                
    f(query_string"UPDATE `players` SET `NAME` = '%s' WHERE `ID` = '%d'"textGetPVarInt(playerid"Mysql_ID"));
                
    mysql_function_query(mysql_connect_IDquery_stringfalse"""");
                
    SetPlayerName(playeridtext);
                
    GetPlayerName(playeridName(playerid), MAX_PLAYER_NAME);
                new 
    setnamemess[MAX_PLAYER_NAME+MAX_PLAYER_NAME+40];
                
    f(setnamemess"%s известен, как %s"Name(playerid), text); SendClientMessageToAll(clightredsetnamemess);
                
    SendClientMessage(playeridcyellow"* Не забудьте ввести свой новый ник в SA:MP Client.");
               }
               case 
    1:
            {
                
    SendMes(playeridcgrey"**Ник %s используется!"text);
            }
           }


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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    И да начнётся битва:
    1) Для чего нам нужны твои макросы с HEX-кодами цветов? Может у меня свои имеются или я их вообще не использую. Нельзя было заменить макросы на HEX-Код, прежде чем выкладывать работу?
    2) Опять же, зачем проверка на админку? Да ещё и в pVar (да и не только на админку проверка тут, как я вижу...). Какой-нибудь желторотик скопирует твой код в мод и у него даже не высветится ошибки о том, что он не использует подобный pVar для админки. И, при использовании команды, ничего у него работать не будет, ибо условие никогда не выполнится. Да и хранить данные об игроке в pVar...
    3) Функции, типа "f", "Name" или "SendMes", стали распространяться вместе с SA-MP? Зачем ты нам пытаешься какие-то свои функции пропихнуть, да ещё и не лучшего качества, если это то, о чём я думаю?
    4) Массивы... Убил бы за подобное объявление массивов.
    Дальше даже вникать не хочется. Ужасно. Совсем не подготовил код, прежде чем его публиковать. Неудачное начало
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  3. 2 пользователя(ей) сказали cпасибо:
    Alanchick (31.01.2016) BadPawn (23.01.2016)
  4. #3
    Аватар для Роуди.
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.07.2015
    Сообщений
    154
    Репутация:
    17 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    И да начнётся битва:
    1) Для чего нам нужны твои макросы с HEX-кодами цветов? Может у меня свои имеются или я их вообще не использую. Нельзя было заменить макросы на HEX-Код, прежде чем выкладывать работу?
    2) Опять же, зачем проверка на админку? Да ещё и в pVar (да и не только на админку проверка тут, как я вижу...). Какой-нибудь желторотик скопирует твой код в мод и у него даже не высветится ошибки о том, что он не использует подобный pVar для админки. И, при использовании команды, ничего у него работать не будет, ибо условие никогда не выполнится. Да и хранить данные об игроке в pVar...
    3) Функции, типа "f", "Name" или "SendMes", стали распространяться вместе с SA-MP? Зачем ты нам пытаешься какие-то свои функции пропихнуть, да ещё и не лучшего качества, если это то, о чём я думаю?
    4) Массивы... Убил бы за подобное объявление массивов.
    Дальше даже вникать не хочется. Ужасно. Совсем не подготовил код, прежде чем его публиковать. Неудачное начало
    Начало конца?
    Мои глаза от твоего кода лезут на гавно-инфо и создают тему о расстановке пикапов.

  5. #4
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Дополню список замечаний к вашему коду:
    Во-первых, прочтите описании к функции SetPlayerName, а также немаловажные примечания, которые помогут вам.
    Во-вторых, имя не может быть больше 24 (MAX_PLAYER_NAME) символов.

  6. Пользователь сказал cпасибо:
    BadPawn (23.01.2016)
  7. #5
    Аватар для BadPawn
    Пользователь

    Статус
    Оффлайн
    Регистрация
    15.01.2016
    Адрес
    Приморье, Спасск-Дальний
    Сообщений
    165
    Репутация:
    7 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    И да начнётся битва:
    1) Для чего нам нужны твои макросы с HEX-кодами цветов? Может у меня свои имеются или я их вообще не использую. Нельзя было заменить макросы на HEX-Код, прежде чем выкладывать работу?
    2) Опять же, зачем проверка на админку? Да ещё и в pVar (да и не только на админку проверка тут, как я вижу...). Какой-нибудь желторотик скопирует твой код в мод и у него даже не высветится ошибки о том, что он не использует подобный pVar для админки. И, при использовании команды, ничего у него работать не будет, ибо условие никогда не выполнится. Да и хранить данные об игроке в pVar...
    3) Функции, типа "f", "Name" или "SendMes", стали распространяться вместе с SA-MP? Зачем ты нам пытаешься какие-то свои функции пропихнуть, да ещё и не лучшего качества, если это то, о чём я думаю?
    4) Массивы... Убил бы за подобное объявление массивов.
    Дальше даже вникать не хочется. Ужасно. Совсем не подготовил код, прежде чем его публиковать. Неудачное начало
    Учту. Критика всегда полезна. НО:
    Я в павно не старый, учусь, поэтому можно было и подтолкнуть в нужное русло.

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

    Цитата Сообщение от VVWVV Посмотреть сообщение
    Дополню список замечаний к вашему коду:
    Во-первых, прочтите описании к функции SetPlayerName, а также немаловажные примечания, которые помогут вам.
    Во-вторых, имя не может быть больше 24 (MAX_PLAYER_NAME) символов.
    Если правильно тебя понял, то речь об этом:

    PHP код:
    if(strcmp(cmdtext"/superman"true) == 0)
    {
        switch(
    SetPlayerName(playerid"Superman"))
        {
            case -
    1SendClientMessage(playerid0xFF0000FF"Unable to change your name, someone else is known as 'Superman' already.");
            case 
    0SendClientMessage(playerid0xFF0000FF"You are already known as 'Superman'");
            case 
    1SendClientMessage(playerid0x00FF00FF"You are now known as 'Superman'");
        }
        return 
    1;


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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от BadPawn Посмотреть сообщение
    Учту. Критика всегда полезна. НО:
    Я в павно не старый, учусь, поэтому можно было и подтолкнуть в нужное русло.
    Так своими замечаниями я именно это и пытался сделать... Осталось лишь прислушаться к ним и исправить все недочёты.
    Ну, как я понимаю, ты хочешь увидеть готовый вариант. Я сделал бы что-то типа этого:
    PHP код:
    if(!strcmp(cmdtext"/setname"true))
    {
        
    //Тут можете вставить ваш код проверки на администратора
        
    new giveplayerid,
            
    new_name[MAX_PLAYER_NAME];
        if(
    sscanf(params"us[24]"giveplayeridnew_name)) return SendClientMessage(playerid0xFFFFFFAA"***Используйте: /setname [ID/Имя_Фамилия] [New_Name]");
        if(!
    IsPlayerConnected(giveplayerid)) return SendClientMessage(playerid0xAFAFAFAA"**Персонаж отсутствует на сервере.");
        
    //Так же можно вставить свои проверки, типа проверки на авторизацию и т.п.
        
        
    static const fmt_query[] = "SELECT * FROM `имя_таблицы_аккаунтов` WHERE `имя_игрока` = '%s'";// ИМЕНА ТАБЛИЦЫ И СТОЛБЦА С НИКОМ ЗАМЕНИТЬ НА СВОИ
        
    new query_string[sizeof(fmt_query)+(MAX_PLAYER_NAME-2)];
        
    format(query_stringsizeof(query_string), fmt_querynew_name);
        
    mysql_function_query(mysql_connect_IDquery_stringfalse"OnPlayerSetName""dds"playeridgiveplayeridnew_name);
        return 
    1;

    PHP код:
    forward OnPlayerSetName(admin_idplayerid, const text[]);
    public 
    OnPlayerSetName(admin_idplayerid, const text[])
    {
        new 
    rowsfields;
        
    cache_get_data(rowsfields);
        if(
    rows) return SendClientMessage(admin_id0xAFAFAFAA"**Ник %s используется!"text);
        static const 
    fmt_query[] = "UPDATE `имя_таблицы_аккаунтов` SET `имя_игрока` = '%s' WHERE `имя_игрока` = '%s'";// ИМЕНА ТАБЛИЦЫ И СТОЛБЦА С НИКОМ ЗАМЕНИТЬ НА СВОИ
        
    new query_string[sizeof(fmt_query)+(MAX_PLAYER_NAME-2)+(MAX_PLAYER_NAME-2)],
            
    old_name[MAX_PLAYER_NAME];
        
    GetPlayerName(playeridold_nameMAX_PLAYER_NAME);
        
    format(query_stringsizeof(query_string), fmt_querynew_nameold_name);
        
    mysql_function_query(mysql_connect_IDquery_stringfalse"""");
        
    SetPlayerName(playeridtext);
        
    format(query_stringsizeof(query_string), "Теперь %s известен, как %s"old_nametext);
        
    SendClientMessageToAll(0xFF6347AAquery_string);
        
    SendClientMessage(playerid0xFF6347AA"* Не забудьте ввести свой новый ник в SA:MP Client.");
        return 
    1;

    Но работоспособность не проверял, писал прямо в браузере. Тут и оптимизация кода в целом, и отсутствие лишних самописанных функций/макросов, которых у других может не быть.
    Последний раз редактировалось DeimoS; 25.03.2016 в 21:15.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  9. Пользователь сказал cпасибо:
    BadPawn (23.01.2016)
  10. #7
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    PHP код:
    stock OnPlayerSetName(admin_idplayerid, const text[])
    {
        new 
    rowsfields;
        
    cache_get_data(rowsfields);
        if(
    rows) return SendClientMessage(admin_id0xAFAFAFAA"**Ник %s используется!"text);
        static const 
    fmt_query[] = "UPDATE `имя_таблицы_аккаунтов` SET `имя_игрока` = '%s' WHERE `имя_игрока` = '%s'";// ИМЕНА ТАБЛИЦЫ И СТОЛБЦА С НИКОМ ЗАМЕНИТЬ НА СВОИ
        
    new query_string[sizeof(fmt_query)+(MAX_PLAYER_NAME-2)+(MAX_PLAYER_NAME-2)],
            
    old_name[MAX_PLAYER_NAME];
        
    GetPlayerName(playeridold_nameMAX_PLAYER_NAME);
        
    format(query_stringsizeof(query_string), query_stringnew_nameold_name);
        
    mysql_function_query(mysql_connect_IDquery_stringfalse"""");
        
    SetPlayerName(playeridtext);
        
    format(query_stringsizeof(query_string), "Теперь %s известен, как %s"old_nametext);
        
    SendClientMessageToAll(0xFF6347AAquery_string);
        
    SendClientMessage(playerid0xFF6347AA"* Не забудьте ввести свой новый ник в SA:MP Client.");
        return 
    1;

    Но работоспособность не проверял, писал прямо в браузере. Тут и оптимизация кода в целом, и отсутствие лишних самописанных функций/макросов, которых у других может не быть.
    Только не сток, а public.

  11. Пользователь сказал cпасибо:
    DeimoS (23.01.2016)
  12. #8
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от VVWVV Посмотреть сообщение
    Только не сток, а public.
    Лол, спасибо. До самого момента отправления сообщения там был "public" и тут мне что-то в голову взбрело, что там идёт обычный вызов функции, а не MySQL запрос, и можно обойтись stock O_o
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  13. #9
    Аватар для iWors
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.03.2016
    Сообщений
    12
    Репутация:
    2 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Так своими замечаниями я именно это и пытался сделать... Осталось лишь прислушаться к ним и исправить все недочёты.
    Ну, как я понимаю, ты хочешь увидеть готовый вариант. Я сделал бы что-то типа этого:
    PHP код:
    if(!strcmp(cmdtext"/setname"true))
    {
        
    //Тут можете вставить ваш код проверки на администратора
        
    new giveplayerid,
            
    new_name[MAX_PLAYER_NAME];
        if(
    sscanf(params"us[24]"giveplayeridnew_name)) return SendClientMessage(playerid0xFFFFFFAA"***Используйте: /setname [ID/Имя_Фамилия] [New_Name]");
        if(!
    IsPlayerConnected(giveplayerid)) return SendClientMessage(playerid0xAFAFAFAA"**Персонаж отсутствует на сервере.");
        
    //Так же можно вставить свои проверки, типа проверки на авторизацию и т.п.
        
        
    static const fmt_query[] = "SELECT * FROM `имя_таблицы_аккаунтов` WHERE `имя_игрока` = '%s'";// ИМЕНА ТАБЛИЦЫ И СТОЛБЦА С НИКОМ ЗАМЕНИТЬ НА СВОИ
        
    new query_string[sizeof(fmt_query)+(MAX_PLAYER_NAME-2)];
        
    format(query_stringsizeof(query_string), query_stringnew_name);
        
    mysql_function_query(mysql_connect_IDquery_stringfalse"OnPlayerSetName""dds"playeridgiveplayeridnew_name);
        return 
    1;

    PHP код:
    forward OnPlayerSetName(admin_idplayerid, const text[]);
    public 
    OnPlayerSetName(admin_idplayerid, const text[])
    {
        new 
    rowsfields;
        
    cache_get_data(rowsfields);
        if(
    rows) return SendClientMessage(admin_id0xAFAFAFAA"**Ник %s используется!"text);
        static const 
    fmt_query[] = "UPDATE `имя_таблицы_аккаунтов` SET `имя_игрока` = '%s' WHERE `имя_игрока` = '%s'";// ИМЕНА ТАБЛИЦЫ И СТОЛБЦА С НИКОМ ЗАМЕНИТЬ НА СВОИ
        
    new query_string[sizeof(fmt_query)+(MAX_PLAYER_NAME-2)+(MAX_PLAYER_NAME-2)],
            
    old_name[MAX_PLAYER_NAME];
        
    GetPlayerName(playeridold_nameMAX_PLAYER_NAME);
        
    format(query_stringsizeof(query_string), query_stringnew_nameold_name);
        
    mysql_function_query(mysql_connect_IDquery_stringfalse"""");
        
    SetPlayerName(playeridtext);
        
    format(query_stringsizeof(query_string), "Теперь %s известен, как %s"old_nametext);
        
    SendClientMessageToAll(0xFF6347AAquery_string);
        
    SendClientMessage(playerid0xFF6347AA"* Не забудьте ввести свой новый ник в SA:MP Client.");
        return 
    1;

    Но работоспособность не проверял, писал прямо в браузере. Тут и оптимизация кода в целом, и отсутствие лишних самописанных функций/макросов, которых у других может не быть.
    В public OnPlayerSetName(admin_id, playerid, const text[])
    PHP код:
    new new_name[MAX_PLAYER_NAME]; 
    Далее
    PHP код:
    if(rows) return SendClientMessage(admin_id0xAFAFAFAA"**Ник %s используется!"text); 
    PHP код:
    format(query_stringsizeof(query_string), query_stringnew_name); 
    // получается ты трижды используешь query_string, а про fmt_query забыл
    Последний раз редактировалось iWors; 25.03.2016 в 13:34.

  14. #10
    Аватар для Seregamil
    Проверенный

    Статус
    Оффлайн
    Регистрация
    21.11.2013
    Сообщений
    551
    Репутация:
    274 ±
    Цитата Сообщение от iWors Посмотреть сообщение
    В public OnPlayerSetName(admin_id, playerid, const text[])
    PHP код:
    new new_name[MAX_PLAYER_NAME]; 
    Далее
    PHP код:
    if(rows) return SendClientMessage(admin_id0xAFAFAFAA"**Ник %s используется!"text); 
    PHP код:
    format(query_stringsizeof(query_string), query_stringnew_name); 
    // получается ты трижды используешь query_string, а про fmt_query забыл
    1) new new_name[ MAX_PLAYER_NAME + 1 ] ;
    2) без форматирования компилятор пошлет в далекие края.

  15. Пользователь сказал cпасибо:
    iWors (25.03.2016)
 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

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

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

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

Ваши права

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