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

BoltHack

Новичок
12
2
Есть бот, ему надо ехать и вперед и назад.
Как ездить вперед и назад + управлять поворотом уже готов
Осталось определиться с методом определения куда ему ехать
Вперед или назад
Получается записанные координаты должны в этом помочь

Только как?
Получить смещение координат X Y перед машиной и за машиной?
И проверить в радиусе какой из выше перечисленных находится метка куда езать
И от этого уже действие

Подскажите может что-то поумнее предложите
 

Ya Zaregalsya

Известный
386
134
Есть функция processLineOfSight(), есть код с ней:

Lua:
function pizdectest()
    lua_thread.create(function()
        myPosX, myPosY, myPosZ = getCharCoordinates(PLAYER_PED)
        firstObject = createObject(913, myPosX + 10, myPosY, myPosZ)
        secondObject = createObject(913, myPosX + 10, myPosY + 10, myPosZ)
        wait(1000)
        _, oPosX, oPosY, oPosZ = getObjectCoordinates(secondObject)
        result, pizdec = processLineOfSight(myPosX + 10, myPosY - 10, myPosZ, oPosX, oPosY, oPosZ,
            true, false, false, true, false, false, false, false)
        wait(1000)
        if result then
            print("------------------------------")
            print("firstObject pos: x = "..oPosX.."; y = "..oPosY.."; z = "..oPosZ)
            print("tPoint: x = "..pizdec.pos[1].."; y = "..pizdec.pos[2].."; z = "..pizdec.pos[3])
            print("normal: x = "..pizdec.normal[1].."; y = "..pizdec.normal[2].."; z = "..pizdec.normal[3])
            print("surfType[1]: "..pizdec.surfaceType[1].."; surfType[2]: "..pizdec.surfaceType[2])
            print("pieceType[1]: "..pizdec.pieceType[1].."; pieceType[2]: "..pizdec.pieceType[2])
            print("depth: "..pizdec.depth)
            print("firstObject entity: "..firstObject.."; pizdec entity: "..pizdec.entity)
            print("pizdecEntityType: "..pizdec.entityType)
            if pizdec.entity == firstObject then
                print("itog: RABOTAET!!!!!")
            elseif pizdec.entity == secondObject then
                print("itog: cherez jopu, no RABOTAET!!!!")
            else
                print("itog: nifiga ne rabotaet")
            end
            print("------------------------------")
        end
        wait(1000)
        deleteObject(firstObject)
        deleteObject(secondObject)
    end)
end

Есть три точки:
46120

На точку A спавнится объект firstObject, на точку B спавнится secondObject, дальше функция processLineOfSight() ищет точку соприкосновения между точкой C и точкой B (secondObject), по идее объектом соприкосновения должен быть firstObject (точка A), но на деле, какие бы параметры я не пробовал, функция либо сталкивается с частицами (хотя не должна), либо не сталкивается ни с чем (result == false). В чем может быть проблема?
 

[SA ARZ]

Известный
392
8
help
помоги вытащить данные по регулировке

Посмотреть вложение 46107

1:
if dialogId == 63 then
        for w in text:gmatch('[^\r\n]+') do
            local num, nick, id, nrang, zrang, phone, afk = w:match('(%d+). (.*)%[(%d+)%]\t(%d+) ранг.\t(.*)\t(%d+)\tНа паузе%:%(%d+)')
            print(num.. ' ' ..nick.. ' ' ..id.. ' ' ..nrang.. ' ' ..zrang.. ' ' ..phone.. ' ' ..afk)
        end
    end
 

sanders

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

daite na_vodky

Известный
147
47
мне нужно, чтобы при вводе серверной команды выполнялись действия скрипта, но и чтобы сервер на неё реагировал.
Как это сделать?
 

|DEVIL|

Известный
363
281
мне нужно, чтобы при вводе серверной команды выполнялись действия скрипта, но и чтобы сервер на неё реагировал.
Как это сделать?
Воспользуйся библиотекой samp.lua https://blast.hk/threads/14624/

Как скачаешь запиши вот это в локалы:
local sampev = require 'lib.samp.events'
После этого воспользуйся функцией
function sampev.onSendChat(msg)
Далее в ней нужно сделать так чтобы скрипт находил эту команду:
if msg:find("/menu") then
В итоге получаем такую функцию:
Код:
function sampev.onSendChat(msg)
    if msg:find("/menu") then
    --code
    end
end

P.S Вместо меню может быть другая команда
 
  • Нравится
Реакции: daite na_vodky

Lucifer Melton

Активный
164
57
help
помоги вытащить данные по регулировке

Посмотреть вложение 46107

1:
if dialogId == 63 then
        for w in text:gmatch('[^\r\n]+') do
            local num, nick, id, nrang, zrang, phone, afk = w:match('(%d+). (.*)%[(%d+)%]\t(%d+) ранг.\t(.*)\t(%d+)\tНа паузе%:%(%d+)')
            print(num.. ' ' ..nick.. ' ' ..id.. ' ' ..nrang.. ' ' ..zrang.. ' ' ..phone.. ' ' ..afk)
        end
    end
Lua:
if dialogId == 63 then -- внутрь хука
    ftext = {}
    for w in text:gmatch("[^\r\n]+") do
        table.insert(ftext, w)
    end
end

for i, h in pairs(ftext) do -- внутрь function
    if i >= 2 then
        local num, nick, nrang, zrang, number, afk = h:match("(%d+.)%s(%w+_%w+%[%d+%])\t(%d+%sранг.)%s(.*)\t(%d+)\t(.*)")
        print(num..", "..nick..", "..nrang..", "..zrang..", "..number..", "..afk)
    end
end
Тут можно тестить регулярки и тут вместо луашных % используют \
 
Последнее редактирование:

daite na_vodky

Известный
147
47
Воспользуйся библиотекой samp.lua https://blast.hk/threads/14624/

Как скачаешь запиши вот это в локалы:
local sampev = require 'lib.samp.events'
После этого воспользуйся функцией
function sampev.onSendChat(msg)
Далее в ней нужно сделать так чтобы скрипт находил эту команду:
if msg:find("/menu") then
В итоге получаем такую функцию:
Код:
function sampev.onSendChat(msg)
    if msg:find("/menu") then
    --code
    end
end

P.S Вместо меню может быть другая команда
Почему не работает?
Lua:
require 'lib.moonloader'
local sampev = require 'lib.samp.events'


function main()
    wait(-1)
end

function sampev.onSendChat(msg)
    if msg:find("/id") then
    sampAddChatMessage("test", -1)
    end
end
 

Lucifer Melton

Активный
164
57
Почему не работает?
Lua:
require 'lib.moonloader'
local sampev = require 'lib.samp.events'


function main()
    wait(-1)
end

function sampev.onSendChat(msg)
    if msg:find("/id") then
    sampAddChatMessage("test", -1)
    end
end
Lua:
local sampev = require "lib.samp.events"

function sampev.onSendCommand(cmd)
    if cmd:find("/id") then
        sampAddChatMessage("ты написал команду /id", -1)
    end
end
 
  • Нравится
Реакции: daite na_vodky и |DEVIL|