Доброго времени суток.
Появилась проблема. Отображение скорости бега не верное при определенных обстоятельствах.
В частности игроки жалуются что в определенных обстоятельствах бонусы от сета или от бафа дает не в полной мере (вместо +7 от дк сета отображает скажем +5)
Параметры отправленные в юзеринфо (== параметрам на скрине ниже ):
судя по числам клиент получает скорость move_speed*_runSpd , а на стороне сервера _runSpd = (int) (player.getRunSpeed() / move_speed); и при округлении выходит что пропадает пару пунктов скорости
Проблема в передаваемых клиенту значений в пакетах 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);