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

Terratomorf

Известный
315
58
Samp.Lua установлен? И в следующий раз кидай лучше сразу с moonloader.log
Самп Lua установлен вот лог и к тому-же когда должно будет вылететь это сообщение что её нет оно не появляется а если удалить скрипт то оно будет
Код:
[16:18:19.049939] (info)    Working directory: C:\Grand Theft Auto San Andreas + MultiPlayer [0.3e]\moonloader
[16:18:19.049939] (debug)    FP Control: 0009001F
[16:18:19.049939] (debug)    Game: GTA SA 1.0.0.0 US
[16:18:19.049939] (system)    Installing pre-game hooks...
[16:18:19.065939] (system)    Hooks installed.
[16:18:27.816811] (debug)    Initializing opcode handler table
[16:18:27.816811] (debug)    package.path = C:\Grand Theft Auto San Andreas + MultiPlayer [0.3e]\moonloader\lib\?.lua;C:\Grand Theft Auto San Andreas + MultiPlayer [0.3e]\moonloader\lib\?\init.lua;C:\Grand Theft Auto San Andreas + MultiPlayer [0.3e]\moonloader\?.lua;C:\Grand Theft Auto San Andreas + MultiPlayer [0.3e]\moonloader\?\init.lua;.\?.lua;C:\Grand Theft Auto San Andreas + MultiPlayer [0.3e]\moonloader\lib\?.luac;C:\Grand Theft Auto San Andreas + MultiPlayer [0.3e]\moonloader\lib\?\init.luac;C:\Grand Theft Auto San Andreas + MultiPlayer [0.3e]\moonloader\?.luac;C:\Grand Theft Auto San Andreas + MultiPlayer [0.3e]\moonloader\?\init.luac;.\?.luac
[16:18:27.816811] (debug)    package.cpath = C:\Grand Theft Auto San Andreas + MultiPlayer [0.3e]\moonloader\lib\?.dll;
[16:18:27.817812] (system)    Loading script 'C:\Grand Theft Auto San Andreas + MultiPlayer [0.3e]\moonloader\!ArizonaCaptcha.luac'...
[16:18:27.817812] (debug)    New script: 051419A4
[16:18:27.895313] (system)    !ArizonaCaptcha.luac: Loaded successfully.
[16:18:27.895313] (system)    Loading script 'C:\Grand Theft Auto San Andreas + MultiPlayer [0.3e]\moonloader\ATL MFC Trace Tool settings file.lua'...
[16:18:27.895814] (debug)    New script: 05141B2C
[16:18:27.908811] (system)    ATL MFC Trace Tool settings file.lua: Loaded successfully.
[16:18:27.909316] (system)    Loading script 'C:\Grand Theft Auto San Andreas + MultiPlayer [0.3e]\moonloader\BuilderBot.lua'...
[16:18:27.909316] (debug)    New script: 05149A84
[16:18:27.932313] (system)    BuilderBot.lua: Loaded successfully.
[16:18:27.932313] (system)    Loading script 'C:\Grand Theft Auto San Andreas + MultiPlayer [0.3e]\moonloader\diamond bot ribka.lua'...
[16:18:27.932313] (debug)    New script: 05149C0C
[16:18:27.970314] (system)    diamond bot ribka: Loaded successfully.
[16:18:27.970314] (system)    Loading script 'C:\Grand Theft Auto San Andreas + MultiPlayer [0.3e]\moonloader\diamond bot ribka2.lua'...
[16:18:27.970812] (debug)    New script: 0514AD9C
[16:18:28.029310] (system)    diamond bot ribka2: Loaded successfully.
[16:18:28.029812] (system)    Loading script 'C:\Grand Theft Auto San Andreas + MultiPlayer [0.3e]\moonloader\fisher_drp.luac'...
[16:18:28.029812] (debug)    New script: 0514D43C
[16:18:28.389313] (system)    fisher_drp.luac: Loaded successfully.
[16:18:28.389313] (system)    Loading script 'C:\Grand Theft Auto San Andreas + MultiPlayer [0.3e]\moonloader\Нов.lua'...
[16:18:28.389313] (debug)    New script: 0514525C
[16:18:28.432811] (system)    Нов: Loaded successfully.
[16:18:28.432811] (system)    Loading script 'C:\Grand Theft Auto San Andreas + MultiPlayer [0.3e]\moonloader\Новый б.lua'...
[16:18:28.432811] (debug)    New script: 05179464
[16:18:28.447311] (system)    Новый б: Loaded successfully.
[16:18:28.447311] (system)    Loading script 'C:\Grand Theft Auto San Andreas + MultiPlayer [0.3e]\moonloader\Новый бот.lua'...
[16:18:28.447311] (debug)    New script: 051795EC
[16:18:28.452309] (system)    Новый бот: Loaded successfully.
[16:18:40.501316] (system)    Installing post-load hooks...
[16:18:40.501316] (system)    Hooks installed.
[16:18:43.035811] (script)    fisher_drp.luac: admMsg sound loaded.
[16:18:43.092819] (script)    fisher_drp.luac: bait sound loaded.
[16:18:43.133311] (script)    fisher_drp.luac: captcha sound loaded.
[16:18:43.154817] (script)    fisher_drp.luac: kick sound loaded.
[16:18:43.172313] (script)    fisher_drp.luac: water sound loaded.
[16:18:43.209319] (script)    fisher_drp.luac: slap sound loaded.
[16:18:43.242319] (script)    fisher_drp.luac: teleport sound loaded.
[16:18:49.791809] (script)    BuilderBot.lua: {FFFFFF}Добро пожаловать на сервер {4682B4}Diamond Role Play{FFFFFF}.
Ваш логин: {4682B4}Leonardo_Bartolomeo{FFFFFF}

Данный аккаунт {94FFA6}зарегистрирован{FFFFFF}.
Чтобы войти введите пароль:

{99B3FF}У вас есть 30 секунд на ввод пароля.
[16:27:32.657313] (script)    BuilderBot.lua: {FFFFFF}Улов:

Окунь [{FFF8B2}15.19 кг.{ffffff}]
Карась [{FFF8B2}9.05 кг.{ffffff}]
Щука [{FFF8B2}12.07 кг.{ffffff}]
Акула [{FFF8B2}4.26 кг.{ffffff}]

Всего:    {FFF8B2}40.58 кг.{FFFFFF}

Принадлежности:

Крючок: {DFF4AB}С приманкой{FFFFFF}
Удочка: {DFF4AB}Обычная{FFFFFF}
Нажива: {DFF4AB}Червяк (1 шт){FFFFFF}
 

mr.qldu

Известный
46
0
С одним аргументом все очень просто
Lua:
sampRegisterChatCommand('pass', pass)

function pass(id)
  if #id == 0 then --проверка на то, был ли введен ID или нет
    return false
  end
  lua_thread.create(function()
    sampSendChat('РП отыгровка')
    wait(1000)
    sampSendChat('/pass ' .. id)
  end)
end

Это самый простой вариант, по-хорошему надо еще делать проверку id, является ли это числом
не работает
 

Gromov512

Новичок
85
2
Помогите сделать:

В файле будут лежать слова:
Первый
Второй
Третий
Четвёртый

Нужно взять первое слова, заюзать его и удалить из файла
Как так сделать ?
 

mr.qldu

Известный
46
0
я пишу команду /full id, он мне выполняет несколько команд с использованием id, как сделать?
 

Terratomorf

Известный
315
58
Дак, его и не будет. Как ебанутый в хуке sampSendChat юзаешь, выноси его в while true do в main'е
Lua:
require 'lib.moonloader'
local sampev = require 'lib.samp.events'

function main()

    while true do
        wait(0)
        if GoNajivka then
           sampSendChat('/rdk')
           GoNajivka = false
        end
    end
end

function sampev.onServerMessage(color, text)
    if text:find('У вас нет наживы') then
        GoNajivka = true
    end
end
Не работает(
 

f0rtrix

Известный
208
15
Lua:
-- в main
       while true do
           wait(0)
           if mainIni.Check.rpgun then
               weapon = getCurrentCharWeapon(PLAYER_PED)
               if weapon == 10 then
                   wait(0)
                    print("Коля, красавчик") -- если розовый елдак в руках, то пишет "Коля красавчик"
                 else
                    print("Коля, не красавчик") -- если он пропадает из рук, то пишет "Коля, не красавчик"
               end
           end
       end
Я думаю вы поняли мою задумку, можете помочь?
 

imring

Ride the Lightning
Всефорумный модератор
2,362
2,544
Lua:
-- в main
       while true do
           wait(0)
           if mainIni.Check.rpgun then
               weapon = getCurrentCharWeapon(PLAYER_PED)
               if weapon == 10 then
                   wait(0)
                    print("Коля, красавчик") -- если розовый елдак в руках, то пишет "Коля красавчик"
                 else
                    print("Коля, не красавчик") -- если он пропадает из рук, то пишет "Коля, не красавчик"
               end
           end
       end
Я думаю вы поняли мою задумку, можете помочь?
чем помочь? скрипт и так написан.
 

ShuffleBoy

Известный
Друг
754
429
Lua:
-- в main
       while true do
           wait(0)
           if mainIni.Check.rpgun then
               weapon = getCurrentCharWeapon(PLAYER_PED)
               if weapon == 10 then
                   wait(0)
                    print("Коля, красавчик") -- если розовый елдак в руках, то пишет "Коля красавчик"
                 else
                    print("Коля, не красавчик") -- если он пропадает из рук, то пишет "Коля, не красавчик"
               end
           end
       end
Я думаю вы поняли мою задумку, можете помочь?
Мы блять тут гадать должны? Что именно хочешь?
 

f0rtrix

Известный
208
15
Мы блять тут гадать должны? Что именно хочешь?
У меня ничего не работает. Суть такая:
При доставании оружия оно пишет определенную РП отыгровку, а если убрано то РП отыгровку скрытия оружия.
Токо я ща исправил и у меня идет нереальный флуд, как исправить?
 

Musaigen

abobusnik
Проверенный
1,603
1,361
У меня ничего не работает. Суть такая:
При доставании оружия оно пишет определенную РП отыгровку, а если убрано то РП отыгровку скрытия оружия.
Токо я ща исправил и у меня идет нереальный флуд, как исправить?
А что ты блять исправил, wait(0) в 7 строке, или что?
А насчёт флуда, ты головешкой не подумал? Ты же всё в цикле запускаешь, вот и флудит.
 

f0rtrix

Известный
208
15
А что ты блять исправил, wait(0) в 7 строке, или что?
А насчёт флуда, ты головешкой не подумал? Ты же всё в цикле запускаешь, вот и флудит.
Я понимаю, но если я буду не в цикле делать, то оно не будет проверять. Подскажешь как лучше сделать? А на счет исправлений, я просто проглядел и не туда вставил цикл :)
 

Musaigen

abobusnik
Проверенный
1,603
1,361
Как узнать был ли убит убит игрок мной?
Lua:
function main()
    if not isSampAvailable() and not isSampLoaded() then wait(1000) end
    while true do
        wait(0)
        for i = 0, 999 do
            local result, ped = sampGetCharHandleBySampPlayerId(i)
            if result then
                if doesCharExist(ped) and isCharDead(ped) then
                    if hasCharBeenDamagedByChar(ped, PLAYER_PED) then
                        -- code
                    end   
                end   
            end   
        end   
    end   
end
Что-то типа такого. Но можно и легче. (Но это не точно)
 
  • Нравится
Реакции: f0rtrix

Andreuno

Новичок
41
1
Помогите написать скрипт, который проверяет каждое новое сообщение на наличие определенного текста, после чего, если условие верно, выполняет одно действие, если не верно, то другое...
 

f0rtrix

Известный
208
15
Мне нужна программа. Не знаю, что использовать.
Ввожу в чат локальную команду, например, «/showpass id».
В ответ на команду скрипт выполняет определённые действия с использованием «id».
Как сделать?
Lua:
function main()
  if not isSampfuncsLoaded() or not isSampLoaded() then -- Если SF или SA:MP не загружены
    return -- Завершаем работу скрипта
  end
  while not isSampAvailable() do -- Ждём пока функция isSampAvailable() вернет true
  wait(0) -- Устанавливаем минимальное ожидание, что бы наша игра не зависла
  -- значение 0 говорит что мы ждём следующий кадр (Frame)
  end
  sampRegisterChatCommand("test", gtest)
end

function gtest(id)
   local gid = string.match(id,"(%d+)") -- получаем id
   local _, id1 = sampGetPlayerIdByCharHandle(PLAYER_PED) -- получаем свой id1
   if sampIsPlayerConnected(gid) and tonumber(gid) or tonumber(gid) == id1 then -- задаём условие, которое звучит так "Если игрок подключен и gid является числом или это мой id, тогда"
    -- тело функции
    print(gid)
end
 
  • Нравится
Реакции: mr.qldu