Комментарии 13
ох, первая ММОРПГ в жизни, интернет по карточкам, детство и вот это вот все
и ники знакомые такие
Такое дикое настольджи. Спасибо.
У меня такое, наверное, чувство от обитания в Ультиме онлайн и Рагнарок онлайн, со всеми этими интернет-картами.
Всегда рад :) У меня Сфера вызывает смешанные чувства - она абсолютно сломанная (и не то чтобы идеально продуманная даже без этого), но все равно нравится. Даже не помню, когда в последний раз в нее играл по-нормальному
О, как же долго мы этого ждали
Сесть ковыряться в Сфере было тяжело( потом когда оно начало как-то работать стало гораздо веселее
До координат. Чертовы координаты.
положение в пространстве, направление взгляда и скорость? или они что-то интереснее придумали?
Интересно те ребята которые изначально ей занимались, могли бы уже подзабить и помочь такому интересному проекту? :)
Вся физика на сервере, т.е. клиенту отдается текущее положение объекта в пространстве, без скорости / приложенных сил и т.д. Дальше клиент как-то интерполирует перемещение из точки А в точку Б.
А вот как это самое положение в пространстве лежит в пакете - это прекрасно:
Его минимум 3 варианта в зависимости от отправителя и действия:
Сервер, перемещение объектов
Сервер, все остальное (спавн игрока и предметов, телепорт игрока и т.д.)
Клиент, пинг
Для перемещения объектов сервер кладет в пакет:
32768 + целую часть значения, если это X или Z
1200 + целую часть значения, если это Y
Дробную часть каждой координаты (точнее, 4095 - значение для X и Z и 1200 - значение для Y) в другом месте, с точностью примерно до 1/64 этой дробной части. Возможно, тут есть какая-то сильно более простая формула, но я ее пока не понял.
Для всего остального на сервере:
Берем целую часть двоичного логарифма координаты, она же Math.Truncate(log2(x)) (если координата в полуинтервале [0; 1), результат всех операций 58)
Берем кол-во шагов, которое нужно пройти, чтобы от 11 (т.е. базовой координаты 2048) дойти до 2ˆMath.Truncate(log2(x))
Если координата больше 2048, то масштаб (или как его назвать еще) = 69 + steps / 2
Если координата меньше или равна 2048, то масштаб = 69 - (steps + 1) / 2
Число, которое мы будем энкодить = (x / 2ˆ(Math.Truncate(log2(x))) + 1) * 2 ^ 23. Дробную часть отбрасываем.
Дальше нам остается только записать эту чиселку и масштаб, не забыв поменять один из бит на 1, если кол-во шагов из пункта 2 нечетное.
На клиенте похожая история, только масштаб там начинается с 126.
Я надеюсь, что есть какой-то адекватный алгоритм, делающий эти преобразования проще, но я не очень умный и его не знаю
Насчет помочь - я всеми руками за, пожалуйста, пишите мне :)
Координаты перемещения я проверял в стартовом данже, он под землей. Вполне вероятно, что на поверхности или в других диапазонах координат формула окажется другой =/
Суммарно координаты заняли у меня где-то с месяц по несколько часов в день, наверно.
Весь код проекта написан на C#, для игрового сервера используется Godot.Мсье знает толк! Но почему не на GDScript?
Вы не поверите, но есть люди которые вдохновлялись прежде всего Сферой когда начали пилить свою ММО (Reign of Guilds).
Ужасный %s, известный своими бесчинствами: эмулятор Сферы, часть 1