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

accord-

Потрачен
437
79
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
В чём проблема с хоткеями, раньше всё идеально работало, а сейчас нет

Lua:
script_name('test')
script_author('test')

require "lib.moonloader"
require "lib.sampfuncs"

local imgui = require('imgui')
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local inicfg = require 'inicfg'
local rkeys = require 'rkeys'
imgui.HotKey = require('imgui_addons').HotKey

local window = imgui.ImBool(false)

local tab = 1
local tabs = {
    [1] = 'Основное',
    [2] = 'Горячие клавиши',
}

local directIni = 'ATools\\AdminToolsCFG.ini'
local ini = inicfg.load(inicfg.load({
    config = {
        menu = "amenu",
    },
}, directIni))
inicfg.save(ini, directIni)

local tLastKeys = {}
local path = getGameDirectory()..'\\moonloader\\config\\ATools\\HotKeys.json'

local hotkeys = {
    hotmenu = {v = {VK_113}},
    cursor = {v = {VK_112}},
    hotrslap = {v = {VK_114}},
    hotrkick = {v = {VK_115}},
    hottproad = {v = {VK_116}},
}

local menu = imgui.ImBuffer(ini.config.menu,32)

if not doesFileExist(path) then
    local f = io.open(path, 'w+')
    f:write(encodeJson(hotkeys)):close()
else
    local f = io.open(path, "r")
    a = f:read("*a")
    hotkeys = decodeJson(a)
    f:close()
end

function main()
    while not isSampAvailable() do wait(200) end

    if not doesDirectoryExist('moonloader/config') then createDirectory("moonloader/config") end
    if not doesDirectoryExist('moonloader/config/ATools') then createDirectory ("moonloader/config/ATools") end
    if not doesFileExist('moonloader/config/ATools/AdminToolsCFG.ini') then inicfg.save(ini, directIni) end
    palitrajpg = imgui.CreateTextureFromFile("moonloader/config/ATools/palitra.jpg")

    sampAddChatMessage('Скрипт загружен /amenu', -1)

    sampRegisterChatCommand(ini.config.menu, function() window.v = not window.v end)

    -- HOTKEYS
    bindmenu = rkeys.registerHotKey(hotkeys.hotmenu.v, true, function()
        window.v = not window.v
    end)

    bindcursor = rkeys.registerHotKey(hotkeys.cursor.v, true, function()
        sampAddChatMessage('Хоткей для курсора работает', -1)
    end)
   
    bindrslap = rkeys.registerHotKey(hotkeys.hotrslap.v, true, function()
        sampAddChatMessage('Хоткей для слапа работает', -1)
    end)
   
    bindrkick = rkeys.registerHotKey(hotkeys.hotrkick.v, true, function()
        sampAddChatMessage('Хоткей для кика работает', -1)
    end)

    bindtproad = rkeys.registerHotKey(hotkeys.hottproad.v, true, function()
        sampAddChatMessage('Хоткей для тп на дорогу работает', -1)
    end)

    imgui.Process = false
    window.v = false  --show window on start

    while true do
        wait(0)
        imgui.Process = window.v
        result, idplayer = sampGetPlayerIdByCharHandle(playerPed)
        nickplayer = sampGetPlayerNickname(idplayer)

        --[[
        if cursor_state.v then
            sampSetCursorMode(2)
        else  
            sampSetCursorMode(0)
        end
        --]]
    end
end
       
function imgui.OnDrawFrame()
    if window.v then
        local resX, resY = getScreenResolution()
        local sizeX, sizeY = 1000, 550
        imgui.SetNextWindowPos(imgui.ImVec2(resX / 2 - sizeX / 2, resY / 2 - sizeY / 2), imgui.Cond.FirstUseEver)
        imgui.SetNextWindowSize(imgui.ImVec2(sizeX, sizeY), imgui.Cond.FirstUseEver)
        imgui.Begin(" ATools", window, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse)

        imgui.BeginChild("##MenuButtons", imgui.ImVec2(160, 520), true, imgui.WindowFlags.NoScrollbar)

            for k, v in ipairs(tabs) do
                if imgui.Button(u8(v), imgui.ImVec2(148, 25)) then
                    tab = k
                end
            end

        imgui.EndChild()

        imgui.SameLine()

        imgui.BeginChild("##Tabs", imgui.ImVec2(820, 520), true, imgui.WindowFlags.NoScrollbar)

            if tab == 1 then

                imgui.Text(u8'Текущий ник:')
                imgui.SameLine()
                imgui.TextDisabled(nickplayer .. "["..idplayer.."]")

                imgui.PushItemWidth(170)
                if imgui.InputText(u8' Команда активации',menu) then ini.config.menu = menu.v inicfg.save(ini,directIni) end

            elseif tab == 2 then

                if imgui.HotKey("##1", hotkeys.hotmenu, tLastKeys, 70) then
                    rkeys.changeHotKey(bindmenu, hotkeys.hotmenu.v)
                    JSONSave()
                end
                imgui.SameLine()
                imgui.Text(u8" меню")

                if imgui.HotKey("##2", hotkeys.cursor, tLastKeys, 70) then
                    rkeys.changeHotKey(bindcursor, hotkeys.cursor.v)
                    JSONSave()
                end
                imgui.SameLine()
                imgui.Text(u8"типо курсор")
               
                if imgui.HotKey("##3", hotkeys.hotrslap, tLastKeys, 70) then
                    rkeys.changeHotKey(bindrslap, hotkeys.hotrslap.v)
                    JSONSave()
                end
                imgui.SameLine()
                imgui.Text(u8"слап в радиусе")
       
                if imgui.HotKey("##4", hotkeys.hotrkick, tLastKeys, 70) then
                    rkeys.changeHotKey(bindrkick, hotkeys.hotrkick.v)
                    JSONSave()
                end
                imgui.SameLine()
                imgui.Text(u8"кик в радиусе")
       
                if imgui.HotKey("##5", hotkeys.hottproad, tLastKeys, 70) then
                    rkeys.changeHotKey(bindtproad, hotkeys.hottproad.v)
                    JSONSave()
                end
                imgui.SameLine()
                imgui.Text(u8"тп дорога")
            end
        imgui.EndChild()

        imgui.End()
    end

end

function JSONSave()
    if doesFileExist(path) then
        local f = io.open(path, 'w+')
        if f then
            f:write(encodeJson(hotkeys)):close()
        end
    end
end
 

rieder

Участник
93
6
вобщем, есть переменная dmglist, при нанесении урона (onSendTakeDamage), должен записываться ник(playerId), какое действие для этого можно применить?
 

Insanity

Известный
247
20
Вопрос по изучению
В программировании я ноль, хочу очень научиться, но и самп люблю.
Многие твердят учи Питон, может стоит начать с луа, а потом постепенно на Питон? Или нет? Насколько они похожи? Помогите ламеру определиться.
 

rieder

Участник
93
6
Вопрос по изучению
В программировании я ноль, хочу очень научиться, но и самп люблю.
Многие твердят учи Питон, может стоит начать с луа, а потом постепенно на Питон? Или нет? Насколько они похожи? Помогите ламеру определиться.
смотря что ты хочешь делать, если скрипты для сампа и тд, то можешь луа, если что-то посерьезней, то питон
 

xednxk

Новичок
9
1
Вопрос по изучению
В программировании я ноль, хочу очень научиться, но и самп люблю.
Многие твердят учи Питон, может стоит начать с луа, а потом постепенно на Питон? Или нет? Насколько они похожи? Помогите ламеру определиться.
я начинал с питона. на нем можно всякие интересные штуки делать, без ограничений. но луа проще намного, а с имгуи, мемори и ещё парочкой библиотек становится тоже интереснее, наверное стоит выбрать луа. пока не надоест
 

rieder

Участник
93
6
вообщем, когда я получаю ид игрока через onSendTakeDamage, всё нормально, но на арз, и много где, когда например ты падаешь, пишет что ты получил урон от колизии, и игра зависает, скорее всего потому что функция не может получить ид игрока когда это колизия, как это пофиксить?
 

xednxk

Новичок
9
1
вообщем, когда я получаю ид игрока через onSendTakeDamage, всё нормально, но на арз, и много где, когда например ты падаешь, пишет что ты получил урон от колизии, и игра зависает, скорее всего потому что функция не может получить ид игрока когда это колизия, как это пофиксить?
если playerid пустой, то не получать никнейм или вообще ничего не заносить.
 

Gorskin

♥ Love Lua ♥
Проверенный
1,338
1,178
Кто нибудь пытался занопить прорисовку на лаунчере аризоны? Надо убрать оттуда /fogdist. У меня не получается, может кто делал уже такое?
 
  • Вау
Реакции: qdIbp

chapo

чопа сребдс // @moujeek
Модератор
8,932
11,699
вообщем, когда я получаю ид игрока через onSendTakeDamage, всё нормально, но на арз, и много где, когда например ты падаешь, пишет что ты получил урон от колизии, и игра зависает, скорее всего потому что функция не может получить ид игрока когда это колизия, как это пофиксить?
if playerid ~= 65535 then
 
  • Нравится
Реакции: rieder