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

AnWu

Известный
Всефорумный модератор
4,778
5,403
Что не так делаю?В /smenu(скрипт менджере) показывает что скрипт загружен. Прописываю комманду /govno,но когда у меня стает меньше 46 хп не юзается аптечка без анимации,вообще ничего не происходит.

Lua:
script_name("autosbiv")
script_author("las")
    local lib = require "lib.samp.events"
    local state = false

    function main()
      while not isSampAvailable() do wait(100) end
      sampregisterclientcommand("govno", cmd)
       while true do wait(0)
  end
end
function lib.onApplyPlayerAnimation()
  if state then return false
    end
end
  function lib.OnSetPlayerHealth()
        if state then
      local health = getCharHealth(playerPed)
        if health < 46  then
             sampSendChat("/healme")
         end
             wait(500)
            sampSendChat("0")
     end
end
  function cmd()
      state = not state
end
Код из onSerPlayerHealth в main()
 

Cutler18

Известный
161
2
Есть команда /dav например
Хочу что бы можно было после нее писать цифру 1,2 или 3, больше никаких
И что бы каждая цифра вывела в чат определенный текст
Как можно это реализовать?
 

AnWu

Известный
Всефорумный модератор
4,778
5,403
Есть команда /dav например
Хочу что бы можно было после нее писать цифру 1,2 или 3, больше никаких
И что бы каждая цифра вывела в чат определенный текст
Как можно это реализовать?
Lua:
sampRegisterClientCommand("dav", function (p)
    if type(p) ~= "number" then
          sampAddChatMessage("Ашипка", -1)
    end
    if p == 1 then
         -- code
    elseif p == 2 then
         -- code
    elseif p == 3 then
         -- code
    end
end)
 
  • Нравится
Реакции: Cutler18

AnWu

Известный
Всефорумный модератор
4,778
5,403
Я не правильно обьяснил,он отображается в скрипт мендежере (то что он существует) но он не загружен,даже когда нажимаю Load все равно не загружает,не могу понять в чём изьян.
wait() можно использовать ток в потоках. main()
 

AnWu

Известный
Всефорумный модератор
4,778
5,403
renderDrawPolygon(float posX, float posY, float sizeX, float sizeY, int corners, float rotation, uint color)
:thinking:
Тебе из принципа на каждый мелкий вопрос по новой теме? Го в общую чтоли.
 

las-_

Новичок
11
2
wait() можно использовать ток в потоках. main()
переделал код как и было сказано,все равно тоже самое(

Lua:
script_name("autosbiv")
script_author("las")
    local lib = require "lib.samp.events"
    local state = false

    function main()
      while not isSampAvailable() do wait(100) end
      sampregisterclientcommand("govno", cmd)
       while true do wait(0)
                 if state then
             local health = getCharHealth(playerPed)
                 if health < 46  then
                            sampSendChat("/healme")
  end
end
function lib.onApplyPlayerAnimation()
  if state then return false
    end
end
 
  function cmd()
      state = not state
end
 

Вложения

  • bV7cFct8yyE.jpg
    bV7cFct8yyE.jpg
    151.9 KB · Просмотры: 397

Cutler18

Известный
161
2
Lua:
sampRegisterClientCommand("dav", function (p)
    if type(p) ~= "number" then
          sampAddChatMessage("Ашипка", -1)
    end
    if p == 1 then
         -- code
    elseif p == 2 then
         -- code
    elseif p == 3 then
         -- code
    end
end)
Можешь показать на этом примере?
Lua:
function main()
  if not isSampfuncsLoaded() or not isSampLoaded() then return end
  while not isSampAvailable() do wait(100) end
  sampRegisterChatCommand("rn", rn)
  while true do
    wait(0)
  end
end


function rn(args)
  if args ~= '' then sampSendChat("/r (( "..args .." ))")
  else sampAddChatMessage("Введите /rn [text]", 0xFF0000)
  end
end
 

AnWu

Известный
Всефорумный модератор
4,778
5,403
переделал код как и было сказано,все равно тоже самое(

Lua:
script_name("autosbiv")
script_author("las")
    local lib = require "lib.samp.events"
    local state = false

    function main()
      while not isSampAvailable() do wait(100) end
      sampregisterclientcommand("govno", cmd)
       while true do wait(0)
                 if state then
             local health = getCharHealth(playerPed)
                 if health < 46  then
                            sampSendChat("/healme")
  end
end
function lib.onApplyPlayerAnimation()
  if state then return false
    end
end
 
  function cmd()
      state = not state
end
Ты мне Moonloader.log скинь, а не это баганое творение раннего фипа.


Можешь показать на этом примере?
Lua:
function main()
  if not isSampfuncsLoaded() or not isSampLoaded() then return end
  while not isSampAvailable() do wait(100) end
  sampRegisterChatCommand("rn", rn)
  while true do
    wait(0)
  end
end


function rn(args)
  if args ~= '' then sampSendChat("/r (( "..args .." ))")
  else sampAddChatMessage("Введите /rn [text]", 0xFF0000)
  end
end
Может ты уже начнёшь головой думать, я на это смотрю как 2 + 2. Почему ты не хочешь понять как это работает а просто ждёшь готовый вариант?
 

Cutler18

Известный
161
2
Ты мне Moonloader.log скинь, а не это баганое творение раннего фипа.



Может ты уже начнёшь головой думать, я на это смотрю как 2 + 2. Почему ты не хочешь понять как это работает а просто ждёшь готовый вариант?
Ты на луа наверно пишешь уже годами, а я 3 дня
Вспомни себя в когда начинал
 

AnWu

Известный
Всефорумный модератор
4,778
5,403
Ты на луа наверно пишешь уже годами, а я 3 дня
Вспомни себя в когда начинал
А если я скажу что о луа узнал 3 месяца назад? Точнее о муне. С луа познакомился еще на МТА. Я начинал просто. Беру скрипт из примеров или раздела "Модификации", смотрю как он работает, беру из него кусок, еще кусок с другого и собираю своего франкенштейна. Если заработает - ура. Так потихоньку освоился. Сюда я конечно писал, когда дело заходило совсем в тупик, но не бежал сразу при первой трудности.:monkey:
 

las-_

Новичок
11
2
Ты мне Moonloader.log скинь, а не это баганое творение раннего фипа.



Может ты уже начнёшь головой думать, я на это смотрю как 2 + 2. Почему ты не хочешь понять как это работает а просто ждёшь готовый вариант?
 

Вложения

  • moonloader.log
    3.3 KB · Просмотры: 6

AnWu

Известный
Всефорумный модератор
4,778
5,403
Почему не закрывает диалог?
Lua:
function ip(id)
  local pid = string.match(id, '(%d+)')
  if pid ~= nil then
    sampSendChat('/stats '..pid)
    wait(2000)
    sampCloseCurrentDialogWithButton(0)
else
    sampAddChatMessage("{6C519A}error", 0xC1C1C1)
  end
end
wait() нельзя использовать в callback функциях. Но есть одна хитрость.
Lua:
lua_theard.create(function () 
    sampSendChat('/stats '..pid)
    wait(2000)
    sampCloseCurrentDialogWithButton(0)
end)
 

AnWu

Известный
Всефорумный модератор
4,778
5,403
sampregisterclientcommand("govno", cmd)
Lua - регистрозависимый язык. Пиши правильно. sampRegisterClientCommand

а название функции куда писать?
Оно тебе ненадо. Вставь мой код вместо своего.
Lua:
function ip(id)
  local pid = string.match(id, '(%d+)')
  if pid ~= nil then
    sampSendChat('/stats '..pid)
   lua_theard.create(function ()
         wait(2000)
         sampCloseCurrentDialogWithButton(0)
    end)
else
    sampAddChatMessage("{6C519A}error", 0xC1C1C1)
  end
end