Перейти к содержимому

Игровые массивы

Многие методы нативного API возвращают LuaArray<T>. Несмотря на имя в TypeScript, это не JavaScript-массив, а доступное только для чтения userdata игры.

  • допустимые индексы идут от 1 до Length;
  • свойства JavaScript .length нет;
  • pairs и обычные методы JavaScript-массивов не обходят значение напрямую;
  • запись в values[index] или values.Length отклоняется игрой.

Методы arrays генерируют правильные циклы с индексацией от единицы.

import { agents, arrays } from "@killscript/sdk/client";
const enemies = agents.enemies();
arrays.forEach(enemies, (enemy, index) => {
print(`${index}: ${enemy.Nickname}`);
});
const firstAlive = arrays.find(
enemies,
(enemy) => enemy.Stats.IsAlive,
);
const anyVisible = arrays.some(
enemies,
(enemy) => enemy.IsVisible,
);

Индекс в обработчике намеренно остаётся с единицы: он указывает позицию именно в нативной коллекции.

map, filter и toArray возвращают обычный TypeScript-массив, который в собранном скрипте представлен Lua-таблицей:

const living = arrays.filter(
enemies,
(enemy) => enemy.Stats.IsAlive,
);
const names = arrays.map(enemies, (enemy) => enemy.Nickname);
const count = living.length;

Массив должен оставаться плотным: преобразование в map() не должно возвращать undefined. В Lua это значение становится nil, создаёт пропуск и ломает надёжное определение длины. Если элемент нужно исключить, сначала используйте filter().

Копия полезна для дальнейших обычных операций с массивом, сохранения снимка или независимости от изменения исходной коллекции. Сами элементы всё ещё остаются нативными объектами — копируется только контейнер.

МетодРезультат
forEachПосещает каждое значение
sometrue, если подходит хотя бы одно значение
everytrue, если подходят все значения
findПервое подходящее значение или undefined
mapОбычный массив преобразованных значений
filterОбычный массив подходящих значений
toArrayПоверхностная копия в обычный массив
first / lastКрайнее значение или undefined

Небольшая реализация методов массивов добавляется в Lua, только если модуль использует хотя бы один из них. Для цепочек условий по игрокам смотрите Выборки игроков.