MO_Transport
Посидели мы ланцом сделали хаковую реализацию нпц на транспорте под Мангос, за основу взяли наработки Шаурена.
Все изменения вы можете найти вот здесь https://github.com/KioM/mangos/commits/master Хотелось бы довести эту реализацию до ума и сделать транспорт как карту. Но увы тут мы зашли в тупик. Как я понял карты в сервере имеются. И даже Вмапсы подключаются как не странно по карте к транспорту. Но сервер видимо не хочет ее обрабатывать. Если кто поможет сниффами или идеями будем рады :) |
Цитата:
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
Я так понял по предвыдущему треду, нужно чисто решить проблему с взаимодействием плеера и юнитов на транспорте. Я представляю себе это так:
1. Проверяем есть ли на юните флаг на транспорте он или нет 2. Если есть флаг, то берем его координаты и координаты плеера относительно транспорта, по ним определяем вектор расстояния, ну а дальше уже, если расстояние приемлемое, то всякие взаимодействия (госсипы, атака, и т.п.). Если флага нет, то обработчик определения расстояния используем старый (по родительской карте). Но тут будет проблема с атакой например с родительской карты существа на траспорте. Катить не будет. Поэтому все-таки нужно заставлять двигаться транспорт не только у клиента, но и на сервере тоже. Тогда можно будет рулить относительно нормальных координат, а координаты относительно транспорта использовать чисто для определения новых координат. А вообще нужно на офе попробывать поагрить нпц на транспорте (они же будут в пределах транспорта бежать за плеером) и посмотреть по снифам какие координаты меняются (нормальные или относительные) |
Цитата:
map = ИД карты транспорта, x = х координата на транспорте, y = у координата на транспорте, z= z координата на транспорте и тд. и сервер сам загрузит моба куда нужно. Транспорт будет двигатся а для моба транспорт это его карта и с движением координаты на корабле не меняются. |
Некоторый прототип реализации этого добра я таки сделал. работает он скажем так хреновенько, но работает. для внешней ("родительской") карты танспорт - это точка (ГО точнее), по которой шляются юниты с относительными смещениями. пришлось сделать спец. вариант instanceable map. однако боюсь доделать до рабочего состояния - не хватит данных о механике... все наличные сниффы прошерстил, кое-чего нужного так и нету...
|
Цитата:
|
В любом случае вам придется эмулировать "движение" так сказать этих карт. Просто поскольку на офе взаимодействие между ними идет, то удобнее было б перегонять все координаты относительно родительской карты.
|
Нашел вчера статью по реализацию таких вещей в других играх, да там идет эмуляция сетки. Пойду пробовать.
|
Цитата:
|
У нас на сервере разве игрок перемещается во время движения го? (Ну кроме телепортации)
Это можно доказать простым способом: заходим на транспорт с петом, транспорт начинает двигаться, а пет останется на месте, т.к. на серверной стороне игрок не двигался. Для достижения высшей силы (возможность стрелять по игроку летящему рядом с го например) нужно так же на серверной стороне заставлять игрока двигаться вместе с транспортом. А вообще у нас же есть метод Код:
bool Transport::GenerateWaypoints(uint32 pathid, std::set<uint32> &mapids) |
|
Цитата:
Или возьмем простой пример: Остров Завоеваний. Там при захвате ангара начинает летать корабль вокруг базы врага, с которого ведется обстрел. Есть го, которое портирует игрока на корабль. Как вы будете определять координаты где находится наш корабль в текущий момент времени, и портировать игрока на него? |
Цитата:
|
Цитата:
|
Если я верно понял причину спора, то тут уже вступает физика. Вот простой пример из физики:
человек едет в машине со скоростью 100км в час. Относительно людей в не машины(стоящих на дороге) он двигается со скоростью в 100км в час, а относительно пассажиров этой машины - 0км в час Также и с координатами игрока. Игрок имеет координаты на карте Y - они не меняются, игрок стоит. Карта прикреплена к ГО - ГО движется -> карта тоже движется. Относительно карты Y игрок не движется, но относительно игроков на карте X(по этой карте бродит ГО с картой Y) он двигается -> меняет свои координаты |
По пунктам:
1. Чтобы пет двигался вместе с кораблем - нужно, чтобы сервер для клиента указал в структуре мувмент_дата гуид этого корабля. Скорее всего это делается пакетом SMSG_MONSTER_MOVE. 2. Корабли на мангосе, если ничего не изменилось за последние 3 года, двигается по табличке, которую в свое время сделал andstan. А вот локальную сетку к кораблям никто так и не прикрутил. 3. Опять же, если ничего не поменялось за последние 3 года, корабль спавнится при старте сервера и не деспавнится никогда. Что не есть правильно. На оффе, когда корабль доходит до конечной точки маршрута - он деспавнится с карты, а на другой карте спавнится другой корабль со всеми пассажирами с первого. Ну и на последок: Цитата:
Господи, это обсасывалось уже туеву хучу раз. Но каждый раз появляется умник, который считает, что он - Д'Артаньян, а все вокруг ... ну вы поняли. Добавлено через 8 минут Цитата:
А проблем на самом деле 2: 1) С каким промежутком делать обновление координат для пассажиров корабля?(интервал дискретизации) 2) Как заставить расчет расстояния между пассажирами на корабле производится не от глобальных координат, а от относительных координат(относительно центра корабля). |
Цитата:
Код:
Creature* Player::GetNPCIfCanInteractWith(uint64 guid, uint32 npcflagmask) Цитата:
|
Цитата:
1) Клиент считает, что НПС\Плеер находится на корабле, если в структуре MovementData в поле GUID'а транспорта стоит собственно GUID соответствующего транспорта. И когда NPC или Player стоит на транспорте - клиент сам апдейтит НА СВОЕЙ СТОРОНЕ их координаты, если транспорт совершает движение. На сервак он ничего при этом не посылает 2) Насчет второго примера. Все правильно. Об этом я и говорил. Расстояние для двух объектов, находящихся на транспорте, должно расчитываться на основании их смещения относительно центра корабля. А для остальных объектов должна расстояние должно браться относительно глобальных координат. Т.е: а) Если A и B находяться на одном и том же транспорте - то считать расстояние по относительным координатам. б) Иначе - считать по относительным координатам. И предвидя следующий вопрос: 1) Когда плеер стоит на транспорте и на fly mount'е взлетает в воздух, признак нахождения на транспорте моментально сбрасывается. 2) Когда плеер на fly mount'е подлетает к транспорту, признак нахождения на транспорте установится только когда плеер прекратит полет и приземлится на корабль. |
Цитата:
Цитата:
|
Также не вижу смысла считать расстояния относительно локальных - зачем усложнять?
Единственное для чего нужны локальные координаты - для перемещение юнита по сетке транспорта с последующим переводом координат в глобальные. |
Цитата:
1. Постоянно обновлять глобальные координаты на сервере - накладно. Значит нужно обновлять с каким-то определенным промежутком. 2. Если координаты обновляются с каким-то промежутком, то при достаточно большой скорости корабля - произойдет ситуация, когда клиент послал свои новые координаты, а координаты НПСюка не обновились. И тогда произойдет, то о чем вы говорили. 3. Тогда следущим логичным шагом было бы - обновлять координаты глобальные координаты у НПС при любом виде взаимодействия. Но тогда если несколько игроков одновременно "щелкнут" на одного НПСюка - произойдет мгновенное повышение нагрузки на сервер. Что тоже не есть хорошо. BTW, клиент при движении игрока на транспорте - сам посылает относительные координаты. И делает он это, как подсказывает здравая логика, отнюдь не случайно. |
Другое решение проблемы: не использовать глобальные координаты вычисленные клиентом, а только локальные.
Тогда можно спокойно раз в N времени вычислять глобальные координаты как плееров так и нпс и го. Правда могут появляться несоответствия между глобальными и локальными координатами. |
Уже обсуждалось, что в таком случае все рассчёты ведутся с учётом поправки отображения и координат игрока на корабле, как если бы он в самом деле был в той точке, где он сейчас находится на карте на корабле.
Понимаю, что кривовато объяснил. Объясняли лучше, но для этого надо найти ту тему и перечитать. Вам надо - вы и поищите. Тема лохматая, там всё было разжёвано от и до. Добавлено через 3 минуты Цитата:
1) А вот и нет. Совсем не моментально. Если взлететь не высоко - будешь двигаться вместе с транспортом, но действительно есть какие-то пределы, когда флаг сбрасывается. (если меня очень сильно не подводит память по опыту игры на оффе). |
Цитата:
|
Эм.. И сколько таких точек будет? А если нпц ходит по транспорту?
> Нпц для кораблей не очень много Именно.. поэтому расчет глобальных позиций не так уж много съест. Не стоит заморачиваться |
Цитата:
По поводу что как узнать в какой точке находится транспорт для телепортации на него или полета, есть понятие смена карты. Ну телепортировать игрока на транспорт легче простого, так как транспорт это карта. А вот с полетом надо подумать. Не даром полеты на транпорты осуществляется вехиклами, а не такси. |
Цитата:
проверялось только что на летающем корабле альянса в подземье |
MaxXx2021, на вашем примере кода реализации транспорта возможно создать скрипт с Боями на Кораблях в ЦЛК?.
|
Цитата:
|
Цитата:
Попробую сейчас на основе создания карт Инстов, сделать создание карты транспорту. |
Поправил визульные баги свзянные с инстант мапами и сделал микро движения, тестировать буду дня 2 потом скину все в репо KioM. Вопрос касательно нпц, есть у кого какие либо снифы?
|
У меня есть снифф с 4.0.3 и 4.0.6. Я как раз кв делал на ачивку в ледяной короне. На корабле движущемся тоже. Если надо, то скину
|
Спросите у РоманРом2, я как-то присылал ему полный снифф ЦЛК 25, если не ошибаюсь еще версии 3.3.5. Я тогда с гильдией его чистил полностью.
|
А случаем в ледяную скорбь вы не попали? Если да, то я ради такого даже парсер и плагины под 3.3.5 перепишу
|
Имеется в виду бой Лич 25ХМ ? и момент когда весь рейд закидывает внутрь фростморна ?
Нет, тогда мы чистили ЦЛК25 нормал плюс несколько ХМ. А в нормале все не так как в ХМ, там Лич просто целится в одного рейдера фростморном и медленно притягивает его к себе. Сам игрок в это время оказывается внутри комнаты, там находится дух отца Артаса и какой-то хрен враждебный, я там был всего пару раз, точно не рассмтотрел кто это. Суть происходящего такова: дух отца Артаса дерется с этим уродом, и для того что бы выйти из меча надо помочь ему убить этого кренделя. Для дд нужно просто хорошо вламывать и сбивать касты, он кастует какой-то хил на себя. А для хилеров нужно хилить духа отца Артаса и сбивать касты этому кексу, если сбить не получается то диспеить с него хилку (там хил типа друидского хота). При этом игрок снаружи получает некислый урон, и если его не хилить интенсивно то он умирает и Лич получает ацкий баф на +дмг. Собственно не отхиленный игрок от ледяной скорби = мертвый танк. Он так вламывать начинает что даже не всегда сейф абилки спасают. Убийство Лича в 25ХМ было позже, но снифов к сожалению я не писал, не до этого было ... Самый напряженный, необычный и интересный бой за всю историю ВоВ (имхо конечно). Лич 25ХМ мне запомнился больше всего из всей истории варика. Хотя я чистил практически весь классик (кроме накса), фул БК контент (Привет Иллидан, наш ГМ собрал тогда за два кила обе части клинков азинота), а санвел мне не нравился, тупняк какой-то... Ну и фул ВОТЛК в ХМ режиме, у меня даже есть конь "Непобедимый" с Лича, он тогда падал с 100% шансом. Убил лича 25ХМ - получи конягу. [Добавлено] Внутри фростморна в режиме 25ХМ ничего необычного нет, там весь рейд попадает в какую-то комнату, достаточно небольшую, на потолке висят кристалики и они начинают медленно падать на пол. Эти кристалики некоторе время лежат на полу, потом взрывают и исчезают, если на них наступить то это практически верная смерть. Каждая смерть игрока это плюс к урону Личу и он при этом увеличивается в размерах. На первых траях когда только стали доходить до этой фазы было прикольно - куча игроков помирала внутри фростморна, потом мы выходим, а там стоит Лич размером с ейфелеву башню и валит всех с одного удара, были скрины что по локу прошел урон примерно в 5 милионов. У нас в рейде назначался один танк (медвед) наводчиком, на него вешали череп, он выбирал путь между этими кристаликами и весь рейд бегал за ним, хилеры всех хилили (там кажется еще есть аура которая наносит всем рейдерам урон постоянно), ну вот проходит какое-то время и всех выкидывет обратно, так повторяется несколько раз, пока хп Лича не снесется до 10%, ну а там стандартно ... Он кладет инстантно весь рейд, начинает долго и нудно базарить мол какие вы все нубы и какой я красавчик, тут просыпается Фордринг в глыбе, молит свет о последнем шансе, разбивает глыбу, ломает Личу меч, из меча вылазит дух отца Артаса, делает массовое воскрешение, все встают и добивают Лича который как кукла вертится в струях из разбитого фростморна. Потом дурацкий мувик, потом экран клинит от того что весь рейд получил ачиву "Сияние рассвета", дележ лута и все ролят в конце конягу. Первого коня без рола отдали ГМу, а второго выролил я, выкинул 99, меня все тихо ненавидели потом -))) |
Народ ну что тупим :( Комната фростморна не работает только потому что она не в зоне видимости :( Она часть платформы артаса и находится очень далеко. Портуясь туда платформа пропадает из зоны видимости и ее нет. Сделайте 33 типу дистанцию видимости как у транспорта и она будет работать. Вот что значит не знания органов клиента. :( Все это печально. Тут и сниффа то не надо что бы понять это...
Теперь по существу дела... Сниффы на мобов :) П.С. сегодня постараюсь подобрать константу скорости корабля :) И останется только мобов реализовать :) |
Текущее время: 15:08. Часовой пояс GMT +3. |
ru-mangos.ru - Русское сообщество MaNGOS