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

thebestsupreme

Участник
170
12
CODE:
local arr = {
    'Нарушения правил лидера',
    'Нарушения правил хелпера',
    'MG',
    'Flood',
    'Caps',
    'DM',
    'DM in Jail',
    'DB',
    'SK',
    'TK',
    'Читы',
    'Вред.читы'
}

local nid = nil


CODE:
    if secondary_window_state.v then
    local ex, ey = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(ex / 6, ey / 6), imgui.Cond.FirstUseEver)
        imgui.SetNextWindowSize(imgui.ImVec2(300, 500), imgui.Cond.FirstUseEver)
        imgui.Begin(u8'Наказать игрока с ID ['..nid..']', secondary_window_state,imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse)   
        -- imgui
        for k,v in ipairs(arr) do
            imgui.Button(u8(v),imgui.ImVec2(280,20))
        end       
        imgui.End()
    end
end


Как можно сделать для 'Нарушения правил лидера', что бы в чат писала lwarn nid Н.П.Л
а для DM jail 5 DM
 

Nelit

Потрачен
252
39
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Можно ли к серверному текстдраву прикрутить действия. Допустим телефон на арз
 

Basho

Известный
148
52
Lua:
function ev.onShowTextDraw(id, data)
    if  id == 2061 then
         local xxxx = tostring(data.text)
         print(xxxx)
    end
end
как сделать, чтобы xxx выводилось при изменении data.text, а не при появлении текстдрава?
 
Последнее редактирование:

CaJlaT

Овощ
Модератор
2,824
2,649
CODE:
local arr = {
    'Нарушения правил лидера',
    'Нарушения правил хелпера',
    'MG',
    'Flood',
    'Caps',
    'DM',
    'DM in Jail',
    'DB',
    'SK',
    'TK',
    'Читы',
    'Вред.читы'
}

local nid = nil


CODE:
    if secondary_window_state.v then
    local ex, ey = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(ex / 6, ey / 6), imgui.Cond.FirstUseEver)
        imgui.SetNextWindowSize(imgui.ImVec2(300, 500), imgui.Cond.FirstUseEver)
        imgui.Begin(u8'Наказать игрока с ID ['..nid..']', secondary_window_state,imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse)  
        -- imgui
        for k,v in ipairs(arr) do
            imgui.Button(u8(v),imgui.ImVec2(280,20))
        end      
        imgui.End()
    end
end


Как можно сделать для 'Нарушения правил лидера', что бы в чат писала lwarn nid Н.П.Л
а для DM jail 5 DM
Наказания сам поменяешь
Lua:
local arr = {
    ['Нарушения правил лидера'] = '/lwarn {id} Н.П.Л',
    ['Нарушения правил хелпера'] = '/warn {id} Н.П.Х',
    ['MG'] = '/mute {id} 30 MetaGaming',
    ['Flood'] = '/mute {id} 30 Flood',
    ['Caps'] = '/mute {id} 30 Caps',
    ['DM'] = '/jail {id} 5 DM',
    ['DM in Jail'] = '/kick {id} DM in Jail',
    ['DB'] = '/jail {id} 5 DB',
    ['SK'] = '/jail {id} 5 SK',
    ['TK'] = '/jail {id} 5 TK',
    ['Читы'] = '/ban {id} 30 Читы',
    ['Вред.читы'] = '/ban {id} 60 Вред.читы'
}

local nid = nil
Lua:
if secondary_window_state.v then
    local ex, ey = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(ex / 6, ey / 6), imgui.Cond.FirstUseEver)
        imgui.SetNextWindowSize(imgui.ImVec2(300, 500), imgui.Cond.FirstUseEver)
        imgui.Begin(u8'Наказать игрока с ID ['..nid..']', secondary_window_state,imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse)   
        -- imgui
        for k, v in pairs(arr) do
            if imgui.Button(u8(k),imgui.ImVec2(280,20)) then
                sampSendChat(v:gsub('%{id%}', nid))
            end
        end       
        imgui.End()
    end
end
 
  • Нравится
Реакции: Gorskin

thebestsupreme

Участник
170
12
как из txt файла можно импортировать текст в imgui
пример кода дайте пожалуйста
 

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,130
как из txt файла можно импортировать текст в imgui
пример кода дайте пожалуйста
Здеся есть.
 

thebestsupreme

Участник
170
12
Здеся есть.
Другой какой то пример дай именно где это видно без лишнего
 

CaJlaT

Овощ
Модератор
2,824
2,649
Другой какой то пример дай именно где это видно без лишнего
там ничего трудного, просто читаешь файл и всё по сути
 

thebestsupreme

Участник
170
12
sa-mp-356.png


Как можно настроить последовательность что бы было также как и в коде начала дм,дб а потом остольное


CODE:
    if secondary_window_state.v then
    local ex, ey = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(ex / 6, ey / 6), imgui.Cond.FirstUseEver)
        imgui.SetNextWindowSize(imgui.ImVec2(300, 500), imgui.Cond.FirstUseEver)
        imgui.Begin(u8'Наказать игрока с ID ['..nid..']', secondary_window_state,imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse)     
        for k, v in pairs(arr) do
            if imgui.Button(u8(k),imgui.ImVec2(280,20)) then
                sampSendChat(v:gsub('%{id%}', nid))
            end
        end       
        imgui.End()
    end
end


CODE:
local arr = {
    ['DM'] = '/jail {id} 10 DM',
    ['DM'] = '/prison {id} 10 DM in jail',
    ['DB'] = '/jail {id} 10 DB',
    ['SK'] = '/jail {id} 10 SK',
    ['TK'] = '/jail {id} 10 TK',
    ['MG'] = '/mute {id} 1 Mute',
    ['Помеха спавну'] = '/kick {id} Помеха спавну',
    ['Помеха'] = '/jail {id} 1 Помеха',
    ['NRP[JAIL]'] = '/jail {id} 10 NRP',
    ['NRP[UVAL]'] = '/uval {id} NRP',
    ['NRP[WARN]'] = '/warn {id} NRP',
    ['Багоюз[KICK]'] = '/kick {id} Багоюз',
    ['Багоюз[WARN]'] = '/warn {id} Багоюз',
    ['Уход в АФК от Наказания'] = '/warn {id} Уход от Наказания',
    ['Оск. Администрации/Игроков]'] = '/mute {id} 10 Оск.Адм/Игрок',
    ['Клевета'] = '/ban {id} 1 Клевета',
    ['Гос.В гетто'] = '/jail {id} 5 Гос.В гетто',
    ['Срыв набора'] = '/jail {id} 5 Срыв набора',
    ['Капс'] = '/mute {id} 5 Caps',
    ['Оффтоп'] = '/mute {id} 5 Offtop',
    ['Флуд'] = '/mute {id} 5 Flood',
    ['Оск.проекта'] = '/mute {id} 20 Оск.проекта',
    ['Мат'] = '/mute {id} 5 Мат',
    ['Читы'] = '/warn {id} Читы',
    ['Вред.читы'] = '/ban {id} 7 Вред.читы',
    ['Оск./Упом.Родных'] = '/mute {id} 30 Оск./Упом.Родных',
    ['+С вне гетто'] = '/jail {id} 5 +C Вне Ghetto',
    ['Неадекват'] = '/ban {id} 1 Неадекват',
    ['Реклама'] = '/ban {id} 7 Реклама',
    ['Слив'] = '/banan {id} Слив',
    ['Создание аккаунтов для слива'] = '/banan {id} Созд.Ак.Для слива',
    ['Обход наказания'] = '/ban {id} 3 Обход наказания'
}

local nid = nil
 

ufdhbi

Известный
Проверенный
1,458
865
Хрен знает, но я чет туплю. Почему это не работает?


Код:
K  = getAllObjects()
    X, Y = getCharCoordinates(playerPed)
    for i = 1, #K do
        X1, Y1 = getObjectCoordinates(K[i])
        if getDistanceBetweenCoords3d(X, Y, X1, Y1) < 50 then
            sampAddChatMessage(getObjectModel(K[i]), color)
        end
    end
Lua:
for i, handle in ipairs(getAllObjects()) do
     X1, Y1 = getObjectCoordinates(handle)
     if getDistanceBetweenCoords3d(X, Y, X1, Y1) < 50 then
     sampAddChatMessage(getObjectModel(handle), color)
     end
end
 
  • Нравится
Реакции: Gorskin и Eugene Crabs

Eugene Crabs

Активный
544
30
Lua:
for i, handle in ipairs(getAllObjects()) do
     X1, Y1 = getObjectCoordinates(handle)
     if getDistanceBetweenCoords3d(X, Y, X1, Y1) < 50 then
     sampAddChatMessage(getObjectModel(handle), color)
     end
end
Использовать ipairs не очень удобно, но ошибка была в функции координат. Там первым параметром какого-то хрена идет boolean, о чем я только что узнал
 

D.Makarov

Участник
146
3
Lua:
function main()
sampRegisterChatCommand("cmd", arg)
cmd = not cmd
        if cmd then
            sampAddChatMessage(" влк ", -1)
        end
        if not cmd then
            sampAddChatMessage(" выкл ", -1)
            end
            end
        
function goKeyPressed(keyID)
lua_thread.create(function()
setVirtualKeyDown(13,true)
wait(20)
setVirtualKeyDown(13,false)
end)
end

function arg()
  goKeyPressed(13)
  wait(20)
  goKeyPressed(13)
  wait(20)
  goKeyPressed(13)
  end
помогите не работает ничего должно по команде флудить альтом(13) , но не флудит) помогите
 

CaJlaT

Овощ
Модератор
2,824
2,649
Lua:
function main()
sampRegisterChatCommand("cmd", arg)
cmd = not cmd
        if cmd then
            sampAddChatMessage(" влк ", -1)
        end
        if not cmd then
            sampAddChatMessage(" выкл ", -1)
            end
            end
       
function goKeyPressed(keyID)
lua_thread.create(function()
setVirtualKeyDown(13,true)
wait(20)
setVirtualKeyDown(13,false)
end)
end

function arg()
  goKeyPressed(13)
  wait(20)
  goKeyPressed(13)
  wait(20)
  goKeyPressed(13)
  end
помогите не работает ничего должно по команде флудить альтом(13) , но не флудит) помогите
в функции arg() забыл поток для задержки