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

Тема: ds_skinselector

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±

    ds_skinselector

    Данный инклуд добавляет возможность создавать фильтры для стандартного выбора скинов

     Описание работы:

    Данный инклуд "перехватывает" стандартный выбор скинов, позволяя управлять тем, какие скины будут отображаться при нажатии на кнопки выбора
    ("<<" и ">>")
    Это позволяет создавать своеобразные фильтры (например, отображать только мужские или только женские скины), не создавая дополнительных текстдравов
    (как это делается на большинстве серверов на данный момент).
    Скины для фильтров хранятся в массивах и легко добавляются/изменяются.
    Для управления фильтрами в инклуде присутствует приличный функционал.




    • Подключение:

      Для работы инклуда не требуется никаких дополнительных библиотек.
      Что-бы подключить инклуд, достаточно добавить в начало мода, после подключения "a_samp"
      PHP код:
      #include <ds_skinselector> 
       Получится так
      PHP код:
      #include <a_samp>
      #include <ds_skinselector>
      //Тут остальные инклуды 



    • Настройка:


      Для удобства настройки некоторые данные вынесены в макросы:
      Имя макроса Значение по умолчанию Описание макроса

      MAX_REGISTERED_ID_FILTERS

      10
      В данном макросе указывается максимальное число фильтров, которые могут быть созданы одновременно.
      ID фильтров начинаются с нуля, следовательно, по умолчанию доступны слоты с
      "0" по "9".

      MAX_REGISTERED_NAME_FILTERS

      30

      Максимальная длина для имени фильтров.

      INVALID_SS_FILTER_ID

      -1

      Значение, которое будет возвращаться при любых ошибках, связанных с функциями инклуда

      Пример настройки:
      PHP код:
      #include <a_samp>

      #define MAX_REGISTERED_ID_FILTERS       30// Увеличим число фильтров до 30
      #define MAX_REGISTERED_NAME_FILTERS  14// Уменьшим максимальную длину имени фильтров до 14
      #include <ds_skinselector>
      //Тут остальные инклуды 



    • Особенности работы:

      Инклуд имеет довольно "хрупкую" структуру, так как вся его работа завязана на AddPlayerClass, которые создаются внутри него (точнее, на их суммарном количестве).
      Поэтому:

      Если в вашем моде присутствуют функции AddPlayerClass/AddPlayerClassEx, удалите их.
      Любая лишняя единица данных функций заставит систему работать некорректно.

      Так же в инклуде учтен переход к выбору скина при смерти (нажатие на F4) и с помощью ForceClassSelection.



    • Новый коллбэк:

      PHP код:
      OnPlayerSelectedSkin(playeridclassid
      Данный коллбэк является платформой для функций-обработчиков данных из OnDialogResponse.
      Иными словами, он нужен лишь для того, чтоб Вы записывали в него определённые функции из инклуда.
      Подробнее об этих функциях расскажу ниже.



    • Описание функций:

       Создать фильтр (CreateNewSelectorFilter)

      Синтаксис
      PHP код:
      CreateNewSelectorFilter(filterskin_idfilter_name[], skins_array[]) 



      Описание
      Данная функция создаёт (регистрирует в памяти) новый фильтр



      Возвращаемые значения:
      1
      | Фильтр успешно создан
      INVALID_SS_FILTER_ID
      | Создать фильтр не удалось (превышен лимит/указан невалидный или занятый ID)



      Параметры:
      filterskin_id
      Свободный ID фильтра
      filter_name[]
      Имя для фильтра (поддерживаются все символы)
      skins_array[]
      Массив, в котором перечислены скины для фильтра




        Обработчик созданного фильтра

       CallSelectorFilterByID
      Синтаксис
      PHP код:
      CallSelectorFilterByID(skin_filter_idskins_array[]) 



      Описание
      Данная функция служит "сердцем" системы, обрабатывая данные OnPlayerRequestClass и адаптируя их под указанный фильтр.
      Используется исключительно внутри коллбэка OnPlayerSelectedSkin.
      При добавлении нового фильтра является обязательной.

      Отличается от следующей функции тем, что нужный фильтр указывается в виде ID



      Возвращаемые значения:
      1
      | В случае успешной обработки кода (фильтр создан и совпадает с тем, что включен у игрока)
      INVALID_SS_FILTER_ID
      | Фильтр не найден



      Параметры:
      skin_filter_id
      ID фильтра для обработки
      skins_array[]
      Массив, в котором хранятся скины для фильтра


       CallSelectorFilterByName
      Синтаксис
      PHP код:
      CallSelectorFilterByID(_filter_name[], skins_array[]) 



      Описание
      Данная функция служит "сердцем" системы, обрабатывая данные OnPlayerRequestClass и адаптируя их под указанный фильтр.
      Используется исключительно внутри коллбэка OnPlayerSelectedSkin.
      При добавлении нового фильтра является обязательной.

      Отличается от предыдущей функции тем, что нужный фильтр указывается в виде имени



      Возвращаемые значения:
      1
      | В случае успешной обработки кода (фильтр создан и совпадает с тем, что включен у игрока)
      INVALID_SS_FILTER_ID
      | Фильтр не найден



      Параметры:
      _filter_name[]
      Имя фильтра для обработки
      skins_array[]
      Массив, в котором хранятся скины для фильтра





       Установка/изменение фильтра по умолчанию

       SetDefaultSelectorFilter_ID
      Синтаксис
      PHP код:
      SetDefaultSelectorFilter_ID(filterid



      Описание
      Функция изменяет фильтр по умолчанию (тот, который будет выдаваться игрокам при входе на сервер)
      Отличается от следующей функции тем, что нужный фильтр указывается в виде ID



      Возвращаемые значения:
      ID фильтра
      | Фильтр успешно изменён
      INVALID_SS_FILTER_ID
      | Фильтр не найден



      Параметры:
      filterid
      ID фильтра для установки по умолчанию



       SetDefaultSelectorFilter_Name
      Синтаксис
      PHP код:
      SetDefaultSelectorFilter_Name(_filter_name[]) 



      Описание
      Функция изменяет фильтр по умолчанию (тот, который будет выдаваться игрокам при входе на сервер)
      Отличается от предыдущей функции тем, что нужный фильтр указывается в виде имени



      Возвращаемые значения:
      ID фильтра
      | Фильтр успешно изменён
      INVALID_SS_FILTER_ID
      | Фильтр не найден



      Параметры:
      _filter_name[]
      Имя фильтра для установки по умолчанию





        Извлечение фильтра по умолчанию(GetDefaultSelectorFilter)

      Синтаксис
      PHP код:
      GetDefaultSelectorFilter(); 



      Описание
      Функция возвращает ID фильтра, установленного по умолчанию



      Возвращаемые значения:
      ID фильтра



      Параметры:
      ---





       Удаление фильтра

       DeleteSelectorFilter_ID
      Синтаксис
      PHP код:
      DeleteSelectorFilter_ID(filterid



      Описание
      Функция удаляет указанный фильтр.*
      Отличается от следующей функции тем, что нужный фильтр указывается в виде ID

      * Массив со скинами, при использовании функции, не удаляется/отчищается. Функция лишь освобождает слот от фильтра



      Возвращаемые значения:
      ID фильтра
      | Фильтр успешно удалён
      INVALID_SS_FILTER_ID
      | Фильтр не найден



      Параметры:
      filterid
      ID фильтра для удаления


       DeleteSelectorFilter_Name
      Синтаксис
      PHP код:
      DeleteSelectorFilter_Name(_filter_name[]) 



      Описание
      Функция удаляет указанный фильтр.*
      Отличается от предыдущей функции тем, что нужный фильтр указывается в виде имени

      * Массив со скинами, при использовании функции, не удаляется/отчищается. Функция лишь освобождает слот от фильтра



      Возвращаемые значения:
      ID фильтра
      | Фильтр успешно удалён
      INVALID_SS_FILTER_ID
      | Фильтр не найден



      Параметры:
      _filter_name[]
      Имя фильтра для удаления





       Поиск фильтра

       GetSelectorFilterID
      Синтаксис
      PHP код:
      GetSelectorFilterID(filterid



      Описание
      Функция производит поиск указанного фильтра среди созданных.
      Отличается от следующей функции тем, что нужный фильтр указывается в виде ID



      Возвращаемые значения:
      Имя фильтра,
      который находится под указанным ID
      | Фильтр существует
      "Error"
      | Фильтр не найден



      Параметры:
      filterid
      ID фильтра для поиска


       GetSelectorFilterName
      Синтаксис
      PHP код:
      GetSelectorFilterName(_filter_name[]) 



      Описание
      Функция производит поиск указанного фильтра среди созданных.
      Отличается от предыдущей функции тем, что нужный фильтр указывается в виде имени



      Возвращаемые значения:
      ID фильтра,
      в котором записано указанное имя
      | Фильтр существует
      INVALID_SS_FILTER_ID
      | Фильтр не найден



      Параметры:
      _filter_name[]
      Имя фильтра для поиска





       Проверка валидности фильтра

       IsSelectorFilterValid_ID
      Синтаксис
      PHP код:
      IsSelectorFilterValid_ID(filterid



      Описание
      Функция проверяет существование (валидность) фильтра.
      Отличается от следующей функции тем, что нужный фильтр указывается в виде ID



      Возвращаемые значения:
      1
      | Фильтр существует
      INVALID_SS_FILTER_ID
      | Фильтр не найден



      Параметры:
      filterid
      ID фильтра для поиска

       IsSelectorFilterValid_Name
      Синтаксис
      PHP код:
      IsSelectorFilterValid_Name(_filter_name[]) 



      Описание
      Функция проверяет существование (валидность) фильтра.
      Отличается от предыдущей функции тем, что нужный фильтр указывается в виде имени



      Возвращаемые значения:
      1
      | Фильтр существует
      INVALID_SS_FILTER_ID
      | Фильтр не найден



      Параметры:
      _filter_name[]
      Имя фильтра для поиска





       Переключение между фильтрами для определённого игрока

       SetSelectorFilterForPlayer_ID
      Синтаксис
      PHP код:
      SetSelectorFilterForPlayer_ID(playeridfilteridskins_array[]) 



      Описание
      Функция позволяет изменить ID фильтра для игрока
      Отличается от следующей функции тем, что нужный фильтр указывается в виде ID



      Возвращаемые значения:
      1
      | Фильтр успешно изменён
      INVALID_SS_FILTER_ID
      | Произошла ошибка (игрок оффлайн/фильтр не существует и т.п.)



      Параметры:
      playerid
      ID игрока, которому нужно изменить фильтр
      filterid
      ID фильтра, который нужно установить игроку
      skins_array[]
      Массив, в котором хранятся скины для фильтра


       SetSelectorFilterForPlayer_Name
      Синтаксис
      PHP код:
      SetSelectorFilterForPlayer_Name(playerid_filter_name[], skins_array[]) 



      Описание
      Функция позволяет изменить ID фильтра для игрока
      Отличается от предыдущей функции тем, что нужный фильтр указывается в виде имени



      Возвращаемые значения:
      1
      | Фильтр успешно изменён
      INVALID_SS_FILTER_ID
      | Произошла ошибка (игрок оффлайн/фильтр не существует и т.п.)



      Параметры:
      playerid
      ID игрока, которому нужно изменить фильтр
      _filter_name[]
      Имя фильтра, который нужно установить игроку
      skins_array[]
      Массив, в котором хранятся скины для фильтра





        Узнать ID фильтра, установленного для игрока (GetSelectorFilterForPlayer)

      Синтаксис
      PHP код:
      GetSelectorFilterForPlayer(playerid



      Описание
      Функция позволяет узнать ID фильтра, который установлен у игрока



      Возвращаемые значения:
      ID фильтра
      | Игрок онлайн
      INVALID_SS_FILTER_ID
      | Игрок оффлайн



      Параметры:
      playerid
      ID игрока, фильтр которого нужно узнать





       Свободный ID фильтра (GetSelectorFilterFreeID)

      Синтаксис
      PHP код:
      GetSelectorFilterFreeID() 



      Описание
      Функция возвращает первый свободный слот для фильтра



      Возвращаемые значения:
      ID фильтра



      Параметры:
      ---



      *Примечание:
      Описание данных функций продублировано внутри самого инклуда




    • Примеры использования:

       Простенькая система выбора скинов при входе на сервер

      Начало мода:
      PHP код:
      #include <a_samp>
      #include <other\ds_skinselector>

      //Все скины (74 скина в SA-MP не существует, поэтому он закомментирован)
      new all_skins[] = 
      {
          
      12345678910,
          
      11121314151617181920,
          
      21222324252627282930,
          
      31323334353637383940,
          
      41424344454647484950,
          
      51525354555657585960,
          
      61626364656667686970,
          
      717273/*74,*/ 757677787980,
          
      81828384858687888990,
          
      919293949596979899100,
          
      101102103104105106107108109110,
          
      111112113114115116117118119120,
          
      121122123124125126127128129130,
          
      131132133134135136137138139140,
          
      141142143144145146147148149150,
          
      151152153154155156157158159160,
          
      161162163164165166167168169170,
          
      171172173174175176177178179180,
          
      181182183184185186187188189190,
          
      191192193194195196197198199200,
          
      201202203204205206207208209210,
          
      211212213214215216217218219220,
          
      221222223224225226227228229230,
          
      231232233234235236237238239240,
          
      241242243244245246247248249250,
          
      251252253254255256257258259260,
          
      261262263264265266267268269270,
          
      271272273274275276277278279280,
          
      281282283284285286287288289290,
          
      291292293294295296297298299300,
          
      301302303304305306307308309310,
          
      311
      };

      //Все женские скины
      new female_skins[] =
      {
          
      910111213313940415354555663,
          
      6465697576778587888990919293,
          
      129130131132138139140141145148150,
          
      151152157169172178190191192193194,
          
      195196197198199201205207211214215,
          
      216218219224225226231232233237238,
          
      243244245246251256257263298306307,
          
      308309
      };

      //Все мужские скины (74 скина в SA-MP не существует, поэтому он закомментирован)
      new male_skins[] =
      {
          
      1234567814151617181920,
          
      21222324252627282930323334,
          
      35363738424344454647484950,
          
      51525758596061626667687071,
          
      7273/*74,*/ 78798081828384869495,
          
      96979899100101102103104105106,
          
      107108109110111112113114115116,
          
      117118119120121122123124125126,
          
      127128133134135136137142143144,
          
      146147149153154155156158159160,
          
      161162163164165166167168170171,
          
      173174175176177179180181182183,
          
      184185186187188189200202203204,
          
      206208209210212213217220221222,
          
      223227228229230234235236239240,
          
      241242247248249250252253254255,
          
      258259260261262264265266267268,
          
      269270271272273274275276277278,
          
      279280281282283284285286287288,
          
      289290291292293294295296297299,
          
      300301302303304305310311
      }; 
      В начало OnGameModeInit
      PHP код:
      //Зарегистрируем в памяти 3 новых фильтра
      CreateNewSelectorFilter(0"Все скины"all_skins);
      CreateNewSelectorFilter(1"Женские скины"female_skin);
      CreateNewSelectorFilter(2"Мужские скины"male_skin);

      //И установим фильтр со всеми скинами как фильтр по умолчанию
      SetDefaultSelectorFilter_Name("Все скины"); 
      Новый коллбэк
      PHP код:
      public OnPlayerSelectedSkin(playeridclassid)
      {
          
      //Добавляем функции-обработчики для каждого из фильтров
          
      CallSelectorFilterByName("Все скины"all_skins);
          
      CallSelectorFilterByName("Женские скины"female_skin);
          
      CallSelectorFilterByName("Мужские скины"male_skin);
          return 
      1;

      И простая команда для переключения (вводить прямо при выборе скина)
      PHP код:
      public OnPlayerCommandText(playeridcmdtext[])
      {
          if (
      strcmp("/s"cmdtexttrue10) == 0)
          {
              switch(
      GetSelectorFilterForPlayer(playerid))// Узнаём текущий ID фильтра
              
      {
                  case 
      0:// Если он равен нулю (все скины)
                  
      {// Переключаем на следующий (женские скины)
                      
      SendClientMessage(playerid, -1"Показаны женские скины");
                      
      SetSelectorFilterForPlayer_Name(playerid"Женские скины"female_skin);
                      
      /*
                          Равносильно:
                          SetSelectorFilterForPlayer_ID(playerid, 1, female_skin);
                      */
                  
      }
                  case 
      1:// Если он равен одному (женские скины)
                  
      {// Переключаем на следующий (мужские скины)
                      
      SendClientMessage(playerid, -1"Показаны мужские скины");
                      
      SetSelectorFilterForPlayer_Name(playerid"Мужские скины"male_skin);
                      
      /*
                          Равносильно:
                          SetSelectorFilterForPlayer_ID(playerid, 2, male_skin);
                      */    
                  
      }
                  case 
      2:// Если он равен двум (мужские скины)
                  
      {// Переключаем на самый первый (все скины)
                      
      SendClientMessage(playerid, -1"Показаны все скины");
                      
      SetSelectorFilterForPlayer_Name(playerid"Все скины"all_skins);
                      
      /*
                          Равносильно:
                          SetSelectorFilterForPlayer_ID(playerid, 0, all_skins);
                      */
                  
      }
              }
              return 
      1;
          }
          return 
      0;



       К системе выбора скинов добавим команду для смены скина прямо во время игры (например, полицейским)

      Скины, опять же, разделим на мужские и женские (чисто для наглядности того, как нужно менять фильтры)
      PHP код:
      new police_male_skins[] = 
      {
          
      265266267,
          
      280281282,
          
      283284300,
          
      301302310,
          
      311
      };
      //Судя по такой разнице в количестве скинов,
      //Куй немножко сексист :3
      new police_female_skins[] = 
      {
          
      306307309
      }; 


      OnGameModeInit
      PHP код:
      CreateNewSelectorFilter(0"Все скины"all_skins); 
      CreateNewSelectorFilter(1"Женские скины"female_skin); 
      CreateNewSelectorFilter(2"Мужские скины"male_skin); 
      SetDefaultSelectorFilter_Name("Все скины"); 

      //К нашим старым фильтрам добавим ещё 2 новых
      CreateNewSelectorFilter(3"Женские скины (полиция)"police_female_skins); 
      CreateNewSelectorFilter(4"Мужские скины (полиция)"police_male_skins); 

      Новый коллбэк
      PHP код:
      public OnPlayerSelectedSkin(playeridclassid

          
      CallSelectorFilterByName("Все скины"all_skins); 
          
      CallSelectorFilterByName("Женские скины"female_skins); 
          
      CallSelectorFilterByName("Мужские скины"male_skins); 

          
      //И тут парочку
          
      CallSelectorFilterByName("Женские скины (полиция)"police_female_skins); 
          
      CallSelectorFilterByName("Мужские скины (полиция)"police_male_skins); 
          return 
      1


      PHP код:
      if(!strcmp("/force"cmdtexttrue)) 

          
      //Установим игроку нужный фильтр
          
      SetSelectorFilterForPlayer_Name(playerid"Женские скины (полиция)"police_female_skins); 
          
      //И отправим выбирать скин
          
      ForceClassSelection(playerid);
          
      TogglePlayerSpectating(playeridtrue);
             
      TogglePlayerSpectating(playeridfalse);
          return 
      1


      //А это команда, с помощью которой будем менять фильтр
      else if(!strcmp("/forcefilters"cmdtexttrue12)) 

          if(!
      strlen(cmdtext[14]))
              return 
      SendClientMessage(playerid, -1"/forcefilters <м/ж>");

          if(!
      strcmp(cmdtext[14], "м"true))//Если игрок ввёл "/forcefilters м"
          
      {
              
      SendClientMessage(playerid, -1"Показаны мужские скины"); 
              
      //Покажем мужские скины
              
      SetSelectorFilterForPlayer_Name(playerid"Мужские скины (полиция)"police_male_skins); 
          }
          else if(!
      strcmp(cmdtext[14], "ж"true))//Если "ж"
          
      {
              
      SendClientMessage(playerid, -1"Показаны женские скины"); 
              
      //Покажем женские скины
              
      SetSelectorFilterForPlayer_Name(playerid"Женские скины (полиция)"police_female_skins); 
          }
          else 
              
      SendClientMessage(playerid, -1"/forcefilters <м/ж>");
          return 
      1



      Обе системы очень примитивны и просто являются примером использования данного инклуда.
      Смену фильтров Вы можете реализовать как вашей душе угодно (на видео, что я давал в самом начале статьи, смена фильтров реализована через текстдравы).
      Основная задача данного инклуда - предоставить функционал. А уже как Вы им распорядитесь - ваше право :)

      P.S. С данным инклудом довольно легко реализовать, например, магазин одежды. Или же систему гардероба. Да много чего можно сделать. Точнее, всё, что связано со скинами :D
      Есть один маленький совет: вместо обычных ID использовать либо макросы, либо enum. Тогда проще будет контролировать свободные/занятые ID


    Автор инклуда - DeimoS
    Ссылка на Pastebin - Клик
    Последний раз редактировалось DeimoS; 25.02.2021 в 10:10.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  2. 6 пользователя(ей) сказали cпасибо:
    Desulaid (09.10.2016) Geebrox (09.10.2016) Nurick (09.10.2016) Osetin (09.10.2016) VVWVV (09.10.2016) Тузик (09.10.2016)
  3. #2
    Аватар для Geebrox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±
    Отличная работа. Очень удобная+простая с многими функционалами

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

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Забыл PHP тэги.

    И видео не работает (битая ссылка?)

    И ещё массив со всеми скинами можно было бы заполнить при запуске мода (чтобы не вписывать в ручную каждый скин, только пропустить итерацию 74 и код стал бы намного красивей, но ты проделал лишнею работу)
    Последний раз редактировалось $continue$; 09.10.2016 в 01:37.
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    И видео не работает (битая ссылка?)
    Битый аккаунт


    Цитата Сообщение от $continue$ Посмотреть сообщение
    И ещё массив со всеми скинами можно было бы заполнить при запуске мода (чтобы не вписывать в ручную каждый скин, только пропустить итерацию 74 и код стал бы намного красивей, но ты проделал лишнею работу)
    Эмм, а кто сказал, что я его вручную заполнял?
    Если ты имеешь ввиду заполнение циклом, а не "визуальное" заполнение, то тут всё упирается в функциональность. В массиве я могу, например, выставить скины в нужном мне порядке, перемешивая их как угодно. Могу убрать какие-то скины. Да много чего могу. С циклом же такое не провернуть так же легко, как с массивом.

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

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

    Steve Pavlina

 

 

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

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

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

Ваши права

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