скорость бега

4ipolino

Прославленный
Участник
Победитель в номинации 2020
Сообщения
233
Розыгрыши
0
Решения
2
Репутация
98
Реакции
124
Баллы
1 405
Хроники
  1. Chaotic Throne: High Five
Исходники
Присутствуют
Сборка
основа овер
Доброго времени суток.
Появилась проблема. Отображение скорости бега не верное при определенных обстоятельствах.
В частности игроки жалуются что в определенных обстоятельствах бонусы от сета или от бафа дает не в полной мере (вместо +7 от дк сета отображает скажем +5)
Параметры отправленные в юзеринфо (== параметрам на скрине ниже ):
Код:
move_speed:1,3304347826086957
_runSpd:114
walkSpd:86
_swimRunSpd:82
_swimWalkSpd:82
_flRunSpd:0
_flWalkSpd:0
_flyRunSpd:0
_flyWalkSpd0
судя по числам клиент получает скорость move_speed*_runSpd , а на стороне сервера _runSpd = (int) (player.getRunSpeed() / move_speed); и при округлении выходит что пропадает пару пунктов скорости

получаем move_speed:
JavaScript:
    public double getMovementSpeedMultiplier()

    {

        if(isRunning())

            return getRunSpeed() * 1. / _template.getBaseRunSpd();

        return getWalkSpeed() * 1. / _template.getBaseWalkSpd();

    }

Снимок.JPG

п.с реальная скорость которая должна быть - справа на скрине
мб кто подскажет что не так
 
screenshot-2019-07-21-at-12-42-05.webp
screenshot-2019-07-21-at-12-47-58.webp

клиент-то всё верно показывает,исходя из того,что вы ему засылаете
 
Последнее редактирование:
Да оно то понятно. Округление портит всю картину.
Вопрос был как заставить отображать верною инфу? Может кто сталкивался с данной проблемой?
 
у вас сервер внезапно "округлил" 151.6 до 153? при учёте,что округление должно быть в меньшую сторону (что и сделал клиент, показав 151)
 
Проблема в передаваемых клиенту значений в пакетах CharInfo, UserInfo, PetInfo
speedMove = player.getMovementSpeedMultiplier()
runSpd = (int) (player.getRunSpeed() / multiplier);
walkSpd = (int) (player.getWalkSpeed() / multiplier);

Вы получаете мультиплаер(speedMove) отношением скоростей, и в это же время делаете обратную операцию, чтобы получить базовую скорость(runSpd и walkSpd).
В этот момент базовая скорость уже не будет дотягивать до своего реального значения, а будет ее приближением.
Затем передаете клиенту эти значения, клиент кушает только float с scale равному 6, остальное значения после точки отрежутся.
В итоге обратная операция умножения в клиенте уже дважды обрезанной базовой скорости и обрезанный мультиплаер, показывают в клиенте неизвестный результат с разницей в скорости до 3 или 4х. И это, кстати, влияет не только на отображение параметра, но и синхронизацию координат - ведь за 2 секунды бега с разницей в 4 скорости вы уже попадете в новый геоблок и начнете, например, поворачивать за препятствие, в то время как клиент еще будет добегать и цеплять за текстуры.
 
то что проблема в значениях думаю уже и ежу понятно
возможно и костыль но округление помогло в данной ситуации
_runSpd = (int) Math.round(player.getRunSpeed() / move_speed);
по сути данная проблема во всех исходниках
@Rozhek, как вы решили данною проблему?
п.с не совсем понятно зачем клиенту модификатор
 
Последнее редактирование:
то что проблема в значениях думаю уже и ежу понятно
возможно и костыль но округление помогло в данной ситуации
_runSpd = (int) Math.round(player.getRunSpeed() / move_speed);
по сути данная проблема во всех исходниках
@Rozhek, как вы решили данною проблему?
п.с не совсем понятно зачем клиенту модификатор
Модификатор шлется в инфо пакетах.
 
Есть 2 варианта решения. Правильный или быстрый.
Правильный: передавать базовую скорость в runSpd и walkSpd в разных ситуациях(на земле\в воде\в полете\верхом) и мультипликатор от этой скорости.
Быстрый: использовать округление для мультипликатора до значения приемлемого клиентом. speedMove = Util.scaleValue(multiplier);

Код:
double multiplier = player.getMovementSpeedMultiplier();

speedMove = Util.scaleValue(multiplier);

runSpd = (int) (player.getRunSpeed() / multiplier);

walkSpd = (int) (player.getWalkSpeed() / multiplier);



private static final double SCALE = Math.pow(10, 5);

/** Method return value after reduce scaling

 * with upper approximation

 * @param value

 * @return scaledValue

 */

public static double scaleValue(double value) {

    return (value * SCALE  + 1 ) / SCALE;

}
 
Назад
Сверху Снизу