-
Posts
4,005 -
Joined
-
Last visited
-
Days Won
184
Everything posted by Lord Henry
-
Seria mais fácil vc ter deixado uma print das duas "imagens" que vc quer posicionar na frente ou atrás. Para colocar uma delas na frente, use guiBringToFront e na outra use guiMoveToBack para movê-la para trás, assim como o @DNL291 sugeriu. MAS, mesmo que a outra imagem (elemento GUI) esteja atrás, se você clicar nele, ele vai para frente e você provavelmente não quer isso. Você quer manter uma na frente da outra independente de onde clicar. Para evitar isso, use guiSetEnabled (false) na imagem que deve permanecer atrás. Dessa forma ele não virá pra frente ao ser clicado. Se não funcionar, vc pode usar a função onClientGUIClick, que é executada sempre que um elemento GUI for clicado, coloque a função de guiMoveToBack na imagem que deve estar sempre atrás, então quando vc clicar ele vai sempre colocar ela de volta para trás. Neste exemplo, a imagem de error.png sempre ficará atrás. Independente de onde eu clicar. imagem1 = guiCreateStaticImage (0.5, 0.5, 0.05, 0.08, "info.png", true) imagem2 = guiCreateStaticImage (0.52, 0.52, 0.05, 0.08, "error.png", true) guiBringToFront (imagem1) guiSetEnabled (imagem2, false) showCursor (true) Mas neste exemplo, em vez de eu mover a imagem de error para trás, movi a imagem de info para frente, apenas para ficar na frente da imagem de error.
-
Já tentou com GetPedOccupiedVehicleSeat?
-
I was not asking your "formula", only if you use or not that function. Is it hard to answer yes or no? By the way, I already know how to use the dummies, my system use them to get the light positions.
-
Ta ae o vídeo: Mais detalhes estão no comentário fixado do vídeo.
-
Problemas MTA
Lord Henry replied to Alexandre4597's topic in Ajudas relacionadas ao MTA:SA (Cliente/Servidor)
@OrNoT, favor não reviver tópicos antigos. Crie um novo tópico com seu problema específico. -
onClientPlayerTarget
-
Vc pode simplesmente somar a posição X de onde o veículo vai nascer + 2. local x, y, z = getElementPosition (source) x = x+2 ... ...
-
Eu fiz um resource de fome/sede/sono que funciona assim. As barras aparecem em DX. O preço e tipo de alimento que é carregado depende do pickup (que também pode ser uma bebida). O sono é o mais simples, basta usar /dormir, dai o personagem faz animação de dormindo e começa a recarregar o sono aos poucos. Se quiserem, posso fazer um vídeo mostrando como funciona.
-
Vi que você alterou o exemplo que mandei. Acho que seria mais fácil não usar botões em menus. Bastaria usar N para comprar o alimento que está no pickup. E vc está usando isso: addEventHandler ( "onClientGUIClick", Botao1, comida1, false ) Só vai funcionar para o Botao1. Pois a função só é ativada no Botao1. E você está criando o painel por meio de comando, isso dará erro se você tentar executar o painel sem ter criado ele. Na verdade usar comandos para criar painéis é um dos piores jeitos e nada otimizado. Você deve criar o painel ao iniciar o resource (onClientResourceStart), e logo em seguida deixá-lo invisível (guiSetVisible). Então na função que faz o painel aparecer, basta torná-lo visível novamente. Se você cria um painel por comando, você provavelmente vai precisar de outro comando para destruí-lo, sendo que é mais fácil apenas ocultá-lo.
-
Hum... função muito pesada pra usar. Em vez de procurar por camas, deixarei o jogador dormir em qualquer lugar, desde que esteja em interiores específicos.
- 6 replies
-
- getpedcontactelement
- onclientclick
-
(and 1 more)
Tagged with:
-
[AJUDA] Scripts de gangue, grupo, polica com dinheiro do jogo
Lord Henry replied to [L]ost's topic in Programação em Lua
@R1S1NG, você já fez isso diversas vezes. Não estou querendo ser desagradável, mas peço que não reviva os tópicos antigos. Se quer ajuda, favor crie seu tópico na área relacionada e iremos lhe ajudar. Agradeço a compreensão. -
Então, mas aqui não é SAMP. A sistemática lá e programação são diferentes. Até mesmo a edição de mapas é diferente. Quanto ir salvando a posição onde está o objeto é justamente oq eu não quero fazer, pois daria um trabalho infinito fazer isso em cada interior. Sabendo que são mais de 150 interiores diferentes. Eu preciso obter as posições desses objetos automaticamente para fazer o script funcionar.
- 6 replies
-
- getpedcontactelement
- onclientclick
-
(and 1 more)
Tagged with:
-
Olá senhores. Estou querendo evitar o trabalho de mapear milhares de camas e sofás pelos interiores do GTA. Para isso preciso de alguma função que detecte a presença da cama (Objeto com tal ID) próxima ao jogador. Mas todas as funções que tentei não funcionam com objetos nativos do mapa, só com objetos criados por scripts, o que não me adianta nada. Já tentei fazer isso com onClientClick que consegue obter o elemento clicado, mas não funcionou para objetos de cenário. Tentei também getPedTarget, que também só conseguiu obter elementos criados por scripts, não consegue obter elementos de cenário. E por último tentei getPedContactElement, que detecta o elemento que o jogador está em contato, mas novamente não funciona para elementos de cenário. Já até pensei em criar uma esfera de colisão ao redor do jogador para detectar os elementos que estiverem colidindo nela, mas sei que não iria detectar os objetos do cenário. Alguma ideia do que fazer? Ou realmente terei que fazer manualmente 1 por 1?
- 6 replies
-
- getpedcontactelement
- onclientclick
-
(and 1 more)
Tagged with:
-
[Closed]
-
Você poderia usar o mesmo timePM para a resposta também, já que é o mesmo período de espera e também é considerado outra mensagem enviada. Já que o objetivo é impedir o Spam. Não vejo necessidade de um timer para responder e outro timer para mandar mensagens. Se você gosta de um código perfeito, sugiro que corrija a indentação da linha 75 no else. E a última função não está indentada, apenas espaçada.
-
No exemplo que eu dei, ele já faz isso quando vc aperta a tecla N em cima do marker. Ele desconta $10 do jogador.
-
De nada, estamos aqui para ajudar.
-
Estou vendo aqui, que o resource calcula a fome somente com base no tamanho da barra de fome e não salva esse valor em lugar nenhum. Se o resource for reiniciado ou o jogador reconectar no servidor, ele volta ao 100%. Além disso, pelo que entendi do código, ele come automaticamente o hamburger ao encostar no marker, e recarrega de graça toda a fome. Mas você quer q seja necessário apertar a tecla N depois que entrou no marker para comprar o lanche. Na última função do markerHit (client.lua), delete a função e cole isso tudo: function recarregaFome (key, state) if (getHungerState (localPlayer) < 60) then if getPlayerMoney () >= 10 then setHungerState (localPlayer,100) outputChatBox ("Você pagou $10 pelo hamburger.",255,255,0,false) outputChatBox ("Você está alimentado :D",0,255,0,false) triggerServerEvent ("take10money", localPlayer) -- Executa a função no server.lua else outputChatBox ("Você não tem dinheiro suficiente!",255,0,0,false) end else outputChatBox ("Você não está com fome!",255,0,0,false) end end addEventHandler ("onClientMarkerHit",getRootElement(), function(hitEle,dim) if (localPlayer == hitEle) and (getElementData (source,"HAMBURGUER!") == true) then bindKey ("n", "down", recarregaFome) guiSetVisible (windowMessage, true) -- Mostra a mensagem GUI que já foi criada antes. end end) addEventHandler ("onClientMarkerLeave",getRootElement(), function(leaveEle,dim) if (localPlayer == leaveEle) and (getElementData (source,"HAMBURGUER!") == true) then unbindKey ("n", "down", recarregaFome) guiSetVisible (windowMessage, false) -- Oculta a mensagem GUI. end end) Para fazer o jogador pagar, você deve fazer isso server-side, pois tirar dinheiro do jogador client-side não vai dar certo, já que vai tirar uma "grana falsa" e ele vai continuar com a mesma quantidade no servidor. Para isso, crie um script server.lua, declare-o no meta.xml e coloque isso no server.lua: function pagarHamburger () takePlayerMoney (client, 10) end addEvent ("take10money", true) addEventHandler ("take10money", getRootElement(), pagarHamburger) Declaração no meta.xml: <script src="server.lua" type="server"/> Para criar a mensagem GUI, informando para apertar a tecla N para comprar o hamburger, volte ao início do script client.lua, no começo da primeira função e crie o painel GUI com a mensagem lá, bem no início da função do onClientResourceStart. Coloque isso lá: windowMessage = guiCreateWindow (0.0260,0.6,0.1828,0.08, "Lanchonete", true) message = guiCreateLabel (0.05,0.5,1,1,"Pressione 'N' para comprar hamburger.",true, windowMessage) guiSetVisible (windowMessage, false)
-
Dai depende do seu objetivo. Você quer fazer um painel mais bonito ou mais leve? (leve me refiro a código mais simples e fácil) Se vc quer fazer um painel bonito, sem se importar com performance nem manutenção, dai não há problema em fazer painel DX para interação. A vantagem do painel DX, é que ele é criado a cada Frame (diferente do GUI, que vc cria 1 vez e ele fica na tela), isso significa que é muito mais fácil colocar efeitos de movimento e animações em painéis DX e realmente, existem painéis DX com efeitos muito bonitos e não tão pesados, que passam realmente a impressão de um sistema mais profissional. Por se tratar tudo de funções client-side, não há qualquer problema de performance para outros jogadores do servidor que não estão com o painel aberto. Mas como eu falei anteriormente, os painéis DX são muito mais complexos de se fazer manutenção, uma vez que todos os seus elementos são totalmente configuráveis, nada é automático. (a GUI, já vem com o layout pronto) Se vc quer mudar a posição de um "botão" DX, você deve reconfigurar sua "área clicável", pois o elemento DX não é um botão (o botão GUI é um elemento clicável por padrão, então basta mover o botão e sua área clicável vai se mover junto). Vou refazer todo o exemplo anterior de GUI para DX. Note que os elementos DX não são relativos, isso significa que eles só aceitam tamanhos e posições em pixels. (os elementos GUI aceitam tanto posições relativas quanto posições por pixel, dá pra fazer gambiarra pra usar posição relativa em DX, mas isso é complexo demais e não quero lhe confundir ainda mais) function criarPainel () local screenX, screenY = guiGetScreenSize () -- Recebe a resolução atual do jogador. (no meu caso: screenX = 1366 e screenY = 768) ----------------- EXECUTA A JANELA NA TELA ------------------------------------------------------------------ local fonteInterativa = "default" local alphaInterativo = 150 function renderDx () dxDrawRectangle (screenX/2-140, screenY/2-80, 280, 160, tocolor (0, 0, 0, 150)) -- Cria o retângulo maior, que será a janela principal. To color (Red, Green, Blue, Alpha) determina sua cor e transparência. dxDrawRectangle (screenX/2-135, screenY/2-75, 270, 20, tocolor (0, 0, 0, 150)) -- Cria o retângulo do título da janela principal. dxDrawText ("Janela Qualquer", screenX/2-135, screenY/2-75, screenX/2+135, screenY/2-55, tocolor (255, 255, 255, 255), 1, "default-bold", "center", "center") -- Cria o título da janela principal dxDrawText ("Texto de informação qualquer aqui.\nOutra linha de informação aqui.", screenX/2-130, screenY/2-40, screenX/2+130, screenY/2, tocolor (255, 255, 255, 255), 1) end function renderButton () dxDrawRectangle (0, screenY/2, 30, 30, tocolor (0, 0, 0, alphaInterativo)) dxDrawText (">>", 0, screenY/2, 30, screenY/2+30, tocolor (255, 255, 255, 255), 1, fonteInterativa, "center", "center") end addEventHandler ("onClientRender", getRootElement(), renderButton) -- Começa a renderizar esse botão assim q inicia o resource. Chamando essa função a cada frame. ----------- MOSTRA/OCULTA A JANELA (clicando no botão da tela) ---------------------------------------- function mostraPainel (button, state, posX, posY, worldX, worldY, worldZ) if button == "left" and state == "up" then if (posX >= 0) and (posX <= 30) and (posY >= screenY/2) and (posY <= screenY/2+30) then -- Se a posição clicada na tela estiver dentro do retângulo >> então: if not isVisible then addEventHandler ("onClientRender", getRootElement(), renderDx) -- Começa a renderizar o painel DX na tela. Chamando a função renderDx a cada frame. else removeEventHandler ("onClientRender", getRootElement(), renderDx) -- Para de renderizar o painel DX na tela. theCursor () -- Executa a função de mostrar/ocultar o cursor. end isVisible = not isVisible -- Alterna entre visivel/invisivel a cada vez que clicar no botão. end end end addEventHandler ("onClientClick", getRootElement(), mostraPainel) -- Executa a função mostraPainel ao clicar em qualquer lugar da tela. --------------- ALTERNA A FONTE DO BOTÃO (passando o cursor em cima do botão)------------------------------- function mouseOnButton (x, y, pixelX, pixelY, worldX, worldY, worldZ) if (pixelX >= 0) and (pixelX <= 30) and (pixelY >= screenY/2) and (pixelY <= screenY/2+30) then -- Se o cursor estiver em cima do botão >> então: fonteInterativa = "default-bold" alphaInterativo = 255 else -- Faz o texto do botão >> ficar em negrito e seu retângulo opaco, enquanto o cursor estiver em cima dele e volta ao normal se não estiver. fonteInterativa = "default" alphaInterativo = 150 end end addEventHandler ("onClientCursorMove", getRootElement(), mouseOnButton) -- Executa a função mouseOnButton toda vez que o cursor se movimenta. -------------- EVITAR BUG ----------------------------------------------------------------------------- function theCursor () -- Por algum motivo, o cursor mostrado pelo T, ou Y ou F8 não funciona na função onClientClick. Então mostra/oculta o cursor pressionando Z. if not cursorVisible then showCursor (true) else showCursor (false) end cursorVisible = not cursorVisible end bindKey ("z", "down", theCursor) end addEventHandler ("onClientResourceStart", getRootElement(), criarPainel) -- Faz isso tudo ao iniciar o resource no jogador.
-
Cara, a inteface DX não é recomendável para criar botões, a principal função dela é mostrar informações em tempo real (que devem ser atualizadas o tempo todo), para interfaces onde o usuário vai interagir (clicar, digitar, etc) é utilizada a interface nativa GUI. Mas respondendo a sua pergunta, quando vc clica na tela, é possível obter a coordenada X, Y da tela onde foi clicado. Sabendo disso, é possível determinar qual "botão" deve ser ativado. Para isso, usa-se OnClientGUIClick (que apesar de ser usado mais em GUI, funciona para DX também)
-
Ah bom. Só criar o botão que vai ficar aparecendo sempre na tela e não ocultar ele ao iniciar o resource. Faça assim: function criarPainel () local screenX, screenY = guiGetScreenSize () -- Recebe a resolução atual do jogador. (no meu caso: screenX = 1366 e screenY = 768) ----------------- CRIA A JANELA ------------------------------------------------------------------ janelaPrincipal = guiCreateWindow (0.4, 0.4, 0.2, 0.2, "Janela Qualquer", true) -- Cria a janela. mensagem = guiCreateLabel (0.05, 0.2, 1, 0.2, "Texto de informação qualquer aqui.\nOutra linha de informação aqui.", true, janelaPrincipal) -- Cria o texto na janela. guiSetVisible (janelaPrincipal, false) -- Oculta a janela depois dela ser criada, para que ela não apareça ao iniciar o resource. botaoGeral = guiCreateButton (0, screenY/2, 30, 30, ">>", false) -- Cria o botão na tela. ----------- MOSTRA/OCULTA A JANELA (clicando no botão da tela) ---------------------------------------- function mostraPainel (button, state) if button == "left" then if not isVisible then guiSetVisible (janelaPrincipal, true) -- Torna o painel visivel. showCursor (true) -- Mostra o cursor na tela. else guiSetVisible (janelaPrincipal, false) -- Torna o painel invisivel. showCursor (false) -- Oculta o cursor da tela. end isVisible = not isVisible -- Alterna entre visivel/invisivel a cada vez que clicar no botão. end end addEventHandler ("onClientGUIClick", botaoGeral, mostraPainel, false) -- Executa a função mostraPainel ao clicar no botao >> end addEventHandler ("onClientResourceStart", getRootElement(), criarPainel) -- Faz isso tudo ao iniciar o resource no jogador. Obs: Para conseguir clicar no botão da tela, vc pode usar a tecla T ou o F8 (pra mostrar o cursor).
-
Qual o resource em questão? Qual tecla será usada para abrir esse painel GUI? Isso deve funcionar em qualquer lugar? Ou somente em lugares específicos? (dentro de lanchonetes por exemplo) Você chegou a abrir o código do resource para estudar como ele funciona? (Se o resource estiver compilado, você não tem permissão para alterá-lo)