main Posted April 8, 2018 Share Posted April 8, 2018 function onPlayerCommand(command) if command == "msg" then cancelEvent() outputChatBox("Use o comando /pm em vez deste comando", source, 255, 0, 0) playSoundFrontEnd(source, 40) end end addEventHandler("onPlayerCommand", root, onPlayerCommand) local blockPM = {} local replyPM = {} local timePM = {} local timeReply = {} function privateMessage(player, command, target, ...) local target = getPlayerFromPartialName(target) if timePM[player] then local tempo = math.floor(getTimerDetails(timePM[player])/1000) outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFEspere "..tempo.." segundos para enviar outra mensagem", player, 255, 255, 255, true) playSoundFrontEnd(player, 40) return end if blockPM[target] then outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFEste jogador bloqueou o recebimento de mensagens", player, 255, 255, 255, true) playSoundFrontEnd(player, 40) return end if target == player then outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFVocê não pode enviar mensagem para si mesmo", player, 255, 255, 255, true) playSoundFrontEnd(player, 40) return end local text = table.concat({...}, " ") if text ~= "" then if isElement(target) then outputChatBox("#0080FF[PM] recebida de #FFFFFF"..getPlayerName(player).."#FFFFFF: "..text, target, 255, 255, 255, true) outputChatBox("#0080FF[PM] para #FFFFFF"..getPlayerName(target).."#FFFFFF: "..text, player, 255, 255, 255, true) replyPM[player] = target replyPM[target] = player triggerClientEvent(target, "playNotifyPM", resourceRoot) timePM[player] = setTimer(function() timePM[player] = false end, 3000, 1, player) else outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFO jogador especificado não foi encontrado", player, 255, 255, 255, true) end else outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFSYNTAX: /pm <jogador> <mensagem>", player, 255, 255, 255, true) end end addCommandHandler("pm", privateMessage) function replyMessage(player, command, ...) local target = replyPM[player] if timeReply[player] then local tempo = math.floor(getTimerDetails(timeReply[player])/1000) outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFEspere "..tempo.." segundos para responder outra mensagem", player, 255, 255, 255, true) playSoundFrontEnd(player, 40) return end if blockPM[target] then outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFEste jogador bloqueou o recebimento de mensagens", player, 255, 255, 255, true) playSoundFrontEnd(player, 40) return end local text = table.concat({...}, " ") if text ~= "" then if isElement(target) then outputChatBox("#0080FF[PM] recebida de #FFFFFF"..getPlayerName(player).."#FFFFFF: "..text, target, 255, 255, 255, true) outputChatBox("#0080FF[PM] para #FFFFFF"..getPlayerName(target).."#FFFFFF: "..text, player, 255, 255, 255, true) triggerClientEvent(target, "playNotifyPM", resourceRoot) timeReply[player] = setTimer(function() timeReply[player] = false end, 3000, 1, player) else outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFVocê ainda não recebeu mensagem de ninguém", player, 255, 255, 255, true) end else outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFSYNTAX: /re <mensagem>", player, 255, 255, 255, true) end end addCommandHandler("re", replyMessage) function blockPrivateMessage(player) if not blockPM[player] then blockPM[player] = true outputChatBox("#0080FF[PM] #FFFFFFVocê bloqueou o recebimento de mensagens", player, 255, 255, 255, true) playSoundFrontEnd(player, 1) else blockPM[player] = false outputChatBox("#0080FF[PM] #FFFFFFVocê desbloqueou o recebimento de mensagens", player, 255, 255, 255, true) playSoundFrontEnd(player, 40) end end addCommandHandler("blockpm", blockPrivateMessage) function onPlayerQuit() if blockPM[source] then blockPM[source] = nil elseif replyPM[source] then replyPM[source] = nil elseif timePM[source] then timePM[source] = nil end end addEventHandler("onPlayerQuit", root, onPlayerQuit) 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 Olá pessoal, hoje eu fiz um sistema de mensagem privada, gostaria de saber se tem algo que eu possa otimizar para melhor fluir do script, desde já agradeço. Link to comment
Other Languages Moderators Lord Henry Posted April 8, 2018 Other Languages Moderators Share Posted April 8, 2018 (edited) 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. Edited April 8, 2018 by Lord Henry 1 Link to comment
main Posted April 8, 2018 Author Share Posted April 8, 2018 2 hours ago, Lord Henry said: 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. Obrigado @Lord Henry pelas dicas. Link to comment
Gw8 Posted April 9, 2018 Share Posted April 9, 2018 function onPlayerCommand(command) if command == "msg" then cancelEvent() outputChatBox("Use o comando /pm em vez deste comando",source,255,0,0) playSoundFrontEnd(source,40) end end addEventHandler("onPlayerCommand",root,onPlayerCommand) privateMessage = { players = {}, getPlayer = function(playerPart) local pl = getPlayerFromName(playerPart) if isElement(pl) then return pl else for i,v in ipairs(getElementsByType("player")) do if (string.find(getPlayerName(v):lower(),playerPart:lower())) then return v elseif (string.find(string.gsub(getPlayerName(v),"#%x%x%x%x%x%x",""):lower(),playerPart:lower())) then return v end end end end, start = function(player) privateMessage.players[player] = { delay = false, replyPlayer = false, blockPlayer = {} } end, stop = function(player) privateMessage.players[player] = nil end, send = function(player,cmd,toPlayer,...) local pmMessage = nil for k,v in pairs({...}) do if pmMessage == nil then pmMessage = v else pmMessage = pmMessage.." "..v end end local toPlayer = privateMessage.getPlayer(toPlayer) if not toPlayer or pmMessage == nil or pmMessage=="" then return outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFSYNTAX: /pm <jogador> <mensagem>",player,255,255,255,true) end if toPlayer == player then playSoundFrontEnd(player,40) return outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFVocê não pode enviar mensagem para si mesmo",player,255,255,255,true) end if privateMessage.players[player].delay then local tempo = math.floor(getTimerDetails(privateMessage.players[player].delay)/1000) playSoundFrontEnd(player,40) return outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFEspere "..tempo.." segundos para enviar outra mensagem",player,255,255,255,true) end if privateMessage.players[toPlayer].blockPlayer[player] then playSoundFrontEnd(player,40) return outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFEste jogador bloqueou o recebimento de mensagens",player,255,255,255,true) end outputChatBox("#0080FF[PM] recebida de #FFFFFF"..getPlayerName(player).."#FFFFFF: "..pmMessage,toPlayer,255,255,255,true) outputChatBox("#0080FF[PM] para #FFFFFF"..getPlayerName(toPlayer).."#FFFFFF: "..pmMessage,player,255,255,255,true) privateMessage.players[toPlayer].replyPlayer = player privateMessage.players[player].replyPlayer = toPlayer triggerClientEvent(toPlayer,"playNotifyPM",resourceRoot) privateMessage.players[player].delay = setTimer( function(player) privateMessage.players[player].delay = false end ,3000,1,player) end, reply = function(player,cmd,...) local pmMessage = nil for k,v in pairs({...}) do if pmMessage == nil then pmMessage = v else pmMessage = pmMessage.." "..v end end local toPlayer = privateMessage.players[player].replyPlayer if not isElement(toPlayer) then return outputChatBox("#0080FF[PM] #FF1717ERROR: player nao encontrado",player,255,255,255,true) end if pmMessage == nil or pmMessage=="" then return outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFSYNTAX: /re <mensagem>",player,255,255,255,true) end if privateMessage.players[player].delay then local tempo = math.floor(getTimerDetails(privateMessage.players[player].delay)/1000) playSoundFrontEnd(player,40) return outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFEspere "..tempo.." segundos para enviar outra mensagem",player,255,255,255,true) end if privateMessage.players[toPlayer].blockPlayer[player] then playSoundFrontEnd(player,40) return outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFEste jogador bloqueou o recebimento de mensagens",player,255,255,255,true) end outputChatBox("#0080FF[PM] recebida de #FFFFFF"..getPlayerName(player).."#FFFFFF: "..pmMessage,toPlayer,255,255,255,true) outputChatBox("#0080FF[PM] para #FFFFFF"..getPlayerName(toPlayer).."#FFFFFF: "..pmMessage,player,255,255,255,true) privateMessage.players[toPlayer].replyPlayer = player privateMessage.players[player].replyPlayer = toPlayer triggerClientEvent(toPlayer,"playNotifyPM",resourceRoot) privateMessage.players[player].delay = setTimer( function(player) privateMessage.players[player].delay = false end ,3000,1,player) end, block = function(player,cmd,toPlayer) local toPlayer = privateMessage.getPlayer(toPlayer) if not toPlayer then return outputChatBox("#0080FF[PM] #FF1717ERROR: player nao encontrado",player,255,255,255,true) end if not privateMessage.players[player].blockPlayer[toPlayer] then privateMessage.players[player].blockPlayer[toPlayer] = true return outputChatBox("#0080FF[PM] #FFFFFFVoce deu pmblock no jogador "..getPlayerName(toPlayer),player,255,255,255,true) end end, unblock = function(player,cmd,toPlayer) local toPlayer = privateMessage.getPlayer(toPlayer) if not toPlayer then return outputChatBox("#0080FF[PM] #FF1717ERROR: player nao encontrado",player,255,255,255,true) end if privateMessage.players[player].blockPlayer[toPlayer] then privateMessage.players[player].blockPlayer[toPlayer] = nil return outputChatBox("#0080FF[PM] #FFFFFFVoce deu unblock no jogador "..getPlayerName(toPlayer),player,255,255,255,true) end end, } addCommandHandler("pmunblock",privateMessage.unblock) addCommandHandler("pmblock",privateMessage.block) addCommandHandler("pm",privateMessage.send) addCommandHandler("re",privateMessage.reply) for _,player in ipairs(getElementsByType("player")) do privateMessage.start(player) end addEventHandler("onPlayerJoin",root,function() privateMessage.start(source) end) addEventHandler("onPlayerQuit",root,function() privateMessage.stop(source) end) Se eu tivesse feito, meu código ficaria assim ;D tenta tirar algo de util pra voce, ver se acha algo novo pra voce sei la fica avonts. 1 Link to comment
main Posted April 9, 2018 Author Share Posted April 9, 2018 53 minutes ago, Gw8 said: function onPlayerCommand(command) if command == "msg" then cancelEvent() outputChatBox("Use o comando /pm em vez deste comando",source,255,0,0) playSoundFrontEnd(source,40) end end addEventHandler("onPlayerCommand",root,onPlayerCommand) privateMessage = { players = {}, getPlayer = function(playerPart) local pl = getPlayerFromName(playerPart) if isElement(pl) then return pl else for i,v in ipairs(getElementsByType("player")) do if (string.find(getPlayerName(v):lower(),playerPart:lower())) then return v elseif (string.find(string.gsub(getPlayerName(v),"#%x%x%x%x%x%x",""):lower(),playerPart:lower())) then return v end end end end, start = function(player) privateMessage.players[player] = { delay = false, replyPlayer = false, blockPlayer = {} } end, stop = function(player) privateMessage.players[player] = nil end, send = function(player,cmd,toPlayer,...) local pmMessage = nil for k,v in pairs({...}) do if pmMessage == nil then pmMessage = v else pmMessage = pmMessage.." "..v end end local toPlayer = privateMessage.getPlayer(toPlayer) if not toPlayer or pmMessage == nil or pmMessage=="" then return outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFSYNTAX: /pm <jogador> <mensagem>",player,255,255,255,true) end if toPlayer == player then playSoundFrontEnd(player,40) return outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFVocê não pode enviar mensagem para si mesmo",player,255,255,255,true) end if privateMessage.players[player].delay then local tempo = math.floor(getTimerDetails(privateMessage.players[player].delay)/1000) playSoundFrontEnd(player,40) return outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFEspere "..tempo.." segundos para enviar outra mensagem",player,255,255,255,true) end if privateMessage.players[toPlayer].blockPlayer[player] then playSoundFrontEnd(player,40) return outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFEste jogador bloqueou o recebimento de mensagens",player,255,255,255,true) end outputChatBox("#0080FF[PM] recebida de #FFFFFF"..getPlayerName(player).."#FFFFFF: "..pmMessage,toPlayer,255,255,255,true) outputChatBox("#0080FF[PM] para #FFFFFF"..getPlayerName(toPlayer).."#FFFFFF: "..pmMessage,player,255,255,255,true) privateMessage.players[toPlayer].replyPlayer = player privateMessage.players[player].replyPlayer = toPlayer triggerClientEvent(toPlayer,"playNotifyPM",resourceRoot) privateMessage.players[player].delay = setTimer( function(player) privateMessage.players[player].delay = false end ,3000,1,player) end, reply = function(player,cmd,...) local pmMessage = nil for k,v in pairs({...}) do if pmMessage == nil then pmMessage = v else pmMessage = pmMessage.." "..v end end local toPlayer = privateMessage.players[player].replyPlayer if not isElement(toPlayer) then return outputChatBox("#0080FF[PM] #FF1717ERROR: player nao encontrado",player,255,255,255,true) end if pmMessage == nil or pmMessage=="" then return outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFSYNTAX: /re <mensagem>",player,255,255,255,true) end if privateMessage.players[player].delay then local tempo = math.floor(getTimerDetails(privateMessage.players[player].delay)/1000) playSoundFrontEnd(player,40) return outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFEspere "..tempo.." segundos para enviar outra mensagem",player,255,255,255,true) end if privateMessage.players[toPlayer].blockPlayer[player] then playSoundFrontEnd(player,40) return outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFEste jogador bloqueou o recebimento de mensagens",player,255,255,255,true) end outputChatBox("#0080FF[PM] recebida de #FFFFFF"..getPlayerName(player).."#FFFFFF: "..pmMessage,toPlayer,255,255,255,true) outputChatBox("#0080FF[PM] para #FFFFFF"..getPlayerName(toPlayer).."#FFFFFF: "..pmMessage,player,255,255,255,true) privateMessage.players[toPlayer].replyPlayer = player privateMessage.players[player].replyPlayer = toPlayer triggerClientEvent(toPlayer,"playNotifyPM",resourceRoot) privateMessage.players[player].delay = setTimer( function(player) privateMessage.players[player].delay = false end ,3000,1,player) end, block = function(player,cmd,toPlayer) local toPlayer = privateMessage.getPlayer(toPlayer) if not toPlayer then return outputChatBox("#0080FF[PM] #FF1717ERROR: player nao encontrado",player,255,255,255,true) end if not privateMessage.players[player].blockPlayer[toPlayer] then privateMessage.players[player].blockPlayer[toPlayer] = true return outputChatBox("#0080FF[PM] #FFFFFFVoce deu pmblock no jogador "..getPlayerName(toPlayer),player,255,255,255,true) end end, unblock = function(player,cmd,toPlayer) local toPlayer = privateMessage.getPlayer(toPlayer) if not toPlayer then return outputChatBox("#0080FF[PM] #FF1717ERROR: player nao encontrado",player,255,255,255,true) end if privateMessage.players[player].blockPlayer[toPlayer] then privateMessage.players[player].blockPlayer[toPlayer] = nil return outputChatBox("#0080FF[PM] #FFFFFFVoce deu unblock no jogador "..getPlayerName(toPlayer),player,255,255,255,true) end end, } addCommandHandler("pmunblock",privateMessage.unblock) addCommandHandler("pmblock",privateMessage.block) addCommandHandler("pm",privateMessage.send) addCommandHandler("re",privateMessage.reply) for _,player in ipairs(getElementsByType("player")) do privateMessage.start(player) end addEventHandler("onPlayerJoin",root,function() privateMessage.start(source) end) addEventHandler("onPlayerQuit",root,function() privateMessage.stop(source) end) Se eu tivesse feito, meu código ficaria assim ;D tenta tirar algo de util pra voce, ver se acha algo novo pra voce sei la fica avonts. Muito obrigado, vou rever com calma pra tentar sugar algo kk. Link to comment
DNL291 Posted April 10, 2018 Share Posted April 10, 2018 (edited) Você podia ter explicado o que exatamente precisa de otimização, pelo que eu vi, não tem nada que você deva se preocupar em relação à performance. Talvez você esteja falando sobre a idéia do seu código? Eu achei meio que sem necessidade o comando /re pra responder sendo que poderia ser usado /pm independente de ser uma resposta de uma mp. Mas talvez seja por não precisar do jogador e menssagem que é do /pm. Eu pessoalmente faria um painel pra isso, embora o que possa ter te motivado seja ter uma experiência nova criando um código seu. Sobre o timer eu também achei um pouco mais longo. Digamos que o jogador responda apenas com 'ok', então certamente ele teria que esperar um pouco pra responder. Acho até que o código tá bem otimizado dentro do possível, tirando que você podia ter usado uma só tabela pros timers que o Lord Henry já mencionou. Edit: percebi que você usou resourceRoot pra passar no triggerClientEvent, o que mostra que você se preocupou em não definir sourceElement como root. E também as variáveis locais. Edited April 10, 2018 by DNL291 1 Link to comment
main Posted April 10, 2018 Author Share Posted April 10, 2018 12 hours ago, DNL291 said: Você podia ter explicado o que exatamente precisa de otimização, pelo que eu vi, não tem nada que você deva se preocupar em relação à performance. Talvez você esteja falando sobre a idéia do seu código? Eu achei meio que sem necessidade o comando /re pra responder sendo que poderia ser usado /pm independente de ser uma resposta de uma mp. Mas talvez seja por não precisar do jogador e menssagem que é do /pm. Eu pessoalmente faria um painel pra isso, embora o que possa ter te motivado seja ter uma experiência nova criando um código seu. Sobre o timer eu também achei um pouco mais longo. Digamos que o jogador responda apenas com 'ok', então certamente ele teria que esperar um pouco pra responder. Acho até que o código tá bem otimizado dentro do possível, tirando que você podia ter usado uma só tabela pros timers que o Lord Henry já mencionou. Edit: percebi que você usou resourceRoot pra passar no triggerClientEvent, o que mostra que você se preocupou em não definir sourceElement como root. E também as variáveis locais. @DNL291 Na real foi pra ver se realmente o código estava bem otimizado, eu corrigi o código com essas dicas, não entendi a parte do ´Edit´ que você disse. 1 Link to comment
DNL291 Posted April 10, 2018 Share Posted April 10, 2018 (edited) 5 hours ago, MainSCR said: @DNL291 Na real foi pra ver se realmente o código estava bem otimizado, eu corrigi o código com essas dicas, não entendi a parte do ´Edit´ que você disse. Achei bem otimizado pra ser sincero. Como um scripter Lua há alguns anos, eu consigo às vezes julgar o quanto de conhecimento a pessoa tem em Lua olhando para um código dela, e se eu fizesse esse script seu, faria praticamente da mesma forma. Sobre o "Edit", foi uma edição que fiz no meu comentário depois. Uma pequena correção no seu código: nos setTimer's você passa o player como argumento, mas esqueceu de usá-lo na função. Edited April 10, 2018 by DNL291 1 Link to comment
main Posted April 10, 2018 Author Share Posted April 10, 2018 1 hour ago, DNL291 said: Achei bem otimizado pra ser sincero. Como um scripter Lua há alguns anos, eu consigo às vezes julgar o quanto de conhecimento a pessoa tem em Lua olhando para um código dela, e se eu fizesse esse script seu, faria praticamente da mesma forma. Sobre o "Edit", foi uma edição que fiz no meu comentário depois. Uma pequena correção no seu código: nos setTimer's você passa o player como argumento, mas esqueceu de usá-lo na função. Ah verdade, já corrigi, muito obrigado @DNL291 Link to comment
Leonardo Bradoks Posted April 11, 2018 Share Posted April 11, 2018 Não sei se no MTA funcionaria a operação ternária, mas no SA-MP funciona. function privateMessage(player, command, target, ...) local target = getPlayerFromPartialName(target) if timePM[player] then local tempo = math.floor(getTimerDetails(timePM[player])/1000) outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFEspere "..tempo.." segundos para enviar outra mensagem", player, 255, 255, 255, true) playSoundFrontEnd(player, 40) return end outputChatBox(blockPM[target] ? "#0080FF[PM] #FF1717ERROR: #FFFFFFEste jogador bloqueou o recebimento de mensagens" : target == player ? "#0080FF[PM] #FF1717ERROR: #FFFFFFVocê não pode enviar mensagem para si mesmo" : "", player, 255, 255, 255, true) playSoundFrontEnd(player, 40) local text = table.concat({...}, " ") if text ~= "" then if !isElement(target) then outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFO jogador especificado não foi encontrado", player, 255, 255, 255, true) outputChatBox("#0080FF[PM] recebida de #FFFFFF"..getPlayerName(player).."#FFFFFF: "..text, target, 255, 255, 255, true) outputChatBox("#0080FF[PM] para #FFFFFF"..getPlayerName(target).."#FFFFFF: "..text, player, 255, 255, 255, true) replyPM[player] = target replyPM[target] = player triggerClientEvent(target, "playNotifyPM", resourceRoot) timePM[player] = setTimer(function() timePM[player] = false end, 3000, 1, player) else outputChatBox("#0080FF[PM] #FF1717ERROR: #FFFFFFSYNTAX: /pm <jogador> <mensagem>", player, 255, 255, 255, true) end end 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