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

SHARLYBUTTOM

Известный
598
119
Lua:
function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand('teleport_2', function(coords)
        local x, y, z = coords:match('(.+) (.+) (.+)') --телепорт по координатам через команду
        setCharCoordinates(PLAYER_PED, x, y, z)
    end)
    wait(-1)
end
А как можно симулировать нажатие кнопочки Альт?
Тип допустим прописал cmd, а оно нажало кнопку альт и вошло в инту и т.п
 

lemonager

;)
Всефорумный модератор
809
1,717
А как можно симулировать нажатие кнопочки Альт?
Тип допустим прописал cmd, а оно нажало кнопку альт и вошло в инту и т.п
нажатие альта
Lua:
setGameKeyState(21,255)

1601280776454.png
 

SHARLYBUTTOM

Известный
598
119
А как найти серверную метку ( checkpoint ), затем сделать на неё перемещение?
 

Angr

Известный
291
99
А как найти серверную метку ( checkpoint ), затем сделать на неё перемещение?
Вот пример получения
Lua:
function onReceiveRpc(int,bit)
    if int == 38 then -- SetRaceCheckpoint(Гоночный checkpoint)
        local typeRace = raknetBitStreamReadInt8(bit)
        local X = raknetBitStreamReadFloat(bit)
        local Y = raknetBitStreamReadFloat(bit)
        local Z = raknetBitStreamReadFloat(bit)
        local nextX = raknetBitStreamReadFloat(bit)
        local nextY = raknetBitStreamReadFloat(bit)
        local nextZ = raknetBitStreamReadFloat(bit)
        local radius = raknetBitStreamReadFloat(bit)
        print(X,Y,Z,typeRace,radius)
     elseif int == 107 then -- Если SetCheckpoint(Обычный checkpoint)
        local Xz = raknetBitStreamReadFloat(bit)
        local Yz = raknetBitStreamReadFloat(bit)
        local Zz = raknetBitStreamReadFloat(bit)
        local rdus = raknetBitStreamReadFloat(bit)
        print(Xz,Yz,Zz,rdus)
    end
end
Как сделать на нее перемещение? - выше чел спрашивал, посмотри
qq помогите пж перестала работать вот эта часть скрипта. Раньше работала нечего не менял.

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

Ну тоесть 8 строка не работает)
Скинь весь код скрипта, может быть у тебя 2 main? Или что-то похожее в дубле
 

SamCamino

Участник
33
1
Скинь весь код скрипта, может быть у тебя 2 main? Или что-то похожее в дубле
Lua:
local vkeys = require 'vkeys'
local myName = "Samuel"

local game_keys = require 'game.keys' -- где-нибудь в начале скрипта вне функции main

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

    if bool state = isCarEngineOn(Vehicle car) == off && Ped ped = getDriverOfCar(Vehicle car) -- проверка включен ли двигатель
            --setVirtualKeyDown(78, true) -- зажатие 87 клавиши (W)
            --wait(1000) -- задержка на секунду
            --setVirtualKeyDown(78, false) -- отпускание 87 клавиши (W)
            setGameKeyState(game_keys.0x4D,., -1) -- будет сэмулировано нажатие клавиши атаки
end

function onEngine()
    Ped ped = getDriverOfCar(Vehicle car) -- возврат водителя по машине
    if bool state = isCarEngineOn(Vehicle car) == on-- проверка включен ли двигатель
            return
    end

elseif bool state = isCarEngineOn(Vehicle car) == off && Ped ped = getDriverOfCar(Vehicle car) -- проверка включен ли двигатель
        setVirtualKeyDown(78, true) -- зажатие 87 клавиши (W)
        wait(1000) -- задержка на секунду
        setVirtualKeyDown(78, false) -- отпускание 87 клавиши (W)
        local game_keys = require 'game.keys' -- где-нибудь в начале скрипта вне функции main

        setGameKeyState(game_keys.player.FIREWEAPON, -1) -- будет сэмулировано нажатие клавиши атаки
    end

Может из за того что 2 "function"? Прост 2 день на луа, сам на C# кодил
P.S Не смотри на остальной код знаю, что он не рабочий
 

Angr

Известный
291
99
Lua:
local vkeys = require 'vkeys'
local myName = "Samuel"

local game_keys = require 'game.keys' -- где-нибудь в начале скрипта вне функции main

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

    if bool state = isCarEngineOn(Vehicle car) == off && Ped ped = getDriverOfCar(Vehicle car) -- проверка включен ли двигатель
            --setVirtualKeyDown(78, true) -- зажатие 87 клавиши (W)
            --wait(1000) -- задержка на секунду
            --setVirtualKeyDown(78, false) -- отпускание 87 клавиши (W)
            setGameKeyState(game_keys.0x4D,., -1) -- будет сэмулировано нажатие клавиши атаки
end

function onEngine()
    Ped ped = getDriverOfCar(Vehicle car) -- возврат водителя по машине
    if bool state = isCarEngineOn(Vehicle car) == on-- проверка включен ли двигатель
            return
    end

elseif bool state = isCarEngineOn(Vehicle car) == off && Ped ped = getDriverOfCar(Vehicle car) -- проверка включен ли двигатель
        setVirtualKeyDown(78, true) -- зажатие 87 клавиши (W)
        wait(1000) -- задержка на секунду
        setVirtualKeyDown(78, false) -- отпускание 87 клавиши (W)
        local game_keys = require 'game.keys' -- где-нибудь в начале скрипта вне функции main

        setGameKeyState(game_keys.player.FIREWEAPON, -1) -- будет сэмулировано нажатие клавиши атаки
    end


Lua:
local vkeys = require 'vkeys'
local myName = "Samuel"

local game_keys = require 'game.keys' -- где-нибудь в начале скрипта вне функции main

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

    if bool state = isCarEngineOn(Vehicle car) == off && Ped ped = getDriverOfCar(Vehicle car) -- проверка включен ли двигатель
            --setVirtualKeyDown(78, true) -- зажатие 87 клавиши (W)
            --wait(1000) -- задержка на секунду
            --setVirtualKeyDown(78, false) -- отпускание 87 клавиши (W)
            setGameKeyState(game_keys.0x4D,., -1) -- будет сэмулировано нажатие клавиши атаки
end

function onEngine()
    Ped ped = getDriverOfCar(Vehicle car) -- возврат водителя по машине
    if bool state = isCarEngineOn(Vehicle car) == on-- проверка включен ли двигатель
            return
    end

elseif bool state = isCarEngineOn(Vehicle car) == off && Ped ped = getDriverOfCar(Vehicle car) -- проверка включен ли двигатель
        setVirtualKeyDown(78, true) -- зажатие 87 клавиши (W)
        wait(1000) -- задержка на секунду
        setVirtualKeyDown(78, false) -- отпускание 87 клавиши (W)
        local game_keys = require 'game.keys' -- где-нибудь в начале скрипта вне функции main

        setGameKeyState(game_keys.player.FIREWEAPON, -1) -- будет сэмулировано нажатие клавиши атаки
    end
Может из за того что 2 "function"? Прост 2 день на луа, сам на C# кодил
P.S Не смотри на остальной код знаю, что он не рабочий
В папке moonloader, есть файлик moonloader.log, открой его и там увидишь где косяк.
У тебя && , такого в луа нет)
Почитай основы, основные косяки у тебя в этом
 
Последнее редактирование:

SamCamino

Участник
33
1
В папке moonloader, есть файлик moonloader.log, открой его и там увидишь где косяк.
У тебя && , такого в луа нет)
Почитай основы, основные косяки у тебя в этом
сборка/moonloader/autoEngine.lua:13: attempt to call global 'sampAddChatMesssage' (a nil value) Нашел вот такую строечку.

Ок почитаю)
Я просто раньше на java и C# кодил вот и привычки остались

UPD:
Я единственное понял что проблема в 13 строке. Вот:
sampAddChatMesssage("{0000FF}[AutoEngine]{80DAEB} Загружен для {CC0605}ArioznaRP. {80DAEB}Активация автоматическая. {80DAEB}by {120A8F}SamCamino.")
Но раньше оно работало. Может проверишь у тебя будет работать.
 
Последнее редактирование:

Rei

Известный
Друг
1,611
1,668
сборка/moonloader/autoEngine.lua:13: attempt to call global 'sampAddChatMesssage' (a nil value) Нашел вот такую строечку.

Ок почитаю)
Я просто раньше на java и C# кодил вот и привычки остались

UPD:
Я единственное понял что проблема в 13 строке. Вот:
sampAddChatMesssage("{0000FF}[AutoEngine]{80DAEB} Загружен для {CC0605}ArioznaRP. {80DAEB}Активация автоматическая. {80DAEB}by {120A8F}SamCamino.")
Но раньше оно работало. Может проверишь у тебя будет работать.
ты че тролишь? ты функцию неправильно написал, оно и не могло работать
 
  • Нравится
Реакции: SamCamino

SamCamino

Участник
33
1
ты че тролишь? ты функцию неправильно написал, оно и не могло работать
а как тогда? я писал оно работало ;-;

UPD:

Точно вспомнил. Я случайно удалил код весь и выключил комп. И наверное эту строку неправильно написал. Если подскажешь как чтобы текст такой-же был. Буду благодарен.
 

Rei

Известный
Друг
1,611
1,668
а как тогда? я писал оно работало ;-;

UPD:

Точно вспомнил. Я случайно удалил код весь и выключил комп. И наверное эту строку неправильно написал. Если подскажешь как чтобы текст такой-же был. Буду благодарен.
в названии функции ошибка
 
  • Нравится
Реакции: SamCamino

SamCamino

Участник
33
1
в названии функции ошибка
Спасибо сработало, а ты не знаешь как с имулировать что бы нажимало кнопку n и кнопку lcntrl. Просто срочно надо
как синхрой нажать ескейп?
Lua:
function onSendPacket(id, bitStream, priority, reliability, orderingChannel)
    if id == 207 then
        return false
    end
end



если помог можно лукос🙃​
 

Rei

Известный
Друг
1,611
1,668
Спасибо сработало, а ты не знаешь как с имулировать что бы нажимало кнопку n и кнопку lcntrl. Просто срочно надо

Lua:
function onSendPacket(id, bitStream, priority, reliability, orderingChannel)
    if id == 207 then
        return false
    end
end



если помог можно лукос🙃​

в keysData обычные кнопки
y/n вроде как надо в weapon указывать, найди короче на форуме, сто раз писали
 

Double Tap Inside

Известный
Проверенный
1,916
1,255
Как сделать максимально адекватно, чтобы модуль inicfg не удалял пробелы в начале и вконце строки?
--
Решение:

encodeJson(lua_string)
decodeJson(json_string)
 
Последнее редактирование: