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

    Статус
    Оффлайн
    Регистрация
    11.07.2015
    Сообщений
    190
    Репутация:
    25 ±

    /setskin [DC_CMD | (i)ZCMD | Pawn.CMD] [Поддержка MySQL R40+]

    /setskin
    Устанавливает скин игроку с возможностью выбора, постоянный или временный скин с поддержкой MySQL.

    Зависимости:
    • Любой командный процессор имеющий синтаксис ZCMD [DC_CMD | iZCMD, Pawn.CMD (если будете использовать флаги)]
    • sscanf 2.8.2 и выше
    • MySQL R40+


    Параметры:
    PHP код:
    targetidmodelidis_tmp 
    • targetid - ID игрока, которому будет изменятся скин
    • modelid - ID скина, который заменит нынешний скин (От 1 до 311, кроме 74. Если используется 0.3DL то еще и от 20000 до 30000)
    • is_tmp - необязательный параметр (по стандарту - 1), который обозначает постоянный скин (0) (с записью в бд) или временный (1) (без записи)



    Код:
    1. flags:setskin(/* Ваш флаг уровня администратора */);
    2. /* Если не используете флаги - удалите строчку выше */
    3. CMD:setskin(playerid, params[])
    4. {
    5. if(!/* переменная отвечающая за админку */)
    6. return SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {F6F6F6}Команда доступна только администратору.");
    7.  
    8. if(/* переменная отвечающая за админку */ < /* требуемый уровень админки для выполнения команды */)
    9. return SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {F6F6F6}Недостаточный уровень администратора, для использования команды.");
    10.  
    11. /* Если используете флаги - уберите выше обе проверки на админку и уровень администратора */
    12. extract params -> new player:targetid, modelid, is_tmp = 1; else
    13. return SendClientMessage(playerid, 0xFF9900FF, "Используйте: {F6F6F6}/setskin [playerid] [modelid] {временный (1)/постоянный (0)}");
    14.  
    15. if(targetid == INVALID_PLAYER_ID)
    16. return SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {F6F6F6}Неверный ID игрока.");
    17.  
    18. #if defined GetPlayerCustomSkin
    19. if(!(1 <= modelid <= 311) || modelid == 74 || !(20_000 <= modelid <= 30_000))
    20. return SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {F6F6F6}Неверный ID скина. Диапазон: 1 - 311 или 20000 - 30000, кроме 74.");
    21. #else
    22. if(!(1 <= modelid <= 311) || modelid == 74)
    23. return SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {F6F6F6}Неверный ID скина. Диапазон: 1 - 311, кроме 74.");
    24. #endif
    25.  
    26. new skin_modelid = /* измените на вашу переменную скина */;
    27. skin_modelid = modelid;
    28.  
    29. if(!is_tmp)
    30. {
    31. #if !defined TABLE_ACCOUNTS
    32. #define TABLE_ACCOUNTS "accounts" /* таблица с аккаунтами */
    33. #endif
    34.  
    35. #if !defined COLUMN_SKIN
    36. #define COLUMN_SKIN "skin" /* столбец отвечающий за скин */
    37. #endif
    38.  
    39. #if !defined COLUMN_ID
    40. #define COLUMN_ID "id" /* столбец отвечающий за ID игрока в базе */
    41. #endif
    42.  
    43. static const save_skin_query[] = "UPDATE "TABLE_ACCOUNTS" SET "COLUMN_SKIN" = %d WHERE "COLUMN_ID" = %d";
    44. new save_skin_str[sizeof(save_skin_query) + ((-2 * 2) + 3 + MAX_PLAYER_NAME) +1];
    45.  
    46. (
    47. save_skin_str, sizeof(save_skin_str),
    48. save_skin_query,
    49. skin_modelid,
    50. /* замените на свою переменную ID игрока, пример *PlayerInfo[playerid][pID]* */
    51. );
    52. mysql_query(/* переменная подключения MySQL */, save_skin_str, false);
    53. }
    54. SetPlayerSkin(playerid, skin_modelid);
    55.  
    56. new player_name[MAX_PLAYER_NAME +1];
    57. GetPlayerName(targetid, player_name, sizeof(player_name));
    58.  
    59. static const set_skin[] = "Выполнено: {F6F6F6}Вы установили игроку {FF9900}%s[%d] {FFFF00}%s {F6F6F6}скин под номером {FF9900}%d{F6F6F6}.";
    60. new str[sizeof(set_skin) + ((-2 * 4) + sizeof(player_name) + 4 + 10 + 3) +1];
    61.  
    62. format(str, sizeof(str), set_skin, player_name, targetid, is_tmp ? ("временный") : ("постоянный"), modelid);
    63. SendClientMessage(playerid, 0x87CEEBFF, str);
    64. return 1;
    65. }

     Скриншот

    На случай, если скриншот не появился - ссылка


    Последний раз редактировалось Kovshevoy; 31.12.2019 в 12:08.

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

    Статус
    Оффлайн
    Регистрация
    29.11.2019
    Адрес
    St. Petersburg
    Сообщений
    12
    Репутация:
    2 ±
    offtop
    Последний раз редактировалось 20th century; 02.12.2020 в 14:10.

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

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    • От вызова IsPlayerConnected можно избавиться, так как у тебя есть sscanf.
    • За место format можно использоваться strcat, к тому же на форуме используют такую идею, что имя может быть иногда и все 24 символа, так как SetPlayerName позволит это сделать.
    • Лучше использовать для локальных переменных краткие названия.
    • На этапе препроцессинга как я помню, sizeof итак возвращает +1, так что в конце это делать не нужно (для ясности можно при использовании sizeof убрать минус, а в конце всей операции добавить плюс +1).
    • Семантика save_skin_str не очень ясна, я бы просто дал имя save_req(uest).
    • Твой способ форматирования кода выглядит глупо в момент автоподсчета строки и ее форматирования. Угадай почему (:

  4. #4
    Аватар для Kovshevoy
    Пользователь

    Статус
    Оффлайн
    Регистрация
    11.07.2015
    Сообщений
    190
    Репутация:
    25 ±
    Цитата Сообщение от Desulaid Посмотреть сообщение
    • Твой способ форматирования кода выглядит глупо в момент автоподсчета строки и ее форматирования. Угадай почему (:
    Подсказку в студию.

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

    Цитата Сообщение от Desulaid Посмотреть сообщение
    • За место format можно использоваться strcat, к тому же на форуме используют такую идею, что имя может быть иногда и все 24 символа, так как SetPlayerName позволит это сделать.
    У меня это учитывается и так)

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

    Цитата Сообщение от Desulaid Посмотреть сообщение
    • От вызова IsPlayerConnected можно избавиться, так как у тебя есть sscanf.
    Не знал, что sscanf чекает, исправил.

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

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Цитата Сообщение от Kovshevoy Посмотреть сообщение
    Подсказку в студию.
    Хотя этот пункт слишком претенциозен, забудем)

  6. #6
    Аватар для Kovshevoy
    Пользователь

    Статус
    Оффлайн
    Регистрация
    11.07.2015
    Сообщений
    190
    Репутация:
    25 ±
    Цитата Сообщение от Desulaid Посмотреть сообщение
    Хотя этот пункт слишком претенциозен, забудем)
    Все-равно интересно, выкладывай.

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

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Цитата Сообщение от Kovshevoy Посмотреть сообщение
    Все-равно интересно, выкладывай.
    Цитата Сообщение от Kovshevoy Посмотреть сообщение
    static const save_skin_query[] = "UPDATE "TABLE_ACCOUNTS" SET "COLUMN_SKIN" = %d WHERE "COLUMN_ID" = '%d' LIMIT 1";
    static save_skin_str[sizeof(save_skin_query) + ((-2 * 2) + 3 + MAX_PLAYER_NAME) +1];

    format
    (
    save_skin_str, sizeof(save_skin_str),
    save_skin_query,
    /* измените на вашу переменную скина */,
    /* замените на свою переменную ID игрока, пример *PlayerInfo[playerid][pID]* */
    );
    Типа смотри как вылезла строка save_skin_query, format на ее фоне теряет свою компактность)

  8. #8
    Аватар для Kovshevoy
    Пользователь

    Статус
    Оффлайн
    Регистрация
    11.07.2015
    Сообщений
    190
    Репутация:
    25 ±
    Цитата Сообщение от Desulaid Посмотреть сообщение
    Типа смотри как вылезла строка save_skin_query, format на ее фоне теряет свою компактность)
    Я тут с челиком одним, по фану РЛС для паблика оптимизируем и до ума доводим, так что у меня тут и пострашней вещи есть.
    http://prntscr.com/qboqgd

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

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Вообще можно избавиться от создания локального массива player_name и использовать уже имеющийся:

    1. static const set_skin[] = "{87CEEB}Выполнено: {F6F6F6}Вы установили игроку {FF9900}%s[%d] {FFFF00}%s {F6F6F6}скин под номером {FF9900}%d{F6F6F6}.";
    2. static str[sizeof(set_skin) + ((-2 * 4) + MAX_PLAYER_NAME + 4 + 10 + 3) +1];
    3.  
    4. str = "";
    5. GetPlayerName(player_id, str, sizeof(str));
    6. format(str, sizeof(str), set_skin, str, player_id, parameter ? "временный" : "постоянный", modelid);


    Немного не читабельно, но всё же

  10. #10
    Аватар для Kovshevoy
    Пользователь

    Статус
    Оффлайн
    Регистрация
    11.07.2015
    Сообщений
    190
    Репутация:
    25 ±
    Цитата Сообщение от execution Посмотреть сообщение
    Вообще можно избавиться от создания локального массива player_name и использовать уже имеющийся:

    1. static const set_skin[] = "{87CEEB}Выполнено: {F6F6F6}Вы установили игроку {FF9900}%s[%d] {FFFF00}%s {F6F6F6}скин под номером {FF9900}%d{F6F6F6}.";
    2. static str[sizeof(set_skin) + ((-2 * 4) + MAX_PLAYER_NAME + 4 + 10 + 3) +1];
    3.  
    4. str = "";
    5. GetPlayerName(player_id, str, sizeof(str));
    6. format(str, sizeof(str), set_skin, str, player_id, parameter ? "временный" : "постоянный", modelid);


    Немного не читабельно, но всё же
    В своем моде я вообще не использую GetPlayerName, ибо у меня при входе берется ник игрока и хранится в переменной на протяжении всей игровой сессии.

 

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

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

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

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

Ваши права

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