NAMELESS LUA API 2.1 — Minecraft 26.3 / Fabric

Скрипты: C:\NamelessDLC\client26_3\lua (или nameless.dataDir/lua).
UTF-8, .lua, Lua 5.2 (LuaJ Figura 3.0.8). Загрузка через Lua-раздел ClickGUI.
ЛКМ — загрузка/выгрузка, R — перезагрузка, ПКМ — настройки ui.*.
Автозапуска нет. Сначала установите JAR с Lua API 2.1.
Функции namespace вызываются через точку, методы handle — через двоеточие.
Массивы с 1, инвентарь с 0, цвета ARGB 0xAARRGGBB.
Нет произвольного доступа к Java, os/io/debug, файловой системе и сети.
require("helpers.name") загружает lua/helpers/name.lua внутри папки скриптов.

СОБЫТИЯ
load(), unload(), tick(), world(), key(integer), mouse(table),
render(table), render3d(table), gui_render(table), gui_mouse(table),
gui_scroll(table), gui_key(table), gui_char(string), gui_close().
events.on возвращает id; events.off снимает подписку.
render: width,height,partial_ticks; координаты framebuffer/2 при любом GUI scale.
render3d: partial_ticks; push(x,y,z) абсолютная точка мира, затем локальная геометрия.
gui_render: width,height,mouse_x,mouse_y,partial_ticks; тот же масштаб 2.
gui_mouse: x,y,button,action (1 press,0 release); gui_key: key,action.
gui_scroll: x,y,horizontal,vertical. gui_char — UTF-8 строка.
tick и таймеры выполняются только на тиках игрока в мире.
key — нажатия при закрытом GUI. Кодировка совместима с GLFW (Insert=260).
Для экрана используйте gui_key; Escape закрывает его и возвращает предыдущий экран.

СОБСТВЕННЫЕ МОДУЛИ
local m=modules.create("My Module","RENDER","Description")
Категории COMBAT, MOVEMENT, PLAYER, OTHER, RENDER. Начальное состояние выключено.
Модуль регистрируется в ModuleManager, доступен через modules.get/list.
Стандартный ClickGUI показывает модуль и его настройки, bind переключает модуль.
m:on(event, callback) вызывает обработчик только во включённом состоянии.
m:on_enable(callback), m:on_disable(callback) возвращают handle.
m:boolean(name,default), m:slider(name,default,min,max[,step=1]),
m:choice(name,default,choices), m:color(name,argb) возвращают SettingHandle.
Обычные ModuleHandle: is_enabled(), set_enabled(bool), toggle(), get_key(),
set_key(code), settings(), setting(name).
SettingHandle: get([option]), set(value[,option]), info(), visible(), press().
Типы настроек, диапазоны и choices узнавайте через info(), не угадывайте.
Настройки модулей входят в стандартные конфиги клиента. ui.* и storage — в JSON скрипта.

HUD
hud.create(id,x,y,width,height,callback) возвращает handle:
position(), set_position(x,y), set_visible(bool), remove().
callback получает x,y,width,height,partial_ticks,editing.
HUD перетаскивается при открытом чате; позиция сохраняется в JSON этого скрипта.
Рисование callback использует абсолютные координаты e.x/e.y.

РЕНДЕР И РОТАЦИИ
render.* только в render, gui_render или callback HUD.
render3d.* рисование только в render3d; mesh можно создавать при загрузке.
3D-геометрия проходит тест глубины; это не режим рисования сквозь стены.
Каждый push закрывайте pop; стек сбрасывается между скриптами.
rotation.set обновляйте на tick; silent=true отделяет камеру от серверной ротации.
rotation.release освобождает свою ротацию. Сервер может корректировать действия.
Не запускайте конкурирующие скрипты ротаций и Aura без собственной координации.
Снимки player/world/entities — обычные таблицы; не обновляются автоматически.
world.players — загруженные игроки, не полный список игроков сервера.
player.get/world.info/entities.get могут возвращать nil; проверяйте результат.

ЖИЗНЕННЫЙ ЦИКЛ И ЛИМИТЫ
Скрипт выполняется на клиентском потоке. При unload/ошибке удаляются его модули,
HUD, callback, таймеры, собственный экран; принадлежащая ему ротация освобождается.
Изменения встроенных модулей, тем, конфигов и друзей не откатываются автоматически.
256 KiB исходника; 256 callback и таймеров; 200000 инструкций на вызов;
100 мс загрузка, 20 мс событие. Не используйте ожидание и бесконечные циклы.
32 модуля, 64 настройки на модуль, 32 HUD, 64 меша на скрипт;
4096 треугольников на меш, 30000 на 3D-кадр, 32 матрицы.

ФУНКЦИИ (из Java-регистраций)

ДРУГИЕ ИГРОКИ / ENTITYHANDLE (2.1)
entities.players({range=64}) — другие загруженные игроки, локальный исключён.
entities.nearest(options) — один подходящий игрок или nil; entities.query — любые сущности.
Фильтры: range 0..256, alive=true, visible=false, friends=true, spectators=false,
invisible=true, fov=360, include_self=false, players_only, living_only, type,
sort=distance/health/armor/angle, limit 1..512, predicate=function(handle) return bool end.
Фильтр friends=false исключает друзей; visible=true проверяет прямую видимость.
Методы EntityHandle читают АКТУАЛЬНУЮ сущность: get_health(), get_max_health(),
get_absorption(), get_total_health(), get_armor(), get_armor_toughness(),
get_equipment(), get_item(slot), get_effects(), get_position([partial_ticks=1]),
get_eye_position(), get_velocity(), get_bounds(), get_distance(), get_rotation(),
get_ping(), get_aim_point([options]), is_valid(), is_alive(), is_player(),
is_visible(), is_friend(), snapshot().
get_equipment(): head/chest/legs/feet/mainhand/offhand. Предмет: id,name,count,empty,
damage,max_damage,remaining_durability,durability_percent,enchanted.
get_armor() — очки брони, get_equipment() — надетые предметы, это разные данные.
get_velocity() — наблюдаемое перемещение за тик, в том числе удалённых игроков.
Начальные поля handle (health,armor,x и т.д.) — снимок. Используйте методы для обновления.
Handle проверяет id, UUID и текущий мир. После удаления/смены мира is_valid=false,
методы данных возвращают nil, проверки состояния false. Он не перепривяжется к другому id.
HP, броня и эффекты доступны в объёме, который сервер передал Minecraft-клиенту.

ПРОГРАММИРУЕМЫЕ РОТАЦИИ (2.1)
rotation.controller(options) — до 32 контроллеров на скрипт.
mode: spring (по умолчанию), linear, exponential или custom.
yaw_speed=360 и pitch_speed=180 — градусы/сек, acceleration=1440 — градусы/сек^2.
response=12 (0.01..120), damping=1 (0..4), silent=true, quantize=true, respect_owner=true.
point=nearest/center/eyes/chest/feet/relative; x/y/z 0..1 для relative.
prediction=0..5 тиков, partial_ticks=0..1, visible=true ищет доступную точку хитбокса.
update(entity_or_point[,dt=.05]) вычисляет и применяет. Вызовите в tick.
Повторный update за тот же тик не ускоряет поворот. Нет неявного автообновления.
calculate(target[,dt]) и step(yaw,pitch[,dt]) обновляют состояние без применения.
dt в секундах, 0.000001..0.25. reset([yaw,pitch]) обнуляет скорости и Lua-state.
release([smooth=true]) освобождает только ротацию этого контроллера.
state(): yaw,pitch,continuous_yaw,continuous_pitch,yaw_velocity,pitch_velocity,
initialized,owns_rotation,target_uuid,state. configure(options) меняет параметры.
respect_owner=true не перехватывает ротацию Aura/другого скрипта; результат blocked=true.
custom требует callback(context) -> {yaw,pitch}|nil.
Контекст: yaw,pitch,continuous_yaw,continuous_pitch,target_yaw,target_pitch,
delta_yaw,delta_pitch,yaw_velocity,pitch_velocity,dt,sensitivity,state,target,point.
state — постоянная Lua-таблица алгоритма; target — EntityHandle; point — {x,y,z}.
Возвращайте следующие углы; дополнительное сглаживание custom не навязывается.
nil пропускает применение. quantize=false отключает округление сетки мыши.
on_target_change=function(new_handle,previous_uuid) — необязательный callback.
Низкоуровневый rotation.apply применяет ваши углы без встроенного сглаживания.
rotation.trace проверяет попадание луча в хитбокс с учётом перекрывающего блока.
Примеры: other_players.lua, custom_target_rotation.lua.


events.on(event, callback) -> id
  Подписаться: load/unload/tick/render/render3d/key/mouse/world.

events.off(id) -> boolean
  Удалить свою подписку.

client.log(text)
  Сообщение в локальный чат с именем скрипта.

client.name() -> string
  Имя текущего Lua-файла.

client.version() -> string
  Версия Lua API.

client.in_game() -> boolean
  Загружены ли игрок и мир.

client.time() -> milliseconds
  Текущее время Unix в миллисекундах.

client.ticks() -> number
  Количество клиентских тиков после запуска LuaManager.

client.screen() -> string|nil
  Заголовок открытого экрана.

client.after(delay_ms, callback) -> id
  Одноразовый таймер, выполняемый на клиентском тике.

client.cancel(id) -> boolean
  Отменить таймер своего скрипта.

client.command(text) -> boolean
  Выполнить существующую локальную команду клиента с префиксом.

client.api() -> array
  Все зарегистрированные функции API с сигнатурами.

client.export_api()
  Обновить Lua_API.txt, включая все реальные модули и их настройки.

chat.print(text)
  Показать текст только локальному игроку.

chat.send(text)
  Отправить обычное сообщение на сервер.

chat.command(command)
  Отправить серверную команду, начальный / необязателен.

modules.list() -> array
  Все модули клиента; каждый элемент является ModuleHandle.

modules.get(name) -> ModuleHandle
  Получить любой модуль по имени, регистр и пробелы несущественны.

modules.enabled(name) -> boolean
  Состояние любого модуля.

modules.set_enabled(name, enabled)
  Включить/выключить любой зарегистрированный модуль.

modules.toggle(name)
  Вызвать штатное переключение или действие модуля.

settings.list(module) -> array
  Все настройки модуля как SettingHandle.

settings.get(module, setting [, option]) -> value
  Читать любую настройку; option — пункт MultiBooleanSetting.

settings.set(module, setting, value [, option])
  Записать настройку с проверкой типа, диапазона и допустимых значений.

settings.info(module, setting) -> table
  Имя, тип, значение, видимость, min/max/step либо choices.

settings.press(module, setting)
  Нажать настройку ButtonSetting.

player.get() -> table|nil
  Снимок игрока: координаты, поворот, здоровье, еда, скорость и состояния.

player.position() -> {x,y,z}
  Координаты игрока.

player.velocity() -> {x,y,z}
  Текущая скорость игрока.

player.set_velocity(x, y, z)
  Установить локальную скорость; сервер может её корректировать.

player.rotation() -> {yaw,pitch}
  Текущий поворот.

player.set_rotation(yaw, pitch)
  Повернуть локальную камеру, pitch ограничен -90..90.

player.jump()
  Обычный прыжок игрока.

player.set_sprinting(enabled)
  Установить состояние спринта.

player.set_sneaking(enabled)
  Установить локальное приседание.

player.effects() -> array
  Активные эффекты: id, amplifier, duration (тики).

player.target() -> table|nil
  Сущность под прицелом.

world.info() -> table|nil
  Измерение, игровое время и число игроков.

world.players() -> array
  Снимки всех загруженных игроков.

world.entities([radius=32]) -> array
  До 512 загруженных сущностей в радиусе 0..256 блоков.

world.block(x, y, z) -> table
  Состояние блока: id, air, hardness.

inventory.get(slot) -> table
  Слот инвентаря игрока, индекс начинается с 0.

inventory.list() -> array
  Все слоты игрока; запись содержит slot, id, name, count, damage, max_damage, empty.

inventory.selected() -> 0..8
  Выбранный слот хотбара.

inventory.select(slot)
  Выбрать слот хотбара 0..8.

inventory.count(item_id) -> number
  Количество предметов с точным registry-id.

inventory.click(slot, button [, action='PICKUP'])
  Штатный clickSlot открытого контейнера; индексы относятся к ScreenHandler.

inventory.container() -> table
  sync_id и список слотов открытого контейнера.

input.key_down(glfw_key) -> boolean
  Физическое состояние клавиши GLFW 32..348.

input.mouse_down(button) -> boolean
  Физическое состояние кнопки мыши 0..7.

input.mouse() -> {x,y}
  Курсор в координатах HUD с фиксированным GUI scale 2.

render.size() -> {width,height}
  Размер HUD в координатах фиксированного GUI scale 2.

render.rect(x,y,w,h,argb [,radius=0])
  Прямоугольник; только внутри render callback.

render.outline(x,y,w,h,thickness,argb [,radius=0])
  Обводка прямоугольника.

render.text(text,x,y,size,argb [,centered=false])
  Текст существующим SF Regular шрифтом клиента.

render.text_width(text,size) -> number
  Ширина текста; вызывать в render.

render.text_height(size) -> number
  Высота текста; вызывать в render.

render.glass(x,y,w,h,radius,argb,strength)
  Жидкое стекло, strength 0..100; только в render.

render.panel(x,y,w,h [,scale=1,alpha=1])
  Общий фон HUD с текущей темой и настройкой стекла.

render.line(x1,y1,x2,y2,thickness,argb)
  Линия поверх HUD.

render.circle(cx,cy,radius,argb)
  Круг поверх HUD.

render.gradient(x,y,w,h,radius,argb1,argb2 [,horizontal=false])
  Градиентная заливка.

render.with_clip(x,y,w,h,callback)
  Временный scissor; автоматически закрывается даже при ошибке.

render3d.push([x, y, z])
  С координатами — новая точка прямо в мире (абсолютные x,y,z); без — копия текущей матрицы. Закрывать через render3d.pop(); только в render3d.

render3d.pop()
  Вернуть матрицу, сохранённую последним render3d.push.

render3d.translate(x, y, z)
  Сдвиг в локальных осях текущей матрицы (блоки).

render3d.rotate_x(degrees)
  Поворот вокруг локальной оси X, градусы (правая система координат).

render3d.rotate_y(degrees)
  Поворот вокруг локальной оси Y (вверх), градусы.

render3d.rotate_z(degrees)
  Поворот вокруг локальной оси Z, градусы.

render3d.scale(sx [, sy, sz])
  Масштаб локальных осей; с одним числом — равномерный; отрицательное значение зеркалит.

render3d.shade(factor)
  Множитель яркости 0..2 для следующих рисунков; сбрасывается в начале каждого render3d.

render3d.triangle(x1,y1,z1, x2,y2,z2, x3,y3,z3, argb)
  Закрашенный треугольник в локальных координатах текущей матрицы; двусторонний, с глубиной и плоским освещением.

render3d.quad(x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4, argb)
  Четырёхугольник из двух треугольников (вершины по кругу).

render3d.mesh(vertices) -> id
  Создать меш из плоского массива: 9 чисел на треугольник (до 4096 треугольников, до 64 мешей на скрипт). Можно вызывать при загрузке.

render3d.draw(mesh_id, argb)
  Нарисовать меш в текущей матрице одним цветом.

render3d.light(x, y, z) -> 0..1
  Освещённость мира в точке: максимум из небесного света (с учётом времени суток и погоды) и света блоков.

render3d.camera() -> {x,y,z,yaw,pitch}
  Положение и поворот камеры (в том числе от третьего лица).

color.rgba(r,g,b [,a=255]) -> argb
  Собрать цвет из каналов 0..255.

color.alpha(argb,alpha) -> argb
  Заменить альфу (0..255).

color.mix(argb1,argb2,factor) -> argb
  Смешать каналы, factor 0..1.

theme.list() -> array
  Названия всех тем клиента.

theme.current() -> string
  Название активной темы.

theme.select(name)
  Выбрать существующую тему.

theme.color(slot) -> argb
  Цвет темы по имени слота: accent/background/outline/text/text2/hud/separator/light_bg/module_on/slider/common/button/esp.

theme.set_color(slot,argb)
  Изменить цвет; встроенная тема автоматически копируется и сохраняется.

theme.get(name) -> number|boolean
  opacity/blur/common_strength/hud_glass/clickgui_glass/shadow/distortion.

theme.set(name,value)
  Записать параметр темы; glass имеет диапазон 0..100; сохранить.

friends.list() -> array
  Список друзей клиента.

friends.contains(name) -> boolean
  Проверить друга.

friends.add(name) -> boolean
  Добавить друга и сохранить.

friends.remove(name) -> boolean
  Удалить друга и сохранить.

config.list() -> array
  Существующие конфиги клиента.

config.save(name) -> boolean
  Сохранить конфиг клиента.

config.load(name) -> boolean
  Загрузить конфиг клиента.

storage.get(key [,default]) -> value
  Читать значение настроек собственного скрипта.

storage.set(key,value)
  Сохранить собственное число/строку/boolean; зарегистрированные UI-настройки проверяются.

ui.boolean(name,default) -> value
  Создать boolean-настройку скрипта в Lua-колонке.

ui.slider(name,default,min,max) -> value
  Создать ползунок собственного скрипта.

ui.choice(name,default,choices) -> value
  Создать выбор из списка собственного скрипта.

ui.get(name) -> value
  Текущее значение UI-настройки скрипта.

ui.set(name,value)
  Изменить и сохранить UI-настройку скрипта.

modules.create(name [,category='OTHER', description='']) -> ModuleHandle
  Создать собственный модуль; до 32 на скрипт. Удаляется при выгрузке.

gui.open([title='Lua GUI'])
  Открыть собственный экран; рисование gui_render, ввод gui_mouse/gui_key/gui_char/gui_scroll, Escape закрывает.

gui.close()
  Закрыть экран своего скрипта.

gui.is_open() -> boolean
  Открыт ли экран этого скрипта.

gui.button(id,label,x,y,w,h) -> boolean
  Кнопка immediate-mode в gui_render; true один раз за клик. id — уникальное имя.

gui.checkbox(id,label,value,x,y,w) -> boolean
  Чекбокс в gui_render; возвращает новое значение, сохранение через ui.set/storage.set.

gui.slider(id,label,value,min,max,x,y,width) -> number
  Ползунок в gui_render; возвращает значение. Сохраняйте через ui.set/storage.set при изменении.

hud.create(id,x,y,width,height,callback) -> HudHandle
  Создать HUD с callback(event). handle:position(), :set_position(x,y), :set_visible(bool), :remove(). Перетаскивается в чате.

rotation.get() -> {yaw,pitch,camera_yaw,camera_pitch,active}
  Текущая серверная ротация и независимая камера.

rotation.look_at(x,y,z) -> {yaw,pitch}
  Рассчитать углы от глаз игрока до точки; не меняет поворот.

rotation.set(yaw,pitch [,silent=true,yaw_speed=180,pitch_speed=90])
  Поворот с ограничением скорости и сеткой чувствительности. silent=true использует CombatRotation. Обновлять в tick; release освобождает свою ротацию.

rotation.release([smooth=true])
  Освободить только ротацию этого скрипта. Вызывается автоматически при выгрузке.

rotation.sensitivity() -> number
  Размер шага чувствительности мыши в градусах.

entities.get(id) -> EntityHandle|nil
  Загруженная сущность: снимок полей и живые методы get_health/get_armor/get_equipment/snapshot/is_valid. nil вне мира или после удаления.

entities.visible(id) -> boolean
  Проверить прямую видимость от игрока до сущности.

world.raycast(x1,y1,z1,x2,y2,z2) -> table
  Трассировка блоков, до 256 блоков: hit,x,y,z,block_x,block_y,block_z,side.

client.window() -> table
  Размер framebuffer, GUI scale, FPS и фокус окна.

client.server() -> table|nil
  Имя и адрес текущего сервера; nil в одиночной игре и меню.

render3d.box(width,height,depth,argb)
  Закрашенный параллелепипед от локального (0,0,0); перед вызовом render3d.push(x,y,z).

entities.players([options]) -> EntityHandle[]
  Другие загруженные игроки, себя исключает по умолчанию. options: range,alive,visible,friends,spectators,invisible,fov,sort,limit,predicate,include_self.

entities.query([options]) -> EntityHandle[]
  Сущности с фильтрами как entities.players; players_only/living_only/type. sort: distance/health/armor/angle. Вне мира пустой массив.

entities.nearest([options]) -> EntityHandle|nil
  Ближайший другой игрок по тем же фильтрам; players_only=false разрешает другие типы.

entities.by_uuid(uuid) -> EntityHandle|nil
  Найти загруженную сущность по UUID. Handle безопасен при смене мира и повторном использовании id.

entities.by_name(name) -> EntityHandle|nil
  Найти другого загруженного игрока по точному имени без учёта регистра.

entities.aim_point(entity [,options]) -> {x,y,z}|nil
  Точка хитбокса: point=nearest/center/eyes/chest/feet/relative; x,y,z=0..1 для relative; prediction=0..5 тиков, partial_ticks=0..1, visible=true ищет видимую точку.

rotation.controller([options]) -> RotationController
  Контроллер spring/linear/exponential/custom: :update(target[,dt]), :calculate(target[,dt]), :step(yaw,pitch[,dt]), :reset([yaw,pitch]), :release([smooth]), :state(), :configure(options). Угловые скорости в градусах/сек.

rotation.apply(yaw,pitch [,options])
  Применить вычисленные Lua углы без скрытого сглаживания. options: silent=true,quantize=true. Для накопления долей мышиного шага используйте контроллер.

rotation.wrap(angle) -> number
  Нормализовать угол в [-180,180).

rotation.delta(from,to) -> number
  Кратчайшая знаковая разница углов, в том числе через -180/180.

rotation.lerp(from,to,factor) -> number
  Интерполяция угла по короткой дуге; factor 0..1.

rotation.direction(yaw,pitch) -> {x,y,z}
  Единичное направление по yaw/pitch в градусах.

rotation.angles(from,to) -> {yaw,pitch}
  Рассчитать углы между двумя {x,y,z}; независимо от локального игрока.

rotation.quantize(yaw,pitch,base_yaw,base_pitch [,step]) -> {yaw,pitch}
  Округлить углы на сетку мыши относительно базы. Для аккумуляции малых движений используйте controller.

rotation.trace(yaw,pitch,range [,entity]) -> table
  Проверить луч из глаз: block_hit,entity_hit,distance,x,y,z. entity — handle/id; entity_hit учитывает перекрытие блоком.

rotation.is_owner() -> boolean
  Принадлежит ли текущая ротация прямым вызовам этого скрипта. У controller есть свой state().owns_rotation.
