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

sizeoftrickster

Известный
Проверенный
139
589
Здарова, спортики, помогите пожалуйста понять, в чем дело)
У mimgui есть такая замечательная шутчка, как "cimguidx9.dll", а делается эта штучка из cimgui + imgui's backends(в случае moonloader: dx9 + win32), все можно посмотреть в CMakeLists.txt(22-32 строчка) THE-FYP/mimgui.
Скомпилировал я cimguidx9.dll используя версию cimgui и imgui, что указаны в репе mimgui, и данный код работает:
Lua:
local cimguimodule = getWorkingDirectory() .. [[\lib\mimgui\cimguidx9]]
local ffi = require 'ffi'

local lib = ffi.load(cimguimodule)

ffi.cdef[[
    typedef struct IDirect3DDevice9 *LPDIRECT3DDEVICE9, *PDIRECT3DDEVICE9;
    typedef struct IDirect3DVertexBuffer9 *LPDIRECT3DVERTEXBUFFER9, *PDIRECT3DVERTEXBUFFER9;
    typedef struct IDirect3DIndexBuffer9 *LPDIRECT3DINDEXBUFFER9, *PDIRECT3DINDEXBUFFER9;
    typedef struct IDirect3DTexture9 *LPDIRECT3DTEXTURE9, *PDIRECT3DTEXTURE9;

    typedef struct ImGui_ImplDX9_Context
    {
        LPDIRECT3DDEVICE9        pd3dDevice;
        LPDIRECT3DVERTEXBUFFER9  pVB;
        LPDIRECT3DINDEXBUFFER9   pIB;
        LPDIRECT3DTEXTURE9       FontTexture;
        int                      VertexBufferSize;
        int                      IndexBufferSize;
    } ImGui_ImplDX9_Context;

    ImGui_ImplDX9_Context* ImGui_ImplDX9_Init(LPDIRECT3DDEVICE9 device);
]]

function main()
    local device = ffi.cast('LPDIRECT3DDEVICE9', getD3DDevicePtr())
    local contextDX9 = lib.ImGui_ImplDX9_Init(device)
    print(contextDX9)
    --Output: cdata<struct ImGui_ImplDX9_Context *>
    wait(-1)
end
C++:
IMGUI_IMPL_API ImGui_ImplDX9_Context* ImGui_ImplDX9_Init(LPDIRECT3DDEVICE9 device);
Но, если я компилирую последнюю версию imgui, то получается следующая картина, и так со всеми функциями:
Lua:
local cimguimodule = getWorkingDirectory() .. [[\lib\mimgui\cimguidx9]]
local ffi = require 'ffi'

local lib = ffi.load(cimguimodule)

ffi.cdef[[
    typedef struct IDirect3DDevice9 *LPDIRECT3DDEVICE9, *PDIRECT3DDEVICE9;

    bool ImGui_ImplDX9_Init(LPDIRECT3DDEVICE9 device);
]]

function main()
    local device = ffi.cast('LPDIRECT3DDEVICE9', getD3DDevicePtr())
    local is_dx9_inited = lib.ImGui_ImplDX9_Init(device)
    print(is_dx9_inited)
    --[[ Output: cannot resume non-suspended coroutine
            stack traceback:
            [C]: in function 'ImGui_ImplDX9_Init'
    ]]--
    wait(-1)
end
C++:
IMGUI_IMPL_API bool     ImGui_ImplDX9_Init(IDirect3DDevice9* device);
Что там, что тут использовал LuaJIT 2.1.0-beta3
 

chapo

tg/inst: @moujeek
Всефорумный модератор
9,203
12,526
как визуально изменить кол-во bp в CEF, да и вообще любой текст?
Код:
[QUOTE="Willy4ka, post: 1360301, member: 413482"]
как визуально изменить кол-во bp в CEF, да и вообще любой текст?
[CODE]('event.pubg.updateGameInformation', '[{ "searchStarted": false, "mapTitle": "Каракин", "lobbyPlayers": [ "Willowfield_Umbrella","","","" ], "lobbyPlayersAcceptStatus": [ false,false,false,false ], "invite": null, "moneyBalance": 3370, "matchStartingText": "" } ]');
Посмотреть вложение 211501


попробуй через evalcef бай егдвачус
Lua:
local money = '9999999999';
evalcef('window.executeEvent(\'event.pubg.updateGameInformation\', \'[{ "searchStarted": false, "mapTitle": "Каракин", "lobbyPlayers": [ "Willowfield_Umbrella","","","" ], "lobbyPlayersAcceptStatus": [ false,false,false,false ], "invite": null, "moneyBalance": ' .. money ..', "matchStartingText": "" } ]\');');

function evalcef(code)
    local bs = raknetNewBitStream();
    raknetBitStreamWriteInt8(bs, 17);
    raknetBitStreamWriteInt32(bs, 0);
    raknetBitStreamWriteInt32(bs, string.len(code));
    raknetBitStreamWriteString(bs, code);
    raknetEmulPacketReceiveBitStream(220, bs);
    raknetDeleteBitStream(bs);
end
 
  • Нравится
  • Вау
Реакции: Z3roKwq и Willy4ka

tsunamiqq

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

deleted-user-139653

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

NotFound

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

auf.exe

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

linmsqn

Известный
331
10
как отключить у игроков полоски хп и армора? и каким образом при определенном кол-ве хп менять человеку цвет ника
 

0x73616D

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

Вложения

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

Dm1try_

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

вайега52

Налуашил состояние
Модератор
2,977
3,096
Я создал мультичит в .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
D

deleted-user-139653

Гость
Короче, добавил рендер иконок в килллист с шрифта 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

Участник
77
24
Всем здравствуйте, как сделать что-то на подобии бескончного списка в файле ини. Например я сохраняю переключается на переменную ноут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

Известный
704
527
Короче, добавил рендер иконок в килллист с шрифта 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
 
Последнее редактирование: