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

kizn

q(≧▽≦q)
Всефорумный модератор
2,409
2,102
бл, я чет сделал, тип в чате пишет там что скрипт загружен и тд, но кмд нет тип
Lua:
script_name('FamilyHelper v 1.0')
script_author('Tsunami_Nakamura')
script_description('FamilyHelper v 1.0')
script_version('1.0')

require "lib.moonloader"
local imgui = require 'imgui'
local key = require 'vkeys'


function main()
  imgui.Process = true
end


function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(2000) end
    sampAddChatMessage('[FamHelper] ����� �������: Tsunami_Nakamura. ��������: Adam_Karleone [ARIZONA 10]', 0x00BFFF)
    sampAddChatMessage('[FamHelper] ���� �������? �� - lcn.maks', 0x00BFFF)
    sampAddChatMessage('[FamHelper] ��������� �������: /famh', 0x00BFFF)
    sampAddChatMessage('[FamHelper] ������ �� ���������? ������ � ��', 0x00BFFF)
    sampRegisterChatCommand('famh', function() main_window_state.v = not main_window_state.v end)
    while true do
            wait(0)
            if main_window_state.v then
                imgui.ShowCursor = true
      imgui.Process = true
    else
      imgui.Process = false
    end
            imgui.Process = main_window_state.v
    end
end

local main_window_state = imgui.ImBool(false)
function imgui.OnDrawFrame()
  if main_window_state.v then
    imgui.SetNextWindowSize(imgui.ImVec2(1000, 500), imgui.Cond.FirstUseEver)
    imgui.Begin('Family Helper by Nakamura', main_window_state, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse)

    if imgui.Button (u8"Основное меню", imgui.ImVec2(200,20)) then uu() menu[1] = true end
  end
end
где imgui.end()
 

HpP

Известный
368
119
Как получить высоту и ширину mimgui окна и записать их в переменную?
 

chapo

чопа сребдс // @moujeek
Модератор
8,940
11,706
Как использовать:
https://www.blast.hk/threads/13380/page-16#post-650507 ?
Код:
[ML] (error) chams.lua: ...AMP only asi loader\GTA San Andreas\moonloader\chams.lua:133: attempt to call global 'GetTextureStageState' (a nil value)
stack traceback:
    ...AMP only asi loader\GTA San Andreas\moonloader\chams.lua:133: in main chunk
[ML] (error) chams.lua: Script died due to an error. (115B1EC4)
 

wulfandr

Известный
636
260
Как использовать:
https://www.blast.hk/threads/13380/page-16#post-650507 ?
Код:
[ML] (error) chams.lua: ...AMP only asi loader\GTA San Andreas\moonloader\chams.lua:133: attempt to call global 'GetTextureStageState' (a nil value)
stack traceback:
    ...AMP only asi loader\GTA San Andreas\moonloader\chams.lua:133: in main chunk
[ML] (error) chams.lua: Script died due to an error. (115B1EC4)
так и используй как в примере. но удали с GetTextureStageState который вне функции находится. после ffi, он криво написал
 

chapo

чопа сребдс // @moujeek
Модератор
8,940
11,706
так и используй как в примере. но удали с GetTextureStageState который вне функции находится. после ffi, он криво написал
так у меня вообще сам не запускается (крашится после выбора разрешения)
Lua:
--local inicfg = require 'inicfg'

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;
    };
]])



ffi.cast("void(__thiscall*)(void*)", 0x59F180)(ffi.cast("void*", pPed)) -- pPed - указатель на педа

function main()
    AddPlayerToChamsQuery(PLAYER_PED, 0xFFAABB00)
    wait(-1)
end

local ChamsQuery = {
}

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

function RemoveFromChamsQuery(handle)
    ChamsQuery.remove(handle)
end

function onD3DPresent()
    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]")
    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)
        
            ffi.cast("void(__thiscall*)(void*)", 0x59F180)(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
 

wulfandr

Известный
636
260
так у меня вообще сам не запускается (крашится после выбора разрешения)
Lua:
--local inicfg = require 'inicfg'

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;
    };
]])



ffi.cast("void(__thiscall*)(void*)", 0x59F180)(ffi.cast("void*", pPed)) -- pPed - указатель на педа

function main()
    AddPlayerToChamsQuery(PLAYER_PED, 0xFFAABB00)
    wait(-1)
end

local ChamsQuery = {
}

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

function RemoveFromChamsQuery(handle)
    ChamsQuery.remove(handle)
end

function onD3DPresent()
    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]")
    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)
       
            ffi.cast("void(__thiscall*)(void*)", 0x59F180)(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
ffi.cast("void(__thiscall*)(void*)", 0x59F180)(ffi.cast("void*", pPed)) -- pPed - указатель на педа

это тоже убери вне функции
 

wulfandr

Известный
636
260
1615109201387.png


ну у тебя че то с либой значит

Lua:
local lffi, ffi = pcall(require, 'ffi') assert(lffi, 'not found lib 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;
    };
]])


function main()
    AddPlayerToChamsQuery(PLAYER_PED, 0xFFAABB00)
    wait(-1)
end

local ChamsQuery = {
}

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

function RemoveFromChamsQuery(handle)
    ChamsQuery.remove(handle)
end

function onD3DPresent()
    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]")
    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)
        
            ffi.cast("void(__thiscall*)(void*)", 0x59F180)(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
 

TheLeftExit

Участник
24
8
Мой скрипт (по команде выводит последние 20 строк чата департамента SRP) стабильно крашит игру через час-два после открытия. Возможно, связано с получением определённого количества сообщений, подходящих критериям (цвет). Лог мунлодера ничего интересного не показывает. Есть идеи, с чем может быть связано?

Lua:
require "lib.moonloader"
require "lib.sampfuncs"
require "vkeys"

local se = require "lib.samp.events"

local deps = {}
local maxlen = 20

function deps_append(s)
    --sampAddChatMessage(tostring(#deps), 0xAAAAAA)
    if (#deps < maxlen) then
        deps[#deps + 1] = s
    else
        for i = 2, maxlen do
            deps[i - 1] = deps[i]
        end
        deps[maxlen] = s
    end
end

function se.onServerMessage(color, text)
    if(color == -8224001) then
        deps_append(string.format("%s %s", os.date("[%H:%M:%S]"), text), 0xAAAAAA)
    end
    --sampAddChatMessage(tostring(color),0xAAAAAA)
end

function on_script_call(args)
    if(args == nil) then
        args = ""
    end
    local deps_text = "{FF8282}"
    local i = 1
    while(i < #deps + 1) do
        if(args == "" or deps[i]:find(args) ~= nil) then
            deps_text = deps_text .. deps[i] .. "\n"
        end
        i = i + 1
    end
    if(args == "") then
        sampShowDialog(6969, "Волна департамента", deps_text, "Ок", nil, DIALOG_STYLE_MSGBOX)
    else
        sampShowDialog(6969, "Волна департамента - "..args, deps_text, "Ок", nil, DIALOG_STYLE_MSGBOX)
    end
    --sampAddChatMessage(tostring(#deps).." "..tostring(i).." "..tostring(deps[1]),0xAAAAAA)
end

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("bdep",on_script_call)
end

Лог SF:
Код:
[10:23:04] SAMPFUNCS v5.5.0 rel.22 (SA-MP 0.3.7 R3-1) completely loaded!
[13:00:45] SAMPFUNCS v5.5.0 rel.22 (SA-MP 0.3.7 R3-1) caught an exception.
[13:00:45] Base address: 6B4E0000
[13:00:45] > Exception record:
[13:00:45] Exception at address: 6C7777D8, Flags: 00000000
[13:00:45] Module: D:\GTA San Andreas\lua51.dll (6C770000)
[13:00:45] Cause: EXCEPTION_ACCESS_VIOLATION
[13:00:45] Attempted to read from: 00000018
[13:00:45] > Exception context:
[13:00:45] EAX: 01A6DAE0    ESI: 01AC2B68
[13:00:45] EBX: 00000065    EDX: 00000000
[13:00:45] ECX: 00000000    EDI: 01AC2B68
[13:00:45] EBP: 0A6601C0    ESP: 0177F0A0
[13:00:45] DR0: 00000000    DR1: 00000000
[13:00:45] DR2: 00000000    DR3: 00000000
[13:00:45] DR6: 00000000    DR7: 00000000
[13:00:45] SegGs: 0000002B    SegFs: 00000053
[13:00:45] SegEs: 0000002B    SegDs: 0000002B
[13:00:45] > Stack:
FFFFD8F0 6C7B9325 01AC2B68 FFFFD8F0
00000000 FFFFFFFF 01DFB470 0A660D58
6B9E9825 01AC2B68 FFFFD8F0 00000065
01DFB470 6B900197 6B8D9BB0 0A6602CC
6B8D9BD9 01AC3768 0A6601C0 00000001
6C77280D 0A6601C0 00008002 0A6E4588
0177F23C 0177F1BC 0A703270 0A6601C0
00000005 0A738CD8 0177F260 6C794360
0A660100 000B4F83 0A6601F0 0A6601C0
6C797AFB 0A6601C0 0177F23C 00000001
FFFFFFFF 0A6601F0 01AC3748 0177F17C
0A6601F0 6C797D07 0A6601F0 0A6601C0
0A69EA00 01AC3748 0A6601F0 0A6601C0
0A703274 0177F188 6C7D77FF 000007D0
6C7976C0 0A6601C0 0A660370 0A6601C0
0177F23C 0A703270 FFFFFFFC 0A6601C0
[13:00:45] > Modules:
gta_sa.exe, 00400000, 01177000
ntdll.dll, 776B0000, 001A3000
KERNEL32.DLL, 756C0000, 000F0000
KERNELBASE.dll, 75C00000, 00214000
apphelp.dll, 73A10000, 0009F000
AcLayers.DLL, 6BAE0000, 0028C000
msvcrt.dll, 75F00000, 000BF000
USER32.dll, 76E40000, 00196000
win32u.dll, 76030000, 00018000
GDI32.dll, 76E10000, 00023000
gdi32full.dll, 75B20000, 000DC000
msvcp_win.dll, 75640000, 0007B000
ucrtbase.dll, 77050000, 00120000
SHELL32.dll, 763B0000, 005B4000
SHLWAPI.dll, 761D0000, 00045000
OLEAUT32.dll, 76310000, 00096000
combase.dll, 77270000, 00282000
RPCRT4.dll, 75580000, 000C0000
SETUPAPI.dll, 76970000, 00434000
cfgmgr32.dll, 76080000, 0003B000
bcrypt.dll, 75930000, 00019000
MPR.dll, 74400000, 00019000
sfc.dll, 66680000, 00003000
WINSPOOL.DRV, 74BE0000, 0006D000
sfc_os.DLL, 743F0000, 0000F000
IMM32.DLL, 76050000, 00025000
WS2_32.dll, 76FE0000, 00063000
ADVAPI32.dll, 758B0000, 0007A000
vorbisfile.dll, 743D0000, 00011000
sechost.dll, 76150000, 00076000
WINMM.dll, 74420000, 00028000
ole32.dll, 77500000, 000E3000
EAX.DLL, 10000000, 00030000
samp.dll, 03D70000, 0027E000
PSAPI.DLL, 76020000, 00006000
WSOCK32.dll, 71B20000, 00008000
BASS.dll, 11000000, 00055000
COMCTL32.dll, 74340000, 0008D000
MSACM32.dll, 6D0E0000, 00019000
winmmbase.dll, 73E40000, 0001D000
d3dx9_25.dll, 03FF0000, 00253000
usp10.dll, 74320000, 00017000
vorbishooked.DLL, 000D0000, 00011000
ogg.dll, 000F0000, 00009000
vorbis.dll, 01820000, 00108000
CRYPTSP.dll, 73BF0000, 00013000
rsaenh.dll, 71A10000, 0002F000
USERENV.dll, 72F60000, 00025000
profapi.dll, 73BC0000, 0001D000
bcryptprimitives.dll, 75AC0000, 0005D000
CRYPT32.dll, 77170000, 000FA000
DPAPI.dll, 74310000, 00008000
CRYPTBASE.dll, 73AB0000, 0000A000
cleo.asi, 74290000, 0007B000
FileSystemOperations.cleo, 74270000, 0001C000
IniFiles.cleo, 74250000, 0001F000
IntOperations.cleo, 74230000, 00017000
DrawColsSA.asi, 74220000, 00008000
MSVCR100.dll, 73CD0000, 000BF000
MoonLoader.asi, 6B8D0000, 00206000
lua51.dll, 6C770000, 00098000
urlmon.dll, 74A30000, 001A9000
WININET.dll, 74450000, 00458000
d3dx9_43.dll, 6B6D0000, 001FF000
iertutil.dll, 73E90000, 0022B000
shcore.dll, 760C0000, 00087000
SAMPFUNCS.asi, 6B4E0000, 001E1000
kernel.appcore.dll, 73B80000, 0000F000
uxtheme.dll, 74C80000, 00074000
igdail32.dll, 741E0000, 00028000
dxcore.dll, 735D0000, 0002C000
DDRAW.dll, 6B3F0000, 000E9000
DCIMAN32.dll, 74210000, 00007000
dxgi.dll, 6ED00000, 000C2000
bdcam.dll, 727E0000, 000EA000
VERSION.dll, 74A20000, 00008000
DSOUND.dll, 740C0000, 0007F000
powrprof.dll, 73DF0000, 00044000
UMPDC.dll, 73D90000, 0000D000
clbcatq.dll, 75E80000, 0007E000
MMDevApi.dll, 6D410000, 0006B000
DEVOBJ.dll, 6F5A0000, 00024000
AUDIOSES.DLL, 6D1E0000, 00138000
resourcepolicyclient.dll, 741D0000, 0000F000
MSCTF.dll, 757D0000, 000D4000
DINPUT8.dll, 6F560000, 00037000
inputhost.dll, 6F470000, 000ED000
CoreMessaging.dll, 72B80000, 0009B000
wintypes.dll, 72AA0000, 000DB000
CoreUIComponents.dll, 72C20000, 0027E000
PROPSYS.dll, 6F3A0000, 000C3000
ntmarta.dll, 73B90000, 00029000
HID.DLL, 6F5D0000, 0000A000
WINTRUST.dll, 76DB0000, 00047000
MSASN1.dll, 73BE0000, 0000E000
d3d9.dll, 71B60000, 00190000
dwmapi.dll, 73790000, 00026000
windows.storage.dll, 74F60000, 00609000
Wldp.dll, 74F30000, 00024000
igdumdim32.dll, 6A9F0000, 009F9000
igdusc32.dll, 6A670000, 0037A000
TextShaping.dll, 728D0000, 00094000
textinputframework.dll, 72EA0000, 000B9000
Oleacc.dll, 74140000, 00053000
Windows.UI.dll, 6CFB0000, 000F3000
WindowManagementAPI.dll, 6CF30000, 00073000
twinapi.appcore.dll, 6EB70000, 0018F000
avrt.dll, 6D3B0000, 00008000
wmvcore.dll, 6A460000, 0020D000
mfperfhelper.dll, 6A350000, 00106000
WMASF.DLL, 73C90000, 0003D000
mlang.dll, 73B40000, 00034000
mswsock.dll, 73640000, 00052000
napinsp.dll, 6E940000, 00011000
pnrpnsp.dll, 6E920000, 00016000
wshbth.dll, 6E910000, 00010000
NLAapi.dll, 6E8F0000, 00016000
IPHLPAPI.DLL, 73600000, 00032000
DNSAPI.dll, 729E0000, 00092000
NSI.dll, 75570000, 00007000
winrnr.dll, 6E8E0000, 0000E000
fwpuclnt.dll, 72970000, 00058000
rasadhlp.dll, 729D0000, 00008000
dsdmo.dll, 73B10000, 00030000
msdmo.dll, 741A0000, 00009000
mscms.dll, 6A2B0000, 00093000
ColorAdapterClient.dll, 73DE0000, 0000C000
Windows.Internal.Graphics.Display.DisplayColorManagement.dll, 6C5E0000, 00031000

[13:00:45] > SCM Thread:
 hj             00A903D0      00000000     00A561AD         true
 noname         00A904B0      00000000     00A56B07         true
 intman         00A90590      00000000     00A56FDA         true
 main           00A90750      00000000     00A56006         true
 

wulfandr

Известный
636
260
Мой скрипт (по команде выводит последние 20 строк чата департамента SRP) стабильно крашит игру через час-два после открытия. Возможно, связано с получением определённого количества сообщений, подходящих критериям (цвет). Лог мунлодера ничего интересного не показывает. Есть идеи, с чем может быть связано?

Lua:
require "lib.moonloader"
require "lib.sampfuncs"
require "vkeys"

local se = require "lib.samp.events"

local deps = {}
local maxlen = 20

function deps_append(s)
    --sampAddChatMessage(tostring(#deps), 0xAAAAAA)
    if (#deps < maxlen) then
        deps[#deps + 1] = s
    else
        for i = 2, maxlen do
            deps[i - 1] = deps[i]
        end
        deps[maxlen] = s
    end
end

function se.onServerMessage(color, text)
    if(color == -8224001) then
        deps_append(string.format("%s %s", os.date("[%H:%M:%S]"), text), 0xAAAAAA)
    end
    --sampAddChatMessage(tostring(color),0xAAAAAA)
end

function on_script_call(args)
    if(args == nil) then
        args = ""
    end
    local deps_text = "{FF8282}"
    local i = 1
    while(i < #deps + 1) do
        if(args == "" or deps[i]:find(args) ~= nil) then
            deps_text = deps_text .. deps[i] .. "\n"
        end
        i = i + 1
    end
    if(args == "") then
        sampShowDialog(6969, "Волна департамента", deps_text, "Ок", nil, DIALOG_STYLE_MSGBOX)
    else
        sampShowDialog(6969, "Волна департамента - "..args, deps_text, "Ок", nil, DIALOG_STYLE_MSGBOX)
    end
    --sampAddChatMessage(tostring(#deps).." "..tostring(i).." "..tostring(deps[1]),0xAAAAAA)
end

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("bdep",on_script_call)
end

Лог SF:
Код:
[10:23:04] SAMPFUNCS v5.5.0 rel.22 (SA-MP 0.3.7 R3-1) completely loaded!
[13:00:45] SAMPFUNCS v5.5.0 rel.22 (SA-MP 0.3.7 R3-1) caught an exception.
[13:00:45] Base address: 6B4E0000
[13:00:45] > Exception record:
[13:00:45] Exception at address: 6C7777D8, Flags: 00000000
[13:00:45] Module: D:\GTA San Andreas\lua51.dll (6C770000)
[13:00:45] Cause: EXCEPTION_ACCESS_VIOLATION
[13:00:45] Attempted to read from: 00000018
[13:00:45] > Exception context:
[13:00:45] EAX: 01A6DAE0    ESI: 01AC2B68
[13:00:45] EBX: 00000065    EDX: 00000000
[13:00:45] ECX: 00000000    EDI: 01AC2B68
[13:00:45] EBP: 0A6601C0    ESP: 0177F0A0
[13:00:45] DR0: 00000000    DR1: 00000000
[13:00:45] DR2: 00000000    DR3: 00000000
[13:00:45] DR6: 00000000    DR7: 00000000
[13:00:45] SegGs: 0000002B    SegFs: 00000053
[13:00:45] SegEs: 0000002B    SegDs: 0000002B
[13:00:45] > Stack:
FFFFD8F0 6C7B9325 01AC2B68 FFFFD8F0
00000000 FFFFFFFF 01DFB470 0A660D58
6B9E9825 01AC2B68 FFFFD8F0 00000065
01DFB470 6B900197 6B8D9BB0 0A6602CC
6B8D9BD9 01AC3768 0A6601C0 00000001
6C77280D 0A6601C0 00008002 0A6E4588
0177F23C 0177F1BC 0A703270 0A6601C0
00000005 0A738CD8 0177F260 6C794360
0A660100 000B4F83 0A6601F0 0A6601C0
6C797AFB 0A6601C0 0177F23C 00000001
FFFFFFFF 0A6601F0 01AC3748 0177F17C
0A6601F0 6C797D07 0A6601F0 0A6601C0
0A69EA00 01AC3748 0A6601F0 0A6601C0
0A703274 0177F188 6C7D77FF 000007D0
6C7976C0 0A6601C0 0A660370 0A6601C0
0177F23C 0A703270 FFFFFFFC 0A6601C0
[13:00:45] > Modules:
gta_sa.exe, 00400000, 01177000
ntdll.dll, 776B0000, 001A3000
KERNEL32.DLL, 756C0000, 000F0000
KERNELBASE.dll, 75C00000, 00214000
apphelp.dll, 73A10000, 0009F000
AcLayers.DLL, 6BAE0000, 0028C000
msvcrt.dll, 75F00000, 000BF000
USER32.dll, 76E40000, 00196000
win32u.dll, 76030000, 00018000
GDI32.dll, 76E10000, 00023000
gdi32full.dll, 75B20000, 000DC000
msvcp_win.dll, 75640000, 0007B000
ucrtbase.dll, 77050000, 00120000
SHELL32.dll, 763B0000, 005B4000
SHLWAPI.dll, 761D0000, 00045000
OLEAUT32.dll, 76310000, 00096000
combase.dll, 77270000, 00282000
RPCRT4.dll, 75580000, 000C0000
SETUPAPI.dll, 76970000, 00434000
cfgmgr32.dll, 76080000, 0003B000
bcrypt.dll, 75930000, 00019000
MPR.dll, 74400000, 00019000
sfc.dll, 66680000, 00003000
WINSPOOL.DRV, 74BE0000, 0006D000
sfc_os.DLL, 743F0000, 0000F000
IMM32.DLL, 76050000, 00025000
WS2_32.dll, 76FE0000, 00063000
ADVAPI32.dll, 758B0000, 0007A000
vorbisfile.dll, 743D0000, 00011000
sechost.dll, 76150000, 00076000
WINMM.dll, 74420000, 00028000
ole32.dll, 77500000, 000E3000
EAX.DLL, 10000000, 00030000
samp.dll, 03D70000, 0027E000
PSAPI.DLL, 76020000, 00006000
WSOCK32.dll, 71B20000, 00008000
BASS.dll, 11000000, 00055000
COMCTL32.dll, 74340000, 0008D000
MSACM32.dll, 6D0E0000, 00019000
winmmbase.dll, 73E40000, 0001D000
d3dx9_25.dll, 03FF0000, 00253000
usp10.dll, 74320000, 00017000
vorbishooked.DLL, 000D0000, 00011000
ogg.dll, 000F0000, 00009000
vorbis.dll, 01820000, 00108000
CRYPTSP.dll, 73BF0000, 00013000
rsaenh.dll, 71A10000, 0002F000
USERENV.dll, 72F60000, 00025000
profapi.dll, 73BC0000, 0001D000
bcryptprimitives.dll, 75AC0000, 0005D000
CRYPT32.dll, 77170000, 000FA000
DPAPI.dll, 74310000, 00008000
CRYPTBASE.dll, 73AB0000, 0000A000
cleo.asi, 74290000, 0007B000
FileSystemOperations.cleo, 74270000, 0001C000
IniFiles.cleo, 74250000, 0001F000
IntOperations.cleo, 74230000, 00017000
DrawColsSA.asi, 74220000, 00008000
MSVCR100.dll, 73CD0000, 000BF000
MoonLoader.asi, 6B8D0000, 00206000
lua51.dll, 6C770000, 00098000
urlmon.dll, 74A30000, 001A9000
WININET.dll, 74450000, 00458000
d3dx9_43.dll, 6B6D0000, 001FF000
iertutil.dll, 73E90000, 0022B000
shcore.dll, 760C0000, 00087000
SAMPFUNCS.asi, 6B4E0000, 001E1000
kernel.appcore.dll, 73B80000, 0000F000
uxtheme.dll, 74C80000, 00074000
igdail32.dll, 741E0000, 00028000
dxcore.dll, 735D0000, 0002C000
DDRAW.dll, 6B3F0000, 000E9000
DCIMAN32.dll, 74210000, 00007000
dxgi.dll, 6ED00000, 000C2000
bdcam.dll, 727E0000, 000EA000
VERSION.dll, 74A20000, 00008000
DSOUND.dll, 740C0000, 0007F000
powrprof.dll, 73DF0000, 00044000
UMPDC.dll, 73D90000, 0000D000
clbcatq.dll, 75E80000, 0007E000
MMDevApi.dll, 6D410000, 0006B000
DEVOBJ.dll, 6F5A0000, 00024000
AUDIOSES.DLL, 6D1E0000, 00138000
resourcepolicyclient.dll, 741D0000, 0000F000
MSCTF.dll, 757D0000, 000D4000
DINPUT8.dll, 6F560000, 00037000
inputhost.dll, 6F470000, 000ED000
CoreMessaging.dll, 72B80000, 0009B000
wintypes.dll, 72AA0000, 000DB000
CoreUIComponents.dll, 72C20000, 0027E000
PROPSYS.dll, 6F3A0000, 000C3000
ntmarta.dll, 73B90000, 00029000
HID.DLL, 6F5D0000, 0000A000
WINTRUST.dll, 76DB0000, 00047000
MSASN1.dll, 73BE0000, 0000E000
d3d9.dll, 71B60000, 00190000
dwmapi.dll, 73790000, 00026000
windows.storage.dll, 74F60000, 00609000
Wldp.dll, 74F30000, 00024000
igdumdim32.dll, 6A9F0000, 009F9000
igdusc32.dll, 6A670000, 0037A000
TextShaping.dll, 728D0000, 00094000
textinputframework.dll, 72EA0000, 000B9000
Oleacc.dll, 74140000, 00053000
Windows.UI.dll, 6CFB0000, 000F3000
WindowManagementAPI.dll, 6CF30000, 00073000
twinapi.appcore.dll, 6EB70000, 0018F000
avrt.dll, 6D3B0000, 00008000
wmvcore.dll, 6A460000, 0020D000
mfperfhelper.dll, 6A350000, 00106000
WMASF.DLL, 73C90000, 0003D000
mlang.dll, 73B40000, 00034000
mswsock.dll, 73640000, 00052000
napinsp.dll, 6E940000, 00011000
pnrpnsp.dll, 6E920000, 00016000
wshbth.dll, 6E910000, 00010000
NLAapi.dll, 6E8F0000, 00016000
IPHLPAPI.DLL, 73600000, 00032000
DNSAPI.dll, 729E0000, 00092000
NSI.dll, 75570000, 00007000
winrnr.dll, 6E8E0000, 0000E000
fwpuclnt.dll, 72970000, 00058000
rasadhlp.dll, 729D0000, 00008000
dsdmo.dll, 73B10000, 00030000
msdmo.dll, 741A0000, 00009000
mscms.dll, 6A2B0000, 00093000
ColorAdapterClient.dll, 73DE0000, 0000C000
Windows.Internal.Graphics.Display.DisplayColorManagement.dll, 6C5E0000, 00031000

[13:00:45] > SCM Thread:
hj             00A903D0      00000000     00A561AD         true
noname         00A904B0      00000000     00A56B07         true
intman         00A90590      00000000     00A56FDA         true
main           00A90750      00000000     00A56006         true
а нахер вам dep_append? можно удалять первый элемент списка и добавлять к максимальному новое значение