Хуки и sourcemod на cs2

Twelvee

Участник
Сообщения
75
Реакции
147
Привет!
Прошел уже месяц с прошлого треда про скриптинг в cs2 и я решил актуализировать информацию + рассказать чем занимается комьюнити AlliedModders в данный момент.

Начнем с главного - Sourcemod не портирован в кс2 и вероятно не будет. Активная разработка Sourcemod в кс2 не ведется, достаточно посмотреть коммиты и пулл-реквесты в репозитории sourcemod.
Metamod все так же работает на source2, что позволяет создать свой sourcemod сообществу, но судя по диалогам в дискорд сервере AlliedModders информации о таких наработках крайне мало, в основном люди просто спрашивают когда будет sourcemod.

Текущие проблемы, почему sourcemod и metamod до сих пор не портировали

1. Metamod и Sourcemod работают на библиотеке SourceHooks, которая в свою очередь позволяет цепляться к публичным интерфейсам Source (memory hook) через декларацию интерфейсов Valve в их SDK.
Самая последняя версия SDK позволяющая цепляться к cs2 серверу находится вот тут Update Dota & CS2 support by GAMMACASE · Pull Request #125 · alliedmodders/hl2sdk, за что огромное спасибо GAMMACASE
В данный момент ребята еще продолжают над ней работать.

2. Архитектура х64. Это критичное изменение для Sourcemod и Metamod, так как куча инструментов была написана под х86 архитектуру. В целом с этой проблемой начали знакомиться еще во времена перехода доты на source2, именно поэтому metamod можно установить к себе на сервер (достаточно сложно, но можно). С SourceMod все сложнее.

3. VSP (Valve Server Plugin). Подробнее обо всех вещах от которых Valve избавились во второй версии Source я напишу чуть ниже, но отказ от Valve Server Plugins становится критичным для AlliedModders проектов. Установка metamod больше не возможна с помощью обычного .vdf файла.

4. Поддержка других игр. Metamod и Sourcemod рассчитаны на множество игр Source, практически все игры Source, если быть точнее. Это добавляет кучу проблем с обратной совместимостью Source и Source2.

5. Мало людей, которые действительно готовы вносить вклад в портирование Sourcemod&Metamod в CS2. За время моего присутствия на сервере AlliedModders я заметил лишь 3-4 человека, которые что-то ковыряют в Metamod. Никто из них не портирует Sourcemod&Metamod в CS2.


Я начал строить сарай
Изначально я увидел что xtance пытался прикрутить к текущей системе скриптинга Javascript.
Меня действительно заинтересовала эта идея и я начал реализовывать свою версию Sourcemod, друзья в тимспике придумали идеальное название - SORAI (Вроде бы как "Небо" на японском, но на русском звучит забавно).
Название вероятно временное :)

Задумка была такой:
Я создаю dll, внутри которой использую metamod и сверху на это все пишу интерфейсы на Javascript для плагинов.
Вскоре узнаю что метамод это слишком жирная штука (она рассчитана сразу на все игры Source) и решаю использовать SourceHook.

Спустя несколько дней у меня получается подключить SourceHook и подписаться на интерфейсы Valve.
Sorai сейчас это dll пакет, который мы подключаем через кастомный dll-injector внутрь процесса cs2. В нем есть возможность подписываться на игровые события и прочие интерфейсы от Valve (CvarChanged, ServerInit, итд).
Проект на очень ранней стадии, его код - это набор тестов работы с движком Source2.

Различия от решений AlliedModders:
1. В Source2 полностью выпилили старую систему игровых событий (igamevents). На смену пришла новая - IGameEventSystem. Любимый и простой FireEvent больше не thing в новом Source. Ивенты теперь отправляются через grpc(?) в Protobuf формате.
2. х64 архитектура. Тут и добавить нечего, кс2 требует x64 dll.
3. Поддержка только CS2, для остальных игр есть Sourcemod.
4. Установка сарая через кастомный dll иньектор. Это временно, пока не придумал лучшего решения с учетом отказа Valve от valve server plugin.

Проблемы с которыми я столкнулся можно и не начинать считать, их действительно море. Однако самая главная, которую я не знаю как решить - отсутствие VGUI интерфейса во втором соурсе.
Менюшек - нет. Это критичная часть любого плагина, никто не любит писать все команды в чат или консоль. Если есть идеи как реализовать меню в cs2 - буду рад слышать.

Что в планах:

1. Я решил отказаться от идеи с простыми интерфейсами Javascript, так как по сути это будет являться socket-based архитектурой плагинов (общение через IPC), в дискорде AlliedModders мне дали понять что это не тру.
Поэтому я буду добавлять в сарай движок v8, чтобы дать возможность нативно разрабатывать плагины на Javascript.
2. Создать публичный репозиторий и простенький сайт с базовой информацией о статусе разработки.
3. Доделать базовый функционал ивентов (проверить работу компиляции protobuf).
4. Сделать возможным hot-reload плагинов на яваскрипте.
5. Сделать возможным на уровне движка проверки подлинности плагина. Чтобы облегчить жизнь создателям приватных плагинов.
6. Пакетный менеджер для плагинов. Установка плагинов через cli? Звучит интересно.

Если есть идеи по развитию данного проекта - буду рад их услышать. У нас появилась возможность избавиться от проблем Sourcemod и я знаю далеко не о всех этих проблемах.
Для c++ разработчиков:
Я открою исходный код Sorai как только добавлю в него v8. Сейчас и поддерживать его невозможно, так как не существует основной архитектуры. Просто куча кода которая тестирует взаимодействие с движком Source2.
Оффтоп

Для всех остальных:
Подскажите название, что ли. Я ж реально назову его сараем.

Ну и конечно же хотел бы сказать огромное спасибо сообществу AlliedModders, ребята всегда готовы прийти на помощь. Особенные благодарности двум людям - Core Team AlliedModders psychonic и создателю плагинов, активному участнику актуализации SDK - GAMMACASE
 
Последнее редактирование:

Twelvee

Участник
Сообщения
75
Реакции
147
Вы сами говорите, что выбрали JS, т.к. плагины сможет писать каждый пятиклассник, может действительно не стоит сильно замарачиваться насчет приватных плагинов, пусть эта забота будет на плечах их разработчиков, если таковые будут.
Я бы с радостью не заморачивался на этим, но яваскрипт - это текст) И по моему мнению первое что пришло бы создателям приватных плагинов на ум - а как теперь нам сделать привязку по ip:port.
Если бы я об этом не думал - ответ был бы "никак", а сейчас есть уже несколько вариантов
 

Black_Yuzia

Зарабатываю на жизнь Мемами про Крузю.
Сообщения
693
Реакции
372
транзакции, инстанс таблиц, запросы, игровая логика, слушатели ивентов, куча менюшек и регистрации команд
А от этого никуда.
Вы или даёте полную свободу. Делайте как хотите ваши плагины или давать обрезок.

Лично я бы хотел иметь свободу.
Особенно что касается движка и js. Поддержку любых пакетов и прочее.
Потому что если я загружаю либу "а", то она должна работать.
Если мне скажут что оно не работает потому что так надо, я скажу что не буду писать в такой среде.

Если ограничения будут аргументированы это ещё можно принять, но тоже зависит.
Я например хочу делать плагины с полной поддержкой любой ORM и мне не нужна орм от resourcemod. Я хочу брать ту которую использую большую часть времени. Учить новую орм специально под ресорсмод... такое себе. Тем более, вы готовы самостоятельно писать 100 и 1 пакет под resourcemod?

Тем более, если взять орм, это же вам и поддерживать её придётся, баги фиксить, тесты писать. А за готовые либы вам париться не нужно. Любую либо берешь и она работает. Её уже протестировали где надо, а если и есть баги, их оперативно исправят после issue от пользователей.

Поддержка любого npm пакета очень упростит и ускорит написание плагинов. Разработчик плагинов будет больше времени тратить на сами плагины, а не написание инструментов для работы например с бд или как ему лучше отправлять http запросы.
И если завтра ему нужно будет поднять ws сервер, то он просто скачал бы либу и поднял бы сервер.

Я не знаю от чего зависит, в контексте resourcemod, поддержка либ, можете уточнить этот момент? Очень интересно

Если придётся все писать с нуля или вообще без возможности реализовать некоторые функции, писать плагины будет попросту неудобно и долго. Что значит, их будет легче написать на каких нибудь плюсах.
Так как у вас есть все возможности языка/среды/движка
 

Twelvee

Участник
Сообщения
75
Реакции
147
А от этого никуда.
Вы или даёте полную свободу. Делайте как хотите ваши плагины или давать обрезок.

Лично я бы хотел иметь свободу.
Особенно что касается движка и js. Поддержку любых пакетов и прочее.
Потому что если я загружаю либу "а", то она должна работать.
Если мне скажут что оно не работает потому что так надо, я скажу что не буду писать в такой среде.

Если ограничения будут аргументированы это ещё можно принять, но тоже зависит.
Я например хочу делать плагины с полной поддержкой любой ORM и мне не нужна орм от resourcemod. Я хочу брать ту которую использую большую часть времени. Учить новую орм специально под ресорсмод... такое себе. Тем более, вы готовы самостоятельно писать 100 и 1 пакет под resourcemod?

Тем более, если взять орм, это же вам и поддерживать её придётся, баги фиксить, тесты писать. А за готовые либы вам париться не нужно. Любую либо берешь и она работает. Её уже протестировали где надо, а если и есть баги, их оперативно исправят после issue от пользователей.

Поддержка любого npm пакета очень упростит и ускорит написание плагинов. Разработчик плагинов будет больше времени тратить на сами плагины, а не написание инструментов для работы например с бд или как ему лучше отправлять http запросы.
И если завтра ему нужно будет поднять ws сервер, то он просто скачал бы либу и поднял бы сервер.

Я не знаю от чего зависит, в контексте resourcemod, поддержка либ, можете уточнить этот момент? Очень интересно

Если придётся все писать с нуля или вообще без возможности реализовать некоторые функции, писать плагины будет попросту неудобно и долго. Что значит, их будет легче написать на каких нибудь плюсах.
Так как у вас есть все возможности языка/среды/движка
Поддержка модулей ноды - не самая тривиальная задача.
Нода это рантайм, ResourceMod это рантайм.
v8 это движок который используется в ноде, quickjs это движок который используется в resourcemod
В ноде есть целая куча интерфейсов для интерпретации разных вещей, будь то файловая система или же сеть. По умолчанию яваскрипт не знает о таких вещах.

Так вот чтобы реализовать полную поддержку пакетов ноды - нужно имплементировать в нашем рантайме все интерфейсы ноды. Это еще пол беды.
Если приводить примеры с нодой, то она изначально рассчитана на веб-сервера. Каждый сервис какого-нибудь приложения это отдельное приложение, архитектурно (package.json собственный).
Так вот наши "сервисы" это плагины, для каждого плагина потребуется отдельный node_moduels, package.json и своя настройка среды.
Можно было бы сделать так, чтобы плагины импортировали пакет из корневой директории, но что делать с конфликтами зависимостей? Один плагин требует одну версию пакета, другой- другую. Загружать обе?

Я не хочу реализовывать поддержку модулей ноды, это бесполезно и бессмысленно. Это лишь усложнит процесс разработки, даст огромный оверхед простому решению создания плагинов и кучу проблем с безопасностью.
Что делать с приватными плагинами? Откуда для них модули загружать, из файловой системы? через http? Запросить целую папку модулей при старте сервера и заставить ждать минуту чтобы сервер с одним плагином запустился?

Очень много вещей, которые могут стать нерешаемыми, если бездумно создавать кучу сахара. Если что-то хочется добавить потому что это будет "не плохо" - не стоит этого добавлять.
Сейчас я сфокусирован на имплементации самых важных частей, интерфейсов для работы с сетью и файловой системой, без них действительно невозможно будет написать плагин)
В sourcemod нет поддержки плагинов ноды и орм, но это не мешало создателям серверов создавать целую кучу плагинов.

Так же напомню, что это опенсорс решение, которое в перспективе можно будет допилить плагинами на с++. Если кому-то нужна нативная поддержка какой-то базы - вы сможете написать свой модуль на плюсах для этого.
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291

oleg_nelasy

Участник
Сообщения
664
Реакции
46
@Twelvee, вы планируете добавлять набор стандартных плагинов так как это сделано в SM? Чтоб при установки сервер уже мог минимально функционировать и был стандартный набор для админа кик бан? Плюс это тот же пример как писать плагины.
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
@Twelvee, вы планируете добавлять набор стандартных плагинов так как это сделано в SM? Чтоб при установки сервер уже мог минимально функционировать и был стандартный набор для админа кик бан? Плюс это тот же пример как писать плагины.
Если двенадцать реально все реализует, то я думаю, это можно сделать и самим, например открыв репу на гите со списком нужных плагинов, в котором энтузиасты смогут перенести все на кс2
 

X X X

Участник
Сообщения
31
Реакции
3
@Twelvee Надеюсь у вас всё получится! Можно ли где то следить за прогрессом, и есть ли какие ни будь прогнозы о том когда можно будет полноценно писать плагины под кс2?
 

Gazzi

Участник
Сообщения
84
Реакции
12
В репозитории source2mod сначала написали что будет JS но отредактировали на SourcePawn
 

SenatoR

Участник
Сообщения
773
Реакции
344
В репозитории source2mod сначала написали что будет JS но отредактировали на SourcePawn
Это вчера в discord чате ам было написано
Там в целом ветка по с2м доступна всем для чтения, кто хочет, может ознакомиться
 

Twelvee

Участник
Сообщения
75
Реакции
147
Такс, давно сюда не писал, на все вопросы практически ответил в дискорде Resourcemod.
В целом как и планировал хочу оставить эту ветку только для публикации обновлений.

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

Реализовал модули network (fetch) и files (fs), пока работают синхронно. Работаю над асинхронной версией и в целом над eventloop.

Очень простенькую роадмапу опубликовал в дискорде, вот дублирую сюда.
  • [x] Javascript Runtime
  • [x] ECMAScript 2020
  • [x] SourceHooks impl
  • [x] Fetch / Filesystem modules
  • [x] ES Modules loader
  • [ ] Async I/O
  • [ ] NoSQL Database support (file-based)
  • [ ] Plugins manager (package panager)
  • [ ] Source events impl
  • [ ] Source entities workflow
  • [ ] Load plugins through http
  • [ ] ResourceMod installer
  • [ ] Base admin plugin
  • [ ] Base vote plugin
Как только завершу все эти пункты - релизну ResourceMod и можно будет написать свои плагины каждому желающему.
 

MrFoxpro2

Участник
Сообщения
64
Реакции
17
Такс, давно сюда не писал, на все вопросы практически ответил в дискорде Resourcemod.
В целом как и планировал хочу оставить эту ветку только для публикации обновлений.

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

Реализовал модули network (fetch) и files (fs), пока работают синхронно. Работаю над асинхронной версией и в целом над eventloop.

Очень простенькую роадмапу опубликовал в дискорде, вот дублирую сюда.
  • [x] Javascript Runtime
  • [x] ECMAScript 2020
  • [x] SourceHooks impl
  • [x] Fetch / Filesystem modules
  • [x] ES Modules loader
  • [ ] Async I/O
  • [ ] NoSQL Database support (file-based)
  • [ ] Plugins manager (package panager)
  • [ ] Source events impl
  • [ ] Source entities workflow
  • [ ] Load plugins through http
  • [ ] ResourceMod installer
  • [ ] Base admin plugin
  • [ ] Base vote plugin
Как только завершу все эти пункты - релизну ResourceMod и можно будет написать свои плагины каждому желающему.
оо збс удачи тебе ждем всем комюнити :)
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Такс, давно сюда не писал, на все вопросы практически ответил в дискорде Resourcemod.
В целом как и планировал хочу оставить эту ветку только для публикации обновлений.

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

Реализовал модули network (fetch) и files (fs), пока работают синхронно. Работаю над асинхронной версией и в целом над eventloop.

Очень простенькую роадмапу опубликовал в дискорде, вот дублирую сюда.
  • [x] Javascript Runtime
  • [x] ECMAScript 2020
  • [x] SourceHooks impl
  • [x] Fetch / Filesystem modules
  • [x] ES Modules loader
  • [ ] Async I/O
  • [ ] NoSQL Database support (file-based)
  • [ ] Plugins manager (package panager)
  • [ ] Source events impl
  • [ ] Source entities workflow
  • [ ] Load plugins through http
  • [ ] ResourceMod installer
  • [ ] Base admin plugin
  • [ ] Base vote plugin
Как только завершу все эти пункты - релизну ResourceMod и можно будет написать свои плагины каждому желающему.
Доки по апи будут какому нибудь в комплекте?
 

Twelvee

Участник
Сообщения
75
Реакции
147
Доки по апи будут какому нибудь в комплекте?
Да, я пишу документацию параллельно, она будет на сайте. Главная цель сделать максимально простым создание плагинов, поэтому без документации никуда.
На релизе она все таки будет не очень полноценной, но будет покрывать основные концепты и API методы.

Только сегодня дописал краткую документацию по написанию нативных c-модулей для рантайма
 
Сверху Снизу