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

CaJlaT

07.11.2024 14:55
Модератор
2,846
2,687
чел... я скопировал текст вставил добавил в начале 0х и у меня какого то хуя розовый, и как можно неправильно вставлять цвет если я все скопировал?
Я имею ввиду, что там нужен ргба, а ты вставил аргб или наоборот
 

whyega52

Eblang головного мозга
Модератор
2,839
2,779
шот туплю жостка, как можно пофиксить?
Lua:
-- v jope

local hotkey = require("mimhotkey")

local binds = {
    scenarios = {}
}

-- render imgui

binds.scenarios[#binds.scenarios+1] = {                          
    name = new.char[256]("Bind " .. #binds.scenarios+1),
    keys = "[49]",
    callback = function()

    end
}
hotkey.RegisterCallback(u8:decode(str(binds.scenarios[#binds.scenarios].name)), binds.scenarios[#binds.scenarios].keys, binds.scenarios[#binds.scenarios].callback)

if #binds.scenarios > 0 then
    for i, bind in pairs(binds.scenarios) do
        if bind ~= nil then  
            local KeysBind = hotkey.KeyEditor(str(bind.name), nil, imgui.ImVec2(100,25))
        end
    end
end
Lua:
[20:10:36.873559] (error)    RakNet Changer: C:\ВАЖНОЕ\sborka soft\moonloader\lib\mimhotkey.lua:142: bad argument #1 to 'ipairs' (table expected, got string)
stack traceback:
    [C]: in function 'ipairs'
    C:\ВАЖНОЕ\sborka soft\moonloader\lib\mimhotkey.lua:142: in function 'GetKeysText'
    C:\ВАЖНОЕ\sborka soft\moonloader\lib\mimhotkey.lua:169: in function 'KeyEditor'
    C:\ВАЖНОЕ\sborka soft\moonloader\raknet.lua:1649: in function '_draw'
    C:\ВАЖНОЕ\sborka soft\moonloader\lib\mimgui\init.lua:107: in function <C:\ВАЖНОЕ\sborka soft\moonloader\lib\mimgui\init.lua:91>
[20:10:36.877555] (error)    RakNet Changer: Script died due to an error. (1356517C)

mimhotkey:
--[[
   
     ???????????    ??    ???????????      ??    ??     ????????      ???        ??   ???    ????????? ???   ?  
   ??????????????? ???  ???????????????   ???    ???   ???    ??? ???????????   ??? ?????   ???    ??? ???   ???
   ???   ???   ??? ???? ???   ???   ???   ???    ???   ???    ???    ????????   ???????     ???    ??  ?????????
   ???   ???   ??? ???? ???   ???   ???  ????????????? ???    ???     ???   ?  ???????     ???????     ?????????
   ???   ???   ??? ???? ???   ???   ??? ?????????????  ???    ???     ???     ????????    ????????     ???   ???
   ???   ???   ??? ???  ???   ???   ???   ???    ???   ???    ???     ???       ???????     ???    ??  ???   ???
   ???   ???   ??? ???  ???   ???   ???   ???    ???   ???    ???     ???       ??? ?????   ???    ??? ???   ???
    ??   ???   ??  ??    ??   ???   ??    ???    ??     ????????     ??????     ???   ???   ??????????  ???????
                                                                                ?                              
    Author: chapo
    Links:
        - https://www.blast.hk/members/112329/
        - https://vk.com/ya_chapo
        - https://vk.com/chaposcripts

]]
require('lib.moonloader')
local imgui = require('mimgui')
local vk = require 'vkeys'

HOTKEY = {
    no_flood = true,
    lastkey = 9999,
    MODULEINFO = {
        version = 2,
        author = 'chapo'
    },
    Text = {
        wait_for_key = 'Press any key...',
        no_key = 'None'
    },
    List = {},
    EditKey = nil,
    Edit = {
        backup = {},
        new = {}
    },
    Ret = {name = nil, data = {}}
}

local LargeKeys = {
    VK_SHIFT,
    VK_SPACE,
    VK_CONTROL,
    VK_LMENU,
    VK_RETURN
}

local IsKeyLarge = function(key)
    for k, v in ipairs(LargeKeys) do
        if v == key then
            return true
        end
    end
    return false
end

addEventHandler('onWindowMessage', function(msg, key)
    if msg == 0x0100 --[[ WM_KEYDOWN ]] then
        if HOTKEY.EditKey == nil then
            if (HOTKEY.no_flood and key ~= HOTKEY.lastkey) or (not HOTKEY.no_flood) then
                HOTKEY.lastkey = key
                for name, data in pairs(HOTKEY.List) do
                    keys = data.keys
                    if (#keys == 1 and key == keys[1]) or (#keys == 2 and isKeyDown(keys[1]) and key == keys[2]) then
                        data.callback(name)
                    end
                end
            end
            if HOTKEY.EditKey ~= nil then
                if #HOTKEY.List[HOTKEY.EditKey] < 2 then
                    table.insert(HOTKEY.List[HOTKEY.EditKey], key)
                end
            end
        else
            if key == VK_ESCAPE then
                HOTKEY.List[HOTKEY.EditKey].keys = HOTKEY.Edit.backup
                HOTKEY.EditKey = nil
                consumeWindowMessage(true, true)
            elseif key == VK_BACK then
                HOTKEY.List[HOTKEY.EditKey].keys = {}
                HOTKEY.EditKey = nil
                consumeWindowMessage(true, true)
            end
        end      
    elseif msg == 0x0101 --[[ WM_KEYUP ]] then
        if HOTKEY.EditKey ~= nil and key ~= VK_LMENU then
            if key == VK_BACK then
                HOTKEY.List[HOTKEY.EditKey].keys = {}
                HOTKEY.EditKey = nil
            else
                local PressKey = getDownKeys()
                local LargeKey = PressKey[#PressKey]
                HOTKEY.List[HOTKEY.EditKey].keys = {#PressKey > 0 and PressKey[#PressKey] or key, #PressKey > 0 and key or nil}
                if HOTKEY.List[HOTKEY.EditKey].keys[1] == HOTKEY.List[HOTKEY.EditKey].keys[2] then
                    HOTKEY.List[HOTKEY.EditKey].keys[2] = nil
                end
                HOTKEY.Ret.name = HOTKEY.EditKey
                HOTKEY.Ret.data = HOTKEY.List[HOTKEY.EditKey].keys
                HOTKEY.EditKey = nil
            end
        end
    end
end)

getDownKeys = function()
    local t = {}
    for index, KEYID in ipairs(LargeKeys) do
        if isKeyDown(KEYID) then
            table.insert(t, KEYID)
        end
    end
    return t
end

HOTKEY.GetBindKeys = function(bind)
    local keys = {}
    local t = {}
    if type(bind) == 'string' then
        if HOTKEY.List[bind] then
            keys = HOTKEY.List[bind].keys
        else
            return 'BIND NOT FOUND'
        end
    elseif type(bind) == 'table' then
        keys = bind
    else
        return 'INCORRECT DATA TYPE'
    end

    for k, v in ipairs(keys) do
        table.insert(t, vk.id_to_name(v) or 'UNK')
    end
    return table.concat(t, ' + ')
end

HOTKEY.GetKeysText = function(bind)
    local t = {}
    if HOTKEY.List[bind] then
        for k, v in ipairs(HOTKEY.List[bind].keys) do
            table.insert(t, vk.id_to_name(v) or 'UNK')
        end
    end
    return table.concat(t, ' + ')
end

HOTKEY.GetHotkeyKeys = function(name)
    return {HOTKEY.List[name].keys == nil and 'bind not found' or HOTKEY.GetKeysText(name)}
end

HOTKEY.RegisterCallback = function(name, keys, callback)
    if HOTKEY.List[name] == nil then
        HOTKEY.List[name] = {
            keys = keys,
            callback = callback
        }
        return true, 'vse zaebis, mojno najimat knopo4ku!'
    else
        return false, 'error, hotkey '..name..' already registred'
    end
end

--HOTKEY.KeyEditCallback

HOTKEY.KeyEditor = function(bindname, text, size)
    if HOTKEY.List[bindname] then
        local keystext = #HOTKEY.List[bindname].keys == 0 and HOTKEY.Text.no_key or HOTKEY.GetKeysText(bindname)--table.concat(HOTKEY.List[bindname].keys, ' + ')--
        if HOTKEY.EditKey ~= nil then
            if HOTKEY.EditKey == bindname then
                keystext = HOTKEY.Text.wait_for_key
            end
        end
        if imgui.Button((text ~= nil and text..': ' or '')..keystext..'##HOTKEY_EDITOR:'..bindname, size) then
            HOTKEY.Edit.backup = HOTKEY.List[bindname].keys
            HOTKEY.List[bindname].keys = {}
            HOTKEY.EditKey = bindname
        end
        if HOTKEY.Ret.name ~= nil then
            if HOTKEY.Ret.name == bindname then
                HOTKEY.Ret.name = nil
                return HOTKEY.Ret.data
            end
        end
    else
        imgui.Button('Bind "'..tostring(bindname)..'" not found##HOTKEY_EDITOR:BINDNAMENOTFOUND', size)
    end
end

return HOTKEY
 

digitalpurple

Активный
102
62
  • Нравится
Реакции: qdIbp

Карен

Участник
112
17
ребят, я немного не понимаю, я хочу сделать код чтобы типо координаты Z прописывались в чат при команде но координаты состоят еще и с точкой и дальше цифры а мне нужна только передняя цифра перед точкой остальное не нужно, пробовал регулярками реализовать не получилось
 

whyega52

Eblang головного мозга
Модератор
2,839
2,779
ребят, я немного не понимаю, я хочу сделать код чтобы типо координаты Z прописывались в чат при команде но координаты состоят еще и с точкой и дальше цифры а мне нужна только передняя цифра перед точкой остальное не нужно, пробовал регулярками реализовать не получилось
math.floor(z)