Jump to content

Remover jogadores da equipe ao logar


Recommended Posts

Meu script de equipes esta bugado, quando alguem sai de uma equipe, é expulso ou ate mesmo deleta a equipe, após reconectar o jogador volta para ela, mesmo se remover depois pelo painel admin, qnd o jogador reconectar, sempre volta pra equipe. Oque eu estou tentando fazer pra arrumar isso é sempre que um jogador entrar, verificar se esta com o ElementData "gangue" (pois quando esta em uma equipe, sempre tem esse ElementData), então tentei colocar pra caso o jogador estiver com o ElementData "gangue" não acontecer nada, mas se ele não estiver, ai o jogador é removido da equipe, tentei varios jeitos e nada deu certo, ai esta meu codigo:

addEventHandler("onPlayerLogin", root, 
function (thePlayer)
	outputChatBox( "#000000[#FF0000 GFB #000000]#FFFFFF Voce logou com sucesso!", source, 255, 51, 36, true )
	setTimer ( function ()
		if getElementData(source,"gangue") then
			outputChatBox( "ativo!", source, 255, 51, 36, true )
		else
			if not getElementData(source,"gangue") then 
				outputChatBox( "desativado!", source, 255, 51, 36, true )
				local theTeam = getPlayerTeam ( source )
					if theTeam then 
						setPlayerTeam(source, nil)
				end
			end
		end
	end, 1000, 1)
end)

Coloquei os outputChatBox "desativado" e "ativo" pra ver se realmente esta ou não com o ElementData, mas se o jogador logar e estiver ou não estiver com o ElementData, sempre aparece 'desativado!' e não acontece mas nada, criei outro codigo pra verificar se o jogador realmente não estava com o ElementData "gangue" ao logar, que é este ai:

function verefic (thePlayer)
	if getElementData(thePlayer,"gangue") then
		outputChatBox( "Data 'gangue esta ativo!", thePlayer, 255, 51, 36, true )
	else
			outputChatBox( "Data 'gangue esta desativado!", thePlayer, 255, 51, 36, true )
	end
end
addCommandHandler("verdata", verefic) 

E sim, mesmo com o ElementData "gangue" ativo, ao logar mostra "desativado!". Tentei ver se pelo menos estava removendo o jogador da equipe se não estive-se com o ElementData "gangue", mas não esta, o jogador sempre volta para a equipe. Tambem não esta dando nenhum ERROR ou WARNING no debug. Bom, tem algo errado no meu codigo? como posso resolver isso?

Link to post
  • Other Languages Moderators

ElementDatas são temporárias e se perdem ao desconectar do servidor. Você deve salvar na conta do jogador se quiser que os dados sejam recuperados após o jogador se conectar novamente.

Edited by Lord Henry
  • Thanks 1
Link to post
1 minute ago, Lord Henry said:

Não estou vendo nenhuma data obtida pela conta do jogador no seu código.

A Data esta salvando em outro script, que é o das equipes, sei que realmente esta salvando pois se eu entrar em uma equipe, reconectar e dar /verdata (comando pra verificar se esta com o ElementData) mostra que esta ativo, se eu sair da equipe, reconectar e usar novamente, mostra que esta desativado.

 

Just now, Maaster said:

A Data esta salvando em outro script, que é o das equipes, sei que realmente esta salvando pois se eu entrar em uma equipe, reconectar e dar /verdata (comando pra verificar se esta com o ElementData) mostra que esta ativo, se eu sair da equipe, reconectar e usar novamente, mostra que esta desativado.

 

Verefiquei com outro jogador logando e esta dando WARNING sim, sendo eles 

linha 5: Bad argument @'getElementData' [Expected player at argument 1, got nil]

linha 8: Bad argument @'getElementData' [Expected player at argument 1, got nil]

linha 10: Bad argument @'getPlayerTeam' [Expected player at argument 1, got nil]

Isso seria o argument 'source', mas ele não esta certo? devo usar outro argumento?

Link to post
  • Other Languages Moderators

Vou te mostrar o porquê de não estar funcionando.

addEventHandler ("onPlayerLogin", root, function (prevAcc, currAcc) -- Parâmetro estava errado, veja na wiki do onPlayerLogin.
	outputChatBox ("[#FF0000 GFB #000000]#FFFFFF Você logou com sucesso!", source, 0, 0, 0, true)
	setTimer (function ()
		print ("ElementData 'gangue' = "..tostring(getElementData(source,"gangue"))) -- Mostra no chat o valor do elementData "gangue" do jogador.
		if getElementData (source, "gangue") then
			outputChatBox ("ativo!", source, 255, 51, 36, true)
		else -- Não é necessário usar "if not getElementData" pois ele só vai entrar aqui se a condição de cima não for atendida. 
			outputChatBox ("desativado!", source, 255, 51, 36, true)
			local theTeam = getPlayerTeam (source)
			if theTeam then 
				setPlayerTeam (source, nil)
			end
		end
	end, 1000, 1)
end)

 

Edited by Lord Henry
  • Thanks 1
Link to post
5 minutes ago, Lord Henry said:

Vou te mostrar o porquê de não estar funcionando.


addEventHandler ("onPlayerLogin", root, function (prevAcc, currAcc) -- Parâmetro estava errado, veja na wiki do onPlayerLogin.
	outputChatBox ("[#FF0000 GFB #000000]#FFFFFF Você logou com sucesso!", source, 0, 0, 0, true)
	setTimer (function ()
        print ("ElementData 'gangue' = "..tostring(getElementData(source,"gangue"))) -- Mostra no chat o valor do elementData "gangue" do jogador.
		if getElementData (source, "gangue") then
			outputChatBox ("ativo!", source, 255, 51, 36, true)
		else -- Não é necessário usar "if not getElementData" pois ele só vai entrar aqui se a condição de cima não for atendida. 
			outputChatBox ("desativado!", source, 255, 51, 36, true)
			local theTeam = getPlayerTeam (source)
			if theTeam then 
				setPlayerTeam (source, nil)
			end
		end
	end, 1000, 1)
end)

 

Tentei usar aqui é ainda não deu certo, eu estou em uma equipe, dei /reconnect, loguei e apareceu desativado no chat, dei /verdata e estava ativo. Ai as mensagens no chat:

[ GFB ] Você logou com sucesso!
login: You successfully logged in
desativado!
Data 'gangue esta ativo!

Tambem sai da equipe, dei reconnect, loguei  e continuo na equipe, não estou sendo removido dela. Poderia me explicar melhor sobre os parametros tambem? dei uma olhada na wiki do OnPlayerLogin e não entendi muita coisa

Link to post
1 minute ago, Lord Henry said:

Cadê a parte da mensagem que deixei pra aparecer?

A Da linha 5? se for, não esta aparecendo nada, reconectei mais 2 vezes aqui pra testar e n deu

Link to post
2 minutes ago, Lord Henry said:

Então vc não está com o debugscript ativado. Ative-o com /debugscript 3

Vi aqui agora, tinha pensado que apareceria no chat, pedi pra um jogador reconectar, esta aparecendo a mensagem "ElementData 'gangue' = false" e os mesmos 3 WARNINGS que citei acima. Tambem pedi pro jogador que reconectou dar /verdata quando logou e apareceu "Data 'gangue' esta Ativo!". Aumentei o tempo do timer pra 2.5 segundos, pra caso ele estive-se verificando antes de o jogador ganhar o ElementData e a equipe ao entrar, mas deu a mesma coisa

Link to post
  • Other Languages Moderators

Sobre os parâmetros faltando no setTimer. Ele quis dizer que o Warning acontece pois dentro do setTimer o source deixa de existir, então vc precisa passar o source por parâmetro.

Ou seja, para resolver os warnings, faça isso:

addEventHandler ("onPlayerLogin", root, function (prevAcc, currAcc) -- Parâmetro estava errado, veja na wiki do onPlayerLogin.
	outputChatBox ("[#FF0000 GFB #000000]#FFFFFF Você logou com sucesso!", source, 0, 0, 0, true) -- Fora do setTimer, source ainda existe.
	setTimer (function (thePlayer) -- O valor de thePlayer foi definido lá em baixo, após a quantidade de repetições do timer. Ou seja, thePlayer = source.
		print ("ElementData 'gangue' = "..tostring (getElementData (thePlayer, "gangue"))) -- Mostra no chat o valor do elementData "gangue" do jogador.
		if getElementData (thePlayer, "gangue") then
			outputChatBox ("ativo!", thePlayer, 255, 51, 36, true)
		else -- Não é necessário usar "if not getElementData" pois ele só vai entrar aqui se a condição de cima não for atendida. 
			outputChatBox ("desativado!", thePlayer, 255, 51, 36, true)
			local theTeam = getPlayerTeam (thePlayer)
			if theTeam then 
				setPlayerTeam (thePlayer, nil)
			end
		end
	end, 1000, 1, source) -- source será o primeiro parâmetro da função.
end)

 

Edited by Lord Henry
Código comentado.
  • Thanks 1
Link to post
4 hours ago, Lord Henry said:

Sobre os parâmetros faltando no setTimer. Ele quis dizer que o Warning acontece pois dentro do setTimer o source deixa de existir, então vc precisa passar o source por parâmetro.

Ou seja, para resolver os warnings, faça isso:


addEventHandler ("onPlayerLogin", root, function (prevAcc, currAcc) -- Parâmetro estava errado, veja na wiki do onPlayerLogin.
	outputChatBox ("[#FF0000 GFB #000000]#FFFFFF Você logou com sucesso!", source, 0, 0, 0, true) -- Fora do setTimer, source ainda existe.
	setTimer (function (thePlayer) -- O valor de thePlayer foi definido lá em baixo, após a quantidade de repetições do timer. Ou seja, thePlayer = source.
		print ("ElementData 'gangue' = "..tostring (getElementData (thePlayer, "gangue"))) -- Mostra no chat o valor do elementData "gangue" do jogador.
		if getElementData (thePlayer, "gangue") then
			outputChatBox ("ativo!", thePlayer, 255, 51, 36, true)
		else -- Não é necessário usar "if not getElementData" pois ele só vai entrar aqui se a condição de cima não for atendida. 
			outputChatBox ("desativado!", thePlayer, 255, 51, 36, true)
			local theTeam = getPlayerTeam (thePlayer)
			if theTeam then 
				setPlayerTeam (thePlayer, nil)
			end
		end
	end, 1000, 1, source) -- source será o primeiro parâmetro da função.
end)

 

Agora deu certo aqui, obrigado!! ultima coisa, poderia me explicar melhor como funciona esses parâmetros?

Link to post
  • Other Languages Moderators

O source é uma variável cujo valor depende diretamente do evento ativador da função. Por exemplo: Se sua função estiver sendo ativada por onPlayerLogin, então o source será o jogador que logou. Mas se a função for ativada por um onVehicleEnter, o source será o veículo que o jogador entrou e não o jogador em si.

Ao usar a função setTimer, o source que antes tinha o valor do evento ativador da função passa a ter valor nulo. Por isso que não dá pra usar source dentro do setTimer, pois o valor dele será nulo dentro do setTimer.

Para resolver isso, passamos o source por parâmetro do setTimer, colocando ele depois da quantidade de repetições do setTimer.

setTimer (function (parametro) -- Parametro vai receber o valor que estiver após o 1 lá em baixo, que no caso é o valor de source.
    -- CODE
end, 1000, 1, source) -- Source será o parâmetro 1 da função que será executada pelo timer, se quiser adicionar outros parâmetros, só ir declarando após o source e assim por diante.

 

  • Thanks 1
Link to post

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