Lua язык программирования samp

Руководство по использованию функций Lua в Samp: справочник для новичков

Lua является наиболее распространенным языком скриптования для SAMP (San Andreas Multiplayer). Он используется для написания скриптов, расширения функционала игрового процесса и создания плагинов. Данное руководство описывает основные функции Lua, которые могут быть использованы для создания скриптов в SAMP.

Установка Lua под SAMP

  1. Скачайте Lua с официального сайта: https://www.lua.org/download.html
  2. Распакуйте архив в папку, например: C:\lua
  3. Создайте папку «plugins» в корневой директории сервера SAMP
  4. Скопируйте файлы «lua_plugin.dll» и «samp.dll» из архива в папку «plugins» сервера SAMP

Основные функции Lua

print()

Функция print() используется для вывода на экран сообщения. Например:

Вывод на экран будет следующим:

tostring()

Функция tostring() преобразует любой объект в строку. Например:

local num = 42 local str = tostring(num) print(str) 

Вывод на экран будет следующим:

tonumber()

Функция tonumber() преобразует строку в число. Например:

local str = "42" local num = tonumber(str) print(num) 

Вывод на экран будет следующим:

string.sub()

Функция string.sub() используется для извлечения подстроки из строки. Например:

local str = "Lua is awesome!" local sub = string.sub(str, 1, 3) print(sub) 

Вывод на экран будет следующим:

string.len()

Функция string.len() возвращает длину строки. Например:

local str = "Lua is awesome!" local len = string.len(str) print(len) 

Вывод на экран будет следующим:

string.rep()

Функция string.rep() повторяет строку указанное количество раз. Например:

local str = "Lua is awesome! " local rep = string.rep(str, 3) print(rep) 

Вывод на экран будет следующим:

Lua is awesome! Lua is awesome! Lua is awesome! 

Заключение

Lua предоставляет множество функций для создания скриптов в SAMP. Для более подробной информации о возможностях и синтаксисе языка рекомендуется изучать документацию на официальном сайте Lua.

Источник

Гайд Написание скриптов на Lua [0.3.DL]

Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Вам необходимо обновить браузер или попробовать использовать другой.

heroku

Известный

Всем привет! В этой теме я бы хотел рассказать как можно писать скрипты для SA:MP 0.3.DL без использования SAMPFUNCS.

  1. Библиотека SA-MP API (Скачать) — Автор: @LUCHARE
  2. Желательно чистая GTA с установленным CLEO, ASI Loader, MoonLoader 0.26
  3. Руки из того места
local dl = require "lib.SA-MP API.init"
dl.GetIsAvailable() -- проверка на загруженность SA:MP dl.Get() -- загружает струкруты SA:MP 0.3.DL с которыми можно будет работать dl.SendChat(text) -- отправляет текст в чат (если это в text будет команда, он отправит команду) dl.ToggleCursor(toggle) -- включение/выключение рендера курсора dl.RegisterClientCommand(cmd, func, replaceOld) -- регистрирует команду для SA:MP 0.3.DL (всего может быть 144 клиентских команд) dl.DeleteClientCommand(cmd) -- удаляет команду по ее названию dl._RegisterClientCommand(cmd, func) -- регистрирует команду, в отличии от RegisterClientCommand, данная функция не может заменять команды dl.TakeScreenshot() -- делает скриншот dl.RequestSpawn() -- отправляет RPC о спавне игрока dl.Spawn() -- спавнит игрока dl.SetInputMode(mode, disable_cursor) -- открытие/закрытие строки ввода текста SAMP dl.UnlockActorCam() -- возвращает управление персонажем (использовать если скрыт курсор) dl.AddMessageToChat(msgType, msg, prefix, msgColor, prefixColor) -- отправляет сообщение в чат dl.UpdateScoreboardData()-- отправляет RPC UpdateScoreboardData dl.Say(msg) -- отправляет текст в чат dl.SendCommand(cmd) -- отправляет команду на сервер dl.SendInteriorChange(intID) -- отправляет RPC о смене интерьера dl.RequestClass(classID) -- отправляет RPC о смене класса dl.DisableScoreboard(enable) -- отключает Tab dl.SetSpecialAction(actionId) -- выдает игроку специальное действие
function main() while not dl.GetIsAvailable() do wait(100) end -- пока SAMP не будет загружен, ничего не произойдет end
dl.AddMessageToChat(4, "Hello men", "", 0xFFFFFF, 0xFFFFFF) -- 4 это тип сообщения, Hello men текст, "" префикс (не используется), и последнии два параметра цвет текст и префикса
dl.RegisterClientCommand("test_cmd", TEST_FUNCTION) function TEST_FUNCTION() dl.AddMessageToChat(4, "Ты использовал команду /test", "", 0xFFFFFF, 0xFFFFFF) end
local dl = require "lib.SA-MP API.init" act = false function main() while not dl.GetIsAvailable() do wait(100) end dl.RegisterClientCommand("nostun", NoStunAct) while true do wait(0) end end function NoStunAct() act = not act if act then setCharUsesUpperbodyDamageAnimsOnly(PLAYER_PED, 1) else setCharUsesUpperbodyDamageAnimsOnly(PLAYER_PED, 0) end end

Источник

Гайд Написание Lua скриптов для MoonLoader

Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Вам необходимо обновить браузер или попробовать использовать другой.

AnWu

Известный

moonloader.png

Начало разработки.
Каждый Lua скрипт при запуске создает поток «main» который и является основным местом работы со скриптом.
Сразу обговорим — скрипт «жив» пока «жив» поток main(), поэтому если мы хотим продолжать работать со скриптом после запуска — будем держать поток активным:

function main() -- Объявляем поток main() wait(-1) -- Устанавливаем бесконечное ожидание end -- закрываем функцию

Запускаем скрипт — работает!
Что ж, поставим себе цель — при запуске выводить сообщение «Привет мир» в чат.
Что нам для этого нужно?
Заходим на WIKI (Раздел «Функции» moonloader`a) и ищем функции чата — Поиск -> «Chat». Видим функцию sampAddChatMessage(message, color) — то что надо.
Вставляем:

function main() sampAddChatMessage("Привет мир!", 0xFFFFFFFF) -- Выводим сообщение в чат wait(-1) -- Устанавливаем бесконечное ожидание end
(error) test.lua: opcode '0AF8' call caused an unhandled exception

Бежим на WIKI (Опять раздел «Функции» moonloader`a) и в поиск вводим наш опкод «0AF8».
Находим нашу функцию sampAddChatMessage()
Что это значит? Дело в том что нельзя вызывать функции для работы с SA:MP пока сам SA:MP не готов. Что делать? Добавим перед выводом сообщения такой код:

if not isSampfuncsLoaded() or not isSampLoaded() then -- Если SF или SA:MP не загружены return -- Завершаем работу скрипта end while not isSampAvailable() do -- Ждём пока функция isSampAvailable() вернет true wait(0) -- Устанавливаем минимальное ожидание, что бы наша игра не зависла -- значение 0 говорит что мы ждём следующий кадр (Frame) end

Теперь наш скрипт будет ждать пока самп полностью не загрузится и продолжит выполнение кода.
Что такое wait() и с чем его едят?
Wait позволяет ставить поток в режим ожидания на указанное количество мили-секунд (ms)
Wait нельзя в CallBack-функциях, это приведет к ошибке, а в последствии и смерти, скрипта.
Почему мы ставим 0? Потому-что это минимальная задержка.

Подведем краткий итог кода:

function main() if not isSampfuncsLoaded() or not isSampLoaded() then return end while not isSampAvailable() do wait(0) end sampAddChatMessage("Привет мир!", 0xFFFFFFFF) wait(-1) end

Теперь при входе в игру / перезапуске скрипта в чат будет выводиться сообщение «Привет мир».
К списку вопросов

Взаимодействие с игроками
Перейдем к примерам посложнее — попробуем получить ник, ид и счет игрока в которого мы прицелились.
Цель поставили, какие нам нужны средства?
Опять бежим к WIKI, всё в тот же раздел функций и ищем функции связанные с целями, Поиск -> Target.
Смотрим в списке есть getCharPlayerIsTargeting(ped).
Она возвращает 2 значения — result, ped.
Первое значение — возвращает результат проверки на целится ли указанный Ped в кого-либо.
Второе — если указанный Ped целится — возвращает саму цель.
Как нам это использовать? Всё просто, уберем бесконечное ожидание и будем проверять значение result.

function main() if not isSampfuncsLoaded() or not isSampLoaded() then return end while not isSampAvailable() do wait(0) end sampAddChatMessage("Привет мир!", 0xFFFFFFFF) while true do -- Создаем бесконечный цикл, вместо бесконечного ожидания wait(0) -- Опять таки чтобы наша игра не зависла, ждем след кадр local result, ped = getCharPlayerIsTargeting(PLAYER_HANDLE) -- Каждый кадр получаем данные функции, PLAYER_HANDLE - возвращает ваш Handle if result then -- Если result вернет true print("True!") -- Выведем сообщение в лог / консоль end end end

Что мы можем с этим делать? Теперь если мы целимся в кого-либо, мы увидим сообщения в moonloader.log об этом. Мы получили Ped игрока в которого мы целимся. Давайте используем эту информацию.

function main() if not isSampfuncsLoaded() or not isSampLoaded() then return end while not isSampAvailable() do wait(0) end sampAddChatMessage("Привет мир!", 0xFFFFFFFF) while true do wait(0) local result, ped = getCharPlayerIsTargeting(playerPed) if result then local result2, -- Попробуем получить ID игрока по его Ped if result2 then -- Если получилось local nickname = sampGetPlayerNickname(id) -- Запишем его ник local score = sampGetPlayerScore(id) -- и счет sampAddChatMessage(string.format("%s[%d] имеет счет %d", nickname, id, score), -1) -- И выведем это в чат end end end end

Работа с переменными
Что у нас получилось? Мы будем получать кучу сообщений в чат о игрока по пока целимся в кого-либо, но как убрать этот флуд?
Давайте создадим переменную перед main(), например targeting, и присвоим ей значение false.
И задействуем её в коде

local targeting = false -- Создаем булевую переменную function main() if not isSampfuncsLoaded() or not isSampLoaded() then return end while not isSampAvailable() do wait(0) end sampAddChatMessage("Привет мир!", 0xFFFFFFFF) while true do wait(0) local result, ped = getCharPlayerIsTargeting(playerPed) if result and not targeting then -- Если мы целимся, но ранее ни в кого не целились local result2, if result2 then local nickname = sampGetPlayerNickname(id) local score = sampGetPlayerScore(id) sampAddChatMessage(string.format("%s[%d] имеет счет %d", nickname, id, score), -1) targeting = true -- запишем что мы целимся в кого либо и наше условие выше станет ложным end elseif not result and targeting then -- Если условие обратное - скажем скрипту что мы не целимся targeting = false end end end

Отлично, теперь если мы целимся в игрока — получаем одно сообщение, меняем цель или заново целимся в того же игрока — снова получим о нём информацию.
К списку вопросов

Работа с командами.
Уже лучше, давайте теперь работаем с командами.
Уберем лишний код и оставим следующее:

function main() if not isSampfuncsLoaded() or not isSampLoaded() then return end while not isSampAvailable() do wait(0) end while true do wait(0) end end

Как добавить команду? Давайте опять порыщем на WIKI, Поиск -> Command
Нашли sampRegisterChatCommand(command, callback)? Отлично, можно уже приступать.
Зарегистрируем нашу команду, например «toster»:

function main() if not isSampfuncsLoaded() or not isSampLoaded() then return end while not isSampAvailable() do wait(0) end sampRegisterChatCommand("toster", tosterCallBack) -- Регистрируем ДО бесконечного цикла. -- Первый параметр - команда, без слэша. -- Второй - функция-callback которая будет вызваться если будет введена команда. wait(-1) -- Уберем бесконечный цикл, он тут вовсе не нужен, но нам же нужно чтобы скрипт работал end function tosterCallBack(params) sampAddChatMessage("Дзынь!", -1) end

Теперь при вводе команды «/toster» мы увидим в чате сообщение. Успех? Но как например вывести свой текст в чат? Легко!

sampAddChatMessage(params, -1)

Теперь мы выводим весь текст после команды «/toster» в чат. Например: /toster Привет жалкий мирок!

Помните я говорил что нельзя использовать wait() внутри callback-функций, это всё еще так, но есть тут одна хитрость!

function tosterCallBack() sampAddChatMessage("Дзынь!", -1) lua_thread.create(function() -- Создаем новый поток wait(5000) -- Ждём 5 секунд sampAddChatMessage("Тоже дзынь, но на 5 секунд позже!", -1) -- Выводим текст в чат end) -- Тут наш поток умирает :( end

На сегодня всё, теперь вы чертовы волшебники, поняв как всё работает, можно приступать к изучению примеров Lua скриптов!

Тема будет дополняться по мере изучения популярных вопросов по Lua скриптингу.

Источник

Читайте также:  Программирование социально экономического развития региона
Оцените статью