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.