Вопросы по 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
 
Последнее редактирование:

iAmerican

Известный
Друг
615
257
Как просканировать то, что было написано в чате? К примеру когда ввожу команду /frisk, может найти Наркотики или Материалы.
Так вот, если были найдены Наркотики, меня перекидывало на функцию narkota(), а если не был найдены, на функцию nonarkota().

Вот пример как будет писаться в чате

::: Вещи Имя_Фамилия :::
| Пустой карман..
| Пустой карман..


Или

::: Вещи Имя_Фамилия :::
| Наркотики..
| Пустой карман..
strstr проверять на NULL
 
У

Удалённый пользователь 85557

Гость
strstr проверять на NULL
кароч можешь за меня написать, я задолбался если честно. чтобы вот так было:

if
//в чате написано наркотики
//перекидывает на функцию narkota
else
//перекидывает на функцию nonarkota
 
  • Нравится
Реакции: ManJey

Ta4ir

Известный
50
17
PHP:
function spawncar(param)
    local carID = tonumber(param)
        if carID ~=nil
        then
            if carID >= 0 and carID <= 2000
            then
                    local carH=sampGetCarHandleBySampVehicleId(carID)
                    if doesVehicleExist(carH)
                    then
                        sampSendVehicleDestroyed(carID)
                    else
                            sampAddChatMessage("Ошибка! Транспорт не в стриме.",0xFF8000)
                    end
            else
                sampAddChatMessage("Ошибка! Неверный id транспорта.",0xFF8000)
            end
        end
end
Почему тут не работает проверка VehicleExist
Идёт всегда отрицание
 

4el0ve4ik

Известный
Всефорумный модератор
1,548
1,338
PHP:
function spawncar(param)
    local carID = tonumber(param)
        if carID ~=nil
        then
            if carID >= 0 and carID <= 2000
            then
                    local carH=sampGetCarHandleBySampVehicleId(carID)
                    if doesVehicleExist(carH)
                    then
                        sampSendVehicleDestroyed(carID)
                    else
                            sampAddChatMessage("Ошибка! Транспорт не в стриме.",0xFF8000)
                    end
            else
                sampAddChatMessage("Ошибка! Неверный id транспорта.",0xFF8000)
            end
        end
end
Почему тут не работает проверка VehicleExist
Идёт всегда отрицание
Код:
function spawncar(param)
    local carID = tonumber(param)
        if carID ~=nil
        then
            if carID >= 0 and carID <= 2000
            then
                    local carH=sampGetCarHandleBySampVehicleId(carID)
                    result = doesVehicleExist(carH)
                    if result
                    then
                        sampSendVehicleDestroyed(carID)
                    else
                            sampAddChatMessage("Ошибка! Транспорт не в стриме.",0xFF8000)
                    end
            else
                sampAddChatMessage("Ошибка! Неверный id транспорта.",0xFF8000)
            end
        end
end
Поправил только проверку, остальной код не смотрел
 

Ta4ir

Известный
50
17
Код:
function spawncar(param)
    local carID = tonumber(param)
        if carID ~=nil
        then
            if carID >= 0 and carID <= 2000
            then
                    local carH=sampGetCarHandleBySampVehicleId(carID)
                    result = doesVehicleExist(carH)
                    if result
                    then
                        sampSendVehicleDestroyed(carID)
                    else
                            sampAddChatMessage("Ошибка! Транспорт не в стриме.",0xFF8000)
                    end
            else
                sampAddChatMessage("Ошибка! Неверный id транспорта.",0xFF8000)
            end
        end
end
Поправил только проверку, остальной код не смотрел
Ничего не изменилось
 

DarkP1xel

Сила воли наше всё.
BH Team
3,635
4,957
Код:
function spawncar(param)
    local carID = tonumber(param)
        if carID ~=nil
        then
            if carID >= 0 and carID <= 2000
            then
                    local carH=sampGetCarHandleBySampVehicleId(carID)
                    result = doesVehicleExist(carH)
                    if result
                    then
                        sampSendVehicleDestroyed(carID)
                    else
                            sampAddChatMessage("Ошибка! Транспорт не в стриме.",0xFF8000)
                    end
            else
                sampAddChatMessage("Ошибка! Неверный id транспорта.",0xFF8000)
            end
        end
end
Поправил только проверку, остальной код не смотрел
Собственно что ты изменил?
 

FYP

Известный
Автор темы
Администратор
1,758
5,722
PHP:
function spawncar(param)
    local carID = tonumber(param)
        if carID ~=nil
        then
            if carID >= 0 and carID <= 2000
            then
                    local carH=sampGetCarHandleBySampVehicleId(carID)
                    if doesVehicleExist(carH)
                    then
                        sampSendVehicleDestroyed(carID)
                    else
                            sampAddChatMessage("Ошибка! Транспорт не в стриме.",0xFF8000)
                    end
            else
                sampAddChatMessage("Ошибка! Неверный id транспорта.",0xFF8000)
            end
        end
end
Почему тут не работает проверка VehicleExist
Идёт всегда отрицание
Lua:
local result, carH=sampGetCarHandleBySampVehicleId(carID)
if result and doesVehicleExist(carH)
then ..
функция 'sampGetCarHandleBySampVehicleId' возвращает результат выполнения и затем хендл
 
  • Нравится
Реакции: Ta4ir

EvgeN 1137

?
Проверенный
160
595
Столкнулся с такой проблемой: если sampSendChat("/showpass %d", id) -работает,
а если sampSendChat("/sms %d qq") - не работает.
протестил и понял что после переменной в команды текст нельзя вбивать иначе не отправляет, есть идеи как решить?
а ещё лучше так: sampSendChat('/sms ' .. id .. ' qq')

Lua:
while true do
    wait(0)
    local health = getCharHealth(playerPed)
    if health < 50 then
        *something*
    end
end

В тему.
Пример работы с локальными диалогами, если кому надо. Простенько, доступно. Внизу файл, /menuTest активейшн.
Все пять видов диалогов тут, хотя хз зачем, на вики вроде было это :/
Lua:
script_name("Test Dialogs")
script_description("huy znaet")
script_version_number(1)
script_version("1.0")
script_authors("Mactawishka")

function main()
    while not isSampfuncsLoaded() do
        wait(1000)
    end
    sampAddChatMessage("Test Menu by Mactawish loaded. Version: 0.1 Alpha", -1)
    sampRegisterChatCommand("menuTest", openmenu)
    while true do
        wait(0)
        local resultMain, buttonMain, listMain = sampHasDialogRespond(109)
        if resultMain == true then
            if buttonMain == 1 then
                if listMain == 0 then
                    sampShowDialog(1000, "MsgBox Test", string.format("Dat is MSGBOX \nPornHub - the best porn \nNatasha one love"), "Ok", "Exit", 0)
                    sampAddChatMessage("You have chosen MsgBox Test, list id: " .. listMain, -1)
                end
                if listMain == 1 then
                    sampShowDialog(1001, "Input Test", string.format("Man, input something here"), "Ok", "Exit", 1)
                    sampAddChatMessage("You have chosen Input Test, list id: " .. listMain, -1)
                end
                if listMain == 2 then
                    sampShowDialog(1002, "List Test", string.format("Nah \nI did it in main \nJust list"), "Ok", "Exit", 2)
                    sampAddChatMessage("You have chosen List Test, list id: " .. listMain, -1)
                end
                if listMain == 3 then
                    sampShowDialog(1003, "Password Test", string.format("Input pass, I'll steal it :p"), "Ok", "Exit", 3)
                    sampAddChatMessage("You have chosen Password Input Test, list id: " .. listMain, -1)
                end
                if listMain == 4 then
                    sampShowDialog(1004, "Tablist Test", string.format("R8 Revolver \tVery fucking powerful \t5000rub \nColt 1911 \tNot so powerful \tBut 8000rub"), "Ok", "Exit", 4)
                    sampAddChatMessage("You have chosen Iablist Test, list id: " .. listMain, -1)
                end
                if listMain == 5 then
                    sampShowDialog(1005, "TabHeaders Test", string.format("Pistol name \tPower \tPrice \nR8 Revolver \tVery fucking powerful \t5000rub \nColt 1911 \tNot so powerful \tBut 8000rub"), "Ok", "Exit", 5)
                    sampAddChatMessage("You have chosen Iablist With Header Test, list id: " .. listMain, -1)
                end
            end
        end
    
        local resultInput, buttonInput, listInput, stringInput = sampHasDialogRespond(1001)
        if resultInput == true then
            if buttonInput == 1 then
                sampAddChatMessage("You've inputed: " .. stringInput, -1)
            else sampAddChatMessage("You're pussy, you've pressed Exit", -1)
            end
        end
    
        local resultInput, buttonInput, listInput, stringInput = sampHasDialogRespond(1003)
        if resultInput == true then
            if buttonInput == 1 then
                sampAddChatMessage("You've inputed in Password: " .. stringInput, -1)
            else sampAddChatMessage("You're pussy, you've pressed Exit, do you afraid to write your pass here?", -1)
            end
        end
    end
end

function openmenu()
    sampShowDialog(109, "Test Menu", string.format("MsgBox \nInput \nList \nPassword \nTab \nTabHeaders"), "Ok", "Exit", 2)
end
зачем использовать string.format там, где он не нужен?
 
  • Нравится
Реакции: RollUp

4el0ve4ik

Известный
Всефорумный модератор
1,548
1,338
По крайней мере ошибок нету
Что значит?
[00:27:41.261055] (system) Loading script 'D:\Program Files (x86)\GTA_San_Andreas-0.2\moonloader\MoonProj.lua'...
[00:27:41.261055] (debug) New thread: 178808EC
[00:27:41.291059] (system) MoonProj: Loaded successfully.
[00:27:41.361568] (debug) Add thread 1BEA9D30 to SCM-thread queue
[00:27:55.879655] (error) MoonProj: lua: error: attempt to call a number value
[00:27:55.879655] (system) MoonProj: Thread terminated (178808EC)
[00:27:55.879655] (debug) Remove thread 1BEA9D30 from SCM-thread queue
 

4el0ve4ik

Известный
Всефорумный модератор
1,548
1,338
[00:27:55.879655] (error) MoonProj: lua: error: attempt to call a number value
[00:27:55.879655] (system) MoonProj: Thread terminated (178808EC)
Ошибки как бы и нет, но поток крашится все равно.
Если не конфиденциально-кинь код, аж самому интересно стало