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

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

    sscanf id/playername

    здравствуйте, пытаюсь со сканфом разобраться
    делаю кмд чтоб сажать в тюрьму игроков online/offline
    с оффлайном вроде работает, а если вводить id - то он считает этот id за строку

    1. new pId, pName[24], minutes, reason[64];
    2.  
    3. if(isNumeric(params[0])) { // Input ID
    4.  
    5. print("Num");
    6. if(sscanf(params, "ids[64]", pId, minutes, reason)) return SendClientMessage(playerid, -1, "{bfc0c2}Используйте: /prison [playerid / username] [minutes] [reason]");
    7. if(!IsPlayerConnected(pId)) return SendClientMessage(playerid, -1, "{bfc0c2}Игрок не в сети");
    8. format(pName, sizeof(pName), "%s", getName(pId));
    9.  
    10. playerInfo[pId][jailTime] = minutes * 60;
    11. SetPlayerPos(pId, 1302.519897,-1.787510,1001.028259);
    12. } else { // Input Name
    13. if(strlen(params[0]) > 0) {
    14. if(sscanf(params, "s[24]ds[64]", pName, minutes, reason)) return SendClientMessage(playerid, -1, "{bfc0c2}Используйте: /prison [playerid / username] [minutes] [reason]");
    15. }
    16. }
    17.  
    18. new selectQuery[128];
    19. mysql_format(dbHandle, selectQuery, sizeof(selectQuery), "SELECT `Username` FROM `players` WHERE `Username` = '%s'", pName);
    20. mysql_query(dbHandle, selectQuery);
    21.  
    22. new rows = cache_num_rows();
    23.  
    24. if(rows)
    25. {
    26. new updateQuery[128];
    27. mysql_format(dbHandle, updateQuery, sizeof(updateQuery), "UPDATE `players` SET `Jail` = '%d' WHERE `Username` = '%s'", minutes, pName);
    28. mysql_query(dbHandle, updateQuery);
    29. }

  2. #2
    Аватар для oukibt
    Пользователь

    Статус
    Оффлайн
    Регистрация
    27.02.2020
    Сообщений
    26
    Репутация:
    3 ±
    1. new pId, pName[24], minutes, reason[64];
    2.  
    3. if(!sscanf(params, "dds[64]", pId, minutes, reason)) return SendClientMessage(playerid, -1, "{bfc0c2}Используйте: /prison [playerid / username] [minutes] [reason]");
    4. { // Если ввёл ID
    5.  
    6. }
    7. else if(!sscanf(params, "s[25]ds[64]", pName, minutes, reason)) return SendClientMessage(playerid, -1, "{bfc0c2}Используйте: /prison [playerid / username] [minutes] [reason]");
    8. { // Если ввёл имя
    9.  
    10. }
    11. else return SendClientMessage(playerid, -1, "{bfc0c2}Используйте: /prison [playerid / username] [minutes] [reason]");
    12.  
    13. /// Other code

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    +- так
    1. new input_name[MAX_PLAYER_NAME];
    2. new minute;
    3. if(sscanf(params, "s[20]is[128]", input_name, minute, params))
    4. {
    5. SendClientMessage(playerid, 0xbfc0c2FF, "Используйте: /prison [playerid / username] [minutes] [reason]");
    6. return 1;
    7. }
    8. new target_id = -1;
    9. if(sscanf(input_name, "i", target_id))
    10. {
    11. foreach(new i: Player)
    12. {
    13. if(!strcmp(getName(i), input_name))
    14. {
    15. target_id = i;
    16. break;
    17. }
    18. }
    19. }
    20.  
    21. if(target_id >= 0)
    22. {
    23. if(!IsPlayerConnected(target_id))
    24. {
    25. SendClientMessage(playerid, 0xbfc0c2FF, "Игрок с указанным ID не найден на сервере.");
    26. return 1;
    27. }
    28. input_name[0] = '\0';
    29. strcat(input_name, getName(target_id));
    30. }
    31.  
    32.  
    33. if(target_id != -1)
    34. {
    35. playerInfo[target_id][jailTime] = minute * 60;
    36. SetPlayerInterior(target_id, 1);
    37. SetPlayerPos(target_id, 1302.519897,-1.787510,1001.028259);
    38.  
    39. SendClientMessage(playerid, -1, "Игрок посажен онлайн");
    40. SendClientMessage(playerid, -1, "Причина:");
    41. SendClientMessage(playerid, -1, params);
    42. }
    43. else
    44. {
    45. new query_string[47+MAX_PLAYER_NAME+1];
    46. mysql_format(dbHandle, query_string, sizeof(query_string), "SELECT id FROM players WHERE Username='%e' LIMIT 1", input_name);
    47. new Cache:r = mysql_query(dbHandle, query_string);
    48.  
    49. if(cache_num_rows())
    50. {
    51. new id;
    52. cache_get_value_name_int(0, "id");
    53. cache_delete(r);
    54. mysql_format(dbHandle, query_string, sizeof(query_string),
    55. "UPDATE players SET Jail=%d WHERE id=%i", minute, id);
    56. mysql_query(dbHandle, query_string);
    57.  
    58. SendClientMessage(playerid, -1, "Игрок посажен оффлайн");
    59. SendClientMessage(playerid, -1, "Причина:");
    60. SendClientMessage(playerid, -1, params);
    61. }
    62. else
    63. {
    64. SendClientMessage(playerid, 0xbfc0c2FF, "Указанный игрок не найден.");
    65. return 1;
    66. }
    67. }


    "id" в запросе замени на имя столбца, в котором у тебя хранится ID аккаунта

    Цитата Сообщение от oukibt Посмотреть сообщение
    1. new pId, pName[24], minutes, reason[64];
    2.  
    3. if(!sscanf(params, "dds[64]", pId, minutes, reason)) return SendClientMessage(playerid, -1, "{bfc0c2}Используйте: /prison [playerid / username] [minutes] [reason]");
    4. { // Если ввёл ID
    5.  
    6. }
    7. else if(!sscanf(params, "s[25]ds[64]", pName, minutes, reason)) return SendClientMessage(playerid, -1, "{bfc0c2}Используйте: /prison [playerid / username] [minutes] [reason]");
    8. { // Если ввёл имя
    9.  
    10. }
    11. else return SendClientMessage(playerid, -1, "{bfc0c2}Используйте: /prison [playerid / username] [minutes] [reason]");
    12.  
    13. /// Other code
    По какой логике твой код должен работать? Ты прерываешь выполнение кода в случае, если условие не сработало (при том, в случае, если sscanf успешно обработал строку), и, при этом, добавляешь следующие условия в else?
    Последний раз редактировалось DeimoS; 12.03.2021 в 11:08.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    27.02.2020
    Сообщений
    26
    Репутация:
    3 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    По какой логике твой код должен работать?
    Примерно по такой

    1. new pId, pName[24], minutes, reason[64];
    2.  
    3. if(!sscanf(params, "dds[64]", pId, minutes, reason))
    4. { // Если ввёл ID
    5.  
    6. if(!IsPlayerConnected(pId)) return SendClientMessage(playerid, -1, "{bfc0c2}Игрок не в сети");
    7.  
    8. format(pName, sizeof(pName), "%s", getName(pId));
    9.  
    10. playerInfo[pId][jailTime] = minutes * 60;
    11. SetPlayerPos(pId, 1302.519897, -1.787510, 1001.028259);
    12.  
    13. new selectQuery[128];
    14. mysql_format(dbHandle, selectQuery, sizeof(selectQuery), "SELECT `Username` FROM `players` WHERE `Username` = '%s'", pName);
    15. mysql_query(dbHandle, selectQuery);
    16. }
    17. else if(!sscanf(params, "s[25]ds[64]", pName, minutes, reason))
    18. { // Если ввёл имя
    19.  
    20. new selectQuery[128];
    21. mysql_format(dbHandle, selectQuery, sizeof(selectQuery), "SELECT `Username` FROM `players` WHERE `Username` = '%s'", pName);
    22. mysql_query(dbHandle, selectQuery);
    23. }
    24. else return SendClientMessage(playerid, -1, "{bfc0c2}Используйте: /prison [playerid / username] [minutes] [reason]");
    25.  
    26. new rows = cache_num_rows();
    27.  
    28. if(rows)
    29. {
    30. new updateQuery[128];
    31. mysql_format(dbHandle, updateQuery, sizeof(updateQuery), "UPDATE `players` SET `Jail` = '%d' WHERE `Username` = '%s'", minutes, pName);
    32. mysql_query(dbHandle, updateQuery);
    33. }


    Да, с виду вариант далеко не идеальный, так как один и тот же код есть в обеих условиях. Можно, конечно, этого избежать, сделав вот такой вариант

    1. new pId, pName[24], minutes, reason[64];
    2.  
    3. if(!sscanf(params, "dds[64]", pId, minutes, reason))
    4. { // Если ввёл ID
    5.  
    6. if(!IsPlayerConnected(pId)) return SendClientMessage(playerid, -1, "{bfc0c2}Игрок не в сети");
    7.  
    8. format(pName, sizeof(pName), "%s", getName(pId));
    9.  
    10. playerInfo[pId][jailTime] = minutes * 60;
    11. SetPlayerPos(pId, 1302.519897, -1.787510, 1001.028259);
    12. }
    13. else if(!sscanf(params, "s[25]ds[64]", pName, minutes, reason))
    14. { // Если ввёл имя
    15.  
    16. }
    17. else return SendClientMessage(playerid, -1, "{bfc0c2}Используйте: /prison [playerid / username] [minutes] [reason]");
    18.  
    19. new selectQuery[128];
    20. mysql_format(dbHandle, selectQuery, sizeof(selectQuery), "SELECT `Username` FROM `players` WHERE `Username` = '%s'", pName);
    21. mysql_query(dbHandle, selectQuery);
    22.  
    23. new rows = cache_num_rows();
    24.  
    25. if(rows)
    26. {
    27. new updateQuery[128];
    28. mysql_format(dbHandle, updateQuery, sizeof(updateQuery), "UPDATE `players` SET `Jail` = '%d' WHERE `Username` = '%s'", minutes, pName);
    29. mysql_query(dbHandle, updateQuery);
    30. }


    Но кода во втором условии не будет вообще.

    Что насчет вот этого:

    1. if(!sscanf(params, "dds[64]", pId, minutes, reason)) return SendClientMessage(playerid, -1, "{bfc0c2}Используйте: /prison [playerid / username] [minutes] [reason]");


    Не увидел
    Последний раз редактировалось oukibt; 12.03.2021 в 18:48.

 

 

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

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

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

Ваши права

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