Jump to content

Sistema de solicitação com expiração


Recommended Posts

    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 by SciptNovato
Link to comment
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 by Lord Henry
Indentação corrigida. (TABs trocados por espaços)
Link to comment

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
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 by FelipeX
Link to comment
  • Other Languages Moderators

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)

 

  • Thanks 2
Link to comment
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
  • Lord Henry changed the title to Sistema de solicitação com exportação
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 by SciptNovato
Link to comment
  • Lord Henry changed the title to Sistema de solicitação com expiração
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 by FelipeX
Link to comment

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...