XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Желтая пресса: обучающие статьи
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Результаты опроса: Как статья?
Супер 8 42.11%
Номальная 10 52.63%
Отстой 1 5.26%
Голосовавшие: 19. Вы еще не голосовали в этом опросе

 
J
expert
offline
Опыт: 48,447
Активность:
Мультиборд
Данная статья расскажет вам, как надо нормально и правильно создавать MultiBoard, или в русской версии WE Меню паузы (но дальше мы будем называть ее просто MultiBoard-ом).
Это статья состоит из четырех частей, перваявведение, во второй я расскажу о теории создания MultiBoard-а, и обо всех действиях ему присущих, в третьей раскажу о некоторых хитростях и фичах мультиборда, а в четвертой перейдем непосредственно к практике, и попробуем создать свой простенький MultiBoard.

Введение

Думаю, вы все уже видели MultiBoard, т.к. не одна хорошая, или даже просто не плохая ката, не обходится без этой поистине уникальной вещи. MultiBoard может содержать в себе очень много информации, и притом совершенно не мешает окружению игры, т.к. ОчЕнЬ компактно складывается, в отличие от LeaderBoard. Его применение не ограничивается просто выводом информации, также его можно использовать во многих других по истине разнообразных целях:
  1. Можно сделать часики и результат будет превосходить по качеству даже действия, типа – Обратный отсчет.
  2. Можно сделать очень прикольную вещь – Радар, в принципе это весьма сложно сделать без тормозов в игре, и не приобретя много геморроя.
  3. Можно также сделать всякие разнообразные простенькие игры, ну например танчики.
  4. И многое-многое другое.

Теория

Что нужно сделать, чтобы создать MultiBoard:
Нужно использовать действие: Меню паузы – Create.
Пример:
Код:
Create a multiboard with 3 columns and 2 rows, titled "Мультиборд"


Что означает это действие? Означает то, что будет создан MultiBoard под названием “Мультиборд” с 3-мя столбцами и 2 строчками.
Вы можете попробовать, но учтите, что MultiBoard не может быть одновременно создан во время загрузки карты, и поэтому перед созданием ставьте событие Wait 0.1 (Но также можно обойтись без Wait-а указав в событии не Map initialization, а время - Elapsed game time is 0.01 seconds). А теперь пробуйте.
Вы заметили, что создается какая-то шестиглазая :) лажа.
Это из-за того что по умолчанию стоит иконка в виде глаза, и так как у нас 3 столбца и 2 строчка то создается, 3*2 иконок и текстов расположенных правее их, но так как тексты у нас пока не написаны потому они не отображаются.
Запомните column – это столбик, row – это строчка.
Можно даже сказать что Column – это x (абсцисса) координата, а Row – это y (ординат).
Подсчет столбиков и строчек начинается с верхнего левого угла MultiBoard-а.

Чтобы поменять глаз на другую иконку надо воспользоваться действием “Меню паузы – Set Item Icon”:
Пример:
Код:
Set the icon for (Last created multiboard) item in column 2, row 1 to UI\Feedback\Resources\ResourceGold.blp

После этого действия в последнем созданном MultiBoard-е в 1 строчке 2 столбца если иконка не скрыта то она примет вид монетки, потому что “ UI\Feedback\Resources\ResourceGold.blp” - Путь, указывающий на ее текстуру. С тем же успехом можно поставить и другую текстуру, а лучше щелкнуть кнопку “Выбрать пиктограмму” и выбрать ту иконку чья текстура нам нужна.
Также можно приписать к иконке текс с помощью действия “Меню паузы – Set Item Text”:
Пример:
Код:
Set text for (Last created multiboard) item in column 2, row 2 to “Надпись”

В результате во 2 столбце 2 строчки правее от иконки появится Текст - “Надписьь”.
Теперь другая проблема – этот текс не помещается в отведенное уму пространство до следующей иконки.
Это решимо, нужно следующие действие: Меню Паузы – Set Item Width:
Пример:
Код:
Set the width for (Last created multiboard) Item in column 2, row 2 to 5.00% of total screen width

Ну, в принципе 1% может измеряться как длина одной иконки ну или ~0.5 см., и действие будет означать, что во 2 столбце 2 строчки расстояние, отведенное для текста, будет ровняться 1.5 см. от иконки. Почему 1.5 см.? Подсчет расстояния начинается с левой стороны иконки если длину поставит 1% то текста вообще не будет видно т.к. вместо текста сразу будет следовать следующая иконка. а если 0%, то эта иконка будет поверх следующей.

Меню паузы – Set Item Color.
Им можно поменять цвет текста.
Пример:
Код:
Set the color for (Last created multiboard) item in column 2, row 2 to (100%, 0%, 0%) with 25% transparency.

Будет означать, что в 2 столбце 2 строки текст поменяет свой цвет на чуть прозрачно красный, почему именно красный, потому что все цветы определяются по технологии RGB (RedGreenBlue) по трем цифрам, от 0 до 255, но у нас стоят проценты, и за 255 принято 100%, значит получилось что - 100% красный, 0% зеленый, 0% синий. В действии есть еще 4 число, оно определяет прозрачность текста, у нас стоит 20% “прозрачности”, обратите внимании не “видимости”, а ”прозрачности”.

Также можно поменять название мультиборда (Меню паузы – Change Title)
И поменять его цвет также как в случае с текстом, но только другим действием (Меню паузы – Change Title Color).

Можно также скрывать иконки и тексты: Меню паузы - Set Item Display Style
Пример:
Код:
Set the display style for (last created multiboard) item in column 2, row 2 to скрыть text and Показать icons.

Получится что в указанном месте исчезнет иконка, можно также скрыть текст (не удалить, а просто скрыть), а можно и то и другое.

Событие Меню паузы – Destroy, Полностью удаляет MultiBoard.
А событие Меню паузы – Show/Hide, Просто скрывает его, сохраняя все его настройки, и потом его можно снова показать и он останется без изменений.
MultiBoard можно свернуть в правый верхний угл действием Меню паузы – Minimize/Maximize.
А можно и удалить все его параметры (Меню паузы – Clear), и число колонок и столбцов приводится к 0.Также их количество можно изменить при помощи действий:
Меню паузы – Change Number Of Rows(Изменяет количество строк)
Меню паузы - Change Number Of Columns (Изменяет количество столбцов)
Обратите внимание, что на их количестве стоят ограничения, но это можно легко обойти, так как WorldEdit до тупости тупой, его можно обмануть, начиная этим способом и кончая Return Bug-ом. А все очень просто, нужно на месте числа просто использовать функцию – Arithmetic. И при ее помощи можно задавать сколько угодно колонок и столбцов, например максимум столбцов 16 – а мы хотим 40, и потому делаем 20+20, и все.

Запомните:
Главное в MultiBoard-е, это дизайн, если все будет стоять где попало, и все тексты написаны одним цветом, то они мысленно сливается друг с другом, и не понимаешь на какую именно строчку смотреть:
Это может быть очень плохо, если ты играешь в очень активную карту и время чтобы посмотреть на MultiBoard всего секунда, и приходится искать глазами, где та информация, которая нужна, а если, например, выделить ее красным, то глаз сразу реагирует на нее, и следить за состоянием информации гораздо проще – в этом суть дизайна.
И также хотел бы сообщить что расстояние между строчками изменить НИКАК нельзя, не через триггеры не через джаз, не через что либо еще...
Пожалуй, по теории это все.
Хитрости и фичи

1. Если при оформлении Мультиборд в одном из его действий в значении столбца/строчки поставить "0", то в этом случае действие произойдет на все столбики/строчки
Например:
Код:
Set the color for (Last created multiboard) item in column 2, row 0 to (100%, 0%, 0%) with 0% transparency.

В этом случае Весь текст находящийся во 2-ом столбике станет красным, тоже правило действие если указать "0" в номере строчке.
Если же указать "0" и в столбике и в строчке, то в этом случает изменение произойдет со всем multiboard-ом.
2.Вы наверно уже видели multiboard в карте Dota? вы наверно обратили внимание что multiboard не показывает неиграющих игроков... как же это сделать? очень просто, сначала нужны 2 переменные:
одна обычная типа целочисленная переменная (integer), назовем ее "player"
одна массив типа игрок (player), назовем ее "MBplayer"
При событии "Map Initialization" делаем следующие:
Код:
Событие
    Map initialization
Условие
Дейсвие
  Set player = 0
  For each (Integer A) from 1 to 12, do (Actions)
    Цыкл - Действия
      If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        Если - Условие
          ((Player((Integer A))) slot status) равно "Играет"‚
        То - Действия
          Set player = (player + 1)
          Set MBplayer[player] = (Player((Integer A)))
        Иначе - Действия

И что же у нас получилось? Объясняю:
player - это количество играющих игроков на карте.
а в переменную MBplayer в значение [1] записан первый по номеру играющий игрок, в [2] второй по номеру, и т.д. но не обязательно что в [1] записан первый игрок (красный), т.к. его может не быть (он может не играть), а в [1] записан именно первый ИГРАЮЩИЙ игрок, ну и т.д.

И зачем же это все нужно?
а все очень просто, например у нас будет multiboard показывающий характеристику игроков (ну как в картах AoS) это будет что-то вроде таблица (multiboard и есть таблица) заголовки которой будут занимать... скажем... 2-е строчки, а дальше идет перечисление игроков, а потом в самом низу таймер показывающий время игры...
общий размер multiboard[b]-а у нас получается из:
  1. 2 - строки заголовки
  2. количество играющих игроков
  3. 1 - строчка для таймера
В общей сумме получается так: [B]3 + player
строк.
это мы узнали количество строчек в этом multiboard-е, количество столбиков уже зависит от самого твоего multiboard[b]-а...

Далее, зачем нам понадобилась переменая [B]player
?

т.к. есть такая функция "Преобразование - Convert Player Index To Player" она может пригодится для multiboard-а, а именно в использовании цикла на распределение очков убийств, но эта функция определяет игрока по его номеру, но такое в данном случае не выйдет (потому что у нас совершено иной набор игроков) и потому вместо этой функции мы будем использовать переменную player, которая содержит тот набор который нам нужен.
Все циклы используем от 1 до player, потому что больше не требуется ведь у нас все равно игроков не больше player
Примечание: Если вы еще будете где использовать какие либо действия со всеми игроками, используйте этот также от 1 до player-а, т.к., опят повторю, больше не требуется.
Остался таймер... советую посмотреть эту тему, там вы поймете как делать таймер, но т.к. строка таймера у нас всегда разная, но она будет всегда ровна 3+player, вот вроде бы и примерное объяснение такого multiboard-а...
3. как сделать для каждого игрока multiboard[b] отдельно?
Очень распространенный вопрос, но сделать это легко... Но только через джаз...
для начало нужна переменная массив типа [b]multiboard
, и назовем ее "Multiboard".
нужно при инициализации использовать код:
Код:
local integer i = 1
call TriggerSleepAction( 0.01 )
loop
  exitwhen i > 12
  set udg_Multiboard = CreateMultiboardBJ( ROWS, COLUMNS, "TITLE" )
  call MultiboardDisplayBJ( false, udg_Multiboard[i] )
  set i = i + 1
endloop
set i = 1
loop
  exitwhen i > 12
  if ConvertedPlayer(i) == GetLocalPlayer() then
    call MultiboardDisplayBJ( true, udg_Multiboard[i] )
  endif
  set i = i + 1
endloop

данный код Создаст 12 multiboard[b], каждый из них, будет помещен в переменную [I]multiboard
, от 1 до 12 ячеек, [b]multiboard[b] из первой ячейки будет показан 1-ому игроку, [b]multiboard[b] из 2-ой ячейки будет показан 2-ому и т.д.
Если же мы хотим изменить [B]multiboard
у 4-ого игрока, надо изменять multiboard[4], если же хотим изменить multiboard у всех игроков, то надо будет изменить каждую ячейку переменой [b multiboard /b], лучше конечно использовать цикл...
Примечание: Вообще-то было бы лучше если будет использован пункт 2 из данной части статьи, и при последующем создавании multiboard-а он создавался циклом не для всех игроков (играющих и не играющих), а для только играющих, через переменную player
ну вот и все...
Практика

Действия я подробно расписывать не буду, т.к. если вы внимательно хотя бы 2 раза прочитали “теорию” у вас не должно возникнуть с этим проблем, и вы должны стараться справится сами, т.к. практика учит быстрее теории.
В конце статьи прикреплен файл, с уже сделанным MultiBoard-ом о котором будет идти речь, вы можете посмотреть его, НО, суть практики не в том чтобы смотреть уже сделанную работу, а в том чтобы самому ее сделать, настоятельно рекомендуется сначала попробовать самим, хоть даже если и покажется сложным.

Сделаем multiboard который будет отображать жив юнит или мертв, если мертв то через какое время.
Сначала попробуйте сделать MultiBoard прочитав только его описание.
Если не получилось - прочитайте инструкцию, смысл инструкции в том что она не указывает какие действия надо ставить, а только говорит что это действие должно делать, вы прочитали теорию, и должны знать - какое действие поставить если, Если опять Если опять не получилось - смотрите пример.
Состояние юнита
Создадим простенький MultiBoard

Инструкция
Для начала создадим карту, удалим все действия из триггера “Initialization”, и первое что поставим это “Wait 0.1”, после создаем MultiBoard c 2-я столбцами и 3-я строчками, назовем этот MultiBoardСостояние юнита”.
Далее можно пользоваться циклами, но так как предполагается что читатель – новичок, будем делать без циклов - просто по порядку.

(Чтобы было меньше писать столбики и строчки будем обозначать так: x-y, где X- столбцы, Y – строчки.)
Далее делаем, чтобы в позициях 1-2, 1-2, 1-3, 2-1, 2-2, 2-3, скрывалась иконка, но показывался текст.
Далее:
Код:
Действия:
-на позицию 1-1 припишем текст “Имя:”
-на позицию 2-1 припишем текст “Состояние:”
//Мультиборд у нас будет ввиде таблици, и выше перечисленные тексты, это будут заголовки столбцов.
-на позицию 1-2 припишем текст “Артес-”
-на позицию 1-3 припишем текст “Илидан-”
//Эти имена будет стоять в колонке "Имя", и они будут неизменны.
-на позицию 2-2 и 2-3 припишем текст “Жив”.
//Эта будет стоять в колонке "Состояние", и они будут Менятся по ходу игры.
//Следующее что надо сделать, это оформит, определим расстояние для каждого текста:
-на позицию 1-1, 1-2, 1-3, делаем расстояние 5%.
-на позицию 2-1, 2-2, 2-3, делаем расстояние 7%, думаю, хватит.
//Сейчас у нас готов MultiBoard, но он крайне некрасив - все слова написаны белыми буквами.
//Так что следующий шаг, это дизайн:
-Цвет названия делаем красным (100%, 0%, 0%)
-Цвет текста (1-1 и 2-1) делаем, синим (0%, 0%, 100%)
-Цвет текста (1-2 и 1-3) делаем зеленым (0%, 100%, 0%)
-Цвет текста (2-2 и 3-3) делаем желтым (0%, 100%, 100%)
Все первый триггер у нас готов.
Далее поставим 2-х юнитов на карту рядом друг с другом (Артеса и Илидана).
Создаем переменную массив integer (целочисленная) OTC4ET.

Делаем следующий триггер.
Код:
Событие Generic Unit Event, Юнит умирает.
В действиях: Создаем 2 действия – If / Then / Else, Multiple Functions.
В первом ставим, что:
Если: Умерший юнит = Артес
То: 
Set OTC4ET (1) = 30
//Далее без циклов тут не обойтись потому создаем цикл
For each (integer B) from 1 to 30, do (Actions)
        Цикл – Действия
               //Далее делаем в позиции 2-2, текст использую пару функций
               (Делаем действие создание текста с функцией (Мертв(+((String(OTC4ET(1)))+сек.)))
               //Что это значит? Это означает что создастся текст “Мертв(" + "[текущее значение переменной OTC4ET(1)]" + "сек.)”
               //Далее, конечно же, ставим действие:
               Set OTC4ET (1) = OTC4ET (1) - 1
               Wait 1.00 game-time second
//На этом цикл закончился.
(Создаем текст в позиции 2-2 “Жив”)
//И ставим действие возрождение героя:
Герой – Instantly revive (Triggering unit at (Position of (Triggering unit), Показать revival graphics))
//Все
//(В следующем действии (If / Then / Else) ставим ВСЕ ТО ЖЕ САМОЕ только заменяем в условии Илидана на Артеса
//а во всех действиях создания текста в MultiBoard-е заменяем 2-2 на 2-3. И везде используем переменную не OTC4ET(1), а OTC4ETT(2).


Теперь запустите карту, и убейте любого юнита другим юнитом и посмотрите на MultiBoar. Правда, здорово :).
Надеюсь, вы поняли, как делать MultiBoard, ниже я выложил его пример.

Также советую посмотреть эти наработки:
Наработка Iron-а "Status Metr на Мультиборде"
мая наработка "Система характеристики юнита"
Мая карту "Мультибордные танчики", правда чуть не доделанные
также и еще мой вертикальный прогрес бар, он не для использования, а большей частью для примера как создавать такие вещи... Но плохо в нем то что расстояние между строчками не изменить(
Прикрепленные файлы
Тип файла: w3x Состояние юнита.w3x (10.7 Кбайт, 150 просмотров )

Отредактировано Jon, 14.08.2006 в 07:23.
Старый 14.02.2006, 17:32
J
expert
offline
Опыт: 48,447
Активность:
А однако так много желающих почитать, я прямо в ужасе.:)

Отредактировано Jon, 15.02.2006 в 11:11.
Старый 15.02.2006, 11:00
N.Sy.Prophet
Йа Байан
offline
Опыт: 13,122
Активность:
Достаточно не плохо. Мне кажется лучше чем у Вардена, НО видно что писал, просто стараясь переплюнуть ;).
Старый 15.02.2006, 18:03
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
НО видно что писал, просто стараясь переплюнуть

БГЫ :D
Нет, не только ради этого.
Ну ты и сам подумай, кому нужна статья хуже той которая уже написанна?
Старый 15.02.2006, 18:46
N.Sy.Prophet
Йа Байан
offline
Опыт: 13,122
Активность:
Jon тем же кому нужна экспа за вышенаписанную.
Давайте я тоже напишу, а? Дадим админам свободу выбора, хо!
И вообще - пишете про мультибоард, пишите что-то новое, МА... ДЕВИЗИЮ ВАШУ!
Кстати, делать мультибоарды из картинок не пробовал? Очень полезно );-)
Старый 16.02.2006, 18:17
NETRAT

offline
Опыт: 83,712
Активность:
А прогресс бары из МБ видели?
Старый 16.02.2006, 18:19
N.Sy.Prophet
Йа Байан
offline
Опыт: 13,122
Активность:
NETRAT нет, заделись ссылочкой. Будем благодарны ;)

Nimensy добавил:
голосовать не буду, т.к. моя оценка - выше среднего...
Старый 16.02.2006, 18:34
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
А прогресс бары из МБ видели?

Господи да что в них особенного, его же сделать пара пустяков.

Jon добавил:
Его кстате можно сделать двумя способами.
первы легкий, но качество среднее.
второй тяжолый но качество хорошое.

Jon добавил:
NETRAT Ты лучше спроси себя, где ты видел игру в танчики в мультиборде.

Jon добавил:
Цитата:
Сообщение от Jon
Ну ты и сам подумай, кому нужна статья хуже той которая уже написанна?

Цитата:
Сообщение от Nimensy
Jon тем же кому нужна экспа за вышенаписанную

Ну ты сам подумай, разве дали бы опыта за плохую статью. Так что не говори глупости:).
Старый 16.02.2006, 19:32
N.Sy.Prophet
Йа Байан
offline
Опыт: 13,122
Активность:
Jon за эксп бьются до последнего по себе знаю ЫЫЫЫЫ :)....
Старый 16.02.2006, 20:57
NETRAT

offline
Опыт: 83,712
Активность:
Jon при чем тут танчики? vlad_com вообще инвентарь в мультиборде делал, так что ... я не говорю про ламерские поделки самоделкина, я говорю про более-менее универсальную систему. Вертикальны прогресс бар делал?

Nimensy по поиску, наверное, сначала надо попробовать
Старый 17.02.2006, 01:43
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
Вертикальны прогресс бар делал?

Его сделать не так просто как горизонтальный, основная проблема это то, что растояние между иконками нельзя убрать, ну покорайней мере нельзя убрать тригерно, на счет джаза незнаю, если можно убрать, то уж хотябы одноцветными иконками сделать, уже какойто прорыв будет.
Старый 17.02.2006, 05:20
NETRAT

offline
Опыт: 83,712
Активность:
Jon значит делал, это верно, нет способа уменьшить расстояние между рядами - даже в жассе нет.
Старый 17.02.2006, 13:29
0pJl9lTa

offline
Опыт: 3,397
Активность:
А имахо первая строчка работать уже не будет =)
Да хотя бы потому что "Мультиборд" нада писать в ковычках.
Мы то с вами все понимаем, но статьи то пишуца для новичков!
Старый 17.02.2006, 14:22
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
"Мультиборд" нада писать в ковычках

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

Отредактировано Jon, 17.02.2006 в 22:18.
Старый 17.02.2006, 16:59
J
expert
offline
Опыт: 48,447
Активность:
NETRAT, Все я сделал "Вертикальный прогресс бар", получилось неплохо, сжал все в три триггера и 2 переменые, однако проблема с растоянием так и осталась неразрешимой, так что, смотри сам...
Прикрепленные файлы
Тип файла: w3x Вертикальный прогресс.w3x (10.8 Кбайт, 545 просмотров )

Отредактировано Jon, 17.02.2006 в 23:05.
Старый 17.02.2006, 21:40
Iron
Листовой
offline
Опыт: 24,427
Активность:
Цитата:
//Далее без циклов тут не обойтись потому создаем цикл
For each (integer B) from 1 to 30, do (Actions)
........Цикл – Действия
...............//Далее делаем в позиции 2-2, текст использую пару функций
...............(Делаем действие создание текста с функцией (Мертв(+((String(OTC4ET(1)))+сек.)))
...............//Что это значит? Это означает что создастся текст “Мертв(" + "[текущее значение переменной OTC4ET(1)]" + "сек.)”
...............//Далее, конечно же, ставим действие:
...............Set OTC4ET (1) = OTC4ET (1) - 1
...............Wait 1.00 game-time second
//На этом цикл закончился.


А вот тут ты лопухнулся, т.к. при использовании комманды wait в цикле, она работает не корректно, причем совершенно непредсказуемо (1-ин раз может от 30 до 0 идти 32 сек., а иной раз и 40 сек.)
Старый 17.02.2006, 23:19
NETRAT

offline
Опыт: 83,712
Активность:
Вейт это вообще ацтой аццкий =\ я уже много раз говорил почему. Оно может и удобно, но ужасно криво

Да сложность вертикального прогресс бара как раз в промежутках =\ задача неразрешима

NETRAT добавил:
МБорд нормальный, правда про оптимальность использования триггеров говорить не приходится
Старый 17.02.2006, 23:57
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Цитата:
Вейт это вообще ацтой аццкий =\
Тогда как? Так?
Код:
Custom script:   call Sleep(x.xx)
Старый 18.02.2006, 16:58
J
expert
offline
Опыт: 48,447
Активность:
Ну если я и джаз подключу в свою статью, то новичкам уж тем более совсем ничего не будет понятно.
Пусть уж лучше так сначала резберутся.
Старый 18.02.2006, 17:54
KENDO

offline
Опыт: 5,817
Активность:
кстати ктото там писал про расстояние, насчет вертик. столбцов не знаю, а вот с горизонатльными там есть трабл, лучше всего в триггах прописывать или на свернуть МБ, либо на свернуть и развершнуть...
Старый 18.02.2006, 19:53

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

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

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 02:13.