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

Salvatore_Ferrari

Известный
427
239
Тут также напрямую, строкой data.health = 50 все будут видеть что у тебя 50 жизней.
Это НЕ исходящий пакет , это входящий пакет , пакет который отправляет нам сервер когда какой то игрок находится на пассажирском. Перезапись через таблицу тут , как в теме писал фип
 

Parobax

Участник
72
13
Lua:
list = -1 -- в конце отигровки
Lua:
if list == 1 then
                sampSendChat("/tr Так-с, друзья, сейчас будет малый инструктаж для новеньких.")
                wait(500)
                sampSendChat("/tr Норма нашего такси, 500$ первый час работы, 5500$ сутки.")
                wait(500)
                sampSendChat("/tr Если же вы уехали со штата и не выполнили норму, вы будете уволены.")
                wait(500)
                sampSendChat("/tr После себя обезательно заправлять авто и чинить его, или же вы будете уволены.")
                wait(500)
                sampSendChat("/tr (( /tr - рация RP, MG, оск, флуд, маты - Запрещено, Администрация часто следит за чатами. ))")
                wait(500)
                sampSendChat("/tr (( по этому вы можете получить наказание. ))")
                wait(500)
                sampSendChat("/tr Если возникнут вопросы, обращайтесь к Управляющим или Руководителю. Удачи на дорогах.")
                break
                list = -1

Все равно, break ставил/убирал. Без break все равно бесконечно летит, а с ним тоже самое, что и без list = -1
 

TheGood11

Участник
173
10
Как сделать можно сказать биндер? То есть мне надо что бы я ввёл команду допустим /pravila, и оно начало в чат строчить типо "Сейчас я проведу лекцию", "Она будет на тему" и т.д.
 

Cutler18

Известный
160
2
Lua:
function fbuu()
    sampSendChat('/c 60')
        function hook.onServerMessage(color, text)
        lua_thread.create(function()
            if text:find("Вы позвонили в службу точного времени") then
            lua_thread.create(Fay, 'Лох')
            wait(1000)
            lua_thread.create(Fay, 'ыыыы')
            end
            end)
        end
end

function Fay(text)
wait(10)
    sampSendChat(text)
end
Нужно что бы после /c 60 два раза нажал кнопку вниз а потом ентер, как сделать?
 

StarFresko1227

Известный
46
1
Добрый вечер.
Подскажите, почему переменная не перезаписывается, и если к примеру в админ чат напишут:
/ban 128 30 чит
/kick 15 помеха
/sethp 20 100

Я нажму F1, он выполнит все три запроса сразу, хотя при каждом новом запросе, он должен перезаписывать запрос:
Lua:
local new_comman = ''
function sampev.onServerMessage(color, message)
    if message:find("%[A%] (.*)%[(.*)%]%: /kick (.*)") then
        lua_thread.create(function()
            local admin_nick, admin_id, params_command = message:match("%[A%] (.*)%[(.*)%]%: /kick (.*)")
            new_comman = '/kick '..params_command..''
            wait(1)
            printStyledString('~r~AUTONAKAZ', 500, 1)
            sampAddChatMessage('Администратор '..admin_nick..', запросил наказание, для выдачи нажмите F1', -1)
            while not isKeyDown(vkeys.VK_F1) do wait(0) end
            sampSendChat("/b "..new_comman.."")
            sampSendChat("/a "..admin_nick..", команда была выполнена.")
            new_comman = ''
        end)
    end
    if message:find("%[A%] (.*)%[(.*)%]%: /sethp (.*)") then
        lua_thread.create(function()
            local admin_nick, admin_id, params_command = message:match("%[A%] (.*)%[(.*)%]%: /sethp (.*)")
            new_comman = '/sethp '..params_command..''
            wait(1)
            printStyledString('~r~AUTONAKAZ', 500, 1)
            sampAddChatMessage('Администратор '..admin_nick..', запросил наказание, для выдачи нажмите F1', -1)
            while not isKeyDown(vkeys.VK_F1) do wait(0) end
            sampSendChat("/b "..new_comman.."")
            sampSendChat("/a "..admin_nick..", команда была выполнена.")
            new_comman = ''
        end)
    end
    if message:find("%[A%] (.*)%[(.*)%]%: /ban (.*)") then
        lua_thread.create(function()
            local admin_nick, admin_id, params_command = message:match("%[A%] (.*)%[(.*)%]%: /ban (.*)")
            new_comman = '/ban '..params_command..''
            wait(1)
            printStyledString('~r~AUTONAKAZ', 500, 1)
            sampAddChatMessage('Администратор '..admin_nick..', запросил наказание, для выдачи нажмите F1', -1)
            while not isKeyDown(vkeys.VK_F1) do wait(0) end
            sampSendChat("/b "..new_comman.."")
            sampSendChat("/a "..admin_nick..", команда была выполнена.")
            new_comman = ''
        end)
    end
end

function main()
    wait(-1)
end
[CENTER]
 

Shell :3

Активный
159
32
Два вопросика вам)
- Как подгрузить шрифт, если можно то подробнее.. Объясняли, я не врубился, была проблема что весь текст пропадал из imgui, когда подгружал.
- Как можно осуществить своеобразный чат между пользователями скрипта?
 

trefa

Известный
Всефорумный модератор
2,097
1,231
Добрый вечер.
Подскажите, почему переменная не перезаписывается, и если к примеру в админ чат напишут:
/ban 128 30 чит
/kick 15 помеха
/sethp 20 100

Я нажму F1, он выполнит все три запроса сразу, хотя при каждом новом запросе, он должен перезаписывать запрос:
Lua:
local new_comman = ''
function sampev.onServerMessage(color, message)
    if message:find("%[A%] (.*)%[(.*)%]%: /kick (.*)") then
        lua_thread.create(function()
            local admin_nick, admin_id, params_command = message:match("%[A%] (.*)%[(.*)%]%: /kick (.*)")
            new_comman = '/kick '..params_command..''
            wait(1)
            printStyledString('~r~AUTONAKAZ', 500, 1)
            sampAddChatMessage('Администратор '..admin_nick..', запросил наказание, для выдачи нажмите F1', -1)
            while not isKeyDown(vkeys.VK_F1) do wait(0) end
            sampSendChat("/b "..new_comman.."")
            sampSendChat("/a "..admin_nick..", команда была выполнена.")
            new_comman = ''
        end)
    end
    if message:find("%[A%] (.*)%[(.*)%]%: /sethp (.*)") then
        lua_thread.create(function()
            local admin_nick, admin_id, params_command = message:match("%[A%] (.*)%[(.*)%]%: /sethp (.*)")
            new_comman = '/sethp '..params_command..''
            wait(1)
            printStyledString('~r~AUTONAKAZ', 500, 1)
            sampAddChatMessage('Администратор '..admin_nick..', запросил наказание, для выдачи нажмите F1', -1)
            while not isKeyDown(vkeys.VK_F1) do wait(0) end
            sampSendChat("/b "..new_comman.."")
            sampSendChat("/a "..admin_nick..", команда была выполнена.")
            new_comman = ''
        end)
    end
    if message:find("%[A%] (.*)%[(.*)%]%: /ban (.*)") then
        lua_thread.create(function()
            local admin_nick, admin_id, params_command = message:match("%[A%] (.*)%[(.*)%]%: /ban (.*)")
            new_comman = '/ban '..params_command..''
            wait(1)
            printStyledString('~r~AUTONAKAZ', 500, 1)
            sampAddChatMessage('Администратор '..admin_nick..', запросил наказание, для выдачи нажмите F1', -1)
            while not isKeyDown(vkeys.VK_F1) do wait(0) end
            sampSendChat("/b "..new_comman.."")
            sampSendChat("/a "..admin_nick..", команда была выполнена.")
            new_comman = ''
        end)
    end
end

function main()
    wait(-1)
end
[CENTER]
Серьёзно? На каждую команду делать по столько кода? Через таблицу можно сделать в разы компактнее.
 

ufdhbi

Известный
Проверенный
1,455
861
Серьёзно? На каждую команду делать по столько кода? Через таблицу можно сделать в разы компактнее.
А если у команды разное количество аргументов?
Например у кика только ид (/kick id) а у бана 2 аргумента (/ban 23 cheat)
 

ShuffleBoy

Известный
Друг
754
429
Есть у кого lua AirBreak отдельный без всяких других плюшек ?
вырезанный с cover project
Lua:
local sampev  = require 'lib.samp.events'
local memory = require'memory'
require 'moonloader'
airbreak_coords = {}
speed = 0.2

function main()
    while not isSampAvailable() do wait(0) end
    work_in_collapsed_mode(true)
    while true do
        wait(0)
        if activation then
            local camCoordX, camCoordY, camCoordZ = getActiveCameraCoordinates()
            local targetCamX, targetCamY, targetCamZ = getActiveCameraPointAt()
            local angle = getHeadingFromVector2d(targetCamX - camCoordX, targetCamY - camCoordY)
            local heading = getCharHeading(playerPed)
            setCharCoordinates(playerPed, airbreak_coords[1], airbreak_coords[2], airbreak_coords[3])
            if isKeyDown(VK_W) then
                airbreak_coords[1] = airbreak_coords[1] + speed * math.sin(-math.rad(angle))
                airbreak_coords[2] = airbreak_coords[2] + speed * math.cos(-math.rad(angle))
                setCharHeading(playerPed, angle)
            elseif isKeyDown(VK_S) then
                airbreak_coords[1] = airbreak_coords[1] - speed * math.sin(-math.rad(heading))
                airbreak_coords[2] = airbreak_coords[2] - speed * math.cos(-math.rad(heading))
            end
           
            if isKeyDown(VK_A) then
                airbreak_coords[1] = airbreak_coords[1] - speed * math.sin(-math.rad(heading - 90))
                airbreak_coords[2] = airbreak_coords[2] - speed * math.cos(-math.rad(heading - 90))
            elseif isKeyDown(VK_D) then
                airbreak_coords[1] = airbreak_coords[1] - speed * math.sin(-math.rad(heading + 90))
                airbreak_coords[2] = airbreak_coords[2] - speed * math.cos(-math.rad(heading + 90))
            end
           
            if isKeyDown(VK_UP) then airbreak_coords[3] = airbreak_coords[3] + speed / 2.0 end
            if isKeyDown(VK_DOWN) and airbreak_coords[3] > -95.0 then airbreak_coords[3] = airbreak_coords[3] - speed / 2.0 end
        end
       
        if isKeyJustPressed(VK_RSHIFT) then
            activation = not activation
            local posX, posY, posZ = getCharCoordinates(playerPed)
            airbreak_coords = {posX, posY, posZ, getCharHeading(playerPed)}
        end
    end
end
 

Shell :3

Активный
159
32
Помогите, когда подгружаю шрифт, открывается окно имжуи... Все хорошо, в логе чисто, Но... весь текст пропадает.
upload_2018-8-25_21-32-57.png
 

Azller Lollison

я узбек
Друг
1,343
2,271

checkdasound

Известный
Проверенный
963
406
почему крашит?
Lua:
local WP = require "game.weapons"
imgui.TextQuestion(''..WP.get_name(id)..'')
в коде есть?
Lua:
function imgui.TextQuestion(text)
    imgui.TextDisabled('(?)')
    if imgui.IsItemHovered() then
        imgui.BeginTooltip()
        imgui.PushTextWrapPos(450)
        imgui.TextUnformatted(text)
        imgui.PopTextWrapPos()
        imgui.EndTooltip()
    end
end