Jump to content

[Ajuda]GridList


Recommended Posts

Posted

Bom, estou desenvolvendo um código cujo mesmo possui gridList, eu necessito que nesta GridList apareça a lista de Todos os Players logados no Servidor, como eu deveria fazer isso?

----- GRIDLIST -----
playersList = guiCreateGridList (0.26, 0.25, 0.11, 0.57, true)
guiGridListAddColumn (playersList, "Jogadores", 0.9)

 

  • Other Languages Moderators
Posted

Se sua definição de "logados" for apenas os jogadores que estiverem registrados e usando uma conta, você pode usar, em um evento onPlayerLogin, a função setElementData e adicionar uma data temporária e, na função de adicionar os jogadores na GridList, basta verificar com getElementData.

-- // SERVER-SIDE
addEventHandler( "onPlayerLogin", root, function( _, acc )
	-- // Assim que o jogador logar, vamos armazenar, dentro da uma data, o valor true
	setElementData( source, "isPlayerLoggedIn", true );
end );

-- // CLIENT-SIDE
local Screen = Vector2( guiGetScreenSize( ) );

local gridList = guiCreateGridList( Screen.x - 300, Screen.y + 250, 280, 180, false );
	guiGridListAddColumn( gridList, "Jogadores", 0.85 );

-- // Adicionar apenas os jogadores logados
for _, v in pairs( getElementsByType( "player" ) ) do
	if ( getElementData( v, "isPlayerLoggedIn" ) ) then
		local row = guiGridListAddRow( gridList );
		
		guiGridListSetItemText( gridList, row, 1, string.gsub( getPlayerName( v ), "#%x%x%x%x%x%x", "" ), false, false );
	end
end

 

Posted (edited)
4 hours ago, asrzk said:

Se sua definição de "logados" for apenas os jogadores que estiverem registrados e usando uma conta, você pode usar, em um evento onPlayerLogin, a função setElementData e adicionar uma data temporária e, na função de adicionar os jogadores na GridList, basta verificar com getElementData.


-- // SERVER-SIDE
addEventHandler( "onPlayerLogin", root, function( _, acc )
	-- // Assim que o jogador logar, vamos armazenar, dentro da uma data, o valor true
	setElementData( source, "isPlayerLoggedIn", true );
end );

-- // CLIENT-SIDE
local Screen = Vector2( guiGetScreenSize( ) );

local gridList = guiCreateGridList( Screen.x - 300, Screen.y + 250, 280, 180, false );
	guiGridListAddColumn( gridList, "Jogadores", 0.85 );

-- // Adicionar apenas os jogadores logados
for _, v in pairs( getElementsByType( "player" ) ) do
	if ( getElementData( v, "isPlayerLoggedIn" ) ) then
		local row = guiGridListAddRow( gridList );
		
		guiGridListSetItemText( gridList, row, 1, string.gsub( getPlayerName( v ), "#%x%x%x%x%x%x", "" ), false, false );
	end
end

 

Bom, eu estou criando essa GridList junto com um Painel, e já uso guiCreateGridList e guiGetScreenSize fora de função alguma, eu poderia mantê-los fora de qualquer função?

Edited by danblemes1
  • Other Languages Moderators
Posted

Apenas fiz um exemplo. Você escreve o código do jeito que quiser (claro, dentro dos padrões da programação).

Respondendo: Sim, pode deixá-los fora de alguma função.

Posted
1 minute ago, Lord Henry said:

Também crio meus painéis GUI fora de funções. Não sei se tem diferença entre deixá-los fora ou deixá-los dentro de uma função com onClientResourceStart.

Não sei se é do meu PC, mas tipo, quando eu tava com a GridList dentro da Função, assim que eu abria o Painel começava a travar tudo

  • Other Languages Moderators
Posted
24 minutes ago, danblemes1 said:

Não sei se é do meu PC, mas tipo, quando eu tava com a GridList dentro da Função, assim que eu abria o Painel começava a travar tudo

Isso definitivamente NÃO é normal. Eu costumo fazer meus painéis em DirectX(DX) e nunca tive problemas com performance.

  • Other Languages Moderators
Posted (edited)
17 minutes ago, asrzk said:

Isso definitivamente NÃO é normal. Eu costumo fazer meus painéis em DirectX(DX) e nunca tive problemas com performance.

É, mas NÃO TEM COMO fazer um painel DX fora de funções, né? hauahauahua

Pois ele depende de uma função render.

Edited by Lord Henry
  • Haha 1
  • Other Languages Moderators
Posted
50 minutes ago, Lord Henry said:

É, mas NÃO TEM COMO fazer um painel DX fora de funções, né? hauahauahua

Pois ele depende de uma função render.

KKKKK. Concordo. É que eu uso minha framework, aí eu meio que fiz todas as funções GUI como DX. dxCreateGridList, dxCreateButton, dxCreateScrollBar, dxCreateWindow, dxWindowSetMovable, dxWindowSetSizable etc. Todas as funções de GUI, porém em DX. Acabei me esquecendo desse detalhe do render.

  • Other Languages Moderators
Posted

Manda print por privado de alguns painéis DX que vc fez. Quero ver se vc é bom mesmo.

Posted

Bom, eu fiz essa parte do código baseado na WikiMTA, porém o debug está indicando os seguintes erros:

 

Podem me ajudar dizendo o que eu devo alterar no código a seguir?

function createPlayerList ()
	playersList = guiCreateGridList (0.26, 0.25, 0.11, 0.57, true)
	local column = guiGridListAddColumn (playersList, "Jogadores", 0.9)
	if (column) then
		for _, v in ipairs (getElementsByType("player")) do
			local row = guiGridListAddRow (playerList)
			guiGridListSetItemText (playerList, row, 1, string.gsub(getPlayerName(v), "#%x%x%x%x%x%x", ""), false, false)
		end
		addEventHandler ("onClientGUIClick", playerList, click)
	end
end
addEventHandler ("onClientResourceStart", resourceRoot, createPlayerList)

function click (button, state, sx, sy, x, y, z, elem, gui)
	if ((state == "down") and (gui == true) and (source == playerList)) then
		local playerName = guiGridListGetItemText (playerList, guiGridListGetSelectedItem (playerList), 1)
		outputChatBox (playerName)
	end
end

 

  • Other Languages Moderators
Posted

A princípio era só isso.

Teste e veja se tem mais algum erro no /debugscript 3

Posted (edited)

Coloque false depois de 'click' na linha 9.

Na função click, você está usando o parâmetro state e verificando se o clique está 'segurado'. Mas na verdade esse parâmetro só funciona para o state "up" (botão solto), tornando essa verificação desnecessária. Também, a verificação (source == playerList) será desnecessária já que source sempre será a gridList, e por fim, gui deve estar definido no seu código, caso contrário a verificação será sempre invalidada.

Sobre o clique nas rows, o código funcionará assim:

	local sr = guiGridListGetSelectedItem (source) -- obtendo a row selecionada
	if sr and sr ~= -1 then -- verificando se o clique foi na row
		local playerName = guiGridListGetItemText ( source, sr, 1 ) -- obtendo o valor da row selecionada
		outputChatBox ( playerName )
	else -- o clique foi fora de qualquer 'row'
		outputChatBox ( "Nenhuma row selecionada" )
	end

 

Edited by DNL291
  • Like 1
Posted
11 hours ago, DNL291 said:

Coloque false depois de 'click' na linha 9.

Na função click, você está usando o parâmetro state e verificando se o clique está 'segurado'. Mas na verdade esse parâmetro só funciona para o state "up" (botão solto), tornando essa verificação desnecessária. Também, a verificação (source == playerList) será desnecessária já que source sempre será a gridList, e por fim, gui deve estar definido no seu código, caso contrário a verificação será sempre invalidada.

Sobre o clique nas rows, o código funcionará assim:


	local sr = guiGridListGetSelectedItem (source) -- obtendo a row selecionada
	if sr and sr ~= -1 then -- verificando se o clique foi na row
		local playerName = guiGridListGetItemText ( source, sr, 1 ) -- obtendo o valor da row selecionada
		outputChatBox ( playerName )
	else -- o clique foi fora de qualquer 'row'
		outputChatBox ( "Nenhuma row selecionada" )
	end

 

Então na parte dos parametros de função ficaria assim?:

function click (button, sx, sy, x, y, z, elem)

 

Posted (edited)
9 hours ago, danblemes1 said:

Então na parte dos parametros de função ficaria assim?:


function click (button, sx, sy, x, y, z, elem)

 

Não pois os parâmetros desse evento não são esses. Os parâmetros são:

function click (button, state, absoluteX, absoluteY)

Sendo que desses parâmetros você só vai precisar usar o primeiro ( button ) :

if button == "left" then

 

8 minutes ago, danblemes1 said:

Permaneço com uma duvida, no caso eu pretendo fazer uma verificação com o player selecionado, na verificação, qual seria o elemento?

Qual tipo de verificação você quer fazer?

Edit: se for obter o jogador, getPlayerFromName não vai funcionar se o nick teve seu código hex removido.

Edited by DNL291
Posted
1 minute ago, DNL291 said:

Não pois os parâmetros desse evento não são esses. Os parâmetros são:


function click (button, state, absoluteX, absoluteY)

Sendo que desses parâmetros você só vai precisar usar o primeiro ( button ) :


if button == "left" then

 

Qual tipo de verificação você quer fazer?

1 - Onde e como eu encaixaria "button"?

2 - Pretendo verificar armas e Data 

Posted

1 - dentro do evento onClientGUIClick

2 - Como você removeu os códigos em hex. dos nicks na gridList, você vai precisar obter o jogador assim, por exemplo:

function _getPlayerFromName( name )
	if not (name) then return false end
	--
	for i,p in pairs(getElementsByType("player")) do
		if getPlayerName(p):gsub("#%x%x%x%x%x%x", "") == name then
			return p
		end
	end
	return false
end

Feito isso só substituir o uso da função getPlayerFromName por essa. Para verificar element-data você vai usar o jogador obtido com a função acima, e para as armas faça um loop com a função getPedWeapon verificando o slot do jogador com os slots de 0 a 12.

  • Like 1
Posted
5 minutes ago, DNL291 said:

1 - dentro do evento onClientGUIClick

2 - Como você removeu os códigos em hex. dos nicks na gridList, você vai precisar obter o jogador assim, por exemplo:


function _getPlayerFromName( name )
	if not (name) then return false end
	--
	for i,p in pairs(getElementsByType("player")) do
		if getPlayerName(p):gsub("#%x%x%x%x%x%x", "") == name then
			return p
		end
	end
	return false
end

Feito isso só substituir o uso da função getPlayerFromName por essa. Para verificar element-data você vai usar o jogador obtido com a função acima, e para as armas faça um loop com a função getPedWeapon verificando o slot do jogador com os slots de 0 a 12.

Mas "guiGridListGetText" não seria pra obter o Jogador selecionado?

Posted
4 minutes ago, danblemes1 said:

Mas "guiGridListGetText" não seria pra obter o Jogador selecionado?

Retorna a string ou texto da row selecionada.

Posted
2 minutes ago, DNL291 said:

Retorna a string ou texto da row selecionada.

Então eu teria que fazer desta forma?:pl

playerName = guiGridListGetItemText ( source, sr, 1)

thePlayer = _getPlayerFromName (playerName)

 

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