Pull to refresh
12
0
Andrey Klyuev @knelse

SWE, fluffy alpaca

Send message

Я тоже :) Только они кроме вот такой экономии трех бит в одном месте шлют кучу "лишних" данных. Я пока глубоко не ковырял чат, но каждое сообщение - это 300-500 байт сверх самого текста =/

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

Ну и win1251 для логинов, паролей и имен персонажей, когда допустимых символов даже на 7 бит не набирается.

Мне кажется, они очень (слишком?) активно пытались оптимизировать траффик под модемы. Например, поле со статами может быть 1 бит, а может - 32. Зависит это от чиселки, которую надо туда записать, т.е. 0 займет всего 1 бит.

Ну и, как обычно, писали код на коленке разные люди и между собой особо не общались. Мне сложно представить другое адекватное объяснение, зачем нужно было придумывать 3 разных способа передачи координат -- до сих пор от этого больно.

Пару месяцев почти ничего по нему не делал, умудрился заболеть ковидом ровно в тот день, когда WHO объявила, что пандемия побеждена :)

Все может быть :)

Круто, спасибо! Я как раз искал что-нибудь удобное и визуально понятное

Я не буду отвечать на этот вопрос без адвоката :)

Собирался дописать эмулятор и донейтнуть его в какой-нибудь game preservation музей. Ближе к делу попробую разобраться, насколько легально поднимать сервер. Если не получу cease&desist раньше, конечно

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

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

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

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

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

  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.

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

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

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

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

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

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

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

Information

Rating
Does not participate
Registered
Activity

Specialization

Software Developer, Fullstack Developer
Senior