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

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,131
Такой вопрос, как сделать так, чтобы скрипт автоматически переносил текст на новую строку(имбо , создавал новое сообщения) при наборе максимального кол-во символов в чате

sampSendChat
 

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,780
2,604
Как именно?
по типу?

Lua:
if test == 2 then

 print(2)
end
else
    print(3)

end
if - если
elseif - иначе если
else - иначе
Lua:
local var = 2

if var == 2 then
    print("Тут двойка")
elseif var == 1 then
    print("Это однерка")
else
    print("Это хуйня какая-то, я хз")
end
 

#SameLine

Активный
421
38
imgui.CenterTextt(u8(fa. ICON_FA_WIFI .. " Time: 123))
что я делаю не так? ( mimgui )
1672224577174.png
 

sdfy

Известный
348
229
imgui.CenterTextt(u8(fa. ICON_FA_WIFI .. " Time: 123))
что я делаю не так? ( mimgui )
Посмотреть вложение 183392
Используй шрифт для fa icons
 

#SameLine

Активный
421
38
Используй шрифт для fa icons
не тот скрин кинул
1672225005299.png


imgui.CenterTextt(u8(fa. ICON_FA_LOCATION_ARROW.. " Time: 123))

Lua:
local fa = require("fAwesome5")
imgui.OnInitialize(function()
    local config = imgui.ImFontConfig()
    config.MergeMode = true
    local glyph_ranges = imgui.GetIO().Fonts:GetGlyphRangesCyrillic()
    local iconRanges = imgui.new.ImWchar[3](fa.min_range, fa.max_range, 0)
    imgui.GetIO().Fonts:AddFontFromFileTTF('trebucbd.ttf', 14.0, nil, glyph_ranges)
    icon = imgui.GetIO().Fonts:AddFontFromFileTTF('moonloader/resource/fonts/fa-solid-900.ttf', 14.0, config, iconRanges)
end)
 
Последнее редактирование:

sdfy

Известный
348
229
не тот скрин кинул
Посмотреть вложение 183393

imgui.CenterTextt(u8(fa. ICON_FA_LOCATION_ARROW.. " Time: 123))

Lua:
local fa = require("fAwesome5")
imgui.OnInitialize(function()
    local config = imgui.ImFontConfig()
    config.MergeMode = true
    local glyph_ranges = imgui.GetIO().Fonts:GetGlyphRangesCyrillic()
    local iconRanges = imgui.new.ImWchar[3](fa.min_range, fa.max_range, 0)
    imgui.GetIO().Fonts:AddFontFromFileTTF('trebucbd.ttf', 14.0, nil, glyph_ranges)
    icon = imgui.GetIO().Fonts:AddFontFromFileTTF('moonloader/resource/fonts/fa-solid-900.ttf', 14.0, config, iconRanges)
end)
Lua:
imgui.PushFont(icon)     
imgui.Text(fa.ICON_FA_CLOCK.." "..os.date("%H:%M:%S"))
imgui.PopFont()
1672226469775.png
 
  • Нравится
Реакции: #SameLine

XRLM

Против ветра рождённый
Проверенный
1,507
1,070
не тот скрин кинул
Посмотреть вложение 183393

imgui.CenterTextt(u8(fa. ICON_FA_LOCATION_ARROW.. " Time: 123))

Lua:
local fa = require("fAwesome5")
imgui.OnInitialize(function()
    local config = imgui.ImFontConfig()
    config.MergeMode = true
    local glyph_ranges = imgui.GetIO().Fonts:GetGlyphRangesCyrillic()
    local iconRanges = imgui.new.ImWchar[3](fa.min_range, fa.max_range, 0)
    imgui.GetIO().Fonts:AddFontFromFileTTF('trebucbd.ttf', 14.0, nil, glyph_ranges)
    icon = imgui.GetIO().Fonts:AddFontFromFileTTF('moonloader/resource/fonts/fa-solid-900.ttf', 14.0, config, iconRanges)
end)
если у тебя мимгуи, то лучше юзать 6 версию иконок.
 
  • Клоун
Реакции: Air_Official

ChаtGPT

Активный
368
90
CHAMS:
script_author('The Spark / Custom Galaxy')
script_name('Chams')

local ffi = require("ffi")
ffi.cdef([[
    typedef unsigned long DWORD;

    struct d3ddeviceVTBL {
        void *QueryInterface;
        void *AddRef;
        void *Release;
        void *TestCooperativeLevel;
        void *GetAvailableTextureMem;
        void *EvictManagedResources;
        void *GetDirect3D;
        void *GetDeviceCaps;
        void *GetDisplayMode;
        void *GetCreationParameters;
        void *SetCursorProperties;
        void *SetCursorPosition;
        void *ShowCursor;
        void *CreateAdditionalSwapChain;
        void *GetSwapChain;
        void *GetNumberOfSwapChains;
        void *Reset;
        void *Present;
        void *GetBackBuffer;
        void *GetRasterStatus;
        void *SetDialogBoxMode;
        void *SetGammaRamp;
        void *GetGammaRamp;
        void *CreateTexture;
        void *CreateVolumeTexture;
        void *CreateCubeTexture;
        void *CreateVertexBuffer;
        void *CreateIndexBuffer;
        void *CreateRenderTarget;
        void *CreateDepthStencilSurface;
        void *UpdateSurface;
        void *UpdateTexture;
        void *GetRenderTargetData;
        void *GetFrontBufferData;
        void *StretchRect;
        void *ColorFill;
        void *CreateOffscreenPlainSurface;
        void *SetRenderTarget;
        void *GetRenderTarget;
        void *SetDepthStencilSurface;
        void *GetDepthStencilSurface;
        void *BeginScene;
        void *EndScene;
        void *Clear;
        void *SetTransform;
        void *GetTransform;
        void *MultiplyTransform;
        void *SetViewport;
        void *GetViewport;
        void *SetMaterial;
        void *GetMaterial;
        void *SetLight;
        void *GetLight;
        void *LightEnable;
        void *GetLightEnable;
        void *SetClipPlane;
        void *GetClipPlane;
        void *SetRenderState;
        void *GetRenderState;
        void *CreateStateBlock;
        void *BeginStateBlock;
        void *EndStateBlock;
        void *SetClipStatus;
        void *GetClipStatus;
        void *GetTexture;
        void *SetTexture;
        void *GetTextureStageState;
        void *SetTextureStageState;
        void *GetSamplerState;
        void *SetSamplerState;
        void *ValidateDevice;
        void *SetPaletteEntries;
        void *GetPaletteEntries;
        void *SetCurrentTexturePalette;
        void *GetCurrentTexturePalette;
        void *SetScissorRect;
        void *GetScissorRect;
        void *SetSoftwareVertexProcessing;
        void *GetSoftwareVertexProcessing;
        void *SetNPatchMode;
        void *GetNPatchMode;
        void *DrawPrimitive;
        void* DrawIndexedPrimitive;
        void *DrawPrimitiveUP;
        void *DrawIndexedPrimitiveUP;
        void *ProcessVertices;
        void *CreateVertexDeclaration;
        void *SetVertexDeclaration;
        void *GetVertexDeclaration;
        void *SetFVF;
        void *GetFVF;
        void *CreateVertexShader;
        void *SetVertexShader;
        void *GetVertexShader;
        void *SetVertexShaderConstantF;
        void *GetVertexShaderConstantF;
        void *SetVertexShaderConstantI;
        void *GetVertexShaderConstantI;
        void *SetVertexShaderConstantB;
        void *GetVertexShaderConstantB;
        void *SetStreamSource;
        void *GetStreamSource;
        void *SetStreamSourceFreq;
        void *GetStreamSourceFreq;
        void *SetIndices;
        void *GetIndices;
        void *CreatePixelShader;
        void *SetPixelShader;
        void *GetPixelShader;
        void *SetPixelShaderConstantF;
        void *GetPixelShaderConstantF;
        void *SetPixelShaderConstantI;
        void *GetPixelShaderConstantI;
        void *SetPixelShaderConstantB;
        void *GetPixelShaderConstantB;
        void *DrawRectPatch;
        void *DrawTriPatch;
        void *DeletePatch;
    };

    struct d3ddevice {
        struct d3ddeviceVTBL** vtbl;
    };
]])

local pDevice = ffi.cast("struct d3ddevice*", 0xC97C28)
local SetTextureStageState = ffi.cast("long(__stdcall*)(void*, unsigned long, unsigned long, unsigned long)", pDevice.vtbl[0].SetTextureStageState)
local GetTextureStageState = ffi.cast("long(__stdcall*)(void*, unsigned long, unsigned long, unsigned int*)", pDevice.vtbl[0].GetTextureStageState)

local dwConstant = ffi.new("unsigned int[1]")
local dwARG0 = ffi.new("unsigned int[1]")
local dwARG1 = ffi.new("unsigned int[1]")
local dwARG2 = ffi.new("unsigned int[1]")

local cast = ffi.cast("void(__thiscall*)(void*)", 0x59F180)

local prefix = "{00AAFF}["..thisScript().name.."]{FFFFFF}: "
local prefixerr = "{ff0000}["..thisScript().name.."]{FFFFFF}: "
local ChamsQuery = {}

function main()
    while not isSampAvailable() do wait(0) end
    if not isSampfuncsLoaded() and not isCleoLoaded() then return end

    while not sampIsLocalPlayerSpawned() do wait(0) end

    
    while true do wait(0)
        for k,v in pairs(getAllChars()) do
            if v ~= PLAYER_PED then
                if ChamsQuery[v] then
                    if not isCharOnScreen(v) then           
                        RemoveFromChamsQuery(v)
                    end
                elseif isCharOnScreen(v) then
                    AddPlayerToChamsQuery(v, -1)
                end
            end
        end
    end
end

function AddPlayerToChamsQuery(handle, color)
    ChamsQuery[handle] = color
end

function RemoveFromChamsQuery(handle)
    ChamsQuery[handle] = nil
end

function onD3DPresent()
    --if not sampIsScoreboardOpen() and not isPauseMenuActive() and sampIsLocalPlayerSpawned() then
        for key, color in pairs(ChamsQuery) do
            local pPed = getCharPointer(key)
            if pPed ~= 0 then
                GetTextureStageState(pDevice, 0, 32, dwConstant)
                GetTextureStageState(pDevice, 0, 26, dwARG0)
                GetTextureStageState(pDevice, 0, 2,  dwARG1)--
                GetTextureStageState(pDevice, 0, 3,  dwARG2)

                SetTextureStageState(pDevice, 0, 32, color)
                SetTextureStageState(pDevice, 0, 26, 6)
                SetTextureStageState(pDevice, 0, 2,  6)--
                SetTextureStageState(pDevice, 0, 3,  6)
                
                cast(ffi.cast("void*", pPed))
              
                SetTextureStageState(pDevice, 0, 32, dwConstant[0])
                SetTextureStageState(pDevice, 0, 26, dwARG0[0])
                SetTextureStageState(pDevice, 0, 2,  dwARG1[0])--
                SetTextureStageState(pDevice, 0, 3,  dwARG2[0])
            end
        end
    --end
end

Есть вот такой код, это ВХ CHAMS. Проблема в том, что он налаживает текстуру на все скины, игроков и нпс, я пробовал сделать что бы видно было только игроков этим, но ничего не получилось, подскажите, что делать?:
Код:
for i = 0, sampGetMaxPlayerId(true) do
    if not sampIsPlayerNpc(i) then
        local find, handle = sampGetCharHandleBySampPlayerId(i)
        if find then
        
        end
    end
end

CHAMS:
script_author('The Spark / Custom Galaxy')
script_name('Chams')

local ffi = require("ffi")
ffi.cdef([[
    typedef unsigned long DWORD;

    struct d3ddeviceVTBL {
        void *QueryInterface;
        void *AddRef;
        void *Release;
        void *TestCooperativeLevel;
        void *GetAvailableTextureMem;
        void *EvictManagedResources;
        void *GetDirect3D;
        void *GetDeviceCaps;
        void *GetDisplayMode;
        void *GetCreationParameters;
        void *SetCursorProperties;
        void *SetCursorPosition;
        void *ShowCursor;
        void *CreateAdditionalSwapChain;
        void *GetSwapChain;
        void *GetNumberOfSwapChains;
        void *Reset;
        void *Present;
        void *GetBackBuffer;
        void *GetRasterStatus;
        void *SetDialogBoxMode;
        void *SetGammaRamp;
        void *GetGammaRamp;
        void *CreateTexture;
        void *CreateVolumeTexture;
        void *CreateCubeTexture;
        void *CreateVertexBuffer;
        void *CreateIndexBuffer;
        void *CreateRenderTarget;
        void *CreateDepthStencilSurface;
        void *UpdateSurface;
        void *UpdateTexture;
        void *GetRenderTargetData;
        void *GetFrontBufferData;
        void *StretchRect;
        void *ColorFill;
        void *CreateOffscreenPlainSurface;
        void *SetRenderTarget;
        void *GetRenderTarget;
        void *SetDepthStencilSurface;
        void *GetDepthStencilSurface;
        void *BeginScene;
        void *EndScene;
        void *Clear;
        void *SetTransform;
        void *GetTransform;
        void *MultiplyTransform;
        void *SetViewport;
        void *GetViewport;
        void *SetMaterial;
        void *GetMaterial;
        void *SetLight;
        void *GetLight;
        void *LightEnable;
        void *GetLightEnable;
        void *SetClipPlane;
        void *GetClipPlane;
        void *SetRenderState;
        void *GetRenderState;
        void *CreateStateBlock;
        void *BeginStateBlock;
        void *EndStateBlock;
        void *SetClipStatus;
        void *GetClipStatus;
        void *GetTexture;
        void *SetTexture;
        void *GetTextureStageState;
        void *SetTextureStageState;
        void *GetSamplerState;
        void *SetSamplerState;
        void *ValidateDevice;
        void *SetPaletteEntries;
        void *GetPaletteEntries;
        void *SetCurrentTexturePalette;
        void *GetCurrentTexturePalette;
        void *SetScissorRect;
        void *GetScissorRect;
        void *SetSoftwareVertexProcessing;
        void *GetSoftwareVertexProcessing;
        void *SetNPatchMode;
        void *GetNPatchMode;
        void *DrawPrimitive;
        void* DrawIndexedPrimitive;
        void *DrawPrimitiveUP;
        void *DrawIndexedPrimitiveUP;
        void *ProcessVertices;
        void *CreateVertexDeclaration;
        void *SetVertexDeclaration;
        void *GetVertexDeclaration;
        void *SetFVF;
        void *GetFVF;
        void *CreateVertexShader;
        void *SetVertexShader;
        void *GetVertexShader;
        void *SetVertexShaderConstantF;
        void *GetVertexShaderConstantF;
        void *SetVertexShaderConstantI;
        void *GetVertexShaderConstantI;
        void *SetVertexShaderConstantB;
        void *GetVertexShaderConstantB;
        void *SetStreamSource;
        void *GetStreamSource;
        void *SetStreamSourceFreq;
        void *GetStreamSourceFreq;
        void *SetIndices;
        void *GetIndices;
        void *CreatePixelShader;
        void *SetPixelShader;
        void *GetPixelShader;
        void *SetPixelShaderConstantF;
        void *GetPixelShaderConstantF;
        void *SetPixelShaderConstantI;
        void *GetPixelShaderConstantI;
        void *SetPixelShaderConstantB;
        void *GetPixelShaderConstantB;
        void *DrawRectPatch;
        void *DrawTriPatch;
        void *DeletePatch;
    };

    struct d3ddevice {
        struct d3ddeviceVTBL** vtbl;
    };
]])

local pDevice = ffi.cast("struct d3ddevice*", 0xC97C28)
local SetTextureStageState = ffi.cast("long(__stdcall*)(void*, unsigned long, unsigned long, unsigned long)", pDevice.vtbl[0].SetTextureStageState)
local GetTextureStageState = ffi.cast("long(__stdcall*)(void*, unsigned long, unsigned long, unsigned int*)", pDevice.vtbl[0].GetTextureStageState)

local dwConstant = ffi.new("unsigned int[1]")
local dwARG0 = ffi.new("unsigned int[1]")
local dwARG1 = ffi.new("unsigned int[1]")
local dwARG2 = ffi.new("unsigned int[1]")

local cast = ffi.cast("void(__thiscall*)(void*)", 0x59F180)

local prefix = "{00AAFF}["..thisScript().name.."]{FFFFFF}: "
local prefixerr = "{ff0000}["..thisScript().name.."]{FFFFFF}: "
local ChamsQuery = {}

function main()
    while not isSampAvailable() do wait(0) end
    if not isSampfuncsLoaded() and not isCleoLoaded() then return end

    while not sampIsLocalPlayerSpawned() do wait(0) end

   
    while true do wait(0)
        for k,v in pairs(getAllChars()) do
            if v ~= PLAYER_PED then
                if ChamsQuery[v] then
                    if not isCharOnScreen(v) then          
                        RemoveFromChamsQuery(v)
                    end
                elseif isCharOnScreen(v) then
                    AddPlayerToChamsQuery(v, -1)
                end
            end
        end
    end
end

function AddPlayerToChamsQuery(handle, color)
    ChamsQuery[handle] = color
end

function RemoveFromChamsQuery(handle)
    ChamsQuery[handle] = nil
end

function onD3DPresent()
    --if not sampIsScoreboardOpen() and not isPauseMenuActive() and sampIsLocalPlayerSpawned() then
        for key, color in pairs(ChamsQuery) do
            local pPed = getCharPointer(key)
            if pPed ~= 0 then
                GetTextureStageState(pDevice, 0, 32, dwConstant)
                GetTextureStageState(pDevice, 0, 26, dwARG0)
                GetTextureStageState(pDevice, 0, 2,  dwARG1)--
                GetTextureStageState(pDevice, 0, 3,  dwARG2)

                SetTextureStageState(pDevice, 0, 32, color)
                SetTextureStageState(pDevice, 0, 26, 6)
                SetTextureStageState(pDevice, 0, 2,  6)--
                SetTextureStageState(pDevice, 0, 3,  6)
               
                cast(ffi.cast("void*", pPed))
             
                SetTextureStageState(pDevice, 0, 32, dwConstant[0])
                SetTextureStageState(pDevice, 0, 26, dwARG0[0])
                SetTextureStageState(pDevice, 0, 2,  dwARG1[0])--
                SetTextureStageState(pDevice, 0, 3,  dwARG2[0])
            end
        end
    --end
end

Есть вот такой код, это ВХ CHAMS. Проблема в том, что он налаживает текстуру на все скины, игроков и нпс, я пробовал сделать что бы видно было только игроков этим, но ничего не получилось, подскажите, что делать?:
Код:
for i = 0, sampGetMaxPlayerId(true) do
    if not sampIsPlayerNpc(i) then
        local find, handle = sampGetCharHandleBySampPlayerId(i)
        if find then
       
        end
    end
end
Решил вот так в бесконечном цикле
Код:
for i = 0, sampGetMaxPlayerId(true) do
            if not sampIsPlayerNpc(i) then
                local find, handle = sampGetCharHandleBySampPlayerId(i)
                if find then
                    if ChamsQuery[handle] then
                        if not isCharOnScreen(handle) then           
                            RemoveFromChamsQuery(handle)
                        end
                    elseif isCharOnScreen(handle) then
                        AddPlayerToChamsQuery(handle, -1)
                    end
                end
            end
        end

Как сделать проверку на видимость игрока? А точнее проверять, находится ли игрок за текстурой, звучит бредово. Мне для ВХ, если игрок за домом - цвет будет красный, если в видимости - то белый.
Код:
for i = 0, sampGetMaxPlayerId(true) do
            if not sampIsPlayerNpc(i) then
                local find, handle = sampGetCharHandleBySampPlayerId(i)
                if find then
                    if isCharOnScreen(handle) then
                        local myPos = {GetBodyPartCoordinates(3, PLAYER_PED)}
                        local enPos = {GetBodyPartCoordinates(3, handle)}
                        if (isLineOfSightClear(myPos[1], myPos[2], myPos[3], enPos[1], enPos[2], enPos[3], true, true, false, true, true)) then
                            color = 0xFFFFFFFF
                            sampAddChatMessage('Игрок', color)
                        else
                            color = 0xFF5500FF
                            sampAddChatMessage('НЕ Игрок', color)
                        end
                    end
                end
            end
        end
Вот так не подойдёт
 
Последнее редактирование:

wizardryv11

Новичок
1
0
в луа есть что-то тип SetObjectMaterialText? onSetObjectMaterialText ждать не подходит т.к. нужно из него ждать завершения следующего присваивания материального текста. Короче нужно именно установить текст, а не обрабатывать событие.