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

sᴀxᴏɴ

#Mary
Всефорумный модератор
792
848
Да, но тогда весь цикл тоже застопится, лучше создавать поток всегда)
У тебя этот поток будет создаваться каждую итерацию цикла т.к задержка идет не в самом цикле, а в потоке
 
  • Нравится
Реакции: Double Tap Inside

moreveal

Известный
Проверенный
862
546
У тебя этот поток будет создаваться каждую итерацию цикла т.к задержка идет не в самом цикле, а в потоке
Это ясно, но там стоит проверка на заведенный двигатель, а значит несколько раз он не выполнится. Поток сделан на будущее, чтобы не стопить беск. цикл, он же наверняка не только одну эту штуку делать будет.
 

SamCamino

Участник
33
1
В бесконечный цикл:
Lua:
local vehicleh = storeCarCharIsInNoSave(PLAYER_PED) -- получаем хендл автомобиля, в котором сидит игрок
if vehicleh ~= nil then -- если игрок сидит в транспорте
if getDriverOfCar(vehicleh) == PLAYER_PED and isCarEngineOn(vehicleh) == false then -- если водитель этого транспорта - локальный игрок, и его двигатель выключен
lua_thread.create(function() -- открываем поток, чтобы использовать задержку
goKeyPressed(0x4E) -- N -- нажимаем N
wait(1000) -- пережидаем секунду
end)
end
end

всё я сдаюсь уже незнаю что делать. Кстати за прошлую помощь спс. вот код я хз чо не так.
Lua:
local vkeys = require 'vkeys'
local myName = "Samuel"

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then
        return
    end
    while not isSampAvailable() do
        wait(0)
    end
    sampAddChatMessage("{0000FF}[AutoEngine]{80DAEB} Загружен для {CC0605}ArioznaRP. {80DAEB}Активация автоматическая. {80DAEB}by {120A8F}SamCamino.")
    wait(-1)

        local vehicleh = storeCarCharIsInNoSave(PLAYER_PED) -- получаем хендл автомобиля, в котором сидит игрок

        if vehicleh ~= nil then -- если игрок сидит в транспорте
            if getDriverOfCar(vehicleh) == PLAYER_PED and isCarEngineOn(vehicleh) == false then -- если водитель этого транспорта - локальный игрок, и его двигатель выключен
                lua_thread.create(function() -- открываем поток, чтобы использовать задержку
                    goKeyPressed(0x4E) -- N -- нажимаем N
                    wait(100) -- пережидаем секунду
                end)
            end
        end
end

function goKeyPressed(keyID)
  lua_thread.create(function()
     setVirtualKeyDown(keyID,true)
     wait(100)
     setVirtualKeyDown(keyID,false)
  end)
end
 

enyag

Известный
345
12
всё я сдаюсь уже незнаю что делать. Кстати за прошлую помощь спс. вот код я хз чо не так.
Lua:
local vkeys = require 'vkeys'
local myName = "Samuel"

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then
        return
    end
    while not isSampAvailable() do
        wait(0)
    end
    sampAddChatMessage("{0000FF}[AutoEngine]{80DAEB} Загружен для {CC0605}ArioznaRP. {80DAEB}Активация автоматическая. {80DAEB}by {120A8F}SamCamino.")
    wait(-1)

        local vehicleh = storeCarCharIsInNoSave(PLAYER_PED) -- получаем хендл автомобиля, в котором сидит игрок

        if vehicleh ~= nil then -- если игрок сидит в транспорте
            if getDriverOfCar(vehicleh) == PLAYER_PED and isCarEngineOn(vehicleh) == false then -- если водитель этого транспорта - локальный игрок, и его двигатель выключен
                lua_thread.create(function() -- открываем поток, чтобы использовать задержку
                    goKeyPressed(0x4E) -- N -- нажимаем N
                    wait(100) -- пережидаем секунду
                end)
            end
        end
end

function goKeyPressed(keyID)
  lua_thread.create(function()
     setVirtualKeyDown(keyID,true)
     wait(100)
     setVirtualKeyDown(keyID,false)
  end)
end
напиши что ты хочешь сделать
 

SamCamino

Участник
33
1
Это ясно, но там стоит проверка на заведенный двигатель, а значит несколько раз он не выполнится. Поток сделан на будущее, чтобы не стопить беск. цикл, он же наверняка не только одну эту штуку делать будет.
ты согласен это так для разминки, я еще хотел добавить кучу функцию. с открытым кодом)
напиши что ты хочешь сделать
если игрок сидит на водительском месте и двигатель выключен то нажимается кнопка n для того чтобы завести движок на arp. а эта пиз*а не работает

UPD:
Я еще хотел добавить проверку какой серв такая кнопка будет нажиматся для того чтобы завести движок
 

moreveal

Известный
Проверенный
862
546
ты согласен это так для разминки, я еще хотел добавить кучу функцию. с открытым кодом)

если игрок сидит на водительском месте и двигатель выключен то нажимается кнопка n для того чтобы завести движок на arp. а эта пиз*а не работает
Lua:
local vkeys = require 'vkeys'
events = require 'samp.events'
sampev = require 'lib.samp.events'
require 'lib.moonloader'
require 'lib.sampfuncs'

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage("{0000FF}[AutoEngine]{80DAEB} Загружен для {CC0605}ArioznaRP. {80DAEB}Активация автоматическая. {80DAEB}by {120A8F}SamCamino.")
  
    while true do
             wait(0)
        local vehicleh = storeCarCharIsInNoSave(PLAYER_PED)
        if vehicleh ~= nil then -- если игрок сидит в транспорте
            if getDriverOfCar(vehicleh) == PLAYER_PED and not isCarEngineOn(vehicleh) then
                lua_thread.create(function()
                    goKeyPressed(0x4E)
                    wait(100)
                end)
            end
        end
   end
end
function goKeyPressed(keyID)
  lua_thread.create(function()
     setVirtualKeyDown(keyID,true)
     wait(100)
     setVirtualKeyDown(keyID,false)
  end)
end
 
Последнее редактирование:

SamCamino

Участник
33
1
Lua:
local vkeys = require 'vkeys'
events = require 'samp.events'
sampev = require 'lib.samp.events'
require 'lib.moonloader'
require 'lib.sampfuncs'


function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    sampAddChatMessage("{0000FF}[AutoEngine]{80DAEB} Загружен для {CC0605}ArioznaRP. {80DAEB}Активация автоматическая. {80DAEB}by {120A8F}SamCamino.")
  
    while true do
             wait(0)
        local vehicleh = storeCarCharIsInNoSave(PLAYER_PED) -- получаем хендл автомобиля, в котором сидит игрок

        if vehicleh ~= nil then -- если игрок сидит в транспорте
            if getDriverOfCar(vehicleh) == PLAYER_PED and isCarEngineOn(vehicleh) == false then -- если водитель этого транспорта - локальный игрок, и его двигатель выключен
                lua_thread.create(function() -- открываем поток, чтобы использовать задержку
                    goKeyPressed(0x4E) -- N -- нажимаем N
                    wait(100) -- пережидаем секунду
                end)
            end
        end
   end
end

function goKeyPressed(keyID)
  lua_thread.create(function()
     setVirtualKeyDown(keyID,true)
     wait(100)
     setVirtualKeyDown(keyID,false)
  end)
end
не работает, просто понимаешь я искал этот скрипт для ботов которые не умеют сами врубать двигатель. Ну вот решил написать)
 

moreveal

Известный
Проверенный
862
546
Lua:
--[[
select(arg, function()) - выбрать определенный аргумент, который возвращает та или иная функция
sampGetCurrentServerAddress() - возвращает IP сервера в первом аргументе, PORT во втором
]]
if select(1, sampGetCurrentServerAddress()) == "тут пишешь IP нужного сервака" then
-- нужные действия
end
 

SamCamino

Участник
33
1
Lua:
--[[
select(arg, function()) - выбрать определенный аргумент, который возвращает та или иная функция
sampGetCurrentServerAddress() - возвращает IP сервера в первом аргументе, PORT во втором
]]
if select(1, sampGetCurrentServerAddress()) == "тут пишешь IP нужного сервака" then
-- нужные действия
end
даже с этим помог. от души. А ты можешь попробывать этот скрипт? Может заведеться?
 

moreveal

Известный
Проверенный
862
546
не работает, просто понимаешь я искал этот скрипт для ботов которые не умеют сами врубать двигатель. Ну вот решил написать)
Lua:
local vkeys = require 'vkeys'
require 'lib.moonloader'
require 'lib.sampfuncs'

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage("{0000FF}[AutoEngine]{80DAEB} Загружен для {CC0605}ArioznaRP. {80DAEB}Активация автоматическая. {80DAEB}by {120A8F}SamCamino.")

    while true do
             wait(0)
        local vehicleh = storeCarCharIsInNoSave(PLAYER_PED)
        if vehicleh ~= nil then -- если игрок сидит в транспорте
            if getDriverOfCar(vehicleh) == PLAYER_PED and not isCarEngineOn(vehicleh) then
                lua_thread.create(function()
                    goKeyPressed(0x4E)
                    wait(100)
                end)
            end
        end
   end
end
function goKeyPressed(keyID)
  lua_thread.create(function()
     setVirtualKeyDown(keyID,true)
     wait(100)
     setVirtualKeyDown(keyID,false)
  end)
end
Чуток поправил код, все работает.
Единственное, в чем будет проблема, если игрок сам захочет оффнуть двигатель, то скрипт его запустит по новой) Но это тоже исправимо, на самом-то деле.
Как перевести число из шестнадцетеричной системы счисления в десятичную?
up
 
Последнее редактирование:
  • Нравится
Реакции: SamCamino

jewelzblu

Активный
113
63
в каком формате должен быть цвет, чтобы юзать его onServerMessage?

или мэйби есть штука, которая определяет сразу цвет
 

SamCamino

Участник
33
1
Lua:
local vkeys = require 'vkeys'
require 'lib.moonloader'
require 'lib.sampfuncs'

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage("{0000FF}[AutoEngine]{80DAEB} Загружен для {CC0605}ArioznaRP. {80DAEB}Активация автоматическая. {80DAEB}by {120A8F}SamCamino.")

    while true do
             wait(0)
        local vehicleh = storeCarCharIsInNoSave(PLAYER_PED)
        if vehicleh ~= nil then -- если игрок сидит в транспорте
            if getDriverOfCar(vehicleh) == PLAYER_PED and not isCarEngineOn(vehicleh) then
                lua_thread.create(function()
                    goKeyPressed(0x4E)
                    wait(100)
                end)
            end
        end
   end
end
function goKeyPressed(keyID)
  lua_thread.create(function()
     setVirtualKeyDown(keyID,true)
     wait(100)
     setVirtualKeyDown(keyID,false)
  end)
end
Чуток поправил код, все работает.
Единственное, в чем будет проблема, если игрок сам захочет оффнуть двигатель, то скрипт его запустит по новой) Но это тоже исправимо, на самом-то деле.

up
он как то странно работает чоль, иногда заводится иногда нет я еще завтра потэщу а щас спать.