Doongogar Posted March 24, 2023 Share Posted March 24, 2023 Então estou fazendo esse codigo que cria um texto em todos os objetos do modelo 1491 que é uma porta, no caso o código e pra trancar/destrancar portas, a parte de trancar e destrancar foi bem facil e esta funcionando, porém eu tentei criar o texto com a função útil: dxDrawTextOnElement no entanto eu gostaria de rodar o texto no onClientRender para atualizar caso o jogador tranque/destranque apareça em tempo real se ta trancada ou não mas o texto não esta sendo criado, não apresenta erros, só não cria, gostaria de uma ajuda com isso, também acho que da pra tirar o evento onClientRender e vincular um evento no código de trancar/destrancar para só atualizar quando trancar/destrancar ao invez de frame a frame para deixar mais liso, se puderem ajudar com isso também. Nota: tirei o ultimo argumento da função dxDrawTextOnElement, porque é opcional e eu não estou usando, caso não puder fazer isso avise, mas antes de eu tirar também não estava funcionando. function TextoPortas() for i, portas in ipairs(getElementsByType("object")) do if getElementModel(portas) == 1491 then if isElementFrozen(portas) then dxDrawTextOnElement(portas, "#FF0000[E] #FFFFFFPara Abrir", 0, 0, 5, 255, 255, 255, 255, 1.1, "default-bold") else dxDrawTextOnElement(portas, "#FF0000[E] #FFFFFFPara Fechar", 0, 0, 5, 255, 255, 255, 255, 1.1, "default-bold") end end end end addEventHandler("onClientRender", root, TextoPortas) function dxDrawTextOnElement(TheElement,text,height,distance,R,G,B,alpha,size,font) local x, y, z = getElementPosition(TheElement) local x2, y2, z2 = getCameraMatrix() local distance = distance or 20 local height = height or 1 if (isLineOfSightClear(x, y, z+2, x2, y2, z2)) then local sx, sy = getScreenFromWorldPosition(x, y, z+height) if(sx) and (sy) then local distanceBetweenPoints = getDistanceBetweenPoints3D(x, y, z, x2, y2, z2) if(distanceBetweenPoints < distance) then dxDrawText(text, sx+2, sy+2, sx, sy, tocolor(R or 255, G or 255, B or 255, alpha or 255), (size or 1)-(distanceBetweenPoints / distance), font or "arial", "center", "center") end end end end Link to comment
Other Languages Moderators Lord Henry Posted March 25, 2023 Other Languages Moderators Share Posted March 25, 2023 (edited) Mesmo copiando o código-fonte da função útil dxDrawTextOnElement, você fez questão de mudar a indentação dela para deixar errada, por qual motivo? (todas as variáveis locais tem +4 espaços) O texto não aparece pois está atravessando a porta. A função útil tem uma condição de que o texto só aparece se não tiver nada entre o texto e a câmera. Remova essa condição e o texto sempre aparecerá mesmo estando dentro da porta. Se quer usar código de cores no texto, você precisará fazer um upgrade na função útil para incluir o parâmetro colorCoded no dxDrawText. Tente algo assim: theObj = createObject (1491, 2487, -1666, 12.3) -- Cria uma porta dinâmica na Grove Street. bindKey("e", "down", function() setElementFrozen(theObj, not isElementFrozen(theObj)) -- Congela/descongela essa porta específica ao apertar a tecla E. end) function TextoPortas() for i, portas in ipairs(getElementsByType("object")) do if getElementModel(portas) == 1491 then if isElementFrozen(portas) then dxDrawTextOnElement(portas, "#FF8000[E] #FFFFFFPara Abrir", 1, 6, tocolor(255, 255, 255, 255), 3.1, "default-bold", "center", "center", false, false, false, true) else dxDrawTextOnElement(portas, "#FF8000[E] #FFFFFFPara Fechar", 1, 6, tocolor(255, 255, 255, 255), 3.1, "default-bold", "center", "center", false, false, false, true) end end end end addEventHandler("onClientRender", root, TextoPortas) function dxDrawTextOnElement(theElement, text, height, distance, color, size, font, alignX, alignY, clip, wordBreak, postGUI, colorCoded) local x, y, z = getElementPosition(theElement) local x2, y2, z2 = getCameraMatrix() local distance = distance or 20 local height = height or 1 -- if (isLineOfSightClear(x, y, z+2, x2, y2, z2)) then -- Oculta o texto se tiver algo entre ele e a câmera. local sx, sy = getScreenFromWorldPosition(x, y, z+height) if sx and sy then local distanceBetweenPoints = getDistanceBetweenPoints3D(x, y, z, x2, y2, z2) if distanceBetweenPoints < distance then dxDrawText(text, sx+2, sy+2, sx, sy, color or 0xFFFFFFFF, (size or 1)-(distanceBetweenPoints / distance), font or "arial", alignX or "center", alignY or "center", clip or false, wordBreak or false, postGUI or false, colorCoded or false) end end -- end end Edited March 25, 2023 by Lord Henry 1 Link to comment
Doongogar Posted March 25, 2023 Author Share Posted March 25, 2023 obrigado lord, desculpa acabar com a indentação do código, e que eu sou burro mesmo, eu gostaria de saber como eu faço para alterar a posição do texto no eixo X, eu tentei adicionar um argumento na função util dxDrawTextOnElement, porém como o objeto nesse caso é visto como um 3D na função se alterar o eixo X, o texto começa a sair do objeto, existe alguma forma de mudar o texto de posição em relação ao objeto e não em relação ao centro do objeto visto como 3D? Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now