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

rayprod

Участник
96
1
Народ мб кто шарит, как сделать автосброс ini в опред время. Через дату всё хорошо, но вот время не получается. Может я что-то не верно написал?

Lua:
local dirIni="moonloader/config/stats.ini"

local mainIni = inicfg.load({
config =
{
  date = os.date('%H:%M'),
  ans = 0,
  offwarn = 0,
  alls = 0
},
stats =
{
  date = os.date('%H:%M'),
  ans1 = 0,
  offwarn1 = 0,
  alls = 0
}
}, 'stats.ini')

if not doesFileExist('moonloader/config/stats.ini') then
  inicfg.save(mainIni, 'stats.ini')
end

if mainIni.config.date ~= os.date('%H:%M') == '19:40' then -- проверяет при подгрузке скрипта
    mainIni.config.alls = 0
    mainIni.config.ans = 0
    mainIni.config.ans1 = 0
    mainIni.config.offwarn = 0
    mainIni.config.offwarn1 = 0
    inicfg.save(mainIni, "stats.ini")
end

function main()
    while true do
    wait(0)
    if mainIni.config.date ~= os.date('%H:%M') == '19:40'then
    mainIni.config.alls = 0
    mainIni.config.ans = 0
    mainIni.config.ans1 = 0
    mainIni.config.offwarn = 0
    mainIni.config.offwarn1 = 0
    mainIni.config.date = os.date('%H:%M')
    mainIni.stats.date = os.date('%H:%M')
    inicfg.save(mainIni, "stats.ini")
    end
end
 
  • Влюблен
Реакции: aidzava

advancerp

Известный
77
5
Что здесь не так?
Lua:
function sampev.onPlayerQuit(id, b, c, name)
    local name = sampGetPlayerNickname(id)
    if (name == 'Test_Test' or name == 'Test_Testov' or name == 'Test_Testovich') then
        test()
    end
end

function test()
    for id = 0, sampGetMaxPlayerId(false) do   
        if sampIsPlayerConnected(id) then
            local name = sampGetPlayerNickname(id)
            if name == 'Test_Test' or name == 'Test_Testov' or name == 'Test_Testovich' then
                sampAddChatMessage('123', -1)       
                break
            else
                sampAddChatMessage('1234', -1)
                break
            end
        end
    end
end

Что нужно: например, выходит 1 из игроков, то проверяется, есть ли остальные на сервере, если да, то должно выполниться sampAddChatMessage('123', -1), а если никого нет, то sampAddChatMessage('1234', -1)

Что у меня: в любом случае пишет sampAddChatMessage('1234', -1)
 

Rei

Известный
Друг
1,599
1,635
Как в оффлайне убрать это гавно?
Ебаный Diamond RP, создает эту табличку, а потом кикает тебя, и эта ебучая табличка висит. И она потом не дает нормально зайти на даймонд.
Шо я смог сделать:
Перед тем как сервер меня кикнет отправляю sampRequestClass(0) и успеваю получить RPC_RequestClass (Response) - табличка убираецца, сервер меня кикает и все счастливы. Но не всегда эта херь успевает послать RPC_RequestClass до кика, что табличка может таки зависнуть.
Слать sampRequestClass(0) при подключении не увенчалось успехом - результат Кик за читы, Lost Connection или полеты в пространстве.

Короче, как убрать это ебучее гавно?





Посмотреть вложение 61079
кек, ты все еще этой херней страдаешь? можешь прознать адрес этой кнопки и отправлять нажатие
но я сделал куда проще: таймаут 30+ сек при лось коннекте


Что у меня: в любом случае пишет sampAddChatMessage('1234', -1)

поставь 1234 по выходу из цикла
 

G W

Участник
141
5
Когда отключаю imgui.ShowCursor = true в imgui окно то появляется курсор по центру экрана и невозможно его двигать. Как это возможно исправить ? Хотел сделать вот такое окно без курсора:
Screenshot_2.png
 

Roman Ushnurcev

Участник
34
2
Lua:
function SearchMarker(posX, posY, posZ)
    local ret_posX = 0.0
    local ret_posY = 0.0
    local ret_posZ = 0.0
    local isFind = false
    for id = 0, 31 do
        local MarkerStruct = 0
        MarkerStruct = 0xC7F168 + id * 56
        local MarkerPosX = representIntAsFloat(readMemory(MarkerStruct + 0, 4, false))
        local MarkerPosY = representIntAsFloat(readMemory(MarkerStruct + 4, 4, false))
        local MarkerPosZ = representIntAsFloat(readMemory(MarkerStruct + 8, 4, false))
        if MarkerPosX ~= 0.0 or MarkerPosY ~= 0.0 or MarkerPosZ ~= 0.0 then
            ret_posX = MarkerPosX
            ret_posY = MarkerPosY
            ret_posZ = MarkerPosZ
            isFind = true
        end
    end
    return isFind, ret_posX, ret_posY, ret_posZ
end


--в беск.цикле
if SearchMarker() then
    local px, py, pz = getCharCoordinates(playerPed)
    local _, cx, cy, cz = SearchMarker()
    if math.floor(getDistanceBetweenCoords3d(cx, cy, cz, px, py, pz)) <= 10 then -- 10 - радиус чекпоинта
        sampAddChatMessage('Вы взяли чекпоинт', -1)
    end
end
Как сделать так что бы если игрок уже собрал этот чекпоинт, то в чат ничего не выводилось, пока чекпоинт снова не появится?
 

4e6ypek51

Участник
41
2
Lua:
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local checkboxes = {'Test','Тест','123','CheckBox', 'RandomText'}
local window = imgui.ImBool(false)
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
        if testCheat('JJ') then window.v = not window.v end
        imgui.Process = window.v
    end
end
function imgui.OnDrawFrame()
    imgui.Begin(u8"Тест", window)
    for i=1, #checkboxes do
        imgui.Checkbox(u8(checkboxes[i]), imgui.ImBool(false))
    end
    imgui.End()
end
Посмотреть вложение 61065
Включаю чекбокс и он выключается сразу.
И как можно добавить к нему инпут текст, чтоб каждому чеку свой инпут


Почему string.lower(upper тоже) не работает на русских символах?
Lua:
local txt1 = u8"ПрИвЕтЬ"
local txt2 = string.lower(txt1)

imgui.Text(txt1)
imgui.Text(txt2)
Screenshot_3.png
 
Последнее редактирование:
34
0
Помогите пожалуйста!
Как сделать 2+ imgui окна я разобрался, но как сделать чтобы 1 окно было всегда активно, но без курсора, но при вызове другого окна курсор появлялся. (что-то типо 1-е окно это статистика, а 2-е это обычное меню).
Пытался что-то сделать, но всегда либо закрывались сразу все окна включая статистику, либо не показывался курсор
 

McLore

Известный
559
279
Подскажите возможно ли установить для определенного imgui окна поставить шрифт?
 

Bredd Lane

Известный
423
349
Помогите пожалуйста!
Как сделать 2+ imgui окна я разобрался, но как сделать чтобы 1 окно было всегда активно, но без курсора, но при вызове другого окна курсор появлялся. (что-то типо 1-е окно это статистика, а 2-е это обычное меню).
Пытался что-то сделать, но всегда либо закрывались сразу все окна включая статистику, либо не показывался курсор
Lua:
imgui.ShowCursor = your_main_window.v --если процесс данного имгуи окна активен, то показывается курсор.
Это в функцию imgui.onDrawFrame.
 

samartinell1

Участник
98
14
как сделать чтобы по центру писался текст в имгуи? Я хочу, чтобы название "государственная волна" была по центру, а не слева, как по умолчанию
и что тут можно исправить? Мне нужно, чтобы когда я что-то писал, текст сохранялся в памяти, но если нажму на кнопку "сохранить", сохранялся в mainIni.settings.gnews_line_1, а еще хочу чтобы кнопки "отправить" и "сохранить" были напротив друг друга, а не в разных рядах.
Lua:
if imgui_gnews.v then
    local btnsizegnews = imgui.ImVec2(500, 0)
    local gnews_text_1 = imgui.ImBuffer(u8:decode(mainIni.settings.gnews_line_1), 256)
    imgui.SetNextWindowPos(imgui.ImVec2(imgui.GetIO().DisplaySize.x / 2, imgui.GetIO().DisplaySize.y / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(500, 450), imgui.Cond.FirstUseEver)
    imgui.Begin(u8'Государственная волна',imgui_gnews, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse)
    imgui.Text(u8'3 строки:')
        imgui.TextQuestion2(u8"( ? )", u8"Тэг организации и команду /gnews вводить НЕ нужно!")
    imgui.InputText(u8'1 строка', gnews_text_1)
    if imgui.Button(u8'Отправить') then
      sampSendChat(u8:decode(gnews_text_1.v))
    end
    if imgui.Button(u8'Сохранить') then
      inicfg.save(mainIni, directIni)
    end
    imgui.End()
  end
 

Double Tap Inside

Известный
Проверенный
1,902
1,249
кек, ты все еще этой херней страдаешь? можешь прознать адрес этой кнопки и отправлять нажатие
но я сделал куда проще: таймаут 30+ сек при лось коннекте




поставь 1234 по выходу из цикла
В офлайне она никуда не убирается, даже если нажать. Если бы нарешать адрес как убить эту херь просто, то это было бы шикарно. Но я рак, я не умею блять, памагите!!!
 
34
0
Помогите пожалуйста сделать штуку которая будет менять положение imgui окна.
То есть ты прописал команду и Imgui окно следует за курсором, а нажав ЛКМ, imgui окно сохраняет местоположение
 

A123543

Новичок
1
0
Ребят,как достать ид при прицеле,чтобы потом с ним можна было связать ещё команды?пробовал как вначале темы,не получилось(
 

Roman Ushnurcev

Участник
34
2
В офлайне она никуда не убирается, даже если нажать. Если бы нарешать адрес как убить эту херь просто, то это было бы шикарно. Но я рак, я не умею блять, памагите!!!
Её вроде бы не как нельзя убрать, только если она отключена на сервере. Ищи другие способы.
 
  • Нравится
Реакции: Double Tap Inside