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

YarikVL

Известный
Проверенный
4,796
1,813
[Транспортная компания: Test_123 [113]: 123
Lua:
local sampev = require 'lib.samp.events'

function sampev.onServerMessage(color, text)
        if text:find("компания") then
            lua_thread.create(function() wait(100)
                sampSendChat('/gokomp')
            end)
    end
end
мдаа, так бы и написал сразу. тут надо регулярки выставлять
Не надо, вроде
313DC84D-BE6E-4AF8-9C53-60585DD58402.png
 

XRLM

Известный
2,559
876
Lua:
local sampev = require 'lib.samp.events'

function sampev.onServerMessage(color, text)
    if text:find('%[Транспортная компания%: Test%_(%d+) %[(%d+)%]%: (%d+)') then
        lua_thread.create(function() wait(100)
            sampSendChat('/gokomp')
        end)
    end
end
проверь. но только я не помню как отправить сообщение серверу, но и с регулярками тоже не очень, так что помог чем мог.
 

xednxk

Новичок
9
1
Пожалуйста, покажи куда и как вставить ппжжппжпжп
Lua:
    function ccord()
        runToPoint(2304.8403320313, -1784.3363037109)
    end
  
    function runToPoint(tox, toy)
    local x, y, z = getCharCoordinates(PLAYER_PED)
    local angle = getHeadingFromVector2d(tox - x, toy - y)
    local xAngle = math.random(-50, 50)/100
    setCameraPositionUnfixed(xAngle, math.rad(angle - 90))
    stopRun = false
    while getDistanceBetweenCoords2d(x, y, tox, toy) > 0.8 do
        setGameKeyState(1, -255)
        --setGameKeyState(16, 1)
        x, y, z = getCharCoordinates(PLAYER_PED)
        angle = getHeadingFromVector2d(tox - x, toy - y)
        setCameraPositionUnfixed(xAngle, math.rad(angle - 90))
        if stopRun then
            stopRun = false
            break
        end
    end
    end

Я создавал поток но пишет, что рядом с end неизвестный символ ")"
Lua:
function ccord()
    runToPoint(2304.8403320313, -1784.3363037109)
end
    
function runToPoint(tox, toy)
    local x, y, z = getCharCoordinates(PLAYER_PED)
    local angle = getHeadingFromVector2d(tox - x, toy - y)
    local xAngle = math.random(-50, 50)/100
    setCameraPositionUnfixed(xAngle, math.rad(angle - 90))
    stopRun = false
    lua_thread.create(function()         -- начало потока
        while getDistanceBetweenCoords2d(x, y, tox, toy) > 0.8 do
            wait(0)          -- ожидание
            setGameKeyState(1, -255)
            --setGameKeyState(16, 1)
            x, y, z = getCharCoordinates(PLAYER_PED)
            angle = getHeadingFromVector2d(tox - x, toy - y)
            setCameraPositionUnfixed(xAngle, math.rad(angle - 90))
            if stopRun then
                stopRun = false
                break
            end
        end
    end)          -- конец потока
end
 
  • Нравится
Реакции: Strone

Strone

Участник
66
13
Итак, собрание молодых луашников. У меня проблема. После того, как я прибежал по координатам, я должен нажать на кнопку F. Но на эту кнопку надо нажимать вручную, чтобы начать работу. Как нажимать кнопку F через скрипт автоматический?
 

krim

Известный
304
132
Итак, собрание молодых луашников. У меня проблема. После того, как я прибежал по координатам, я должен нажать на кнопку F. Но на эту кнопку надо нажимать вручную, чтобы начать работу. Как нажимать кнопку F через скрипт автоматический?
 
  • Нравится
Реакции: Strone

YarikVL

Известный
Проверенный
4,796
1,813
Итак, собрание молодых луашников. У меня проблема. После того, как я прибежал по координатам, я должен нажать на кнопку F. Но на эту кнопку надо нажимать вручную, чтобы начать работу. Как нажимать кнопку F через скрипт автоматический?
setVirtualKeyDown(VK_F, true)
wait(30)
setVirtualKeyDown(VK_F, false)

Там просто у человека выше по ссылке нету объяснение использование этой функи. Сначала нажимаем потом ждём 30 миллисекунд чтобы клавиша была нажата какое-то малое время и потом отпускаем
 
  • Нравится
Реакции: Strone

silentium2006

Потрачен
721
128
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Код:
local ameat = false
local stop = false

function main()
    repeat wait(0) until isSampAvailable()
    wait(-1)
    sampRegisterChatCommand("ameat", function()
        ameat = not ameat
        sampAddChatMessage(ameat and 'ON' or 'OFF')
end)
    local health = getCharHealth(PLAYER_PED)
        if ameat then
            if health < 90 then
                stop = true
                wait(1000)
                sampSendChat("/jmeat")
                stop = false
            end
        end
    end
команда не зарегистрировалось чооо делать
 

kizn

О КУ)))
Всефорумный модератор
2,405
2,060
Код:
local ameat = false
local stop = false

function main()
    repeat wait(0) until isSampAvailable()
    wait(-1)
    sampRegisterChatCommand("ameat", function()
        ameat = not ameat
        sampAddChatMessage(ameat and 'ON' or 'OFF')
end)
    local health = getCharHealth(PLAYER_PED)
        if ameat then
            if health < 90 then
                stop = true
                wait(1000)
                sampSendChat("/jmeat")
                stop = false
            end
        end
    end
команда не зарегистрировалось чооо делать
wait(-1) должен стоять перед последним end в данном примере
 

ch1ps

Участник
101
3
есть какая-то готовая функция прикрепления объекта к актёру? я просто думал постоянно телепортировать объект к нему, условно говоря к спине, но думаю, что оптимизация подобного кода будет оставлять желать лучшего
 

sat0ry

Известный
1,087
289
есть какая-то готовая функция прикрепления объекта к актёру? я просто думал постоянно телепортировать объект к нему, условно говоря к спине, но думаю, что оптимизация подобного кода будет оставлять желать лучшего
 

СоМиК

Известный
458
313
Как сделать простенький сепаратор?
Просто функцию одну, не более, чтобы она к примеру через аргумент получала 12123123123, а возвращала 12,123,123,123?
 

sat0ry

Известный
1,087
289
Как сделать простенький сепаратор?
Просто функцию одну, не более, чтобы она к примеру через аргумент получала 12123123123, а возвращала 12,123,123,123?
заходишь в исходник мани сепаратора, изучаешь сочетание клавишь ctrl + c, ctr + v, поздравляю вы сделали функцию мани сепаратора
 
  • Нравится
Реакции: YarikVL

Anti...

Активный
265
27
Как можно сделать следующее:
1. Когда встал на чекпоинт то проигралась какая-то мелодия(сам звук чекпоинта не трогать)
2. Как можно сделать..допустим у меня есть инвентарь(как на аризоне) при выборе какого-то предмета будет какой-то звук
3. Как сделать так, что когда к примеру осталось 20 хп, то проигрывается мелодия
 

ch1ps

Участник
101
3
Код:
local memory = require 'memory'
local playerObj, vehObj = nil, nil

function attachObjectToPlayer( hObject, hPlayer, pOffsets, pAngles )
    if doesObjectExist( hObject ) and doesCharExist( hPlayer ) then
        if not pOffsets then pOffsets = { 0.0, 0.0, 0.0 } end
        if not pAngles then pAngles = { 0.0, 0.0, 0.0 } end
      
        setObjectCoordinates( hObject, getCharCoordinates( hPlayer ) )
        setObjectCollision( hObject, false )
      
        local pointer = getObjectPointer( hObject )
      
        memory.setuint32( pointer + 0xFC, getCharPointer( hPlayer ) )
      
        memory.setfloat( pointer + 0x100, pOffsets[1] )
        memory.setfloat( pointer + 0x104, pOffsets[2] )
        memory.setfloat( pointer + 0x108, pOffsets[3] )

        memory.setfloat( pointer + 0x10C, pAngles[1] )
        memory.setfloat( pointer + 0x110, pAngles[2] )
        memory.setfloat( pointer + 0x114, pAngles[3] )

        return true
    end
    return false
end

function main()
    sampRegisterChatCommand('attach', function( )
        if isCharInAnyCar(PLAYER_PED) and not vehObj then
            local car = storeCarCharIsInNoSave( PLAYER_PED )
            vehObj = createObject( 1083, getCarCoordinates( car ) )
            if attachObjectToVehicle( vehObj, car, { 0.0, 0.0, 5.0 }, { 0.0, 0.0, 3.14/2 } ) then
                print( ("Объект %d прикреплён к авто %d"):format( getObjectModel( vehObj ), getCarModel( car ) ) )
            end
        elseif not isCharInAnyCar( PLAYER_PED ) and not playerObj then
            playerObj = createObject( 1083, getCharCoordinates( PLAYER_PED ) )
            if attachObjectToPlayer( playerObj, PLAYER_PED, { 0.0, 0.0, 5.0 }, { 0.0, 0.0, 3.14/2 } ) then
                print( ("Объект %d прикреплён к педу %d"):format( getObjectModel( playerObj ), PLAYER_PED ) )
            end
        else
            if playerObj then deleteObject( playerObj ); playerObj = nil end
            if vehObj then    deleteObject( vehObj );    vehObj = nil    end
        end
    end)
    while true do
        wait(0)
    end
end
Короче, с помощью функции прикрепления объекта к актёру, я попробовал прикрепить колесо, но по какой-то причине само колесо создается, но сразу же пропадает и само собой не крепится к скину, что не так?
 

YarikVL

Известный
Проверенный
4,796
1,813
2. Как можно сделать..допустим у меня есть инвентарь(как на аризоне) при выборе какого-то предмета будет какой-то звук
Проверяй открыт ли инвентарь и вот этим https://wiki.blast.hk/moonloader/lua/getcursorpos проверяй положение курсора ( надо заранее определить положение твоего инвентаря, и если ты будешь наводить на эту область то скрипт будет понимать что курсор наведён на инвентарь и выполнять код дальше ). А проверка нажат ли курсор то вроде можно так: if isKeyJustPressed(1) then
Тут увидел: https://www.blast.hk/threads/93859/
3. Как сделать так, что когда к примеру осталось 20 хп, то проигрывается мелодия
if getCharHealth() < 20 then
Вот объяснение функции на вики: https://wiki.blast.hk/ru/moonloader/lua/getCharHealth