Вопросы по Lua скриптингу

Общая тема для вопросов по разработке скриптов на языке программирования Lua, в частности под MoonLoader.
  • Задавая вопрос, убедитесь, что его нет в списке частых вопросов и что на него ещё не отвечали (воспользуйтесь поиском).
  • Поищите ответ в теме посвященной разработке Lua скриптов в MoonLoader
  • Отвечая, убедитесь, что ваш ответ корректен.
  • Старайтесь как можно точнее выразить мысль, а если проблема связана с кодом, то обязательно прикрепите его к сообщению, используя блок [code=lua]здесь мог бы быть ваш код[/code].
  • Если вопрос связан с MoonLoader-ом первым делом желательно поискать решение на wiki.

Частые вопросы

Как научиться писать скрипты? С чего начать?
Информация - Гайд - Всё о Lua скриптинге для MoonLoader(https://blast.hk/threads/22707/)
Как вывести текст на русском? Вместо русского текста у меня какие-то каракули.
Изменить кодировку файла скрипта на Windows-1251. В Atom: комбинация клавиш Ctrl+Shift+U, в Notepad++: меню Кодировки -> Кодировки -> Кириллица -> Windows-1251.
Как получить транспорт, в котором сидит игрок?
Lua:
local veh = storeCarCharIsInNoSave(PLAYER_PED)
Как получить свой id или id другого игрока?
Lua:
local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED) -- получить свой ид
local _, id = sampGetPlayerIdByCharHandle(ped) -- получить ид другого игрока. ped - это хендл персонажа
Как проверить, что строка содержит какой-то текст?
Lua:
if string.find(str, 'текст', 1, true) then
-- строка str содержит "текст"
end
Как эмулировать нажатие игровой клавиши?
Lua:
local game_keys = require 'game.keys' -- где-нибудь в начале скрипта вне функции main

setGameKeyState(game_keys.player.FIREWEAPON, -1) -- будет сэмулировано нажатие клавиши атаки
Все иды клавиш находятся в файле moonloader/lib/game/keys.lua.
Подробнее о функции setGameKeyState здесь: lua - setgamekeystate | BlastHack — DEV_WIKI(https://www.blast.hk/wiki/lua:setgamekeystate)
Как получить id другого игрока, в которого целюсь я?
Lua:
local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE) -- получить хендл персонажа, в которого целится игрок
if valid and doesCharExist(ped) then -- если цель есть и персонаж существует
  local result, id = sampGetPlayerIdByCharHandle(ped) -- получить samp-ид игрока по хендлу персонажа
  if result then -- проверить, прошло ли получение ида успешно
    -- здесь любые действия с полученным идом игрока
  end
end
Как зарегистрировать команду чата SAMP?
Lua:
-- До бесконечного цикла/задержки
sampRegisterChatCommand("mycommand", function (param)
     -- param будет содержать весь текст введенный после команды, чтобы разделить его на аргументы используйте string.match()
    sampAddChatMessage("MyCMD", -1)
end)
Крашит игру при вызове sampSendChat. Как это исправить?
Это происходит из-за бага в SAMPFUNCS, когда производится попытка отправки пакета определенными функциями изнутри события исходящих RPC и пакетов. Исправления для этого бага нет, но есть способ не провоцировать его. Вызов sampSendChat изнутри обработчика исходящих RPC/пакетов нужно обернуть в скриптовый поток с нулевой задержкой:
Lua:
function onSendRpc(id)
  -- крашит:
  -- sampSendChat('Send RPC: ' .. id)

  -- норм:
  lua_thread.create(function()
    wait(0)
    sampSendChat('Send RPC: ' .. id)
  end)
end
 
Последнее редактирование:

FYP

Известный
Автор темы
Администратор
1,763
5,906

egor230

Участник
47
16
Спасибо большое уважаемый dankestmemer за Ваш ответ.
Заменил
Lua:
printString ("X, Y, Z", 300) -- Вывести координаты cj.
На
Lua:
printString (string.format("%f %f %f, X, Y, Z), 300) -- Вывести координаты cj.
Или вылетает или не работает.
Может Вас не так понял? Подскажите, пожалуйста.
 

hnnssy

Известный
Друг
2,684
2,762
Спасибо большое уважаемый dankestmemer за Ваш ответ.
Заменил
Lua:
printString ("X, Y, Z", 300) -- Вывести координаты cj.
На
Lua:
printString (string.format("%f %f %f, X, Y, Z), 300) -- Вывести координаты cj.
Или вылетает или не работает.
Может Вас не так понял? Подскажите, пожалуйста.
кавычки закрой после %f %f %f
 

BABLIK

Известный
15
1
Можно ли как то увеличить лимит символов в renderFontDrawText? Текст в некуда уходит
 
  • Нравится
Реакции: ufdhbi

imring

Ride the Lightning
Всефорумный модератор
2,362
2,545
Как можно узнать узнать версию/название/авторов другого скрипта?
Видел в этой теме код, но что-то я его не могу найти.
 

k1sher

Известный
201
4
Подскажите почему чатлог не сохраняется иногда, а именно когда краш игры или завершить процесс через диспетчер задач.

Код:
script_name("Chatlogger")
script_author("AppleThe")

local dir = os.getenv('USERPROFILE') .. '\\Documents\\GTA San Andreas User Files\\SAMP\\chatlogs'

function main()
    LuaScript = thisScript()
    wait(-1)
end

function onScriptTerminate(ScriptName, bool)
    if ScriptName == LuaScript then
        if not doesDirectoryExist(dir) then createDirectory(dir) end
        local name = "Chatlog - " .. os.date("%m.%Y") .. ".txt"
        local s = sampGetCurrentServerName()
        l1 = (string.len(s) / 2)
        if math.fmod(l1, 2) ~= 0 then l2 = l1 - 0.5 else l2 = l1 end
        if doesFileExist(dir .. "\\" .. name) then reading = "a" else reading = "w" end
        local f = assert(io.open(os.getenv('USERPROFILE') .. "/Documents/GTA San Andreas User Files/SAMP/chatlogs/" .. name, reading))
        f:write(string.rep("=", 21) .. " " .. s .. " " .. string.rep("=", 20) .. "\n")
        f:write(string.rep("=", 5 + l1) .. " Дата: " .. os.date("%d.%m.%Y") .. " Время: " .. string.match(readChatlog(), "%[(..:..:..)%]") .. " " .. string.rep("=", 5 + l2))
        f:write("\n\n" .. readChatlog() .. "\n\n\n")
        f:close()
    end
end

function readChatlog()
    local f = assert(io.open(os.getenv('USERPROFILE') .. "/Documents/GTA San Andreas User Files/SAMP/chatlog.txt", "r"))
    local t = f:read("*all")
    f:close()
    return t
end
 

ishi

Известный
493
110
Пытался сделать распознавание строки формата Ник[Ид], но "наборы символов" почему-то не работают. Что я сделал не так?
Lua:
string.match(text,'([a-Z]+).([0-9]+).')

и ещё. Как там можно вместо любого символа (точка) указать конкретный?
Я пробовал так (просто заковать круглые скобки в квадратные), но это не работает (игра крашит), очевидно делается это иначе ._.
 

k1sher

Известный
201
4
Пытался сделать распознавание строки формата Ник[Ид], но "наборы символов" почему-то не работают. Что я сделал не так?
Lua:
string.match(text,'([a-Z]+).([0-9]+).')

и ещё. Как там можно вместо любого символа (точка) указать конкретный?
Я пробовал так (просто заковать круглые скобки в квадратные), но это не работает (игра крашит), очевидно делается это иначе ._.

Код:
string.match(text, "^%S+%[(%d+)%]$")
 

k1sher

Известный
201
4
где ты нашёл описание символов для форматирования?
Я находил лишь "управляющие символы", но там не было ни первого из твоего примера, ни последнего. (не могу прочесть твой код)
Символьный класс
Символьный класс используется, чтобы представить набор символов. Следующие комбинации используются для описания символьного класса:

•x: (где x - соответствует сам себе. (Он не может быть равен ни одному из волшебных символов ^$()%.[]*+-?).
•.: (точка) соответствует любому символу.
•%a: соответствует любой букве.
•%c: соответствует любому управляющему символу.
•%d: соответствует любой цифре.
•%l: соответствует любой букве в нижнем регистре.
•%p: соответствует любому символу пунктуации.
•%s: соответствует любому пробельному символу.
•%u: соответствует любой букве в верхнем регистре.
•%w: соответствует любому алфавитно-цифровые символу.
•%x: соответствует любой шестнадцатеричной цифре.
•%z: соответствует символу с представлением 0.
•%x: (где x - любой не алфавитно-цифровой символ), соответствует сам себе. Это - стандартный способ экранировки волшебных символов. Лучше следить за тем, чтобы любому символу пунктуации (даже не "волшебному") предшествовал '%', когда этот символ применен в шаблоне.
•[set]: соответствует любому символу из набора, заданного в set. Диапазон символов может быть определен, с помощью символа '-' отделяющего начало и конец диапазона. Все символьные классы %x описанные выше, могут использоваться как компоненты в наборе. Все другие символы в наборе представляются как есть. Например, [%w_] (или [_%w]) соответствует любому алфавитно-цифровому символу или символу подчеркивания, [0-9] соответствует любой десятичной цифре, и [0-9%l%-] соответствует любой десятичной цифре или любой букве в нижнем регистре или символу дефиса '-'.
Взаимодействие между диапазонами и классами не определено. Поэтому, наборы подобные [%a-z] или [a-%%] не имеют никакого значения.

•[^set]: Отрицательный набор символов. Соответствует любому символу, кроме тех, что заданы в наборе set. Содержимое набора интерпретируется аналогично описанному выше [set].
Для всех классов, представляемых одиночными символами (%a, %c, и т.п.), соответствующая прописная буква представляет отрицание класса. Например, %S представляет все НЕ пробельные символы.

Представления символа, пробела и других символьных групп зависят от текущих региональных установок. В частности, класс [a-z] не эквивалентен %l.
Элемент шаблона
Элементом шаблона может быть:

•Одиночный символьный класс, который соответствует любому одиночному символу из заданного класса;
•Одиночный символьный класс, сопровождаемый '*', что соответствует 0 или большему количеству повторений символов из заданного класса. Эти элементы повторения будут всегда соответствовать самой длинной возможной последовательности.
•Одиночный символьный класс, сопровождаемый '+', что соответствует 1 или большему количеству повторений символов из заданного класса. Эти элементы повторения будут всегда соответствовать самой длинной возможной последовательности.
•Одиночный символьный класс, сопровождаемый '-', что также соответствует 0 или большему количеству повторений символов из заданного класса. В отличие от *, элементы повторения будут всегда соответствовать самой короткой возможной последовательности;
•Одиночный символьный класс, сопровождаемый '?', что соответствует 0 или единственному вхождению символа из заданного класса;
•%n, при n от 1 до 9; такой элемент равняется n-й зафиксированной подстроке (см. ниже);
•%bxy, здесь x и y - два различных символа. Такой элемент соответствует строкам, которые начинаются с x, заканчиваются на y, и в них сбалансированы x и y. Это означает, что, если читать строку слева направо, подсчитывая +1 для x и -1 для y, то последний y является первым y, для которого счетчик равен 0. Например, элемент %b() соответствует выражениям со сбалансированными круглыми скобками.
Шаблон
Шаблон представляет собой последовательность описанных выше элементов. Символ '^' в начале шаблона, говорит о том, что заданная последовательность начинается с начала строки. Символ '$' в конце шаблона, говорит о том, что заданной последовательностью строка заканчивается. Символы '^' и '$', размещенные в других местах шаблона, не имеют никакого специального значения и представляются как есть.
Подшаблоны
В шаблон можно включить подшаблоны, выделив их круглыми скобками. Если найденная строка соответствует шаблону, то ее подстроки, соответствующие подшаблонам, будут доступны для будущего использования. Подшаблоны пронумерованы согласно их левым круглым скобкам. Например, в шаблоне "(a*(.)%w(%s*))", часть строки, соответствующая "a*(.)%w(%s*)" будет зафиксирована как первый подшаблон (и поэтому имеет номер 1); любые символы попавшие под соответствие "." будут зафиксированы как подшаблон номер 2, и часть строки, соответствующая "%s*" получит номер 3.

Специальный вариант использования подшаблонов - получение текущей позиции в строке. Для этого используются пустые подшаблоны (). Например, если мы применим шаблон "()aa()" к строке "flaaap", то получим два результата: 3 и 5.

Шаблон не может содержать вложенные ноли. Используйте %z вместо этого.
 

ynhhoJ

Известный
102
6
С помощи какого опкода можно узнать ID под которым играю я в данный момент?
 

ynhhoJ

Известный
102
6
Как можно это оптимизировать?
Lua:
function GetPlayerWeaponID(weaponid)
    if weaponid == 0 then
        return "Fist"
    elseif weaponid == 1 then
        return "Brass Knuckles"
    elseif weaponid == 2 then
        return "Golf Club"
    elseif weaponid == 3 then
        return "Nightstick"
    elseif weaponid == 4 then
        return "Knife"
    elseif weaponid == 5 then
        return "Baseball Bat"
    elseif weaponid == 6 then
        return "Shovel"
    elseif weaponid == 7 then
        return "Pool Cue"
    elseif weaponid == 8 then
        return "Katana"
    elseif weaponid == 9 then
        return "Chainsaw"
    elseif weaponid == 10 then
        return "Purple Dildo"
    elseif weaponid == 11 then
        return "Dildo"
    elseif weaponid == 12 then
        return "Vibrator"
    elseif weaponid == 13 then
        return "Silver Vibrator"
    elseif weaponid == 14 then
        return "Flowers"
    elseif weaponid == 15 then
        return "Cane"
    elseif weaponid == 16 then
        return "Grenade"
    elseif weaponid == 17 then
        return "Tear Gas"
    elseif weaponid == 18 then
        return "Molotov Cocktail"
    elseif weaponid == 22 then
        return "9mm"
    elseif weaponid == 23 then
        return "Silenced 9mm"
    elseif weaponid == 24 then
        return "Desert Eagle"
    elseif weaponid == 25 then
        return "Shotgun"
    elseif weaponid == 26 then
        return "Sawnoff Shotgun"
    elseif weaponid == 27 then
        return "Combat Shotgun"
    elseif weaponid == 28 then
        return "Micro SMG/Uzi"
    elseif weaponid == 29 then
        return "MP5"
    elseif weaponid == 30 then
        return "AK-47"
    elseif weaponid == 31 then
        return "M4"
    elseif weaponid == 32 then
        return "Tec-9"
    elseif weaponid == 33 then
        return "Country Rifle"
    elseif weaponid == 34 then
        return "Sniper Rifle"
    elseif weaponid == 35 then
        return "RPG"
    elseif weaponid == 36 then
        return "HS Rocket"
    elseif weaponid == 37 then
        return "Flamethrower"
    elseif weaponid == 38 then
        return "Minigun"
    elseif weaponid == 39 then
        return "Satchel Charge"
    elseif weaponid == 40 then
        return "Detonator"
    elseif weaponid == 41 then
        return "Spraycan"
    elseif weaponid == 42 then
        return "Fire Extinguisher"
    end
end