У проекта появилась чёткая архитектура управления сущностями. Теперь NPC, игроки, питомцы и другие объекты взаимодействуют в мире через систему менеджеров — рассказываю, как это работает.
В игровом мире есть разные типы сущностей: NPC, игроки (Player), питомцы (Pet) и другие. Каждая из них имеет свои состояния (движение, атака, бездействие) и требует управления.
Основные сущности и их поведение • NPC – управляет собой (перемещение, атака, idle). • Player – управляется игроком (те же состояния: ходьба, атака и т. д.). • Pet – похож на NPC, но принадлежит игроку.
Менеджеры и их задачи 1. NpcManager – создаёт NPC, реагирует в случае смерти NPC. 2. PlayersManager – отвечает за вход игроков в мир. 3. PetsManager – управляет питомцами (аналогично NPC, но с привязкой к игроку). 4. EntitiesManager – главный координатор: o Управляет NpcManager и PlayersManager. o Обрабатывает взаимодействия (например, если игрок подошёл к NPC, оба получают информацию друг о друге). 5. VisibilityManager – отвечает за видимость объектов: o Определяет, кто кого видит. o Периодически обновляет списки видимости для оптимизации. 6. MovingManager – обновляет позиции всех подвижных объектов в мире.
Зачем это нужно? Такая система позволяет: • Эффективно управлять сотнями сущностей. • Оптимизировать обновление состояний (движение, видимость, атака). • Гибко добавлять новые типы объектов (монстры, питомцы, NPC-торговцы).
Смотри, индустрия хостинга давно сгнила изнутри. Тут всё построено не на сервисе, а на выжимании: продай домен, дожми на апгрейд, подними цену через год. Мы решили, что пора это хоронить. Поэтому сделали WebHostMost. Не чтобы “откусить долю рынка”, а чтобы не блевать каждый раз, когда ищешь нормальный веб хостинг.
Мы не дешевле всех. Мы честнее всех
Наша цена - это не “3$ в первый месяц, 9$ потом, и 17$ с третьего, если ты не заметил”. У нас цена, которую ты видишь - остаётся навсегда, даже если купил со скидкой. Фикс. Всегда. Без писем с сюрпризами.
Сайт грузится за полсекунды - это норма, а не тюнинг
LiteSpeed Enterprise (а не бесплатный OpenLiteSpeed)
Redis, HTTP/3, Brotli, Keep-Alive, APC Cache
NVMe-диски
Процессоры Ryzen EPYC
Инфраструктура, где реально есть защита от DDoS, Imunify360 и мониторинг 24/7
Пока другие строят “скорость” через прокси и заклинания, у нас она встроена в основу.
Бесплатный хостинг - без рекламы, боли и подвохов
Да, у нас есть реальный бесплатный тариф. - Без баннеров. - Без вымогательства “перейдите на PRO, чтобы не лагало”. - С LiteSpeed, защитой, A+ заголовками и даже поддержкой.
Бесплатный хостинг - не значит ущербный. Это вход в нормальную экосистему, не маркетинговый мусор.
А теперь то, что конкуренты продают отдельно - у нас просто включено
A+ по Security Headers - проверено через securityheaders.com (На секундочку, НИ ОДИН хостинг во всем мире не предоставляет такую защиту сразу "из коробки". А у нас это просто есть. Для всех, даже на бесплатном тарифе).
Поддержка всех стеков: WordPress, Node.js, Python, PHP, Laravel, Symfony, PostgreSQL, MongoDB, MariaDB и даже Perl
Настоящая админка - DirectAdmin с кастомом. Никакого cPanel с интерфейсом 2007 года
Встроенная почта, Cron, SSH, Web терминал, email-алиасы
Telegram-чат - где отвечают не “менеджеры по клиентскому счастью”, а девопсы, саппорты, дизайнер и даже директор
И да, индустрия нас пока что ненавидит. Потому что:
Мы не делаем апсейл на функции, которые должны быть базой
Мы не ограничиваем пользователей, как shared-хостинги образца 2014
Мы не прячемся за чат-ботами, а реально сидим в комментах
Кстати, вот вам немного сравнений с GTMetrix и SecurityHeaders рандомного UK сайта, который хостится на любом другом хостинге (в этом примере на SiteGround) и на нашем:
SiteGround:
SiteGround SecurityHeaders be like
SiteGround GTMetrix be like
WebHostMost:
WebHostMost SecurityHeaders be like
WebHostMost GTMetrix be like
И да, нас можно пнуть, задать неудобный вопрос и даже “о ужас” - поспорить с нами. Но мы ответим. Мы рядом. Мы - WHM Crew.
Помните как мы бегали по горам и не придавали значение тому как быстро спускались или поднимались на них?
Как мы знаем в реальной жизни перемещаясь на плоскости горизонтальная скорость у нас постоянная. Как только мы начинаем преодолевать горы и другие неровности то горизонтальная скорость у нас будет меньше. Но не в мире Lineage 2 где горизонтальная скорость всегда постоянная и нее зависит от неровностей. Связанно это с тем чтобы было проще синхронизировать персонажа на сервере и клиенте. Ведь на сервере нет точной модели мира, а лишь примерное очертание называемое geodata. А из-за того, что geodata приблизительно повторяет ландшафт клиента то было бы невозможно синхронизировать персонажа по Z оси. Поэтому синхронизация идет только по X и Y оси.
Видео:
1) Горизонтальная скорость на плоскости постоянная.
2) Как было бы в жизни. Взбираясь на гору горизонтальная скорость падает.
3) Как сделано в игре. Горизонтальная скорость постоянная.
4) Демонстрация из игры. Бежит словно нет никаких гор.
Тестирую синхронизацию объектов на перемещение и атаку между NPC и игроком и немного намусорил. Дроп, который падает, показывает текущее местоположение объекта на стороне сервера. Каждый n-ный тик происходит синхронизация.
Я разрабатываю эмулятор сервера для Lineage 2 Chronicle 1: Harbingers of war на Node.js.
Столкнулся с проблемой синхронизации скорости персонажа на сервере с клиентом. Когда в игре вы нажимаете мышкой в то место, куда хотите перейти то происходит плавный переход с анимацией движения. На сервере в этот момент тоже происходит движение по таймеру, но не такое плавное.
C(client) – двигается плавно из одной точки в другую. S(server) – делает прирост координат по таймеру.
Для примера я взял сборку написанную на java l2j-lisvus Сборок много. Но все они являются fork’ами проекта l2jserver https://l2jserver.com/И многое наследуется. В том числе и передвижение персонажа.
В l2j-lisvus, как и во всех сборках l2jserver перемещение персонажа на сервере идет при помощи таймера с приростом одинаковых значений.
Проблема проявляется, когда нам надо сделать какое-то действие после того, как персонаж добежал до пункта назначения. Например, нанести удар по NPC.
На коротких расстояниях проблема незаметна. Нога наступает точно в монету.
На длинных расстояниях действие атака начинается раньше, чем персонаж добегает до цели.
А если выкрутить скорость на максимум (900) то проблема расхождения очевидна. Это связанно с тем, что помимо скорости бега есть скорость ходьбы.
Как работает передвижение персонажа на сервере.
За основу взяты базовые характеристики персонажа. Скорость бега 126.
126 — это количество внутренних unit’ов за секунду.
На данной схеме идет прирост координат персонажа каждые 1000мс на 126 unit’ов. Исходя из схемы выше пример кода для действий персонажем после достижения пункта назначения:
// Прироста координат нет. Просто считаем когда персонаж дойдет до конечных координат. const distance = 1500; const playerSpeed = 126; const ticks = distance / playerSpeed; // 11.90 const time = ticks * 1000; // 11900mc
setTimeout(() => { // действие персонажа после бега }, time);
На коротких расстояниях.
На длинных расстояниях.
Расхождения на коротких расстояниях.
Расхождения на длинных расстояниях.
Зеленой зоной показана точка куда должна ступить нога персонажа если бы не было расхождений.
Рост скорости при развитии персонажа.
126 — это базовая скорость. И по мере развития персонажа будет расти и скорость передвижения. А значит расхождение будет больше. Но перед тем, как создать формулу надо подтвердить теорию, что скорость ходьбы влияет на расхождение.
Данные о характеристиках персонажа передаются от сервера к клиенту.
Выставляю значения walkSpeed: 126. Если скорость ходьбы будет равна скорости бега, то расхождения должны пропасть.
Нога персонажа достигает правильной конечной точки.
Персонаж синхронизирован и начинает атаку вовремя. Теперь надо понять, как скорость ходьбы влияет на расхождения между клиентом и сервером.
Сколько же персонаж успевает пройти перед тем, как начинает бежать?
Надо поймать момент когда ходьба переходит в бег. Для этого передадим в клиент данные, где скорость ходьбы будет больше скорости бега. Из-за этой разницы будет виден переход и можно будет рассчитать пройденное расстояние при ходьбе.
runSpeed: 10
walkSpeed: 600
Ходьба быстрее бега.
При скорости шага в 600 персонаж успевает пройти 250, прежде чем начинает бежать.
600 / 250 = 2.4
700 / 291 = 2.4
800 / 333 = 2.4
Из этого вывод, что персонаж перед тем, как начать бежать успевает пройти расстояние в 2.4 раза меньше, чем его скорость ходьбы.
Значит при скорости ходьбы 88 персонаж пройдет 36 unit’ов.
88 / 2.4 = 36
Первое деление — это начало движения (ходьба) а следующие деления — это бег.
AppWrite, SupaBase, Directus, Strapi - не понравились
AppWrite
Есть всё, кроме массового импорта. Мощнейшая вещь.
Но настройка его сложна для новичка, и жрет о 2-4гб оперативки на сервере.
SupaBase
Крутая штука, не допёр как сделать авторизацию 🤣
И тоже с настройкой были траблы.
Плюс мне не нравится HTTP Basic Авторизация по захардкоженным credentials в конфиге прокси сервера.
За то импорт и экспорт нормальный есть
Directus
Очень крутая штука, особенно его Flows.
Стал сильно продуманнее за прошедшие полгода с моей встречи с ним.
Но все так же документация меня вымораживает. Много не раскрытых тем, и скрытых, не упомянутых ограничений.
Например условная нода логики в тех же Flow - не поддерживает тупую проверку входных данных на их наличие... Не уверен что мне когда-либо понравится это. И так же во flows много других ограничений, хотя задумка улетная.
В остальном это комбайн для супер быстрого старта, толком даже без настроек, всё мышкой можно сделать.
Ограничения так же можно обойти, сделав простое расширение, я так пол логики в прошлом проекте сделал, но теряется весь шарм легкости и наглядности. 🥲
Думаю ребята в нужном направлении двигаются, и их время просто ещё не настало, держу звезду на гитзабе за них.
Strapi
HeadlessCMS, да. Крутая, да. Популярная? А вот хз-хз.
Вроде раньше много где встречал про неё статьи, и на гитхабе звезд куча насыпано.
НО КАК? Как может не быть у такой популярной CMS функционала для импорта/экспорта, хотя бы банального!?
Он справделивости ради есть в официальном маркете расширений, но... На прошлую версию 😖 Не без обратной совместимости 😩
Ну я его тоже оставил откисать.
FilamentPHP
Тяжелая артилерия из TALL Stack компонентов и не то что целой системы, а уже целой ЭКОсистемы для любого рода панелей, да еще и на базе Laravel 😤
Ну это козырь был.
Я пытался, честно, вот даже описал что меня останавило, и на каждый из вариантов я потратил минимум 4 часа времени.
Думал ребята допили свои проекты, обещающие супер быстрый старт, но везде какие-то проблемы...
В итоге я все же снова взял в работу этот стэк для бэка. Нельзя на нем не сделать бэк. Ну нет ограничений, сколько бы я не придумывал.
Меня просто удивляет продуманность этого Filament. Баги есть, не без них, конечно. Как оказалось без ошибок ни то, что люди, роботы не справятся 🙃 (Отсылка к нейросетям)
Тут я за пару дней уложился извернуться и не сорвать сроки, а сделано:
Админка
Бизнес логика
Token Based Авторизация по API (пришлось потратить полдня, чтобы разобраться в этой теме, так как я её намеренно игнорировал последние 3 года)
API c аутентификацией по токену
Расширение для хрома на WXT + React (TanStack Router, Query, Store)
Для расширения хромовского - я вообще только с WXT работал и голым React, чисто для верстки.
К сожалению - опять не пригодился Background скрипт, так что всё ещё познать вполне не удастся разработку расширений...
Но с TanStack я не работал. Как-то раз для крипто проекта пытался его настроить и за целый день - так и не вышло. Сейчас же скажу - это мастхэв! Очень крутая штука!
Ну и отказался от Tailwind и SCSS в пользу CSS Modules в паре с clsx. И я не сказал бы, что стили писать долго. В моем случае я заказы беру вообще без дизайна и предпочтений, так что 50-80% от них пишет нейросеть, а я просто не претендую на произведение искусства 😆
Кто работал с этими комбайнами, опишите свой опыт, мб я чего не догоняю... Конкретно с AppWrite - разбираться не стал в силу ограничения по срокам, а supabase по инерции последним выбыл.
Я один не понимаю нахера в принципе нужны платные курсы?
С тех самых пор, когда в народные массы попал стереотип о программистах: нажимают кнопки на клавиатуре, пьют кофе и получают много денег, возник огромный спрос — я тоже так хочу!
И вот вот этот спрос стали заполнять ПЛАТНЫМИ курсами.