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

ewin

Известный
673
372
из-за чего может не работать isKeyJustPressed на клавише "1"?
Lua:
if isKeyJustPressed(ini.binds.button) then
   --func
end   

--INI
[binds]
button=1
 

ewin

Известный
673
372
потому что ты передаешь в функцию 1, а не номер клавиши "1"
Используй VK_1, 49 или 0x31
предполагал, но даже если через vkeys переводить название в номер - все равно не работает, не могу использовать номера, потому что бинд может меняться
 

ARMOR

Waitin' on another black summer to end
Модератор
5,049
7,250
предполагал, но даже если через vkeys переводить название в номер - все равно не работает, не могу использовать номера, потому что бинд может меняться
wasKeyPressed пробывал? С isKeyJustPressed бывают проблемы.
 

chapo

tg/inst: @moujeek
Всефорумный модератор
9,127
12,254
предполагал, но даже если через vkeys переводить название в номер - все равно не работает, не могу использовать номера, потому что бинд может меняться
Lua:
isKeyJustPressed(_G['VK_'..ini.binds.button])
-- не забудь подключить lib.moonloader
 
  • Влюблен
  • Нравится
Реакции: ewin и вайега52

Sierrabozz

Новичок
3
0
изображение_2023-01-25_000250420.png

можно как это вывесть на экран и что-бы пошёл ещё таймер на 2 минуты после этого текста.
 

Sadow

Известный
1,427
593
Как узнать на какие кнопки у пользователя настроено сесть в машину? И как сделать так чтобы персонаж пользователя сел в машину?
 

CaJlaT

07.11.2024 14:55
Модератор
2,843
2,695
Как узнать на какие кнопки у пользователя настроено сесть в машину? И как сделать так чтобы персонаж пользователя сел в машину?
всё намного проще, чем ты думаешь...
Lua:
sampSendEnterVehicle(int id, bool passenger) -- отправка пакета серверу
taskEnterCarAsPassenger(Ped ped, Vehicle car, int time, int passengerSeat) -- садимся на пассажирское сидение с анимацией
taskEnterCarAsDriver(Ped ped, Vehicle car, int timeMS) -- то же самое, но на место водителя
Вот готовый вариант посадки на пассажирское место в ближайшую тачку (сядет на первое попавшееся свободное место)
Lua:
function main()
    sampRegisterChatCommand('enter', function()
        local res, handle, dist = GetNearestCarByPed(PLAYER_PED, 200, false) -- Находим ближайшую тачку
        if res then
            local bResult, iID = sampGetVehicleIdByCarHandle(handle)
            for i = 0, getMaximumNumberOfPassengers(handle) do -- Получаем все пассажирские места
                if isCarPassengerSeatFree(handle, i) then -- Если место свободное
                    sampSendEnterVehicle(iID, true) -- Отправляем пакет серверу
                    taskEnterCarAsPassenger(PLAYER_PED, handle, 2, i) -- Воспроизводим анимацию
                    return
                end
            end
        else
            sampAddChatMessage('Ошибка, рядом нет машин', 0xFF0000)
        end
    end)
    wait(-1)
end


function GetNearestCarByPed(HndlPed, radius, minPlayerNear) -- https://www.blast.hk/threads/13380/page-16#post-638465
    if doesCharExist(HndlPed) then
        local tableArr = {}
        local countPlayers = 0
        local posXpl, posYpl = getCharCoordinates(HndlPed)
        for _,car in pairs(getAllVehicles()) do
            if getDriverOfCar(car) ~= HndlPed then
                local posX, posY, posZ = getCarCoordinates(car)
                for _,player in pairs(getAllChars()) do
                    if player ~= HndlPed then
                        local playerid = select(2, sampGetPlayerIdByCharHandle(player))
                        if not sampIsPlayerNpc(playerid) and playerid ~= -1 then
                            local x,y,z = getCharCoordinates(player)
                            if getDistanceBetweenCoords2d(x, y, posX, posY) < 3 then countPlayers = countPlayers + 1 end
                        end
                    end
                end
                local distBetween2d = getDistanceBetweenCoords2d(posXpl, posYpl, posX, posY)
                if minPlayerNear ~= false then
                    if tonumber(minPlayerNear) >= countPlayers then
                        table.insert(tableArr, {distBetween2d, car, posX, posY, posZ, countPlayers})
                    end
                else table.insert(tableArr, {distBetween2d, car, posX, posY, posZ, countPlayers}) end
                countPlayers = 0
            end
        end
        if #tableArr > 0 then
            table.sort(tableArr, function(a, b) return (a[1] < b[1]) end)
            if radius ~= false then
                if tableArr[1][1] <= tonumber(radius) then
                    return true, tableArr[1][2], tableArr[1][1], tableArr[1][3], tableArr[1][4], tableArr[1][5], tableArr[1][6]
                end
            else return true, tableArr[1][2], tableArr[1][1], tableArr[1][3], tableArr[1][4], tableArr[1][5], tableArr[1][6] end
        end
    end
    return false
end
Ну или используй
Но это будет выглядеть как телепорт
 

Sadow

Известный
1,427
593
всё намного проще, чем ты думаешь...
Lua:
sampSendEnterVehicle(int id, bool passenger) -- отправка пакета серверу
taskEnterCarAsPassenger(Ped ped, Vehicle car, int time, int passengerSeat) -- садимся на пассажирское сидение с анимацией
taskEnterCarAsDriver(Ped ped, Vehicle car, int timeMS) -- то же самое, но на место водителя
Вот готовый вариант посадки на пассажирское место в ближайшую тачку (сядет на первое попавшееся свободное место)
Lua:
function main()
    sampRegisterChatCommand('enter', function()
        local res, handle, dist = GetNearestCarByPed(PLAYER_PED, 200, false) -- Находим ближайшую тачку
        if res then
            local bResult, iID = sampGetVehicleIdByCarHandle(handle)
            for i = 0, getMaximumNumberOfPassengers(handle) do -- Получаем все пассажирские места
                if isCarPassengerSeatFree(handle, i) then -- Если место свободное
                    sampSendEnterVehicle(iID, true) -- Отправляем пакет серверу
                    taskEnterCarAsPassenger(PLAYER_PED, handle, 2, i) -- Воспроизводим анимацию
                    return
                end
            end
        else
            sampAddChatMessage('Ошибка, рядом нет машин', 0xFF0000)
        end
    end)
    wait(-1)
end


function GetNearestCarByPed(HndlPed, radius, minPlayerNear) -- https://www.blast.hk/threads/13380/page-16#post-638465
    if doesCharExist(HndlPed) then
        local tableArr = {}
        local countPlayers = 0
        local posXpl, posYpl = getCharCoordinates(HndlPed)
        for _,car in pairs(getAllVehicles()) do
            if getDriverOfCar(car) ~= HndlPed then
                local posX, posY, posZ = getCarCoordinates(car)
                for _,player in pairs(getAllChars()) do
                    if player ~= HndlPed then
                        local playerid = select(2, sampGetPlayerIdByCharHandle(player))
                        if not sampIsPlayerNpc(playerid) and playerid ~= -1 then
                            local x,y,z = getCharCoordinates(player)
                            if getDistanceBetweenCoords2d(x, y, posX, posY) < 3 then countPlayers = countPlayers + 1 end
                        end
                    end
                end
                local distBetween2d = getDistanceBetweenCoords2d(posXpl, posYpl, posX, posY)
                if minPlayerNear ~= false then
                    if tonumber(minPlayerNear) >= countPlayers then
                        table.insert(tableArr, {distBetween2d, car, posX, posY, posZ, countPlayers})
                    end
                else table.insert(tableArr, {distBetween2d, car, posX, posY, posZ, countPlayers}) end
                countPlayers = 0
            end
        end
        if #tableArr > 0 then
            table.sort(tableArr, function(a, b) return (a[1] < b[1]) end)
            if radius ~= false then
                if tableArr[1][1] <= tonumber(radius) then
                    return true, tableArr[1][2], tableArr[1][1], tableArr[1][3], tableArr[1][4], tableArr[1][5], tableArr[1][6]
                end
            else return true, tableArr[1][2], tableArr[1][1], tableArr[1][3], tableArr[1][4], tableArr[1][5], tableArr[1][6] end
        end
    end
    return false
end
Ну или используй
Но это будет выглядеть как телепорт
А есть вообще способ получить на какую кнопку человек может сесть в машину? Мне это для проверки надо. Неважно зачем
 

Andrinall

Известный
701
520
А есть вообще способ получить на какую кнопку человек может сесть в машину? Мне это для проверки надо. Неважно зачем
Отсюда можно вытащить структуры
и отсюда адрес на CContriollerConfigManager
Закастить через ffi или юзать memory, кому как удобнее.
Ну и получать кнопки.

пример с ffi:
local ffi = require 'ffi'

local e_ControllerAction = {
    PED_FIREWEAPON = 0,
    PED_FIREWEAPON_ALT = 1,
    PED_CYCLE_WEAPON_RIGHT = 2,
    PED_CYCLE_WEAPON_LEFT = 3,
    GO_FORWARD = 4,
    GO_BACK = 5,
    GO_LEFT = 6,
    GO_RIGHT = 7,
    PED_SNIPER_ZOOM_IN = 8,
    PED_SNIPER_ZOOM_OUT = 9,
    VEHICLE_ENTER_EXIT = 10,
    CAMERA_CHANGE_VIEW_ALL_SITUATIONS = 11,
    PED_JUMPING = 12,
    PED_SPRINT = 13,
    PED_LOOKBEHIND = 14,
    PED_DUCK = 15,
    PED_ANSWER_PHONE = 16,
    SNEAK_ABOUT = 17,
    VEHICLE_FIREWEAPON = 18,
    VEHICLE_FIREWEAPON_ALT = 19,
    VEHICLE_STEERLEFT = 20,
    VEHICLE_STEERRIGHT = 21,
    VEHICLE_STEERUP = 22,
    VEHICLE_STEERDOWN = 23,
    VEHICLE_ACCELERATE = 24,
    VEHICLE_BRAKE = 25,
    VEHICLE_RADIO_STATION_UP = 26,
    VEHICLE_RADIO_STATION_DOWN = 27,
    VEHICLE_HORN = 29,
    TOGGLE_SUBMISSIONS = 30,
    VEHICLE_HANDBRAKE = 31,
    PED_1RST_PERSON_LOOK_LEFT = 32,
    PED_1RST_PERSON_LOOK_RIGHT = 33,
    VEHICLE_LOOKLEFT = 34,
    VEHICLE_LOOKRIGHT = 35,
    VEHICLE_LOOKBEHIND = 36,
    VEHICLE_MOUSELOOK = 37,
    VEHICLE_TURRETLEFT = 38,
    VEHICLE_TURRETRIGHT = 39,
    VEHICLE_TURRETUP = 40,
    VEHICLE_TURRETDOWN = 41,
    PED_CYCLE_TARGET_LEFT = 42,
    PED_CYCLE_TARGET_RIGHT = 43,
    PED_CENTER_CAMERA_BEHIND_PLAYER = 44,
    PED_LOCK_TARGET = 45,
    NETWORK_TALK = 46,
    CONVERSATION_YES = 47,
    CONVERSATION_NO = 48,
    GROUP_CONTROL_FWD = 49,
    GROUP_CONTROL_BWD = 50,
    PED_1RST_PERSON_LOOK_UP = 51,
    PED_1RST_PERSON_LOOK_DOWN = 52,
    TOGGLE_DPAD = 54,
    SWITCH_DEBUG_CAM_ON = 55,
    TAKE_SCREEN_SHOT = 56,
    SHOW_MOUSE_POINTER_TOGGLE = 57
}

function main()
    configManager = ffi.cast('CControllerConfigManager*', 0xB70198)
    CControllerConfigManager_GetIsKeyboardKeyJustDown = ffi.cast('bool(__thiscall*)(CControllerConfigManager*, unsigned int)', 0x52E450)
    CControllerConfigManager_GetIsKeyboardKeyDown = ffi.cast('bool(__thiscall*)(CControllerConfigManager*, unsigned int)', 0x52DDB0)

    while true do wait(0)
        for i = 0, 3 do
            if CControllerConfigManager_GetIsKeyboardKeyJustDown(configManager, configManager.m_actions[e_ControllerAction.VEHICLE_ENTER_EXIT].keys[i].keyCode) then
                sampAddChatMessage('you pressed VEHICLE_ENTER_EXIT', -1)
            end
        end
    end
end


ffi.cdef[[
struct DIJOYSTATE2 {
    int lX;
    int lY;
    int lZ;
    int lRx;
    int lRy;
    int lRz;
    int rglSlider[2];
    unsigned int rgdwPOV[4];
    unsigned char rgbButtons[128];
    int lVX;
    int lVY;
    int lVZ;
    int lVRx;
    int lVRy;
    int lVRz;
    int rglVSlider[2];
    int lAX;
    int lAY;
    int lAZ;
    int lARx;
    int lARy;
    int lARz;
    int rglASlider[2];
    int lFX;
    int lFY;
    int lFZ;
    int lFRx;
    int lFRy;
    int lFRz;
    int rglFSlider[2];
};

struct CControllerKey {
    unsigned int keyCode;
    unsigned int priority;
};

struct CControllerAction {
    struct CControllerKey keys[4];
};

typedef struct CControllerConfigManager {
    char field_0;
    char field_1;
    char field_2;
    char field_3;
    struct DIJOYSTATE2 m_prevPadState;
    struct DIJOYSTATE2 m_currPadState;
    char        m_aszEventNames[59][40];
    char field_B5C[17]; // pad button states
    char _pad1[3];
    struct CControllerAction m_actions[59];
    char field_12D0[16];
    char field_12E0;
    char _pad2[3];
} CControllerConfigManager;
]]



upd можно ещё сделать типо такого
Lua:
local ffi = require 'ffi'

local e_ControllerAction = {
    PED_FIREWEAPON = 0,
    PED_FIREWEAPON_ALT = 1,
    PED_CYCLE_WEAPON_RIGHT = 2,
    PED_CYCLE_WEAPON_LEFT = 3,
    GO_FORWARD = 4,
    GO_BACK = 5,
    GO_LEFT = 6,
    GO_RIGHT = 7,
    PED_SNIPER_ZOOM_IN = 8,
    PED_SNIPER_ZOOM_OUT = 9,
    VEHICLE_ENTER_EXIT = 10,
    CAMERA_CHANGE_VIEW_ALL_SITUATIONS = 11,
    PED_JUMPING = 12,
    PED_SPRINT = 13,
    PED_LOOKBEHIND = 14,
    PED_DUCK = 15,
    PED_ANSWER_PHONE = 16,
    SNEAK_ABOUT = 17,
    VEHICLE_FIREWEAPON = 18,
    VEHICLE_FIREWEAPON_ALT = 19,
    VEHICLE_STEERLEFT = 20,
    VEHICLE_STEERRIGHT = 21,
    VEHICLE_STEERUP = 22,
    VEHICLE_STEERDOWN = 23,
    VEHICLE_ACCELERATE = 24,
    VEHICLE_BRAKE = 25,
    VEHICLE_RADIO_STATION_UP = 26,
    VEHICLE_RADIO_STATION_DOWN = 27,
    VEHICLE_HORN = 29,
    TOGGLE_SUBMISSIONS = 30,
    VEHICLE_HANDBRAKE = 31,
    PED_1RST_PERSON_LOOK_LEFT = 32,
    PED_1RST_PERSON_LOOK_RIGHT = 33,
    VEHICLE_LOOKLEFT = 34,
    VEHICLE_LOOKRIGHT = 35,
    VEHICLE_LOOKBEHIND = 36,
    VEHICLE_MOUSELOOK = 37,
    VEHICLE_TURRETLEFT = 38,
    VEHICLE_TURRETRIGHT = 39,
    VEHICLE_TURRETUP = 40,
    VEHICLE_TURRETDOWN = 41,
    PED_CYCLE_TARGET_LEFT = 42,
    PED_CYCLE_TARGET_RIGHT = 43,
    PED_CENTER_CAMERA_BEHIND_PLAYER = 44,
    PED_LOCK_TARGET = 45,
    NETWORK_TALK = 46,
    CONVERSATION_YES = 47,
    CONVERSATION_NO = 48,
    GROUP_CONTROL_FWD = 49,
    GROUP_CONTROL_BWD = 50,
    PED_1RST_PERSON_LOOK_UP = 51,
    PED_1RST_PERSON_LOOK_DOWN = 52,
    TOGGLE_DPAD = 54,
    SWITCH_DEBUG_CAM_ON = 55,
    TAKE_SCREEN_SHOT = 56,
    SHOW_MOUSE_POINTER_TOGGLE = 57
}

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    repeat wait(100) until isSampAvailable()
      
    configManager = CControllerConfigManager()

    while true do wait(0)
        if configManager.GetIsKeyboardKeyJustDown(CA_VEHICLE_ENTER_EXIT) then
            sampAddChatMessage('you pressed CA_VEHICLE_ENTER_EXIT', -1)
        end
    end
end

CControllerConfigManager = function()
    local obj = {}
    local mt = {}

    for k, v in pairs(e_ControllerAction) do _G['CA_' .. k] = v end

    local manager = ffi.cast('CControllerConfigManager*', 0xB70198)
    local CControllerConfigManager_GetIsKeyboardKeyJustDown = ffi.cast('bool(__thiscall*)(CControllerConfigManager*, unsigned int)', 0x52E450)
    local CControllerConfigManager_GetIsKeyboardKeyDown = ffi.cast('bool(__thiscall*)(CControllerConfigManager*, unsigned int)', 0x52DDB0)

    function obj.GetIsKeyboardKeyJustDown(actionId)
        for i = 0, 3 do
            if CControllerConfigManager_GetIsKeyboardKeyJustDown(manager, manager.m_actions[actionId].keys[i].keyCode) then
                return true
            end
        end
        return false
    end

    function obj.GetIsKeyboardKeyDown(actionId)
        for i = 0, 3 do
            if CControllerConfigManager_GetIsKeyboardKeyDown(manager, manager.m_actions[actionId].keys[i].keyCode) then
                return true
            end
        end
        return false
    end

    obj.this = manager
    return setmetatable(obj, mt)
end


ffi.cdef[[
struct DIJOYSTATE2 {
    int lX;
    int lY;
    int lZ;
    int lRx;
    int lRy;
    int lRz;
    int rglSlider[2];
    unsigned int rgdwPOV[4];
    unsigned char rgbButtons[128];
    int lVX;
    int lVY;
    int lVZ;
    int lVRx;
    int lVRy;
    int lVRz;
    int rglVSlider[2];
    int lAX;
    int lAY;
    int lAZ;
    int lARx;
    int lARy;
    int lARz;
    int rglASlider[2];
    int lFX;
    int lFY;
    int lFZ;
    int lFRx;
    int lFRy;
    int lFRz;
    int rglFSlider[2];
};

struct CControllerKey {
    unsigned int keyCode;
    unsigned int priority;
};

struct CControllerAction {
    struct CControllerKey keys[4];
};

typedef struct CControllerConfigManager {
    char field_0;
    char field_1;
    char field_2;
    char field_3;
    struct DIJOYSTATE2 m_prevPadState;
    struct DIJOYSTATE2 m_currPadState;
    char        m_aszEventNames[59][40];
    char field_B5C[17]; // pad button states
    char _pad1[3];
    struct CControllerAction m_actions[59];
    char field_12D0[16];
    char field_12E0;
    char _pad2[3];
} CControllerConfigManager;
]]

Не совсем понимаю.. Что я не так делаю?

Код:
[ML] (script) test: Generate InFront Shader ->
[ML] (script) test: CreatePixelShader not success
[ML] (script) test: infront shader denied
[ML] (script) test: Generate Behind Shader ->
[ML] (script) test: CreatePixelShader not success
[ML] (script) test: behind shader denied
Lua:
local hooks = require 'hooks'
local imgui = require 'mimgui'
local ffi = require 'ffi'
local new = imgui.new

local d3dx9 = ffi.load('d3dx9_43.dll')

local cfg = {
    chams = {
        settings = {
            key = VK_F3,
            menu_key = VK_F4,
            wireframe = false,
            dont_mark_infront = false
        },
        infront_wall = imgui.ImVec4(1, 1, 1, 1),
        behind_wall = imgui.ImVec4(0.5, 0.5, 0.5, 1),
        shaders = {
            infront = nil,
            behind = nil
        },
        active = new.bool(false)
    }
}

local hasActorDraw = false
local hasLocalActor = false

function main()
    pDevice = IDirect3DDevice9.new(0xC97C28)

    cfg.chams.shaders.infront = ffi.new('IDirect3DPixelShader9[1]')
    cfg.chams.shaders.behind  = ffi.new('IDirect3DPixelShader9[1]')

    local clr = cfg.chams.infront_wall
    print('Generate InFront Shader ->')
    if not d3d9_GenerateShader(ffi.cast('IDirect3DPixelShader9**', cfg.chams.shaders.infront), clr.x, clr.y, clr.z, clr.w) then
        print('infront shader denied')
    end

    clr = cfg.chams.behind_wall
    print('Generate Behind Shader ->')
    if not d3d9_GenerateShader(ffi.cast('IDirect3DPixelShader9**', cfg.chams.shaders.behind), clr.x,  clr.y,  clr.z,  clr.w) then
        print('behind shader denied')
    end

    hk_DrawIndexedPrimitive = pDevice.hk_vtable.hookMethod("HRESULT(__stdcall*)(LPDIRECT3DDEVICE9, uint32_t, int, uint32_t, uint32_t, uint32_t, uint32_t)", DrawIndexedPrimitive_cb, 82)

    actorDraw_hook = hooks.call.new("void(__thiscall*)(void*)", actorDraw_cb, 0x761134)
    localActor_hook = hooks.call.new("void(__thiscall*)(void*)", localActor_cb, 0x5E7687)
end

function actorDraw_cb(CPed_this)
    hasActorDraw = true
    return actorDraw_hook(CPed_this)
end

function localActor_cb(CPed_this)
    hasLocalActor = false
    if (CPed_this == getCharPointer(PLAYER_PED)) then
        hasLocalActor = true
    end
    return localActor_hook(CPed_this)
end

-- ( D3DPRIMITIVETYPE PrimitiveType, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices, UINT startIndex, UINT primCount )
function DrawIndexedPrimitive_cb(device, PrimitiveType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount)
    if not cfg.chams.active[0] then return hk_DrawIndexedPrimitive(device, PrimitiveType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount) end
    if not hasActorDraw then return hk_DrawIndexedPrimitive(device, PrimitiveType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount) end
    if cfg.chams.shaders.infront == ffi.NULL or cfg.chams.shaders.behind == ffi.NULL then return hk_DrawIndexedPrimitive(device, PrimitiveType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount) end
    if hasLocalActor then return hk_DrawIndexedPrimitive(device, PrimitiveType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount) end

    print('DrawIndexedPrimitive')

    pDevice:SetRenderState(D3DRS_ZENABLE, false )
    if cfg.chams.settings.wireframe[0] then
        pDevice:SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME)
    else
        pDevice:SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID)
    end
    pDevice:SetRenderState(D3DRS_PATCHEDGESTYLE, D3DPATCHEDGE_CONTINUOUS)


    -- actor behind wall
    print('actor behind wall')
    pDevice:SetPixelShader(chams_behind)
    hk_DrawIndexedPrimitive(device, PrimitiveType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount)

    -- actor infront wall
    print('actor infront wall')
    pDevice:SetRenderState(D3DRS_ZENABLE, true)

    if not cfg.chams.settings.dont_mark_infront[0] then
        pDevice:SetPixelShader(chams_infront)
    else
        if cfg.chams.settings.wireframe[0] then
            pDevice:SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID)
        end
        pDevice:SetPixelShader(ffi.NULL)
    end

    hk_DrawIndexedPrimitive(device, PrimitiveType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount)

    pDevice:SetPixelShader(ffi.NULL);

    hasActorDraw = false
    pDevice:SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID)
    print('success to return call_orig()')

    return hk_DrawIndexedPrimitive(device, PrimitiveType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount)
end

local function failed(hr) return hr < 0 end
--(IDirect3DPixelShader9 **pShader, float alpha, float red, float green, float blue)
function d3d9_GenerateShader(pShader, r, g, b, a)
    local szShader = ("ps.1.1\ndef c0, %f, %f, %f, %f\nmov r0,c0\0"):format(r,g,b,a)
    local pShaderBuf = ffi.cast('ID3DXBuffer*', ffi.new('ID3DXBuffer[1]'))

    if failed(d3dx9.D3DXAssembleShader(szShader, #szShader, ffi.NULL, ffi.NULL, 0, ffi.cast('ID3DXBuffer**', pShaderBuf), ffi.NULL)) then
        print("Shader not Assembled")
        return false
    end

    local id3dx_GetBufferPointer = ffi.cast("LPVOID(__stdcall*)(ID3DXBuffer*)", pShaderBuf.vtbl[0].GetBufferPointer)
    local id3dx_GetBufferSize = ffi.cast("DWORD(__stdcall*)(ID3DXBuffer*)", pShaderBuf.vtbl[0].GetBufferSize)

    local buf_ptr = ffi.new('const DWORD[1]', { ffi.cast('const DWORD', id3dx_GetBufferPointer(pShaderBuf)) })

    if failed(pDevice:CreatePixelShader(ffi.cast('const DWORD*', buf_ptr), pShader)) then
        print("CreatePixelShader not success")
        return false
    end

    print(pShaderBuffer, pShader)
    print('End Generate shader')
    return true;
end

function onScriptTerminate(sc, qg)
    if sc == thisScript() then
        if pDevice ~= nil and pDevice.hk_vtable ~= ffi.NULL and hkEndScene ~= ffi.NULL then
            local _SafeRelease = function(shader) ffi.cast('void(__stdcall*)(LPDIRECT3DPIXELSHADER9)', shader.vtbl[0].Release)(shader); shader = nil end
            pDevice.destroy()

            if cfg.chams.shaders.infront ~= ffi.NULL then
                _SafeRelease(cfg.chams.shaders.infront)
            end
            if cfg.chams.shaders.behind ~= ffi.NULL then
                _SafeRelease(cfg.chams.shaders.behind)
            end

            DrawIndexedPrimitive_cb = nil
            hk_DrawIndexedPrimitive = nil
            pDevice = nil

            if actorDraw_hook ~= nil then
                actorDraw_hook.stop()
                actorDraw_cb = nil
                actorDraw_hook = nil
            end

            if localActor_hook ~= nil then
                localActor_hook.stop()
                localActor_cb = nil
                localActor_hook = nil
            end
        end
    end
end

IDirect3DDevice9 = {}
IDirect3DDevice9.__index = IDirect3DDevice9

function IDirect3DDevice9.new(pointer)
    local pDevice = ffi.cast('LPDIRECT3DDEVICE9', pointer)
    local hooked_vtable = hooks.vmt.new(pDevice.vtbl)
    local self = setmetatable({
        this = pDevice,
        vtable = hooked_vtable.this,
        hk_vtable = hooked_vtable,
        _CreatePixelShader = ffi.cast("HRESULT(__stdcall*)(LPDIRECT3DDEVICE9, const DWORD*, LPDIRECT3DPIXELSHADER9*)", hooked_vtable.this[106]), -- CreatePixelShader
        _SetRenderState = ffi.cast("HRESULT(__stdcall*)(LPDIRECT3DDEVICE9, uint32_t state, DWORD value)", hooked_vtable.this[57]), -- SetRenderState
        _SetPixelShader = ffi.cast("HRESULT(__stdcall*)(LPDIRECT3DDEVICE9, LPDIRECT3DPIXELSHADER9)", hooked_vtable.this[107]) -- SetPixelShader
    }, IDirect3DDevice9)
    return self
end

function IDirect3DDevice9:CreatePixelShader(pFunction, ppShader)
    if not pFunction or not ppShader then return -20 end
    if not type(pFunction):find('^cdata') or not type(ppShader):find('^cdata') then return -20 end

    return self._CreatePixelShader(self.this, pFunction, ppShader)
end

function IDirect3DDevice9:SetRenderState(state, value)
    if not state or not value then return -20 end
    return self._SetRenderState(self.this, state, value)
end

function IDirect3DDevice9:SetPixelShader(ppShader)
    if not ppShader then return -20 end
    return self._SetPixelShader(self.this, ppShader)
end

function IDirect3DDevice9.destroy()
    self.hk_vtable.unHookAll()
    self = nil
    return
end

ffi.cdef[[
    typedef unsigned int DWORD;
    typedef void* LPVOID;
    typedef long HRESULT;

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

    typedef struct IDirect3DDevice9 {
        struct d3ddeviceVTBL** vtbl;
    } IDirect3DDevice9, *LPDIRECT3DDEVICE9;

    struct d3dxbufferVTBL {
        void* QueryInterface;
        void* AddRef;
        void* Release;

        void* GetBufferPointer;
        void* GetBufferSize;
    };

    typedef struct ID3DXBuffer {
        struct d3dxbufferVTBL** vtbl;
    } ID3DXBuffer, *LPD3DXBUFFER;

    struct d3dshaderVTBL {
        void* QueryInterface;
        void* AddRef;
        void* Release;

        void* GetDevice;
        void* GetFunction;
    };

    typedef struct IDirect3DPixelShader9 {
        struct d3dshaderVTBL** vtbl;
    } IDirect3DPixelShader9, *LPDIRECT3DPIXELSHADER9;

    long D3DXAssembleShader(const char* pSrcData, size_t srcDataLen, const void* pDefines, void* pInclude, DWORD Flags, LPD3DXBUFFER* ppShader, LPD3DXBUFFER* ppErrorMsgs);
    long D3DXCreateBuffer(DWORD NumBytes, LPD3DXBUFFER* ppBuffer);
]]
 
Последнее редактирование:
  • Нравится
Реакции: вайега52

вайега52

Налуашил состояние
Модератор
2,899
2,907
блядь нахуй, я ща комп выкину, почему через жопу сохраняет ини?
Lua:
local mainIni = inicfg.load({
    tg = {
        chatId = "",
        token = ""
    },  
}, "tt.ini")

local config = {
    tg = {
        token = new.char[256](mainIni.tg.token),
        chatId = new.char[256](mainIni.tg.chatId)      
    },
}

for name, data in pairs(config.tg) do
    if imgui.InputText(name, data, sizeof(data)) then
        mainIni.tg[name] = str(data)                    
        inicfg.save(mainIni, "tt.ini")
    end    
end
upd: решилось тем, что при объявление переменных в config.tg переводил значения в строку
 
Последнее редактирование: