-
Posts
3,983 -
Joined
-
Last visited
-
Days Won
181
Everything posted by Lord Henry
-
Poste o script aqui para que possamos ver o que está errado. Se não quiser publicar o código, envie por Privado. Use a ferramenta <> do fórum para postar códigos.
-
A parte do código que vc me mostrou está aparecendo só pra 1 jogador. Os scripts das missões vc nem mostrou.
-
Você precisa especificar qual o problema que vc está tendo para editar este resource. O que vc não está conseguindo exatamente? Só dizer que não está conseguindo criar uma barra é muito amplo. Você pode simplesmente copiar as outras barras, mudar o nome, posição e cor e o tempo que leva para abaixar os valores. Eu fiz um resource que faz isso. Mas ele é pago. https://prnt.sc/jtnzss
-
Esse seu triggerClientEvent não está especificando pra qual client ativar o evento mission. Sendo assim, ele está ativando em todos os clients. Outra coisa: Você não pode usar nomes iguais para eventos que não são iguais. Um evento chamado no lado client não é igual a um evento chamado no lado server. Essa função mission3 está sendo chamada pelo client usando um evento chamado mission, mas o mesmo evento está chamando outra função no client. Sugiro que troque o "mission" que ativa a função por "iniciaJob3", seguindo a lógica dos demais eventos e especificando o client como ativador, já que a função mission3 está sendo chamada por um client. server: --mission 3-- function mission3 () triggerClientEvent (client, "mission", client) -- Em qual client ativará este evento, "nome do evento", qual será o elemento ativador do evento. end addEvent ("iniciaJob3", true) addEventHandler ("iniciaJob3", getRootElement(), mission3) client: addEventHandler ("onClientGUIClick", getRootElement(), function (button, state, absoluteX, absoluteY) local me = not guiGetVisible (windowMission) if button ~= "left" then return end -- Faz com que os botões só funcionem se forem clicados com o botão esquerdo do mouse. if (source == ExitButton) then guiSetVisible (windowMission, me) showCursor (me) elseif (source == FistButton) then triggerServerEvent ("iniciaJob", localPlayer) guiSetVisible (windowMission, false) showCursor (false) elseif (source == SecondButton) then triggerServerEvent ("iniciaJob2", localPlayer) guiSetVisible (windowMission, false) showCursor (false) elseif (source == ThirdButton) then triggerServerEvent ("iniciaJob3", localPlayer) guiSetVisible (windowMission, false) showCursor (false) elseif (source == FourthButton) then triggerServerEvent ("iniciaJob4", localPlayer) guiSetVisible (windowMission, false) showCursor (false) end end) outro client: (parte do final) function startZedMission () -- Não foi declarado nenhum parâmetro de função no triggerClientEvent deste evento. Então aqui deve permanecer vazio. outputChatBox ("Your Get Mission") addEventHandler ("onClientPedWasted", getRootElement(), ZedMissionCheckKill) addEventHandler ("onClientRender", getRootElement(), createText) end addEvent ("mission", true) addEventHandler ("mission", getRootElement(), startZedMission)
-
Poste o código server-side, fazendo favor.
-
Seria melhor baixar da comunidade oficial em vez de sites de terceiros. Muitos scripts postados em sites de terceiros foram roubados da comunidade oficial. (os meus resources, por exemplo). Na comunidade você não precisa se preocupar com propagandas.
-
Aleatório não vai funcionar, ele tem grandes chances de repetir a mesma posição. Indexe a tabela das posições e use um contador incremental de 1 até #localitionveh, a posição a ser usada deve ser localitionveh[contador] e sempre que ele for usado, aumentará em +1, dessa forma a próxima vez que for usado, usará a posição seguinte da tabela sem chances de repetir. Quando o contador ficar maior que o tamanho da tabela (5), volta a 1 e reinicia o ciclo. Mfim = createMarker (-1828.72888, -1627.62219, 23.23001 -1, "cylinder", 2, 0 ,255 ,0, 255) Bfim = createBlipAttachedTo ( Mfim, 19 ) setElementVisibleTo ( Bfim, root, false ) veh = {} -- Recomendo que evite posições decimais muito grandes. Use só até 3 casas decimais. localitionveh = { [1] = {493, -615.03826904297, 1807.0825195313, 0.19021162390709, 0, 0, 76.391845703125}, [2] = {493, -2375.00317, 1741.60583, 0.36448, 0, 0, 76.391845703125}, [3] = {493, -2297.87598, 1644.67639, 0.61662, 0, 0, 76.391845703125}, [4] = {493, -2280.10376, 1577.25720, -0.03525, 0, 0, 76.391845703125}, [5] = {493, -2208.14648, 1486.88440, 0.68383, 0, 0, 76.391845703125}, -- O primeiro, quinto e sexto valor das posições não estão sendo usados. Recomendo que delete-os. } i = 1 -- contador global function inicio () if isElement (veh[client]) then -- Client = localPlayer, somente neste caso. destroyElement (veh[client]) veh[client] = nil end local vx vy, vz, vrot = localitionveh[ i ][ 2 ], localitionveh[ i ][ 3 ], localitionveh[ i ][ 4 ], localitionveh[ i ][ 7 ] i = i + 1 if i > #localitionveh then -- se i > 5, então: i = 1 end Trabalho = true veh4[client] = createVehicle ( 514, vx, vy, vz, 0, 0, vrot ) setElementVisibleTo (Bfim, client, true) warpPedIntoVehicle (client, veh[client]) outputChatBox ("#ffff00Take this Flag Card without leaving the vehicle!", client, 0, 0, 0, true) local player1 = client addEventHandler ( "onVehicleExplode", veh[client], function () if (veh[player1]) and isElement(veh[player1]) then destroyElement (source) setElementVisibleTo ( Bfim, player1, false ) outputChatBox("Mission failled, your vehicle blow.", player1 , 255, 0, 0) end end) end addEvent ("iniciaJob", true) -- Cria o evento "iniciaJob e permite que ele seja chamado pelo client. addEventHandler ("iniciaJob", getRootElement(), inicio) -- Executa essa função quando o evento "iniciaJob" for chamado.
-
Recomenda-se anular a variável após destruir o elemento dela. Para desocupar o espaço na memória. function destrui () if veh[source] and isElement(veh[source]) then destroyElement ( veh[source] ) veh[source] = nil end end
-
Geralmente os painéis devem ser criados ao iniciar o resource e logo em seguida deixá-los invisíveis. Dessa forma as funções que mostram/ocultam o painel nunca darão erro por falta de painel, pois ele sempre existirá. (No caso de painéis DX, basta iniciar/parar de renderizá-los, já que eles são recriados a cada frame.) No seu caso você só cria o painel após a função de criação ser chamada pelo server. Mas o que pode acontecer é o server chamar a função de mostrar o painel antes disso. E aí que ocorre o problema, ele vai tentar mostrar algo que não foi criado ainda. Além disso, tenha em mente que os triggerEvents precisam de certo tempo para serem concluídos, diferente de uma chamada interna de função que ocorre instantaneamente. Isso significa que se você der triggerClientEvent na função que cria o painel ao mesmo tempo que usa triggerClientEvent na função que mostra o painel, ele não terá tempo de criar o painel antes de mostrá-lo, gerando erro pois o painel ainda não existe.
-
Você deve fazer isso que o @MaligNos disse, é o mais fácil e recomendável. Outra forma de fazer seria você colocar o localPlayer como parâmetro de função no triggerServerEvent e declará-lo nos parâmetros da função server-side. client-side triggerServerEvent ("reloadWeapon", localPlayer, localPlayer) server-side addEvent ("reloadWeapon", true) addEventHandler ("reloadWeapon", root, function (thePlayer) local cw = getPedWeapon (thePlayer) local d = weapons[cw] if (cw) and (d) and (takePlayerMoney (thePlayer, d.cost)) then setWeaponAmmo (thePlayer, cw, d.ammo) end end)
-
PROBLEMA NO MTA?
Lord Henry replied to C4mpN~'s topic in Ajudas relacionadas ao MTA:SA (Cliente/Servidor)
A mensagem está dizendo que há problemas nos arquivos do seu GTA SA e não no MTA. Reinstale o GTA SA, se não funcionar então é vírus corrompendo seu GTA. Lembre-se de remover qualquer mod do seu GTA ou arquivos que executam os mods (modloader.asi). -
Só uma pequena correção: Se a função só possui 1 comando ativando ela. Não precisa verificar se o cmd = "consertar", pois isso sempre será true. Deixei comentários no código pra vc entender o que acontece em cada linha. Fazer isso é importante para estudar seu código. function solicitaPay (thePlayer, cmd, user) local accName = getAccountName (getPlayerAccount(thePlayer)) -- accName = nome da conta do jogador que executou o comando. (Exemplo: joao123) if isObjectInACLGroup ("user."..accName, aclGetGroup ("MEC") ) then -- Se o objeto user.joao123 está na ACL Group MEC, então: if not user then -- Se nenhum nick foi informado junto com o comando, então: outputChatBox ("Erro de sintaxe, use /consertar <nick>", thePlayer, 255, 255, 0) elseif not getPlayerFromPartialName (user) then -- Se o nick foi informado mas não existe um jogador com esse nick, então: outputChatBox ("Jogador não encontrado.", thePlayer, 255, 255, 0) else -- Se o nick foi informado e o jogador foi encontrado, então: local theUser = getPlayerFromPartialName (user) -- theUser = jogador encontrado. (elemento) if getElementData (theUser, "mecanico.solicitation") then -- Se o jogador encontrado tem uma solicitação pendente, então: outputChatBox ("Alguém já está solicitando pagamento mecânico a este jogador.", thePlayer, 255, 255, 0) else -- Se o jogador encontrado não tem nenhuma solicitação pendente, então: setElementData (theUser, "mecanico.solicitation", thePlayer) -- Coloca solicitação pendente no jogador encontrado. outputChatBox ("Você solicitou pagamento para consertar o veículo de "..user, thePlayer, 0, 255, 0, true) -- Avisa o jogador que executou o comando, que ele enviou uma solicitação ao jogador encontrado. outputChatBox (getPlayerName (thePlayer).."#FFFF00 está pedindo $800 para consertar seu veículo. Use /aceitar ou /recusar", theUser, 255, 255, 255, true) -- Avisa o jogador encontrado que ele tem uma solicitação de pagamento, para que ele use /aceitar ou /recusar. setTimer (function () -- Inicia um temporizador de 10 segundos para remover automaticamente a solicitação, caso o jogador não recuse nem aceite, para ele não ficar com a solicitação eternamente. if getElementData (theUser, "mecanico.solicitation") then -- Depois dos 10 segundos, se o jogador ainda estiver com a solicitação (não recusou nem aceitou) setElementData (theUser, "mecanico.solicitation", false) -- Remove a solicitação dele. outputChatBox ("O pedido de pagamento de "..getPlayerName (thePlayer).."#FFFF00 expirou.", theUser, 255, 255, 0, true) -- Avisa pra ele, que a solicitação que ele tinha pendente foi expirada. end end, 10000, 1) end end else -- Se o objeto user.joao123 não está na ACL MEC, então: outputChatBox ("Você não tem permissão para executar este comando!", thePlayer, 255, 0, 0) -- Avisa o jogador que ele não tem permissão. end end addCommandHandler ("consertar", solicitaPay) -- Comando que irá ativar a função solicitaPay. Sugiro também que vc estude lógica de programação, assim você saberá onde deve colocar as funções que passamos pra você e também terá extrema facilidade de entender o que vc está fazendo.
-
Nessa parte function fix (playerSource) local theVehicle = getPedOccupiedVehicle (playerSource) if theVehicle and getVehicleController ( theVehicle ) == playerSource then fixVehicle (theVehicle) outputChatBox ("Your vehicle has been fixed !" , thePlayer) end end addCommandHandler ("fix" , fix) Substitua por isso: local theVehicle = getPedOccupiedVehicle (thePlayer) if theVehicle and getVehicleController (theVehicle) == thePlayer then fixVehicle (theVehicle) outputChatBox ("Seu veículo foi consertado.", thePlayer, 0, 255, 0) end Você deve tirar aquele outro outputChatBox que eu coloquei na minha parte, serão irá mandar 2x no chat. Delete essa linha que fica em baixo do setElementData: outputChatBox ("Seu veículo foi consertado.", thePlayer, 0, 255, 0)
-
Use a ferramenta <> para postar códigos. https://prnt.sc/jp4g81
-
Eu faria mais ou menos assim: function getPlayerFromPartialName (name) local name = name and name:gsub("#%x%x%x%x%x%x", ""):lower() or nil if name then for _, player in ipairs(getElementsByType("player")) do local name_ = getPlayerName(player):gsub("#%x%x%x%x%x%x", ""):lower() if name_:find(name, 1, true) then return player end end end end function solicitaPay (thePlayer, cmd, user) if not user then outputChatBox ("Erro de sintaxe, use /consertar <nick>", thePlayer, 255, 255, 0) elseif not getPlayerFromPartialName (user) then outputChatBox ("Jogador não encontrado.", thePlayer, 255, 255, 0) else local theUser = getPlayerFromPartialName (user) if getElementData (theUser, "mecanico.solicitation") then outputChatBox ("Alguém já está solicitando pagamento mecânico a este jogador.", thePlayer, 255, 255, 0) else setElementData (theUser, "mecanico.solicitation", thePlayer) outputChatBox ("Você solicitou pagamento para consertar o veículo de "..user, thePlayer, 0, 255, 0, true) outputChatBox (getPlayerName (thePlayer).."#FFFF00 está pedindo $800 para consertar seu veículo. Use /aceitar ou /recusar", theUser, 255, 255, 255, true) setTimer (function () if getElementData (theUser, "mecanico.solicitation") then setElementData (theUser, "mecanico.solicitation", false) outputChatBox ("O pedido de pagamento de "..getPlayerName (thePlayer).."#FFFF00 expirou.", theUser, 255, 255, 0, true) end end, 10000, 1) end end end addCommandHandler ("consertar", solicitaPay) function aceitaPay (thePlayer, cmd) if getElementData (thePlayer, "mecanico.solicitation") then if getPlayerMoney (thePlayer) >= 800 then takePlayerMoney (thePlayer, 800) givePlayerMoney (getElementData (thePlayer, "mecanico.solicitation"), 800) outputChatBox ("Seu pedido foi aceito. Você recebeu $800 pelo conserto.", getElementData (thePlayer, "mecanico.solicitation"), 0, 255, 0) -- Função que repara o veículo aqui. setElementData (thePlayer, "mecanico.solicitation", false) outputChatBox ("Seu veículo foi consertado.", thePlayer, 0, 255, 0) else outputChatBox ("Você não tem dinheiro suficiente.", thePlayer, 255, 0, 0) end end end addCommandHandler ("aceitar", aceitaPay) function recusaPay (thePlayer, cmd) if getElementData (thePlayer, "mecanico.solicitation") then outputChatBox ("Seu pedido foi recusado.", getElementData (thePlayer, "mecanico.solicitation"), 255, 0, 0) setElementData (thePlayer, "mecanico.solicitation", false) outputChatBox ("Você recusou o pagamento. Seu veículo não foi consertado.", thePlayer, 255, 0, 0) end end addCommandHandler ("recusar", recusaPay) Espero ter ajudado.
-
Qual a dificuldade que vcs estão encontrando? Qual parte exatamente vcs não sabem fazer?
-
E quem disse que só funciona em Ped? Vc chegou a testar? Se tivesse pelo menos lido o exemplo, teria visto que funciona em Player também.
-
Pq vc não respondeu minha pergunta?
-
Adicione uma condição que verifica se vehicle existe ou não. if vehicle and getElementType(vehicle) == "vehicle" then
- 1 reply
-
- 2
-
A função PlayerNameTags não existe. Delete essa linha.
- 1 reply
-
- 1
-
Já tentou usar getPedWeapon?
-
A linha 5 está dando um alerta pois o evento está sendo ativado quando ele já está ativo. Pois falta um removeEventHandler quando o jogador sai da zona verde. addEventHandler ("disableGodMode", getRootElement(), function() removeEventHandler ("onClientPlayerDamage", getRootElement(), cancelEventEvent) end) E a função cancelEventEvent não existe. Ou então você não mostrou a parte do código que ela aparece. ------------------------ Nem tudo que colide nas zonas é uma entidade válida. Adicione um verificador antes da condição, para ver se o que colidiu é um elemento. if isElement (hitElement) and (getElementType (hitElement) == "player") and (getElementID (source) == "greenzoneColshape") then Obs: Existe um jeito mais fácil e mais leve de criar zonas verdes sem o uso de zonas de colisão. Usando apenas isInsideRadarArea para verificar se o jogador que está recebendo dano está dentro da zona ou não. Se estiver, cancela o dano e pronto.
-
Não coloque títulos muito grandes no seu post. Seja breve com uma pequena frase. No texto do post dai vc explica com mais detalhes o seu problema. Se continuar postando os tópicos dessa forma, irei ignorar da próxima vez. ------------------------------ Na linha 87. Sempre vai gerar erro se o jogador não tiver a data "FPS". Use um tostring ( ) antes para converter o valor booleano em string. dxDrawText (tostring (getElementData(getLocalPlayer(),"FPS")), posx2-12, posy2-6, x, y, tocolor ( 255, 255, 255, 255 ), 1.4, "default-bold") Você não deveria armazenar o FPS nem o PING como playerData, pois são valores que se alteram a cada frame. Sua performance será prejudicada se ficar usando setElementData e getElementData a cada frame. Em vez disso, use getCurrentFPS e getPlayerPing, armazene-os em variáveis locais e use no dxDrawText, usando sempre um tostring para caso os valores sejam false.