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

kpytou99

Новичок
12
0
как сделать чтобы садясь в машину определенного айди меня выкидывало с какой либо надписью хелп
 

NetyEgo

Участник
164
10
lockPlayerControl(bool lock)
можно поинтересоваться, а куда его вставлять?
LUA:
function imgui.OnDrawFrame()
    imgui.SetNextWindowSize(imgui.ImVec2(900, 905), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    
    imgui.Begin(fa.ICON_FA_SPINNER .. " DRPHelper", main_window_state, imgui.WindowFlags.AlwaysAutoResize + imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoResize)
    
    imgui.BeginChild("##Button", imgui.ImVec2(150, 650), true, imgui.WindowFlags.NoScrollbar)
    
    if not selected then selected = 4 end
    if imgui.Button(fa.ICON_FA_SERVER .. u8" Функции.", imgui.ImVec2(135, 50)) then selected = 1 end
    if imgui.Button(fa.ICON_FA_COGS .. u8" Настройки.", imgui.ImVec2(135, 50)) then selected = 2 end
    if imgui.Button(fa.ICON_FA_BOOK .. u8" Список команд.", imgui.ImVec2(135, 50)) then selected = 3 end
    if imgui.Button(fa.ICON_FA_INFO .. u8" Информация.", imgui.ImVec2(135, 50)) then selected = 4 end
    imgui.EndChild()
    imgui.SameLine()
    imgui.BeginGroup()
 
  • Злость
Реакции: MaksQ

JustFedot

Известный
279
281
можно поинтересоваться, а куда его вставлять?
LUA:
function imgui.OnDrawFrame()
    imgui.SetNextWindowSize(imgui.ImVec2(900, 905), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
   
    imgui.Begin(fa.ICON_FA_SPINNER .. " DRPHelper", main_window_state, imgui.WindowFlags.AlwaysAutoResize + imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoResize)
   
    imgui.BeginChild("##Button", imgui.ImVec2(150, 650), true, imgui.WindowFlags.NoScrollbar)
   
    if not selected then selected = 4 end
    if imgui.Button(fa.ICON_FA_SERVER .. u8" Функции.", imgui.ImVec2(135, 50)) then selected = 1 end
    if imgui.Button(fa.ICON_FA_COGS .. u8" Настройки.", imgui.ImVec2(135, 50)) then selected = 2 end
    if imgui.Button(fa.ICON_FA_BOOK .. u8" Список команд.", imgui.ImVec2(135, 50)) then selected = 3 end
    if imgui.Button(fa.ICON_FA_INFO .. u8" Информация.", imgui.ImVec2(135, 50)) then selected = 4 end
    imgui.EndChild()
    imgui.SameLine()
    imgui.BeginGroup()

lockPlayerControl(true) -- Куда-то под imgui.Begin можно
lockPlayerControl(false) -- Туда где ты закрываешь окно imgui

Надеюсь помог :3
 

Rei

Известный
Друг
1,590
1,621
вопрос по ракботу, но суть одна, как записать цифры из сообщения ( в данном случае дни бана ) в переменную? не очень пока представляю как это правильно сделать

Lua:
function onServerMessage(msg)
    if msg:find("забанил игрока " .. getNickName() .. " на %d") then
    printLog('забанили акк на  дней :(')
    printLog(msg)
    end
end
 

JustFedot

Известный
279
281
вопрос по ракботу, но суть одна, как записать цифры из сообщения ( в данном случае дни бана ) в переменную? не очень пока представляю как это правильно сделать

Lua:
function onServerMessage(msg)
    if msg:find("забанил игрока " .. getNickName() .. " на %d") then
    printLog('забанили акк на  дней :(')
    printLog(msg)
    end
end
local ban = msg:match("забанил игрока " .. getNickName() .. " на (%d+)")
printLog("забанили на "..ban.." дней")
 
  • Нравится
Реакции: Rei

MaksQ

Известный
967
817
LUA:
if selected == 4 then
    imgui.BeginChild("##Cheats", imgui.ImVec2(400, 650), true, imgui.WindowFlags.NoScrollbar)
    if imgui.Checkbox(u8"Анти Афк.", aafk) then
        if aafk.v == true then
            printString('~g~ AFK ON', 2000)
            writeMemory(7634870, 1, 1, 1)
            writeMemory(7635034, 1, 1, 1)
            memory.fill(7623723, 144, 8)
            memory.fill(5499528, 144, 6)
            sampAddChatMessage("{EBFF12}[{1E00FF}DRPHelper{EBFF12}] {FFFFFF}Анти Афк {04FF00}активирован.", 0xFFFFFF)        
        end
        if aafk.v == false then
            writeMemory(7634870, 1, 0, 0)
            writeMemory(7635034, 1, 0, 0)
            memory.hex2bin('5051FF1500838500', 7623723, 8)
            memory.hex2bin('0F847B010000', 5499528, 6)    
            sampAddChatMessage("{EBFF12}[{1E00FF}DRPHelper{EBFF12}] {FFFFFF}Анти Афк {FF1212}деактивирован.", 0xFFFFFF)
        end
    end
    imgui.EndChild()
end
крашит этот код
У тебя есть сохранение настроек в config?
LUA:
if selected == 4 then
    imgui.BeginChild("##Cheats", imgui.ImVec2(400, 650), true, imgui.WindowFlags.NoScrollbar)
    if imgui.Checkbox(u8"Анти Афк.", aafk) then
        if aafk.v == true then
            printString('~g~ AFK ON', 2000)
            writeMemory(7634870, 1, 1, 1)
            writeMemory(7635034, 1, 1, 1)
            memory.fill(7623723, 144, 8)
            memory.fill(5499528, 144, 6)
            sampAddChatMessage("{EBFF12}[{1E00FF}DRPHelper{EBFF12}] {FFFFFF}Анти Афк {04FF00}активирован.", 0xFFFFFF)         
        end
        if aafk.v == false then
            writeMemory(7634870, 1, 0, 0)
            writeMemory(7635034, 1, 0, 0)
            memory.hex2bin('5051FF1500838500', 7623723, 8)
            memory.hex2bin('0F847B010000', 5499528, 6)     
            sampAddChatMessage("{EBFF12}[{1E00FF}DRPHelper{EBFF12}] {FFFFFF}Анти Афк {FF1212}деактивирован.", 0xFFFFFF)
        end 
    end
    imgui.EndChild()
end
крашит этот код
Могу тебе помочь со скриптом, можешь в дискорде написать мне MAKS#0990 или телеге @MaksQi

😆😆😆
 

mails2k18

Участник
45
0
Приветствую, у меня есть готовый скрипт, в котором есть некоторые функции по активацию клавиш, как мне сделать, чтобы скрипт брал клавиши из блокнота, например с использованием inicfg?

Пытался сделать так:
Lua:
    if isKeyJustPressed('..mainIni.settings.dokladknopka..') then
    sampSendChat('/r ['..mainIni.raciya.teg..']: Докладываю, веду патруль '..mainIni.raciya.gorod..', Состояние: Стабильное')
    end
Скрипт запускается, всё нормально, но на клавишу никакой реакции нет, если делать так, как сделал я.
Помогите пожалуйста исправить...
 

MaksQ

Известный
967
817
Приветствую, у меня есть готовый скрипт, в котором есть некоторые функции по активацию клавиш, как мне сделать, чтобы скрипт брал клавиши из блокнота, например с использованием inicfg?

Пытался сделать так:
Lua:
    if isKeyJustPressed('..mainIni.settings.dokladknopka..') then
    sampSendChat('/r ['..mainIni.raciya.teg..']: Докладываю, веду патруль '..mainIni.raciya.gorod..', Состояние: Стабильное')
    end
Скрипт запускается, всё нормально, но на клавишу никакой реакции нет, если делать так, как сделал я.
Помогите пожалуйста исправить...
Вроде нужно это добавить

Lua:
local dokladknopka = imgui.ImBuffer(u8''.. mainIni.settings.dokladknopka, 256)




    if isKeyJustPressed(dokladknopka.v) then
    sampSendChat('/r ['..mainIni.raciya.teg..']: Докладываю, веду патруль '..mainIni.raciya.gorod..', Состояние: Стабильное')
    end
 

mails2k18

Участник
45
0
Вроде нужно это добавить

Lua:
local dokladknopka = imgui.ImBuffer(u8''.. mainIni.settings.dokladknopka, 256)




    if isKeyJustPressed(dokladknopka.v) then
    sampSendChat('/r ['..mainIni.raciya.teg..']: Докладываю, веду патруль '..mainIni.raciya.gorod..', Состояние: Стабильное')
    end
Не помогает такой метод, другие варианты есть?
 

Pu$$y

Участник
80
2
nope
upd: but u can do it like this
Lua:
S = "15, 12, 20"
local x, y, z = S:match('(%d+), (%d+), (%d+)')
print(tonumber(x), tonumber(y), tonumber(z))
Lua:
sampRegisterChatCommand("locate", function(find)
        local filefind = io.open("moonloader/locations.txt", "r")
        for line in filefind:lines() do
            if string.find(line, find) then
                coords = filefind:read("*line")
                local posx, posy, posz = coords:match("(%d+) , (%d+) , (%d+)")
                local posxt = tonumber(posx)
                local posyt = tonumber(posy)
                local poszt = tonumber(posz)
                sampAddChatMessage(posxt, 0xFFFFFF)
                sampAddChatMessage(posyt, 0xFFFFFF)
                sampAddChatMessage(poszt, 0xFFFFFF)
                --setTargetBlipCoordinates(posxt, posyt, poszt)
            end
        end
    end)

It's not working, I am getting an empty line in the chat.

Here is an image of the file

testf.png
 

NetyEgo

Участник
164
10
как сделать в imgui.nputText(u8"фраза которая хранится в ini фалйе", odin)

пытаюсь создать автологин для дрп, никак не могу, окно тупо пропадает либо же не водится пароль
LUA:
if selected == 2 then
    imgui.BeginChild("##Setting", imgui.ImVec2(400, 650), true, imgui.WindowFlags.NoScrollbar)
    if imgui.InputText(u8"", parol) then
        mainIni.config.parol = u8:decode(parol.v)
        inicfg.save(mainIni, "DRPHelper.ini")
    end   
    imgui.SameLine()
    imgui.TextQuestion(u8"Пароль который будет водиться в окно авторизации.(Только на Diamond RP)")
    imgui.EndChild()
end

LUA:
function samp.onShowDialog(id, style, title, button1, button2, text)
    if autologin.v then
        if id == (2) then
            sampSendDialogResponse(id, 1, _, parol)
            return false
        end
    end
end
 
Последнее редактирование: