CS2 Lua API

panorama

Модуль panorama выполняет JavaScript в интерфейсе игры (Panorama): читает глобальные объекты JS, вызывает JS-функции и запускает свой JS-код в контексте панели.

Общие правила#

  • Вызывать только из игрового потока. Иначе ошибка panorama may only be used on the game main thread. Вызовы работают из кода файла, из задач utils.schedule и из событий pre_render, render, pre_movement, post_movement, createmove, post_data_update, override_view, mouse_input.
  • Контекст по умолчанию — корневая панель Hud: в нём ищутся глобалы panorama.<key> и выполняется panorama.loadstring без второго аргумента.
  • Ошибки JS в Lua не попадают: исключение выводится в консоль игры, а Lua получает nil.
  • Видны только перечислимые свойства. Через obj.ключ читаются собственные и унаследованные перечислимые свойства. Встроенные объекты Math, JSON, методы массивов и т. п. так не видны — получайте их через panorama.loadstring.
  • Панель удалена (смена карты, выход в меню) — ошибка panorama: the panel is no longer valid.
  • Если модуль не поддерживает текущую версию игры, любое обращение даёт ошибку panorama is unavailable: ....

Бесконечный цикл в JS-коде вешает интерфейс и игру. Проверяйте код перед запуском.

Преобразование типов#

JS → Lua
number number
boolean boolean
string и прочее string
object, function, array panorama.object
null, undefined, Symbol nil
Lua → JS (аргументы вызова)
boolean, number, string boolean, number, string
table новый объект; ключи и значения преобразуются рекурсивно
nil, функции, userdata (в т. ч. panorama.object) null

Таблица всегда становится объектом, а не массивом: {10, 20} превратится в {1: 10, 2: 20}. Объект panorama.object обратно в JS не передаётся — он станет null.

Глобалы и панели#

Глобальные объекты JS, доступные через panorama.<key>: $, GameStateAPI, MyPersonaAPI, FriendsListAPI, LobbyAPI, PartyListAPI, InventoryAPI, CompetitiveMatchAPI, GameInterfaceAPI, SteamOverlayAPI, MatchStatsAPI, MatchInfoAPI, NewsAPI, StoreAPI, UiToolkitAPI, PartyBrowserAPI, MissionsAPI, PredictionsAPI, TournamentsAPI, LeaderboardsAPI, OptionsMenuAPI, GameTypesAPI, EmbeddedStreamAPI и другие.

Корневые панели, доступные по id: CSGOHud, CSGOMainMenu, Hud, HudChat, MainMenu, CSGOLoadingScreen.

local persona = panorama.MyPersonaAPI
if persona then
    print("Имя профиля: ", persona.GetName())
end

print(panorama.CSGOHud)   -- panorama.panel

panorama.<key>#

Глобальный объект JS с именем key в контексте корневой панели. Если такого глобала нет — панель с id key.

Параметр Тип Описание
key string имя глобала JS или id панели

Возвращает: panorama.object, number, boolean, string, panorama.panel или nil.

local p = panorama.CSGOHud
print(p)   -- panorama.panel

local state = panorama.GameStateAPI
if state then print(state) end   -- panorama.object

panorama.loadstring(code: string, panel?: string)#

Компилирует JS-код в контексте панели и возвращает функцию. Код выполнится при её вызове. code — тело функции: переменные в нём локальны, результат возвращается через return.

Параметр Тип Описание
code string тело JS-функции
panel string id корневой панели, в чьём контексте выполнять; по умолчанию "Hud"

Возвращает: panorama.object (функция) или nil: панель не найдена, синтаксическая ошибка (текст — в консоли игры).

local fn = panorama.loadstring("return Math.floor(2.7) + 1;")
if fn then
    print(fn())   --> 3
end

-- Встроенные объекты JS получаются так
local stringify = panorama.loadstring("return function(o) { return JSON.stringify(o); };")
if stringify then
    print(stringify()({ a = 1 }))   --> {"a":1}
end

panel.<key>#

Глобальный объект JS в контексте этой панели. Свойства самой панели (id, стиль) так не читаются.

Параметр Тип Описание
key string имя глобала JS

Возвращает: panorama.object, number, boolean, string или nil.

local hud = panorama.CSGOHud
if hud then
    local api = hud.GameStateAPI
    print(api)
end

obj.<key> и obj[i]#

Свойство JS-объекта по имени или элемент массива по индексу. Индексы массивов — с 0, как в JS.

Параметр Тип Описание
key string имя свойства
i number индекс элемента, с 0

Возвращает: panorama.object, number, boolean, string или nil.

local get = panorama.loadstring("return { name: 'test', list: [10, 20, 30] };")
local obj = get and get()
if obj then
    print(obj.name, " ", obj.list[0], " ", obj.list[2])   --> test 10 30
end

#obj#

Значение свойства length объекта: длина массива или строки.

Возвращает: number или nil, если length нет.

local get = panorama.loadstring("return [1, 2, 3];")
local arr = get and get()
if arr then
    for i = 0, #arr - 1 do print(arr[i]) end
end

obj(...)#

Вызывает JS-функцию. this — объект, из которого функция была прочитана; иначе — глобальный объект контекста.

Параметр Тип Описание
... any аргументы, преобразуются по таблице «Lua → JS»

Возвращает: одно значение по таблице «JS → Lua»; nil, если объект не функция, JS бросил исключение или функция ничего не вернула.

Вызывайте методы JS через точку: api.Func(x). С двоеточием api:Func(x) первым аргументом уйдёт сам api, а он превратится в null.

-- Сообщение в консоль игры через $.Msg
local get_dollar = panorama.loadstring("return $;")
local dollar = get_dollar and get_dollar()
if dollar then
    dollar.Msg("Привет из Lua")
end

local add = panorama.loadstring("return function(a, b) { return a + b; };")
if add then
    print(add()(2, 3))   --> 5
end