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

Реклама



**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 100руб/мес, Текстовая 50руб/мес.
Показано с 1 по 4 из 4

Тема: ds__skin_selector

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

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

    ds__skin_selector

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

     Пример работы:
    Ссылка на видео vkontakte


    Для тех, кто ещё не понял, объясню подробнее:

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




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

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



    • Настройка:


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

      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__skin_selector>
      //Тут остальные инклуды 



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

      Инклуд имеет довольно "хрупкую" структуру, так как вся его работа завязана на 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__skin_selector>

      //Все скины (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
    Ссылка на скачивание - Dropbox
    Ссылка на Pastebin - Клик
    Последний раз редактировалось DeimoS; 05.12.2016 в 22:02.
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

  2. 6 пользователя(ей) сказали cпасибо:
    Anton Styazhkin (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
    Адрес
    Ташкент
    Сообщений
    231
    Репутация:
    65 ±
    Отличная работа. Очень удобная+простая с многими функционалами

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

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,340
    Репутация:
    233 ±
    Забыл 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
    Адрес
    Восточный Мордор
    Сообщений
    3,353
    Репутация:
    1338 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    И видео не работает (битая ссылка?)
    Битый аккаунт


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

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

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

    Steve Pavlina

 

 

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

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

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

Ваши права

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