[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)
 
Последнее редактирование:

baks77

Участник
Сообщения
97
Реакции
3
Проект одного человека из китая, расширяющий lua api своими функциями написанными на c++
При помощи него можно:
  • Изменить кол-во патронов у оружия
  • Заспавнить игрока
  • Установить броню/хп
  • Получить информацию об оружии и само оружие, также выполнить с ним различные действия
  • Отправка персональных сообщений и общих
  • Изменение денег
  • Увеличение скорости
  • Добавление подсветки игроку
  • Получение индексов игроков
  • Кикнуть игрока
  • Работа с http(post/get)
I have no plan to support it because the workload for Linux is too much
essentially, you only need to change the offset address in Offset.h and Hooks.h and some Windows APIs to support it,
его ответ на вопрос про линуху) печаль.
Я в этих делах не селен, понимаю про что он примерно, но как без linux&)
 

Deraxus

Участник
Сообщения
190
Реакции
24
Ничего уже не понимаю, Lua scripting нормально работает и можно понемногу осваивать эту тему, или продолжать ждать чуда в лице sourcemod2? Как щас быть если хочется уже пробовать писать какие-то плагины для CS2?
Только не говорите читать всю тему, я почти все прочел, там каша
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Ничего уже не понимаю, Lua scripting нормально работает и можно понемногу осваивать эту тему, или продолжать ждать чуда в лице sourcemod2? Как щас быть если хочется уже пробовать писать какие-то плагины для CS2?
Только не говорите читать всю тему, я почти все прочел, там каша
Если хотите писать плагины, пишите их на c++ для метамода, в данный момент там намного больше возможностей чем в луа. Каша здесь - потому что нет чего то определенного, здесь именно поиск новых способов и их развитие, сейчас все пишут кто на чем может, пока нет устойчивой какой-то среды, которая более менее доступна всем и имеет необходимые возможности для реализации
 
Последнее редактирование:

baks77

Участник
Сообщения
97
Реакции
3
ребят подскажите формулы расчета рангов в level rangs ... я вроде находил как там это расчитывается а щас не могу. Хотим с помошью обработки логов сделать стату, работать будем только с логами, и напрямую записывать в дб, речь не идет о решении , просто для поднятия интереса пойдет и так, пока более мудрые не сделают по науке. Может куском кода поделетесь. меня в целом расчеты интерисуют .
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Тут несколько крутых плагинов понавыходило на C#, работающих на CounterStrikeSharp и у людей стал появляться к нему больший интерес, нежели к плюсам(я так заметил)

Ресурс: GitHub - roflmuffin/CounterStrikeSharp: CounterStrikeSharp allows you to write server plugins in C# for Counter-Strike 2/Source2/CS2
Его апи: CounterStrikeSharp/managed/CounterStrikeSharp.API at main · roflmuffin/CounterStrikeSharp
Дока к нему: CounterStrikeSharp
Готовые билды: Build & Publish · Workflow runs · roflmuffin/CounterStrikeSharp
Русскоязычная инструкция о том, как это установить и с чего стоит начать перед написанием плагинов: Работа с CounterStrikeSharp

Пока что работает только на Linux
Насчет поддержки Windows - неизвестно. Но эта проблема на карандаше и возможно когда-нибудь будет решена

Что может этот ресурс?
Примеры плагинов:
 
Последнее редактирование:

oleg_nelasy

Участник
Сообщения
664
Реакции
46
@Palonez, не совсем понял как инсталировать на сервер? Подключать через мм?
 

part1zan174

Участник
Сообщения
18
Реакции
3
Последнее редактирование:

R0mz1k

Участник
Сообщения
5
Реакции
1
Одному написал в личку ,он мне ответит что на муарене нельзя эти плагины установить!Может скажет кто возможно ли поставить на хостинг ?
Уверен, что в скором времени там такая возможность появится. По крайней мере можете написать им в тех. поддержку и узнать когда такая возможность появится.
 

baks77

Участник
Сообщения
97
Реакции
3
Тут несколько крутых плагинов понавыходило на C#, работающих на CounterStrikeSharp и у людей стал появляться к нему больший интерес, нежели к плюсам(я так заметил)

Ресурс: GitHub - roflmuffin/CounterStrikeSharp: CounterStrikeSharp allows you to write server plugins in C# for Counter-Strike 2/Source2/CS2
Его апи: CounterStrikeSharp/managed/CounterStrikeSharp.API at main · roflmuffin/CounterStrikeSharp
Дока к нему: CounterStrikeSharp
Готовые билды: Build & Publish · Workflow runs · roflmuffin/CounterStrikeSharp
Русскоязычная инструкция о том, как это установить и с чего стоит начать перед написанием плагинов: Работа с CounterStrikeSharp

Пока что работает только на Linux
Насчет поддержки Windows - неизвестно. Но эта проблема на карандаше и возможно когда-нибудь будет решена

Что может этот ресурс?
Примеры плагинов:
я бы предложил добавить в примеры) GitHub - partiusfabaa/cs2-MiniAdmin: Adds basic administrator functions мини админку.
 

norice

Не креативный создатель
Сообщения
137
Реакции
55
Или я дурак, или хз. А как скачать то CounterStrikeSharp?
Я перехожу по ссылке от куда скачать, а там вижу это:
1699161891652.png

Сообщения автоматически склеены:

Или я дурак, или хз. А как скачать то CounterStrikeSharp?
Я перехожу по ссылке от куда скачать, а там вижу это:
1699161891652.png
Я дурак, сначала спросил, а потом нашел. Если у кого-то будут такие же вопросы, то выбираем последний билд вверху, а потом листаем в самый низ. Там будут файлы для скачивания
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Тут несколько крутых плагинов понавыходило на C#, работающих на CounterStrikeSharp и у людей стал появляться к нему больший интерес, нежели к плюсам(я так заметил)

Ресурс: GitHub - roflmuffin/CounterStrikeSharp: CounterStrikeSharp allows you to write server plugins in C# for Counter-Strike 2/Source2/CS2
Его апи: CounterStrikeSharp/managed/CounterStrikeSharp.API at main · roflmuffin/CounterStrikeSharp
Дока к нему: CounterStrikeSharp
Готовые билды: Build & Publish · Workflow runs · roflmuffin/CounterStrikeSharp
Русскоязычная инструкция о том, как это установить и с чего стоит начать перед написанием плагинов: Работа с CounterStrikeSharp

Пока что работает только на Linux
Насчет поддержки Windows - неизвестно. Но эта проблема на карандаше и возможно когда-нибудь будет решена

Что может этот ресурс?
Примеры плагинов:
Спешу многих обрадовать. Особенно это касается разработчиков на Windows. Теперь CounterStrikeSharp доступен для запуска на Windows
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Так же можно сказать и о js, да и порог вхождения в нем меньше чем в c#. Но лично мне c# будет ближе
Я бы не сказал, что меньше. Тут все от человека зависит.

А есть какие свидетельства, что Source2Mod вообще в разработке?
Не удивлюсь, если CSS переименуют в S2M. Про вторую часть я тоже нечего дельного не слышал
 

baks77

Участник
Сообщения
97
Реакции
3
Я бы не сказал, что меньше. Тут все от человека зависит.


Не удивлюсь, если CSS переименуют в S2M. Про вторую часть я тоже нечего дельного не слышал
Подскажи пожалуйста как компилировать плагины для шарпа.
Хочется переделать работу мини админ и вип на базу от sb. Хотя бы частично. Ибо интеграций ждать со стороны gamecms не приходится.
Еще предложение, может вынесем в отдельную ветку css ? ТАм в дискорде плагинов поднасыпали. Может делиться и обсуждать их?

П.С. Может у кого еще так мысли сходятся, может скооперируемся для решения. Или выслушаю ваши мысли по этому поводу.
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Подскажи пожалуйста как компилировать плагины для шарпа.
Хочется переделать работу мини админ и вип на базу от sb. Хотя бы частично. Ибо интеграций ждать со стороны gamecms не приходится.
Еще предложение, может вынесем в отдельную ветку css ? ТАм в дискорде плагинов поднасыпали. Может делиться и обсуждать их?

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