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

|| NN - NoName ||

Известный
1,049
635
Я переставил function main(), прошлая ошибка пропала, а теперь вылазит эта:Посмотреть вложение 53433

Код скрипта:
script_name("VIP Clients")
script_version("14.03.2020")
script_author("Spataphore")
local script_version_str = "14.03.2020"
    autoupdate("https://jsonbin.io/5e94b24d9148886ed2f9c2ff/3", '['..string.upper(thisScript().name)..']: ', "https://jsonbin.io/5e94b24d9148886ed2f9c2ff/3")
end

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

local imgui = require 'imgui'
function imgui.OnDrawFrame()

imgui.SetNextWindowSize(imgui.ImVec2(150, 200), imgui.Cond.FirstUseEver)
imgui.SetNextWindowPos(imgui.ImVec2(1080, 330), imgui.Cond.FirstUseEver)
if menu1
then
  imgui.ShowCursor = true
else
  imgui.ShowCursor = false
end
imgui.Begin('VIP Clients 14.04.2020')
  imgui.Text('Sergey_Spataphore')
  imgui.Text('Denis_Atreides')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
  imgui.End()
end


function main()
  imgui.Process = true
end
function autoupdate(json_url, prefix, url)
  local dlstatus = require('moonloader').download_status
  local json = getWorkingDirectory() .. '\\'..thisScript().name..'-version.json'
  if doesFileExist(json) then os.remove(json) end
  downloadUrlToFile(json_url, json,
    function(id, status, p1, p2)
      if status == dlstatus.STATUSEX_ENDDOWNLOAD then
        if doesFileExist(json) then
          local f = io.open(json, 'r')
          if f then
            local info = decodeJson(f:read('*a'))
            updatelink = info.updateurl
            updateversion = info.latest
            f:close()
            os.remove(json)
            if updateversion ~= thisScript().version then
              lua_thread.create(function(prefix)
                local dlstatus = require('moonloader').download_status
                local color = -1
                sampAddChatMessage((prefix..'Обнаружено обновление. Пытаюсь обновиться c '..thisScript().version..' на '..updateversion), color)
                wait(250)
                downloadUrlToFile(updatelink, thisScript().path,
                  function(id3, status1, p13, p23)
                    if status1 == dlstatus.STATUS_DOWNLOADINGDATA then
                      print(string.format('Загружено %d из %d.', p13, p23))
                    elseif status1 == dlstatus.STATUS_ENDDOWNLOADDATA then
                      print('Загрузка обновления завершена.')
                      sampAddChatMessage((prefix..'Обновление завершено!'), color)
                      goupdatestatus = true
                      lua_thread.create(function() wait(500) thisScript():reload() end)
                    end
                    if status1 == dlstatus.STATUSEX_ENDDOWNLOAD then
                      if goupdatestatus == nil then
                        sampAddChatMessage((prefix..'Обновление прошло неудачно. Запускаю устаревшую версию..'), color)
                        update = false
                      end
                    end
                  end
                )
                end, prefix
              )
            else
              update = false
              print('v'..thisScript().version..': Обновление не требуется.')
            end
          end
        else
          print('v'..thisScript().version..': Не могу проверить обновление.')
          update = false
        end
      end
    end
  )
  while update ~= false do wait(100) end
end
1) Почему у тебя 2-е функции main()
2) Где то ты забыл закрыть либо условие либо функцию. Либо наоборот лишний end.
 
  • Нравится
Реакции: deleted-user-342019
D

deleted-user-342019

Гость
Мне правда очень жаль, что я задаю столько вопросов.
Думаю, что я очень глуп 😕
Вообщем, я из всего кода решил заняться только авто-обновлением, потому что сам скрипт без апдейта работает нормально. Я вытащил и переделал код, но опять ошибка. Подскажите, пли-и-из 😘
1586809167969.png


Авто-обновление:
script_name("VIP Clients")
script_version("13.03.2020")
script_author("Spataphore")
local script_version_str = "13.03.2020"

function main()
    autoupdate("https://jsonbin.io/5e94b24d9148886ed2f9c2ff/3", '['..string.upper(thisScript().name)..']: ', "https://jsonbin.io/5e94b24d9148886ed2f9c2ff/3")

function autoupdate(json_url, prefix, url)
  local dlstatus = require('moonloader').download_status
  local json = getWorkingDirectory() .. '\\'..thisScript().name..'-version.json'
  if doesFileExist(json) then os.remove(json) end
  downloadUrlToFile(json_url, json,
    function(id, status, p1, p2)
      if status == dlstatus.STATUSEX_ENDDOWNLOAD then
        if doesFileExist(json) then
          local f = io.open(json, 'r')
          if f then
            local info = decodeJson(f:read('*a'))
            updatelink = info.updateurl
            updateversion = info.latest
            f:close()
            os.remove(json)
            if updateversion ~= thisScript().version then
              lua_thread.create(function(prefix)
                local dlstatus = require('moonloader').download_status
                local color = -1
                sampAddChatMessage((prefix..'Обнаружено обновление. Пытаюсь обновиться c '..thisScript().version..' на '..updateversion), color)
                wait(250)
                downloadUrlToFile(updatelink, thisScript().path,
                  function(id3, status1, p13, p23)
                    if status1 == dlstatus.STATUS_DOWNLOADINGDATA then
                      print(string.format('Загружено %d из %d.', p13, p23))
                    elseif status1 == dlstatus.STATUS_ENDDOWNLOADDATA then
                      print('Загрузка обновления завершена.')
                      sampAddChatMessage((prefix..'Обновление завершено!'), color)
                      goupdatestatus = true
                      lua_thread.create(function() wait(500) thisScript():reload() end)
                    end
                    if status1 == dlstatus.STATUSEX_ENDDOWNLOAD then
                      if goupdatestatus == nil then
                        sampAddChatMessage((prefix..'Обновление прошло неудачно. Запускаю устаревшую версию..'), color)
                        update = false
                      end
                    end
                  end
                )
                end, prefix
              )
            else
              update = false
              print('v'..thisScript().version..': Обновление не требуется.')
            end
          end
        else
          print('v'..thisScript().version..': Не могу проверить обновление. Смиритесь или проверьте самостоятельно на '..url)
          update = false
        end
      end
    end
  )
  while update ~= false do wait(100) end
end
 

|| NN - NoName ||

Известный
1,049
635
Мне правда очень жаль, что я задаю столько вопросов.
Думаю, что я очень глуп 😕
Вообщем, я из всего кода решил заняться только авто-обновлением, потому что сам скрипт без апдейта работает нормально. Я вытащил и переделал код, но опять ошибка. Подскажите, пли-и-из 😘
Посмотреть вложение 53437

Авто-обновление:
script_name("VIP Clients")
script_version("13.03.2020")
script_author("Spataphore")
local script_version_str = "13.03.2020"

function main()
    autoupdate("https://jsonbin.io/5e94b24d9148886ed2f9c2ff/3", '['..string.upper(thisScript().name)..']: ', "https://jsonbin.io/5e94b24d9148886ed2f9c2ff/3")

function autoupdate(json_url, prefix, url)
  local dlstatus = require('moonloader').download_status
  local json = getWorkingDirectory() .. '\\'..thisScript().name..'-version.json'
  if doesFileExist(json) then os.remove(json) end
  downloadUrlToFile(json_url, json,
    function(id, status, p1, p2)
      if status == dlstatus.STATUSEX_ENDDOWNLOAD then
        if doesFileExist(json) then
          local f = io.open(json, 'r')
          if f then
            local info = decodeJson(f:read('*a'))
            updatelink = info.updateurl
            updateversion = info.latest
            f:close()
            os.remove(json)
            if updateversion ~= thisScript().version then
              lua_thread.create(function(prefix)
                local dlstatus = require('moonloader').download_status
                local color = -1
                sampAddChatMessage((prefix..'Обнаружено обновление. Пытаюсь обновиться c '..thisScript().version..' на '..updateversion), color)
                wait(250)
                downloadUrlToFile(updatelink, thisScript().path,
                  function(id3, status1, p13, p23)
                    if status1 == dlstatus.STATUS_DOWNLOADINGDATA then
                      print(string.format('Загружено %d из %d.', p13, p23))
                    elseif status1 == dlstatus.STATUS_ENDDOWNLOADDATA then
                      print('Загрузка обновления завершена.')
                      sampAddChatMessage((prefix..'Обновление завершено!'), color)
                      goupdatestatus = true
                      lua_thread.create(function() wait(500) thisScript():reload() end)
                    end
                    if status1 == dlstatus.STATUSEX_ENDDOWNLOAD then
                      if goupdatestatus == nil then
                        sampAddChatMessage((prefix..'Обновление прошло неудачно. Запускаю устаревшую версию..'), color)
                        update = false
                      end
                    end
                  end
                )
                end, prefix
              )
            else
              update = false
              print('v'..thisScript().version..': Обновление не требуется.')
            end
          end
        else
          print('v'..thisScript().version..': Не могу проверить обновление. Смиритесь или проверьте самостоятельно на '..url)
          update = false
        end
      end
    end
  )
  while update ~= false do wait(100) end
end
function main()
autoupdate("https://jsonbin.io/5e94b24d9148886ed2f9c2ff/3", '['..string.upper(thisScript().name)..']: ', "https://jsonbin.io/5e94b24d9148886ed2f9c2ff/3")
end
Ты забыл end
 
  • Влюблен
Реакции: deleted-user-342019
D

deleted-user-342019

Гость
ЛЮДИ, КОТОРЫЕ МНЕ ПОМОГАЮТ, Я ВАС ОБОЖАЮ! ПРОГРЕСС!
Короче, теперь скрипт запускается во время запуска САМПа, а потом в момент обновления дохнет и отрубается.
Как решить??
1586810632134.png


Код скрипта:
script_name("VIP Clients")
script_version("14.04.2020")
script_author("Spataphore")
local script_version_str = "14.04.2020"

function main()
    autoupdate("https://jsonbin.io/5e94b24d9148886ed2f9c2ff/4", '['..string.upper(thisScript().name)..']: ', "https://jsonbin.io/5e94b24d9148886ed2f9c2ff/4")
end

local imgui = require 'imgui'
function imgui.OnDrawFrame()

 imgui.SetNextWindowSize(imgui.ImVec2(150, 200), imgui.Cond.FirstUseEver)
imgui.SetNextWindowPos(imgui.ImVec2(1080, 330), imgui.Cond.FirstUseEver)
if menu1
then
  imgui.ShowCursor = true
else
  imgui.ShowCursor = false
end
imgui.Begin('VIP Clients 14.04.20')
  imgui.Text('Sergey_Spataphore')
  imgui.Text('Denis_Atreides')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
  imgui.End()
end


  imgui.Process = true
function autoupdate(json_url, prefix, url)
  local dlstatus = require('moonloader').download_status
  local json = getWorkingDirectory() .. '\\'..thisScript().name..'-version.json'
  if doesFileExist(json) then os.remove(json) end
  downloadUrlToFile(json_url, json,
    function(id, status, p1, p2)
      if status == dlstatus.STATUSEX_ENDDOWNLOAD then
        if doesFileExist(json) then
          local f = io.open(json, 'r')
          if f then
            local info = decodeJson(f:read('*a'))
            updatelink = info.updateurl
            updateversion = info.latest
            f:close()
            os.remove(json)
            if updateversion ~= thisScript().version then
              lua_thread.create(function(prefix)
                local dlstatus = require('moonloader').download_status
                local color = -1
                sampAddChatMessage((prefix..'Обнаружено обновление. Пытаюсь обновиться c '..thisScript().version..' на '..updateversion), color)
                wait(250)
                downloadUrlToFile(updatelink, thisScript().path,
                  function(id3, status1, p13, p23)
                    if status1 == dlstatus.STATUS_DOWNLOADINGDATA then
                      print(string.format('Загружено %d из %d.', p13, p23))
                    elseif status1 == dlstatus.STATUS_ENDDOWNLOADDATA then
                      print('Загрузка обновления завершена.')
                      sampAddChatMessage((prefix..'Обновление завершено!'), color)
                      goupdatestatus = true
                      lua_thread.create(function() wait(500) thisScript():reload() end)
                    end
                    if status1 == dlstatus.STATUSEX_ENDDOWNLOAD then
                      if goupdatestatus == nil then
                        sampAddChatMessage((prefix..'Обновление прошло неудачно. Запускаю устаревшую версию..'), color)
                        update = false
                      end
                    end
                  end
                )
                end, prefix
              )
            else
              update = false
              print('v'..thisScript().version..': Обновление не требуется.')
            end
          end
        else
          print('v'..thisScript().version..': Не могу проверить обновление.')
          update = false
        end
      end
    end
  )
  while update ~= false do wait(100) end
end
 

|| NN - NoName ||

Известный
1,049
635
ЛЮДИ, КОТОРЫЕ МНЕ ПОМОГАЮТ, Я ВАС ОБОЖАЮ! ПРОГРЕСС!
Короче, теперь скрипт запускается во время запуска САМПа, а потом в момент обновления дохнет и отрубается.
Как решить??
Посмотреть вложение 53438

Код скрипта:
script_name("VIP Clients")
script_version("14.04.2020")
script_author("Spataphore")
local script_version_str = "14.04.2020"

function main()
    autoupdate("https://jsonbin.io/5e94b24d9148886ed2f9c2ff/4", '['..string.upper(thisScript().name)..']: ', "https://jsonbin.io/5e94b24d9148886ed2f9c2ff/4")
end

local imgui = require 'imgui'
function imgui.OnDrawFrame()

imgui.SetNextWindowSize(imgui.ImVec2(150, 200), imgui.Cond.FirstUseEver)
imgui.SetNextWindowPos(imgui.ImVec2(1080, 330), imgui.Cond.FirstUseEver)
if menu1
then
  imgui.ShowCursor = true
else
  imgui.ShowCursor = false
end
imgui.Begin('VIP Clients 14.04.20')
  imgui.Text('Sergey_Spataphore')
  imgui.Text('Denis_Atreides')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
imgui.Text('-')
  imgui.End()
end


  imgui.Process = true
function autoupdate(json_url, prefix, url)
  local dlstatus = require('moonloader').download_status
  local json = getWorkingDirectory() .. '\\'..thisScript().name..'-version.json'
  if doesFileExist(json) then os.remove(json) end
  downloadUrlToFile(json_url, json,
    function(id, status, p1, p2)
      if status == dlstatus.STATUSEX_ENDDOWNLOAD then
        if doesFileExist(json) then
          local f = io.open(json, 'r')
          if f then
            local info = decodeJson(f:read('*a'))
            updatelink = info.updateurl
            updateversion = info.latest
            f:close()
            os.remove(json)
            if updateversion ~= thisScript().version then
              lua_thread.create(function(prefix)
                local dlstatus = require('moonloader').download_status
                local color = -1
                sampAddChatMessage((prefix..'Обнаружено обновление. Пытаюсь обновиться c '..thisScript().version..' на '..updateversion), color)
                wait(250)
                downloadUrlToFile(updatelink, thisScript().path,
                  function(id3, status1, p13, p23)
                    if status1 == dlstatus.STATUS_DOWNLOADINGDATA then
                      print(string.format('Загружено %d из %d.', p13, p23))
                    elseif status1 == dlstatus.STATUS_ENDDOWNLOADDATA then
                      print('Загрузка обновления завершена.')
                      sampAddChatMessage((prefix..'Обновление завершено!'), color)
                      goupdatestatus = true
                      lua_thread.create(function() wait(500) thisScript():reload() end)
                    end
                    if status1 == dlstatus.STATUSEX_ENDDOWNLOAD then
                      if goupdatestatus == nil then
                        sampAddChatMessage((prefix..'Обновление прошло неудачно. Запускаю устаревшую версию..'), color)
                        update = false
                      end
                    end
                  end
                )
                end, prefix
              )
            else
              update = false
              print('v'..thisScript().version..': Обновление не требуется.')
            end
          end
        else
          print('v'..thisScript().version..': Не могу проверить обновление.')
          update = false
        end
      end
    end
  )
  while update ~= false do wait(100) end
end
Проблема в этой строчке:
local info = decodeJson(f:read('*a'))
 

OG Buda

Активный
149
34
Как при появлении edit object отправить нажатие по кнопке сохранения?
 

Вложения

  • EditingObject.png
    EditingObject.png
    36.2 KB · Просмотры: 121

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,907
1,282
Как при появлении edit object отправить нажатие по кнопке сохранения?
sampSendEditAttachedObject(int response, int index, int model, int bone, float offsetX, float offsetY, float offsetZ, float rotX, float rotY, float rotZ, float scaleX, float scaleY, float scaleZ)
 
  • Нравится
Реакции: OG Buda

Kulen

Новичок
11
0
Может кто знает как получить что написано красным цветом, без использования SF
IMG_20200414_115146.jpg