Doongogar Posted April 9, 2023 Share Posted April 9, 2023 (edited) como eu faço um sistema de solicitação? Exemplo eu mando uma solicitação de troca skin pro player e então ele tem que aceitar ou rejeitar para ser setado a skin nele caso passe 5 minutos sem respostas, expire esta solicitação que eu mandei a ele, antes de enviar a solicitiação ao player também verificar se ele já não tem solicitações pendentes Edited April 9, 2023 by SciptNovato Link to comment
FelipeX Posted April 10, 2023 Share Posted April 10, 2023 (edited) On 09/04/2023 at 18:09, SciptNovato said: como eu faço um sistema de solicitação? Exemplo eu mando uma solicitação de troca skin pro player e então ele tem que aceitar ou rejeitar para ser setado a skin nele caso passe 5 minutos sem respostas, expire esta solicitação que eu mandei a ele, antes de enviar a solicitiação ao player também verificar se ele já não tem solicitações pendentes Fiz um exemplo básico, agora é só aplicar. ( Me perdoa pela indentação ) Para verificar o tempo da solicitação e se já existe solicitação use setTimer e killTimer para remover o timer caso o player morra, quite ou algo do tipo. addCommandHandler("chamar", function(playerSource, Comando, ID) if ID and tonumber(ID) then -- Se tem o id e for um número, então: local playerID = tonumber(ID) -- Retorna o id definido. if playerID then -- Se tem o id, então: local targetPlayer, targetPlayerName = getPlayerID(playerID) if targetPlayer then -- Se existir o jogador online, então: outputChatBox("Você enviou solicitação para o id "..ID.." ( "..getPlayerName(targetPlayer).." )", playerSource, 255, 255, 255, true) else -- Se não existir jogador online, então: outputChatBox("O jogador não está na cidade ou não foi encotrado.", playerSource, 255, 255, 255, true) end end else -- Se não tiver o id ou o argumento 1 não for um numero, então: outputChatBox("'Sintaxe incorreta, use: '/chamar <ID DO JOGADOR>'", playerSource, 255, 255, 255, true) end end) --[[ █▀▀█ █▀▀▀ █▀▀█ █▀▀█ █▀▀█ ▀█▀ █▀▀▄ █▄▄█ █▀▀▀ █░▄▄ █▄▄█ █▄▄▀ ░█░ █░▒█ █░░░ █▄▄▄ █▄▄█ █░▒█ █░▒█ ▄█▄ █▄▄▀ ]]-- function getPlayerID(id) v = false for i, player in ipairs (getElementsByType("player")) do if getElementData(player, "ID") == id then v = player break end end return v end Edited April 11, 2023 by Lord Henry Indentação corrigida. (TABs trocados por espaços) Link to comment
Doongogar Posted April 10, 2023 Author Share Posted April 10, 2023 bom, neste caso você não implementou nada em que questão de solicitação mesmo, eu estou mais em dúvida sobre a questão do player solicitado aceitar ou rejeitar sabe como eu verifico se ele realmente tem algo pendente para ele poder rejeitar ou aceitar Link to comment
FelipeX Posted April 10, 2023 Share Posted April 10, 2023 (edited) 4 hours ago, SciptNovato said: bom, neste caso você não implementou nada em que questão de solicitação mesmo, eu estou mais em dúvida sobre a questão do player solicitado aceitar ou rejeitar sabe como eu verifico se ele realmente tem algo pendente para ele poder rejeitar ou aceitar além desse addCommandHandler, crie mais 2, um para aceitar e outro para recusar, depois quando um player executar um desses dois comandos basta verificar se eles tem chamados para ser aceito por elementData. Edited April 10, 2023 by FelipeX Link to comment
Other Languages Moderators Lord Henry Posted April 11, 2023 Other Languages Moderators Share Posted April 11, 2023 Server-side local pendentes = {} -- Lista de players que tem solicitação de skin pendente. Formato: [playerElement] = skinID, local timersPendentes = {} -- Lista com os timers de cada solicitação. addCommandHandler("mudarskin", function(thePlayer, cmd, playerName, skinID) -- Comando para enviar a solicitação para o jogador. if not playerName or not skinID then outputChatBox("Sintaxe: /mudarskin <NomeJogador> <skinID>", thePlayer) return -- Se faltou especificar o nome do jogador ou o id da skin no comando, cancela a função e nada acontece. end local otherPlayer = getPlayerFromPartialName(playerName) -- Obtém o jogador pelo nome. if otherPlayer then -- Se encontrou o jogador, então: if pendentes[otherPlayer] then -- Se o jogador já tem uma solicitação na lista, então: outputChatBox("Este jogador já tem uma solicitação de skin pendente.", thePlayer) else -- Se o jogador ainda não tem uma solicitação na lista, então: pendentes[otherPlayer] = tonumber(skinID) -- Adiciona a solicitação dele na lista. outputChatBox("Você recebeu uma solicitação de skin "..skinID..". Digite /aceitarskin ou /recusarskin", otherPlayer) -- Manda isso pra ele. timersPendentes[otherPlayer] = setTimer(function() -- Depois de 10 segundos, expira a solicitação. pendentes[otherPlayer] = nil -- Remove a solicitação da lista. timersPendentes[otherPlayer] = nil -- Anula a variável do timer, removendo da lista de timers. outputChatBox("O jogador '"..playerName.."' não respondeu a sua solicitação e ela expirou.", thePlayer) end, 10000, 1) end else -- Se não encontrou o jogador pelo nome, então: outputChatBox("Não foi encontrado nenhum jogador com o nome '"..playerName.."'", thePlayer) end end) function getPlayerFromPartialName(name) -- Função útil que faz o mesmo que getPlayerFromName, mas o nome não precisa ser exato. 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 changeSkin(thePlayer, cmd) -- Função de aceitar ou recusar solicitações. if pendentes[thePlayer] then -- Se o jogador que executou o comando tem alguma solicitação na lista, então: if cmd == "aceitarskin" then -- Se ele usou o comando /aceitarskin então: setElementModel (thePlayer, pendentes[thePlayer]) -- Muda a skin dele. outputChatBox("Você aceitou a solicitação de skin.", thePlayer) else -- Se ele usou o comando /recusarskin então: outputChatBox("Você recusou a solicitação de skin.", thePlayer) end pendentes[thePlayer] = nil -- Remove a solicitação da lista. if isTimer(timersPendentes[thePlayer]) then -- Se existe o timer da solicitação, então: killTimer(timersPendentes[thePlayer]) -- Cancela o timer da solicitação. timersPendentes[thePlayer] = nil -- Remove o timer da lista de timers. end else -- Se o jogador que executou o comando não tem nenhuma solicitação na lista, então: outputChatBox("Você não tem nenhuma solicitação de skin para aceitar ou recusar.", thePlayer) end end addCommandHandler("aceitarskin", changeSkin) addCommandHandler("recusarskin", changeSkin) 2 Link to comment
Blaack Posted April 11, 2023 Share Posted April 11, 2023 On 10/04/2023 at 09:15, SciptNovato said: bom, neste caso você não implementou nada em que questão de solicitação mesmo, eu estou mais em dúvida sobre a questão do player solicitado aceitar ou rejeitar sabe como eu verifico se ele realmente tem algo pendente para ele poder rejeitar ou aceitar A maneira que o @Lord Henryfez, irá funcionar perfeitamente. Porém caso queira fazer algo universal, eu faria dessa maneira: -- resource solicitando -- solicitar triggerEvent("SolicitarAceitacao", player, "Você recebeu uma solicitação de beijo de Nana, use /aceitar ou /recusar", playersolicitando, getResourceName(getThisResource())) -- receber resposta addEvent("ResultadoSolicitacao>"..getResourceName(getThisResource()), true) addEventHandler("ResultadoSolicitacao>"..getResourceName(getThisResource()), root function (acao, playersolicitou) if acao == "recusou" then -- execute aqui a ação caso recuse elseif acao == "aceitou" then -- execute aqui a ação caso aceite end end) -- resource solicitado local aceitacao = {} addEvent("SolicitarAceitacao", true) addEventHandler("SolicitarAceitacao", root, function (mensagem, playersolicitou, resource) if not aceitacao[source] then outputChatBox(mensagem, source, 255, 255, 255) aceitacao[source] = {resource, playersolicitou} else if playersolicitou and isElement(playersolicitou) then outputChatBox("Este player já possui uma solicitação pendente!", playersolicitou, 255, 0, 0) end end end addCommandHandler("aceitar", function (p) if aceitacao[p] then triggerEvent("ResultadoSolicitacao>"..aceitacao[p][1], p, "aceitou", aceitacao[p][2]) aceitacao[p] = false end end addCommandHandler("recusar", function (p) if aceitacao[p] then triggerEvent("ResultadoSolicitacao>"..aceitacao[p][1], p, "recusou", aceitacao[p][2]) aceitacao[p] = false end end Link to comment
Doongogar Posted April 16, 2023 Author Share Posted April 16, 2023 (edited) On 11/04/2023 at 08:17, Blaack said: A maneira que o @Lord Henryfez, irá funcionar perfeitamente. Porém caso queira fazer algo universal, eu faria dessa maneira: como assim universal, poderia me explicar isso? eu também queria saber um meio de solicitação para multiplos players, exemplo eu dou /mecanico e então o mecanico pode aceitar meu chamado digitando /aceitar, porém com uma condição que ele só consiga aceitar dentro do prazo de expiração e caso nenhum outro mecanico ja tenha aceitado o chamado. @Lord Henry Teria como mudar novamente o titulo, o que eu queria escrever era: "Sistema de solicitação com expiração". Edited April 16, 2023 by SciptNovato Link to comment
FelipeX Posted April 18, 2023 Share Posted April 18, 2023 (edited) On 16/04/2023 at 10:01, SciptNovato said: como assim universal, poderia me explicar isso? eu também queria saber um meio de solicitação para multiplos players, exemplo eu dou /mecanico e então o mecanico pode aceitar meu chamado digitando /aceitar, porém com uma condição que ele só consiga aceitar dentro do prazo de expiração e caso nenhum outro mecanico ja tenha aceitado o chamado. @Lord Henry Teria como mudar novamente o titulo, o que eu queria escrever era: "Sistema de solicitação com expiração". Veja se consigo te ajudar com este código, não testei apenas montei. ( Perdoa-me pela indentação ) local RequestCancel = {} local DestroyBlip = {} local Blip = {} addCommandHandler("cmecanico", function(PlayerSource) if not isTimer(Request[PlayerSource]) then -- Verifica se o player não possui o tempo de solicitação. for i, Mecanico in ipairs(getElementsByType("player")) do -- Retorna todos os players do servidor. if aclGetGroup("Mecanico") and isObjectInACLGroup ("user."..getAccountName(getPlayerAccount(Mecanico)), aclGetGroup("Mecanico")) then -- Verifica se existe a acl 'Mecanico', e retorna apenas quem está na acl. local x, y, z = getElementPosition(PlayerSource) -- Pega a posição do cliente. local Cidade = ""..getZoneName(x, y, z).." | "..getZoneName(x, y, z, true).."" -- Pega a localização e cidades. outputChatBox("#FF0000INFO: #FFFFFF"..getPlayerName(PlayerSource).." chamou um mecanico em "..Cidade..", use '/aceitar <nome>' para aceitar.", Mecanico, 255, 255, 255, true) end end RequestCancel[PlayerSource] = setTimer(function() -- Cria um tempo para cancelar a solicitação. outputChatBox("#FF0000INFO: #FFFFFFSeu pedido expirou!", 255, 255, 255, true) killTimer(RequestCancel[PlayerSource]) -- Destroy o tempo de solicitação. end, 5000, 1, PlayerSource) -- Encerra a função do tempo, define o quanto tempo é para destruir a solicitação e quantas vezes fazer isso. else outputChatBox("#FF0000INFO: #FFFFFFVocê já tem uma solicitação em andamento, aguarde.", PlayerSource, 255, 255, 255, true) end end) addCommandHandler("aceitar", function(Mecanico, Comando, Nome) if Comando and Nome then -- Verifica se tem o comando e nome. local Player = getPlayerFromName(Nome) -- Retorna o player do nome destinado como um elemento. if ( Player ) then -- Se tem o player, então: if isTimer(Request[Player]) then -- Se tem uma solicitação, então: local x, y, z = getElementPosition(Player) -- Pega a posição do cliente. outputChatBox("#FF0000INFO: #FFFFFFO Mecanico "..getPlayerName(Mecanico).." aceitou seu chamado e está a caminho.", Player, 255, 255, 255, true) outputChatBox("#FF0000INFO: #FFFFFFO Você aceitou o chamado do "..getPlayerName(Player).." e ele te enviou a localização.", Mecanico, 255, 255, 255, true) Blip[Mecanico] = createBlip(x, y, z, 0, 0, 0, 0, 255, Mecanico ) -- Cria um blip fixo na posição do cliente apenas para o mecanico. DestroyBlip[Mecanico] = setTimer(function() -- Cria um timer para destruir o blip. destroyElement(Blip[Mecanico]) -- Destroi o blip. end, 60000, 1, Mecanico) -- Encerra a função do timer e define quanto tempo é para destruir e quantas vezes repetir a função. killTimer(RequestCancel[Player]) -- Destroi a solicitação do player. else -- Se não houver o player, então: outputChatBox("#FF0000INFO: #FFFFFFO player não tem um chamado.", Mecanico, 255, 255, 255, true) end else outputChatBox("#FF0000INFO: #FFFFFFO player não foi encontrado", Mecanico, 255, 255, 255, true) end end end) addEventHandler("onPlayerQuit", root, function() -- Destruir o tempo caso o player dê quit. if isTimer(Request[source]) or isTimer(DestroyBlip[source]) then killTimer(RequestCancel[source]) killTimer(DestroyBlip[source]) end end) Edited April 18, 2023 by FelipeX 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