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

TLD_morozov

Новичок
29
3
Lua:
script_name('Версия 0.1')
script_author('Автор NoName')
script_description('fil')
require "lib.moonloader"

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(2000) end
    sampAddChatMessage('Скрипт NoName',0xFFFF00)
    sampRegisterChatCommand('fil', fil)
    while true do
        wait(0)
    end
end

function fil()
    local peds = getAllChars()
    for _, v in pairs(peds) do
        local result, myid = sampGetPlayerIdByCharHandle(playerPed)
        local mx, my, mz = getCharCoordinates(playerPed)
        local x, y, z = getCharCoordinates(v)
        local distance = getDistanceBetweenCoords3d(mx, my, mz, x, y, z)
        local result, id = sampGetPlayerIdByCharHandle(v)
        if result and id ~= sampGetPlayerIdByCharHandle(PLAYER_PED) and distance < 10.0 then
            if id ~= myid then
                sampSendChat('/filscar' ..tonumber(id) '1' )
            end
        end
    end
end

Нужно сделать так сто бы скрипт находил ид игрока в авто и чтобы прописывалась команда /filscar (его ид) 1. Помогите пожалуйста
 

BARRY BRADLEY

Известный
711
176
Lua:
script_name('Версия 0.1')
script_author('Автор NoName')
script_description('fil')
require "lib.moonloader"

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(2000) end
    sampAddChatMessage('Скрипт NoName',0xFFFF00)
    sampRegisterChatCommand('fil', fil)
    while true do
        wait(0)
    end
end

function fil()
    local peds = getAllChars()
    for _, v in pairs(peds) do
        local result, myid = sampGetPlayerIdByCharHandle(playerPed)
        local mx, my, mz = getCharCoordinates(playerPed)
        local x, y, z = getCharCoordinates(v)
        local distance = getDistanceBetweenCoords3d(mx, my, mz, x, y, z)
        local result, id = sampGetPlayerIdByCharHandle(v)
        if result and id ~= sampGetPlayerIdByCharHandle(PLAYER_PED) and distance < 10.0 then
            if id ~= myid then
                sampSendChat('/filscar' ..tonumber(id) '1' )
            end
        end
    end
end

Нужно сделать так сто бы скрипт находил ид игрока в авто и чтобы прописывалась команда /filscar (его ид) 1. Помогите пожалуйста
Lua:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(2000) end
    lua_thread.create(autoFunction)
    wait(-1)
end

function autoFunction()
    while true do
       local peds = getAllChars()
       for _, v in pairs(peds) do
           local result, myid = sampGetPlayerIdByCharHandle(playerPed)
           local mx, my, mz = getCharCoordinates(playerPed)
           local x, y, z = getCharCoordinates(v)
           local distance = getDistanceBetweenCoords3d(mx, my, mz, x, y, z)
           local result, id = sampGetPlayerIdByCharHandle(v)
           if result and id ~= sampGetPlayerIdByCharHandle(PLAYER_PED) and distance < 10.0 then
               if id ~= myid then
                   sampSendChat('/filscar ' ..tonumber(id) .. ' 1')
               end
           end
        end
    end
end
Но данный код будет флудить командой возле игрока (дистанция 10м). Так что нужно делать на проверку что команда уже вводилась
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как изменить это
1622285260513.png
чтобы удалились первые 2 символа в {} скобочках которые
1622285297542.png
 

Corrygаn

Участник
225
6
Как заменить какое-либо диалоговое окно на свой imgui, при этом зная id диалога?
 

Myroslaw

Известный
133
5
Lua:
function event.onSendCommand(cmd)
  local c = cmd:match('^(.*)%s-.-$')
  if cmds[c] then
    cmd = cmd:gsub(c, cmds[c], 1)
  end
  return { cmd }
end
        end
end
есть вот такой хук, типо для сокр команд, но у меня есть впорос, если я хочу писать не /giverank 1, а /giverank 1 1 1, типо с тремя значениями то как ето сделать?
 

Andrinall

Известный
688
533
Как изменить это Посмотреть вложение 98814 чтобы удалились первые 2 символа в {} скобочках которые Посмотреть вложение 98815
color = color:gsub("..(......)", "%1")
Если память не изменяет, то так.

А вообще можно пихнуть в 2 строки.
Lua:
local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
local color = string.gsub(("%X"):format(sampGetPlayerColor(id)), "..(......)", "%1")
 
Последнее редактирование:

Corrygаn

Участник
225
6
Как заменить какое-либо диалоговое окно на свой imgui, при этом зная id диалога?
 

Corrygаn

Участник
225
6
в хуке, if id == 123 then
А как мне в данной ситуации запустить окно имгуи? Так?
Код:
local sampev = require "samp.events"

local reportwindow = imgui.ImBool(false)

function sampev.onShowDialog(id, style, title, button1, button2, text)
    if id == 5 then
        reportwindow.v = not reportwindow.v
        imgui.Process = reportwindow.v
    end
end
+как убрать само диалоговое окно?
 
Последнее редактирование:

Gorskin

{Reverse Developer} ✓
Проверенный
1,256
1,059
А как мне в данной ситуации запустить окно имгуи? Так?
Код:
local sampev = require "samp.events"

local reportwindow = imgui.ImBool(false)

function sampev.onShowDialog(id, style, title, button1, button2, text)
    if id == 5 then
        reportwindow.v = not reportwindow.v
        imgui.Process = reportwindow.v
    end
end
+как убрать само диалоговое окно?
return false не отображает диалог у тебя, но сервер думает что у тебя он открыт, ты можешь ещё взаимодействовать с ним но return false ты должен указать самым последним действием, по этому можешь послать респонс с кнопкой которая закрывает диалог и всё