Полезные сниппеты и функции

Тема в разделе "Lua", создана пользователем SR_team, 14 авг 2016.

  1. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.13
    Сообщения:
    2.489
    Лайки:
    1.442
    Репутация:
    404
    [b]Описание:[/b] *текст*
    [code=lua]*код*[/code]
    [b]Пример использования:[/b]
    [code=lua]*код примера*[/code]
     
    #1
    Последнее редактирование модератором: 1 окт 2016
    4el0ve4ik, FYP, DarkP1xel и 2 другим нравится это.
  2. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.13
    Сообщения:
    2.489
    Лайки:
    1.442
    Репутация:
    404
    Описание: Ищет маркер на карте.
    Использование: local result, x, y, z = SearchMarker(posX, posY, posZ, radius, isRace)
    Код:
    Код (Lua):
    function SearchMarker(posX, posY, posZ, radius, isRace)
        local ret_posX = 0.0
        local ret_posY = 0.0
        local ret_posZ = 0.0
        local isFind = false

        for id = 0, 31 do
            local MarkerStruct = 0
            if isRace then MarkerStruct = 0xC7F168 + id * 56
            else MarkerStruct = 0xC7DD88 + id * 160 end
            local MarkerPosX = representIntAsFloat(readMemory(MarkerStruct + 0, 4, false))
            local MarkerPosY = representIntAsFloat(readMemory(MarkerStruct + 4, 4, false))
            local MarkerPosZ = representIntAsFloat(readMemory(MarkerStruct + 8, 4, false))

            if MarkerPosX ~= 0.0 or MarkerPosY ~= 0.0 or MarkerPosZ ~= 0.0 then
                if getDistanceBetweenCoords3d(MarkerPosX, MarkerPosY, MarkerPosZ, posX, posY, posZ) < radius then
                    ret_posX = MarkerPosX
                    ret_posY = MarkerPosY
                    ret_posZ = MarkerPosZ
                    isFind = true
                    radius = getDistanceBetweenCoords3d(MarkerPosX, MarkerPosY, MarkerPosZ, posX, posY, posZ)
                end
            end
        end

        return isFind, ret_posX, ret_posY, ret_posZ
    end
    Пример:
    Код (Lua):
    script_dependencies("CLEO", "SAMP", "SAMPFUNCS")

    ---------------------------------------------------------------------------

    require "lib.moonloader"
    require "lib.sampfuncs"

    ---------------------------------------------------------------------------

    function main()
        if not isSampfuncsLoaded() or not isSampLoaded() then return end
        sampRegisterChatCommand("mycmd", cmd)

        while true do wait(0) end
    end

    function cmd(param)
        if isPlayerPlaying(playerHandle) then
            local posX, posY, posZ = getCharCoordinates(playerPed)
            local res, x, y, z = SearchMarker(posX, posY, posZ, 50.0, false)
            if res then
                sampAddChatMessage(string.format("Найден обычный маркер в координатах %.2f %.2f %.2f", x, y, z), -1)
            else
                res, x, y, z = SearchMarker(posX, posY, posZ, 50.0, true)
                if res then
                    sampAddChatMessage(string.format("Найден гоночный маркер в координатах %.2f %.2f %.2f", x, y, z), -1)
                else
                    sampAddChatMessage("Маркер не найден", -1)
                end
            end
        end
    end

    function SearchMarker(posX, posY, posZ, radius, isRace)
        local ret_posX = 0.0
        local ret_posY = 0.0
        local ret_posZ = 0.0
        local isFind = false

        for id = 0, 31 do
            local MarkerStruct = 0
            if isRace then MarkerStruct = 0xC7F168 + id * 56
            else MarkerStruct = 0xC7DD88 + id * 160 end
            local MarkerPosX = representIntAsFloat(readMemory(MarkerStruct + 0, 4, false))
            local MarkerPosY = representIntAsFloat(readMemory(MarkerStruct + 4, 4, false))
            local MarkerPosZ = representIntAsFloat(readMemory(MarkerStruct + 8, 4, false))

            if MarkerPosX ~= 0.0 or MarkerPosY ~= 0.0 or MarkerPosZ ~= 0.0 then
                if getDistanceBetweenCoords3d(MarkerPosX, MarkerPosY, MarkerPosZ, posX, posY, posZ) < radius then
                    ret_posX = MarkerPosX
                    ret_posY = MarkerPosY
                    ret_posZ = MarkerPosZ
                    isFind = true
                    radius = getDistanceBetweenCoords3d(MarkerPosX, MarkerPosY, MarkerPosZ, posX, posY, posZ)
                end
            end
        end

        return isFind, ret_posX, ret_posY, ret_posZ
    end
     
    #2
    Последнее редактирование: 14 авг 2016
    RollUp, 4el0ve4ik, FYP и ещё 1-му нравится это.
  3. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.13
    Сообщения:
    2.489
    Лайки:
    1.442
    Репутация:
    404
    Описание: Ищет 3D текст на карте.
    Использование: local result, text, color, x, y, z, distance, ignoreWalls, player, vehicle = Search3Dtext(posX, posY, posZ, radius, patern)
    --patern - часть строки или регулярное выражение
    Код:
    Код (Lua):
    function Search3Dtext(x, y, z, radius, patern)
        local text = ""
        local color = 0
        local posX = 0.0
        local posY = 0.0
        local posZ = 0.0
        local distance = 0.0
        local ignoreWalls = false
        local player = -1
        local vehicle = -1
        local result = false

        for id = 0, 2048 do
            if sampIs3dTextDefined(id) then
                local text2, color2, posX2, posY2, posZ2, distance2, ignoreWalls2, player2, vehicle2 = sampGet3dTextInfoById(id)
                if getDistanceBetweenCoords3d(x, y, z, posX2, posY2, posZ2) < radius then
                    if string.len(patern) ~= 0 then
                        if string.match(text2, patern, 0) ~= nil then result = true end
                    else
                        result = true
                    end
                    if result then
                        text = text2
                        color = color2
                        posX = posX2
                        posY = posY2
                        posZ = posZ2
                        distance = distance2
                        ignoreWalls = ignoreWalls2
                        player = player2
                        vehicle = vehicle2
                        radius = getDistanceBetweenCoords3d(x, y, z, posX, posY, posZ)
                    end
                end
            end
        end

        return result, text, color, posX, posY, posZ, distance, ignoreWalls, player, vehicle
    end
    Пример:
    Код (Lua):
    script_dependencies("CLEO", "SAMP", "SAMPFUNCS")

    ---------------------------------------------------------------------------

    require "lib.moonloader"
    require "lib.sampfuncs"

    ---------------------------------------------------------------------------

    function main()
        if not isSampfuncsLoaded() or not isSampLoaded() then return end
        sampRegisterChatCommand("mycmd", cmd)

        while true do wait(0) end
    end

    function cmd(param)
        if isPlayerPlaying(playerHandle) then
            local posX, posY, posZ = getCharCoordinates(playerPed)
            local res, text, color, x, y, z, distance, ignoreWalls, player, vehicle = Search3Dtext(posX, posY, posZ, 50.0, "")
            if res then
                sampAddChatMessage(string.format("Найден 3D текст \"%s\" в координатах %.2f %.2f %.2f, дистанция %.2f, id игрока %d, id транспорта %d", text, x, y, z, distance, player, vehicle), color)
            end
        end
    end

    function Search3Dtext(x, y, z, radius, patern)
        local text = ""
        local color = 0
        local posX = 0.0
        local posY = 0.0
        local posZ = 0.0
        local distance = 0.0
        local ignoreWalls = false
        local player = -1
        local vehicle = -1
        local result = false

        for id = 0, 2048 do
            if sampIs3dTextDefined(id) then
                local text2, color2, posX2, posY2, posZ2, distance2, ignoreWalls2, player2, vehicle2 = sampGet3dTextInfoById(id)
                if getDistanceBetweenCoords3d(x, y, z, posX2, posY2, posZ2) < radius then
                    if string.len(patern) ~= 0 then
                        if string.match(text2, patern, 0) ~= nil then result = true end
                    else
                        result = true
                    end
                    if result then
                        text = text2
                        color = color2
                        posX = posX2
                        posY = posY2
                        posZ = posZ2
                        distance = distance2
                        ignoreWalls = ignoreWalls2
                        player = player2
                        vehicle = vehicle2
                        radius = getDistanceBetweenCoords3d(x, y, z, posX, posY, posZ)
                    end
                end
            end
        end

        return result, text, color, posX, posY, posZ, distance, ignoreWalls, player, vehicle
    end
     
    Последние данные очков репутации:
    AppleThe: 2 Очки 9 фев 2017
    #3
    Последнее редактирование: 14 авг 2016
    AppleThe, 4el0ve4ik и mac нравится это.
  4. ZeroXruS

    ZeroXruS Заблокирован

    Регистрация:
    17.07.16
    Сообщения:
    17
    Лайки:
    9
    Репутация:
    0
    Описание: рисует кнопку на экране
    Использование:
    bool
    isClicked= renderDrawButton([Font], Title, posX, posY, sizeX, sizeY, targetX, targetY, boxColor, targetBoxColor, textColor, targetTextColor)
    или
    bool isClicked= renderDrawButtonA([Font], Title, posX, posY, targetX, targetY, boxColor, targetBoxColor, textColor, targetTextColor)
    Код:

    Код (Lua):
    function renderDrawButtonA(d3dFont, Title, posX, posY, targetX, targetY, boxColor, targetBoxColor, textColor, targetTextColor) return renderDrawButton(d3dFont, Title, posX, posY, renderGetFontDrawTextLength(d3dFont, Title), renderGetFontDrawHeight(d3dFont), targetX, targetY, boxColor, targetBoxColor, textColor, targetTextColor) end
    function renderDrawButton(d3dFont, Title, posX, posY, sizeX, sizeY, targetX, targetY, boxColor, targetBoxColor, textColor, targetTextColor)
        local bool= false
        local currentBoxColor= boxColor
        local currentTextColor= textColor

        if targetX > posX and targetX < posX + sizeX and targetY > posY and targetY < posY + sizeY then
            currentBoxColor= targetBoxColor
            currentTextColor= targetTextColor
            if isKeyJustPressed(VK_LBUTTON) then bool= true end
        end

        renderDrawBox(posX, posY, sizeX + 2, sizeY, currentBoxColor)
        renderFontDrawText(d3dFont, Title, posX, posY, currentTextColor)
        return bool
    end
     
    #4
  5. 4el0ve4ik

    4el0ve4ik Дилер картошки
    Друг

    Регистрация:
    12.11.15
    Сообщения:
    1.212
    Лайки:
    324
    Репутация:
    79
    Описание: поиск пикапа по его ID
    Использование:
    Код (Text):
    function main()
    if isKeyDown(66) and isKeyJustPressed(72) then
    while isKeyDown(66) or isKeyDown(72) do
        wait(10)
    end
    pickupid()
    end
    if resultpick then
    --body
    end
    end
    Код:
    Код (Lua):
    function pickupid(model)
       local poolPtr = sampGetPickupPoolPtr()
       local ptwo = readMemory(poolPtr, 4, 0)
       if ptwo > 0 then
         ptwo = poolPtr + 0x4
         local pthree = poolPtr + 0xF004
         for id = 1, 4096 do
           local pfive = readMemory(ptwo + id * 4, 4, false)
           if pfive < 0 or pfive > 0 then
             pfive = readMemory(pthree + id * 20, 4, false)
             if pfive == model then
               return id
             end
           end
         end
       end
    end
     
    #5
    Последнее редактирование модератором: 6 сен 2016
  6. FYP

    FYP админ какой-то

    Регистрация:
    09.03.13
    Сообщения:
    844
    Лайки:
    1.691
    Репутация:
    682
    Описание: разбивает цвет, представленный в виде целого, на составляющие (alpha, red, green, blue)
    Код:
    Код (Lua):
    function explode_argb(argb)
      local a = bit.band(bit.rshift(argb, 24), 0xFF)
      local r = bit.band(bit.rshift(argb, 16), 0xFF)
      local g = bit.band(bit.rshift(argb, 8), 0xFF)
      local b = bit.band(argb, 0xFF)
      return a, r, g, b
    end
    Описание: обратная операция - конвертирует цвет alpha, red, green, blue в целое
    Код:
    Код (Lua):
    function join_argb(a, r, g, b)
      local argb = b  -- b
      argb = bit.bor(argb, bit.lshift(g, 8))  -- g
      argb = bit.bor(argb, bit.lshift(r, 16)) -- r
      argb = bit.bor(argb, bit.lshift(a, 24)) -- a
      return argb
    end
    Пример:
    Код (Lua):
    -- функция преобразует цвет ARGB, представленный в виде целого в RGBA в виде целого
    function argb_to_rgba(argb)
      local a, r, g, b = explode_argb(argb)
      return join_argb(r, g, b, a)
    end

    print(bit.tohex(argb_to_rgba(0x11223344)))
    -- будет выведено 0x22334411
     
    #6
    RedBoxWhite и 4el0ve4ik нравится это.
  7. FYP

    FYP админ какой-то

    Регистрация:
    09.03.13
    Сообщения:
    844
    Лайки:
    1.691
    Репутация:
    682
    Код (Lua):
    function getweaponname(weapon)
      local names = {
      [0] = "Fist",
      [1] = "Brass Knuckles",
      [2] = "Golf Club",
      [3] = "Nightstick",
      [4] = "Knife",
      [5] = "Baseball Bat",
      [6] = "Shovel",
      [7] = "Pool Cue",
      [8] = "Katana",
      [9] = "Chainsaw",
      [10] = "Purple Dildo",
      [11] = "Dildo",
      [12] = "Vibrator",
      [13] = "Silver Vibrator",
      [14] = "Flowers",
      [15] = "Cane",
      [16] = "Grenade",
      [17] = "Tear Gas",
      [18] = "Molotov Cocktail",
      [22] = "9mm",
      [23] = "Silenced 9mm",
      [24] = "Desert Eagle",
      [25] = "Shotgun",
      [26] = "Sawnoff Shotgun",
      [27] = "Combat Shotgun",
      [28] = "Micro SMG/Uzi",
      [29] = "MP5",
      [30] = "AK-47",
      [31] = "M4",
      [32] = "Tec-9",
      [33] = "Country Rifle",
      [34] = "Sniper Rifle",
      [35] = "RPG",
      [36] = "HS Rocket",
      [37] = "Flamethrower",
      [38] = "Minigun",
      [39] = "Satchel Charge",
      [40] = "Detonator",
      [41] = "Spraycan",
      [42] = "Fire Extinguisher",
      [43] = "Camera",
      [44] = "Night Vis Goggles",
      [45] = "Thermal Goggles",
      [46] = "Parachute" }
      return names[weapon]
    end
    ))
     
    #7
    4el0ve4ik и Шелди нравится это.
  8. 4el0ve4ik

    4el0ve4ik Дилер картошки
    Друг

    Регистрация:
    12.11.15
    Сообщения:
    1.212
    Лайки:
    324
    Репутация:
    79
    Функция позволяет узнать сколько патронов в обойме.
    Код (Lua):
    function getAmmoInClip()
      local struct = getCharPointer(playerPed)
      local prisv = struct + 0x0718
      local prisv = memory.getint8(prisv, false)
      local prisv = prisv * 0x1C
      local prisv2 = struct + 0x5A0
      local prisv2 = prisv2 + prisv
      local prisv2 = prisv2 + 0x8
      local ammo = memory.getint32(prisv2, false)
      return ammo
    end
    Использование:
    local ammoinclip = getAmmoInClip()
    P.S.
    Код (Lua):
    local memory = require "memory"
    в начало кода пропишите.
     
    #8
    Devilupa нравится это.
  9. hnnssy

    Друг

    Регистрация:
    23.03.13
    Сообщения:
    1.561
    Лайки:
    949
    Репутация:
    161
    Получение серийника логического диска.
    Код (Lua):
    local ffi = require("ffi")
    ffi.cdef[[
    int __stdcall GetVolumeInformationA(
        const char* lpRootPathName,
        char* lpVolumeNameBuffer,
        uint32_t nVolumeNameSize,
        uint32_t* lpVolumeSerialNumber,
        uint32_t* lpMaximumComponentLength,
        uint32_t* lpFileSystemFlags,
        char* lpFileSystemNameBuffer,
        uint32_t nFileSystemNameSize
    );
    ]]

    local serial = ffi.new("unsigned long[1]", 0)
    ffi.C.GetVolumeInformationA(nil, nil, 0, serial, nil, nil, nil, 0)
    serial = serial[0]
     
    #9
    4el0ve4ik и Garrus нравится это.
  10. hnnssy

    Друг

    Регистрация:
    23.03.13
    Сообщения:
    1.561
    Лайки:
    949
    Репутация:
    161
    Описание: Рисует полосу и числовое значение с указанными параметрами. (как бары в hCHUD, например)
    Использование: drawBar(posX, posY, sizeX, sizeY, color1, color2, borderThickness, font, value)
    Код:
    Код (Lua):
    function drawBar(posX, posY, sizeX, sizeY, color1, color2, borderThickness, font, value)
       renderDrawBoxWithBorder(posX, posY, sizeX, sizeY, color2, borderThickness, 0xFF000000)
       renderDrawBox(posX + borderThickness, posY + borderThickness, sizeX / 100 * value - (borderThickness * 2), sizeY - (2 * borderThickness), color1)
       local textLenght = renderGetFontDrawTextLength(font, tostring(value))
       local textHeight = renderGetFontDrawHeight(font)
       renderFontDrawText(font, tostring(value), posX + (sizeX / 2) - (textLenght / 2), posY + (sizeY / 2) - (textHeight / 2), 0xFFFFFFFF)
    end
    Пример:
    HPbar
     
    #10
    FYP, 4el0ve4ik и AppleThe нравится это.
  11. hnnssy

    Друг

    Регистрация:
    23.03.13
    Сообщения:
    1.561
    Лайки:
    949
    Репутация:
    161
    Описание: Рисует кликабельный текст (как в hClickCommands).
    Использование: if drawClickableText(font, text, posX, posY, color, colorA) then -- colorA - цвет текста при наведении курсора
    Код:
    Код (Lua):
    function drawClickableText(font, text, posX, posY, color, colorA)
       renderFontDrawText(font, text, posX, posY, color)
       local textLenght = renderGetFontDrawTextLength(font, text)
       local textHeight = renderGetFontDrawHeight(font)
       local curX, curY = getCursorPos()
       if curX >= posX and curX <= posX + textLenght and curY >= posY and curY <= posY + textHeight then
         renderFontDrawText(font, text, posX, posY, colorA)
         if wasKeyPressed(1) then
           return true
         end
       end
    end
    Пример: (возле игроков рисует 2 кликлинка для отправки сообщения и репорта)
    https://pp.vk.me/c836537/v836537950/22914/kn-I3j-c5Uk.jpg

    Код (Lua):
    script_name("drawClickableText")
    script_description("example of using drawClickableText function")
    script_version_number(1)
    script_version("v.001")
    script_authors("hnnssy")

    local ffi = require "ffi"
    local getBonePosition = ffi.cast("int (__thiscall*)(void*, float*, int, bool)", 0x5E4280)

    function main()
        if not isSampfuncsLoaded() or not isSampLoaded() then return end
        while not isSampAvailable() do wait(100) end
        local font = renderCreateFont("Tahoma", 8, 5)
        while true do
            wait(0)
            if not isPauseMenuActive() and isPlayerPlaying(playerHandle) then
                if wasKeyPressed(90) then
                    while isKeyDown(90) do
                        wait(0)
                        sampToggleCursor(1)
                        for id = 0, sampGetMaxPlayerId(true) do
                             if sampIsPlayerConnected(id) then
                            local exists, handle = sampGetCharHandleBySampPlayerId(id)
                                if exists and isCharOnScreen(handle) then
                                    plX, plY, plZ = getBodyPartCoordinates(8, handle)
                                    local plsX, plsY = convert3DCoordsToScreen(plX, plY, plZ)
                                    if drawClickableText(font, "send message", plsX + 25, plsY, 0xFFFFFFFF, 0xFFFF0000) then
                                        sendMessage(id)
                                    end
                                    if drawClickableText(font, "send report", plsX + 25, plsY + 15, 0xFFFFFFFF, 0xFFFF0000) then
                                        sendReport(id)
                                    end
                                end
                            end
                        end
                    end
                    if wasKeyReleased(90) then sampSetCursorMode(0) end
                end
            end
        end
    end

    function sendMessage(id)
    sampSetChatInputEnabled(1)
    sampSetChatInputText("/pm " .. id .. " ")
    end

    function sendReport(id)
    sampSetChatInputEnabled(1)
    sampSetChatInputText("/report " .. id .. " ")
    end

    function getBodyPartCoordinates(id, handle)
      local pedptr = getCharPointer(handle)
      local vec = ffi.new("float[3]")
      getBonePosition(ffi.cast("void*", pedptr), vec, id, true)
      return vec[0], vec[1], vec[2]
    end

    function drawClickableText(font, text, posX, posY, color, colorA)
        renderFontDrawText(font, text, posX, posY, color)
        local textLenght = renderGetFontDrawTextLength(font, text)
        local textHeight = renderGetFontDrawHeight(font)
        local curX, curY = getCursorPos()
          if curX >= posX and curX <= posX + textLenght and curY >= posY and curY <= posY + textHeight then
            renderFontDrawText(font, text, posX, posY, colorA)
            if wasKeyPressed(1) then
                return true
            end
        end
    end
     
    Последние данные очков репутации:
    FYP: 3 Очки (хоть что-то годное) 12 фев 2017
    #11
    Последнее редактирование: 13 фев 2017
    Bogach и 4el0ve4ik нравится это.
  12. Jesik

    Всефорумный модератор

    Регистрация:
    19.03.13
    Сообщения:
    568
    Лайки:
    160
    Репутация:
    170
    Описание: Расстояние между точки "А" в 3D пространстве до точки "B"
    Код (Lua):
    distance= math.sqrt( ((posX-pedX)^2) + ((posY-pedY)^2) + ((posZ-pedZ)^2))
    Пример использования:
    Код (Lua):
    posX,posY,posZ = 0,0,0
    pedX,pedY,pedZ = getCharCoordinates(playerPed)
    distance= math.sqrt( ((posX-pedX)^2) + ((posY-pedY)^2) + ((posZ-pedZ)^2))
    print(distance)
    Знаю что это простая математическая формула. Ну вдруг кому пригодится
     
    Последние данные очков репутации:
    4el0ve4ik: 2 Очки (твоя математика похвальна, но есть уже встроенная) getDistanceBetweenCoords3d) 11 мар 2017
    #12
    4el0ve4ik нравится это.