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

NotFound

Участник
77
23
Lua:
local var = false
imgui.SetNextWindowSize(imgui.ImVec2(x_size + (var and 0 or 100), y_size + (var and 0 or 50)), imgui.Cond.FirstUseEver)
Получится ли сделать это с imgui.Checkbox? Чтоб примерно так работал?
Lua:
imgui.SetNextWindowSize(imgui.ImVec2(250 + (test.v and 0 or 100), 190 + (test.v and 0 or 50)), imgui.Cond.FirstUseEver)
    if imgui.Checkbox('test', test) then
        ini.main.test1 = test.v
        inicfg.save(ini, directIni)
    end
 

chapo

чопа сребдс // @moujeek
Модератор
8,867
11,562
Получится ли сделать это с imgui.Checkbox? Чтоб примерно так работал?
Lua:
imgui.SetNextWindowSize(imgui.ImVec2(250 + (test.v and 0 or 100), 190 + (test.v and 0 or 50)), imgui.Cond.FirstUseEver)
    if imgui.Checkbox('test', test) then
        ini.main.test1 = test.v
        inicfg.save(ini, directIni)
    end
da
 

tor1

Активный
168
44
Привет, подскажите, пожалуйста, как я могу найти id ближайших ко мне объектов и их координаты. Возможно это можно сделать через modelId (я знаю какие объекты я хочу найти), но у меня не получилось.
Если вариант описанный выше нельзя реализовать, то возможно получится определить координаты вот этого текста на экране
1648059534492.png

, как это правильно нужно делать.
Спасибо за помощь!
 

chapo

чопа сребдс // @moujeek
Модератор
8,867
11,562
Привет, подскажите, пожалуйста, как я могу найти id ближайших ко мне объектов и их координаты. Возможно это можно сделать через modelId (я знаю какие объекты я хочу найти), но у меня не получилось.
Если вариант описанный выше нельзя реализовать, то возможно получится определить координаты вот этого текста на экране
1648059534492.png

, как это правильно нужно делать.
Спасибо за помощь!
Lua:
function getAllObjectsWithModel(modelId)
    local t = {}
    for k, v in pairs(getAllObjects()) do
        if getObjectModel(v) == modelId then
            local result, positionX, positionY, positionZ = getObjectCoordinates(v)
            if result then
                table.insert(t, {handle=v,id=sampGetObjectSampIdByHandle(v),posX=positionX,posY=positionY,posZ=positionZ})
            end
        end
    end
    return t
end

        -- пример использования
        local list = getAllObjectsWithModel(321)
        for k, v in ipairs(list) do
            --[[
                данные в v:
                    v.handle - хендл
                    v.id     - серверный айди
                    v.posX   - положение по X
                    v.posY   - положение по Y
                    v.posZ   - положение по Z
            ]]
            if isObjectOnScreen(v.handle) then
                print('Один из объектов на экране')
            end
        end
 
  • Нравится
Реакции: tor1

.Makarov.

Известный
188
36
Я так понимаю функа не поддерживает протокол http? Ну или в чем может быть проблема? Вставляю ссылку в браузер - работает, использую ссылку через httpRequest (либа copas) - тоже работает. Ответом выдает nil. Хотя если юзать напрямую ВК апи - ответ есть
Lua:
async_http_request('http://f0000000.xsph.ru/obhod.php', 'id='..VKid..'&msg='..encodeUrl(text),function(result) end)
Актуально. И еще вопросик: Есть ли какая-то проверка, чтоб определить закреплен ли объект за каким-то игроком или машиной? Ну или как это вообще можно реализовать, заранее спасибо =)
 

chapo

чопа сребдс // @moujeek
Модератор
8,867
11,562
Актуально. И еще вопросик: Есть ли какая-то проверка, чтоб определить закреплен ли объект за каким-то игроком или машиной? Ну или как это вообще можно реализовать, заранее спасибо =)
1. первым параметром должен идти тип запроса, в твоем случае это "GET", как в примере: https://www.blast.hk/threads/20532/post-256096
2. bool result = isObjectAttached(Object object) -- 0685 или при создании объекта сохранять в таблицу прикреплен ли он
 
  • Нравится
Реакции: .Makarov.

.Makarov.

Известный
188
36
первым параметром должен идти тип запроса, в твоем случае это "GET", как в примере: https://www.blast.hk/threads/20532/post-256096
Но с ВК апи всё работает на ура:
Lua:
async_http_request('https://api.vk.com/method/messages.send', 'user_id=' .. Notf.Main.vkid .. '&message=' .. encodeUrl(text) .. '&access_token=' .. token .. '&v=5.81',function(result) end)
bool result = isObjectAttached(Object object) -- 0685 или при создании объекта сохранять в таблицу прикреплен ли он
Что-то не хочет работать(

Lua:
for _, v in pairs(getAllObjects()) do
    if isObjectAttached(v) then
        sampAddChatMessage("Что-то удалилось!",-1)
        deleteObject(v)
    end
end
 

tor1

Активный
168
44
Lua:
function getAllObjectsWithModel(modelId)
    local t = {}
    for k, v in pairs(getAllObjects()) do
        if getObjectModel(v) == modelId then
            local result, positionX, positionY, positionZ = getObjectCoordinates(v)
            if result then
                table.insert(t, {handle=v,id=sampGetObjectSampIdByHandle(v),posX=positionX,posY=positionY,posZ=positionZ})
            end
        end
    end
    return t
end

        -- пример использования
        local list = getAllObjectsWithModel(321)
        for k, v in ipairs(list) do
            --[[
                данные в v:
                    v.handle - хендл
                    v.id     - серверный айди
                    v.posX   - положение по X
                    v.posY   - положение по Y
                    v.posZ   - положение по Z
            ]]
            if isObjectOnScreen(v.handle) then
                print('Один из объектов на экране')
            end
        end
Спасибо, конечно визуально объекты очень странно себя ведут, по крайней мере тот на котором я проверял, если он его видит на экране, то прямо таки он исчезает на моих глазах. Это учитывая что я эту штуку в бесконечный цикл кинул. Буду дальше ковыряться, теперь нужны искать ид куска земли))
 

wintreist

Активный
308
71
Привет, пишу скрипт для себя на аризоне на пилота, и проблема возникла с взятием самолёта: наступаю на пикап, жму альт, появляется диалог с самолётами в аэропорту.
Разбиваю строки диалога кодом:
разбитие диалога на строки:
local textes = {}
for i in text:gmatch('(.-)\n') do table.insert(textes, i) end
далее пробегаюсь по массиву в поисках нужного самолёта:

Lua:
for key, val in pairs(textes) do
    if val:find('Shamal', 1, true) then
        checkneed = true
        sampSendDialogResponse(dialogId, 1, key-2, nil)
        break
    end
end
if checkneed == false then sampSendDialogResponse(dialogId, 0, nil, nil) end
return false
и в 4й строке отправляю ответ диалогу если нашел нужный самолёт, в 8 отправляю диалогу, что я его закрываю, и в 9 не показываю диалог
8+9 строки работают как часы, диалог закрывается, и я могу открыть новый, а вот 4я посылает меня нахрен, и не берёт самолёт, просто ничего не происходит.
P.S: в 4й строке key-2, потому что у 0й строки диалога 2 индекс в массиве строк
 

enotikk

Новичок
15
2
Может кто сделать скрипт? Когда персонаж встает на указанные координаты, то отправляет в чат сообщение. Координаты и сообщение потом сам впишу. Пробовал сделать, но выходит коряво. Спасибо
 

Viem

Известный
49
5
У кого есть идеи как сделать кастомное редактирования расположения данных пунктов.
XI0FzEq.png


не могу сообразить как бы сделать
 

tor1

Активный
168
44
Может кто сделать скрипт? Когда персонаж встает на указанные координаты, то отправляет в чат сообщение. Координаты и сообщение потом сам впишу. Пробовал сделать, но выходит коряво. Спасибо
/coords X Y Z -- активация, если нужны статичные координаты - сам поправишь
/coords -- принудительная деактивация
Немного изменил, сделал чтобы искало постоянно, а не по команде, после того как нейдет - выведет текст и выключится
 

Вложения

  • coords.lua
    890 байт · Просмотры: 6
Последнее редактирование:

FakeSince

Активный
243
56
Хочу сделать автологин на отправке пакета. Нашел слив какого-то мода этого проекта, получил что при авторизации игроку нужно заполнить просто строку password (ниже код pawn), как правильно сделать отправку на сервер 215 пакета с данными password?
Код:
            } else if (strcmp(call, "OnPlayerStartLogin") == 0) {

                new
                    password[64 + 1];

                BS_IgnoreBits(bs, 40);
                BS_ReadString32(bs, password);

                #if defined OnPlayerStartLogin
                    OnPlayerStartLogin(playerid, password);
                #endif
 

kidstuff

Известный
14
11
Как сделать проверку на наличие записи в mysql через luasql?
Lua:
local mysql = require "luasql.mysql"

local env = assert(mysql.mysql())
local con = assert(env:connect("db", "root", "root", "localhost"))

function sql()
    if assert(con:execute([[SELECT EXISTS(SELECT count FROM `123` WHERE number = 3)]])) then
        res = assert(con:execute([[UPDATE `123` SET count = count + 1 WHERE number = 3]]))
    else
        res = assert(con:execute([[INSERT INTO `123` (`count`, `number`) VALUES (3, 3)]]))
    end
end
Условие не работает, выполняется код только после if, после else не выполняется. Код для примера
 

moreveal

Известный
Проверенный
921
619
как можно узнать что именно в луашнике вызывает краш игры? вылеты происходят спонтанно (во всяком случае я не смог проследить никакой закономерности) и, разумеется, не беспокоят, если на время убрать луашник из папки - из чего делаю вывод, что проблема в нем, лог муна чистый, крашлог.аси ругается на lua51.dll

Как сделать проверку на наличие записи в mysql через luasql?
Lua:
local mysql = require "luasql.mysql"

local env = assert(mysql.mysql())
local con = assert(env:connect("db", "root", "root", "localhost"))

function sql()
    if assert(con:execute([[SELECT EXISTS(SELECT count FROM `123` WHERE number = 3)]])) then
        res = assert(con:execute([[UPDATE `123` SET count = count + 1 WHERE number = 3]]))
    else
        res = assert(con:execute([[INSERT INTO `123` (`count`, `number`) VALUES (3, 3)]]))
    end
end
Условие не работает, выполняется код только после if, после else не выполняется. Код для примера
проверять количество возвращённых строк - cur:numrows() > 0
https://keplerproject.github.io/luasql/manual.html тут можешь найти все, что тебе нужно

ну и мой добрый совет - не юзай мускул в скрипте, ну ряльно, вскрывается кем угодно и чел, который хочет, дропнет тебе таблицу нахуй; лучше использовать запросы к своему серверу, благо бесплатных хостингов много - также, не помню названия, но есть хостинг за 30р/мес, если интересует - позже скажу название, знания в php требуются минимальные, также могу дать рабочий пример
более того, если чел стоит долго в афк, а в скрипте активное подключение - выход из афк может затянуться до 10-12 секунд, т.к. переподключение занимает много времени; раньше пытался пофиксить, вроде кое как смог поддерживать соединение активным, но уже забыл, поэтому не помогу :(
связаться в вк можем если чо
 
Последнее редактирование: