Как стать автором
Обновить

Комментарии 13

ох, первая ММОРПГ в жизни, интернет по карточкам, детство и вот это вот все
и ники знакомые такие

Для многих первая, кажется) До Сферы я не знал, что ММО (РПГ) вообще существуют

Такое дикое настольджи. Спасибо.

У меня такое, наверное, чувство от обитания в Ультиме онлайн и Рагнарок онлайн, со всеми этими интернет-картами.

Всегда рад :) У меня Сфера вызывает смешанные чувства - она абсолютно сломанная (и не то чтобы идеально продуманная даже без этого), но все равно нравится. Даже не помню, когда в последний раз в нее играл по-нормальному

О, как же долго мы этого ждали

Сесть ковыряться в Сфере было тяжело( потом когда оно начало как-то работать стало гораздо веселее

До координат. Чертовы координаты.

положение в пространстве, направление взгляда и скорость? или они что-то интереснее придумали?

Интересно те ребята которые изначально ей занимались, могли бы уже подзабить и помочь такому интересному проекту? :)

Вся физика на сервере, т.е. клиенту отдается текущее положение объекта в пространстве, без скорости / приложенных сил и т.д. Дальше клиент как-то интерполирует перемещение из точки А в точку Б.

А вот как это самое положение в пространстве лежит в пакете - это прекрасно:

  1. Его минимум 3 варианта в зависимости от отправителя и действия:

    1. Сервер, перемещение объектов

    2. Сервер, все остальное (спавн игрока и предметов, телепорт игрока и т.д.)

    3. Клиент, пинг

  2. Для перемещения объектов сервер кладет в пакет:

    1. 32768 + целую часть значения, если это X или Z

    2. 1200 + целую часть значения, если это Y

    3. Дробную часть каждой координаты (точнее, 4095 - значение для X и Z и 1200 - значение для Y) в другом месте, с точностью примерно до 1/64 этой дробной части. Возможно, тут есть какая-то сильно более простая формула, но я ее пока не понял.

  3. Для всего остального на сервере:

    1. Берем целую часть двоичного логарифма координаты, она же Math.Truncate(log2(x)) (если координата в полуинтервале [0; 1), результат всех операций 58)

    2. Берем кол-во шагов, которое нужно пройти, чтобы от 11 (т.е. базовой координаты 2048) дойти до 2ˆMath.Truncate(log2(x))

    3. Если координата больше 2048, то масштаб (или как его назвать еще) = 69 + steps / 2

    4. Если координата меньше или равна 2048, то масштаб = 69 - (steps + 1) / 2

    5. Число, которое мы будем энкодить = (x / 2ˆ(Math.Truncate(log2(x))) + 1) * 2 ^ 23. Дробную часть отбрасываем.

    6. Дальше нам остается только записать эту чиселку и масштаб, не забыв поменять один из бит на 1, если кол-во шагов из пункта 2 нечетное.

  4. На клиенте похожая история, только масштаб там начинается с 126.

Я надеюсь, что есть какой-то адекватный алгоритм, делающий эти преобразования проще, но я не очень умный и его не знаю

Насчет помочь - я всеми руками за, пожалуйста, пишите мне :)

Координаты перемещения я проверял в стартовом данже, он под землей. Вполне вероятно, что на поверхности или в других диапазонах координат формула окажется другой =/

Суммарно координаты заняли у меня где-то с месяц по несколько часов в день, наверно.

Весь код проекта написан на C#, для игрового сервера используется Godot.
Мсье знает толк! Но почему не на GDScript?

У меня нет нормального ответа, на самом деле. Я сначала написал почти весь существующий код, пока разбирался, как оно работает, а потом уже подумал, где есть бесплатный navmesh)

Вы не поверите, но есть люди которые вдохновлялись прежде всего Сферой когда начали пилить свою ММО (Reign of Guilds).

Имхо, у Сферы были крутой узнаваемый стиль и интересная механика. А возможность в ММО складывать объекты друг на друга и строить лестницы из персонажей, чтобы куда-нибудь залезть, до сих пор иногда взрывает мне мозг :)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации