Возвращает готовую строку из пакета отправленного сервером клиенту. Получить ответ от сервера в специальном формате строки.
get_response( flag )
Создает служебный файл игрового движка
-- Восстановление настроек запуска движка function goRecovery() ... -- Создание файла после некорректного выхода cl_exec( "createFileRecovery", "../cache.dat" ) end
Создает файл в данном случае cache.dat с текстом внутри:
recoveryMode=1
Сообщает игровому движку о файле
cl_exec( "declareRecovery", "../cache.dat" )
Получает назначенный файл от игрового движка
cl_exec( "getRecoveryFile" )
Создает временную задержку в миллисекундах
cl_exec( "wait", 100 )
Создает в потоке временную задержку (используется для снижения нагрузки на процессор)
cl_exec( "yield" )
Игровой движок завершает работу. Выход из приложения
cl_exec( "quitApp" )
Возвращает true или false при проверке на существование файла
cl_exec( "existsFile", filename )
Создает диалоговое окно с вопросом и отработкой кнопок
cl_exec( "msg", "Предыдущий запуск: MotionEngine завершился некорректно.\nЗапустить в безопасном режиме?\n\nЭто рекомендуется сделать большинству пользователей.", "Запустить в безопасном режиме?", "MB_YESNOCANCEL", "MB_ICONWARNING" )
-- Создание MessageBox messagebox = cl_exec( "msg", "Предыдущий запуск: MotionEngine завершился некорректно.\nЗапустить в безопасном режиме?\n\nЭто рекомендуется сделать большинству пользователей.", "Запустить в безопасном режиме?", "MB_YESNOCANCEL", "MB_ICONWARNING" ) -- 6, 7, 2 if(cl_exec( "getMsgID", messagebox ) == "IDYES") then cl_exec( "deleteFile", cl_exec( "getRecoveryFile" ) ) end if(cl_exec( "getMsgID", messagebox ) == "IDNO") then cl_exec( "deleteFile", cl_exec( "getRecoveryFile" ) ) end if(cl_exec( "getMsgID", messagebox ) == "IDCANCEL") then end
кусок кода из C++ (согласно: https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messagebox)
// Кнопки #define MB_ABORTRETRYIGNORE 0x00000002L #define MB_CANCELTRYCONTINUE 0x00000006L #define MB_HELP 0x00004000L #define MB_OK 0x00000000L #define MB_OKCANCEL 0x00000001L #define MB_RETRYCANCEL 0x00000005L #define MB_YESNO 0x00000004L #define MB_YESNOCANCEL 0x00000003L // Иконки #define MB_ICONEXCLAMATION 0x00000030L #define MB_ICONWARNING 0x00000030L #define MB_ICONINFORMATION 0x00000040L #define MB_ICONASTERISK 0x00000040L #define MB_ICONQUESTION 0x00000020L #define MB_ICONSTOP 0x00000010L #define MB_ICONERROR 0x00000010L #define MB_ICONHAND 0x00000010L
Возвращает строку. Преобразует число в ID события
cl_exec( "getMsgID", messagebox )
Аналог стандартной функции require (require). Для подключения модулей в отдельных потоках.
local ServerType = { name = "ExampleServer", version = "1.0" } function ServerType:greet() print( "Hello from " .. self.name ) end function ServerType:greet2() print( "Test from " .. self.name ) end return ServerType
local ServerType = cl_exec( "readTable" , "mp._servertype" ) for k, v in pairs( ServerType ) do print( "Key:", k, "Value:", v ) end
Подключение к серверу, указывается IP-адрес и порт. Возвращает integer:
cl_exec( "joinServer", "192.168.138.128", 28600 )
Производит отключение от сервера.
cl_exec( "disconnect" )
Рекомендуем использовать внутри условия isActiveServer, что активно подключение к серверу
if cl_exec( "isActiveServer" ) then -- тут end
Создает и отправляет пакет серверу
cl_exec( "createPacket", flag, int_table( _serverType, "LOW" ), "getPosition()" )
Рекомендуем использовать внутри условия isActiveServer
if cl_exec( "isActiveServer" ) then -- тут end
Возвращает текущего игрока (за которого мы играем!) а именно его ID в модуле сервера
cl_exec( "getActivePlayer" )
Рекомендуем использовать внутри условия isActiveServer. Возвращать функция может ID строку либо пустая строка.
if cl_exec( "isActiveServer" ) then -- тут end
Возвращает:
if cl_exec( "isActiveServer" ) then ... end
Задает режим игровому движку. Используется для создания новых объектов моделей на сцене. Функция устаревшая (не понятно работает или нет)
cl_exec( "PropsLoading", <integer> )
Добавляет в список для дальнейшего удаления объекта. После добавления необходимо произвести удаление с помощью функции PropProcessRemove
cl_exec( "PropRemove", "db07dc8054b761be7db7e22227cc2787" )
Удаляет объекты со сцены. Смотрите функцию PropProcessRemove
cl_exec( "PropProcessRemove" )
Добавляет в список для дальнейшего создания объекта. После добавления необходимо произвести создание моделей с помощью функции propProcessCreate. Функция возвращает ID нового объекта.
Создается одна модель:
modelpic = cl_exec( "propCreate", 0, -- слой foundFile[i], -- файл mep-модели "", -- скин "0.0;0.0;0.0", -- позиция XYZ "-90.0;0.0;90.0", -- поворот XYZ 0.1 -- масштаб ) cl_exec( "propProcessCreate" )
Добавляет в список для дальнейшего создания объекта. После добавления необходимо произвести создание моделей с помощью функции propProcessCreate. Существует другой аналог функции propCreateId, propCreate которая возвращает случайный ID новой 3д-модели
Создается одна модель:
cl_exec( "propCreateId", 0, -- слой "db07dc8054b761be7db7e22227cc2787", -- id-объекта "bed_05.mep", -- файл mep-модели "bed_03_blanket.ME2.s0.mtx", -- скин "0.0;0.0;0.0", -- позиция XYZ "-90.0;0.0;90.0", -- поворот XYZ 0.1 -- масштаб ) cl_exec( "propProcessCreate" )
Создает объекты на сцене. Смотрите функцию propCreate и propCreateId
cl_exec( "propProcessCreate" )
Изменяет трансформацию объекта на сцене
cl_exec( "propTransform", "db07dc8054b761be7db7e22227cc2787", string.format("%.2f;%.2f;%.2f", self.x, (self.y-230), self.z), string.format("%.2f;%.2f;%.2f", -90.0, 0.0, ((-self.yaw)+180)), "0.1;0.1;0.1" )
Создает скриншот игрового движка
cl_exec( "goScreenshot", 0 )
Возвращает строку с данными base64 созданного скриншота (ранее создан с помощью goScreenshot)
scrnData = cl_exec( "getScreenshotData" )
Выводит сообщение одной строкой, либо выводит строки с расстоянием между собой (похоже на табуляцию \t) но одной строкой
обычный подход
print("[Lua] Test complete.") -- вывод: -- [Lua] Test complete.
вывод с помощью пробелов напоминающую табуляцию
print("test1", "test2", "test3") -- вывод: -- test1 test2 test3
Стандартная функция в языке программирования Lua. Можно использовать функцию как отдельный поток (thread)
обычное объявление функции
function fn1( var1 ) ... end
объявление одной строкой
fn1 = function(x) print(x) end
fn1( 11122 )
В Lua для i = 1 math.huge do создает цикл, который повторяется бесконечно, поскольку math.huge представляет собой наибольшее положительное число, которое может представить Lua, фактически действуя как бесконечность.
for i = 1, math.huge do print("Бесконечный цикл работает...") end
Механизм, позволяющий выполнять функции асинхронно и приостанавливать их выполнение на определённых этапах. В отличие от потоков, корутины не поддерживают параллелизм, но предоставляют удобный способ управлять асинхронным или частичным выполнением кода.
co1 = coroutine.create(function () tes = 1 while true do print("co1 " .. tes) tes = tes + 1 coroutine.yield() -- Приостанавливаем выполнение корутины tes = tes + 1 end end) coroutine.resume(co1) -- запуск/возобновление coroutine.resume(co1) coroutine.resume(co1)
вывод:
-- Создаем корутину co1 = coroutine.create(function () tes = 1 -- начальное значение while true do -- бесконечный цикл print("co1 " .. tes) -- вывод: 1, 3, 5... tes = tes + 1 -- увеличиваем на 1 coroutine.yield() -- стоп, ждём resume tes = tes + 1 -- продолжаем, увеличиваем ещё на 1 end end) -- Запускаем/возобновляем корутину 3 раза coroutine.resume(co1) -- Вывод: co1 1 coroutine.resume(co1) -- Вывод: co1 3 coroutine.resume(co1) -- Вывод: co1 5
1. Выполнение coroutine.resume(co1)
2. Выполнение coroutine.resume(co1)
3. Выполнение coroutine.resume(co1)
Создаёт отдельные последовательности выполнения кода, которые могут выполняться параллельно. Выполнение нескольких задач одновременно, существенно повышает производительность и реакцию программы.
отдельный поток
function test1() ... end -- вызов: thread( test1 )
отдельный поток с несколькими аргументами
function test1( var1, var2 ) ... end -- вызов: thread( function() test1(11, 22) end )
отдельный поток с использованием бесконечного цикла
function test1() while( true ) do ... yield() -- необходимо использовать задержку для избежания нагрузки на CPU end end -- вызов: thread( test1 )
Отдельный поток не может работать со стандартным require (require), альтернатива позволяет использовать таблицы (readTable). Также не умеет работать с глобальными metatable (решение: локальные metatable можно создавать)
local ServerType = require( "mp/_servertype" ) -- attempt to call a nil value (method '...')
Стандартная Lua функция, которая загружает модули (файлы со скриптами). Она делает следующее:
Пример создания модуля для require с последующим созданием переменной:
local TestModule = { KEY1 = 1, KEY2 = 10, KEY3 = 256 } return TestModule
Создание переменной в основном скрипте
local TestModule = require("mp/testmodule.lua")
Подключение скрипта
require("_utility")
Возвращает значение строки из таблицы в виде числа
int_table( <таблица>, <ключ> )
... local flag = int_table( _packetType, "PLAYER" ) ...
Возвращает значение строки из таблицы
str_table( <таблица>, <ключ> )
... local name = str_table( _tableTest, "PLAYER" ) ...
Выводит сообщение со строкой из таблицы
debug_str_table( <таблица>, <ключ> )
Выводит сообщение со всеми ключами и значениями
debug_table( <таблица> ) -- вывод -- Key: Firstname Value: Mark
Добавление нового значения в таблицу
add_table( <таблица>, <ключ> )
... add_table( players, _local ) ...
Возвращает строку позиции игрока в специальном формате (используется при передаче в пакет)
player_get_pos( <x>, <y>, <z>, <yaw>, <pitch> )
... -- присваиваем координаты нашего персонажа playerCurrent = player_get_pos( camera:getPosX(), -- x camera:getPosY(), -- y camera:getPosZ(), -- z camera:getYaw(), -- поворот camera:getPitch() -- наклон ) ...
Создает временную задержку в миллисекундах
wait( <мс> )
Создает в потоке временную задержку (используется для снижения нагрузки на процессор)
yield()
Случайное перемешивание значений таблицы
shuffle( <таблица> )