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

4el0ve4ik

Известный
Всефорумный модератор
1,550
1,343
как сделать что бы открывался файл ини, который лежит в папке со скриптом, у каждого пользователя путь к гта разный я подумал использовать так:
Код:
  dir = script.directory
  ini_test = io.openfile(dir"test.ini", "r")
ну или подскажите как усобачить путь по другому.
 
  • Клоун
Реакции: pastow

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,468
Lua:
local file = io.open("moonloader/file.txt", "r")
if file ~= nil then
    --local first_line = file:read()
    print(file:read())
    file:close()
end
Кстати, если ты там пишешь свои костыли, то лучше заюзай библиотеку, по типу LIP: https://github.com/Dynodzzo/Lua_INI_Parser
Не хуже будет.
 
Последнее редактирование:

4el0ve4ik

Известный
Всефорумный модератор
1,550
1,343
Код:
function prost()
  menurp = string.format("1 \n2")
  dia = sampShowDialog(25, "qq", menurp, "OK", "Close", 2)
  sampSetCurrentDialogListItem(0)
  repeat
    wait(0)
    re, button, listr, input = sampHasDialogRespond(25)
  until re
  if button == 0 then
    _ = sampCloseCurrentDialogWithButton()
  else
    if listr == 0 then
        dia = sampShowDialog(26, "prp", "hz", "OK", "Close", 1)
        repeat
          wait(0)
           re, button, _, number = sampHasDialogRespond(26) -- вот тут
        until re
        if button == 0 then
          _ = sampCloseCurrentDialogWithButton()
        end
      end
    if listrpsms == 1 then
      sampAddChatMessage("%d", number, 0xcc0000) 
    end
Как можно сохранить переменную number до полной перезагрузки скрипта или покуда не введу другое число?
 
  • Клоун
Реакции: pastow

4el0ve4ik

Известный
Всефорумный модератор
1,550
1,343
Столкнулся с такой проблемой: если sampSendChat("/showpass %d", id) -работает,
а если sampSendChat("/sms %d qq") - не работает.
протестил и понял что после переменной в команды текст нельзя вбивать иначе не отправляет, есть идеи как решить?
 
  • Клоун
Реакции: pastow

SR_team

like pancake
BH Team
4,809
6,487
Столкнулся с такой проблемой: если sampSendChat("/showpass %d", id) -работает,
а если sampSendChat("/sms %d qq") - не работает.
протестил и понял что после переменной в команды текст нельзя вбивать иначе не отправляет, есть идеи как решить?
Lua:
sampSendChat( string.format("/sms %d qq", id) )
 
  • Клоун
Реакции: pastow

Danijr97

Известный
26
4
Можете привести пример " если хп меньше 50, то включается определенная функция"
 
  • Клоун
Реакции: pastow

mac

HEY DARLING
1,317
911
Можете привести пример " если хп меньше 50, то включается определенная функция"
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
 

Вложения

  • dialogTest.lua
    2.8 KB · Просмотры: 110
У

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

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

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

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

Или

::: Вещи Имя_Фамилия :::
| Наркотики..
| Пустой карман..
 
  • Клоун
Реакции: pastow

Danijr97

Известный
26
4
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

[HIDE-POSTS]
script_name("123")
script_author("noname_noob")
require "lib.moonloader"
require "lib.sampfuncs"

function main()
if not isSampfuncsLoaded() or not isSampLoaded() then return end
sampRegisterChatCommand("uss", ussss)


while true do
wait (0)
if isPlayerPlaying(playerHandle) and enable then
local health = getCharHealth(playerPed)
if health < 50 then
sampSendChat("/usedrugs")
wait(999)
sampSendChat("q")
end
end
end
end


function ussss(param)
enabled = not enabled
if enabled then
sampAddChatMessage(string.format("[%s]: Активирован", thisScript().name), 0x40FF40)
else
sampAddChatMessage(string.format("[%s]: Деактивирован", thisScript().name), 0xFF4040)
end
end
[/HIDE-POSTS]
в чем трабл? команды активируется, хп меньше 50, но все равно /usedrugs не прописывается.
 
  • Клоун
Реакции: pastow

mac

HEY DARLING
1,317
911
Заебался, честно.
Как интегрировать anttweakbar в луа?
 
  • Клоун
Реакции: pastow

SR_team

like pancake
BH Team
4,809
6,487
Как просканировать то, что было написано в чате? К примеру когда ввожу команду /frisk, может найти Наркотики или Материалы.
Так вот, если были найдены Наркотики, меня перекидывало на функцию narkota(), а если не был найдены, на функцию nonarkota().

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

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


Или

::: Вещи Имя_Фамилия :::
| Наркотики..
| Пустой карман..
лично я бы использовал string.match, но можно и попроще через string.find
 
  • Клоун
Реакции: pastow