Перейти к содержанию

Дайджесты за январь-февраль

Обновления гайдов и аддонов

Январь Февраль

Мониторинг серверов и редактор аддонов

Представляем вам две легенды. То, о чем можно было только мечтать, стало реальностью.

Мониторинг серверов Редактор аддонов

Подсказки из игры на вашем сайте

Теперь вы можете отображать сведения о внутриигровых элементах простым наведением курсора мыши.

Подробнее

Апдейтер аддонов

Представляем вам программу для автообновления аддонов и делимся подробностями.

Подробнее Скачать

SLA

Пользователь
  • Постов

    1 641
  • Зарегистрирован

  • Посещение

Весь контент SLA

  1. SLA

    MinimapSla

    И всем спасибо за комментарии! Просто душа радуется, праздник!
  2. SLA

    MinimapSla

    Если им НЕ интересно наблюдать свой рейд на миникарте в героиках, с раскраской по цветам классов, и разными иконками для своей и чужих групп, тогда не знаю, чем их развлечь... Пусть качают альтов, тогда! ) А в астрале, миникарта просто выключается. Поддержка астрала в ней тоже будет когда-нибудь, но не сейчас. А для Рудокопов и Травников, в следующем релизе добавятся типы ресурсов "Herb" и "Mine", и АВТОМАТИЧЕСКИЙ сбор координат трав/руды. Но сначала, мне нужно его обкатать, найти тот оптимальный радиус, в котором разбрасывается группа "огоньков" руды/травы, чтобы не сохранять координаты слишком часто.
  3. SLA

    MinimapSla

    You have to hover the minimap with a mouse pointer to see +/- buttons ) P.S. It's 100% working in EU/US version, it's tested!
  4. SLA

    MinimapSla

    Ага, это срабатывает только если тем же самым персонажем пере-зайти. Я так только пару раз в жизни делал ) Удивительно, но при этом заново создаётся персонаж, но НЕ приходит событие о смене игровой зоны. Никогда бы не подумал. Исправил и перезалил
  5. SLA

    MinimapSla

    Версия r5

    107 531 раз скачали

    Первая и единственная КРУГЛАЯ миникарта для "Аллодов Онлайн" Полноценно работает в абсолютно ВСЕХ инстансах (показывает группу/рейд, квесты, и т.д.). Показывает координаты Межевых камней, Сокровищ, и др. (можно добавлять отметки). Для инстансов, можно рисовать карты (пока нарисована только карта "Чистилища"). Множество других мелких улучшений, которые вас обязательно порадуют, если вам уже приходилось пользоваться другими миникартами Подробнее в теме поддержки The first and only ROUND minimap for "Allods Online" Fully working in absolutely ALL instances (shows party/raid, quests, etc.). Shows coordinates of Milestones, Treasures, etc. (you can add more markers). It's possible to draw instance maps (currently there is only "Purgatory"). A lot of other small improvements, that are sure to delight you, if you've used other minimaps before More in the support topic
    Бесплатный
  6. Всех с Днём святого Валентина ) Подарок - на главной
  7. SLA

    MinimapSla

    MinimapSla - Как добавлять отметки на картах Эта статья для тех, кто хочет добавлять какие-нибудь отметки на карты в MinimapSla. Например, Межевые камни, Сокровища, или, теоретически, всё что угодно. Нашли неотмеченное Сокровище (клад)? Межевой камень? Ещё что-то? Выкладывайте их здесь, В ЭТОЙ ТЕМЕ, чтобы они вошли в следующее обновление аддона. РУДОКОПЫ и ТРАВНИКИ, пожалуйста, не флудите! Для вас, в следующем обнавлении, будет АВТОМАТИЧЕСКИЙ сбор координат трав/руды! В текущей версии миникарты (в следующих, сделаю удобнее), для того, чтобы собирать координаты ресурсов, придётся сначала включить в её настройках опцию ResourceCollecting. (Естественно, после этого нужно либо пере-зайти в игру, либо с помощью AddonManager, выключить/включить аддон MinimapSla.) В файле MinimapSla\Config.lua, нужно включить опцию ResourceCollecting: Code: ResourceCollecting = true, Теперь, при каждом сделанном вами скриншоте, в файл Allods Online\Personal\Logs\Mods.txt будут записываться кое-какие координаты, в таком виде, в котором их можно просто скопировать и вставить в файл ресурсов MinimapSla\Resources\Resources.lua. Как сохранить чьи-то координаты: А) Если это интерактивный объект (с ним можно поговорить, например, Сокровище): Откройте диалоговое окно с ним, и сделайте скриншот. В Mods.txt будут записаны 2 строки (координаты игрока и координаты интерактивного объекта (INTERACTOR)). Возьмите ЭТУ часть: Info: addon MinimapSla: You: { Type = "", Pos = { posX = 10931.807, posY = 11823.785 } }, -- 35.35:62.98 ZoneContested2 -- Allods_110210_233234.jpg Info: addon MinimapSla: INTERACTOR: { Type = "", Pos = { posX = 10932.390, posY = 11818.930 } }, -- 35.37:63.13 "Джунская стела" @ ZoneContested2 -- Allods_110210_233234.jpg Б) Если это детектируемый юнит (отмечается иконкой на карте): Возьмите его в цель, и сделайте скриншот. В Mods.txt будут записаны 2 строки (координаты игрока и координаты цели (TARGET)). Возьмите ЭТУ часть: Info: addon MinimapSla: You: { Type = "", Pos = { posX = 13647.124, posY = 6875.158 } }, -- 40.24:41.10 ZoneLeague1_Capital -- Allods_110210_233234.jpg Info: addon MinimapSla: TARGET: { Type = "", Pos = { posX = 13633.600, posY = 6898.460 } }, -- 38.09:36.71 "Семейка Загадочных" @ ZoneLeague1_Capital -- Allods_110210_233234.jpg В) Если ни то, ни другое (например, как Межевой камень, и многое другое): Встаньте персонажем точно НА ЕГО МЕСТО, и сделайте скриншот. В Mods.txt будет записана только 1 строка (координаты игрока). Возьмите ЭТУ часть: Info: addon MinimapSla: You: { Type = "", Pos = { posX = 15018.966, posY = 6025.649 } }, -- 39.16:69.19 ZoneLeague3 -- Allods_110210_233234.jpg Как правильно вставить строку в БД ресурсов: Всё просто Вы скопировали часть строки, какая указана в примерах выше. В файле Resources.lua, найдите секцию AoMapResources.KnownObjects, и в ней секцию, названную как ЗОНА, в которой вы сделали скриншот (ЗОНА указана в комментарии каждой строки, которую MinimapSla пишет в Mods.txt, например, "ZoneContested2"). Вот, в эту секцию и вставьте скопированную часть строки. Затем, НЕ ЗАБУДЬТЕ, указать в Type = "" тип ресурса. Например: Type = "Treasure" -- Сокровище (Клад) Type = "Milestone" -- Межевой камень И другие. Список доступных типов ресурсов находится в секции AoMapResources.ObjectTypesList. Кстати, этот список тоже можно пополнять новыми типами, при условии, что имеется соответствующая иконка. Если её нет, её можно нарисовать. ВАЖНО: Пожалуйста, НЕ собирайте координаты таких важных объектов, как Порталы, Почта, и другие детектируемые объекты. Сбор координат таких объектов (самых важных) будет автоматическим, в следующих версиях MinimapSla. Также, НЕ собирайте координаты руды и травы, потому, что это тоже будет полностью АВТОМАТИЗИРОВАНО, и скорее всего, уже в следующем обновлении А что действительно НУЖНО собрать до конца - это Сокровища (Клады). Что-то не получается? Вы добавили новые ресурсы, но их НЕ видно на карте? Значит, видимо, вы сделали что-то неправильно, загляните в Mods.txt, там должна быть подсказка. Если вы сделаете где-то какую-то пользовательскую ошибку, заполняя файл ресурсов, то ничего страшного не случится, просто при загрузке, MinimapSla "почистит" ресурсы от таких бракованных ресурсов, и напишет соответствующие предупреждения об этом в файле Mods.txt.
  8. SLA

    MinimapSla

    MinimapSla - Как создавать карты инстансов Эта инструкция написана для тех из вас, кто желает помочь с созданием карт инстансов Хотите попробовать, но не умеете рисовать? Не беда! Ничего рисовать не нужно, достаточно лишь аккуратно собрать все координаты в инстансе, а нарисовать по ним карту я смогу и сам (по вашим скриншотам и координатам). Quote: ВНИМАНИЕ! СПИСОК ВСЕХ ИНСТАНСОВ (всего 13 штук, основных): Те, напротив которых написано "УЖЕ ЕСТЬ", собирать НЕ нужно. Все остальные - НУЖНЫ. Вы можете помочь их сделать! Лига: "Крепость Орешек" / "Oreshek Fortress" - УЖЕ ЕСТЬ (спасибо Mehael !) "Цитадель Тьмы" / "Darkblood Citadel" "Зачумлённый Замок" / "Castle Blight" Империя: "ХАЭС" / "XAES" - УЖЕ ЕСТЬ (спасибо Denai !) "Большой Купол" / "Laguna Boil" "Секретная Лаборатория" / "Lab Thirteen" Общие: "Малый Храм Тенсеса (Лига)" / "Corridors of Tensess Temple (League)" - УЖЕ ЕСТЬ (спасибо Phoenixpg !) "Малый Храм Тенсеса (Империя)" / "Corridors of Tensess Temple (Empire)" "Храм Тенсеса" / "Heart of Tensess Temple" "Город Демонов" / "Gorluxor's Tower" "Храм джунов" / "Defiled Ruins" "Мертвый город" / "Dead City" "Пожиратель Искр" / "Genoer the Devourer" Другие: "Чистилище / Purgatory" - УЖЕ ЕСТЬ "Башня Великого Мага" / "Clement's Tower" - УЖЕ ЕСТЬ "Корабль Империи "Непобедимый"" / "The Imperial Ship "Invincible"" - УЖЕ ЕСТЬ ... В текущей версии миникарты (в следующих, сделаю удобнее), для того, чтобы "начертить" карту инстанса, придётся сначала включить в её настройках опцию MapDrawing. (Вы стоите посреди уже зачищенного инстанса, у вас есть час свободного времени, а эта опция у вас ещё не включена? Её можно включить даже НЕ выходя из инстанса, если у вас установлен аддон AddonManager. Сделайте Alt+Tab в Виндовс, включите опцию, вернитесь в окно игры, и с помощью AddonManager, выключите/включите аддон MinimapSla.) В файле MinimapSla\Config.lua, нужно включить опцию MapDrawing. (Естественно, после этого нужно либо пере-зайти в игру, либо с помощью AddonManager, выключить/включить аддон MinimapSla.) Code: MapDrawing = true, Теперь, при каждом сделанном вами скриншоте, в файл Allods Online\Personal\Logs\Mods.txt будет записываться примерно такая строка: Info: addon MinimapSla: Screenshot|Allods_110108_203036.jpg|DeathRealm||390.990|363.420|0.031|1.570|0.425 Здесь, записано название скриншота, название зоны и под-зоны инстанса, точные координаты персонажа, угол поворота персонажа и камеры. Заметка для умных: Да, я знаю, что точно такая же информация находится в EXIF-данных каждого JPEG-скриншота. И изначально, я хотел использовать именно её. Но после первых тестов оказалось, что она там, мягко говоря, очень неточная (разброс - метров десять в любую сторону), поэтому, пришлось переделать способ сбора координат и AoMapGenerator. И, кстати, выкинуть пару комплектов уже собранных в инстансах скриншотов. Потому, что использовать их было совершенно невозможно. Сбор координат Ваша задача - обойти весь инстанс, становясь во все углы, и другие ключевые места, делая при этом скриншоты. Буквально, нужно обойти все те элементы, которые вы хотели бы видеть нарисованными на карте. Представьте, что делая каждый скриншот, вы ставите ТОЧКУ в том месте карты, где стоит ваш персонаж. Эти точки потом будут обведены программой AoMapGenerator (как в детской игре "обведи точки"), и таким образом, будет получена вся карта инстанса. Пожалуйста, делайте это аккуратно, и вообще, подойдите к делу творчески Сразу настройтесь, что на это уйдёт НЕ 15 минут, а как минимум полчаса, скорее 40-60 МИНУТ, или даже ещё больше, если инстанс большой. Общее количество скриншотов, наверное, будет измеряться сотнями. И ещё, старайтесь, чтобы ваш персонаж не стоял на всех скриншотах упёршись носом в стенку - по скриншотам должно быть понятно, что находится вокруг вашего персонажа. Когда весь инстанс будет "обрисован", в файле Mods.txt будут собраны координаты всех точек. Скачайте программу AoMapGenerator (Она находится в аттачменте, в конце этого сообщения, вытащите оттуда AoMapGenerator.exe, и положите куда-нибудь. Из файла Mods.txt скопируйте все записи "Info: addon MinimapSla: Screenshot .....", сделанные в этом инстансе, вставьте в пустой текстовый файл, и сохраните его где-нибудь. Перетащите этот текстовый файл на иконку программы AoMapGenerator.exe, и она автоматически начертит карту инстанса. Она создаст два файла (в той же папке, в которой лежит текстовый файл с координатами): НазваниеЗоныИнстанса.png - карта инстанса, в виде PNG-картинки. НазваниеЗоныИнстанса.lua - текст, для вставки в Resources.lua. Что с этим делать? Ну, первым делом, посмотреть PNG-картинку, интересно ведь, что у вас получилось! ВАЖНО: В аттачменте, кроме программы AoMapGenerator, есть ещё папка "EXAMPLES", а в ней, кое-какие ПРИМЕРЫ текстовых файлов с собранными координатами инстансов - можете кидать их, по одному, на иконку AoMapGenerator, и смотреть, как выглядит инстанс. Пример (последняя под-зона стартового инстанса Империи): Что с этим делать? Итак, вы собрали координаты инстанса. Теперь, у вас есть два варианта - либо отправить всё это МНЕ, чтобы я сам нарисовал карту этого инстанса, либо нарисовать самостоятельно. Лучше мне, я умею рисовать ВАРИАНТ A: Если отправляете мне, тогда мне нужны: 1) Все скриншоты, сделанные вами в этом инстансе. 2) Текстовый файл с координатами (которые вы вынули из Mods.txt). Сожмите всё это в архив, и выложите на какой-нибудь сервис хранения файлов (Zalil.ru, Rapidshare.com, или любой другой), и напишите ссылку на скачивание в этой теме, или мне в личку, как хотите. Я сам сгенерирую PNG-картинку, и ориентируясь по тому, что видно на ваших скриншотах (вы ведь, позаботились, чтобы там не только стенки было видно?), нарисую в Фотошопе красивую карту, которая попадёт в следующее обновление MinimapSla. ВАРИАНТ Б: Если вы мне не доверяете , или вы нашли какой-то ну-очень-секретный-инстанс, и не хотите его разглашать x)), или я ВНЕЗАПНО вознёсся в Валгаллу (такое у всех случается, один раз в жизни), или по любой другой причине, вы решили нарисовать карту САМИ, то тогда, это делается так: Владеете Фотошопом? Нет? Тогда вернитесь к варианту А ) По PNG-картинке, нужно нарисовать карту, в таком виде, в каком вы хотите видеть её в игре (только имейте ввиду, на PNG-картинке, карта примерно в ТРИ РАЗА увеличена по ширине и высоте. И ничего из неё не вырезайте, и не двигайте, там всё оптиматьно рассчитано, и соответствует данным из Lua-файла!). В качестве подложки, используйте текстуру MinimapSla\Resources\_Blank.bin, она открывается в "AoTextureViewer". Постарайтесь выдержать тот же стиль, как и в стандартных картах АО. Цвета НЕ должны быть слишком контрастными или яркими, придерживайтесь тех же палитр и контрастности, как на стандартных картах, это неспроста - так задумано для того, чтобы на картах были хорошо видны яркие и контрастные отметки. Нарисовав карту, уменьшите изображение с 3462x2658 до размера 1024x886 (заметьте, это НЕпропорциональное уменьшение, поэтому, карта должна чуть-чуть "сплющиться" в ширину). Опытные дизайнеры знают, что подложку не нужно было подкладывать до этого момента, это нужно сделать именно сейчас, когда карта уменьшена до своего "реального" размера. Дальше, необязательно, но БУДЕТ ЛУЧШЕ, если вы обрежете картинку по краям (в смысле, ваш рисунок наверняка не занимает всё пространство подложки _Blank, так? Для экономии объёма аддона, можно вырезать ЦЕНТРАЛЬНУЮ часть карты, обрезав края, на которых видна нетронутая подложка. MinimapSla сам подложит текстуру _Blank под вашу карту, а ваша карта будет помещена точно в её центре. И даже не думайте изобретать никаких "оптимизаций" размера файла с помощью альфа-канала, так как альфа-канал работать НЕ будет (такое ограничение наложено тем, что в миникатре используется маска, чтобы она была круглой). Кстати, вырезая центр карты, желательно, чтобы ширина и высота были кратны 4 пикселям, так будет чуть лучше для DDS-компрессии. Вырезали? А учебник из "AoTextureViewer" читали? Там сказано, что вам срочно нужен DDS-плагин к Фотошопу, и рассказано, каким образом нужно увеличить ширину и высоту холста картинки, чтобы сохранить её как DDS (ширина и высота должны быть степенями двойки, но в учебнике "AoTextureViewer" об этом написано чуть-чуть подробнее). Используя DDS-плагин, экспортируем текстуру карты как DXT1 без мипмапов, и с помощью "AoTextureViewer" конвертируем этот DDS-файл в BIN-файл. По учебнику "AoTextureViewer", создаём пару XDB-файлов. (Если возникают вопросы по альфа-каналу текстуры, XDB-файлам, и вообще, любые вопросы, то смотрите готовый образец правильно сделанной текстуры - MinimapSla\Resources\DeathRealm*.* - можете даже сконвертировать её в DDS, если вам любопытно). Готова текстура? Положите все её BIN/XDB файлы в MinimapSla\Resources\Maps, пропишите её в файле Resources.(UIRelatedTextures).xdb (там разберётесь, как). А содержимое того Lua-файла, который создал AoMapGenerator, разместите в файле Resources.lua (там же, где прописана DeathRealm, разберётесь). Чуть не забыл сказать, что можно нарисовать не только карту всего инстанса целиком, но можно нарисовать даже карту какой-то его отдельной под-зоны. В аттачменте, в примерах, есть тому пример - координаты стартового инстанса Империи. В файле "_EXAMPLE_InstEmpire1_WRONG.txt" показано, что получилось, когда я собрал все координаты зоны. Пришлось разбить зону на две части: в "Default" - все под-зоны кроме последней, а в "FinalZone" - последняя зона. "Разбить" - значит, просто сделать два отдельных текстовых файла, это очень просто. MinimapSla устроена так, что она загружает либо карту Зона/Подзона, если такая найдена в ресурсах, ЛИБО карту Зона/Default, если она найдена. Если ничего не найдено, то включается особый режим "неизвестный инстанс". Кроме того, собрав все координаты, можно ВООБЩЕ не рисовать карту, а лишь скопировать содержимое Lua-файла, сделанного AoMapGenerator, в файл Resources.lua, УБРАВ СТРОКУ Texture = { ... }. Для MinimapSla, это будет означать, что размер инстанса известен, но вместо его карты, будет показана такая же карта, какая показывается в "неизвестных инстансах". AoMapGenerator 1.0.0 В аттачменте - сама программа "AoMapGenerator", её исходник на PHP (для любопытных). И кое-какие ПРИМЕРЫ текстовых файлов с собранными координатами инстансов - можете кидать их, по одному, на иконку AoMapGenerator, и смотреть, как выглядят инстансы в генерируемых ею PNG-картинках. . File: AoMapGenerator-1.0.0.zip
  9. SLA

    MinimapSla

    MinimapSla - История создания аддона Этот параграф будет больше интересен создателям аддонов, но и простые пользователи тоже могут его прочесть (пропуская технические детали), если им любопытно, почему этого аддона пришлось ждать почти целый год. Работу над этим аддоном я начал сразу, как только был выпущен официальный API для создания аддонов (почти год назад, кажется февраль 2010 года), но почти всё это время, работа над аддоном была заброшена (ниже станет ясно, почему). И только выпуск патча АО 2.0.02 (где разработчики игры предоставили свою квадратную миникарту) спровоцировал меня взяться, и закончить разработку MinimapSla. Дело было так... Когда появился официальный API, никаких миникарт для АО не существовало, и самым первым аддоном, за разработку которого я взялся, КОНЕЧНО, стала миникарта! В API нашлись все функции, необходимые для её создания, но не было (и до сих пор нет) никакой документации по созданию виджетов (GUI, графического оформления аддонов). Однако, довольно быстро я догадался, что миникарта должна быть устроена так: виджет с картой нужно поместить внутрь другого квадратного виджета (меньшего размера), и сделать, чтобы виджет с картой "прокручивался" внутри квадратного виджета, по мере передвижения игрока по карте... Однако, сразу столкнулся с двумя техническими проблемами: 1) Чтобы было возможно применять текстуру карты к виждету карты, фон этого виджета должен быть Simple-слоем. А Simple-текстуры не работают. 2) Чтобы текстура стрелки (указатель игрока) вращалась, она тоже должна быть Simple-слоем. А Simple-текстуры не работают. Просто, оригинальный конвертер текстур, генерировал (и до сих пор это делает) бракованные Simple-текстуры. Я тогда ещё не понимал, что они бракованные, и думал, что это у меня кривые руки, если эти текстуры вообще не получается отобразить в игре. И ещё, в то время, я ещё не понимал, что WidgetLayerSimpleTexture (слой для отображения текстуры) является частью самого ВИДЖЕТА, а не его ТЕКСТУРЫ (как мы привыкли ошибочно думать, благодаря тому, что этот файл генерируется самим конвертером текстур). В общем, я подумал, что с Simple-текстурами у меня ничего не выйдет, и решил сделать всё на Tiled-текстурах (их конвертер генерирует нормально)... Первую техническую проблему я решил ОЧЕНЬ странным способом, который, наверное, вообще не должен был работать -- нашёл какой-то БАГ, позволяющий программно назначить Simple-текстуру фоном в Tiled-слой (!) При этом, виджет с картой должен был быть "приплюснут", строго пропорционально тому, как "приплюснута" текстура карты. Те из вас, кто не копался в картах АО, могут не знать такой нюанс - в ресурсах игры, текстуры карт имеют размер 1024x886, а в игре они растягиваются до размера 1154x886. То есть, другими словами, у них, как бы, НЕкрвадратная пропорция пикселя (Pixel Aspect Ratio) А "растянуть" текстуру можно только на Simple-слое, на Tiled-слое это невозможно - там другая концепция растягивания текстур, сами знаете. Так вот, чтобы воспользоваться этим БАГОМ, мой Tiled-слой карты должен был иметь такие же пропорции, как и текстуры карт - приплюснутые по ширине. Выглядело не очень правильно, но за то, работало. Вторая техническая проблема - невозможность вращать Tiled-текстуру стрелки, я обошёл не хитрым способом - стрелку сделал из двух круглых виджетов. Один - большой в центре, а второй - маленький, вращается вокруг первого - получилась, как бы, псевдо-стрелка ) Вот как это выглядело в марте 2010 года. Имхо, этот внешний вид миникарты лёг в основу обоих квадратных миникарт - KaaPex скопировал его у меня, а разработчики игры, в патче 2.0.02, скопировали его у KaaPex (разве нет?) Работа над аддоном шла очень медленно (я больше времени проводил на форумах UI9), и всего через месяц, в апреле 2010, неожиданно, KaaPex сделал аддон "Minimap". Только вот, беда была в том, что его "миникарта" занимала почти четверть экрана, потому, что она не была классической миникартой, а была просто целой картой, уменьшенной в размере, и помещённой ЦЕЛИКОМ на экран. Ну ладно, раз кто-то другой успел сделать и выложить "миникарту" до меня, я отдал ему исходник своей миникарты. KaaPex взял оттуда технологию "виджет в виджете", и внедрил в свою миникарту. Его миникарта стала маленькой (как и положено), нормальной миникартой. Должен также сказать огромное спасибо KaaPex'у, т.к. он сделал одно открытие, без которого не только моя сегодняшняя миникарта, но и многие другие современные аддоны выглядели бы гораздо хуже. А дело было так. KaaPex играл в АО на Маке (Apple Macintosh), под эмулятором Виндовс. И стандартный конвертер текстур у него на Маке вообще не запускался, поэтому, он создавал BIN-текстуры в "AoTextureViewer", а все XDB-файлы делал руками, в блокноте. (Это сейчас все поголовно так делают, а тогда, все пользовались оригинальным конвертером, потому, что тогда он ещё работал). При таком "нестандартом" подходе, он нечаянно, и возможно, сам того не заметив, нашёл способ создания работоспособных Simple-текстур!!! (До KaaPex'a, никто не умел этого делать). Что он сделал? Взял файл WidgetLayerSimpleTexture, и в него поместил UISingleTexture от текстуры, сгенерированной как обычная Tiled-текстура, и это сработало. Тут мне нужно, наверное, объяснить, в чём проблема с оригинальным конвертером текстур. Когда его просишь сделать Tiled-текстуру, он делает нормальный BIN-файл, внутри которого нормальная DDS-текстура, как и положено. Такие BIN-файлы открываются в "AoTextureViewer", и только такие текстуры вы найдёте в ресурсах игры, других там нет! НО, когда просишь конвертер сделать Simple-текстуру, у него случается припадок шизофрении. Вместо того, чтобы сконвертировать TGA в DDS, он берёт этот TGA, и ЗАПИХИВАЕТ ЕГО В BIN-ФАЙЛ, как есть! Внутри такого BIN-файла - TGA-картинка, и, ЕСТЕСТВЕННО, она НЕ работает в игре, потому, что система (игра, DirectX, видеокарта) умеет работать только с DDS-текстурами, а TGA для них - инопланетная технология... Что сделал KaaPex - показал, как создать Simple-слой с нормальной DDS текстурой. Это позволило по-другому решить обе технические проблемы. Сделать нормальный Simple-слой для виждета карты (с нормальной пропорцией), и сделать "настоящую" вращающуюся стрелку... Миникарта от KaaPex, может быть, не очень устраивала меня внешне, но она была уже сделана, и нормально работала. Поэтому, не было срочной необходимости доделывать мою миникарту. К тому же, ещё до появления миникарты KaaPex, я надеялся, что выпущу свою миникарту только после того, как смогу сделать её круглой. Правда, сомневался, думал, что если не выйдет, выпущу квадратной. А теперь, когда появилась миникарта от KaaPex, я перестал сомневаться - если ПОЛУЧИТСЯ сделать миникарту круглой, то доделаю и выпущу. А если не получится, тогда вообще нет смысла её выпускать. Так, я забросил её на долгие-долгие месяцы... И лишь иногда, изредка, бился над тем, как сделать миникарту круглой. Предо мной встали две новые технические проблемы, решения которых до сих пор не было ни в одном аддоне: 3) Чтобы миникарта стала КРУГЛОЙ, нужно наложить на неё маску прозрачности. 4) Длину заголовка с названием зоны нужно уметь динамически менять, в зависимости от длины текста в ней (как в компасе). Однако, я ЗНАЛ, что каким-то образом, на виджеты можно накладывать маски, так как я видел это в интерфейсе игры (портреты персонажей - КРУГЛЫЕ, а не квадратные, на них наложена круглая маска), и видел сами текстуры масок в ресурсах игры (там они называются "ClipMask"). На решение этих двух задач, ушло много бессонных ночей... Решение наложения маски прозрачности, искал методом проб и ошибок. Много раз брался за это дело, но каждый раз, как только были перепробованы все возможные варианты, терпение заканчивалось. Затем, проходило какое-то долгое время, за которое я напрочь забывал всё, что я пробовал в прошлый раз, и когда появлялось настроение, пытался снова. И однажды, решение нашлось! Оказывается, при наложении на виджет маски, существует целый ряд ограничений, которые нужно обязательно учесть, иначе это не сработает. Может есть и другие способы, я не знаю, но я нашёл только этот: 1) В тег <textureMask>, в его href="", нужно прописать именно "UISingleTexture". 2) Вне зависимости от ширины и высоты виджета, размер накладываемой на него текстуры-маски должен быть квадратным (?), а её ширина и высота должны быть степенями двойки (например, 256x256). 3) Текстура самой маски, может быть в любом кодеке, закрашена любым цветом, а сама маска прозрачности - это её Alpha-канал. 4) Если на виджет наложена маска, то во всех текстурах этого виджета, и у всех его дочерних виджетов, Alpha-каналы (прозрачность) работать НЕ будут, НИГДЕ (!) 5) По предыдущей причине, на виджет НЕЛЬЗЯ помещать Foreground-текстуру. Последний пункт был для меня настоящим "эпическим" провалом, потому, что оказалось, я очень долго экспериментировал с наложенным Foreground'ом, а этого делать было нельзя. Только убрав с виджета Foreground, мне наконец-то удалось добиться того, чтобы маска сработала... Просто, на Foreground-текстуру, действие маски НЕ распространяется (в отличие от Background-текстуры), но вот, "отключение" прозрачности на неё РАСПРОСТРАНЯЕТСЯ, и она просто загораживает квадратом ваш виджет с маской, и даже если маска наложена, вы этого не увидите, пока не уберёте Foreground. Выглядит это так, как будто маска НЕ наложилась. Как раз после того, как я нашёл способ сделать миникарту круглой, неожиданно, месяц назад, разработчики игры выпустили патч АО 2.0.02, со встроенной КВАДРАТНОЙ миникартой. ЭТО БЫЛА ПРОВОКАЦИЯ!!! ) Как понимаете, имея на руках рабочую КРУГЛУЮ миникарту, я никак не мог проигнорировать эту провокацию Это буквально вынудило меня довести разрабтку аддона до конца. Теперь, я взялся за динамическое изменение размера заголовка с названием зоны. В исходнике компаса, нет никакого кода, программно меняющего длину этого заголовка. Значит, всё это сделано в системе виджетов. Вытащил параметры виджетов компаса (с помощью ловкости рук и GetPlacementPlain), и оказалось, что там, за это отвечают два виджета - Заголовок, и помещённый в него Текст. Оба виджета имеют <Sizing>, отличный от стандартного WIDGET_SIZING_DEFAULT. Вот их <Sizing>: Code: <Placement> / <X> / <Sizing>WIDGET_SIZING_CHILDREN</Sizing> -- Заголовок<Placement> / <X> / <Sizing>WIDGET_SIZING_INTERNAL</Sizing> -- Текст Пример использования WIDGET_SIZING_INTERNAL нашёлся прямо в SampleAddons, в аддоне "SampleZoneAnnounce". А вот, с WIDGET_SIZING_CHILDREN у меня ничего не вышло. Но я особо и не искал, после того, как нашёлся способ, программно подстраивать размер Заголовка под размер Текста. Оказывается, можно функцией GetPlacementPlain() получить текущий размер Текста с WIDGET_SIZING_INTERNAL, и использовать его для коректировки размера его материнского контейнера (Заголовка). Но здесь тоже есть заковырка - оказывается, чтобы всё это нормально работало при любых резолюциях экрана, приходится пользоваться функцией widgetsSystem:GetPosConverterParams(). Вот так: Code: local s = widgetsSystem:GetPosConverterParams()local t = wtText:GetPlacementPlain() local p = wtTitle:GetPlacementPlain() p.sizeX = math.ceil( s.fullVirtualSizeX / s.realSizeX * t.sizeX ) + t.posX + t.highPosX wtTitle:SetPlacementPlain( p ) Кстати, аналогичный способ подстройки размера виджета под размер содержимого, я использовал и в тултипах. Тултипы миникарты тоже меняют размер, подстраиваясь под размер своего содержимого. Теперь, когда все технические проблемы с виджетами были решены, нужно было написать почти весь код на Lua. Это было уже делом техники. Но это "дело техники" оказалось труднее, чем я думал. Например, KaaPex, просто скопировал исходник оригинальной карты, с минимальными изменениями. Но я решил написать весь код с нуля. Во-первых, со времён АО 1.0.03 (у нас имеется исходник карты именно из этого, очень старого патча), функционал стандартной карты в АО несколько расширился, поэтому, старый исходник карты нужно было, как минимум, дополнять. Во-вторых, не хотелось копировать все эти "стеклянно-алюминиевые конструкции" из оригинального кода карты, я думал, можно сделать всё гораздо проще и компактнее (в итоге, так и вышло, мой код действительно
  10. SLA

    MinimapSla

    MinimapSla Просмотр файла Первая и единственная КРУГЛАЯ миникарта для "Аллодов Онлайн" Полноценно работает в абсолютно ВСЕХ инстансах (показывает группу/рейд, квесты, и т.д.). Показывает координаты Межевых камней, Сокровищ, и др. (можно добавлять отметки). Для инстансов, можно рисовать карты (пока нарисована только карта "Чистилища"). Множество других мелких улучшений, которые вас обязательно порадуют, если вам уже приходилось пользоваться другими миникартами Подробнее в теме поддержки The first and only ROUND minimap for "Allods Online" Fully working in absolutely ALL instances (shows party/raid, quests, etc.). Shows coordinates of Milestones, Treasures, etc. (you can add more markers). It's possible to draw instance maps (currently there is only "Purgatory"). A lot of other small improvements, that are sure to delight you, if you've used other minimaps before More in the support topic Добавил SLA Добавлено 11.02.2011 Категория Аддоны  
  11. Заметьте, у меня ещё 40 минут до полуночи, и я никуда не опаздываю
  12. Quote: для любого примера должно быть описание. хотя-бы того что он делает. Из Allods Online\data\Mods\Docs\ModdingDocuments.zip\Creating.html: Quote: SampleZoneAnnounce Дополнение data\Mods\SampleAddons\SampleZoneAnnounce. Пример, выводящий уведомление о переходе игрока в другую зону. Показывает возможность отключения оригинального интерфейса игры с аналогичной функциональностью. Но , перед тем, как читать этот ModdingDocuments.zip, как правильно заметил Nikon, лучше начать с прикреплённой темы "Как сделать свой аддон" - эта тема как раз для новичков.
  13. ОБНОВЛЕНИЕ 2011-02-10 Добавлена поддержка ПОРТУГАЛЬСКОЙ локализации! Соответственно, обновил первое сообщение темы, и её аттачмент "SampleLocalization". При хранении текстов Португальской локализации в виде набора TXT-файлов, кодировка такая же, как и в других языках - "Unicode". Однако, если вы храните тексты локализаций прямо в Lua-файле, то знайте, Португальская 8-битная системная кодировка - Windows-1252 (такая же, как в Немецком и Французском языках). Бразильские локализаторы нарушили традицию, выбрав 2-значную аббревиатуру страны "br" (а не 3-значную, как у всех остальных). Но, как я уже не раз говорил, у нас есть несколько причин, по которым, нам желательно использовать именно оригинальные аббревиатуры, поэтому: "br" это Португальский "br" is for Portuguese
  14. Real life, такой real life..... В общем, сегодня НИКТО не помешает мне сделать релиз. Релиз будет сегодня. P.S. Я тут подумал, что после моего последнего тизера ("Таких мест нет на карте? - Нет, не слышал"), вы, наверное, ожидаете что-то сверхестественное? Нет, никакой магии не будет (почти), это ПРОСТО добротный аддон, только и всего
  15. Quote from your linked article: Quote: “Allods Online” has so far been released in eight languages and further releases are expexted to follow. Aha, EIGHT (!) languages + Turkish. 1) Russian 2) English 3) German 4) French 5) Japanese 6) Chinese 7) Portuguese (Brazil) 8) ??? (Unknown!) 9) Turkish Hm, looks like we have one unknown language in this list. What language is it?
  16. )) Аддон PortableCompass, действительно КОСВЕННО связан с моим аддоном. А сейчас, будет релиз того самого аддона. .
  17. SLA

    PortableCompass

    Версия r2

    3 раза скачали

    RUS: Мистик! Если ты потерял свой компас на поле боя, то знай, здесь тебе всегда выдадут новый! Точно такой же, только перемещаемый по экрану. И без заголовка с названием зоны. Кроме того, он чуть быстрее оригинального, благодаря небольшой оптимизации кода. ENG: Psionicist! If you have lost your compass on the battlefield, then know, here you always get a new one! Exactly as original, but movable. And without a title with zone name. Also, it's slightly faster than the original one, thanks to some code optimization. Последняя проверенная версия работы аддона: 2.0.07.11
    Бесплатный
  18. PortableCompass Просмотреть файл RUS: Мистик! Если ты потерял свой компас на поле боя, то знай, здесь тебе всегда выдадут новый! Точно такой же, только перемещаемый по экрану. И без заголовка с названием зоны. Кроме того, он чуть быстрее оригинального, благодаря небольшой оптимизации кода. ENG: Psionicist! If you have lost your compass on the battlefield, then know, here you always get a new one! Exactly as original, but movable. And without a title with zone name. Also, it's slightly faster than the original one, thanks to some code optimization. Последняя проверенная версия работы аддона: 2.0.07.11 Автор Lafayette Добавлен 07.12.2018 Категория Старые аддоны (от игры 1.0 - 3.0)  
  19. Как определить, какого пола ваш язык программирования? Очень просто. Переход с любого "мужского" языка программирования на Lua выглядит примерно так: -- Меня зовут Lua. Я неприхотлива и не капризна. Буду помогать тебе во всём, и наведу порядок в твоём холостяцком доме, и ты узнаешь, что такое уютный домашний очаг. -- Хорошо, спасибо тебе. Переход с Lua на PHP выглядит примерно так: Гусарское училище, 6 часов утра, построение на плацу. -- Перед именами переменных нужно ставить знак $, понятно, солдат?! -- Так точно! -- Почему нет точки с запятой в конце строки? Поставь! -- Есть! -- И здесь поставь! -- Есть! -- И здесь поставь! -- Есть! -- Где все точки с запятой, в конце строк, Б***Ь ???? Ты издеваешься надо мной?! -- Никак нет! -- Ну вот, опять! Ты что, С ЛУНЫ СВАЛИЛСЯ ??? -- Так точно, с Луны! Пришёл из Lua. -- На гаупвахту его. Посидишь там, подумаешь, зачем в PHP нужны точки с запятой! )
  20. Гайд по булевой логике Lua для Женщин
  21. Решил написать такой вот "необычный" гайд, думаю, кому-нибудь будет полезен, может даже, не только женщинам ) По крайней мере, я как-то не встречал никаких гайдов по программированию для женщин, может, я написал самый первый? х)) Конечно, можно было бы просто написать несколько примеров (что я и сделал в конце гайда), но я решил написать так, чтобы было понятно, как всё это работает изнутри. Гайд по булевой логике Lua для Женщин (Guide to Lua boolean logic for Women) Знаете, чем особенен язык Lua? Это один из очень-очень немногих языков программирования, у которого женское имя. (Lua - "луна" по-португальски, женский род, как в португальском, так и в русском языках). И вообще, у неё много чисто женских качеств - Lua гораздо мягче, и покладистее, чем всякие PHP и Python'ы. То есть, Lua - женщина (думаю, я не один заметил это?), и поэтому, подход к так называемой "булевой логике" (она у неё совсем даже не "булевая"!), и не только к ней, у Lua не такой, как в других языках. И в этом есть своя прелесть, этим Lua особенно хороша Lua развивает идею "булевой логики" гораздо дальше других языков, потому, что... как бы это сказать... идеалисты говорят, "у женщин, в 6 раз сильнее интуиция", а материалисты говорят, "у женщин, в 6 раз больше нейронных связей". Кто из них прав? Ладно, не важно, теперь, к делу. Представьте, что в программе, внезапно, попалось что-то вроде этого: MyVariable = (true and (not 0 or 53) and ":-)") or {} Так о чём же думает эта женщина, когда натыкается на такое вот?.. А вот, о чём. Когда Lua попадается любая "булева логика" (любые выражения с and, or и not - это boolean logic, "булева логика"), как в нашем примере - команда, в которой в какую-то переменную пытаются записать результат выполнения "булевой логики", то что тогда происходит? Она вдруг понимает, что перед ней - МИНИ-ИГРА! =) Женщины, вообще, обожают сюрпризы, любят, когда им оказывают внимание, например, когда предлагают сыграть в игру. Но мы-то знаем, что для Lua, это вообще слабость! Она страшно обожает мини-игры и несложные головоломки, и разумеется, с удовольствием берётся сыграть в неё... В этой игре, несколько уровней, я опишу правила каждого уровня игры. Сначала, она делит булевое выражение на условия (то есть, просто расставляет обычные скобки), правила такие - нужно построить буквам домики и комнаты из скобок, при этом, and всегда означает дружбу, а or всегда означает "не сошлись характерами": A and B --> (A and -- A и B живут вместе, в домике из скобок. A or B --> (A) or (-- A и B вообще не общаются, живут каждый в своём домике. A and B or C --> (A and or © -- A и B дружат, а C сам по себе. A and B or C or D and E and F --> (A and or © or (D and E and F) -- в последнем домике уже завелись дети. если программист своевольно вставил в изначальное выражение какие-то скобки, то Lua их тоже учитывает, например: A and (B or C) or D --> (A and (B or C)) or (D) -- по прихоти программиста, B и C поселены в одну комнату, хотя им это вынужденное соседство совсем не нравится! ведь, без скобок программиста, судьбы букв сложились бы совсем-совсем иначе: A and B or C or D --> (A and or © or (D) -- B переселилась к A, и им хорошо вместе, а C доволен, что избавился от B. если где-то есть not, то он добавляет ещё одно выражение, то есть, ещё одни скобки: A or not B --> (A) or (not () A or not (B and C) --> (A) or (not (B and C)) Затем, Lua начинает подсчитывать значения выражений (то что в скобках), СЛЕВА-НАПРАВО. Обычно, она выписывает выражения на бумажку, ей так понятнее. Например, выражение: (A and ((not or C) and D) or (E) на бумажке, сначала, превращается в: 1) X = (A and ((not or C) and D) = ? 2) Y = (E) = ? 3) ОТВЕТ = ( X or Y ) = ? Но она умница, и продолжает упрощать себе задачу, старательно "вынимая" все вложенные под-выражения, пока не вынет все до последнего. Тогда задачка становится совсем-совсем элементарной. Она испытывает радость, в этот момент, потому, что, в каждой отдельной строчке (на бумажке) - либо цепочка and'ов, либо цепочка or'ов, либо просто какая-то одинокая переменная, с not или без него. В итоге, на бумажке написано вот что: 1) V = (not = ? 2) Z = ( V or C) = ? 3) X = (A and Z and D) = ? 4) Y = (E) = ? 5) ОТВЕТ = ( X or Y ) = ? Вот в таком виде, уже можно решать в уме, понимает Lua, и приступает. Тут правила такие: "Переменная X истина" (X верна) - значит, "X равна чему угодно, кроме nil и false", "Переменная X ложь" (X не верна) - значит, "X равна nil или false". ВАЖНО: Для Lua, в отличие от других языков программирования, число 0 (ноль) - ИСТИНА. Говорю же, что женщина! И если кто не в курсе, пустые таблицы и пустые строки тоже ИСТИНА. То есть, истина, буквально, "всё что угодно, кроме nil и false" - то есть, эта женщина, как бы, говорит нам - "да будь он хоть северный олень, лишь бы не п***р и не к***л!" ) A and B and C = A истина? Если НЕТ, то ОТВЕТ - A Но если A истина, тогда... B истина? Если НЕТ, то ОТВЕТ - B Но если B истина, тогда... ОТВЕТ - C (чем бы он ни был, т.к. это последний элемент). ОТВЕТ - значение ПЕРВОГО попавшейся в цепочке ЛОЖНОГО элемента. На этом, разбор цепочки немедленно прекращается. Иначе, если пришлось пройти всю цепочку (ВСЕ элементы цепочки оказались ИСТИННЫ), ответом станет значение ПОСЛЕДНЕГО элемента. A or B or C = A истина? Если ДА, то ОТВЕТ - A. Но если A ложь, тогда... B истина? Если ДА, то ОТВЕТ - B. Но если B ложь, тогда... ОТВЕТ - C (чем бы он ни был, т.к. это последний элемент). ОТВЕТ - значение ПЕРВОГО попавшейся в цепочке ИСТИННОГО элемента. На этом, разбор цепочки немедленно прекращается. Иначе, если пришлось пройти всю цепочку (ВСЕ элементы цепочки оказались ЛОЖНЫ), ответом станет значение ПОСЛЕДНЕГО элемента. ВАЖНО: В Lua, операторы and и or возвращают не просто какой-нибудь дурацкий true/false, а возвращают именно ЗНАЧЕНИЕ ПЕРЕМЕННОЙ. То есть, в примерах выше, фраза "ОТВЕТ - A" означает, буквально, "ОТВЕТ - значение переменной A". И это краеугольный камень всей "женской булевой логики" Lua! ВАЖНО: Если в цепочке and'ов попалась ложь, или в цепочке or'ов попалась истина, то на этом, разбор цепочки заканчивается (ведь, ответ уже известен, и нет смысла продолжать), и все остальные элементы в цепочке НЕ ПРОВЕРЯЮТСЯ ВООБЩЕ. При том, что проверка выражений идёт СЛЕВА-НАПРАВО, программисты знают эту хитрость, и как ею пользоваться. Кстати, Lua не считает, что они ею "пользуются", даже наоборот, она знает, что они знают, как этим пользоваться, но всегда с удовольствием подыгрывает им - НИКОГДА не проверяет остальные условия, как только появляется такая возможность. Но это никакое не свойство женской психики, на самом деле, так ведут себя все языки программирования. И что же нам даёт знание этой тонкости? Многое! В самом конце гайда, есть популярные примеры её использования. not A = A верно? Если да, то ОТВЕТ - false. Но если A не верно, то ОТВЕТ - true. В отличие от "and" и "or" (в Lua, возвращающих значения каких-то подсунутых им переменных), оператор "not" обладает жёстким, нордическим характером (точно как в других языках). Ему ВООБЩЕ НЕ ИНТЕРЕСНО, что ему подсунули, что бы там ни было, вариантов ОТВЕТА у него ВСЕГО ДВА - либо true либо false. Третьего не дано! Исключений нет! Пленных не брать! Например: not 10 -> false, not "" -> false, not {} -> false, not false -> true, not nil -> true. И вот, Lua решает наше выражение, подставив значения переменных вместо букв. Она с нетерпением ждала этот важный момент, это последний уровень игры, самый интересный! У неё замирает сердце, и перехватывает дыхание. Допустим, наше выражение: (A and ((not or C) and D) or (E) со значениями выглядит вот так: (true and ((not 0) or 53) and ":-)") or ({}) И вот, она считает (у неё есть калькулятор, но здесь он ей совсем не понадобится): 1) V = (not 0) = false -- Как я уже упомянул выше, в "женской булевой логике" Lua, число 0 это истина. 2) Z = ( V or C) = (false or 53) = 53 3) X = (A and Z and D) = (true and 53 and ":-)") = ":-)" 4) Y = (E) = {} 5) ОТВЕТ = ( X or Y ) = (":-)") or ({}) = ":-)" С приятным ощущением совершённого полезного дела, Lua записывает строку ":-)" в переменную MyVariable. Это, наверное, для чата, или для какого-то диалогового окна, - думает она, - получается, я только что подарила кому-то улыбку, значит, мой день прожит не зря Мини-игра пройдена! Lua радуется, программист счастлив, все пользователи довольны P.S. Примеры из жизни и быта - на Lua, они просты, как японские Хайку! Tools = GetTools() or {} -- Lua, принеси мне коробку с инструментами, а если не найдёшь её, то принеси пустую коробку. (Суть в том, что функция GetTools() должна вернуть либо таблицу, либо nil. Если инструменты не найдутся, то nil, возвращённый функцией GetTools(), здесь будет заменен на пустую таблицу. То есть - можно быть 100% уверенными, что после выполнения этой команды, в переменной Tools НУ ТОЧНО-ТОЧНО находится ТАБЛИЦА, к гадалке не ходи!) Name = ID and GetName( ID ) -- Lua, скажи, как его зовут, НО только если знаешь его ID. Если ID не знаешь, то пусть его зовут nil. (ВАЖНО: Здесь, смысл в том, что если первое условие НЕверно (ID=nil), то, второе условие ДАЖЕ НЕ ПРОВЕРЯЕТСЯ, что спасает нас от ужасной катастрофы, которая ОБЯЗАТЕЛЬНО возникла бы при попытке выполнить GetName( ID ) при ID равном nil. Такая катастрофа закончилась бы ошибкой в логе, и прекращением выполнения функции - нам так не надо!) Element = Index and ElementsTable [ index ] or 0 -- Lua, если известен индекс элемента, дай его значение из таблицы. А если нет индекса, ИЛИ ДАЖЕ, если есть индекс но в таблице нет элемента под этим номером, тогда дай-ка 0. Power = A and B and math.pow( A, B ) or 0 -- Lua, если имеются A и B, то посчитай, "A в степени B". Но если нет A или B (или обоих), то пусть ответ будет 0, так как мне тут НУ ОЧЕНЬ-ОЧЕНЬ нужно получить именно ЧИСЛО. print( A == B and "A равно B" or "A и B не равны" ) -- Lua, если A равно B, то напиши фразу "A равно B", а если не равны, то напиши "A и B не равны". (Ага, здесь мы используем "булеву логику" как параметр функции. Но и это не предел! Поскольку смысл "булевой логики" в Lua - вернуть значение какой-нибудь переменной, то мы можем использовать "булеву логику" в совершенно любом месте программы, где предполагается подстановка какого-нибудь значения переменной. Без никаких ограничений. То есть, чуть реже, чем в каждой строке программы )
×
×
  • Создать...

Важная информация

Пользуясь сайтом, вы принимаете Условия использования