PDA

Просмотр полной версии : Обработка пакета MoveToPawn


glukmaker
06.03.2013, 12:49
Играю на L2C4

Хочу сделать програмку с визуальным отображением перемещения персонажей. Вот тут задал несколько вопросов ( http://coderx.ru/showthread.php?p=194348#post194348 ), вроде та часть решилась.

Но теперь возник вопрос о том как обработать пакет MoveToPawn, ибо сервер параллельно с этим пакетом не посылает пакет MoveToLocation

В принципе если таргет неподвижен, то задача решается просто.
Вічисляем координаты в определенный момент времени так же как и в случае MoveToLocation, только координаты конечной точки уже нужно вычислять (искать по массиву объектов, который хранит программа объект таргета, и на прямой от начальный координат перса до координат таргета искать точку отстоящую от таргета на растоянии дистанции.)

Но что делать если таргет перемещается? Тогда координаты конечной точки тоже будут постоянно меняться. А особенно если таргет в свою очередь выполняет MoveToPawn ? Тогда получается вообще нужно будет вычислять все рекурсивным (или псевдорекурсивным способом). Причем получается что в данном случае на точность будет сильно влиять дискретизация по времени. да и в случае кругового таргета (1 персонаж взял в таргет второго и идет к нему, второй третьего, а третий первого) получится бесконечная рекурсия.

Есть варианты как это сделать проще?

supernewbie
06.03.2013, 13:32
glukmaker, ява сервер решает это так - координаты персонажа меняются таймером который срабатывает каждый шаг персонажа, тем самым происходит пошаговое передвижение персонажа
+ 2 состояния, обычное передвижение в точку, и следование - при следовании сервер каждый шаг персонажа меняет конечную точку на координаты ведущего персонажа

glukmaker
06.03.2013, 14:06
glukmaker, ява сервер решает это так - координаты персонажа меняются таймером который срабатывает каждый шаг персонажа, тем самым происходит пошаговое передвижение персонажа
+ 2 состояния, обычное передвижение в точку, и следование - при следовании сервер каждый шаг персонажа меняет конечную точку на координаты ведущего персонажа

ну серверу проще... Он все знает.
Но тем не менее в случае циклического перемещения по MoveToPawm
(1 персонаж взял в таргет второго и идет к нему, второй третьего, а третий первого)
думаю и сервер наверное вычисляет это все неточно... Ибо в таком случае чтобы вычислить координаты первого перса нужно вычислить сначала координаты его цели, т.е. второго перса, и т.д. по кругу...
Хотя вот подумал что небольшая погрешность (если координаты я вычисляю 20 раз в секунду), то координаты одной из целей можно взять и старые (вычисленные на предыдущем шаге). так и рекурсия не нужна, только прямой обход массива. надеюсь погрешность будет небольшой...

А вот может ли случится такая ситуация, когда:
Есть 3 перса:
Перс 1 - наблюдатель - программа берет с него данные.
Перс 2 - перемещается MoveToPawm к персу 3
Перс 3 находится вне зоны видимости перса 1.

Получится что персу 1 придет пакет MoveToPawm где будет указано что перс 2 бежит к персу 3, но координат перса 3 мы не знаем.

Может такое быть?

alexteam
06.03.2013, 23:11
Может такое быть?
нет.
1 придет пакет MoveToPawm
мутулокешин ему прийдет.

Zergatul
07.03.2013, 03:37
Все норм будет, погрешность небольшая. Иногда даже на разных окнах прицепленные персонажи стоят в разных местах.

Вообщем, если вдруг еще понадобиться мой код:
https://github.com/Zergatul/ulHelper/blob/master/ulHelper.L2Objects/GameWorld.cs метод MoveObjects
https://github.com/Zergatul/ulHelper/blob/master/ulHelper.L2Objects/L2LiveObject.cs

И не забывай про пакет StopMove

glukmaker
07.03.2013, 12:25
Все норм будет, погрешность небольшая. Иногда даже на разных окнах прицепленные персонажи стоят в разных местах.

Вообщем, если вдруг еще понадобиться мой код:
https://github.com/Zergatul/ulHelper/blob/master/ulHelper.L2Objects/GameWorld.cs метод MoveObjects
https://github.com/Zergatul/ulHelper/blob/master/ulHelper.L2Objects/L2LiveObject.cs

И не забывай про пакет StopMove

Да. StopMove я уже задействовал... MoveToPawm вроде как последнее что осталось обрабатывать при вычислении траектории движения персов и мобов.
Правда теперь придется код сильно править... Я первоначально (используя только моветулокейшен текущие координаты персов не сохранял. Только начальные и конечные, а текущие при вычислении использовались только для отрисовки перса. Но ничего.