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

D3AMWYT

Участник
72
12
Да. Для проверки пустого параметра надо if arg == '' then Ну или я рукожоп или у меня все робит и с nil
 

Fabregoo

Известный
656
128
сори, ошибся темой)
пробуй эту, я этот код брал
Вроде всё в норме, но у меня на дроп боксе висит версия скрипта 2.1 а когда обновляюсь с 1.9 пишет что у вас и так последняя версия.
 

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
Вроде всё в норме, но у меня на дроп боксе висит версия скрипта 2.1 а когда обновляюсь с 1.9 пишет что у вас и так последняя версия.
ну это либо к автору либо к тем кто шарит, ибо там с цифрами работа. Или может из-за десятичных цифр, не знаю как это работает)
 
  • Нравится
Реакции: Fabregoo

Rezistence

Участник
67
1
Lua:
local ckSoundRep = imgui.ImBool(pInfo.set.reportSound)

local pInfo = inicfg.load({
     set = {
        reportSound = false
     }
}, "AT")

    if imgui.Checkbox("Report Sound", ckSoundRep) then
        pInfo.set.reportSound = ckSoundRep.v
        if ckSoundRep.v then
            onServerMessage()
        else
      onServerMessage()
        end
    end
   
    function SE.onServerMessage(color, message)
    if message:find('Репорт от:') then
     addOneOffSound(0.0, 0.0, 0.0, 1085)
    end
end

Как можно выключить эту функцию?
Актуально.
 

D3AMWYT

Участник
72
12
Парни проблема, есть текст "Загружено 43236/50000" как правильно считать 43236 и если она состоит из 5 цифр то указать первые 2 если из 4 то только 1
что бы записать в переменную
 

Fabregoo

Известный
656
128
Не обновляется, жму на UPDATE ME вылазит Updating а дальше ничего, ни сообшенние об ошибке, не об успешном обновленние
Lua:
local imgui = require 'imgui'
local key = require 'vkeys'
-- вот это надо
script_version("1.0")
local color = 0x348cb2
-- это тоже
local dlstatus = require('moonloader').download_status

local main_window_state = imgui.ImBool(false)
function imgui.OnDrawFrame()
  if main_window_state.v then
    imgui.SetNextWindowSize(imgui.ImVec2(150, 200), imgui.Cond.FirstUseEver)
    imgui.Begin('Testing update', main_window_state)
    if imgui.Button('UPDATE ME!') then
      printStringNow('Updating!', 1000)
      update()
    end
    imgui.Text("Now version "..thisScript().version)
    imgui.End()
  end
end

function update()
  local fpath = os.getenv('TEMP') .. '\\testing_version.json'
  downloadUrlToFile('//jsonbin.io/5ded260fbc5ffd040095f1f5', fpath, function(id, status, p1, p2) -- ссылку на ваш гитхаб где есть строчки которые я ввёл в теме или любой другой сайт
    if status == dlstatus.STATUS_ENDDOWNLOADDATA then
    local f = io.open(fpath, 'r') -- открывает файл
    if f then
      local info = decodeJson(f:read('*a')) -- читает
      updatelink = info.updateurl
      if info and info.latest then
        version = tonumber(info.latest) -- переводит версию в число
        if version > tonumber(thisScript().version) then -- если версия больше чем версия установленная то...
          lua_thread.create(goupdate) -- апдейт
        else -- если меньше, то
          update = false -- не даём обновиться
          sampAddChatMessage(('[Testing]: У вас и так последняя версия! Обновление отменено'), color)
        end
      end
    end
  end
end)
end
--скачивание актуальной версии
function goupdate()
sampAddChatMessage(('[Testing]: Обнаружено обновление. AutoReload может конфликтовать. Обновляюсь...'), color)
sampAddChatMessage(('[Testing]: Текущая версия: '..thisScript().version..". Новая версия: "..version), color)
wait(300)
downloadUrlToFile(updatelink, thisScript().path, function(id3, status1, p13, p23) -- качает ваш файлик с latest version
  if status1 == dlstatus.STATUS_ENDDOWNLOADDATA then
  sampAddChatMessage(('[Testing]: Обновление завершено!'), color)
  thisScript():reload()
end
end)
end

-- ВСЁ!

function main()
  while true do
    wait(0)
    if wasKeyPressed(key.VK_X) then -- активация по нажатию клавиши X
        main_window_state.v = not main_window_state.v -- переключаем статус активности окна, не забываем про .v
    end
    imgui.Process = main_window_state.v -- теперь значение imgui.Process всегда будет задаваться в зависимости от активности основного окна
  end
end
 

Scott Invisible

Новичок
24
1
Что не так, почему флудит строкой "sampSendDialogResponse(547, 1, 0, "")"?
Lua:
require "lib.moonloader"
require 'moonloader'
local sampev = require 'lib.samp.events'
local memory = require "memory"

function main()
repeat wait(0) until isSampAvailable()

while true do wait(0)
if testCheat("6") then
sampSendChat('/boot')
sampSendClickTextdraw(168) end
sampSendDialogResponse(899, 1, 1, "")
sampSendDialogResponse(547, 1, 0, "")
end
end
 

Fabregoo

Известный
656
128
как на гит хабе создать такую сылку?
Что не так, почему флудит строкой "sampSendDialogResponse(547, 1, 0, "")"?
Lua:
require "lib.moonloader"
require 'moonloader'
local sampev = require 'lib.samp.events'
local memory = require "memory"

function main()
repeat wait(0) until isSampAvailable()

while true do wait(0)
if testCheat("6") then
sampSendChat('/boot')
sampSendClickTextdraw(168) end
sampSendDialogResponse(899, 1, 1, "")
sampSendDialogResponse(547, 1, 0, "")
end
end
Потому что они у тебя в бесконечном цикле.
 

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
45260

45261

45262
 
  • Нравится
Реакции: Fabregoo