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

checkdasound

Известный
Проверенный
963
410
Как загрузить шрифт для использования в PushFont в имгуи?

Спасибо. А это не знаешь что? При вводе команды в чат вылетает.
pCb0l3f.png

При вводе команды, которая открывает меню имгуи?
 

Musaigen

abobusnik
Проверенный
1,606
1,361
Как загрузить шрифт для использования в PushFont в имгуи?
Lua:
local bFontChanged = false

function imgui.BeforeDrawFrame()
  if not bFontChanged then
    glyph_ranges = imgui.GetIO().Fonts:GetGlyphRangesCyrillic()
    imgui.GetIO().Fonts:Clear()
    imgui.GetIO().Fonts:AddFontFromFileTTF(getFolderPath(0x14) .. '\\arialbd.ttf', 14, nil, glyph_ranges)
    imgui.RebuildFonts()
    bFontChanged = true
  end
end
 
  • Нравится
Реакции: Alkasch226 и checkdasound

TheDed

Участник
99
14
Что это ещё за ошибка "Отказано в доступе." ?
Код:
error loading module 'cjson.safe' from file 'D:\GTA San Andreas\moonloader\lib\cjson.dll':
    Отказано в доступе.


stack traceback:
    [C]: in ?
    [C]: in function 'require'
    D:\GTA San Andreas\moonloader\lib\requests.lua:7: in main chunk
    [C]: in function 'require'
 

vlads250

Известный
27
0
В чем проблема может быть?
[ML] (error) Autocommands: ...Grand Theft Auto San Andreas\moonloader\autocommands.lua:18: attempt to index global 'dlstatus' (a nil value)
stack traceback:
...Grand Theft Auto San Andreas\moonloader\autocommands.lua:18: in function <...Grand Theft Auto San Andreas\moonloader\autocommands.lua:17>
[ML] (error) Autocommands: Script died due to an error. (01AEB6CC)

Lua:
function update()
    local fpath = os.getenv('TEMP') .. '\\update.json'
    downloadUrlToFile('https://---/update.json', 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
                end
            end
        end
    end
end)
end
 

TheDed

Участник
99
14
В чем проблема может быть?
[ML] (error) Autocommands: ...Grand Theft Auto San Andreas\moonloader\autocommands.lua:18: attempt to index global 'dlstatus' (a nil value)
stack traceback:
...Grand Theft Auto San Andreas\moonloader\autocommands.lua:18: in function <...Grand Theft Auto San Andreas\moonloader\autocommands.lua:17>
[ML] (error) Autocommands: Script died due to an error. (01AEB6CC)

Lua:
function update()
    local fpath = os.getenv('TEMP') .. '\\update.json'
    downloadUrlToFile('https://---/update.json', 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
                end
            end
        end
    end
end)
end
у переменной dlstatus нету значения, т.е. нету 'local dlstatus = чему-то'
 

wD.D159

Известный
Друг
446
480
Использую данный код для удаления лишнего маппинга, что бы освободить слоты и поднять производительность игрового процесса. Но при старте игры, во время подключения к серверу, игра намертво зависает. Помогите решить данную проблему ребят.

PS: Логи чистые. IP сервера - 176.32.36.131:7777 (РДС)

SAMPFUNCS v5.3.3 release #19
Moonloader: v.026.5-beta
SA.exe: 1.0 us
CLEO: 4.3.22
SAMP: 0.3.7 R1

Lua:
require 'lib.moonloader'
local SE = require 'lib.samp.events'

local effects = {18681, 18685, 18686, 19296, 19295, 18647, 18648, 18649, 18650, 18651, 18652}
local uho = {5992, 3437, 1251, 4988, 19366, 2674, 1544, 1543, 1664, 2779, 2778, 2673, 338, 1751, 1488, 2427, 2475, 1548, 2821, 2702, 3096, 1568, 19425, 1256, 19121}

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

      while true do wait(0)
        if isKeyDown(96) and isKeyJustPressed(50) then
            objc = not objc
            if objc then
                sampAddChatMessage("•   {1E90FF}ObjClear{808080}  |  {90EE90}Активирован!", 0xFFFFFF)
            else
                sampAddChatMessage("•   {1E90FF}ObjClear{808080}  |  {FA8072}Деактивирован!", 0xFFFFFF)
            end
        end
    end
end

function SE.onCreateObject(id, data)
    if objc then
        for i, def in ipairs(effects) do if data.modelId == def then return false end end
        
        for i, duh in ipairs(uho) do
            if data.modelId == duh and (data.position.x < -241.8611 and data.position.x > -1342.7891) and (data.position.y > 1272.4189 and data.position.y < 2076.9631)
            or (data.position.x < -284.3942 and data.position.x > -311.0041) and (data.position.y > 1719.8575 and data.position.y < 1808.1743)
            or (data.position.x < -484.2792 and data.position.x > -488.4025) and (data.position.y > 1119.7349 and data.position.y < 1125.4281)
            or (data.position.x < -430.9218 and data.position.x > -844.6927) and (data.position.y > 1380.9220 and data.position.y < 1998.1134) then
                return false
            end
        end

        if data.modelId == 19543 and (data.position.x < 40.7739 and data.position.x > 3.7759) and (data.position.y > 1503.9178 and data.position.y < 1543.0624) then return false end
    
        if (data.position.x < -273.6320 and data.position.x > -457.2663) and (data.position.y > -1788.9014 and data.position.y < -1420.0171) then
            return false
        end
    end
end
 
Последнее редактирование:

RedApple

Известный
41
0
Как сделать что-то типа антирадара для автомобиля?
Проще говоря, запретить серверу считывать скорость движения авто
 

ChickenYaki

Участник
55
0
script_name ('Info Box')
script_author ('ChickenYaki')

function main ()
while true do
local font_flag = require ('moonloader'). font_flag
local myfont = renderCreateFont ('Arial', 12, font_flag. BOLD + font_flag. SHADOW)
local _, id = sampGetPlayerIdByCharHandle (playerPed)
local nick = sampGetPlayerNickname (id)
local lvl = sampGetPlayerScore (id)
local ping = sampGetPlayerPing (playerPed)
local hp = sampGetPlayerHealth (playerPed)
local armor = sampGetPlayerArmor (playerPed)
renderFontDrawText (myfont, 'Nickname:' ..nick .. '(' ..id .. ') Level:' ..lvl .. '\ nPing:' ..ping .. '\ n HP:' ..hp .. '\ nArmor:' ..armor, 180, 120, 0x1e90ff)
wait (0)
end
end

why doesn't it works ?
 

atizoff

приобретаю кашель за деньги
Проверенный
1,296
1,179
script_name ('Info Box')
script_author ('ChickenYaki')

function main ()
while true do
local font_flag = require ('moonloader'). font_flag
local myfont = renderCreateFont ('Arial', 12, font_flag. BOLD + font_flag. SHADOW)
local _, id = sampGetPlayerIdByCharHandle(playerPed)
local nick = sampGetPlayerNickname(id)
local lvl = sampGetPlayerScore(id)
local ping = sampGetPlayerPing(playerPed)
local hp = sampGetPlayerHealth(playerPed)
local armor = sampGetPlayerArmor(playerPed)
renderFontDrawText(myfont, 'Nickname:' ..nick .. '(' ..id .. ') Level:' ..lvl .. '\ nPing:' ..ping .. '\ n HP:' ..hp .. '\ nArmor:' ..armor, 180, 120, 0x1e90ff)
wait (0)
end
end

why doesn't it works ?
Lua:
local font_flag = require ('moonloader'). font_flag
local myfont = renderCreateFont ('Arial', 12, font_flag. BOLD + font_flag. SHADOW)

function main()
while true do wait(0)
local _, id = sampGetPlayerIdByCharHandle(playerPed)
local nick = sampGetPlayerNickname(id)
local lvl = sampGetPlayerScore(id)
local ping = sampGetPlayerPing(playerPed)
local hp = sampGetPlayerHealth(playerPed)
local armor = sampGetPlayerArmor(playerPed)
renderFontDrawText(myfont, 'Nickname:' ..nick .. '(' ..id .. ') Level:' ..lvl .. '\ nPing:' ..ping .. '\ n HP:' ..hp .. '\ nArmor:' ..armor, 180, 120, 0x1e90ff)
wait (0)
end
end