Gaimo Posted February 24, 2020 Share Posted February 24, 2020 Estou fazendo um mod de barbearia, tudo está funcionando, mas precisa dos ajustes finais, não sei como fazer para cobrar o corte, funcionamento atual do mod: O jogador só consegue entrar se estiver com a skin do CJ, caso contrário recebe uma mensagem informando o mesmo. Ao entrar na barbearia o painel já fica disponivel segue a imagem: Spoiler Ao clicar nas setas ele pode alternar entre os cortes, mas quando ele sai do estabelecimento, ele permanece com o corte e o painel obviamente some. O que eu preciso é dar utilidade para a tesoura, no caso ela seria quem iria confirmar o corte e cobrar, mas não sei bem como fazer isso, vou mostrar o código atual e o que eu penso em fazer, aceito criticas e sugestões. Client-Side: local screenW, screenH = guiGetScreenSize() function draw() dxDrawImage((screenW - 400) / 2, (screenH - 200) / 2, 100, 100, "img/arrow.png", 0, 0, 0, tocolor(255, 255, 255, 255), false) -- Button Left dxDrawImage((screenW + 200) / 2, (screenH - 200) / 2, 100, 100, "img/arrow.png", 180, 0, 0, tocolor(255, 255, 255, 255), false) -- Button Right dxDrawImage((screenW - 100) / 2, (screenH + 200) / 2, 100, 100, "img/scissors.png", 0, 0, 0, tocolor(255, 255, 255, 255), false) -- Button Confim end -- ignore essa função function isCursorOnElement( posX, posY, width, height ) if isCursorShowing( ) then local mouseX, mouseY = getCursorPosition( ) local clientW, clientH = guiGetScreenSize( ) local mouseX, mouseY = mouseX * clientW, mouseY * clientH if ( mouseX > posX and mouseX < ( posX + width ) and mouseY > posY and mouseY < ( posY + height ) ) then return true end end return false end function barbershop(status) if not type(status) == "boolean" then return false end if status then -- timer para esperar a animação de fade que acontece com a camera setTimer ( function() addEventHandler("onClientRender", root, draw) end, 700, 1 ) addEventHandler ( "onClientClick", getRootElement(), function(_,state) if state == "down" then if isCursorOnElement((screenW - 400) / 2, (screenH - 200) / 2, 80, 80) then triggerServerEvent ( "haircut", resourceRoot, localPlayer, "left" ) elseif isCursorOnElement((screenW + 200) / 2, (screenH - 200) / 2, 80, 80) then triggerServerEvent ( "haircut", resourceRoot, localPlayer, "right" ) elseif isCursorOnElement((screenW - 100) / 2, (screenH + 200) / 2, 80, 80) then triggerServerEvent ( "haircut", resourceRoot, localPlayer, "confirm" ) end end end) elseif status == false then removeEventHandler("onClientRender", root, draw) end end addEvent( "showPanel", true ) addEventHandler( "showPanel", localPlayer, barbershop) Server-side: -- Posição dos markers markers = { [1] = {createMarker(2070.85, -1793.88147, 13.54688-0.92, "cylinder", 1, 0, 200, 200, 160)}, -- Entrada Reece's Barbershop [2] = {createMarker(411.59732, -23, 1001.80469-0.90, "cylinder", 1, 0, 200,200,0)}, -- Saida Reece's Barbershop } setElementInterior(markers[2][1], 2) -- Seta o interior do marker de saída createBlipAttachedTo(markers[1][1], 7) -- Blip na entrada Reece's Barbershop. -- Transição do mundo para o interior function teleportPlayer(playerSource, int, x, y , z, r) fadeCamera(playerSource, false, 0.5) setTimer(fadeCamera, 500, 1, playerSource, true, 1) setCameraTarget( playerSource, playerSource ) setTimer(setElementInterior, 500, 1, playerSource, int, x, y , z) setTimer(setElementRotation, 500, 1, playerSource, 0, 0, r) end -- Quando o jogador entra no marker function hitarMarker(marker, dim) if dim and not isPedInVehicle(source) then if getElementModel(source) ~= 0 then outputChatBox("#ff3b3b[ERRO] #ffffffCorte somente para a skin do CJ", source, 255, 255, 255, true) return end if marker == markers[1][1] then -- Se for o marker de entrada outputChatBox("Bem-vindo ao Reece's Barbershop", source, 127,255,212, true) teleportPlayer(source, 2, 411.61981, -22.34467, 1001.80469 , 0) triggerClientEvent(source, "showPanel", source, true) elseif marker == markers[2][1] then -- Se for o marker de saída. teleportPlayer(source, 0, 2071.88013, -1793.78210, 13.54688, -90) triggerClientEvent(source, "showPanel", source, false) end end end addEventHandler("onPlayerMarkerHit", getRootElement(), hitarMarker) haircuts = { -- Textura, Modelo [1] = {"player_face", "head"}, [2] = {"hairblond", "head"}, [3] = {"hairred", "head"}, [4] = {"hairblue", "head"}, [5] = {"hairgreen", "head"}, [6] = {"hairpink", "head"}, [7] = {"bald", "head"}, [8] = {"baldbeard", "head"}, [9] = {"baldtash", "head"}, [10] = {"baldgoatee", "head"}, [11] = {"highfade", "head"}, } local valorAtual = 1 -- Tem algum problema ficar aqui?? Se outros player forem cortar o cabelo qual vai ser o valor?? function haircut (playerSource, status) if status == "left" then valorAtual = valorAtual - 1 if valorAtual == 0 then valorAtual = #haircuts end addPedClothes(playerSource, haircuts[valorAtual][1], "head", 1) end if status == "right" then valorAtual = valorAtual + 1 if valorAtual >= #haircuts then valorAtual = 1 end addPedClothes(playerSource, haircuts[valorAtual][1], "head", 1) end end addEvent( "haircut", true ) addEventHandler( "haircut", resourceRoot, haircut ) A primeira dúvida é a váriavel valorAtual ela está fora da função haircut e é serverside, se um jogador alterar o valor dela, vai alterar o valor da váriavel (valorAtual) de todos? Como estou pensando em fazer para cobrar o jogador, criar uma váriavel paid, quando o jogador entrar no marker de entrada, salvar o corte atual dele, e quando ele sair verificar se paid é == true se for mantem o corte se não volta para o que foi salvo quando ele entrou, seria isso? Alguma sugestão? Link to comment
[M]ister Posted February 24, 2020 Share Posted February 24, 2020 1 hour ago, Gaimo said: A primeira dúvida é a váriavel valorAtual ela está fora da função haircut e é serverside, se um jogador alterar o valor dela, vai alterar o valor da váriavel (valorAtual) de todos? Como estou pensando em fazer para cobrar o jogador, criar uma váriavel paid, quando o jogador entrar no marker de entrada, salvar o corte atual dele, e quando ele sair verificar se paid é == true se for mantem o corte se não volta para o que foi salvo quando ele entrou, seria isso? Alguma sugestão? 1. Sim, faça no lado cliente, mantenha server side apenas o addPedClothes, getPlayerMoney e takePlayerMoney 2. Acho ok... mas seria bom ao menos informar o valor do corte ao jogador. E deve-se também atualizar o "corte atual" após cada compra com sucesso. 1 Link to comment
Gaimo Posted February 29, 2020 Author Share Posted February 29, 2020 Estou com um problema, quando o jogador sai e entra meio que dobra a função, estou suspeitando que é o evento onClientClick acho que ele está sendo criado infinitamente, vou mostrar os script e descrever melhor o problema. Quando o jogador entra no marker abre o painel, ele clica para escolher algum lado, esquerda ou direita, troca o corte e exibe no outputchatbox o valor da variavel valorAtual, que tem como utilidade selecionar o corte na table haircuts, ele sai do estabelecimento e retorna, quando ele aperta para algum dos lados sai 2 outputchatbox e assim vai aumentado conforme ele vai saindo e entrando, exemplo: Entrou uma vez valorAtual = 1 Entrou pela segunda vez valorAtual = 1 valorAtual = 2 Ele repete o valorAtual da anterior e cria um novo, se ele deixou no corte 8 e entrou novamente vai aparecer o 8 e o 1 valorAtual = 8 valorAtual = 1 ( esse eh o que eh aplicado) mas da uns bug depois de entrar umas 4 vzs ou mais pq ele troca varias vezes mt rapido de corte. Minha suspeita esta no client-side esta marcado para facilitar. Server-side: -- Posição dos markers markers = { [1] = {createMarker(2070.85, -1793.88147, 13.54688-0.92, "cylinder", 1, 0, 200, 200, 160)}, -- Entrada Reece's Barbershop [2] = {createMarker(411.59732, -23, 1001.80469-0.90, "cylinder", 1, 0, 200,200,0)}, -- Saida Reece's Barbershop } setElementInterior(markers[2][1], 2) -- Seta o interior do marker de saída createBlipAttachedTo(markers[1][1], 7) -- Blip na entrada Reece's Barbershop. -- Transição do mundo para o interior function teleportPlayer(playerSource, int, x, y , z, r) fadeCamera(playerSource, false, 0.5) setTimer(fadeCamera, 500, 1, playerSource, true, 1) setCameraTarget( playerSource, playerSource ) setTimer(setElementInterior, 500, 1, playerSource, int, x, y , z) setTimer(setElementRotation, 500, 1, playerSource, 0, 0, r) end -- Salva o corte de cabelo do player na conta. function saveCut (playerSource, model, texture) account = getPlayerAccount(playerSource) setAccountData(account, "1_model", model) setAccountData(account, "1_texture", texture) end -- Quando o jogador entra no marker function hitarMarker(marker, dim) if dim and not isPedInVehicle(source) then if getElementModel(source) ~= 0 then outputChatBox("#ff3b3b[ERRO] #ffffffCorte somente para a skin do CJ", source, 255, 255, 255, true) return end if marker == markers[1][1] then -- Se for o marker de entrada local model, texture = getPedClothes(source, 1) -- Pega o corte atual do player quando entrou no marker saveCut(source, model, texture) -- Salva o corte que o jogador entrou outputChatBox("Bem-vindo ao Reece's Barbershop", source, 127,255,212, true) -- Envia a mensagem teleportPlayer(source, 2, 411.61981, -22.34467, 1001.80469 , 0) -- Teleporta o jogador. triggerClientEvent(source, "showPanel", source, true) -- Abre o painel. elseif marker == markers[2][1] then -- Se for o marker de saída. account = getPlayerAccount(source) -- Pega a conta do jogador local model = getAccountData(account, "1_model") local texture = getAccountData(account, "1_texture") addPedClothes(source, model, texture, 1) -- Era pra adicionar o corte que está salvo na conta do player. teleportPlayer(source, 0, 2071.88013, -1793.78210, 13.54688, -90) triggerClientEvent(source, "showPanel", source, false) end end end addEventHandler("onPlayerMarkerHit", getRootElement(), hitarMarker) haircuts = { -- Textura, Modelo [1] = {"player_face", "head"}, [2] = {"hairblond", "head"}, [3] = {"hairred", "head"}, [4] = {"hairblue", "head"}, [5] = {"hairgreen", "head"}, [6] = {"hairpink", "head"}, [7] = {"bald", "head"}, [8] = {"baldbeard", "head"}, [9] = {"baldtash", "head"}, [10] = {"baldgoatee", "head"}, [11] = {"highfade", "head"}, } function haircut (playerSource, status, valorAtual) if status == "left" then outputChatBox("valorAtualL = "..valorAtual) addPedClothes(playerSource, haircuts[valorAtual][1], "head", 1) end if status == "right" then outputChatBox("valorAtualR = "..valorAtual) addPedClothes(playerSource, haircuts[valorAtual][1], "head", 1) end if status == "confirm" then local model, texture getPedClothes(playerSource, 1) if getPlayerMoney(playerSource) >= 25 then takePlayerMoney(playerSource, 25) saveCut(playerSource, model, texture) outputChatBox("Compra realizada com sucesso.") else outputChatBox("[ERRO] Você não tem dinheiro suficiente!" ) end end end addEvent( "haircut", true ) addEventHandler( "haircut", resourceRoot, haircut ) Client-side: local screenW, screenH = guiGetScreenSize() local valorAtual = 1 function draw() dxDrawImage((screenW - 400) / 2, (screenH - 200) / 2, 100, 100, "img/arrow.png", 0, 0, 0, tocolor(255, 255, 255, 255), false) -- Button Left dxDrawImage((screenW + 200) / 2, (screenH - 200) / 2, 100, 100, "img/arrow.png", 180, 0, 0, tocolor(255, 255, 255, 255), false) -- Button Right dxDrawImage((screenW - 100) / 2, (screenH + 200) / 2, 100, 100, "img/scissors.png", 0, 0, 0, tocolor(255, 255, 255, 255), false) -- Button Confim dxDrawText("Custo: R$ 25,00", (screenW - 200) / 2, (screenH + 230) / 2, ((screenW - 200) / 2) + 200, ( (screenH - 40) / 2) + 40, tocolor(45, 199, 29, 255), 1.00, "pricedown", "center", "center", false, false, false, false, false) end function isCursorOnElement( posX, posY, width, height ) if isCursorShowing( ) then local mouseX, mouseY = getCursorPosition( ) local clientW, clientH = guiGetScreenSize( ) local mouseX, mouseY = mouseX * clientW, mouseY * clientH if ( mouseX > posX and mouseX < ( posX + width ) and mouseY > posY and mouseY < ( posY + height ) ) then return true end end return false end function barbershop(status) if not type(status) == "boolean" then return false end if status then local sizeTable = 11 setTimer ( function() addEventHandler("onClientRender", root, draw) end, 1000, 1 ) -- ESTOU SUSPEITANDO DISSO AQUI ----------------------------------------- addEventHandler ( "onClientClick", getRootElement(), function(_,state) if state == "down" then if isCursorOnElement((screenW - 400) / 2, (screenH - 200) / 2, 80, 80) then valorAtual = valorAtual - 1 if valorAtual <= 0 then valorAtual = sizeTable end triggerServerEvent ( "haircut", resourceRoot, localPlayer, "left", valorAtual) elseif isCursorOnElement((screenW + 200) / 2, (screenH - 200) / 2, 80, 80) then valorAtual = valorAtual + 1 if valorAtual >= sizeTable then valorAtual = 1 end triggerServerEvent ( "haircut", resourceRoot, localPlayer, "right", valorAtual) elseif isCursorOnElement((screenW - 100) / 2, (screenH + 200) / 2, 80, 80) then triggerServerEvent ( "haircut", resourceRoot, localPlayer, "confirm" ) end end end) -------------------------------------------------------------------------------------------------------- elseif status == false then removeEventHandler("onClientRender", root, draw) end end addEvent( "showPanel", true ) addEventHandler( "showPanel", localPlayer, barbershop) Link to comment
Developer. Posted March 2, 2020 Share Posted March 2, 2020 @Gaimo bom isto acontece porque a sua variável valorAtual não reseta. Onde esta status == false após o then coloque "valorAtual = 1", que assim sempre que o painel for fechado ira atribuir-se o valor 1 a esta variável. Link to comment
Gaimo Posted March 2, 2020 Author Share Posted March 2, 2020 Esse não é o problema, o que acontece é que ele repete a função várias vezes conforme entra e sai, exemplo: Tem um outputchatbox, que informa em qual corte ele está, quando ele sai e entra em vez de aparecer apenas um está saindo dois, e assim vai repetindo quantas vezes ele sai e entra, se ele entrar e sair 10 vezes, vai trocar de cabelo bem rápido 10 vezes e vai sair 10 outputchatbox, sendo que era pra sair apenas um e trocar uma vez de cabelo. Testei o que você disse mas não funcionou. Encontrei o problema, era onde eu estava suspeitando, transformei em uma função e adicionei um removeEventHandler, estava criando um novo sempre que o player entrava. function panel(_,state) if state == "down" then if isCursorOnElement((screenW - 400) / 2, (screenH - 200) / 2, 80, 80) then valorAtual = valorAtual - 1 if valorAtual <= 0 then valorAtual = sizeTable end triggerServerEvent ( "haircut", resourceRoot, localPlayer, "left", valorAtual) elseif isCursorOnElement((screenW + 200) / 2, (screenH - 200) / 2, 80, 80) then valorAtual = valorAtual + 1 if valorAtual >= sizeTable then valorAtual = 1 end triggerServerEvent ( "haircut", resourceRoot, localPlayer, "right", valorAtual) elseif isCursorOnElement((screenW - 100) / 2, (screenH + 200) / 2, 80, 80) then triggerServerEvent ( "haircut", resourceRoot, localPlayer, "confirm" ) end end end addEventHandler ( "onClientClick", getRootElement(), panel) Link to comment
Popular Post Gaimo Posted March 2, 2020 Author Popular Post Share Posted March 2, 2020 MOD finalizado com sucesso, até então sem BUGS, pelo menos pelo que eu testei hahaha, Segue o link para download: Download Algumas imagens do MOD 3 1 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