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

штейн

Известный
Проверенный
1,002
688
У меня нету АХК, по этому и хочу на ЛУА)
Есть скрипт активация которого на CapsLock, делаю вот так, но он не активируется (кнопка должна быть зажата)
Lua:
local sampev = require 'lib.samp.events'

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('capslock', capslock)
    while true do wait(0)
        if act then setGameKeyState(20, -128) end
    end
end

function capslock() act = not act end

Lua:
function capslock()
    if not act then
        setVirtualKeyDown(--[[ тут должна быть клавиша капслока но я не помню ]], true)
        act = true
    else
        setVirtualKeyDown(--[[ тут должна быть клавиша капслока но я не помню ]], false)
        act = false
    end
end

я не знаю будет работать или нет если че мог ступить как бы да я же еблан
 

Shell :3

Активный
159
32
Где можно посмотреть коды клавиш и вообще какой код клавиши атаки?
 

TheGood11

Участник
173
10
Lua:
function capslock()
    if not act then
        setVirtualKeyDown(--[[ тут должна быть клавиша капслока но я не помню ]], true)
        act = true
    else
        setVirtualKeyDown(--[[ тут должна быть клавиша капслока но я не помню ]], false)
        act = false
    end
end

я не знаю будет работать или нет если че мог ступить как бы да я же еблан
Вроде 20 клавиша, поставил, не работает(
 

Ken Block

Известный
432
31
Вроде 20 клавиша, поставил, не работает(
Lua:
require 'lib.moonloader'

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('capslock', capslock)
    while true do wait(0)
    end
end

function capslock()
if not act then
setVirtualKeyDown(VK_CAPSLOCK, true)
act = true
else
setVirtualKeyDown(VK_CAPSLOCK, false)
act = false
end
end

Где можно посмотреть коды клавиш и вообще какой код клавиши атаки?
Коды клавиш чекай в файле vkeys.lua который находится в папке lib
 

TheGood11

Участник
173
10
Lua:
require 'lib.moonloader'

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('capslock', capslock)
    while true do wait(0)
    end
end

function capslock()
if not act then
setVirtualKeyDown(VK_CAPSLOCK, true)
act = true
else
setVirtualKeyDown(VK_CAPSLOCK, false)
act = false
end
end


Коды клавиш чекай в файле vkeys.lua который находится в папке lib
Не работает(
 

Adventurer

Известный
151
69
После того как нажимаю в этом диалоге BUTTON1 or BUttON2 не выводит в чат нечего, how to fix?
Lua:
function main()
repeat wait(0) until isSampAvailable()
wait(2000)
sampRegisterChatCommand('dialog', dialog)
sampAddChatMessage('WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW', -1)
while true do
  wait(0)
end
end

function dialog()
   sampShowDialog(1337, '{DF2053}Заголовок', '{FFFFFF}Hello,I am Fun\n{DF2053}How are you?', '{DF2053}Nice', '{DF2053}Bad', 0)
   lua_thread.create(checker)
end

function checker()
  while sampIsDialogActive() do
    wait(0)
    local result, button, list, input = sampHasDialogRespond(8000)
    if result and button == 1 then
      sampAddChatMessage('You pressed me!' -1)
    elseif result and button == 0  then
      sampAddChatMessage("Why?", -1)
    end
  end
end
О - очевидность.
Выводишь диалог с id = 1337, а получаешь хендлер с диалога id = 8000
 

Harryss

Участник
233
26
Lua:
local keys = {
    [0x61] = 1,
    [0x62] = 2,
    [0x63] = 3,
    [0x64] = 4,
    [0x65] = 5,
    [0x66] = 6,
    [0x67] = 7,
    [0x68] = 8,
    [0x69] = 9
}

local amount = 0

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

    while true do
        wait(0)
        for key, value in ipairs(keys) do
            if isKeyJustPressed(key) then
                amount = amount + value
            end
        end
    end
end
Братик, что-то не работает. Не накидывает value к amount. Оно остается нулевым

Объявляй в начале переменную (например а) и в беск цикле делай проверку на нажатие кнопки. Потом делаешь a=a+1. (Пишу с телефона, так что мб хуёво объяснил)
Дак суть в том, что мне нужно не обычное сложение, а именно числа цифры к переменной. Нажат Num 2 - у главной переменной значение 2, нажат Num 6 - у главной переменной значение 26, нажат Num 3 - у главной переменной значение 263 и т.д.
 

Drght.Gnnss

Новичок
24
7
Братик, что-то не работает. Не накидывает value к amount. Оно остается нулевым
место ipairs просто pairs и все будет работать

Братик, что-то не работает. Не накидывает value к amount. Оно остается нулевым


Дак суть в том, что мне нужно не обычное сложение, а именно числа цифры к переменной. Нажат Num 2 - у главной переменной значение 2, нажат Num 6 - у главной переменной значение 26, нажат Num 3 - у главной переменной значение 263 и т.д.
как строку складывай
str = str .. value
 
  • Нравится
Реакции: Harryss

lorgon

Известный
656
271
Как проверить в розыске ли игрок? К примеру если есть звёзды - то написать на экране "Вы получили звёзды", а если нету то игнорировать
 

trefa

3d print
Всефорумный модератор
2,107
1,264
Как проверить в розыске ли игрок? К примеру если есть звёзды - то написать на экране "Вы получили звёзды", а если нету то игнорировать
работает только для локального игрока
Lua:
bool result, int level = storeWantedLevel(Player player)
 

DeMoN3D

Известный
366
77
Lua:
require "lib.moonloader"
require "lib.sampfuncs"
local hook = require('lib.samp.events')
    local r = 0
    local k = 0
    local z = 0
    local ms = 0
elactiv = false
function main()
    while not isSampfuncsLoaded() or not isSampLoaded() do wait(1000) end
    while not isSampAvailable() do wait(5000) end
    sampRegisterChatCommand('fly', elactive)
    sampRegisterChatCommand('cfly', cmd_cfly)
    while true do wait(-1)
    end
end



function elactive(param)
    if param == '' or param == nil then
        if param == 1 or param == 2 then ms = param
sampAddChatMessage("FlyMat: "..ms, -1)
end
    else
    if elactiv then elactiv = false else elactiv = true end
end
end

function hook.onServerMessage(color,text)
    if text:find('Высадка пассажиров') and elactiv then
        r = r+1 --  action
        k = math.floor(r/2)
        if ms == 1 then
           z = r*1449
     elseif ms == 2 then
           z = math.floor(r*1165.5)
        end
        sampAddChatMessage("Количество рейсов: {35bf4d}"..r, 0xFFFFFF)
        sampAddChatMessage("Количество кругов: {35bf4d}"..k, 0xFFFFFF)
        sampAddChatMessage("Примерная зарплата: {35bf4d}"..z.."$", 0xFFFFFF)
    end
end

function cmd_cfly()
    r = 0
    k = 0
    z = 0
    printStringNow("Clear!", 3000)
end
Мейби сработает. Писал с телефона так шо код кривой. Если сработает, то ошибка возможно была в том, что ты не дописал elactiv после загрузки библиотек
без ошибок, но работает снова не так, как надо.
Когда пишу /fly 1 , то он считает по второму методу (elseif ms == 2 then) , попробовал написать /fly 2 и, ничего, то же самое. И ещё, даже с этой проблемой есть ещё одна. Начинает считать с r = 2. То есть когда ввожу /fly 1 или /fly 2 и в чате появляется "Высадка пассажиров" то он сразу пишет: "Рейсов 2" хотя должен писать 1