-
Posts
3,875 -
Joined
-
Days Won
67
Everything posted by DNL291
-
danblemes1 Quando houver um problema no script use /debugscript 3 e mostre o erro. Claro que nesse caso o erro está claro como já foi mostrado. Só estranhei o fato de você não ter mostrado primeiro erro (da função getPlayerFromPartialName) e mais outra vez não falar do erro no debug. Você tá usando mesmo o /debugscript 3 pra ver os erros? Sobre o take/givePlayerMoney é bem óbvio o problema ali, eu te pergunto: aonde ali que está o valor de 30? Se você ler a sintaxe verá que deve ser assim: takePlayerMoney (theClient, 30) givePlayerMoney (thePlayer, 30) Note que troquei playerName por theClient. playerName é uma string - o texto recebido do comando; theClient é o elemento, o qual deve ser passado nas funções takePlayerMoney e givePlayerMoney. Além disso também deve ser verificado se o jogador possui o valor de "30 reais" assim como você fez ali em cima, no comando /uber. E também faça a verificação se o 'theClient' é mesmo um jogador existente. Tente isto: function aceitar (thePlayer, commandName, playerName) local account = getAccountName (getPlayerAccount(thePlayer)) if isObjectInACLGroup ("user."..account, aclGetGroup ("UBER")) then if not playerName then return outputChatBox( "Erro: digite o nome do passageiro!", thePlayer, 230, 0, 0 ) end local theClient = getPlayerFromPartialName (playerName) if theClient then local money = getPlayerMoney (theClient) if (money < 30) then return outputChatBox( "Erro: esse passageiro não tem a quantia necessária!", thePlayer, 230, 0, 0 ) end if blip[theClient] and isElement (blip[theClient]) then destroyElement (blip[theClient]) blip[theClient] = nil end takePlayerMoney (theClient, 30) givePlayerMoney (thePlayer, 30) else outputChatBox( "Erro: jogador não encontrado!", thePlayer, 230, 0, 0 ) end end end addCommandHandler ("aceitar", aceitar)
-
Sim é lado client. Leia: https://wiki.multitheftauto.com/wiki/PT-BR/Introdução_ao_Scripting
-
Sim, adicione ela no código e faça o teste. Lembre-se de deixar o debug ativado.
-
Sim, mas dependendo do funcionamento do script você pode encurtar seu código. Rota2_Vermelha no caso é uma marker também, certo? Seria assim: function Start_Bus(hitElement, md) if getElementType( hitElement ) == "vehicle" and md and getElementType((getVehicleController(hitElement) or "")) == "player" then local thePlayer = getVehicleController(hitElement) if source == Rota1_Vermelha then setElementVisibleTo( Rota1_Vermelha, thePlayer, false ) setElementVisibleTo( Rota1_Blip, thePlayer, false ) setElementVisibleTo( Rota2_Vermelha, thePlayer, true ) setElementVisibleTo( Rota2_Blip, thePlayer, true ) toggleAllControls ( thePlayer, false ) setControlState ( thePlayer, "handbrake", true ) setTimer(function(player) toggleAllControls ( player, true ) setControlState ( player, "handbrake", false ) end, 5000, 1, thePlayer) elseif source == Rota2_Vermelha then -- [seu código] end end end addEventHandler("onMarkerHit", resourceRoot, Start_Bus)
-
-- server-side "onPlayerLogin" triggerClientEvent -- client-side addEvent addEventHandler guiSetVisible showCursor
-
Da próxima vez por favor crie seu post em Portuguese / Português > Programação em Lua E evite postagens duplas com o mesmo assunto. Sobre o seu problema: A condição está totalmente errada. Para fazer essa verificação, você vai precisar de um loop nos slots das armas (0-12) e verificar se a função retorna o ID da arma.
-
if getPedWeapon (thePlayer) and getPedWeapon (thePlayer) ~= 0 then outputChatBox("Tem arma!") else outputChatBox("Não tem arma") end Tente usar essa verificação.
-
Tente o seguinte: function Start_Bus(hitElement, md) if getElementType( hitElement ) == "vehicle" and md and getElementType((getVehicleController(hitElement) or "")) == "player" then local thePlayer = getVehicleController(hitElement) setElementVisibleTo( Rota1_Vermelha, thePlayer, false ) setElementVisibleTo( Rota1_Blip, thePlayer, false ) setElementVisibleTo( Rota2_Vermelha, thePlayer, true ) setElementVisibleTo( Rota2_Blip, thePlayer, true ) toggleAllControls ( thePlayer, false ) setControlState ( thePlayer, "handbrake", true ) setTimer(function(player) toggleAllControls ( player, true ) setControlState ( player, "handbrake", false ) end, 5000, 1, thePlayer) end end addEventHandler("onMarkerHit", Rota1_Vermelha, Start_Bus)
-
Como já foi mostrado o código, para fechar você vai precisar do evento "onClientClick" e desta função: https://wiki.multitheftauto.com/wiki/IsMouseInPosition Nos argumentos você passa as podições x, y, largura e altura da área de detecção do clique. Pesquisando pelo fórum você vai encontrar alguns tópicos com esse mesmo assunto e entender melhor. Aqui está um tópico que pode te ajudar também:
-
removeEventHandler("onClientRender", root, Dx) -> removeEventHandler
-
Assumindo que o código da função getPlayerFromPartialName não estava no seu código, você deveria ter recebido um aviso no debug do tipo: "atempt to call global getPlayerFromPartialName". Isso porque essa função não faz parte do MTA, ela deve ser criada no seu próprio código. Então certifique-se que esta função esteja dentro do seu código: 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
-
Sim, o timer é no lado server e esses eventos também: "onVehicleExplode" "onVehicleExit" "onVehicleEnter" "onPlayerWasted" Faça dentro desse código que eu postei: Tente fazer e mostre aqui o código. No setTimer, use este no lugar: setTimer( function(p) if not ( isElement( veh6[p] ) ) then return end if getVehicleController( veh6[p] ) ~= p then outputChatBox ( "Voçê Nao entrou no veiculo a tempo mission failed", p, 255, 255, 255, true ) destroyElement ( veh6[p] ) veh6[p] = nil end end, 5000, 1, client ) Te recomendo também adicionar ele numa tabela do jogador já que o evento onVehicleExit terá um resetTimer.
-
Um erro no lado server do meu último código foi o uso do evento "onClientVehicleExplode". Agora sobre o seu código: Só faltou entender o porque eu usei o timer e o evento do veículo no lado server. Parece que você só olhou meu código mas fez tudo do seu jeito talvez pra evitar de reescrever parte do seu código. Passe isso pro lado server. Mostre seu código, vai ser bem mais fácil. Ele te "mostrar" e você copiar e testar não vai resolver nada e você também não vai aprender nada.
-
Pelo que você mesmo disse, thePlayer é o que digitou o comando para aceitar (o "Uber") e playerName o solicitante. O que mais você deve fazer no código é verificar se o jogador que digitou o comando é mesmo da ACL "UBER".
-
O problema no seu primeiro código além do uso incorreto da condição que já foi falado é o getElementData que deve receber 'player' em vez de 'source'. Tente: function blockVehicleEnter(player, seat, jacked) if seat == 0 and getElementModel(source) == 437 and not (getElementData( player, "Emprego" )) or getElementData( player, "Emprego" ) ~= "Motorista de Onibus" then cancelEvent() exports.Scripts_Dxmessages:outputDx(player, "Esse Veiculo é Exclusivo dos Motoristas de Onibus!", "error") end end addEventHandler("onVehicleStartEnter", getRootElement(), blockVehicleEnter)
-
As localizações junto com a variável i devem ser no lado client; assim como o blip e as markers. No lado server é só o veículo como já foi dito (give/takePlayerMoney também caso você use). Edit: esse seu código aqui tem um 'end' a mais: Fora isso também tem a variável "Trabalho", você pode trocar por um setElementData e setar no jogador; e remove ou seta nil quando ele não tiver mais no trabalho. Eu editei aqui como seria o código, só não testei. Aqui está (Leia comentário na parte do setTimer ?) : Client local localitionveh6 = { [1] = {401, 213.33366, 1871.35400, 13.14063, 0, 0, 270}, [2] = {401, 213.33366, 1871.35400, 13.14063, 0, 0, 270}, [3] = {401, 213.33366, 1871.35400, 13.14063, 0, 0, 270}, [4] = {401, 213.33366, 1871.35400, 13.14063, 0, 0, 270}, [5] = {401, 213.33366, 1871.35400, 13.14063, 0, 0, 270}, } local i = 1 function createPlayerLocation() local vx ,vy, vz, vrot = localitionveh6[ i ][ 2 ], localitionveh6[ i ][ 3 ], localitionveh6[ i ][ 4 ], localitionveh6[ i ][ 7 ] i = i + 1 if i > #localitionveh6 then i = 1 end triggerServerEvent( "iniciaJob6", localPlayer, vx, vy, vz, vrot ) end Server local veh6 = {} function inicio6 ( vx, vy, vz, vrot ) if client ~= source then return end -- cheater detected! if isElement (veh6[client]) then destroyElement (veh6[client]) end setElementData( client, "Trabalho", true, false ) -- seta o jogador no element-data "Trabalho"; sinc com o client desativada veh6[client] = createVehicle ( 401, vx, vy, vz, 0, 0, vrot ) outputChatBox ("#ffff00Drive the vehicle to the checkpoint. Note: You cannot leave the car during the mission.", client, 0, 0, 0, true) local counter = 0 setTimer( function(p) if not ( isElement( veh6[p] ) ) then return end --[[ Acho que aqui o correto é verificar se quem está no veículo é o jogador que tá no trabalho; Então seria assim: if getVehicleController(veh6[p]) == p then outputChatBox ( "Voçê esta no Vehicle", p, 255, 255, 255, true ) else [....] ]] for seat, player in pairs (getVehicleOccupants(veh6[p])) do counter = counter + 1 end if counter > 0 then outputChatBox ( "Voçê esta no Vehicle", p, 255, 255, 255, true ) else outputChatBox ( "Voçê Nao entrou no veiculo a tempo mission failed", p, 255, 255, 255, true ) destroyElement (veh6[p]) veh6[p] = nil end counter = 0 end, 1000, 1, client ) local player = client addEventHandler ( "onClientVehicleExplode", veh6[player], function () destroyElement (source) veh6[player] = nil takePlayerMoney ( player, 5000 ) outputChatBox("Mission failed, your veh6icle blew up.", player , 255, 0, 0) end) end addEvent ("iniciaJob6", true) addEventHandler ("iniciaJob6", getRootElement(), inicio6) Não fiz muita coisa no client porque você não mostrou todo o código.
-
O erro do "??" parece ser um bug do fórum, quando copia o código aparece símbolos extras. Justamente isso é o que está gerando a mensagem do debug @kevincouto6.
-
trabalho mecanico reparar de perto alguem ajuda?
DNL291 replied to josias samp's topic in Programação em Lua
Cadê o código e o que está errado? -
A questão é você saber quando deve usar trigger e quando deve usar element-data. Na verdade set/getElementData é para o armazenamento no elemento, mas há ocasiões em que você pode usar o evento onClientElementDataChange (ou onElementDataChange) pra fazer um tipo de detecção entre os dois lados. O triggerClient/ServerEvent foi feito já pra isso, você chama um evento criado no outro lado, e dentro desse evento você faz um tipo de callback que retornará o valor (claro que um callback na programação não tem nada a ver com isso; usei no sentido de receber a chamada com um atraso).
-
Isso é o que já falei várias vezes aqui, às vezes precisa ser no lado client que é o ideal para o que vai fazer e vai livrar dessas 'dores de cabeça'. Mas ele prefere fazer do jeito dele em vez de avançar; desse jeito vai aprender de uma forma bem lenta (se eu me lembro bem ele já tá há um tempão pra fazer esses códigos).
-
procuro solução para uso de memoria em programação OOP.
DNL291 replied to Gw8's topic in Programação em Lua
Como você sabe que o problema está no uso de memória? Você chegou a fazer uma analise no código usando o performanceBrowser? É difícil de sabermos o que há de errado sem ter acesso ao código, mas o que posso dizer é que dependendo do que tiver rodando dentro de um onClientRender/PreRender pode afetar a performance do script a ponto de interromper a jogabilidade (como o network trouble que você mencionou). O acumulo de memória por conta de um código mal otimizado pode estar causando isso, embora também possa não ser essa a causa. Bom, antes de tudo, tenha certeza que todo o código esteja limpo e funcionando sem que dê problemas. Faça uma depuração, use o performanceBrowser como eu citei e aprenda a fazer os códigos de uma forma mais eficiente: https://springrts.com/wiki/Lua_Performance -
If I understood it correctly, you can use a table with the ranks as key and the rank color in their value: local ranksColor = { ["Sinour"] = "#f5dd42Sinour", ["Juniour"] = "#f59b42Juniour" } So, try this: local ranksColor = { ["Sinour"] = "#f5dd42Sinour", ["Juniour"] = "#f59b42Juniour" } -- to keep the the default text color you set local oTextColor = RGBToHex(0, 128, 192) or "#ffffff" outputChatBox("|SWAT| ["..(ranksColor[Rank] or "nil") .. oTextColor .."] #00ff00" .. getPlayerName ( source ) .. " #0000FF:#ffFFff " .. text, getRootElement(), 0, 128, 192, true ) -- wiki.multitheftauto.com/wiki/RGBToHex function RGBToHex(red, green, blue, alpha) -- Make sure RGB values passed to this function are correct if( ( red < 0 or red > 255 or green < 0 or green > 255 or blue < 0 or blue > 255 ) or ( alpha and ( alpha < 0 or alpha > 255 ) ) ) then return nil end -- Alpha check if alpha then return string.format("#%.2X%.2X%.2X%.2X", red, green, blue, alpha) else return string.format("#%.2X%.2X%.2X", red, green, blue) end end
-
@danblemes1 Seria melhor você criar só 1 tópico pra um assunto, senão fica o mesmo código em outros tópicos. Sobre o seu problema, acho que que deve usar primeiro código que o OverKILL postou e depois mostrar o elemento para o elemento-alvo, tente: function pedir (splayer) local players = getElementsByType ("player") local blip = createBlipAttachedTo (splayer, 62) setElementVisibleTo (blip, root, false) -- oculta o blip para todos elementos for _, driver in ipairs (players) do local account = getAccountName (getPlayerAccount(driver)) if isObjectInACLGroup ("user."..account, aclGetGroup ("UBER")) then setElementVisibleTo (blip, driver, true) -- mostra o blip para todos do grupo "UBER" end end end addCommandHandler ("uber", pedir)
-
Sem problemas hehe