[Source 2] Скриптинг?

xtance

Участник
Сообщения
513
Реакции
743
Внимание! Спасибо за внимание.

Данная тема была создана в марте, когда вышла бета CS2.
С тех пор многое изменилось, в частности игра больше не поддерживает Lua, о которой идёт речь в этом посте.
Весь мой текст ниже практически потерял актуальность, но люди продолжают общаться в этой теме по привычке, и постить разные полезные находки.

Например:
А этот пост остался, можно сказать, для истории.
Ну я предупредил.


Вступление
Тема создана для совместного поиска способов продолжать писать плагины под контру.
И сразу же спойлер: адекватных рабочих решений пока нет. Иначе бы я не создал эту тему.
Далее вас ждёт несвязный поток информации и ссылок, которая была найдена в разных уголках интернета.

Насчёт сорсмода. S2 не поддерживается и неизвестно, будет ли.
Про это есть абзац в их вики (ссылка), где так же сказано про то, что MetaMod теоретически запускается с новым движком.
Но реализовано это было довольно давно (ссылка) в рамках поддержки доты2.

Ну а дальше я пошёл искать способы выполнять ну хоть какой-то код на сервере.
И обнаружилось то, что чего я не ожидал. Хотя кто знает.
Те кто делал карты под ксго, наверно сталкивались с VScript. Эта штука позволяла писать скрипты на Squirrel и взаимодействовать с объектами на карте.
В новом движке вальв выбрала другой язык скриптинга, а именно Lua, в отличие от Squirrel он хоть где-то используется.

Краткий гайд
Создать скрипт можно в csgo/scripts/vscripts , например script.lua
Данной папки у меня не было по умолчанию, её, как и скрипт, можно создать самому. По крайней мере на "пиратке"
Мы также можем поглазеть на скрипты, написанные разработчиками. Но в отличие от ксго они не лежат готовыми в папке, а запиханны в vpk
Скачиваем GCFScape и открываем pak01_dir.vpk (он лежит в папке csgo в самом конце), всё лежит в папке с говорящим названием scripts
Интересный намёк - скрипт с названием test_surfmode.lua (всё что он делает - отправляет переменные акселерации в консоль)
1679787692710.png
Допустим мы создали скрипт и вписали туда print("Hello world")
Чтобы выполнить его, напишите в консоль кс clear; script_reload_code script.lua
Теперь вы программист на Lua.

Хорошие новости
Теперь мы можем писать плагины.
Изменять свойства игрока, создавать команды, отслеживать события и так далее.
Пример кода:
Пример команды:
Convars:RegisterCommand('xtance', function(commandName, arg1, arg2, etc)

    local player1 = Convars:GetCommandClient()
    local id = player1:GetEntityIndex()
    print("[ID]", id)

    local player2 = PlayerInstanceFromIndex(id)
    print("[Player]", player2)

    print("[Same]", player1 == player2)

    local all = Entities:FindAllByClassname("player")
    for key, player in pairs(all) do
        print(key, player)
        local hp = player:GetHealth()
        print("HP", hp)
        player:SetHealth(555)
    end

end, '', 0)

1679788157701.png

Плохие новости
Собственно, недостаток всего того к чему мы привыкли. А именно
  • луа запускается в сильно урезанной виртуалке. нет способов взаимодействия с внешним миром
  • нет возможности подключения C/C++ библиотек, выполнения http запросов или какого-нибудь там sql
  • из работы с файлами можно разве что прочитать соседний скрипт лежащий в этой же папке
Ну и в целом неудобно и непривычно писать.

Мои костыли
А именно попытка прикрутить к этому всему JS
Есть интересный способ коммуникации с сервером, о котором не все знают
Запускаем игру через повершел с такими параметрами .\cs2.exe -console -developer -condebug -netconport 1337
В принципе только последний здесь принципиально важен, это открывает возможность связываться с консолью через telnet
После запуска игры жмём win+r и пишем telnet localhost 1337 (на моей винде его не было по умолчанию, как включить гуглится)
Результат:
1679789075865.png
Поскольку это известный протокол, нам не составит труда подключиться к нему из js (да хоть из чёрта лысого, я просто разучился писать на чём-то кроме js).
JavaScript:
const socket = net.connect('127.0.0.1', 1337);
socket.on('ready', () => {
    console.log('connected!')
 
    // хаваем строчки с консоли
    const reader = readline.createInterface({ input: socket, crlfDelay: Infinity });
    reader.on('line', input => {
 
        // обрезает строчку, не спрашивайте зачем, это все равно копипаст
        const line = input.replace(/\s{2,}/g, ' ').trim();
 
        console.log(line);
    })
 
    // отправляем команды в консоль
    socket.write(';echo hello hlmod\n'); // вот это \n в конце важно
})

Ну и по сути изначальная идея (сильно не смейтесь) заключалась в том, что:
  • для каждой функции, которая доступна lua (их много), создаём консольную команду
  • эта команда принимает аргументы, парсит их и отправляет движку
  • чтобы отправить результат обратно в js, мы просто отправляем текст в консоль
  • чтобы понять, какой текст в консоли какой функции js принадлежит, можно посылать из js в lua условный параметр (например uuid), хранить объект типа ({ uuid: callback }), потом парсить ответ, получать по uuid наш callback, вызывать функцию
  • на удивление на lua нашлась готовая библиотека для json, так что с парсингом строк из консоли не всё так плохо
Снова плохие новости
Хотя наверно вы и так уже догадались как хреново это работает в плане скорости.
Ведь на каждый пук нужно бегать туда-сюда и выполнять эту тучу операций.
Поэтому я забил на эту идею, а жаль, так как получался весьма приятный синтаксис.
Даже успел накодить обёртку для класса игрока, но вовремя решил измерить скорость. И так, представляю:

1679789745170.png
VS
1679789758336.png


В общем, мои костыли отработали за 300 мс, в то время как sourcepawn за 0.3 мс, разница примерно в 1000 раз.

На этом моменте я впал в тильт (нет серьёзно, стоит пойти поспать).
Но возможно у вас есть идеи, что с этим делать или же выбросить это все нафиг.

А версию на чистом Lua я не затестил, поскольку даже os.clock мне там не доступен.
Но если у вас есть желание вы можете писать простенькие плагины на нём (ней?) прямо сейчас.

Для тех кто решился
Вот апи по функциям доты2 - API | ModDota
Многие из них подходят и в кс2. Ну как минимум отсюда я понял как поставить игроку хп.
Также в Lua есть рефлексия (можно пройтись по глобальной таблице, оттуда получить все доступные и пройтись по ним тоже).
То есть можно посмотреть что там вам доступно. Пример кода по ссылке, глобальная таблица называется _G

Что дальше
Ну я по сути сижу на читерских форумах (uc) и смотрю как они там реверсят движок.
Вообще они там копают примерно в том же направлении, только в основном волнуются за клиент а не сервер, но там тоже можно подцепить инфы
И щас моя надежда остается на то что я научусь работать с памятью и буду напрямую вызывать функции и читать значения, как это делают крутые хакеры
А в идеале чтобы кто-нибудь сделал аналог сорсмода

Всем спасибо за чтение и спокойной ночки. С вами как обычно был xtance
Сообщения автоматически склеены:

Также забыл сказать, если кому-то понадобятся игровые события, их можно посмотреть через тот же GFScape в csgo/resource
1679791032814.png(это просто текстовые файлы)
А слушать их можно через луашку
NGINX:
function TestEvent(event)
    print("[Jump]", event["userid"])
end

local id = ListenToGameEvent("player_jump", TestEvent, self)
 
Последнее редактирование:

Pisex

Участник
Сообщения
172
Реакции
155
Если кому нужно поставить MetaMod:
1) Качаете Metamod:Source - Snapshots
2) Кидаете в steamapps\common\Counter-Strike Global Offensive\game\csgo\
3) В файле gameinfo.gi добавляете строчку Game csgo/addons/metamod после(можно и перед, без разницы) Game_LowViolence csgo_lv // Perfect World content override, чтобы получилось так:
C++:
    FileSystem
    {
        SearchPaths
        {
            Game_LowViolence    csgo_lv // Perfect World content override
            Game csgo/addons/metamod

            Game    csgo
            Game    csgo_imported
            Game    csgo_core
            Game    core

            Mod        csgo
            Mod        csgo_imported
            Mod        csgo_core

            AddonRoot            csgo_addons

            LayeredGameRoot        "../game_otherplatforms/etc" [$MOBILE || $ETC_TEXTURES] //Some platforms do not support DXT compression. ETC is a well-supported alternative.
            LayeredGameRoot        "../game_otherplatforms/low_bitrate" [$MOBILE]
        }

        "UserSettingsPathID"    "USRLOCAL"
        "UserSettingsFileEx"    "cs2_"
    }
Проверяете:
Только вот кому это надо без см, ещё и урезанный mm(
 

cruze

Участник
Сообщения
4
Реакции
1
Does anyone know how to hook chat? say and say_team in lua
 

White Wolf

🍉
Сообщения
2,382
Реакции
2,187
  • Команда форума
  • #49
Не проверенные кем ? Я тестировал ее .
Тестировать это не значит что вы понимаете о чем речь в патче. Туда можно засунуть что-угодно для чего и нужно вести открытый репо с изменениями. Мало ли чего в байт-код запихнут, а потом кому разгребать?
 

xtance

Участник
Сообщения
513
Реакции
743
Компиляция MetaMod и тестового плагина под MetaMod.
По сути это вольный перевод инструкций с wiki.alliedmods.net на русский язык. Ну может кому и поможет.
Экспериментировал на десятой винде.

0) Установить git, python не ниже 3.3, а так же Visual Studio и build tools (я ставил 2022ые, наверно можно и другие).
1) Создать папку, где будем работать. У меня это S:\Code\xtest (вы можете адаптировать пути под себя).
2) Открыть в ней консоль (win+r -> cmd, или shift+пкм будучи в папке)

3) Скачать metamod:
git clone --recursive https://github.com/alliedmodders/metamod-source.git
4) Скачать sdk для cs2:
git clone --branch cs2 https://github.com/alliedmodders/hl2sdk.git hl2sdk-cs2

5) Настроить Windows:

5.1) зайти в "переменные окружения"
5.2) создать следующие переменные в "системных переменных":

(имя - значение)
MMSOURCE_DEV S:\Code\xtest\metamod-source
HL2SDKCS2 S:\Code\xtest\hl2sdk-cs2

5.3) разумеется надо адаптировать пути под ваши папки. по итогу должно получиться как на скрине
2023-10-01_02-18.png

6) поставить амбилд:
git clone --recursive https://github.com/alliedmodders/ambuild.git
pip install ./ambuild

6.1) вот эта команда с pip у меня не сработала, хотя и написана в официальной инструкции. решение проблемы:
6.2) открыть cmd от админа, перейти в нашу рабочую папку, в моём случае - переключиться на диск (S:), затем cd Code\xtest\ambuild
6.3) зайти в папку с амбилд - cd ambuild
6.4) выполнить - python setup.py install

7) сбилдить метамод:
7.1) вернуться в рабочую папку, после чего в папку метамода - cd metamod-source
7.2) создать папку где будет сборка - mkdir build , затем cd build
7.3) выполнить конфигурацию, хз как ещё это назвать - python ../configure.py --sdks cs2 --targets x86_64
7.4) собрать командой - ambuild
7.5) если всё ок, то готовый метамод будет в папке S:\Code\xtest\metamod-source\build\package
7.6) проверить работоспособность метамода, установив его в сервер согласно гайду от Palonez: [Source 2] Скриптинг?
7.7) от себя добавлю то, что после обновления ксго этот файл перезаписывается. В самом файле указано, что надо добавлять строчки в csgo_core/gameinfo.gi (а не csgo), однако у меня это не заработало.

8) сбилдить наш тестовый плагин для метамода:
8.1) скопировать в рабочую папку готовый пример, лежащий в "metamod-source/samples/s2_sample_mm". ну, для удобства и чтобы всё лежало рядом:
1696116616875.png
8.2) открыть "x64 native tools command prompt for vs 2022". если их нет, вероятно не скачаны нужные инструменты в установщике визуал студии.
1696116853612.png
8.3) зайти в папку проекта (S:, затем cd Code\xtest\s2_sample_mm)
8.4) создать папку где будет сборка - mkdir build , затем cd build
8.5) конфигурация:
python ../configure.py --plugin-name=sample_mm --plugin-alias=sample -s cs2 --targets=x86_64 --mms_path=S:\Code\xtest\metamod-source --hl2sdk-root=S:\Code\xtest --gen=vs

--plugin-name это имя плагина
--plugin-alias это ещё одно имя
-s это sdk под которую собираем
--targets это платформа под которую собираем
--mms_path это путь к исходникам метамода (которые мы скачали ранее. вообще, билдить сам метамод необязательно, лишь бы сорсы лежали)
--hl2sdk-root это путь к папке, в которой лежит папка с sdk (то есть к родительской папке, а не к самой папке sdk)
--gen это генерация файла проекта под vs

По сути вам нужно поменять только --mms_path и --hl2sdk-root, так как у вас они отличаются.
Это тоже вольный перевод инструкции, которая лежит в папке с этим же плагином.

8.6) сборка как и в случае с метамодом, выполняется командой ambuild

9) тестирование плагина
9.1) в папке "S:\Code\xtest\s2_sample_mm\build\package" будет папка addons, которую нужно просто скопировать на сервер
9.2) активировать плагин можно через meta load sample, а отгрузить (это понадобится на случай обновления плагина) через meta unload sample
9.3) список плагинов - meta list

10) редактирование тестового плагина
10.1) в s2_sample_mm/build будет заботливо лежать "sample_mm.vcxproj". я редактировал файл в vs, а компилировал через консольку как в шаге 8.6, вообще я нуб и понятия не имею как настроить visual studio, но она здорово помогает подсказками. она предложит что-то проапгрейдить в проекте, я бы этого делать не стал.
2023-09-30_23-34.png
10.2) первым делом я пошёл узнавать, как тут создавать команды. обработчик находится в районе "Hook_ClientCommand". вообще там уже есть готовый код, который может вам помочь.
10.3) немного покопавшись в предоставленном нам апи, получилось родить следующий, простенький код с целью узнать стим игрока по его клиентскому номеру на сервере (из команды status):

узнаём стим айди игрока:
void SamplePlugin::Hook_ClientCommand( CPlayerSlot slot, const CCommand &args )
{
    auto cmd = args.GetCommandString();
    auto first = args[0];

    g_SMAPI->ConPrintf("[Test] Command from %d: \"%s\", first arg: \"%s\" \n", slot, cmd, first);
    g_SMAPI->ClientConPrintf(slot, "[Test] Your command: \"%s\" \n", first);

    if (strcmp(first, "get_steamid") == 0)
    {
        int slotid = std::stoi(args[1]);
        auto userid = engine->GetPlayerUserId(slotid).Get();

        if (userid == -1)
        {
            g_SMAPI->ClientConPrintf(slot, "[Test] No valid player at SlotID (%d) \n", slotid);
        }
        else
        {
            auto steamid = engine->GetPlayerNetworkIDString(slotid);
            auto name = engine->GetClientConVarValue(slotid, "name");
            g_SMAPI->ClientConPrintf(slot, "[Test] Player at SlotID (%d): SteamID: %s, UserID %d, Name %s \n", slotid, steamid, userid, name);
        }
    }
}

10.4) результат:
2023-10-01_02-47.png

Также хотел получить доступ к интерфейсу IPlayerInfoManager и IPlayerInfo, как это сделано в тестовом плагине под Source1, но столкнулся с "Could not find interface: PlayerInfoManager002", жаль по идее это бы открыло побольше возможностей.

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

  • Можно было бы автоматизировать процесс сборки, загрузки на сервер, выгрузки текущего плагина и подгрузки новой версии. Интересно как это сделали в сорсмоде. Но вообще, это вполне возможно.
  • По идее, несмотря на то что много людей в обсуждениях на аллиед проголосовало за JS, думаю разработчикам гораздо проще восстановить SDK для кс2 и просто использовать SM дальше (и соответственно SourcePawn). Удивительно сколько "стандартных" систем предоставляет сорсмод, та же система админов, флагов, команд, и многого другого. В случае перехода на JS придётся это всё пилить с нуля.
  • Поначалу я вообще задумался, зачем делали сорспавн если он по сути вызывает аналогичные функции из плюсов, и можно было бы всем писать те же плагины для метамода.. но потыкав плюсы примерно час, стало понятно, почему.
 
Последнее редактирование:

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Компиляция MetaMod и тестового плагина под MetaMod.
По сути это вольный перевод инструкций с wiki.alliedmods.net на русский язык. Ну может кому и поможет.
Экспериментировал на десятой винде.

0) Установить git, python не ниже 3.3, а так же Visual Studio и build tools (я ставил 2022ые, наверно можно и другие).
1) Создать папку, где будем работать. У меня это S:\Code\xtest (вы можете адаптировать пути под себя).
2) Открыть в ней консоль (win+r -> cmd, или shift+пкм будучи в папке)

3) Скачать metamod:
git clone --recursive https://github.com/alliedmodders/metamod-source.git
4) Скачать sdk для cs2:
git clone --branch cs2 https://github.com/alliedmodders/hl2sdk.git hl2sdk-cs2

5) Настроить Windows:

5.1) зайти в "переменные окружения"
5.2) создать следующие переменные в "системных переменных":

(имя - значение)
MMSOURCE_DEV S:\Code\xtest\metamod-source
HL2SDKCS2 S:\Code\xtest\hl2sdk-cs2

5.3) разумеется надо адаптировать пути под ваши папки. по итогу должно получиться как на скрине
Посмотреть вложение 114544

6) поставить амбилд:
git clone --recursive https://github.com/alliedmodders/ambuild.git
pip install ./ambuild

6.1) вот эта команда с pip у меня не сработала, хотя и написана в официальной инструкции. решение проблемы:
6.2) открыть cmd от админа, перейти в нашу рабочую папку, в моём случае - переключиться на диск (S:), затем cd Code\xtest\ambuild
6.3) зайти в папку с амбилд - cd ambuild
6.4) выполнить - python setup.py install

7) сбилдить метамод:
7.1) вернуться в рабочую папку, после чего в папку метамода - cd metamod-source
7.2) создать папку где будет сборка - mkdir build , затем cd build
7.3) выполнить конфигурацию, хз как ещё это назвать - python ../configure.py --sdks cs2 --targets x86_64
7.4) собрать командой - ambuild
7.5) если всё ок, то готовый метамод будет в папке S:\Code\xtest\metamod-source\build\package
7.6) проверить работоспособность метамода, установив его в сервер согласно гайду от Palonez: [Source 2] Скриптинг?
7.7) от себя добавлю то, что после обновления ксго этот файл перезаписывается. В самом файле указано, что надо добавлять строчки в csgo_core/gameinfo.gi (а не csgo), однако у меня это не заработало.

8) сбилдить наш тестовый плагин для метамода:
8.1) скопировать в рабочую папку готовый пример, лежащий в "metamod-source/samples/s2_sample_mm". ну, для удобства и чтобы всё лежало рядом:
Посмотреть вложение 114545
8.2) открыть "x64 native tools command prompt for vs 2022". если их нет, вероятно не скачаны нужные инструменты в установщике визуал студии.
Посмотреть вложение 114546
8.3) зайти в папку проекта (S:, затем cd Code\xtest\s2_sample_mm)
8.4) создать папку где будет сборка - mkdir build , затем cd build
8.5) конфигурация:
python ../configure.py --plugin-name=sample_mm --plugin-alias=sample -s cs2 --targets=x86_64 --mms_path=S:\Code\xtest\metamod-source --hl2sdk-root=S:\Code\xtest --gen=vs

--plugin-name это имя плагина
--plugin-alias это ещё одно имя
-s это sdk под которую собираем
--targets это платформа под которую собираем
--mms_path это путь к исходникам метамода (которые мы скачали ранее. вообще, билдить сам метамод необязательно, лишь бы сорсы лежали)
--hl2sdk-root это путь к папке, в которой лежит папка с sdk (то есть к родительской папке, а не к самой папке sdk)
--gen это генерация файла проекта под vs

По сути вам нужно поменять только --mms_path и --hl2sdk-root, так как у вас они отличаются.
Это тоже вольный перевод инструкции, которая лежит в папке с этим же плагином.

8.6) сборка как и в случае с метамодом, выполняется командой ambuild

9) тестирование плагина
9.1) в папке "S:\Code\xtest\s2_sample_mm\build\package" будет папка addons, которую нужно просто скопировать на сервер
9.2) активировать плагин можно через meta load sample, а отгрузить (это понадобится на случай обновления плагина) через meta unload sample
9.3) список плагинов - meta list

10) редактирование тестового плагина
10.1) в s2_sample_mm/build будет заботливо лежать "sample_mm.vcxproj". я редактировал файл в vs, а компилировал через консольку как в шаге 8.6, вообще я нуб и понятия не имею как настроить visual studio, но она здорово помогает подсказками. она предложит что-то проапгрейдить в проекте, я бы этого делать не стал.
Посмотреть вложение 114548
10.2) первым делом я пошёл узнавать, как тут создавать команды. обработчик находится в районе "Hook_ClientCommand". вообще там уже есть готовый код, который может вам помочь.
10.3) немного покопавшись в предоставленном нам апи, получилось родить следующий, простенький код с целью узнать стим игрока по его клиентскому номеру на сервере (из команды status):

узнаём стим айди игрока:
void SamplePlugin::Hook_ClientCommand( CPlayerSlot slot, const CCommand &args )
{
    auto cmd = args.GetCommandString();
    auto first = args[0];

    g_SMAPI->ConPrintf("[Test] Command from %d: \"%s\", first arg: \"%s\" \n", slot, cmd, first);
    g_SMAPI->ClientConPrintf(slot, "[Test] Your command: \"%s\" \n", first);

    if (strcmp(first, "get_steamid") == 0)
    {
        int slotid = std::stoi(args[1]);
        auto userid = engine->GetPlayerUserId(slotid).Get();

        if (userid == -1)
        {
            g_SMAPI->ClientConPrintf(slot, "[Test] No valid player at SlotID (%d) \n", slotid);
        }
        else
        {
            auto steamid = engine->GetPlayerNetworkIDString(slotid);
            auto name = engine->GetClientConVarValue(slotid, "name");
            g_SMAPI->ClientConPrintf(slot, "[Test] Player at SlotID (%d): SteamID: %s, UserID %d, Name %s \n", slotid, steamid, userid, name);
        }
    }
}

10.4) результат:
Посмотреть вложение 114547

Также хотел получить доступ к интерфейсу IPlayerInfoManager и IPlayerInfo, как это сделано в тестовом плагине под Source1, но столкнулся с "Could not find interface: PlayerInfoManager002", жаль по идее это бы открыло побольше возможностей.

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

  • Можно было бы автоматизировать процесс сборки, загрузки на сервер, выгрузки текущего плагина и подгрузки новой версии. Интересно как это сделали в сорсмоде. Но вообще, это вполне возможно.
  • По идее, несмотря на то что много людей в обсуждениях на аллиед проголосовало за JS, думаю разработчикам гораздо проще восстановить SDK для кс2 и просто использовать SM дальше (и соответственно SourcePawn). Удивительно сколько "стандартных" систем предоставляет сорсмод, та же система админов, флагов, команд, и многого другого. В случае перехода на JS придётся это всё пилить с нуля.
  • Поначалу я вообще задумался, зачем делали сорспавн если он по сути вызывает аналогичные функции из плюсов, и можно было бы всем писать те же плагины для метамода.. но потыкав плюсы примерно час, стало понятно, почему.
Такой проблемс появляетcя на пункте 7.3 при установке ласт версии сурсов билдера:
1696154876851.png
Если ставлю релизную версию 2.1, пишет что надо выше 2.2:
1696154719591.png
Дальше этого дело соответственно не двигается
Оффтоп
 

xtance

Участник
Сообщения
513
Реакции
743
@Palonez, есть предположение, что это из-за второго питона, у меня был 3.х
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
@Palonez, есть предположение, что это из-за второго питона, у меня был 3.х
У меня питон версии 3.11 вроде
Я не знаю, почему там 27 пишет,я видел что минималки там от 3.3 версии

UPD: при установке не изменился путь в path с 27 на 311 и перепутал переменные MMSOURCE_DEV HL2SDKCS2 и их значения местами
 
Последнее редактирование:

Pisex

Участник
Сообщения
172
Реакции
155
Компиляция MetaMod и тестового плагина под MetaMod.
По сути это вольный перевод инструкций с wiki.alliedmods.net на русский язык. Ну может кому и поможет.
Экспериментировал на десятой винде.

0) Установить git, python не ниже 3.3, а так же Visual Studio и build tools (я ставил 2022ые, наверно можно и другие).
1) Создать папку, где будем работать. У меня это S:\Code\xtest (вы можете адаптировать пути под себя).
2) Открыть в ней консоль (win+r -> cmd, или shift+пкм будучи в папке)

3) Скачать metamod:
git clone --recursive https://github.com/alliedmodders/metamod-source.git
4) Скачать sdk для cs2:
git clone --branch cs2 https://github.com/alliedmodders/hl2sdk.git hl2sdk-cs2

5) Настроить Windows:

5.1) зайти в "переменные окружения"
5.2) создать следующие переменные в "системных переменных":

(имя - значение)
MMSOURCE_DEV S:\Code\xtest\metamod-source
HL2SDKCS2 S:\Code\xtest\hl2sdk-cs2

5.3) разумеется надо адаптировать пути под ваши папки. по итогу должно получиться как на скрине
Посмотреть вложение 114544

6) поставить амбилд:
git clone --recursive https://github.com/alliedmodders/ambuild.git
pip install ./ambuild

6.1) вот эта команда с pip у меня не сработала, хотя и написана в официальной инструкции. решение проблемы:
6.2) открыть cmd от админа, перейти в нашу рабочую папку, в моём случае - переключиться на диск (S:), затем cd Code\xtest\ambuild
6.3) зайти в папку с амбилд - cd ambuild
6.4) выполнить - python setup.py install

7) сбилдить метамод:
7.1) вернуться в рабочую папку, после чего в папку метамода - cd metamod-source
7.2) создать папку где будет сборка - mkdir build , затем cd build
7.3) выполнить конфигурацию, хз как ещё это назвать - python ../configure.py --sdks cs2 --targets x86_64
7.4) собрать командой - ambuild
7.5) если всё ок, то готовый метамод будет в папке S:\Code\xtest\metamod-source\build\package
7.6) проверить работоспособность метамода, установив его в сервер согласно гайду от Palonez: [Source 2] Скриптинг?
7.7) от себя добавлю то, что после обновления ксго этот файл перезаписывается. В самом файле указано, что надо добавлять строчки в csgo_core/gameinfo.gi (а не csgo), однако у меня это не заработало.

8) сбилдить наш тестовый плагин для метамода:
8.1) скопировать в рабочую папку готовый пример, лежащий в "metamod-source/samples/s2_sample_mm". ну, для удобства и чтобы всё лежало рядом:
Посмотреть вложение 114545
8.2) открыть "x64 native tools command prompt for vs 2022". если их нет, вероятно не скачаны нужные инструменты в установщике визуал студии.
Посмотреть вложение 114546
8.3) зайти в папку проекта (S:, затем cd Code\xtest\s2_sample_mm)
8.4) создать папку где будет сборка - mkdir build , затем cd build
8.5) конфигурация:
python ../configure.py --plugin-name=sample_mm --plugin-alias=sample -s cs2 --targets=x86_64 --mms_path=S:\Code\xtest\metamod-source --hl2sdk-root=S:\Code\xtest --gen=vs

--plugin-name это имя плагина
--plugin-alias это ещё одно имя
-s это sdk под которую собираем
--targets это платформа под которую собираем
--mms_path это путь к исходникам метамода (которые мы скачали ранее. вообще, билдить сам метамод необязательно, лишь бы сорсы лежали)
--hl2sdk-root это путь к папке, в которой лежит папка с sdk (то есть к родительской папке, а не к самой папке sdk)
--gen это генерация файла проекта под vs

По сути вам нужно поменять только --mms_path и --hl2sdk-root, так как у вас они отличаются.
Это тоже вольный перевод инструкции, которая лежит в папке с этим же плагином.

8.6) сборка как и в случае с метамодом, выполняется командой ambuild

9) тестирование плагина
9.1) в папке "S:\Code\xtest\s2_sample_mm\build\package" будет папка addons, которую нужно просто скопировать на сервер
9.2) активировать плагин можно через meta load sample, а отгрузить (это понадобится на случай обновления плагина) через meta unload sample
9.3) список плагинов - meta list

10) редактирование тестового плагина
10.1) в s2_sample_mm/build будет заботливо лежать "sample_mm.vcxproj". я редактировал файл в vs, а компилировал через консольку как в шаге 8.6, вообще я нуб и понятия не имею как настроить visual studio, но она здорово помогает подсказками. она предложит что-то проапгрейдить в проекте, я бы этого делать не стал.
Посмотреть вложение 114548
10.2) первым делом я пошёл узнавать, как тут создавать команды. обработчик находится в районе "Hook_ClientCommand". вообще там уже есть готовый код, который может вам помочь.
10.3) немного покопавшись в предоставленном нам апи, получилось родить следующий, простенький код с целью узнать стим игрока по его клиентскому номеру на сервере (из команды status):

узнаём стим айди игрока:
void SamplePlugin::Hook_ClientCommand( CPlayerSlot slot, const CCommand &args )
{
    auto cmd = args.GetCommandString();
    auto first = args[0];

    g_SMAPI->ConPrintf("[Test] Command from %d: \"%s\", first arg: \"%s\" \n", slot, cmd, first);
    g_SMAPI->ClientConPrintf(slot, "[Test] Your command: \"%s\" \n", first);

    if (strcmp(first, "get_steamid") == 0)
    {
        int slotid = std::stoi(args[1]);
        auto userid = engine->GetPlayerUserId(slotid).Get();

        if (userid == -1)
        {
            g_SMAPI->ClientConPrintf(slot, "[Test] No valid player at SlotID (%d) \n", slotid);
        }
        else
        {
            auto steamid = engine->GetPlayerNetworkIDString(slotid);
            auto name = engine->GetClientConVarValue(slotid, "name");
            g_SMAPI->ClientConPrintf(slot, "[Test] Player at SlotID (%d): SteamID: %s, UserID %d, Name %s \n", slotid, steamid, userid, name);
        }
    }
}

10.4) результат:
Посмотреть вложение 114547

Также хотел получить доступ к интерфейсу IPlayerInfoManager и IPlayerInfo, как это сделано в тестовом плагине под Source1, но столкнулся с "Could not find interface: PlayerInfoManager002", жаль по идее это бы открыло побольше возможностей.

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

  • Можно было бы автоматизировать процесс сборки, загрузки на сервер, выгрузки текущего плагина и подгрузки новой версии. Интересно как это сделали в сорсмоде. Но вообще, это вполне возможно.
  • По идее, несмотря на то что много людей в обсуждениях на аллиед проголосовало за JS, думаю разработчикам гораздо проще восстановить SDK для кс2 и просто использовать SM дальше (и соответственно SourcePawn). Удивительно сколько "стандартных" систем предоставляет сорсмод, та же система админов, флагов, команд, и многого другого. В случае перехода на JS придётся это всё пилить с нуля.
  • Поначалу я вообще задумался, зачем делали сорспавн если он по сути вызывает аналогичные функции из плюсов, и можно было бы всем писать те же плагины для метамода.. но потыкав плюсы примерно час, стало понятно, почему.
Есть немного более правильный вариант реализации в котором команда отображается в консоли и не пишет неизвестная команда
1696173325905.png
1696173339202.png


C-подобный:
CON_COMMAND_EXTERN(get_steamid, SampleCommand, "Sample");
void SampleCommand(const CCommandContext& context, const CCommand& args)
{
    auto cmd = args.GetCommandString();
    auto first = args[0];
    auto slot = context.GetPlayerSlot();

    g_SMAPI->ConPrintf("[Test] Command from %d: \"%s\", first arg: \"%s\" \n", slot, cmd, first);
    g_SMAPI->ClientConPrintf(slot, "[Test] Your command: \"%s\" \n", first);

    int slotid = std::stoi(args[1]);
    auto userid = engine->GetPlayerUserId(slotid).Get();

    if (userid == -1)
    {
        g_SMAPI->ClientConPrintf(slot, "[Test] No valid player at SlotID (%d) \n", slotid);
    }
    else
    {
        auto steamid = engine->GetPlayerNetworkIDString(slotid);
        auto name = engine->GetClientConVarValue(slotid, "name");
        g_SMAPI->ClientConPrintf(slot, "[Test] Player at SlotID (%d): SteamID: %s, UserID %d, Name %s \n", slotid, steamid, userid, name);
    }
}
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Инструкция для тех, кто все таких хочет пописать плагины на Lua в текущих реалиях (easy patching vscript.dll)
 
Последнее редактирование:
  • Мне нравится
Реакции: Lev

xstage

🏹
Сообщения
726
Реакции
754
Инструкция для тех, кто все таких хочет пописать плагины на Lua в текущих реалиях*** Скрытый текст не может быть процитирован. ***
Выше уже кидали патчер
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Выше уже кидали патчер
Мб кому-то будет проще так
Сообщения автоматически склеены:

Компиляция MetaMod и тестового плагина под MetaMod.
По сути это вольный перевод инструкций с wiki.alliedmods.net на русский язык. Ну может кому и поможет.
Экспериментировал на десятой винде.

0) Установить git, python не ниже 3.3, а так же Visual Studio и build tools (я ставил 2022ые, наверно можно и другие).
1) Создать папку, где будем работать. У меня это S:\Code\xtest (вы можете адаптировать пути под себя).
2) Открыть в ней консоль (win+r -> cmd, или shift+пкм будучи в папке)

3) Скачать metamod:
git clone --recursive https://github.com/alliedmodders/metamod-source.git
4) Скачать sdk для cs2:
git clone --branch cs2 https://github.com/alliedmodders/hl2sdk.git hl2sdk-cs2

5) Настроить Windows:

5.1) зайти в "переменные окружения"
5.2) создать следующие переменные в "системных переменных":

(имя - значение)
MMSOURCE_DEV S:\Code\xtest\metamod-source
HL2SDKCS2 S:\Code\xtest\hl2sdk-cs2

5.3) разумеется надо адаптировать пути под ваши папки. по итогу должно получиться как на скрине
Посмотреть вложение 114544

6) поставить амбилд:
git clone --recursive https://github.com/alliedmodders/ambuild.git
pip install ./ambuild

6.1) вот эта команда с pip у меня не сработала, хотя и написана в официальной инструкции. решение проблемы:
6.2) открыть cmd от админа, перейти в нашу рабочую папку, в моём случае - переключиться на диск (S:), затем cd Code\xtest\ambuild
6.3) зайти в папку с амбилд - cd ambuild
6.4) выполнить - python setup.py install

7) сбилдить метамод:
7.1) вернуться в рабочую папку, после чего в папку метамода - cd metamod-source
7.2) создать папку где будет сборка - mkdir build , затем cd build
7.3) выполнить конфигурацию, хз как ещё это назвать - python ../configure.py --sdks cs2 --targets x86_64
7.4) собрать командой - ambuild
7.5) если всё ок, то готовый метамод будет в папке S:\Code\xtest\metamod-source\build\package
7.6) проверить работоспособность метамода, установив его в сервер согласно гайду от Palonez: [Source 2] Скриптинг?
7.7) от себя добавлю то, что после обновления ксго этот файл перезаписывается. В самом файле указано, что надо добавлять строчки в csgo_core/gameinfo.gi (а не csgo), однако у меня это не заработало.

8) сбилдить наш тестовый плагин для метамода:
8.1) скопировать в рабочую папку готовый пример, лежащий в "metamod-source/samples/s2_sample_mm". ну, для удобства и чтобы всё лежало рядом:
Посмотреть вложение 114545
8.2) открыть "x64 native tools command prompt for vs 2022". если их нет, вероятно не скачаны нужные инструменты в установщике визуал студии.
Посмотреть вложение 114546
8.3) зайти в папку проекта (S:, затем cd Code\xtest\s2_sample_mm)
8.4) создать папку где будет сборка - mkdir build , затем cd build
8.5) конфигурация:
python ../configure.py --plugin-name=sample_mm --plugin-alias=sample -s cs2 --targets=x86_64 --mms_path=S:\Code\xtest\metamod-source --hl2sdk-root=S:\Code\xtest --gen=vs

--plugin-name это имя плагина
--plugin-alias это ещё одно имя
-s это sdk под которую собираем
--targets это платформа под которую собираем
--mms_path это путь к исходникам метамода (которые мы скачали ранее. вообще, билдить сам метамод необязательно, лишь бы сорсы лежали)
--hl2sdk-root это путь к папке, в которой лежит папка с sdk (то есть к родительской папке, а не к самой папке sdk)
--gen это генерация файла проекта под vs

По сути вам нужно поменять только --mms_path и --hl2sdk-root, так как у вас они отличаются.
Это тоже вольный перевод инструкции, которая лежит в папке с этим же плагином.

8.6) сборка как и в случае с метамодом, выполняется командой ambuild

9) тестирование плагина
9.1) в папке "S:\Code\xtest\s2_sample_mm\build\package" будет папка addons, которую нужно просто скопировать на сервер
9.2) активировать плагин можно через meta load sample, а отгрузить (это понадобится на случай обновления плагина) через meta unload sample
9.3) список плагинов - meta list

10) редактирование тестового плагина
10.1) в s2_sample_mm/build будет заботливо лежать "sample_mm.vcxproj". я редактировал файл в vs, а компилировал через консольку как в шаге 8.6, вообще я нуб и понятия не имею как настроить visual studio, но она здорово помогает подсказками. она предложит что-то проапгрейдить в проекте, я бы этого делать не стал.
Посмотреть вложение 114548
10.2) первым делом я пошёл узнавать, как тут создавать команды. обработчик находится в районе "Hook_ClientCommand". вообще там уже есть готовый код, который может вам помочь.
10.3) немного покопавшись в предоставленном нам апи, получилось родить следующий, простенький код с целью узнать стим игрока по его клиентскому номеру на сервере (из команды status):

узнаём стим айди игрока:
void SamplePlugin::Hook_ClientCommand( CPlayerSlot slot, const CCommand &args )
{
    auto cmd = args.GetCommandString();
    auto first = args[0];

    g_SMAPI->ConPrintf("[Test] Command from %d: \"%s\", first arg: \"%s\" \n", slot, cmd, first);
    g_SMAPI->ClientConPrintf(slot, "[Test] Your command: \"%s\" \n", first);

    if (strcmp(first, "get_steamid") == 0)
    {
        int slotid = std::stoi(args[1]);
        auto userid = engine->GetPlayerUserId(slotid).Get();

        if (userid == -1)
        {
            g_SMAPI->ClientConPrintf(slot, "[Test] No valid player at SlotID (%d) \n", slotid);
        }
        else
        {
            auto steamid = engine->GetPlayerNetworkIDString(slotid);
            auto name = engine->GetClientConVarValue(slotid, "name");
            g_SMAPI->ClientConPrintf(slot, "[Test] Player at SlotID (%d): SteamID: %s, UserID %d, Name %s \n", slotid, steamid, userid, name);
        }
    }
}

10.4) результат:
Посмотреть вложение 114547

Также хотел получить доступ к интерфейсу IPlayerInfoManager и IPlayerInfo, как это сделано в тестовом плагине под Source1, но столкнулся с "Could not find interface: PlayerInfoManager002", жаль по идее это бы открыло побольше возможностей.

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

  • Можно было бы автоматизировать процесс сборки, загрузки на сервер, выгрузки текущего плагина и подгрузки новой версии. Интересно как это сделали в сорсмоде. Но вообще, это вполне возможно.
  • По идее, несмотря на то что много людей в обсуждениях на аллиед проголосовало за JS, думаю разработчикам гораздо проще восстановить SDK для кс2 и просто использовать SM дальше (и соответственно SourcePawn). Удивительно сколько "стандартных" систем предоставляет сорсмод, та же система админов, флагов, команд, и многого другого. В случае перехода на JS придётся это всё пилить с нуля.
  • Поначалу я вообще задумался, зачем делали сорспавн если он по сути вызывает аналогичные функции из плюсов, и можно было бы всем писать те же плагины для метамода.. но потыкав плюсы примерно час, стало понятно, почему.
Некоторым ребятам, я думаю не будет понятен пункт 7.4. Мне кажется стоит его расписать. У меня сборка допустим в таком виде выглядела C:\Users\USERNAME\AppData\Local\Programs\Python\Python311\Scripts\ambuild.exe, а кто-то даже не знает где этот ambuilder.exe и что речь идет конкретно о нем
 
Последнее редактирование:

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Там обнова вышла в CS2, вместе с ней и отключение возможности юзать Metamod т.к. перестали генерироваться полные пути. Решить можно прописав полный путь
1696287569178.png
 
Последнее редактирование:

September

Участник
Сообщения
5,238
Реакции
2,742
  • Команда форума
  • #60
Сверху Снизу