HLFX.Ru Forum
Показать все 34 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Наши проекты (https://hlfx.ru/forum/forumdisplay.php?forumid=1)
-- NodeMod - скриптинг на NodeJS (https://hlfx.ru/forum/showthread.php?threadid=5855)


Отправлено TheEVolk 07-07-2022 в 21:07:

NodeMod - скриптинг на NodeJS

Идейный наследник некогда разрабатываемого мною проекта luamod.

NodeMod - это плагин для MetaMod, с помощью которого кодер может разрабатывать скриптовую часть своего сервера на основе платформы NodeJS.

Как это работает?
nodemod подключается к metamod как обычный плагин, внутри библиотеки содержится скомпилированный движок V8 и NodeJS V16 под архитектуру 32x, сразу при запуске плагина загружается файл index.js, внутри которого уже можно сразу подгружать нужные модули или вызывать нужные функции.

nodemod не знает что такое плагины, архитектуру проекта контроллирует кодер проекта. Однако, плагином можно считать пакет, выполняющий определенную функциональность и который можно настраивать.

Примеры стандартных плагинов:
@hnodemod/msg - отлов событий и их отправка (message_begin/message_end)
@hnodemod/cmd - простой командный процессор (команды из чата/команды в консоли)

Почему NodeJS вместо чистого JS?
NodeJS как платформа содержит огромное количество готовых модулей, вы можете скачать любой пакет из npm и он будет гарантировано работать с nodemod.

Как оно компилируется?
С помощью cmake, только перед сборкой запускается скрипт на JS, который создает все биндинги автоматически. То есть читает eiface.h и создает функции и евенты.

Что дальше?
А дальше я буду нарабатывать стандартные пакеты, публиковать их, рефакторить код. Из планов демка с миникартой в реальном времени, бот с привязкой аккаунта, кастом ентити/оружия/монстры.

А можно без metamod?
Я надеюсь, что придет время и для этого. Более того, я хочу, чтобы этот плагин позволял кодерам программировать сущности для своих одиночных играх с помощью JS, это значительно упрощает процесс разработки и ускоряет его.

Добавлено 08-07-2022 в 05:07:

Начало темы без всего, даже ссылок на попробовать не оставил, сейчас исправлю.

https://github.com/TheEVolk/xash3d-nodemod
Это репозиторий, не рефакторенный, без семплов. На скриншоте - пример BlueFade плагина.

Все функции движка в nodemod.eng, а дллки будет в nodemon.dll, но еще не прокидывал, занимаюсь этим, завтра будет.

Сразу оформлю репозиторий весь по красоте и можно будет развивать сообщество.

Пока что в этой теме я делюсь неким девблогом и показываю что оно умеет.


Оформил инструкцию по компиляции и залил примеры плагинов на гитхаб.
https://github.com/TheEVolk/xash3d-nodemod

__________________
exit();


Отправлено SNMetamorph 07-07-2022 в 22:59:

За проектом буду следить. Предлагаю разрабатывать это сразу кроссплатформенным решением, как минимум, кроме 32-бита нужно еще иметь 64-бита, т.к. ксаш может быть в обоих вариантах. Ну и на разных платформах, опять таки. Вот сервера ксашевские в основном хостятся на линуксе.

__________________
PrimeXT
GoldSrc Monitor
SMD Splitter
mdl-flip (gFlip analog)
Xash3D Modding Discord


Отправлено TheEVolk 08-07-2022 в 05:59:

Цитата:
SNMetamorph писал:
За проектом буду следить. Предлагаю разрабатывать это сразу кроссплатформенным решением, как минимум, кроме 32-бита нужно еще иметь 64-бита, т.к. ксаш может быть в обоих вариантах. Ну и на разных платформах, опять таки. Вот сервера ксашевские в основном хостятся на линуксе.



Цитата:
SNMetamorph писал:
За проектом буду следить. Предлагаю разрабатывать это сразу кроссплатформенным решением, как минимум, кроме 32-бита нужно еще иметь 64-бита, т.к. ксаш может быть в обоих вариантах. Ну и на разных платформах, опять таки. Вот сервера ксашевские в основном хостятся на линуксе.


В теории это возможно, а на практике нужны 64х бинарники скомпиленные. В защиту этого решения могу сказать, что такие бинарники есть. Ну и настроить это дело через travis какой-нибудь.

__________________
exit();


Отправлено SNMetamorph 08-07-2022 в 21:45:

И да, еще интересует финальная версия LuaMod: что в ней готово, где можно скачать, что не готово?

__________________
PrimeXT
GoldSrc Monitor
SMD Splitter
mdl-flip (gFlip analog)
Xash3D Modding Discord


Отправлено TheEVolk 09-07-2022 в 01:44:

Цитата:
SNMetamorph писал:
И да, еще интересует финальная версия LuaMod: что в ней готово, где можно скачать, что не готово?


Самая новая версия имела таймеры, то есть set_timeout и set_interval. Были запросы в сеть и, похоже, все. Ну были там движковые функции переписаны, плагин msg переписан, потому что были ошибки и он не работал вне xash. Мы так с другом перекатились в CS 1.6 и делали подобие csdm. Был плагин на звуки при определенных фразах в чате, rampage sounds был, вроде все, не густо.

Естественно это все было утеряно, сейчас самое новое - https://github.com/Elektro-Volk/luamod и архив с экстрафайлами из темы про luamod.

Но, есть еще вот такой форк: https://github.com/Workbench-Team/luamod
Мы с ним иногда расходились во мнениях по архитектуре, насколько мне известно он под каждый плагин отдельную вм выделял, мне это не нравилось, но, судя по всему, активность у него выше и развивал он этот плагин всегда.

Вот такая вот история.

__________________
exit();


Отправлено TheEVolk 09-07-2022 в 17:10:

Вот сегодня работал над ООП entity. По сути я хочу обернуть движковый edict и entvars в один JS объект с геттерами и сеттерами.

Тогда будем иметь следующий синтаксис:
const player = /* Как-нибудь достаем его, хоть через pEntOfEntIndex(0) */;
player.health++;
player.health *= 2;
// И так далее.

Добавлено 10-07-2022 в 01:10:

У меня получилось, геттер и сеттер здоровья готовы, значит могу сделать остальные "важные" поля, включая проброс строк. С последними, мне придется обращаться к движку, чтобы он давал строку по ID и тому подобное, но это не сложно.

__________________
exit();


Отправлено TheEVolk 10-07-2022 в 08:14:

День начался с того, что я сделал аналог hamsandwith. Вы можете перехватывать все сообщения и изменять их значения.

code:
import nodemodCore from '../repo/packages/core/src/index.js'; nodemodCore.msg.on('DeathMsg', state => { console.log(state.rawData); // Поменяем killerId на 1, теперь убийцей всегда будет первый игрок. state.rawData[0].value = 1; });


rawData - это тот же объект, что и data при отправке сообщения. Так я реализую вечером плагин stacionaryFragCounter, а затем залью все демо плагины и сделаю инструкцию, чтобы Вы могли попробовать этот плагин у себя.

Вот как работает этот механизм:
1) Этот аналог ловит событие pfnMessageBegin, для которого создает state и записывает туда все параметры.
2) Затем он ловит все сообщения "write", но отклоняет их, только записывая значения в state.
3) Сразу после вызова pfnMessageEnd и вызова слушателя, который видно в коде, мой ham быстро пишет все значения в движок. Если они изменились на этапе вызова слушателя, то запишутся, соответственно, измененные значения.

Также все @hnodemod/msg или @hnodemod/cmd я решил соединить в @nodemod/core. Это будет набор всех вспомогательных функций для работы с игрой.

Сделал геттеры origin и их же сеттеры. Работаем дальше.

__________________
exit();


Отправлено SNMetamorph 10-07-2022 в 15:01:

Цитата:
TheEVolk писал:
День начался с того, что я сделал аналог hamsandwith. Вы можете перехватывать все сообщения и изменять их значения.

code:
import nodemodCore from '../repo/packages/core/src/index.js'; nodemodCore.msg.on('DeathMsg', state => { console.log(state.rawData); // Поменяем killerId на 1, теперь убийцей всегда будет первый игрок. state.rawData[0].value = 1; });


rawData - это тот же объект, что и data при отправке сообщения. Так я реализую вечером плагин stacionaryFragCounter, а затем залью все демо плагины и сделаю инструкцию, чтобы Вы могли попробовать этот плагин у себя.

Вот как работает этот механизм:
1) Этот аналог ловит событие pfnMessageBegin, для которого создает state и записывает туда все параметры.
2) Затем он ловит все сообщения "write", но отклоняет их, только записывая значения в state.
3) Сразу после вызова pfnMessageEnd и вызова слушателя, который видно в коде, мой ham быстро пишет все значения в движок. Если они изменились на этапе вызова слушателя, то запишутся, соответственно, измененные значения.

Также все @hnodemod/msg или @hnodemod/cmd я решил соединить в @nodemod/core. Это будет набор всех вспомогательных функций для работы с игрой.

Сделал геттеры origin и их же сеттеры. Работаем дальше.

Так Hamsandwich же не про перехват сообщений, а про перехват виртуальных функций у классов.

__________________
PrimeXT
GoldSrc Monitor
SMD Splitter
mdl-flip (gFlip analog)
Xash3D Modding Discord


Отправлено TheEVolk 11-07-2022 в 07:12:

Цитата:
SNMetamorph писал:
Так Hamsandwich же не про перехват сообщений, а про перехват виртуальных функций у классов.

Про перехват, как раз.

Оформил инструкцию по компиляции и залил примеры плагинов на гитхаб.
https://github.com/TheEVolk/xash3d-nodemod

PS. Модераторы, закрепите ссылку в начале темы.

Ну и кто может попробовать, у кого получилось, скажете как оно?

__________________
exit();


Отправлено Дядя Миша 11-07-2022 в 09:07:

Закрепил

Добавлено 11-07-2022 в 12:07:

Цитата:

ads.push(
'ляляля1',
'Дядя Миша лучший'
);

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено TheEVolk 11-07-2022 в 10:28:

Цитата:
Дядя Миша писал:


Это значит, что нужно попробовать запустить у себя.

__________________
exit();


Отправлено TheEVolk 12-07-2022 в 07:51:

Обновил плагин, хоть версию и не менял:
- Сделал эвент pfnClientCommand и соответствующий обработчик в JS
- Залил все ассеты медиа
- Сделал плагин вампиризм (при убийстве оппонента вы получаете немного здоровья)
- Сделал возможность выводить в HUD сообщения с настройками, с помощью tempentity
- Сделал плагин для приветствия игроков, как это любят на кс пабликах
- убрал зависимости для скриптов автосборки
- Благодаря SNMetamorph hlsdk и metamod идут теперь в папке deps, хотя metamod мне пришлось подобрать иной.

Да, план у меня такой, я реализовываю самые популярные плагины из amx и по ходу дорабатываю движок. На очереди:
- подсчет фрагов с танков (башни в crossfire)
- показ нанесенного дамага
- ротация карт

__________________
exit();


Отправлено SNMetamorph 12-07-2022 в 08:55:

Цитата:
TheEVolk писал:
Благодаря SNMetamorph hlsdk и metamod идут теперь в папке deps, хотя metamod мне пришлось подобрать иной.

Так ты зачем сабмодуль то удалил? Верни обратно

__________________
PrimeXT
GoldSrc Monitor
SMD Splitter
mdl-flip (gFlip analog)
Xash3D Modding Discord


Отправлено TheEVolk 12-07-2022 в 08:57:

Цитата:
SNMetamorph писал:
Так ты зачем сабмодуль то удалил? Верни обратно

Я его просто скопировал, там файлов 5 от силы, хедеров.

__________________
exit();


Отправлено TheEVolk 13-07-2022 в 05:14:

Удалось запустить nodemod в ГС:
- precache пришлось запускать строго в dllSpawn
- fastdl переделать, но он у меня все-равно не заработал в rehlds, хотя в браузере все качает нормально.

Коммит залил, все плагины работают, звуки работают. rehlds показался чуть стабильнее в игре, стрельба точнее, но вот клиент GS мне не понравился. По дефолту выкручена гамма и яркость и крайне непривычное ощущение.

__________________
exit();


Отправлено TheEVolk 14-07-2022 в 03:31:

ShowMenu

Сделал генератор менюшек, в максимально простом и декларативном стиле.

code:
nodemodCore.menu.show({ entity, title: 'Main menu', items: [ { name: 'Commands', handler: entity => this.openFastCommands(entity) }, { name: 'Profile', handler: entity => this.openProfile(entity) }, { name: 'Current game', handler: entity => this.openCurrentGame(entity) }, { name: 'About us', handler: entity => this.openServerInfo(entity) } ] });


Полный пример в serverMenu.js
Из планов нужно добавить к ним цвета и узнать почему у меня кириллица не заработала. Либо у меня клиент HL из под wine так глючит, либо кодировка между JS и C++, либо вообще нет там такого.

Ну и доработать общие менюшки, буду юзать в плагине голосований (и ротации карт).

__________________
exit();


Отправлено Ku2zoff 14-07-2022 в 07:40:

Цитата:
TheEVolk писал:
узнать почему у меня кириллица не заработала

Если ты рисуешь меню через стандартные сообщения худа: message.cpp и DrawHudString, то там проблемы с кодировкой даже у titles.txt: https://hlfx.ru/forum/showthread.ph...1888#post201888


Отправлено TheEVolk 14-07-2022 в 08:04:

Цитата:
Ku2zoff писал:
стандартные сообщения

А разве есть иные?

__________________
exit();


Отправлено Ku2zoff 14-07-2022 в 08:07:

TheEVolk ну так ты проверь, выводится ли у тебя кириллица из titles.txt. Если нет - то, виноват не ты и

Цитата:
TheEVolk писал:
кодировка между JS и C++

не глючит.


Отправлено TheEVolk 10-08-2023 в 10:16:

А вот и bad apple в hl с использованием nodemod.
https://www.youtube.com/watch?v=tlQMMH7oJSU

Спавнил партиклы в 5 фпс

__________________
exit();


Отправлено TheEVolk 11-08-2023 в 14:23:

создал ентитю:
const ent = createNamedEntity('info_target');

заспавнил
nodemod.dll.spawn(ent);

// прописал имя
ent.classname = 'func_casino';

// и модель
ent.model = 'models/terminal.mdl';
// прописал физическое поведение
ent.solid = 2; // SOLID_BBOX
ent.movetype = 5; // MOVETYPE_FLY

// и выставил размеры коллизии
nodemod.eng.setSize(ent, [-50, -50, -50], [50, 50, 60]);

либо я что-то не понимаю или это какая-то ошибка, но сущность полностью прозрачная для игрока. Я вижу лишь модель, сквозь которую я могу пройти. При этом срабатывает touch (в котором я чекаю нажатие E) и оно работает. Есть ли в оригинальном goldsource возможность прочекать все abs боксы? В чем может быть проблема?

__________________
exit();


Отправлено TheEVolk 12-08-2023 в 17:23:

вот еще пример плагина https://youtu.be/DIY5Tv4_xRE
с энтитей решил, setSize сбрасывал solid в ноль. Поменял местами и стало лучше.

Все npm пакеты настроил чтоб они публиковались в npm.

__________________
exit();


Отправлено TheEVolk 13-08-2023 в 13:33:

https://www.youtube.com/watch?v=EyxTZK1vPC4
я запустил doom 1 в half-life 1, вывел хоть какое-то изображение и даже обрабатываю нажатия клавиш. На этом интернет можно закрывать.

__________________
exit();


Отправлено Дядя Миша 13-08-2023 в 14:19:

Для мельтешения партиклей дуум запускать необязательно.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено TheEVolk 13-08-2023 в 14:56:

> Для мельтешения партиклей дуум запускать необязательно.

а это и не партикли..
Но единственный способ что-то цветное отрисовать в хл, и то часть верхних энтитей решила не обновлять цвет. По крайней мере это из разряда:
- смотри что оно умеет.

__________________
exit();


Отправлено Дядя Миша 13-08-2023 в 17:12:

А практическая польза? Там же не разобрать ничего.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено XaeroX 13-08-2023 в 17:23:

TheEVolk
А что это за игра в видеоролике?

__________________

xaerox on Vivino


Отправлено TheEVolk 13-08-2023 в 18:46:

Цитата:
Дядя Миша писал:
А практическая польза? Там же не разобрать ничего.


Потому что это возможно

Цитата:
XaeroX писал:
А что это за игра в видеоролике?


dead by daylight

__________________
exit();


Отправлено Дядя Миша 13-08-2023 в 18:56:

Цитата:
TheEVolk писал:
Потому что это возможно

Возможно != нужно.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено TheEVolk 15-08-2023 в 12:37:

Цитата:
Дядя Миша писал:
Возможно != нужно.

В целом как и вся разработка nodemod.

Сейчас самое сложное - реализация аналога ham, огромная часть нужных значений живет внутри hlsdk кода, который, по понятным причинам, не существует в api, а вся работа с ним ведется к кучи инжектов и прочего.

А еще полгода назад хотел запустить Алису в hl, текстом в чате мне удалось заставить ее общаться, но для войса оказалось, что у игры хитрые кодеки, которые имеют лишь нативную реализацию, опять же либо пишем натив под nodejs, либо просто встраиваем их в код самого nodemod. Но это не столь важно, тоже ради фана.

__________________
exit();


Отправлено FiEctro 15-08-2023 в 13:06:

Цитата:
TheEVolk писал:
> Для мельтешения партиклей дуум запускать необязательно.

а это и не партикли..
Но единственный способ что-то цветное отрисовать в хл, и то часть верхних энтитей решила не обновлять цвет. По крайней мере это из разряда:
- смотри что оно умеет.


Мне кажется там вообще каша какая то. Если приглядеться такое ощущение что строки все сползли. Да и вообще рисовать каждый пиксель отдельной энтитей - занятие сомнительное. Неужели нет другого способа? Ведь были же на халфу видеотекстуры. Или у тебя задача со стоковыми дллками работать?

Цитата:
TheEVolk писал:
А еще полгода назад хотел запустить Алису в hl, текстом в чате мне удалось заставить ее общаться, но для войса оказалось, что у игры хитрые кодеки, которые имеют лишь нативную реализацию, опять же либо пишем натив под nodejs, либо просто встраиваем их в код самого nodemod. Но это не столь важно, тоже ради фана.


Попробуй встроить ChatGPT и говорилку учёным подключить. Пускай базарит всякое , помнится на Скайрим что то делали.

__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!


Отправлено Дядя Миша 15-08-2023 в 14:14:

Цитата:
TheEVolk писал:
В целом как и вся разработка nodemod.

Это альтернативный язык для метамода, не всем нравится pawn к примеру.
Тут вопросов нет.

Добавлено 15-08-2023 в 17:14:

Цитата:
FiEctro писал:
Ведь были же на халфу видеотекстуры.

Так они на клиенте были. А тут доступ server-only. Еще и MAX_VISIBLE_PACKET мешает.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено TheEVolk 17-08-2023 в 20:18:

Цитата:
FiEctro писал:
Попробуй встроить ChatGPT и говорилку учёным подключить. Пускай базарит всякое , помнится на Скайрим что то делали.

На самом деле легко очень, chatgpt клиент есть под nodemod, только это не совсем сюжетка выйдет, хотя..

Опять же можно и войсчат по полной заюзать, говоришь голосом, отвечают голосом)

__________________
exit();


Отправлено XaeroX 17-08-2023 в 22:13:

Цитата:
FiEctro писал:
Попробуй встроить ChatGPT и говорилку учёным подключить

Там же лютые задержки в десятки секунд. И сами LLM много весят.

__________________

xaerox on Vivino


Временная зона GMT. Текущее время 12:29.
Показать все 34 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024