Скрипты для начинающих - Страница 27 - Форум HeroesWorld-а

Быстрая навигация по основным разделам форума:
Турниры
КАРТЫ
Heroes 6
Heroes 5
Heroes 4
Heroes 3
Heroes 2
Heroes 1
Might&Magic

Герои Меча и Магии 5 - Картостроительство (Редактор карт) В этом разделе можно обсуждать все что касается редактора карт для Heroes of Might and Magic V. Так же здесь обсуждаем картостроительство.

Ответ
Страница 27 из 28
 
Опции темы
#391
Старый 17.03.2024, 12:29
  #391
^
Killer5029
📖
Регистрация: 04.01.2020
Сообщения: 27
Регистрация: 04.01.2020
Сообщения: 27
Хорошо
Re: Скрипты для начинающих

АзгалорKiller5029, для удобства можно поставить любого героя-некроманта, а потом выделить его и слева в свойствах объекта зайти в его Shared, и там в списке героев Necropolis выбрать героя Nikolay, нажать OK, и герой сменится на Николаса-вампира.

Огромное спасибо)
Killer5029 вне форума
Ответить с цитированием
#392
Старый 22.03.2024, 16:42
  #392
^
FataLisT
 
Аватар для FataLisT
📖
Регистрация: 22.03.2024
Сообщения: 25
Регистрация: 22.03.2024
Сообщения: 25
По умолчанию
Re: Скрипты для начинающих

Всем доброго времени суток!

Пути поиска ответов привели и на форум, был в группе ВК, нашёл руководство по командам битвы. Условно понятно что с хуками делать. Пока затык чтоб понять, запустился ли вообще этот скрипт. Подозреваю, что до него не доходит, ибо указанный просто в файлике print не выводится в консоли.

Кратко опишу цель: Карта планируется для более быстрых противостояний. Но начала обрастать деталями, например выбирает первый игрок через диалоговые окна стадию игры, но их переделаю, в инструкциях нашёл что можно ввести с большим количеством ответов) И потом обшаривает карту, что дропнулось одевается. подкачивается. И в финале сходятся в битве на специальной арене. Вписывается небольшой сюжет. Хочу на карту вкрутить пару пасхалок и ловушек. Вот есть место, где позарившись на совкровища как бы не охраняемые , игрок должен пойти туда. по тригеру входа в область запускается скрипт, где на него нападает Властелин, либо сами драконы, пока не нашёл как сделать чтобы на одно карте было 2 игрока человека, и нейтрально создавался герой нападающий на одного или второго. Читал про резерв, с ним тоже некоторый затык использования. Но конкретно на это пока только вечер ушёл, а вот с боевым скриптом вопросики. Есть простая команда "StartCombat" , она отрабатывает начало битвы. Можно обойтись и ей, если просто вкрутить нападение драконов. Но задумка дальше. Я хочу чтобы либо напавший герой, либо герой попадает под управление ИИ (наш который попал в ловушку герой) и кастует 2-3 раза армагедон, против чёрных драконов. И потом противник сдаётся. Или там команда после завершения есть кому засчитывается победа. Тоже пытался углубиться в тему, ответы не нашёл, ну или плохо искал. В общем пока могу реализовывать только так с текстовым всплывающим, что вот ты расхититель поплатишься и всё. С горем пополам разобрался как добавляется файл скрипта в игре, поломав параллельно чисто случайно привязку мапскрипта к карте, починил через открытые блокнотом нужного файлика и возвращением упоминания нужного скрипта мапы. По крайней мере команда перестала ругаться, что не видит скрипт по указанному пути. Но не запускается ни в какую. Что я делаю не так, не могу понять. Упёрся в творческий тупик. 

Прошу на пальцах объяснить, как правильно работает. Прикладываю свою заготовку карты. Там местами закомментирована логика, т.к. проверял со старта сразу битву (начинается от взаимодействия со скелетом у стартового замка). Т.е. нужен совет, как правильно прописать взаимодействие чтоб через StartCombat запускался скрипт битвы, в котором хочу прописать каст по площади заклинания и потом отступление атакующих. Может я не в том месте, не в том файле что-то не так пишу, или файл скрипта недоделан как-то. на вид он идентичен файлу MapCsript. В общем ощущение белого пространства знаний на лицо. Пробовал выдать Властелина сразу игроку3 под управлением компа, но скрипт его не видел как противника никаким образом тоже. даже в обычную битву что бы засунуть без дополнительных скриптов на именно касты заклинаний. Когда создавал доп.файл скрипта, print из DragonCombat.lua запускался. т.е. по идее карта до него достучаться может. Но вот механика дополнительного его подключения пока мной не освоена ( Ищу ответ, что не хватает.

Отдельное спасибо ранее всем за выложенные в сеть инструкции, карту ждут масштабные переделки. Существ местами втыкал во имя проверки баланса... ещё все правиться и правиться будет неоднократно. Веду запись версионности, строк там тьма) Сейчас в файле DragonCombat.lua только набросок как хотел. эксперементировал и отлаживал на ходу. За сутки не разобрался, пошёл спрашивать совет) до этого карту ваял пару недель вечерами, только смотрел как у вас тут что было) На карте по чьему-то тут сообщению реализован параллельный бесконечный ход. по задумке всё происходить должно за один день. Да и не раз ещё приду сюда ощущаю... Задумок на основе новых полученных данных по возможностям стало больше и из простенькой дуэльной она может стать вполне себе с некоторыми интересными отсылками, Привет могиле в подземелье и далее сделаю мост (прочитал как) ну и битву с существом)) и ещё что-то попадётся, около пирамид например тоже прикручу. 

Заранее благодарю!

p.s. ещё вспомнил вопрос, промучался пару дней и поисков на форуме, не нашёл способ нормальный как добавить для выбора сразу в создани карты на ряду с Маркелом, Джованни и Орнеллой Арантира. В настройках карты включил всех героев из сюжета. Арантир доступен добавлением на карту, но именно при создании как сразу основной игровой что-то никак. Из мыслей вот его в запас закинуть (в чём пока не разобрался как правильно, чтоб работало) и вызывать в диалоге по типу подошёл к тюрьме или там ещё каким-то взаимодействием. Тут придумаю, чем обыграть. 

23.03.2024 01:20 upd: Попробовал сделать, как нашёл вот в этом сообщении https://forum.heroesworld.ru/showthread.php?p=1225989#post1225989
Один в один по шагам, отличие только в названии файла ( Это ж не обязательно, все файлы скриптов боевых в карте не могут быть одноимённые? О_о ). Вместо CombatScript  у меня DragonCombat. Из отличий заметил, что в настройках карты указывался полный путь до скрипт файла, а не как у меня ранее просто название, без пути. Воодушевлённый пошёл тестить и снова принт не отображал запуск скрипта никаким образом( Из успехов, нашёл как добавить 3 игроку доступных героев для выбора и то там не было Властелина. Но хотяб героя получилось вытаскивать из резерва, перемещать рядом и активировать битву с ним. Заметил, что армия героя не появляется, только те существа, что я прописал при вызове StartCombat. но ни через установку скрипта герою и игрока и компа, ни через указание скрипта в запуске битвы не отображается несчастный принт, что игра зашла в этот скрипт

  DeployReserveHero("Inagost", 115, 290, 0);
  ChangeHeroStat("Inagost", 0, 90000);
  --SetHeroCombatScript('Inagost', pathScript.."DragonCombat.xdb#xpointer(/Script)");
  --SetHeroCombatScript(p1heroname[0], pathScript.."DragonCombat.xdb#xpointer(/Script)");
  StartCombat(p1heroname[0], "Inagost", 1, 84, 10, pathScript.."DragonCombat.xdb#xpointer(/Script)", nil, nil, nil);

пробовал вот таким образом вызывать скрипт, комментил 3- строки попеременно и совсем без них, и в StartCombat ставил nil и оставлял путь до скрипта. Не хочет работать. Актуальную карту перезагрузил в приложение. Так же теряюсь в догадках, где недочёт. Чтоб двигаться дальше в доработке идей свох

Вложения
Тип файла: h5m Grand_Duel.h5m (444.4 Кбайт, 1 просмотров)
__________________
Ещё только учусь =)
Ещё только учусь =)
FataLisT вне форума
Ответить с цитированием
#393
Старый 23.03.2024, 13:08
  #393
^
Jack_of_shadows
 
Аватар для Jack_of_shadows
📖
Регистрация: 08.09.2013
Сообщения: 510
Выставка наград
Регистрация: 08.09.2013
Сообщения: 510
Выставка наград
По умолчанию
Re: Скрипты для начинающих

FataLisT, по поводу StartCombat, возможно не хватает sleep(1) после DeployReserveHero. Обычно все функции, которые что-то изменяют на самой карте, выполняются не мгновенно в момент вызова команды, нужна задержка прежде чем герой реально появится из резерва.
__________________
РПГ-сценарий для HoMM5: Путь героя

ЧаВо по созданию карт для HoMM5: ЧаВо
РПГ-сценарий для HoMM5: Путь героя

ЧаВо по созданию карт для HoMM5: ЧаВо
Jack_of_shadows вне форума
Ответить с цитированием
#394
Старый 23.03.2024, 16:19
  #394
^
FataLisT
 
Аватар для FataLisT
📖
Регистрация: 22.03.2024
Сообщения: 25
Регистрация: 22.03.2024
Сообщения: 25
По умолчанию
Re: Скрипты для начинающих

Jack_of_shadows, спасибо) Попробовал добавил sleep(1), не помогло. Герой появлялся и без задержки, было видно, хотя команда. Но вообще команда полезна вероятно будет, учту на будущее. Ещё бы понять почему немного лагает при старте игры. Убрал из стартовой функции блокировки областей определённых стало полегче. 

+ без вызова героя из запаса в просто вызове StartCombat с чисто мобами и добавлении скрипта в соответствующий параметр к нему не идёт обращение.

 

__________________
Ещё только учусь =)
Ещё только учусь =)
FataLisT вне форума
Ответить с цитированием
#395
Старый 23.03.2024, 16:58
  #395
^
FataLisT
 
Аватар для FataLisT
📖
Регистрация: 22.03.2024
Сообщения: 25
Регистрация: 22.03.2024
Сообщения: 25
По умолчанию
Re: Скрипты для начинающих

Протестировал, в настройках карты в Mapscript если устанавливаю DragonScript, он мне в игре отображает в консоли print, который я вбил для проверки что в файл скрипта попадаю, как только меняю и пытаюсь через команду вытянуть нужный мне боевой скрипт чтоб пока увидеть, что игра на него вышла и готова выполнять - фигушки)
Заменяемое в настройках карты строчки:
Script:Maps\Multiplayer\Grand_Duel\MapScript
Script:Maps\Multiplayer\Grand_Duel\DragonCombat
т.е. я делаю вывод, что DragonCombat.xdb корректно видит *.lua файл свой. Но вот в нормальных условиях по непонятной пока мне причине отказывается обращаться к указанному скрипту, хотя адрес на вид верный. Иначе соответствующие команды ругались на некорректный параметр.

Нужен хелп от гуру)

Ещё скопилось пара вопросов:
1) просмотрел инструкцию по всплывающим сообщениям, и по форуму поискал. Не нашёл инфу, как вместо надписи "Сообщение" сделать свой заголовок. Подозреваю там нужен какой-то аргумент дополнительный.

2) когда-то в самом начале, разграничивая карту, я промахнулся и за область вынес объекты стен. выделить их никаким образом не удаётся для удаления. Висят там немым укором) Есть ли способ убрать эти лишние объекты? чтоб совсем всю карту не переделывать из-за них, просто перенёс по области видимости текущую планировку карты. ну и пока там всё размечено удобными квадратами из меню объектов арены.

Как только решение по корректному обращению в файл боевого скрипта будет найдено, буду ещё разбираться в создании своей сцены боя. Ибо тематическая штука на карте прям обязывает довести дело до идеала и отсылку сделать полной с ареной битвы на узком мосту подземелья) 

Миниатюры
Нажмите на изображение для увеличения
Название:  1.JPG
Просмотров: 6
Размер:	57.7 Кбайт
ID:	72977  
__________________
Ещё только учусь =)
Ещё только учусь =)
FataLisT вне форума
Ответить с цитированием
#396
Старый 24.03.2024, 17:04
  #396
^
}{0TT@6bI4
 
Аватар для }{0TT@6bI4
📖
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1973
Выставка наград
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1973
Выставка наград
По умолчанию
Re: Скрипты для начинающих

Попробуйте указать путь целиком без конкатенаций. Начиная с прямого слеша. Именно "/Maps/SingleMissions/...". Без GetMapDataPath(). Помню, что сталкивался с этой проблемой, потому что в сталкере корневой боевой скрипт привязан именно так.
__________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
Discord-сервер "Герои 5: S.T.A.L.K.E.R"
Сервер по модификации "Герои 5: S.T.A.L.K.E.R"
_________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
Discord-сервер "Герои 5: S.T.A.L.K.E.R"
Сервер по модификации "Герои 5: S.T.A.L.K.E.R"
_________________
}{0TT@6bI4 вне форума
Ответить с цитированием
#397
Старый 24.03.2024, 17:08
  #397
^
}{0TT@6bI4
 
Аватар для }{0TT@6bI4
📖
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1973
Выставка наград
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1973
Выставка наград
По умолчанию
Re: Скрипты для начинающих

1) У MessageBox'ов нет возможности скриптом настроить что-либо, кроме основного текста. Для более интересных вещей лучше пользуйтесь TalkBoxForPlayers (с версии 3.1), описание есть в ЧаВо Jack_of_Shadows.

2) Все объекты хранятся в списке objects в map.xdb. При помощи текстового редактора найдите там объекты с отрицательными координатами (или превышающими размер карты) и удалите соответсвующий блок вида <Item>...<Item/>. Если знаете путь к Shared объекта, то можете найти по нему.
__________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
Discord-сервер "Герои 5: S.T.A.L.K.E.R"
Сервер по модификации "Герои 5: S.T.A.L.K.E.R"
_________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
Discord-сервер "Герои 5: S.T.A.L.K.E.R"
Сервер по модификации "Герои 5: S.T.A.L.K.E.R"
_________________
}{0TT@6bI4 вне форума
Ответить с цитированием
#398
Старый 24.03.2024, 20:53
  #398
^
FataLisT
 
Аватар для FataLisT
📖
Регистрация: 22.03.2024
Сообщения: 25
Регистрация: 22.03.2024
Сообщения: 25
По умолчанию
Re: Скрипты для начинающих

}{0TT@6bI4Попробуйте указать путь целиком без конкатенаций. Начиная с прямого слеша. Именно "/Maps/SingleMissions/...". Без GetMapDataPath(). Помню, что сталкивался с этой проблемой, потому что в сталкере корневой боевой скрипт привязан именно так.
Попробовал вынести в MapScript.lua этот кусок сразу. Получилось следующее:
DeployReserveHero("Inagost", 115, 290, 0);
sleep(1);
p3heroname = GetPlayerHeroes(3)[0];
print(p3heroname);
ChangeHeroStat("Inagost", 0, 90000);
SetHeroCombatScript(p1heroname, "/Maps/Multiplayer/Grand_Duel/DragonCombat.xdb#xpointer(/Script)");
sleep(1);
StartCombat(p1heroname, "Inagost", 1, 84, 10, nil, nil, nil, nil);

Остальные стартовые закомментировал функции, в итоге перемещает героя из запаса, но дальше всё равно не заходит в скрипт. Там для проверки лежит print ("open DragonScript") . Консоль молчит, но напрягает вот строчка warning: script are not allowed, скрин во вложении. Может где-то не хватает чего-то ещё, как настройки чтоб скрипт работал? Теряюсь в догадках( Но вообще ворнинги постоянно какие-то вылезали, и остальное работало.

По ответам на 1) и 2) пункты, спасибо большущее! Карту подредактировал в map.xdb, по именам объектов нашёл быстро строки с координатами выбивающимися. Теперь всё ровно, глаз радуется. На счёт TalkBoxForPlayers  сейчас изучаю, как работает и вывод потестировал, прикрутил. Осталось дооформить, под мои цели этот вариант намного лучше и элегантнее выглядит) 

Миниатюры
Нажмите на изображение для увеличения
Название:  скрин.JPG
Просмотров: 5
Размер:	40.7 Кбайт
ID:	72993  
__________________
Ещё только учусь =)
Ещё только учусь =)
FataLisT вне форума
Ответить с цитированием
#399
Старый 24.03.2024, 23:11
  #399
^
Jack_of_shadows
 
Аватар для Jack_of_shadows
📖
Регистрация: 08.09.2013
Сообщения: 510
Выставка наград
Регистрация: 08.09.2013
Сообщения: 510
Выставка наград
По умолчанию
Re: Скрипты для начинающих

FataLisT, а пробовали класть боевой скрипт в корень карты? У меня так работает, но я уже и не помню почему было сделано именно так.
__________________
РПГ-сценарий для HoMM5: Путь героя

ЧаВо по созданию карт для HoMM5: ЧаВо
РПГ-сценарий для HoMM5: Путь героя

ЧаВо по созданию карт для HoMM5: ЧаВо
Jack_of_shadows вне форума
Ответить с цитированием
#400
Старый 24.03.2024, 23:39
  #400
^
FataLisT
 
Аватар для FataLisT
📖
Регистрация: 22.03.2024
Сообщения: 25
Регистрация: 22.03.2024
Сообщения: 25
По умолчанию
Re: Скрипты для начинающих

Jack_of_shadowsFataLisT, а пробовали класть боевой скрипт в корень карты? У меня так работает, но я уже и не помню почему было сделано именно так.
Jack_of_shadows, если правильно понял, речь про такое расположение? (Приложил скрин) Сейчас файл и *.xdb и *.lua лежат, как и изначально были созданы в корне папки по умолчанию по всеми. В папку сегодня только вынес кучу текстовок для вопросов. Ну и иные функции переписал, сократив количество строчек.

По сути вот в таком виде не работает. Путь пробовал и в ", и в ' заключать. Не хочет заходить в скрипт боевой. Опять же, заменив MapScript на DragonCombat при запуске карты *.lua запускался из скрипта. Связь в нём прописана нормально, видимо)

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

Миниатюры
Нажмите на изображение для увеличения
Название:  скрин.JPG
Просмотров: 5
Размер:	218.5 Кбайт
ID:	72997  
Вложения
Тип файла: h5m Grand_Duel.h5m (451.8 Кбайт, 1 просмотров)
__________________
Ещё только учусь =)
Ещё только учусь =)
FataLisT вне форума
Ответить с цитированием
#401
Старый 24.03.2024, 23:54
  #401
^
Jack_of_shadows
 
Аватар для Jack_of_shadows
📖
Регистрация: 08.09.2013
Сообщения: 510
Выставка наград
Регистрация: 08.09.2013
Сообщения: 510
Выставка наград
По умолчанию
Re: Скрипты для начинающих

FataLisT, не, корень я имел в виду самый верхний уровень, рядом с папками Maps и MapObjects. И в xdb тогда путь просто "/DragonCombat.lua".
__________________
РПГ-сценарий для HoMM5: Путь героя

ЧаВо по созданию карт для HoMM5: ЧаВо
РПГ-сценарий для HoMM5: Путь героя

ЧаВо по созданию карт для HoMM5: ЧаВо
Jack_of_shadows вне форума
Ответить с цитированием
#402
Старый 25.03.2024, 00:08
  #402
^
FataLisT
 
Аватар для FataLisT
📖
Регистрация: 22.03.2024
Сообщения: 25
Регистрация: 22.03.2024
Сообщения: 25
По умолчанию
Re: Скрипты для начинающих

Jack_of_shadowsFataLisT, не, корень я имел в виду самый верхний уровень, рядом с папками Maps и MapObjects. И в xdb тогда путь просто "/DragonCombat.lua".
Попробовал положить рядом с Maps и MapObjects, и в *.xdb поменял путь через MapEditor - всё так же, не выходит.
__________________
Ещё только учусь =)
Ещё только учусь =)
FataLisT вне форума
Ответить с цитированием
#403
Старый 25.03.2024, 00:17
  #403
^
Азгалор
 
Аватар для Азгалор
📖
Регистрация: 24.04.2016
Сообщения: 207
Регистрация: 24.04.2016
Сообщения: 207
По умолчанию
Re: Скрипты для начинающих

FataLisT

 

p3heroname = GetPlayerHeroes(3)[0];
print(p3heroname);
SetHeroCombatScript(p1heroname, "/Maps/Multiplayer/Grand_Duel/DragonCombat.xdb#xpointer(/Script)");
StartCombat(p1heroname, "Inagost", 1, 84, 10, nil, nil, nil, nil);

 

Первые 2 строки связанны с p3heroname, а боевой скрипт вешается и комбат запускается на герое под названием p1heroname. Собственно, герой p1heroname существует?

Upd: Открыл твою карту, чекнул скрипт, p1heroname нигде не упоминается. Собственно, вопрос от нашего(почему-то в этом случае молчаливого) скрипта: "Да кто такой этот ваш p1heroname?!"

Азгалор вне форума
Ответить с цитированием
#404
Старый 25.03.2024, 00:27
  #404
^
FataLisT
 
Аватар для FataLisT
📖
Регистрация: 22.03.2024
Сообщения: 25
Регистрация: 22.03.2024
Сообщения: 25
По умолчанию
Re: Скрипты для начинающих

Азгалор

Первые 2 строки связанны с p3heroname, а боевой скрипт вешается и комбат запускается на герое под названием p1heroname. Собственно, герой p1heroname существует?

Upd: Открыл твою карту, чекнул скрипт, p1heroname нигде не упоминается. Собственно, вопрос от нашего(почему-то в этом случае молчаливого) скрипта: "Да кто такой этот ваш p1heroname?!"

 

p1heroname определяется в других функциях, на них ссылки в " doFile(path.. "Grand_Duel_db.lua"); " ведут. иначе да, скрипт вообще бы ругался, согласен)
p3heroname = GetPlayerHeroes(3)[0];
print(p3heroname);

Эти 2 строки только для проверки что игра видит нормально героя 3 игрока ИИ. Их можно закомментировать, ничего не изменится. Ну и этот же кусок кода я вставлял в другие тесты, где отрабатывает функция телепорта через взаимодействие со скелетом на карте. Итог тот же. Сейчас перенёс в основной файл MapScript.lua чтоб быстрее проверять работает или нет. А так он будет вообще отдельно лежать и идти туда нужно долго по карте для срабатывания.

Скрипт битвы я хочу прикрутить к герою игрока. а не ИИ. поэтому навешиваю на p1heroname.

Если где-то логический косяк. Допускаю, lua специфичен крайне. В голове остаточные знания с универа о программировании лежат)

Кстати, вспомнился вопрос, почему нельзя редактировать через MapScriptsEditor файлы xdb?

__________________
Ещё только учусь =)
Ещё только учусь =)
FataLisT вне форума
Ответить с цитированием
#405
Старый 25.03.2024, 00:32
  #405
^
Азгалор
 
Аватар для Азгалор
📖
Регистрация: 24.04.2016
Сообщения: 207
Регистрация: 24.04.2016
Сообщения: 207
По умолчанию
Re: Скрипты для начинающих

FataLisTp1heroname определяется в других функциях, на них ссылки в " doFile(path.. "Grand_Duel_db.lua"); " ведут. иначе да, скрипт вообще бы ругался, согласен)
Да, уже заметил) Что же, недоглядел немного. Кстати, запустил карту, и скрипт работает. Ну... Сильно подвисает секунд 5, а потом запускает комбат с нейтральным Синитаром с 10 драконами в его армии. Такие дела 👀
Азгалор вне форума
Ответить с цитированием
Ответ
Страница 27 из 28


Опции темы



Часовой пояс GMT +4, время: 03:07.


vBulletin v3.5.0, Copyright ©2000-2024, Jelsoft Enterprises Ltd. (Русский)

Яндекс цитирование    Top.Mail.Ru