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