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

Fott

Простреленный
3,435
2,280
Можно ли как то поменять местоположение радара?
 

nimblay

Участник
34
0
Можно ли вывести сразу несколько строк в чат?
Пример: нужно что бы вывело текст диалога, но диалог большой, не вмещается в одну строку. Как исправить?
 

Bredd Lane

Известный
423
348
Хочу, чтобы картинка хранилась в памяти, использовал гайд с этой темы, но, увы, не получается, а именно, сам шрифт в код я вставил, убрал local, чтобы переменная была глобальной, а вот как создать текстуру, используя эту переменную, я не знаю.
 

neverlane

t.me/neverlane00
Друг
997
1,132
Хочу, чтобы картинка хранилась в памяти, использовал гайд с этой темы, но, увы, не получается, а именно, сам шрифт в код я вставил, убрал local, чтобы переменная была глобальной, а вот как создать текстуру, используя эту переменную, я не знаю.
Lua:
--картинка

--если переменная где-то в начале
clogo_data = ... -- тут переменная с картинкой в base85
clogo_data_mem = require("memory").strptr(clogo_data)
clogo = imgui.CreateTextureFromMemory(clogo_data_mem,#clogo_data) -- в переменной clogo будет текстура картинки

-- если переменная где-то в конце
lua_thread.create(function()
    while not clogo_data do wait(0) end -- ожидаем пока переменная с картинкой равна nil
    clogo_data_mem = require("memory").strptr(clogo_data)
    clogo = imgui.CreateTextureFromMemory(clogo_data_mem,#clogo_data)
end)
 
  • Нравится
Реакции: Bredd Lane

damag

Женюсь на официантке в моем любимом баре
Проверенный
1,152
1,192
как в бесконечном цикле получать число с пошью math.random.
Если просто юзать math.random я буду получать флуд числами.
А мне нужно получать одно число без флуда.
 

Carlos777

Потрачен
227
219
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как в бесконечном цикле получать число с пошью math.random.
Если просто юзать math.random я буду получать флуд числами.
А мне нужно получать одно число без флуда.

Lua:
local code = 0

while true do
  wait(0)
  if code == 0 then
    -- math.random
  end
end
 

imring

Ride the Lightning
Всефорумный модератор
2,355
2,517
Хелп, ребят! Получаю строку через ffi.C функцию
Lua:
ReadFile(hFile,buffer,sfp,0,0)
в ffi.new массив
Lua:
local buffer = ffi.new("char[?]", sfp+1)
, но for k,v не хочет перечислять элементы
Код:
'char [?]' has no '__pairs' metamethod
, хотя и возвращается, вроде как, в формате таблицы всё это дело
Как конвертировать полученное в читабельный для луа формат?
это НЕ таблица
Lua:
for i = 1, sfp do print(i, buffer[i]) end
превратить в строку - используй ffi.string
 

Wycmpblu

Известный
143
31
Подскажите, как сделать проверку строки из txt файла на существование? Например ввожу команду /check test_test и если эта строчка содержится в файле то выполняется мое действие.
 

GAuditore

Активный
131
29
Lua:
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local weapons = require 'game.weapons'
local inicfg = require 'inicfg'
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    --sampRegisterChatCommand('test',function() print(getCurrentCharWeapon(playerPed)) end) --ид оружия
    while true do
        wait(0)
        weapon =  getCurrentCharWeapon(playerPed)
        if weapon == 5 then
            sampSendChat('/me достал биту из-за спины')
            weapon = 0
            return false
        end
end

end
Пытаюсь сделать рп ган, но получается бесконечный флуд, как это можно пофиксить?
 

_raz0r

t.me/sssecretway | ТГК: t.me/razor_code
Модератор
1,895
3,064
Можно ли как то поменять местоположение радара?
RadarX - 0x58A79B, 0x5834D4, 0x58A836, 0x58A8E9, 0x58A98A, 0x58A469, 0x58A5E2, 0x58A6E6
RadarY - 0x58A7C7, 0x58A868, 0x58A913, 0x58A9C7, 0x583500, 0x58A499, 0x58A60E, 0x58A71E
RadarHeight - 0x58A47D, 0x58A632, 0x58A6AB, 0x58A70E, 0x58A801, 0x58A8AB, 0x58A921, 0x58A9D5, 0x5834F6
RadarWidth - 0x5834C2, 0x58A449, 0x58A7E9, 0x58A840, 0x58A943, 0x58A99D
RadarScaleWidth - 0x5834EE, 0x58A475, 0x58A602, 0x58A706, 0x58A7BB, 0x58A85C, 0x58A90B, 0x58A9BF
RadarScaleHeight - 0x5834BC, 0x58A443, 0x58A5DA, 0x58A6E0, 0x58A793, 0x58A830, 0x58A8E1, 0x58A984
Radar-Tilt-XPos - 0x58A469
Radar-Tilt-YPos - 0x58A499
Radar-Height-XPos - 0x58A5E2, 0x58A6E6
Radar-Height-YPos - 0x58A60E, 0x58A71E
 
  • Нравится
Реакции: Musaigen, Rei и neverlane

GAuditore

Активный
131
29
Lua:
local weapons = require 'game.weapons'
local inicfg = require 'inicfg'
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    --sampRegisterChatCommand('test',function() print(getCurrentCharWeapon(playerPed)) end) --ид оружия
    while true do
        wait(0)
        weapon =  getCurrentCharWeapon(playerPed)
        if weapon == 5 then
          active = true
        end
        if active then
            sampSendChat('/me достал биту из-за спины')
            active = false
        end
      end
end
Все равно бесконечный флуд, когда бита в руке
 

neverlane

t.me/neverlane00
Друг
997
1,132
Lua:
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local weapons = require 'game.weapons'
local inicfg = require 'inicfg'
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    --sampRegisterChatCommand('test',function() print(getCurrentCharWeapon(playerPed)) end) --ид оружия
    while true do
        wait(0)
        weapon =  getCurrentCharWeapon(playerPed)
        if weapon == 5 then
            sampSendChat('/me достал биту из-за спины')
            weapon = 0
            return false
        end
end

end
Пытаюсь сделать рп ган, но получается бесконечный флуд, как это можно пофиксить?
Lua:
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local weapons = require 'game.weapons'
local inicfg = require 'inicfg'
--nax тебе в rpgun либы я так и не понял...
lastgun = -1
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    --sampRegisterChatCommand('test',function() print(getCurrentCharWeapon(playerPed)) end) --ид оружия
    while true do
        wait(0)
        weapon =  getCurrentCharWeapon(playerPed)
        if lastgun ~= weapon then   
            if weapon == 5 then
                sampSendChat('/me достал биту из-за спины')
                lastgun = weapon
            end
        end
    end
end
 

Wycmpblu

Известный
143
31
В чем соль?
Lua:
function blackList()
    imgui.BeginChild('##blacklist', ImVec2(0, 160), true)
    bklist = io.open('moonloader\\config\\blacklist.txt', 'r+');
    if bklist == nil then
        bklist = io.open('moonloader\\config\\blacklist.txt', 'w');
        bklist:close();
        bklist = io.open('moonloader\\config\\blacklist.txt', 'r+');
    end
    for line in bklist:lines() do
        imgui.Text(tostring(line))
    end
    imgui.EndChild()
    imgui.PushItemWidth(320)
    imgui.InputText('##addblist', addblist) imgui.SameLine(0,2)
    if imgui.Button(u8'Добавить', ImVec2(80,20)) then
        bklist:write(tostring('\n'..addblist.v))
        bklist:flush()
    end
end
через некоторое время тупо крашит скрипт. в логе вот это: attempt to index global 'bklist' (a nil value)