Jump to content

[Ajuda]GridList


Recommended Posts

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)

 

Link to comment
  • Other Languages Moderators

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

 

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

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

Link to comment

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

 

Link to comment

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
Link to comment
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)

 

Link to comment
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
Link to comment
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 

Link to comment

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
Link to comment
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?

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