Сообщений: 38
Тем: 4
Зарегистрирован: Mar 2016
Репутация:
-14
Всем привет!
Нигде не могу найти где клиенту пересылается скорость перемещения НПЦ. В нпцдате (на стороне клиента) только множитель. В пакете нпцинфо посылается также только множитель. Подсобите посоны... в каком пакете прилетает сама скорость, абсолютное значение.
Дампил все входящие пакеты с конкретным НПЦ от момента входа в игру до момента смерти этого моба и ниче нету про скорость. Мне надо верно вычислять координаты моба когда пришел пакет MoveToPawn или MoveToLocation, а без скорости никаг...
Сообщений: 832
Тем: 125
Зарегистрирован: Jan 2009
Репутация:
404
08-14-2016, 02:35 AM
(Сообщение последний раз редактировалось: 08-14-2016, 02:50 AM krisadr.)
pokan81 Написал:Всем привет!
Нигде не могу найти где клиенту пересылается скорость перемещения НПЦ. В нпцдате (на стороне клиента) только множитель. В пакете нпцинфо посылается также только множитель. Подсобите посоны... в каком пакете прилетает сама скорость, абсолютное значение.
Дампил все входящие пакеты с конкретным НПЦ от момента входа в игру до момента смерти этого моба и ниче нету про скорость. Мне надо верно вычислять координаты моба когда пришел пакет MoveToPawn или MoveToLocation, а без скорости никаг... GitHub
вот к примеру... 156 строка. если это множитель то тогда базовая скорость в клиенте хранится... уже точно не помню. Но мне кажется пакетами передается только множитель, который потом в клиенте домножается на базовую скорость.
PS. дай угадаю, раздражает что мобы ходят "лунной походкой" ?)
Добавлено через 10 минут
pokan81 Написал:Мне надо верно вычислять координаты моба когда пришел пакет MoveToPawn или MoveToLocation, а без скорости никаг... Вот вычисления модификатора скорости.
Код: aminModivicator = (float)(player.getRunSpeed()/BaseRunSpeed));
runSpeedMod = (int) ((player.getRunSpeed()/aminModivicator));
примените обратную формулу и получите скорость...
Сообщений: 38
Тем: 4
Зарегистрирован: Mar 2016
Репутация:
-14
Чето прям все мимо кассы дружище
Сообщений: 832
Тем: 125
Зарегистрирован: Jan 2009
Репутация:
404
я дико извиняюсь мои познания не так велики, но могу я поинтересоваться что вы хотите конкретно сделать и для каких целей вам нужны точные координаты... разве они не приходят в
moveToLoc
Код: protected final void writeImpl()
{
writeC(0x01);
writeD(_charObjId);
writeD(_xDst);
writeD(_yDst);
writeD(_zDst);
writeD(_x);
writeD(_y);
writeD(_z);
}
Дружище?
Сообщений: 38
Тем: 4
Зарегистрирован: Mar 2016
Репутация:
-14
krisadr Написал:я дико извиняюсь мои познания не так велики, но могу я поинтересоваться что вы хотите конкретно сделать и для каких целей вам нужны точные координаты... разве они не приходят в
moveToLoc
Код: protected final void writeImpl()
{
writeC(0x01);
writeD(_charObjId);
writeD(_xDst);
writeD(_yDst);
writeD(_zDst);
writeD(_x);
writeD(_y);
writeD(_z);
}
Дружище?
Представь игрок входит в игру. Ему прилетает пакет NpcInfo содержащий среди прочего позицию нпц. Теперь НПЦ решил переместиться. Игроку прилетает пакет MoveToLocation. В нем передаются две координаты: откуда идти и куда идти. Чтобы пока моб двигается мы могли посчитать его координаты в любой момент между "от" и "до" мы должны знать скорость его перемещения в линеечных единицах. Как у персонажа скорость 195 означает 195 единиц в секунду. Например для простоты возьмем моба "от которого" пришел пакет MoveToLocation из точки (0, 0, 0) в точку (1000, 0, 0). При этом допустим скорость его 100 ед в сек. Имеем всего данных то две точки и скорость. В какой точке будет находиться моб через 3 секунды? Естественно в (300, 0, 0). Это понятно? А если нам скорость неизвестна то и промежуточные положения мы не посчитаем. Есть еще пакеты VaidatePosiotion - они присылают актуальные координаты посчитанные сервером. Но они прилетают не всегда и очень редко - моб двигается скачками.
Сообщений: 555
Тем: 2
Зарегистрирован: Feb 2011
Репутация:
1,507
чет дичь какая-то, вопросы был - где клиент получает скорости нпц, ответ был дан - npcinfo. ответ верен. в нем есть скорость и модификатор для анимации
зы. возможно раз не была указана хроника - в последних там немного сложнее, но опять же, оно будет частью npcinfo
Сообщений: 38
Тем: 4
Зарегистрирован: Mar 2016
Репутация:
-14
KID Написал:чет дичь какая-то, вопросы был - где клиент получает скорости нпц, ответ был дан - npcinfo. ответ верен. в нем есть скорость и модификатор для анимации
зы. возможно раз не была указана хроника - в последних там немного сложнее, но опять же, оно будет частью npcinfo
в том то и дело что дичь, хроники те в которых нпцинфо начал собираться из блоков, ну в частности пусть будет хелиос. Также появился новый пакет ExNpcInfoSpeed - но в нем опятьже только модификаторы....
Поглядел в скриптах клиентских (LineageMonster.u) там задается GroundSpeedMin/GroundSpeedMax. Но она вроде как маленькая очень - 60-70 единиц. Даже со всеми модификаторами мобы бы ползали.
Сообщений: 832
Тем: 125
Зарегистрирован: Jan 2009
Репутация:
404
короче я тебя понял, я делал это так
Код: /**
* @author rengen/krisadr
*/
class MovementTick implements Runnable
{
private final Logger log = LogManager.getLogger(MovementController.class);
private List<Player> attachedPlayers = new ArrayList<>();
private int msInTick = 200;
private NioNetStackList<Player> queueToAttach = new NioNetStackList<Player>();
private NioNetStackList<Player> queueToDelete = new NioNetStackList<Player>();
public void addPlayerToAttachedPlayers(Player player)
{
log.info("Добавляем персонажа " + player.getName() + " в коллекцию передвижения");
queueToAttach.addLast(player);
}
public void removePlayerFromAttachedPlayers(Player player)
{
log.info("Добавляем персонажа " + player.getName() + " в очередь на удаление");
queueToDelete.addLast(player);
}
@Override
public void run()
{
log.info("Запускаем Контроллер передвижения");
while(!ShutdownManager.isShutdown())
{
if(!queueToAttach.isEmpty())
{
attachedPlayers.add(queueToAttach.removeFirst());
continue;
}
if(!queueToDelete.isEmpty())
{
attachedPlayers.remove(queueToDelete.removeFirst());
continue;
}
for(Player player : attachedPlayers)
{
if(player.getEmployment() == Employment.MOVE_TO_TARGET)
{
int currX = player.getGeoPoint3D().getGeoPointX();
int currY = player.getGeoPoint3D().getGeoPointY();
int currZ = player.getGeoPoint3D().getGeoPointZ();
int targetX = player.getGeoPoint3DTarget().getGeoPointX();
int targetY = player.getGeoPoint3DTarget().getGeoPointY();
int targetZ = player.getGeoPoint3DTarget().getGeoPointZ();
double distance = GeoPoint3D.calculateDistance3D(currX, currY, currZ, targetX, targetY, targetZ);
int speedModiver = 1000/msInTick;
double speed = (player.isRunning() ? player.getRunSpeed() : player.getWalkSpeed());
double distanceTraveledPerTick = speed / speedModiver;
double tgA = (targetY-currY)/(targetX-currX);
double atan = Math.atan(tgA);
log.info("distance: " + distance );
log.info("distanceTraveledPerTick: " + distanceTraveledPerTick);
int deltaX = (int) (distanceTraveledPerTick * Math.cos(atan));
int deltaY = (int) (distanceTraveledPerTick * Math.sin(atan));;
int newPlayerX = currX + deltaX;
int newPlayerY = currY + deltaY;
player.getGeoPoint3D().setGeoPoint(newPlayerX, newPlayerY, currZ);
int diffX = Math.abs(targetX) - Math.abs(newPlayerX);
int diffY = Math.abs(targetY) - Math.abs(newPlayerY);
if(Math.abs((diffX + diffY)) < 10)
{
player.setEmployment(Employment.DO_NOTHINK);
}
log.info("newPlayerX: " + newPlayerX + ", newPlayerY: " + newPlayerY + ", currZ: " + currZ);
log.info("diffX: " + diffX + ", diffY: " + diffY);
}
}
try
{
Thread.sleep(msInTick);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
}
А скорость которая хранится в памяти сервера например 195 - это кол-во ячеек которое клиентОбджект проходит за 1000 мс... (так рассчитывает сам клиент!)
валидатПос приходит через 1200 мс.. все вся необходимая информация у тебя имеется.... получить скорость можно getRunSpeed. Или ты хочешь сказать у твоих обьектов нет данного метода???
В моем примере сервер каждые 200 милисекунд знает где находится объект.
ось Z не учитывал потому что путешествие с неровных склонах идет по прямой что для меня было ненужным. Z обновлялся от пакета валидПос следовательно нужно учитывать погрешность.
Сообщений: 1,065
Тем: 20
Зарегистрирован: Mar 2010
Репутация:
3,855
ну до этреи явно базовые скорости в NpcInfo слались, в дополнение к модификатору скорости.
а вот с этреи уже шлется только модификатор, т.к. корейцы прямо в клиент заложили базовые значения скоростей - их можно найти в файле NpcGrp.dat
так же перестали отсылать в NpcInfo и добавили в тот же файл коллизии нпс, а так же их базовое хп/мп
Сообщений: 38
Тем: 4
Зарегистрирован: Mar 2016
Репутация:
-14
krisadr Написал:короче я тебя понял
вся необходимая информация у тебя имеется.... получить скорость можно getRunSpeed. Или ты хочешь сказать у твоих обьектов нет данного метода???
В моем примере сервер каждые 200 милисекунд знает где находится объект.
Нет у меня нет всей необходимой информации. Я уже третий раз пытаюсь сказать у меня нет никаких getRunSpeed и прочего. Я ловлю пакеты с офф сервера и пытаюсь на радаре отобразить плавно движущегося моба.
Gaikotsu Написал:а вот с этреи уже шлется только модификатор, т.к. корейцы прямо в клиент заложили базовые значения скоростей - их можно найти в файле NpcGrp.dat
так же перестали отсылать в NpcInfo и добавили в тот же файл коллизии нпс, а так же их базовое хп/мп
В нпцгрп сейчас хранятся также модификаторы. Найти базовые значения можно в скриптах клиента. Я разобрался короче, нет сейчас инфы о базовой скорости в пакетах
|