5-слойный щит.
Привет. Я продолжаю разрабатывать сервер для Lineage 2 C1 на JavaScript Проект

Работая с предметами, создал фичу — многослойный щит 😂
Блог про разработку сервера для Lineage 2 в телеге https://t.me/lineage2js
Привет. Я продолжаю разрабатывать сервер для Lineage 2 C1 на JavaScript Проект
Работая с предметами, создал фичу — многослойный щит 😂
Блог про разработку сервера для Lineage 2 в телеге https://t.me/lineage2js
Привет. Я продолжаю разрабатывать сервер для Lineage 2 C1 на JavaScript Проект
Продолжая работать над скилами, заметил, что некоторые атакующие скилы можно направить на себя.
Блог про разработку сервера для Lineage 2 в телеге https://t.me/lineage2js
Привет. Я продолжаю разрабатывать сервер для Lineage 2 C1 на JavaScript Проект
В первом же квесте Fighter's Tutorial (даёт SP и карту мира) столкнулся с любопытным моментом. Охота на внешне одинаковых NPC, но на деле разных!
Речь пойдет только о квесте для людей на острове Talking Island Village.
В чём подвох?
В мире Lineage есть два NPC с одинаковым именем - Bearded Keltir.
Внутри сервера это разные NPC: ID 12082(tuto_keltir) и ID 481(keltir).
По квесту Fighter's Tutorial надо добыть Keltir Fang.
Убивайте Bearded Keltir, пока не получите Keltir Fang x4.
Как различать Bearded Keltir?
У этих NPC есть несколько зон spawn'a. Некоторые зоны пересекаются и в одной зоне могут находиться разные Bearded Keltir.
Так например если вы решите проходить квест возле Talking Island Village то вот на что надо обратить внимание:
* Keltir Fang падает с шансом в 100%. Если не упал, то вы убили не того NPC.
* С нужного Bearded Keltir не падает дроп. Дроп у ID 12082(tuto_keltir) отсутствует.
Вывод
Лучше всего проходить квест возле Cedric's Training Hall так как там одна из зон появления Bearded Keltir они же ID 12082(tuto_keltir).
Блог про разработку сервера для Lineage 2 в телеге https://t.me/lineage2js
Привет. Я продолжаю разрабатывать сервер для Lineage 2 C1 на JavaScript Проект
При добавлении SoulShot функционала не добавил проверку не только на наличие оружия, но и кто атакует — игрок или NPC. Как итог теперь все атакуют с помощью SoulShot.
Блог про разработку сервера для Lineage 2 в телеге https://t.me/lineage2js
Привет. Я продолжаю разрабатывать сервер для Lineage 2 C1 на JavaScript Проект
Копаясь в серверных файлах наткнулся на пасхалку.
На острове Talking Island Village в храме Einhasad есть два NPC, которые стоят рядом друг с другом и имеют имена Harrys и Petron.
У каждого NPC на сервере есть цифровой ID и текстовый ID.
Так, например, для Harrys(ID 7035) его текстовый ID - Harry, а для Petron(ID 7036) - Potter
Таким образом, если сложить их ID, получится - Harry Potter
npc_beginguild_coach7035[harry]level=70...npc_end
npc_begin
guild_coach
7036
[potter]
level=70
...
npc_end
Блог про разработку сервера для Lineage 2 в телеге https://t.me/lineage2js
Привет. Я продолжаю разрабатывать сервер для Lineage 2 C1 на JavaScript Проект
Хорошие новости: Теперь сервер не грузит всех NPC подряд, а только тех, кто рядом с игроком. Это значит:
* Меньше лагов – сервер не тратит силы на то, что далеко от игрока.
* Плавнее игра – особенно в городах и массовых сражениях.
* Стабильнее мир – больше NPC вокруг, но без нагрузки на клиент.
Как работает VisibilityManager?
Представьте радар на подлодке – он сканирует пространство вокруг и засекает только то, что действительно рядом.
* Каждые 3 секунды система проверяет, какие NPC или игроки находятся в зоне видимости.
* Неважно, кто к кому подходит – хоть игрок к мобу, хоть моб к игроку, если он в радиусе, сервер его "увидит" и сообщит игроку.
* Всё лишнее – выгружается – зачем держать в памяти то, что далеко и не влияет на игру?
Итог:
* Меньше тормозов – клиент не грузит 3D-модели тех NPC, которых игрок не видит.
* Экономия трафика – сервер не отправляет игроку данные о мобах на другом конце карты.
Блог про разработку сервера для Lineage 2 в телеге https://t.me/lineage2js
У проекта появилась чёткая архитектура управления сущностями. Теперь 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-торговцы).
Блог про разработку сервера для Lineage 2 в телеге https://t.me/lineage2js
Помните как мы бегали по горам и не придавали значение тому как быстро спускались или поднимались на них?
Как мы знаем в реальной жизни перемещаясь на плоскости горизонтальная скорость у нас постоянная. Как только мы начинаем преодолевать горы и другие неровности то горизонтальная скорость у нас будет меньше. Но не в мире Lineage 2 где горизонтальная скорость всегда постоянная и нее зависит от неровностей. Связанно это с тем чтобы было проще синхронизировать персонажа на сервере и клиенте. Ведь на сервере нет точной модели мира, а лишь примерное очертание называемое geodata. А из-за того, что geodata приблизительно повторяет ландшафт клиента то было бы невозможно синхронизировать персонажа по Z оси. Поэтому синхронизация идет только по X и Y оси.
Видео:
1) Горизонтальная скорость на плоскости постоянная.
2) Как было бы в жизни. Взбираясь на гору горизонтальная скорость падает.
3) Как сделано в игре. Горизонтальная скорость постоянная.
4) Демонстрация из игры. Бежит словно нет никаких гор.
Блог про разработку сервера для Lineage 2 в телеге https://t.me/lineage2js
Привет.
Я разрабатываю эмулятор сервера для Lineage 2 Chronicle 1: Harbingers of war на Node.js.
Столкнулся с проблемой синхронизации скорости персонажа на сервере с клиентом. Когда в игре вы нажимаете мышкой в то место, куда хотите перейти то происходит плавный переход с анимацией движения. На сервере в этот момент тоже происходит движение по таймеру, но не такое плавное.
Для примера я взял сборку написанную на java l2j-lisvus Сборок много. Но все они являются fork’ами проекта l2jserver https://l2jserver.com/И многое наследуется. В том числе и передвижение персонажа.
В l2j-lisvus, как и во всех сборках l2jserver перемещение персонажа на сервере идет при помощи таймера с приростом одинаковых значений.
Проблема проявляется, когда нам надо сделать какое-то действие после того, как персонаж добежал до пункта назначения. Например, нанести удар по NPC.
Как работает передвижение персонажа на сервере.
За основу взяты базовые характеристики персонажа. Скорость бега 126.
На данной схеме идет прирост координат персонажа каждые 1000мс на 126 unit’ов. Исходя из схемы выше пример кода для действий персонажем после достижения пункта назначения:
// Прироста координат нет. Просто считаем когда персонаж дойдет до конечных координат.
const distance = 1500;
const playerSpeed = 126;
const ticks = distance / playerSpeed; // 11.90
const time = ticks * 1000; // 11900mc
setTimeout(() => {
// действие персонажа после бега
}, time);
Зеленой зоной показана точка куда должна ступить нога персонажа если бы не было расхождений.
Рост скорости при развитии персонажа.
126 — это базовая скорость. И по мере развития персонажа будет расти и скорость передвижения. А значит расхождение будет больше. Но перед тем, как создать формулу надо подтвердить теорию, что скорость ходьбы влияет на расхождение.
Данные о характеристиках персонажа передаются от сервера к клиенту.
Пакет UserInfo.js 83 строчка.
writeD(player.runSpeed);
writeD(player.walkSpeed);
Базовые значения:
runSpeed: 126
walkSpeed: 88
Выставляю значения 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
Решение
Формула для расчета времени:
сколько_прошли_на_старте = скорость_ходьбы / 2.4
(((дистанция_между_нпц_и_игроком - сколько_прошли_на_старте) / скорость_бега) * 1000мс) + время_которое_прошли
Для примера дистанция 1500.
Из них мы 36 прошли.
1500 - 36 = 1464 расстояние для бега.
Скорость бега 126 в секунду.
1464 / 126 = 11.61 (количество отрезков, которое мы пройдем за секунду).
11.61 * 1000 = 11610мс бега.
к 11610 надо прибавить время ходьбы
Скорость ходьбы 88 в секунду.
1000 / 88 = 11.36мс за 1 unit
36 unit * 11.36мс = 408мс
11610 + 408 = 12018мс
12018мс является точным временем от начала старта и до конца.
Сравниваем со старым временем 11900мс. Разница в 118мс.
setTimeout(() => {
player.attack(npc);
}, 12018);
Как видно выше разница положения ног при разных скоростях отсутствует, а значит решение работает.
Ссылка на проект: https://github.com/lineage2js
Ссылка на блог: https://t.me/lineage2js
Привет.
Занимаюсь разработкой сервера для Lineage 2 C1 на JavaScript(Node.js). Копался в клиенте игры и решил сделать перебор всего оружия для теста.
Ссылка на проект: https://github.com/lineage2js
Ссылка на блог: https://t.me/lineage2js
Привет!
В рамках наполнения сообщества запилю-ка пост. Подписчики, извините, это не про мотоциклы =)
Окей, кто играл в ла2? Вы играли в ла2, я играл в ла2. Но я - не только играл. Так вышло, что несколько лет я был модератором проекта, чьё название есть в теме поста. Поэтому игру мне довелось узнать и с технической стороны, придумывать эвенты, находить для них модели и иконки, тестировать (хоть я и не занимался программированием, мы прорабатывали механики), ловить за руку багоюзеров, слушать про взятки, слушать как "игрок ХХХ это админ!" или "да у меня брат админ", стоя и уссываясь рядом в инвизе. Много было всего, как и у многих игроков в общем-то.
У меня сохранились некоторые материалы с сервера, ну и воспоминания, конечно же. Поэтому для активности в сообществе я бы хотел, чтобы пост прошёл в формате "открытого микрофона". Это 2008-2012 года, никаких секретов с тех пор не осталось. Поэтому если вы хотели задать вопрос ГМу фришарда, любой, например:
как выглядит админка
сколько вы зарабатывали
что может ГМ
как устроен сервер внутри
И прочие любые вопросы о жизни со стороны админов сервера ла2 - задавайте, отвечу. Скриншотов больше чем влезает в лимит поста, но нам пока хватит и этого. Почти на каждом скрине есть что-то нестандартное, уникальное для сервера или недоступное обычным игрокам.
Спрашивайте, отвечу что знаю и помню!