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

getsdfssdfsdfs

Участник
45
0
Model ты уже получил
Lua:
GxtString name = getNameOfVehicleModel(Model model)
и как это использовать?


Lua:
local text_pred = imgui.ImBuffer(24)
local popupInput = imgui.ImBuffer(128)
local number_pred = imgui.ImInt(1)
local comboBand = imgui.ImInt(16)


            if imgui.BeginPopupModal('Выдача предов') then
        imgui.PushItemWidth(250)
                local band_list = {'Grove', 'Vagos', 'Ballas', 'Rifa'}
                local selected_lag = imgui.ImInt(0)
                if imgui.Combo("##band", comboBand, band_list) then

                end

                imgui.SameLine()

                imgui.PushItemWidth(250)

            if imgui.InputText("", text_pred) then

                end

                imgui.SameLine()
                imgui.PushItemWidth(150)
              imgui.InputInt("1", number_pred)

            if imgui.Button('Отправить', imBool3) then -- При нажатии на кнопку
                    sampSendChat("/a "..comboBand.v.. " " ..text_pred.v.." "..number_pred.v)
            end

Как вывести в sampSendChat выбранную банду из comboBox?
Lua:
imgui.Combo('', comboBand, band_list)
if imgui.Button(u8('Отправить')) then
    sampSendChat('Вы выбрали: '..band_list[comboBand + 1]..' банду')
end
 
Последнее редактирование:

zippy

Участник
67
32
и как это использовать?
Lua:
if  isCharInAnyCar(PLAYER_PED) then
    car = storeCarCharIsInNoSave(PLAYER_PED) -- Получение машины в которой сидит игрок
    model = getCarModel(car) -- получение id модели
    nameModel = getNameOfVehicleModel(model) -- Получение имени модели
    sampAddChatMessage(string.format("Id model: %d Name model: %s",model, nameModel),-1)
end
Когда игрок залезает в машину он пишет id модели и имя модели машины
и как это использовать?



Lua:
imgui.Combo('', comboBand, band_list)
if imgui.Button(u8('Отправить')) then
    sampSendChat('Вы выбрали: '..band_list[comboBand + 1]..' банду')
end
где ты хочешь это использовать и для чего
 

|DEVIL|

Известный
363
280
Всем привет. Проблема в скрипте, мне нужно чтобы каждый раз при вводе команде скрипт убавлял 1 из числа num в конфиге(4,3,2,1), но получилось так что он просто убавляет 1 и выдаёт каждый раз 4 (4,4,4,4). В чём проблема?
Сам код:
script_name('Test')
script_author('Marcus_Devil')
script_version('1.7')

require "lib.moonloader"
require "lib.sampfuncs"
local hook = require "lib.samp.events"
local wh = 0xFFFFFF
local tag = "{800080}[CONOR HELPER]: {FFFFFF}"
local inicfg = require 'inicfg'
local directIni = "moonloader//config//direct.ini"
local mainIni = inicfg.load(nil,directIni)


 

function main()
 if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("sys",hey)
    
    end
    
    function hey()
    local num = mainIni.attemps.num
    if num > 0 then
    num = num - 1
    sampAddChatMessage(num, wh)
    end
    
    end

Конфиг:
[attemps]
num=5
 

zippy

Участник
67
32
Всем привет. Проблема в скрипте, мне нужно чтобы каждый раз при вводе команде скрипт убавлял 1 из числа num в конфиге(4,3,2,1), но получилось так что он просто убавляет 1 и выдаёт каждый раз 4 (4,4,4,4). В чём проблема?
Сам код:
script_name('Test')
script_author('Marcus_Devil')
script_version('1.7')

require "lib.moonloader"
require "lib.sampfuncs"
local hook = require "lib.samp.events"
local wh = 0xFFFFFF
local tag = "{800080}[CONOR HELPER]: {FFFFFF}"
local inicfg = require 'inicfg'
local directIni = "moonloader//config//direct.ini"
local mainIni = inicfg.load(nil,directIni)




function main()
if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("sys",hey)
   
    end
   
    function hey()
    local num = mainIni.attemps.num
    if num > 0 then
    num = num - 1
    sampAddChatMessage(num, wh)
    end
   
    end

Конфиг:
[attemps]
num=5
num = tonumber(num)
 
  • Нравится
Реакции: |DEVIL|

Petr_Sergeevich

Известный
Проверенный
707
297
Всем привет. Проблема в скрипте, мне нужно чтобы каждый раз при вводе команде скрипт убавлял 1 из числа num в конфиге(4,3,2,1), но получилось так что он просто убавляет 1 и выдаёт каждый раз 4 (4,4,4,4). В чём проблема?
Сам код:
script_name('Test')
script_author('Marcus_Devil')
script_version('1.7')

require "lib.moonloader"
require "lib.sampfuncs"
local hook = require "lib.samp.events"
local wh = 0xFFFFFF
local tag = "{800080}[CONOR HELPER]: {FFFFFF}"
local inicfg = require 'inicfg'
local directIni = "moonloader//config//direct.ini"
local mainIni = inicfg.load(nil,directIni)




function main()
if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("sys",hey)
   
    end
   
    function hey()
    local num = mainIni.attemps.num
    if num > 0 then
    num = num - 1
    sampAddChatMessage(num, wh)
    end
   
    end

Конфиг:
[attemps]
num=5
Тебе нужно перезаписать значение num и сохранить ini файл
Lua:
mainIni.attemps.num = mainIni.attemps.num - 1
inicfg.save(mainIni, directIni)

sampAddChatMessage(mainIni.attemps.num, -1)
 
  • Нравится
Реакции: |DEVIL| и zippy

zippy

Участник
67
32
Как вставить картинку в имгуи меню?
Помню Саксон отвечал.
45218
Lua:
image = imgui.CreateTextureFromFile(getGameDirectory() .. "\\moonloader\\icon\\goblin.jpg")
if image then
    imgui.Image(image, imgui.ImVec2(350, 200))
end
Советую сделать проверку на то что у тебя текстура загружена или нет. А то он будет тебе загружать текстуру пока комп не сгорит
Lua:
if not image then
    image = imgui.CreateTextureFromFile(getGameDirectory() .. "\\moonloader\\icon\\goblin.jpg")
end
 
  • Нравится
Реакции: Fabregoo
Всем привет. Проблема в скрипте, мне нужно чтобы каждый раз при вводе команде скрипт убавлял 1 из числа num в конфиге(4,3,2,1), но получилось так что он просто убавляет 1 и выдаёт каждый раз 4 (4,4,4,4). В чём проблема?
Сам код:
script_name('Test')
script_author('Marcus_Devil')
script_version('1.7')

require "lib.moonloader"
require "lib.sampfuncs"
local hook = require "lib.samp.events"
local wh = 0xFFFFFF
local tag = "{800080}[CONOR HELPER]: {FFFFFF}"
local inicfg = require 'inicfg'
local directIni = "moonloader//config//direct.ini"
local mainIni = inicfg.load(nil,directIni)




function main()
if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("sys",hey)
   
    end
   
    function hey()
    local num = mainIni.attemps.num
    if num > 0 then
    num = num - 1
    sampAddChatMessage(num, wh)
    end
   
    end

Конфиг:
[attemps]
num=5
Так ты каждый раз при вызове функции hey() заново читаешь ини файл. Собственно, первый раз он прочитал ини файл и от 5 отнял 1 = 4. Потом ты опять вызываешь функцию, он опять читает ини файл, опять отнимает от 5 -1=4.
 
  • Нравится
Реакции: |DEVIL|

Fabregoo

Известный
656
128
Как примерно работает ТП в ловли контейнеров, есть ли примеры?
 

sanders

Потрачен
253
126
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
  • Нравится
Реакции: Fabregoo

sanders

Потрачен
253
126
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
В какой функции?..
ды хоть в main)
разницы нет
но смотри код ниже
Lua:
function sendOnfootSync(slot0, slot1, slot2, slot3)
    slot4 = samp_create_sync_data("player")
    slot4.position = {
        slot0,
        slot1,
        slot2
    }
    slot4.moveSpeed = {
        0.3,
        0.3,
        0.3
    }
    slot4.keysData = slot3

    slot4.send()
end
 
  • Нравится
Реакции: Fabregoo

Di3

Участник
432
20
Код:
function getProcessorName()
    local handle = io.popen('reg.exe QUERY HKLM\\HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0 /v ProcessorNameString')
    local result = handle:read("*a")
    local processor_name = result:match('REG_SZ%s+(.+)'):gsub('%s+$', '')
    handle:close()
    return processor_name
end

Возможно ли избежать сворачивания игры от функции получения проца?
 

Petr_Sergeevich

Известный
Проверенный
707
297
Код:
function getProcessorName()
    local handle = io.popen('reg.exe QUERY HKLM\\HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0 /v ProcessorNameString')
    local result = handle:read("*a")
    local processor_name = result:match('REG_SZ%s+(.+)'):gsub('%s+$', '')
    handle:close()
    return processor_name
end

Возможно ли избежать сворачивания игры от функции получения проца?
Игра сворачивается из-за открытия командной строки в io.popen()
Используй другую функцию

Lua:
function getProcessorName()
    local qwords = ffi.typeof("uint64_t[?]")
    local dwords = ffi.typeof("uint32_t *")
    local cpuid_EAX_EDX = ffi.cast("__cdecl uint64_t (*)(uint32_t)", "\x53\x0F\xA2\x5B\xC3")
    local cpuid_EBX_ECX = ffi.cast("__cdecl uint64_t (*)(uint32_t)", "\x53\x0F\xA2\x91\x92\x93\x5B\xC3")
    local function cpuid(n)
        local arr = ffi.cast(dwords, qwords(2, cpuid_EAX_EDX(n), cpuid_EBX_ECX(n)))
        return ffi.string(arr, 4), ffi.string(arr + 2, 4), ffi.string(arr + 3, 4), ffi.string(arr + 1, 4)
    end
    local s1 = ""
    for n = 0x80000002, 0x80000004 do
        local eax, ebx, ecx, edx = cpuid(n)
        s1 = s1..eax..ebx..ecx..edx
    end
    s1 = s1:gsub("^%s+", ""):gsub("%z+$", "")
    local eax, ebx, ecx, edx = cpuid(0)
    local s2 = ebx..edx..ecx
    s2 = s2:gsub("^%s+", ""):gsub("%z+$", "")
    local result = ("%s, %s"):format(s1, s2)
    return result
end