Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Скорость перемещения НПЦ
#1
Всем привет!

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

Дампил все входящие пакеты с конкретным НПЦ от момента входа в игру до момента смерти этого моба и ниче нету про скорость. Мне надо верно вычислять координаты моба когда пришел пакет MoveToPawn или MoveToLocation, а без скорости никаг...
Ответ
#2
pokan81 Написал:Всем привет!

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

Дампил все входящие пакеты с конкретным НПЦ от момента входа в игру до момента смерти этого моба и ниче нету про скорость. Мне надо верно вычислять координаты моба когда пришел пакет MoveToPawn или MoveToLocation, а без скорости никаг...
GitHub
вот к примеру... 156 строка. если это множитель то тогда базовая скорость в клиенте хранится... уже точно не помню. Но мне кажется пакетами передается только множитель, который потом в клиенте домножается на базовую скорость.
PS. дай угадаю, раздражает что мобы ходят "лунной походкой" ?)

Добавлено через 10 минут
pokan81 Написал:Мне надо верно вычислять координаты моба когда пришел пакет MoveToPawn или MoveToLocation, а без скорости никаг...
Вот вычисления модификатора скорости.
Код:
aminModivicator = (float)(player.getRunSpeed()/BaseRunSpeed));
runSpeedMod = (int) ((player.getRunSpeed()/aminModivicator));


примените обратную формулу и получите скорость...
Ответ
#3
Чето прям все мимо кассы дружище Smile
Ответ
#4
я дико извиняюсь мои познания не так велики, но могу я поинтересоваться что вы хотите конкретно сделать и для каких целей вам нужны точные координаты... разве они не приходят в
moveToLoc
Код:
    protected final void writeImpl()
    {
        writeC(0x01);
        
        writeD(_charObjId);
        
        writeD(_xDst);
        writeD(_yDst);
        writeD(_zDst);
        
        writeD(_x);
        writeD(_y);
        writeD(_z);
    }
Дружище?
Ответ
#5
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 - они присылают актуальные координаты посчитанные сервером. Но они прилетают не всегда и очень редко - моб двигается скачками.
Ответ
#6
чет дичь какая-то, вопросы был - где клиент получает скорости нпц, ответ был дан - npcinfo. ответ верен. в нем есть скорость и модификатор для анимации

зы. возможно раз не была указана хроника - в последних там немного сложнее, но опять же, оно будет частью npcinfo
Ответ
#7
KID Написал:чет дичь какая-то, вопросы был - где клиент получает скорости нпц, ответ был дан - npcinfo. ответ верен. в нем есть скорость и модификатор для анимации

зы. возможно раз не была указана хроника - в последних там немного сложнее, но опять же, оно будет частью npcinfo

в том то и дело что дичь, хроники те в которых нпцинфо начал собираться из блоков, ну в частности пусть будет хелиос. Также появился новый пакет ExNpcInfoSpeed - но в нем опятьже только модификаторы....

Поглядел в скриптах клиентских (LineageMonster.u) там задается GroundSpeedMin/GroundSpeedMax. Но она вроде как маленькая очень - 60-70 единиц. Даже со всеми модификаторами мобы бы ползали.
Ответ
#8
короче я тебя понял, я делал это так
Код:
/**
* @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 обновлялся от пакета валидПос следовательно нужно учитывать погрешность.
Ответ
#9
ну до этреи явно базовые скорости в NpcInfo слались, в дополнение к модификатору скорости.
а вот с этреи уже шлется только модификатор, т.к. корейцы прямо в клиент заложили базовые значения скоростей - их можно найти в файле NpcGrp.dat
так же перестали отсылать в NpcInfo и добавили в тот же файл коллизии нпс, а так же их базовое хп/мп
Ответ
#10
krisadr Написал:короче я тебя понял
вся необходимая информация у тебя имеется.... получить скорость можно getRunSpeed. Или ты хочешь сказать у твоих обьектов нет данного метода???

В моем примере сервер каждые 200 милисекунд знает где находится объект.

Нет у меня нет всей необходимой информации. Я уже третий раз пытаюсь сказать у меня нет никаких getRunSpeed и прочего. Я ловлю пакеты с офф сервера и пытаюсь на радаре отобразить плавно движущегося моба.

Gaikotsu Написал:а вот с этреи уже шлется только модификатор, т.к. корейцы прямо в клиент заложили базовые значения скоростей - их можно найти в файле NpcGrp.dat
так же перестали отсылать в NpcInfo и добавили в тот же файл коллизии нпс, а так же их базовое хп/мп

В нпцгрп сейчас хранятся также модификаторы. Найти базовые значения можно в скриптах клиента. Я разобрался короче, нет сейчас инфы о базовой скорости в пакетах
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Haste potion(увеличивает скорость бега) Allene 6 1,817 09-28-2015, 10:48 PM
Последний пост: Donatte
  Скорость Интернета Для Сервера. Алмаз 25 8,642 07-22-2013, 09:26 PM
Последний пост: Алмаз
  Скорость каста ralex 7 2,608 09-04-2011, 10:37 PM
Последний пост: ralex
  Скорость интернета для онлайн 50-100 JFS 8 3,100 04-14-2011, 05:35 AM
Последний пост: NotSpecified
  Скорость каста UFODriverr 5 2,654 04-27-2010, 12:16 AM
Последний пост: Devilop
  Скорость SVKoT 1 1,982 11-03-2008, 02:16 AM
Последний пост: JoJo
  Помогите подобрать скорость для создания сервера qinka 43 11,039 07-19-2008, 01:48 AM
Последний пост: hattko

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)