3Д текст

Fasmin

Участник
Автор темы
175
6
Версия MoonLoader
.026-beta
Как использовать регулярные выражения в 3д тексте ? К примеру текст: "до выращивания помидор осталось 17 минут" - этот текст на экране
Из него нужно достать число 17, а чтобы узнать айди текста - text2, color2, posX2, posY2, posZ2, distance2, ignoreWalls2, player2, vehicle2 = sampGet3dTextInfoById()
Вот не пойму как сделать это
 

MLycoris

На вид оружие массового семяизвержения
Проверенный
1,981
2,190
типа такого?
Lua:
local font = renderCreateFont('TimesNewRoman', 9, 5)

function main()
    while not isSampAvailable() do wait(100) end
    while true do wait(0)
        for i = 0, 2048 do
            if sampIs3dTextDefined(i) then
                local text, color, posX, posY, posZ, distance, ignoreWalls, playerId, vehicleId = sampGet3dTextInfoById(i)
                local tomatoCD = text:gsub("{......}",""):match("до выращивания помидор осталось (%d+) .+")
                if tomatoCD then
                    renderFontDrawText(font, "КД: "..tomatoCD, 200, 300, 0xFFFFFFFF)
                end
            end
        end
    end
end

или можно так, чтоб не перебирать в беск цикле лишний 3д текст
Lua:
local sampev = require('lib.samp.events')
local font = renderCreateFont('TimesNewRoman', 9, 5)
local timer = 0

function main()
    while true do wait(0)
        if timer > 0 then
            rtimer = timer-os.time()
            convertTime = os.date("!*t", rtimer)
            renderFontDrawText(font, string.format("CD: %s:%s", convertTime.min, convertTime.sec), 200, 300, 0xFFFFFFFF)
        end
    end
end

function sampev.onCreate3DText(id, color, position, distance, testLOS, attachedPlayerId, attachedVehicleId, text)
    local tomatoCD = text:gsub("{......}",""):match("до выращивания помидор осталось (%d+) .+")
    if tomatoCD and timer == 0 then
        timer = os.time() + 1*60*math.ceil(tomatoCD/60)
    end
end
 
Последнее редактирование:
  • Нравится
Реакции: scroll.

kaiangel

Потрачен
12
2
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
ksksksks:
--... hueta example primer okda
local text = 'до выращивания помидор осталось 17 минут'
--ну тип условно строка выше такая какая она есть, в таком же регистре и без цветов
local time = text:match('^до выращивания помидор осталось (%d+) минут$')
--...
 

Fasmin

Участник
Автор темы
175
6
типа такого?
Lua:
local font = renderCreateFont('TimesNewRoman', 9, 5)

function main()
    while not isSampAvailable() do wait(100) end
    while true do wait(0)
        for i = 0, 2048 do
            if sampIs3dTextDefined(i) then
                local text, color, posX, posY, posZ, distance, ignoreWalls, playerId, vehicleId = sampGet3dTextInfoById(i)
                local tomatoCD = text:gsub("{......}",""):match("до выращивания помидор осталось (%d+) .+")
                if tomatoCD then
                    renderFontDrawText(font, "КД: "..tomatoCD, 200, 300, 0xFFFFFFFF)
                end
            end
        end
    end
end

или можно так, чтоб не перебирать в беск цикле лишний 3д текст
Lua:
local sampev = require('lib.samp.events')
local font = renderCreateFont('TimesNewRoman', 9, 5)
local timer = 0

function main()
    while true do wait(0)
        if timer > 0 then
            rtimer = timer-os.time()
            convertTime = os.date("!*t", rtimer)
            renderFontDrawText(font, string.format("CD: %s:%s", convertTime.min, convertTime.sec), 200, 300, 0xFFFFFFFF)
        end
    end
end

function sampev.onCreate3DText(id, color, position, distance, testLOS, attachedPlayerId, attachedVehicleId, text)
    local tomatoCD = text:gsub("{......}",""):match("до выращивания помидор осталось (%d+) .+")
    if tomatoCD and timer == 0 then
        timer = os.time() + 1*60*math.ceil(tomatoCD/60)
    end
end
код:
function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand("reg", function()
        regg = not regg
        printString(regg and "On" or "Off", 1000)
    end)
    while true do wait(0)
        if regg then
            for i=0, 2048 do
                if sampIs3dTextDefined(i) then
                    local text2, color2, posX2, posY2, posZ2, distance2, ignoreWalls2, player2, vehicle2 = sampGet3dTextInfoById(i)
                    if text2:find("Банкомат") then
                        local x, y, z = getCharCoordinates(PLAYER_PED)
                        local wX, wY = convert3DCoordsToScreen(x,y,z)
                        local wwx, wwy = convert3DCoordsToScreen(posX2, posY2, posZ2)
                        renderDrawLine(wX, wY, wwx, wwy, 3, 0xFFD00000)
                        local dist = string.format("%.1f", getDistanceBetweenCoords3d(x,y,z, posX2, posY2, posZ2))
                        renderFontDrawText(font, "dist: "..dist, wwx, wwy, -1)
                    end
                end
            end
        end
    end
end
в renderFontDrawText надо засунуть еще minute переменную, она должна быть типо
local minute = text2:find("до выращивания помидор осталось (%d+) минут")
но когда я делаю так - renderFontDrawText(font, "dist: "..dist.."\nmin: "..minute, wwx, wwy, -1) выходит ошибка попытка соединить локальные переменные
 

MLycoris

На вид оружие массового семяизвержения
Проверенный
1,981
2,190
в renderFontDrawText надо засунуть еще minute переменную, она должна быть типо
local minute = text2:find("до выращивания помидор осталось (%d+) минут")
но когда я делаю так - renderFontDrawText(font, "dist: "..dist.."\nmin: "..minute, wwx, wwy, -1) выходит ошибка попытка соединить локальные переменные
скинь что за ошибка и текст в котором ты ищешь это время, причин дофига может быть
 

Fasmin

Участник
Автор темы
175
6
скинь что за ошибка и текст в котором ты ищешь это время, причин дофига может быть
Вот код крч попроще сделал

код:
for i=0, 2024 do
    if sampIs3dTextDefined(i) then
        local text2, color2, posX2, posY2, posZ2, distance2, ignoreWalls2, player2, vehicle2 = sampGet3dTextInfoById(i)
        local musorka = text2:find("Мусорка: №(%d+)")
        local x, y, z = getCharCoordinates(PLAYER_PED)
        local wX, wY = convert3DCoordsToScreen(x,y,z)
        local wwx, wwy = convert3DCoordsToScreen(posX2, posY2, posZ2)
        renderDrawLine(wX, wY, wwx, wwy, 3, 0xFFD00000)
        --local dist = string.format("%.1f", getDistanceBetweenCoords3d(x,y,z, posX2, posY2, posZ2))
        renderFontDrawText(font, "musorka №"..musorka, wwx, wwy, -1)
    end
end

Ошибка выходит: .lua:89: attempt to concatenate local 'musorka' (a nil value)
Строка 89 это renderFontDrawText(font, "musorka №"..musorka, wwx, wwy, -1)
 

fokichevskiy

Известный
478
247
Вот код крч попроще сделал

код:
for i=0, 2024 do
    if sampIs3dTextDefined(i) then
        local text2, color2, posX2, posY2, posZ2, distance2, ignoreWalls2, player2, vehicle2 = sampGet3dTextInfoById(i)
        local musorka = text2:find("Мусорка: №(%d+)")
        local x, y, z = getCharCoordinates(PLAYER_PED)
        local wX, wY = convert3DCoordsToScreen(x,y,z)
        local wwx, wwy = convert3DCoordsToScreen(posX2, posY2, posZ2)
        renderDrawLine(wX, wY, wwx, wwy, 3, 0xFFD00000)
        --local dist = string.format("%.1f", getDistanceBetweenCoords3d(x,y,z, posX2, posY2, posZ2))
        renderFontDrawText(font, "musorka №"..musorka, wwx, wwy, -1)
    end
end

Ошибка выходит: .lua:89: attempt to concatenate local 'musorka' (a nil value)
Строка 89 это renderFontDrawText(font, "musorka №"..musorka, wwx, wwy, -1)
у тебя переменная musorka в себе ничего не имеет
 

MLycoris

На вид оружие массового семяизвержения
Проверенный
1,981
2,190
Вот код крч попроще сделал

Ошибка выходит: .lua:89: attempt to concatenate local 'musorka' (a nil value)
Строка 89 это renderFontDrawText(font, "musorka №"..musorka, wwx, wwy, -1)
если тебе нужно что то записать в переменную, а не просто совпадение найти, то используй match вместо find
local trashNumber = text:gsub("{......}",""):match("Мусорка: №(%d+)")

далее делаешь проверку, что переменная чему-то равна и там уже свои условия итого должно получится так
Lua:
for i = 0, 2048 do
            if sampIs3dTextDefined(i) then
                local text, color, posX, posY, posZ, distance, ignoreWalls, playerId, vehicleId = sampGet3dTextInfoById(i)
                local trashNumber = text:gsub("{......}",""):match("Мусорка: №(%d+)")
                if trashNumber  then
                    local x, y, z = getCharCoordinates(PLAYER_PED)
                    local wX, wY = convert3DCoordsToScreen(x,y,z)
                    local wwx, wwy = convert3DCoordsToScreen(posX, posY, posZ)
                    renderDrawLine(wX, wY, wwx, wwy, 3, 0xFFD00000)
                    --local dist = string.format("%.1f", getDistanceBetweenCoords3d(x,y,z, posX, posY, posZ))
                    renderFontDrawText(font, "musorka №"..musorka, wwx, wwy, -1)
                end
            end
        end

а вообще если ты просто хочешь увеличить дальность прорисовки 3д текста, то вроде как такое тоже норм работает
Lua:
local sampev = require('lib.samp.events')

function sampev.onCreate3DText(id, color, position, distance, testLOS, attachedPlayerId, attachedVehicleId, text)
    local trashCheck = text:gsub("{......}",""):match("Мусорка.+")
    return {id, color, position, trashCheck and 500 or distance, testLOS, attachedPlayerId, attachedVehicleId, text}
end
 
Последнее редактирование:
  • Нравится
Реакции: Maxim25012