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

tsunamiqq

Участник
429
16
Как изменить шрифт на mimgui? И откуда скачивать шрифт который мне нужен, и куда его закидать, и нужно ли это вообще, смотрел как делают на imgui , там не указан путь к файлу, а просто название шрифта, по-этому такой вопрос
 

percheklii

Известный
731
268
Как изменить шрифт на mimgui? И откуда скачивать шрифт который мне нужен, и куда его закидать, и нужно ли это вообще, смотрел как делают на imgui , там не указан путь к файлу, а просто название шрифта, по-этому такой вопрос
потому что многие хранят шрифт в памяти
 
  • Нравится
Реакции: tsunamiqq

NotFound

Участник
74
22
Пытаюсь разобраться в MoonMonet, столкнулся с проблемой, что в функцию buildColors необходимо передать цвет в 16тиричном формате (0xAARRGGBB). Цвет беру из imgui.ColorEdit4, конвертирую в строку (RRGGBB). Каким образом я могу конвертировать эту строку в число для функции buildColors? Или как данные из ColorEdit4 сразу конвертировать и передать в функцию?
 

auf.exe

Участник
37
12
Всем здравствуйте, как сделать что-то на подобии бескончного списка в файле ини. Например я сохраняю переключается на переменную ноут2 потом на 3 потом на 4, я сделал что-то подобное но не пашет подскажите товарищи гуру
1692226287080.png
 

linmsqn

Участник
337
9
как отключить у игроков полоски хп и армора? и каким образом при определенном кол-ве хп менять человеку цвет ника
 

!Sam#0235

Активный
121
39
Кто-нибудь знает способ добавить этот свет на все вертолеты? // Does anyone know of a way to add this light to all helicopters?
 

Вложения

  • images_6.jpg
    images_6.jpg
    14.6 KB · Просмотры: 12

Dm1try_

Участник
10
0
Я создал мультичит в .lua, но есть ли способ передать lua-скрипт в .exe и использовать его? или вам нужно перестроить код
 

why ega

РП игрок
Модератор
2,548
2,241
Я создал мультичит в .lua, но есть ли способ передать lua-скрипт в .exe и использовать его? или вам нужно перестроить код
Скорее всего ты использовал мун апи и сф апи, поэтому не знаю, какие круги ада тебе надо пройти, чтобы это скомпилировать в рабочем виде

Пытаюсь разобраться в MoonMonet, столкнулся с проблемой, что в функцию buildColors необходимо передать цвет в 16тиричном формате (0xAARRGGBB). Цвет беру из imgui.ColorEdit4, конвертирую в строку (RRGGBB). Каким образом я могу конвертировать эту строку в число для функции buildColors? Или как данные из ColorEdit4 сразу конвертировать и передать в функцию?
Lua без разницы, как ты передаешь число: в десятичной, шестнадцатеричной, в любом случае она его будет переводить в десятичную систему счисления. Не знаю какой формат твоих цветов, но вот код, который соединяет 4 канала в одно число
Lua:
local color = {r = 0x12, g = 0xFF, b = 0x87, a = 0xFF}
local argb = bit.bor(bit.lshift(color.a, 24), bit.lshift(color.r, 16), bit.lshift(color.g, 8), color.b)
print(argb) -- выведет в десятичной системе

Всем здравствуйте, как сделать что-то на подобии бескончного списка в файле ини. Например я сохраняю переключается на переменную ноут2 потом на 3 потом на 4, я сделал что-то подобное но не пашет подскажите товарищи гуру
Посмотреть вложение 212074
Не совсем понимаю, что ты хочешь сделать, но думаю json в твоём случае будет более удобным
 
Последнее редактирование:
  • Нравится
Реакции: NotFound

percheklii

Известный
731
268
Короче, добавил рендер иконок в килллист с шрифта gtaweapon3 по этому методу ссылка
все вроде бы ничего, но если свернуть игру и потом развернуть ее, намертво зависает игра с черным экраном или вообще крашит.
UPD: пока нет килллиста, все нормально, не зависает при сворачивание, но если появиться хоть одна иконка, все пизда.
в чем может быть трабл?

Lua:
script_name("killList")
script_author("perchik")

local sampev = require("samp.events")
local ffi = require("ffi")
local d3dx9_43 = ffi.load('d3dx9_43.dll')
local imgui = require("mimgui")
local inicfg = require("inicfg")
local ini = inicfg.load({
    set = {
        x = 500,
        y = 500,
        iconsize = 20,
        fontname = "Arial",
        fontsize = 9,
        fontflag = 13,
        showid = false,
        alignment = 1
    }
}, "killList")

ffi.cdef[[
    struct kill_list_entry {
        char killer[25];
        char victim[25];
        uint32_t killer_color;
        uint32_t victim_color;
        uint8_t weapon_id;
    } __attribute__ ((packed));

    struct kill_list_information {
        int is_enabled;
        struct kill_list_entry entries[5];
        int longest_nick_length;
        int offset_x;
        int offset_y;
        void* d3d_font;
        void* weapon_font1;
        void* weapon_font2;
        void* sprite;
        void* d3d_device;
        int unk1;
        void* unk2;
        void* unk3;
    } __attribute__ ((packed));
]]

ffi.cdef [[
typedef struct stRECT
{
    int left, top, right, bottom;
} RECT;

typedef struct stID3DXFont
{
    struct ID3DXFont_vtbl* vtbl;
} ID3DXFont;

struct ID3DXFont_vtbl
{
        void* QueryInterface; // STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
    void* AddRef; // STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    uint32_t (__stdcall * Release)(ID3DXFont* font); // STDMETHOD_(ULONG, Release)(THIS) PURE;

    // ID3DXFont
    void* GetDevice; // STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE9 *ppDevice) PURE;
    void* GetDescA; // STDMETHOD(GetDescA)(THIS_ D3DXFONT_DESCA *pDesc) PURE;
    void* GetDescW; // STDMETHOD(GetDescW)(THIS_ D3DXFONT_DESCW *pDesc) PURE;
    void* GetTextMetricsA; // STDMETHOD_(BOOL, GetTextMetricsA)(THIS_ TEXTMETRICA *pTextMetrics) PURE;
    void* GetTextMetricsW; // STDMETHOD_(BOOL, GetTextMetricsW)(THIS_ TEXTMETRICW *pTextMetrics) PURE;

    void* GetDC; // STDMETHOD_(HDC, GetDC)(THIS) PURE;
    void* GetGlyphData; // STDMETHOD(GetGlyphData)(THIS_ UINT Glyph, LPDIRECT3DTEXTURE9 *ppTexture, RECT *pBlackBox, POINT *pCellInc) PURE;

    void* PreloadCharacters; // STDMETHOD(PreloadCharacters)(THIS_ UINT First, UINT Last) PURE;
    void* PreloadGlyphs; // STDMETHOD(PreloadGlyphs)(THIS_ UINT First, UINT Last) PURE;
    void* PreloadTextA; // STDMETHOD(PreloadTextA)(THIS_ LPCSTR pString, INT Count) PURE;
    void* PreloadTextW; // STDMETHOD(PreloadTextW)(THIS_ LPCWSTR pString, INT Count) PURE;

    int (__stdcall * DrawTextA)(ID3DXFont* font, void* pSprite, const char* pString, int Count, RECT* pRect, uint32_t Format, uint32_t Color); // STDMETHOD_(INT, DrawTextA)(THIS_ LPD3DXSPRITE pSprite, LPCSTR pString, INT Count, LPRECT pRect, DWORD Format, D3DCOLOR Color) PURE;
    void* DrawTextW; // STDMETHOD_(INT, DrawTextW)(THIS_ LPD3DXSPRITE pSprite, LPCWSTR pString, INT Count, LPRECT pRect, DWORD Format, D3DCOLOR Color) PURE;

    void (__stdcall * OnLostDevice)(ID3DXFont* font); // STDMETHOD(OnLostDevice)(THIS) PURE;
    void (__stdcall * OnResetDevice)(ID3DXFont* font); // STDMETHOD(OnResetDevice)(THIS) PURE;
};

uint32_t D3DXCreateFontA(void* pDevice, int Height, uint32_t Width, uint32_t Weight, uint32_t MipLevels, bool Italic, uint32_t CharSet, uint32_t OutputPrecision, uint32_t Quality, uint32_t PitchAndFamily, const char* pFaceName, ID3DXFont** ppFont);
]]

local ID = {
    Background = -1,
    Unarmed = 0,
    Knuckles = 1,
    Golf = 2,
    Stick = 3,
    Knife = 4,
    Bat = 5,
    Shovel = 6,
    Cue = 7,
    Katana = 8,
    Chainsaw = 9,
    Dildo1 = 10,
    Dildo2 = 11,
    Dildo3 = 12,
    Dildo4 = 13,
    Flowers = 14,
    Cane = 15,
    Grenade = 16,
    Gas = 17,
    Molotov = 18,
    Pistol = 22,
    Slicend = 23,
    Eagle = 24,
    Shotgun = 25,
    Sawnoff = 26,
    Combat = 27,
    Uzi = 28,
    Mp5 = 29,
    Ak47 = 30,
    M4 = 31,
    Tec9 = 32,
    Rifle = 33,
    Sniper = 34,
    RPG = 35,
    Launcher = 36,
    Flame = 37,
    Minigun = 38,
    Sachet = 39,
    Detonator = 40,
    Spray = 41,
    Extinguisher = 42,
    Goggles1 = 44,
    Goggles2 = 45,
    Parachute = 46,
}

local RenderGun = {
    [ID.Background] = 71,
    [ID.Unarmed] = 37,
    [ID.Knuckles] = 66,
    [ID.Golf] = 62,
    [ID.Stick] = 40,
    [ID.Knife] = 67,
    [ID.Bat] = 63,
    [ID.Shovel] = 38,
    [ID.Cue] = 34,
    [ID.Katana] = 33,
    [ID.Chainsaw] = 49,
    [ID.Dildo1] = 69,
    [ID.Dildo2] = 69,
    [ID.Dildo3] = 69,
    [ID.Dildo4] = 69,
    [ID.Flowers] = 36,
    [ID.Cane] = 35,
    [ID.Grenade] = 64,
    [ID.Gas] = 68,
    [ID.Molotov] = 39,
    [ID.Pistol] = 54,
    [ID.Slicend] = 50,
    [ID.Eagle] = 51,
    [ID.Shotgun] = 61,
    [ID.Sawnoff] = 48,
    [ID.Combat] = 43,
    [ID.Uzi] = 73,
    [ID.Mp5] = 56,
    [ID.Ak47] = 72,
    [ID.M4] = 53,
    [ID.Tec9] = 55,
    [ID.Rifle] = 46,
    [ID.Sniper] = 65,
    [ID.RPG] = 52,
    [ID.Launcher] = 41,
    [ID.Flame] = 42,
    [ID.Minigun] = 70,
    [ID.Sachet] = 60,
    [ID.Detonator] = 59,
    [ID.Spray] = 47,
    [ID.Extinguisher] = 44,
    [ID.Goggles1] = 45,
    [ID.Goggles2] = 45,
    [ID.Parachute] = 58
}

local window = imgui.new.bool()
local imgui_showid = imgui.new.bool(ini.set.showid)
local imgui_fontname = imgui.new.char[128](ini.set.fontname)
local imgui_fontsize = imgui.new.int(ini.set.fontsize)
local imgui_fontflag = imgui.new.int(ini.set.fontflag)
local imgui_iconsize = imgui.new.int(ini.set.iconsize)
local alignment = imgui.new.int(ini.set.alignment)
local item_list = {"Left", "Middle", "Right"}
local ImItems = imgui.new['const char*'][#item_list](item_list)
local textures = {}
local font = renderCreateFont(ini.set.fontname, ini.set.fontsize, ini.set.fontflag)

function get_killList()
    local kill = ffi.cast("struct kill_list_information*", sampGetKillInfoPtr())
    local kill_list_entries = {}

    for i = 0, 4 do
        local entry = kill.entries[i]
        local killer_name = ffi.string(entry.killer)
        local victim_name = ffi.string(entry.victim)

        if killer_name ~= "" and victim_name ~= "" and entry.weapon_id >= 0 and entry.weapon_id <= 225 then              
            local new_entry = {
                killer = string.format("{%06X}%s", entry.killer_color, killer_name),
                victim = string.format("{%06X}%s", entry.victim_color, victim_name),
                weapon = entry.weapon_id
            }
            table.insert(kill_list_entries, new_entry)
        end
    end
    return kill_list_entries
end

function sampev.onPlayerDeathNotification(killerId, killedId, reason)
    if ini.set.showid then
        local kill = ffi.cast("struct kill_list_information*", sampGetKillInfoPtr())
        local _, myid = sampGetPlayerIdByCharHandle(playerPed)

        local n_killer = ( sampIsPlayerConnected(killerId) or killerId == myid ) and sampGetPlayerNickname(killerId) or nil
        local n_killed = ( sampIsPlayerConnected(killedId) or killedId == myid ) and sampGetPlayerNickname(killedId) or nil
        lua_thread.create(function()
            wait(0)
            if n_killer then kill.entries[4].killer = ffi.new('char[25]', ( n_killer .. '[' .. killerId .. ']' ):sub(1, 24) ) end
            if n_killed then kill.entries[4].victim = ffi.new('char[25]', ( n_killed .. '[' .. killedId .. ']' ):sub(1, 24) ) end
        end)
    end
end

function d3dxfont_create(name, height, charset)
    charset = charset or 1
    local d3ddev = ffi.cast('void*', getD3DDevicePtr())
    local pfont = ffi.new('ID3DXFont*[1]', {nil})
    if tonumber(d3dx9_43.D3DXCreateFontA(d3ddev, height, 0, 0, 1, false, charset, 0, 4, 0, name, pfont)) < 0 then
        return nil
    end
    return pfont[0]
end

function d3dxfont_draw(font, text, rect, color, format)
    local prect = ffi.new('RECT[1]', {{rect[1], rect[2], rect[3], rect[4]}})
    return font.vtbl.DrawTextA(font, nil, text, -1, prect, format, color)
end

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

    sampAddChatMessage("{8742f5}[killList]{FFFFFF} Скрипт загружен. Команда: {8742f5}/klist | {FFFFFF}Автор: {8742f5}perchik.", 0xFFFFFF)

    sampRegisterChatCommand("klist", function()
        window[0] = not window[0]
    end)

    font_gtaweapon3 = d3dxfont_create('gtaweapon3', 20, 2)
    fonts_loaded = true

    setStructElement(sampGetKillInfoPtr(), 0, 4, 0)
    wait(-1)
end

function onD3DPresent()
    if fonts_loaded then
        local sw, sh = getScreenResolution()
        local killList = get_killList()
        local x, y, size = ini.set.x, ini.set.y, 20
        for i = 1, math.min(#killList, 5) do
            if alignment[0] == 0 then
                local lformat = string.format("%s {FFFFFF}» %s", killList[i]["killer"], killList[i]["victim"])
                d3dxfont_draw(font_gtaweapon3, string.char(RenderGun[killList[i]["weapon"]]), {x, y, sw, sh}, 0xFFFFFFFF, 0x10)
                renderFontDrawText(font, lformat, x, y, -1)
            elseif alignment[0] == 1 then
                local mkiller = string.format("%s", killList[i]["killer"])
                local mvictim = string.format("%s", killList[i]["victim"])
                renderFontDrawText(font, mkiller, x - renderGetFontDrawTextLength(font, mkiller), y, -1)
                d3dxfont_draw(font_gtaweapon3, string.char(RenderGun[killList[i]["weapon"]]), {x, y, sw, sh}, 0xFFFFFFFF, 0x10)
                renderFontDrawText(font, mvictim, x + 6 + size, y, -1)
            elseif alignment[0] == 2 then
                local rformat = string.format("%s {FFFFFF}» %s", killList[i]["killer"], killList[i]["victim"])
                renderFontDrawText(font, rformat, x - renderGetFontDrawTextLength(font, rformat), y, -1)
                d3dxfont_draw(font_gtaweapon3, string.char(RenderGun[killList[i]["weapon"]]), {x - 5, y, sw, sh}, 0xFFFFFFFF, 0x10)
            end
            y = y + size
        end
    end
end

imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil
    theme()
end)

imgui.OnFrame(function() return window[0] end, function(player)
    local sw, sh = getScreenResolution()
    imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.Always, imgui.ImVec2(0.5, 0.5))
    imgui.Begin("killList", window, imgui.WindowFlags.NoCollapse + imgui.WindowFlags.AlwaysAutoResize)

    imgui.PushItemWidth(150)

    if imgui.Checkbox("ShowId", imgui_showid) then
        ini.set.showid = not ini.set.showid
        inicfg.save(ini,"killList")
    end

    if imgui.Combo("Alignment", alignment, ImItems, #item_list) then
        ini.set.alignment = alignment[0]
        inicfg.save(ini, "killList")
    end

    if imgui.InputText("FontName", imgui_fontname, 128) then
        ini.set.fontname = ffi.string(imgui_fontname)
        font = renderCreateFont(ini.set.fontname, ini.set.fontsize, ini.set.fontflag)
        inicfg.save(ini,"killList")
    end

    if imgui.InputInt("FontSize", imgui_fontsize) then
        ini.set.fontsize = imgui_fontsize[0]
        font = renderCreateFont(ini.set.fontname, ini.set.fontsize, ini.set.fontflag)
        inicfg.save(ini, "killList")
    end

    if imgui.InputInt("FontFlag", imgui_fontflag) then
        ini.set.fontflag = imgui_fontflag[0]
        font = renderCreateFont(ini.set.fontname, ini.set.fontsize, ini.set.fontflag)
        inicfg.save(ini, "killList")
    end

    if imgui.InputInt("IconSize", imgui_iconsize) then
        ini.set.iconsize = imgui_iconsize[0]
        inicfg.save(ini, "killList")
    end

    if imgui.Button("Change Position", imgui.ImVec2(150, 20)) then
        sampAddChatMessage("{8742f5}[killList]{FFFFFF} Выберите позицию, затем нажмите ЛКМ.", 0xFFFFFF)
        lua_thread.create(function()
            window[0] = false
            while not isKeyJustPressed(1) do wait(0)
                sampSetCursorMode(4)
                ini.set.x, ini.set.y = getCursorPos()
            end
            window[0] = true
            sampSetCursorMode(0)
            inicfg.save(ini, "killList")
        end)
    end

    imgui.PopItemWidth()
    imgui.End()
end)

function theme()
    imgui.GetStyle().WindowTitleAlign = imgui.ImVec2(0.5, 0.5)
    imgui.GetStyle().Colors[imgui.Col.FrameBg] = imgui.ImVec4(0.12, 0.12, 0.12, 1.00)
    imgui.GetStyle().Colors[imgui.Col.FrameBgHovered] = imgui.ImVec4(0.25, 0.25, 0.26, 1.00)
    imgui.GetStyle().Colors[imgui.Col.FrameBgActive] = imgui.ImVec4(0.25, 0.25, 0.26, 1.00)
    imgui.GetStyle().Colors[imgui.Col.Button] = imgui.ImVec4(0.12, 0.12, 0.12, 1.00)
    imgui.GetStyle().Colors[imgui.Col.ButtonHovered] = imgui.ImVec4(0.21, 0.20, 0.20, 1.00)
    imgui.GetStyle().Colors[imgui.Col.ButtonActive] = imgui.ImVec4(0.41, 0.41, 0.41, 1.00)
    imgui.GetStyle().Colors[imgui.Col.TitleBgActive] = imgui.ImVec4(0.12, 0.12, 0.12, 1.00)
    imgui.GetStyle().Colors[imgui.Col.Border] = imgui.ImVec4(0.25, 0.25, 0.26, 0.54)
    imgui.GetStyle().Colors[imgui.Col.BorderShadow] = imgui.ImVec4(0.00, 0.00, 0.00, 0.00)
    imgui.GetStyle().Colors[imgui.Col.TextSelectedBg] = imgui.ImVec4(0.25, 0.25, 0.26, 0.54)
    imgui.GetStyle().Colors[imgui.Col.CheckMark] = imgui.ImVec4(1.00, 1.00, 1.00, 1.00)
    imgui.GetStyle().Colors[imgui.Col.Header] = imgui.ImVec4(0.12, 0.12, 0.12, 1.00)
    imgui.GetStyle().Colors[imgui.Col.HeaderHovered] = imgui.ImVec4(0.20, 0.20, 0.20, 1.00)
    imgui.GetStyle().Colors[imgui.Col.HeaderActive] = imgui.ImVec4(0.47, 0.47, 0.47, 1.00)
end
 

NotFound

Участник
74
22
Всем здравствуйте, как сделать что-то на подобии бескончного списка в файле ини. Например я сохраняю переключается на переменную ноут2 потом на 3 потом на 4, я сделал что-то подобное но не пашет подскажите товарищи гуру
Посмотреть вложение 212074
Lua:
local imgui = require('imgui')
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
        
local window = imgui.ImBool(false)

local inicfg = require 'inicfg'
local directIni = 'test.ini'

local saveInputText = {
    {''}
}
tabl = {}
 
local inputs = inicfg.load(saveInputText, directIni)

function main()
    while not isSampAvailable() do wait(200) end
    imgui.Process = false
    window.v = true
    
    for i, value in ipairs(inputs) do
        table.insert(tabl, {imgui.ImBuffer(u8:decode(value[1]), 256)})
    end
    while true do
        wait(0)
        imgui.Process = window.v
    end
end
        
function imgui.OnDrawFrame()
    if window.v then
        local resX, resY = getScreenResolution()
        local sizeX, sizeY = 300, 300 -- WINDOW SIZE
        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('Window Title', window)
        if imgui.Button('add') then
            table.insert(tabl, {imgui.ImBuffer(256)})
            table.insert(inputs, {#inputs})
        end
        for i, value in ipairs(tabl) do
            imgui.InputText('##'..i, value[1])
            imgui.SameLine()
            if imgui.Button('delete##'..i) then
                table.remove(tabl, i)
                table.remove(inputs, i)
            end
        end
        if imgui.Button('save') then
            for i, value in ipairs(tabl) do
                inputs[i][1] = value[1].v
            end
            inicfg.save(inputs, directIni)
        end
        imgui.End()
    end
end
image.png
 

Andrinall

Известный
680
532
Короче, добавил рендер иконок в килллист с шрифта gtaweapon3 по этому методу ссылка
все вроде бы ничего, но если свернуть игру и потом развернуть ее, намертво зависает игра с черным экраном или вообще крашит.
UPD: пока нет килллиста, все нормально, не зависает при сворачивание, но если появиться хоть одна иконка, все пизда.
в чем может быть трабл?

Lua:
script_name("killList")
script_author("perchik")

local sampev = require("samp.events")
local ffi = require("ffi")
local d3dx9_43 = ffi.load('d3dx9_43.dll')
local imgui = require("mimgui")
local inicfg = require("inicfg")
local ini = inicfg.load({
    set = {
        x = 500,
        y = 500,
        iconsize = 20,
        fontname = "Arial",
        fontsize = 9,
        fontflag = 13,
        showid = false,
        alignment = 1
    }
}, "killList")

ffi.cdef[[
    struct kill_list_entry {
        char killer[25];
        char victim[25];
        uint32_t killer_color;
        uint32_t victim_color;
        uint8_t weapon_id;
    } __attribute__ ((packed));

    struct kill_list_information {
        int is_enabled;
        struct kill_list_entry entries[5];
        int longest_nick_length;
        int offset_x;
        int offset_y;
        void* d3d_font;
        void* weapon_font1;
        void* weapon_font2;
        void* sprite;
        void* d3d_device;
        int unk1;
        void* unk2;
        void* unk3;
    } __attribute__ ((packed));
]]

ffi.cdef [[
typedef struct stRECT
{
    int left, top, right, bottom;
} RECT;

typedef struct stID3DXFont
{
    struct ID3DXFont_vtbl* vtbl;
} ID3DXFont;

struct ID3DXFont_vtbl
{
        void* QueryInterface; // STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
    void* AddRef; // STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    uint32_t (__stdcall * Release)(ID3DXFont* font); // STDMETHOD_(ULONG, Release)(THIS) PURE;

    // ID3DXFont
    void* GetDevice; // STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE9 *ppDevice) PURE;
    void* GetDescA; // STDMETHOD(GetDescA)(THIS_ D3DXFONT_DESCA *pDesc) PURE;
    void* GetDescW; // STDMETHOD(GetDescW)(THIS_ D3DXFONT_DESCW *pDesc) PURE;
    void* GetTextMetricsA; // STDMETHOD_(BOOL, GetTextMetricsA)(THIS_ TEXTMETRICA *pTextMetrics) PURE;
    void* GetTextMetricsW; // STDMETHOD_(BOOL, GetTextMetricsW)(THIS_ TEXTMETRICW *pTextMetrics) PURE;

    void* GetDC; // STDMETHOD_(HDC, GetDC)(THIS) PURE;
    void* GetGlyphData; // STDMETHOD(GetGlyphData)(THIS_ UINT Glyph, LPDIRECT3DTEXTURE9 *ppTexture, RECT *pBlackBox, POINT *pCellInc) PURE;

    void* PreloadCharacters; // STDMETHOD(PreloadCharacters)(THIS_ UINT First, UINT Last) PURE;
    void* PreloadGlyphs; // STDMETHOD(PreloadGlyphs)(THIS_ UINT First, UINT Last) PURE;
    void* PreloadTextA; // STDMETHOD(PreloadTextA)(THIS_ LPCSTR pString, INT Count) PURE;
    void* PreloadTextW; // STDMETHOD(PreloadTextW)(THIS_ LPCWSTR pString, INT Count) PURE;

    int (__stdcall * DrawTextA)(ID3DXFont* font, void* pSprite, const char* pString, int Count, RECT* pRect, uint32_t Format, uint32_t Color); // STDMETHOD_(INT, DrawTextA)(THIS_ LPD3DXSPRITE pSprite, LPCSTR pString, INT Count, LPRECT pRect, DWORD Format, D3DCOLOR Color) PURE;
    void* DrawTextW; // STDMETHOD_(INT, DrawTextW)(THIS_ LPD3DXSPRITE pSprite, LPCWSTR pString, INT Count, LPRECT pRect, DWORD Format, D3DCOLOR Color) PURE;

    void (__stdcall * OnLostDevice)(ID3DXFont* font); // STDMETHOD(OnLostDevice)(THIS) PURE;
    void (__stdcall * OnResetDevice)(ID3DXFont* font); // STDMETHOD(OnResetDevice)(THIS) PURE;
};

uint32_t D3DXCreateFontA(void* pDevice, int Height, uint32_t Width, uint32_t Weight, uint32_t MipLevels, bool Italic, uint32_t CharSet, uint32_t OutputPrecision, uint32_t Quality, uint32_t PitchAndFamily, const char* pFaceName, ID3DXFont** ppFont);
]]

local ID = {
    Background = -1,
    Unarmed = 0,
    Knuckles = 1,
    Golf = 2,
    Stick = 3,
    Knife = 4,
    Bat = 5,
    Shovel = 6,
    Cue = 7,
    Katana = 8,
    Chainsaw = 9,
    Dildo1 = 10,
    Dildo2 = 11,
    Dildo3 = 12,
    Dildo4 = 13,
    Flowers = 14,
    Cane = 15,
    Grenade = 16,
    Gas = 17,
    Molotov = 18,
    Pistol = 22,
    Slicend = 23,
    Eagle = 24,
    Shotgun = 25,
    Sawnoff = 26,
    Combat = 27,
    Uzi = 28,
    Mp5 = 29,
    Ak47 = 30,
    M4 = 31,
    Tec9 = 32,
    Rifle = 33,
    Sniper = 34,
    RPG = 35,
    Launcher = 36,
    Flame = 37,
    Minigun = 38,
    Sachet = 39,
    Detonator = 40,
    Spray = 41,
    Extinguisher = 42,
    Goggles1 = 44,
    Goggles2 = 45,
    Parachute = 46,
}

local RenderGun = {
    [ID.Background] = 71,
    [ID.Unarmed] = 37,
    [ID.Knuckles] = 66,
    [ID.Golf] = 62,
    [ID.Stick] = 40,
    [ID.Knife] = 67,
    [ID.Bat] = 63,
    [ID.Shovel] = 38,
    [ID.Cue] = 34,
    [ID.Katana] = 33,
    [ID.Chainsaw] = 49,
    [ID.Dildo1] = 69,
    [ID.Dildo2] = 69,
    [ID.Dildo3] = 69,
    [ID.Dildo4] = 69,
    [ID.Flowers] = 36,
    [ID.Cane] = 35,
    [ID.Grenade] = 64,
    [ID.Gas] = 68,
    [ID.Molotov] = 39,
    [ID.Pistol] = 54,
    [ID.Slicend] = 50,
    [ID.Eagle] = 51,
    [ID.Shotgun] = 61,
    [ID.Sawnoff] = 48,
    [ID.Combat] = 43,
    [ID.Uzi] = 73,
    [ID.Mp5] = 56,
    [ID.Ak47] = 72,
    [ID.M4] = 53,
    [ID.Tec9] = 55,
    [ID.Rifle] = 46,
    [ID.Sniper] = 65,
    [ID.RPG] = 52,
    [ID.Launcher] = 41,
    [ID.Flame] = 42,
    [ID.Minigun] = 70,
    [ID.Sachet] = 60,
    [ID.Detonator] = 59,
    [ID.Spray] = 47,
    [ID.Extinguisher] = 44,
    [ID.Goggles1] = 45,
    [ID.Goggles2] = 45,
    [ID.Parachute] = 58
}

local window = imgui.new.bool()
local imgui_showid = imgui.new.bool(ini.set.showid)
local imgui_fontname = imgui.new.char[128](ini.set.fontname)
local imgui_fontsize = imgui.new.int(ini.set.fontsize)
local imgui_fontflag = imgui.new.int(ini.set.fontflag)
local imgui_iconsize = imgui.new.int(ini.set.iconsize)
local alignment = imgui.new.int(ini.set.alignment)
local item_list = {"Left", "Middle", "Right"}
local ImItems = imgui.new['const char*'][#item_list](item_list)
local textures = {}
local font = renderCreateFont(ini.set.fontname, ini.set.fontsize, ini.set.fontflag)

function get_killList()
    local kill = ffi.cast("struct kill_list_information*", sampGetKillInfoPtr())
    local kill_list_entries = {}

    for i = 0, 4 do
        local entry = kill.entries[i]
        local killer_name = ffi.string(entry.killer)
        local victim_name = ffi.string(entry.victim)

        if killer_name ~= "" and victim_name ~= "" and entry.weapon_id >= 0 and entry.weapon_id <= 225 then          
            local new_entry = {
                killer = string.format("{%06X}%s", entry.killer_color, killer_name),
                victim = string.format("{%06X}%s", entry.victim_color, victim_name),
                weapon = entry.weapon_id
            }
            table.insert(kill_list_entries, new_entry)
        end
    end
    return kill_list_entries
end

function sampev.onPlayerDeathNotification(killerId, killedId, reason)
    if ini.set.showid then
        local kill = ffi.cast("struct kill_list_information*", sampGetKillInfoPtr())
        local _, myid = sampGetPlayerIdByCharHandle(playerPed)

        local n_killer = ( sampIsPlayerConnected(killerId) or killerId == myid ) and sampGetPlayerNickname(killerId) or nil
        local n_killed = ( sampIsPlayerConnected(killedId) or killedId == myid ) and sampGetPlayerNickname(killedId) or nil
        lua_thread.create(function()
            wait(0)
            if n_killer then kill.entries[4].killer = ffi.new('char[25]', ( n_killer .. '[' .. killerId .. ']' ):sub(1, 24) ) end
            if n_killed then kill.entries[4].victim = ffi.new('char[25]', ( n_killed .. '[' .. killedId .. ']' ):sub(1, 24) ) end
        end)
    end
end

function d3dxfont_create(name, height, charset)
    charset = charset or 1
    local d3ddev = ffi.cast('void*', getD3DDevicePtr())
    local pfont = ffi.new('ID3DXFont*[1]', {nil})
    if tonumber(d3dx9_43.D3DXCreateFontA(d3ddev, height, 0, 0, 1, false, charset, 0, 4, 0, name, pfont)) < 0 then
        return nil
    end
    return pfont[0]
end

function d3dxfont_draw(font, text, rect, color, format)
    local prect = ffi.new('RECT[1]', {{rect[1], rect[2], rect[3], rect[4]}})
    return font.vtbl.DrawTextA(font, nil, text, -1, prect, format, color)
end

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

    sampAddChatMessage("{8742f5}[killList]{FFFFFF} Скрипт загружен. Команда: {8742f5}/klist | {FFFFFF}Автор: {8742f5}perchik.", 0xFFFFFF)

    sampRegisterChatCommand("klist", function()
        window[0] = not window[0]
    end)

    font_gtaweapon3 = d3dxfont_create('gtaweapon3', 20, 2)
    fonts_loaded = true

    setStructElement(sampGetKillInfoPtr(), 0, 4, 0)
    wait(-1)
end

function onD3DPresent()
    if fonts_loaded then
        local sw, sh = getScreenResolution()
        local killList = get_killList()
        local x, y, size = ini.set.x, ini.set.y, 20
        for i = 1, math.min(#killList, 5) do
            if alignment[0] == 0 then
                local lformat = string.format("%s {FFFFFF}» %s", killList[i]["killer"], killList[i]["victim"])
                d3dxfont_draw(font_gtaweapon3, string.char(RenderGun[killList[i]["weapon"]]), {x, y, sw, sh}, 0xFFFFFFFF, 0x10)
                renderFontDrawText(font, lformat, x, y, -1)
            elseif alignment[0] == 1 then
                local mkiller = string.format("%s", killList[i]["killer"])
                local mvictim = string.format("%s", killList[i]["victim"])
                renderFontDrawText(font, mkiller, x - renderGetFontDrawTextLength(font, mkiller), y, -1)
                d3dxfont_draw(font_gtaweapon3, string.char(RenderGun[killList[i]["weapon"]]), {x, y, sw, sh}, 0xFFFFFFFF, 0x10)
                renderFontDrawText(font, mvictim, x + 6 + size, y, -1)
            elseif alignment[0] == 2 then
                local rformat = string.format("%s {FFFFFF}» %s", killList[i]["killer"], killList[i]["victim"])
                renderFontDrawText(font, rformat, x - renderGetFontDrawTextLength(font, rformat), y, -1)
                d3dxfont_draw(font_gtaweapon3, string.char(RenderGun[killList[i]["weapon"]]), {x - 5, y, sw, sh}, 0xFFFFFFFF, 0x10)
            end
            y = y + size
        end
    end
end

imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil
    theme()
end)

imgui.OnFrame(function() return window[0] end, function(player)
    local sw, sh = getScreenResolution()
    imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.Always, imgui.ImVec2(0.5, 0.5))
    imgui.Begin("killList", window, imgui.WindowFlags.NoCollapse + imgui.WindowFlags.AlwaysAutoResize)

    imgui.PushItemWidth(150)

    if imgui.Checkbox("ShowId", imgui_showid) then
        ini.set.showid = not ini.set.showid
        inicfg.save(ini,"killList")
    end

    if imgui.Combo("Alignment", alignment, ImItems, #item_list) then
        ini.set.alignment = alignment[0]
        inicfg.save(ini, "killList")
    end

    if imgui.InputText("FontName", imgui_fontname, 128) then
        ini.set.fontname = ffi.string(imgui_fontname)
        font = renderCreateFont(ini.set.fontname, ini.set.fontsize, ini.set.fontflag)
        inicfg.save(ini,"killList")
    end

    if imgui.InputInt("FontSize", imgui_fontsize) then
        ini.set.fontsize = imgui_fontsize[0]
        font = renderCreateFont(ini.set.fontname, ini.set.fontsize, ini.set.fontflag)
        inicfg.save(ini, "killList")
    end

    if imgui.InputInt("FontFlag", imgui_fontflag) then
        ini.set.fontflag = imgui_fontflag[0]
        font = renderCreateFont(ini.set.fontname, ini.set.fontsize, ini.set.fontflag)
        inicfg.save(ini, "killList")
    end

    if imgui.InputInt("IconSize", imgui_iconsize) then
        ini.set.iconsize = imgui_iconsize[0]
        inicfg.save(ini, "killList")
    end

    if imgui.Button("Change Position", imgui.ImVec2(150, 20)) then
        sampAddChatMessage("{8742f5}[killList]{FFFFFF} Выберите позицию, затем нажмите ЛКМ.", 0xFFFFFF)
        lua_thread.create(function()
            window[0] = false
            while not isKeyJustPressed(1) do wait(0)
                sampSetCursorMode(4)
                ini.set.x, ini.set.y = getCursorPos()
            end
            window[0] = true
            sampSetCursorMode(0)
            inicfg.save(ini, "killList")
        end)
    end

    imgui.PopItemWidth()
    imgui.End()
end)

function theme()
    imgui.GetStyle().WindowTitleAlign = imgui.ImVec2(0.5, 0.5)
    imgui.GetStyle().Colors[imgui.Col.FrameBg] = imgui.ImVec4(0.12, 0.12, 0.12, 1.00)
    imgui.GetStyle().Colors[imgui.Col.FrameBgHovered] = imgui.ImVec4(0.25, 0.25, 0.26, 1.00)
    imgui.GetStyle().Colors[imgui.Col.FrameBgActive] = imgui.ImVec4(0.25, 0.25, 0.26, 1.00)
    imgui.GetStyle().Colors[imgui.Col.Button] = imgui.ImVec4(0.12, 0.12, 0.12, 1.00)
    imgui.GetStyle().Colors[imgui.Col.ButtonHovered] = imgui.ImVec4(0.21, 0.20, 0.20, 1.00)
    imgui.GetStyle().Colors[imgui.Col.ButtonActive] = imgui.ImVec4(0.41, 0.41, 0.41, 1.00)
    imgui.GetStyle().Colors[imgui.Col.TitleBgActive] = imgui.ImVec4(0.12, 0.12, 0.12, 1.00)
    imgui.GetStyle().Colors[imgui.Col.Border] = imgui.ImVec4(0.25, 0.25, 0.26, 0.54)
    imgui.GetStyle().Colors[imgui.Col.BorderShadow] = imgui.ImVec4(0.00, 0.00, 0.00, 0.00)
    imgui.GetStyle().Colors[imgui.Col.TextSelectedBg] = imgui.ImVec4(0.25, 0.25, 0.26, 0.54)
    imgui.GetStyle().Colors[imgui.Col.CheckMark] = imgui.ImVec4(1.00, 1.00, 1.00, 1.00)
    imgui.GetStyle().Colors[imgui.Col.Header] = imgui.ImVec4(0.12, 0.12, 0.12, 1.00)
    imgui.GetStyle().Colors[imgui.Col.HeaderHovered] = imgui.ImVec4(0.20, 0.20, 0.20, 1.00)
    imgui.GetStyle().Colors[imgui.Col.HeaderActive] = imgui.ImVec4(0.47, 0.47, 0.47, 1.00)
end
Возможно из-за того, что не очищаешь ничего при Device Lost, попробуй добавить это после onD3DPresent
Lua:
-- в onD3DPresent в проверку добавь ' and not d3dlost '
function onD3DDeviceLost()
    d3dlost = true
    if fonts_loaded then
        fonts_loaded = false
        font_gtaweapon3.Release()
        font_gtaweapon3 = nil
    end
end

function onD3DDeviceReset()
    if d3dlost and not fonts_loaded then
        font_gtaweapon3 = d3dxfont_create('gtaweapon3', 20, 2)
        fonts_loaded = true
    end
    d3dlost = false
end

Вот я сворачиваю разворачиваю и всё ок.

1692262670889.png
 
Последнее редактирование:

auf.exe

Участник
37
12
Lua:
local imgui = require('imgui')
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
       
local window = imgui.ImBool(false)

local inicfg = require 'inicfg'
local directIni = 'test.ini'

local saveInputText = {
    {''}
}
tabl = {}
 
local inputs = inicfg.load(saveInputText, directIni)

function main()
    while not isSampAvailable() do wait(200) end
    imgui.Process = false
    window.v = true
   
    for i, value in ipairs(inputs) do
        table.insert(tabl, {imgui.ImBuffer(u8:decode(value[1]), 256)})
    end
    while true do
        wait(0)
        imgui.Process = window.v
    end
end
       
function imgui.OnDrawFrame()
    if window.v then
        local resX, resY = getScreenResolution()
        local sizeX, sizeY = 300, 300 -- WINDOW SIZE
        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('Window Title', window)
        if imgui.Button('add') then
            table.insert(tabl, {imgui.ImBuffer(256)})
            table.insert(inputs, {#inputs})
        end
        for i, value in ipairs(tabl) do
            imgui.InputText('##'..i, value[1])
            imgui.SameLine()
            if imgui.Button('delete##'..i) then
                table.remove(tabl, i)
                table.remove(inputs, i)
            end
        end
        if imgui.Button('save') then
            for i, value in ipairs(tabl) do
                inputs[i][1] = value[1].v
            end
            inicfg.save(inputs, directIni)
        end
        imgui.End()
    end
end
image.png
Можешь пожалуйста обяснить как работает, я сам нихуя не вдупляю
 

NotFound

Участник
74
22
Можешь пожалуйста обяснить как работает, я сам нихуя не вдупляю
В теории могу ошибаться, но примерно так это работает
Lua:
local imgui = require('imgui')
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
       
local window = imgui.ImBool(false)

local inicfg = require 'inicfg'
local directIni = 'test.ini'

local saveInputText = { -- Шаблон таблицы для ini
    {''}
}
tabl = {} -- Таблица для ввода текста
 
local inputs = inicfg.load(saveInputText, directIni) -- загружаем из ini файла таблицу. Можно было без шаблона local inputs = inicfg.load({{''}}, directIni)

function main()
    while not isSampAvailable() do wait(200) end
    imgui.Process = false
    window.v = true
    for i, value in ipairs(inputs) do
        table.insert(tabl, {imgui.ImBuffer(u8:decode(value[1]), 256)}) --Добавляем в таблицу tabl значения из inputs, но с имгуишным типом данных
    end
    while true do
        wait(0)
        imgui.Process = window.v
    end
end
       
function imgui.OnDrawFrame()
    if window.v then
        local resX, resY = getScreenResolution()
        local sizeX, sizeY = 300, 300 -- WINDOW SIZE
        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('Window Title', window)
        if imgui.Button('add') then
            table.insert(tabl, {imgui.ImBuffer(256)}) -- при нажатии на кнопку в таблицу tabl добавиться элемент с имгуи текстом
            table.insert(inputs, {#inputs}) -- В таблице inputs добавиться раздел с индексом длины массива
        end
        for i, value in ipairs(tabl) do
            imgui.InputText('##'..i, value[1]) -- выводим все элементы из таблицы tabl
            imgui.SameLine()
            if imgui.Button('delete##'..i) then -- напротив ставим кнопку для удаления элементов
                table.remove(tabl, i) -- при нажатии удалится элемент из таблицы tabl с индексом i (Если нажать на 4ю по порядку кнопку, то удалиться 4й элемент в tabl)
                table.remove(inputs, i) -- удалиться раздел с индексом i
            end
        end
        if imgui.Button('save') then -- Кнопка для сохранения данных таблицы из tabl
            for i, value in ipairs(tabl) do
                inputs[i][1] = value[1].v -- записываем уже в готовые разделы таблицы inputs данные из таблицы tabl
            end
            inicfg.save(inputs, directIni) -- Сохраняем все изменения в таблице inputs
        end
        imgui.End()
    end
end
Сохранять изменения лучше автоматически. Либо сразу при изменении, либо при завершении работы скрипта
При завершении работы скрипта:
function onScriptTerminate(script)
    if script == thisScript() then
         for i, value in ipairs(tabl) do
             inputs[i][1] = value[1].v
         end
         inicfg.save(inputs, directIni)
    end
end
 

moodduck

Участник
6
3
Возникла такая проблема. Мне нужно вводить команду, получать данные из диалога, после закрывать его. Проблема возникает в том, что это необходимо делать часто и при показе диалога персонаж останавливается, думал как-то его скрывать(return false) но, он просто его скрывает, а не закрывает. Вопрос, кто-то знает, как сделать так, чтобы этого диалога не было видно, но при этом он должен закрываться?
 

why ega

РП игрок
Модератор
2,548
2,241
Возникла такая проблема. Мне нужно вводить команду, получать данные из диалога, после закрывать его. Проблема возникает в том, что это необходимо делать часто и при показе диалога персонаж останавливается, думал как-то его скрывать(return false) но, он просто его скрывает, а не закрывает. Вопрос, кто-то знает, как сделать так, чтобы этого диалога не было видно, но при этом он должен закрываться?
вот пример кода:
Lua:
local sampev = require("samp.events")


function sampev.onShowDialog(dialogId, style, title, button1, button2, text)
    if (dialogId == 228) then -- выдуманный диалог
        sampSendDialogResponse(dialogId, 1, 0, "") -- закроет диалог с айди 228, нажав на левую кнопку, с первой строкой и пустым полем ввода
        return false
    end
end