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

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

  1. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.13
    Сообщения:
    2.445
    Лайки:
    1.368
    Репутация:
    395
    [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.445
    Лайки:
    1.368
    Репутация:
    395
    Описание: Ищет маркер на карте.
    Использование: 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.445
    Лайки:
    1.368
    Репутация:
    395
    Описание: Ищет 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
     
    #3
    Последнее редактирование: 14 авг 2016
    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
    Сообщения:
    943
    Лайки:
    237
    Репутация:
    61
    Описание: поиск пикапа по его 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
    Сообщения:
    688
    Лайки:
    1.464
    Репутация:
    628
    Описание: разбивает цвет, представленный в виде целого, на составляющие (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
    Сообщения:
    688
    Лайки:
    1.464
    Репутация:
    628
    Код (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
    Сообщения:
    943
    Лайки:
    237
    Репутация:
    61
    Функция позволяет узнать сколько патронов в обойме.
    Код (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 нравится это.