Jump to content

[ AJUDA ] Verificar elementData


Recommended Posts

Gostaria de verificar se nome que o jogador escrever no painel , é igual a outro nome definido no elementData de outro jogador.

No client-side esta assim :

local Nick = guiGetText(NickBoxText)
setElementData(localPlayer, "checknick", Nick)

local check = getElementData(localPlayer, "checknick")
if check then
      triggerServerEvent("checkNick", getLocalPlayer())
end

function successNick()        
  CloseDxPanelCreate ()
  triggerServerEvent ("changename", getLocalPlayer())     	      
end
addEvent("successNick", true)
addEventHandler("successNick", getRootElement(), successNick)

E no server-side assim :

function haveOtherNick (myName)
    for i, player in ipairs (getElementsByType("player")) do
        if (getElementData (player, "checknick") and getElementData (player, "checknick") == myName) then
            return true
        end
    end
    return false
end

function checkNick()
    local nome = getElementData (source, "checknick")
    if (nome) then
		if (haveOtherNick(nome)) then
            outputChatBox ("Já tem alguém com esse nome online.")
		else	
			triggerClientEvent("successNick", getRootElement())
			setElementData(source, "playername", nome)	
		end		
	end    
end
addEvent("checkNick", true)
addEventHandler("checkNick", getRootElement(), checkNick)

O erro e que sempre retorna o outputChatBox, mesmo colocando outro nome diferente.

Tive ajuda de alguns membros do forum , mas não consegui solucionar .

Link to comment
2 hours ago, Arantes said:

O erro e que sempre retorna o outputChatBox, mesmo colocando outro nome diferente


haveOtherNick sempre retorna true pq ele ta passando o for em todos os players, inclusive o proprio que acabou de setar o nick em si mesmo, pra comparar vc precisa excluir o player que deu trigger, antes faz essa alteração de source pra client, na wiki diz o seguinte:

Atenção: vc deve usar a variavel global client no serverside ao invés de passar localPlayer ou por parametro ou source, Senão falsificação de evento (passar outro player invés de localPlayer) poderia ser possível (triggerServerEvent)

ps: essa alteração source pra client é só no server, o script client fica igual tava

o script server ficaria assim:
 

function haveOtherNick (myName)
    for i, player in ipairs (getElementsByType("player")) do
        if player~=client and (getElementData (player, "checknick") and getElementData (player, "checknick") == myName) then
            return true--se todos os players exceto eu não tem elementdata checknick igual a myName
        end
    end
    return false
end

function checkNick()
    local nome = getElementData (client, "checknick")
    if (nome) then
        if (haveOtherNick(nome)) then
            outputChatBox ("Já tem alguém com esse nome online.")
            removeElementData(client,"checknick")--opcional: remover o elementdata de quem nao foi aprovado pra nao ocupar o checknick em 2+ players
        else    
            triggerClientEvent("successNick", getRootElement())
            setElementData(client, "playername", nome)    
        end        
    end    
end
addEvent("checkNick", true)
addEventHandler("checkNick", getRootElement(), checkNick)

 

Edited by _Ace
  • Thanks 1
Link to comment

Estou utilizando a seguinte maneira para salvar os dados :

	-- Salvar o checknick quando sair.
	local checkNick = getElementData ( source, "checknick" ) or "Error Save Login"
	setAccountData ( conta, "checknick", checkNick )

	-- Carregar o checknick quando o jogador entrar e quando a resource iniciar.
	local check = getAccountData ( conta, "checknick" ) or "Error Load Login"
	setElementData ( source, "checknick", check )

	

 

Edited by Arantes
Link to comment

@Arantes estranho pq eu testei com 2 players, e funcionou perfeito, unica coisa diferente foi que inseri o nome por comando e nao por painel, mas seria o mesmo ja que passa como texto tbm, pra testar vc pode inserir no chat como outputChatBox os dados e ver onde ta o problema:
 

function haveOtherNick (myName)
    outputChatBox("funcao haveothernick recebeu: "..myName.." de player: "..getPlayerName(client))
    for i, player in ipairs (getElementsByType("player")) do
    outputChatBox("for leu o checknick: "..getElementData (player, "checknick").." de "..getPlayerName(player))
        if player~=client and (getElementData (player, "checknick") and getElementData (player, "checknick") == myName) then
            return true--se todos os players exceto eu não tem elementdata checknick igual a myName
        end
    end
    return false
end

function checkNick()
    
    local nome = getElementData (client, "checknick")
    outputChatBox("funcao checknick: leu elementdata: "..nome.." de "..getPlayerName(client))
    if (nome) then
        if (haveOtherNick(nome)) then
            outputChatBox ("Já tem alguém com esse nome online.")
            removeElementData(client,"checknick")--opcional: remover o elementdata de quem nao foi aprovado pra nao ocupar o checknick em 2+ players
        else    
            triggerClientEvent("successNick", getRootElement())
            setElementData(client, "playername", nome)    
        end        
    end    
end
addEvent("checkNick", true)
addEventHandler("checkNick", getRootElement(), checkNick)

e nessas funções de account data deu algum erro ou warning? e no caso esse sistema de nick que vc ta fazendo seria um nome secundario? pq vc poderia usar direto o getPlayerName pra checar nick/nome

Link to comment

Os dados retornaram certinho pelo outputChatBox :

funcao checknick: leu elementdata: Arantes de Sem_Registro
funcao haveothernick recebeu: Arantes de player: Sem_Registro
for leu o checknick: Arantes de Sem_Registro

Mas por motivo desconhecido , consigo registar o mesmo Nick/Nome em outras contas.

Esse sistema de nick é para deixar o nick do jogador fixo quando o mesmo definir no painel , sendo assim quando o jogador entrar , verificar se o nick dele e igual o do elementData playername , se nao for ele seta oque esta no playername e se nao encontrar deixa como Sem_Registro.

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...