Jump to content

[Ajuda]GridList


Recommended Posts

@DNL291A Verificação das Armas está assim, porém o debug acusa que é esperado um "ped", no argumento "1", podem me ajudar? (Eis o código)

function click (button, state, absoluteX, absoluteY)
	local sr = guiGridListGetSelectedItem (source)
	if sr and sr ~= -1 then
		playerName = guiGridListGetItemText (source, sr, 1)
		thePlayer = getPlayerFromName (playerName)
	end
end

	if (getPedWeapon (thePlayer, 2)) then
		dxDrawText("Pistola (#00FF00✔#FFFFFF)", screenW * 0.3750, screenH * 0.3167, screenW * 0.4336, screenH * 0.3583, tocolor(255, 255, 255, 255), 1.00, "clear", "center", "center", false, false, false, true, false)
	else
		dxDrawText("Pistola (#FF0000✘#FFFFFF)", screenW * 0.3750, screenH * 0.3167, screenW * 0.4336, screenH * 0.3583, tocolor(255, 255, 255, 255), 1.00, "clear", "center", "center", false, false, false, true, false)
	end

 

Link to comment
  • Moderators

Tente assim:


local weapons = {}
local selectedPlayer

function click (button, state, absoluteX, absoluteY)
	local sr = guiGridListGetSelectedItem (source)
	if sr and sr ~= -1 then
		local playerName = guiGridListGetItemText (source, sr, 1)
		local thePlayer = _getPlayerFromName (playerName)
		if isElement(thePlayer) then
			for i=1,12 do
				weapons[i] = { getPedWeapon ( thePlayer, i ) }
			end
			selectedPlayer = thePlayer
		end
	else
		selectedPlayer = nil
		weapons = {}
	end
end

	if selectedPlayer and weapons[2] then
		dxDrawText("Pistola (#00FF00?#FFFFFF)", screenW * 0.3750, screenH * 0.3167, screenW * 0.4336, screenH * 0.3583, tocolor(255, 255, 255, 255), 1.00, "clear", "center", "center", false, false, false, true, false)
	else
		dxDrawText("Pistola (#FF0000?#FFFFFF)", screenW * 0.3750, screenH * 0.3167, screenW * 0.4336, screenH * 0.3583, tocolor(255, 255, 255, 255), 1.00, "clear", "center", "center", false, false, false, true, false)
	end

 

Link to comment
14 hours ago, DNL291 said:

Tente assim:


local weapons = {}
local selectedPlayer

function click (button, state, absoluteX, absoluteY)
	local sr = guiGridListGetSelectedItem (source)
	if sr and sr ~= -1 then
		local playerName = guiGridListGetItemText (source, sr, 1)
		local thePlayer = _getPlayerFromName (playerName)
		if isElement(thePlayer) then
			for i=1,12 do
				weapons[i] = { getPedWeapon ( thePlayer, i ) }
			end
			selectedPlayer = thePlayer
		end
	else
		selectedPlayer = nil
		weapons = {}
	end
end

	if selectedPlayer and weapons[2] then
		dxDrawText("Pistola (#00FF00?#FFFFFF)", screenW * 0.3750, screenH * 0.3167, screenW * 0.4336, screenH * 0.3583, tocolor(255, 255, 255, 255), 1.00, "clear", "center", "center", false, false, false, true, false)
	else
		dxDrawText("Pistola (#FF0000?#FFFFFF)", screenW * 0.3750, screenH * 0.3167, screenW * 0.4336, screenH * 0.3583, tocolor(255, 255, 255, 255), 1.00, "clear", "center", "center", false, false, false, true, false)
	end

 

@DNL291 Mas a variavel selectedPlayer não armazena nenhum valor não?

 

Link to comment
3 minutes ago, DNL291 said:

Armazena o jogador quando seleciona, e quando 'des-seleciona' remove o player da variável.

A propósito, você já testou o código?

Testei sim, porém aconteceu um erro: Está funcionado corretamente a parte de selecionar e descelecionar, só que quando eu seleciono um player, mesmo com arma nenhuma, no painel indica como se estivesse com todos os Slots ocupados...

Edited by danblemes1
Link to comment
  • Moderators
function click (button, state, absoluteX, absoluteY)
	local sr = guiGridListGetSelectedItem (source)
	if sr and sr ~= -1 then
		local playerName = guiGridListGetItemText (source, sr, 1)
		local thePlayer = _getPlayerFromName (playerName)
		if isElement(thePlayer) then
			for i=1,12 do
				local w = getPedWeapon ( thePlayer, i )
				if w and w ~= 0 then
					weapons[i] = { w }
				end
			end
			selectedPlayer = thePlayer
		end
	else
		selectedPlayer = nil
		weapons = {}
	end
end

Isso deve funcionar.

Link to comment
5 minutes ago, DNL291 said:

function click (button, state, absoluteX, absoluteY)
	local sr = guiGridListGetSelectedItem (source)
	if sr and sr ~= -1 then
		local playerName = guiGridListGetItemText (source, sr, 1)
		local thePlayer = _getPlayerFromName (playerName)
		if isElement(thePlayer) then
			for i=1,12 do
				local w = getPedWeapon ( thePlayer, i )
				if w and w ~= 0 then
					weapons[i] = { w }
				end
			end
			selectedPlayer = thePlayer
		end
	else
		selectedPlayer = nil
		weapons = {}
	end
end

Isso deve funcionar.

Só me restou uma dúvida: Então onde e como eu deveria encaixar a verificação das armas? (Se não for muito incômodo, por favor, me de um exemplo)

Link to comment
  • Moderators

A verificação não vai mudar muito, se o slot tiver vazio vai retornar nil. Mas ali no DX você pode deixar assim:

	local slot2Text = weapons[2] and "Com ".. getWeaponNameFromID(weapons[2]) or "Sem arma"
	if selectedPlayer then -- se Não quiser que mostre o dx apenas quando selecionar uma row remova essa verificação
		dxDrawText( slot2Text, screenW * 0.3750, screenH * 0.3167, screenW * 0.4336, screenH * 0.3583, tocolor(255, 255, 255, 255), 1.00, "clear", "center", "center", false, false, false, true, false)
	end

 

Edited by DNL291
Link to comment
3 minutes ago, DNL291 said:

A verificação não vai mudar muito, se o slot tiver vazio vai retornar nil. Mas ali no DX você pode deixar assim:


	local slot2Text = weapons[2] and "Com ".. getWeaponNameFromID(weapons[2]) or "Sem arma"	if selectedPlayer then -- se Não quiser que mostre o dx apenas quando selecionar uma row remova essa verificação		dxDrawText( slot2Text, screenW * 0.3750, screenH * 0.3167, screenW * 0.4336, screenH * 0.3583, tocolor(255, 255, 255, 255), 1.00, "clear", "center", "center", false, false, false, true, false)	end

 

É pq o meu objetivo é: Se ele tiver a arma, fica o "V", caso contrário "X" (ambos no painel DX)

Link to comment
  • Moderators

Então você pode deixar mais simples:

dxDrawText( (weapons[2] and "V" or "X"), screenW * 0.3750, screenH * 0.3167, screenW * 0.4336, screenH * 0.3583, tocolor(255, 255, 255, 255), 1.00, "clear", "center", "center", false, false, false, true, false)

 

Link to comment
2 minutes ago, DNL291 said:

Então você pode deixar mais simples:


dxDrawText( (weapons[2] and "V" or "X"), screenW * 0.3750, screenH * 0.3167, screenW * 0.4336, screenH * 0.3583, tocolor(255, 255, 255, 255), 1.00, "clear", "center", "center", false, false, false, true, false)

 

E oque eu faço com a Variável "slot2Text"?

Link to comment
5 minutes ago, DNL291 said:

Aquela variável era do código antigo, usando o meu último código não vai precisar dela.

Então ficaria assim:?

function click (button, state, absoluteX, absoluteY)
	local sr = guiGridListGetSelectedItem (source)
	if sr and sr ~= -1 then
		local playerName = guiGridListGetItemText (source, sr, 1)
		local thePlayer = _getPlayerFromName (playerName)
		if isElement(thePlayer) then
			for i=1,12 do
				local w = getPedWeapon ( thePlayer, i )
				if w and w ~= 0 then
					weapons[i] = { w }
				end
			end
			selectedPlayer = thePlayer
		end
	else
		selectedPlayer = nil
		weapons = {}
        dxDrawText( (weapons[2] and "Pistola(#00FF00✔#FFFFF)" or "Pistola (#FF0000✘#FFFFFF)"), screenW * 0.3750, screenH * 0.3167, screenW * 0.4336, screenH * 0.3583, tocolor(255, 255, 255, 255), 1.00, "clear", "center", "center", false, false, false, true, false)
	end
end

(Desculpe se estiver mal identado, estou pelo celular)

Link to comment

Agora eu estou obtendo o Dinheiro do Player selecionado (thePlayer), porém quando eu deseleciono o player, no DX, mantém o dinheiro do player, como posso fixar isso?

	local money = getPlayerMoney (thePlayer)
	if money and money ~= 0 then
		dxDrawText("Dinheiro: "..money.."", screenW * 0.6461, screenH * 0.3167, screenW * 0.5703, screenH * 0.3583, tocolor(255, 255, 255, 255), 1.00, "clear", "left", "center", false, false, false, false, false)
	end

 

Edited by danblemes1
Link to comment

Resolvido

 

Agora estou com o seguinte problema na verificação de data - O debugscript acusa o seguinte:

WARNING: ...:153: Bad Argument @ 'getElementData' [Expected element at argument 1, got nil]

A seguir está o código:

	if selectedPlayer then
		if getElementData (thePlayer, "AirNewSCR_Porte_de_Armas") == "Sim" then
			dxDrawText("PDA (#00FF00✔#FFFFFF)", screenW * 0.7661, screenH * 0.4333, screenW * 0.5703, screenH * 0.4750, tocolor(255, 255, 255, 255), 1.00, "clear", "center", "center", false, false, false, false, false)
		else
			dxDrawText("PDA (#FF0000✘#FFFFFF)", screenW * 0.7661, screenH * 0.4333, screenW * 0.5703, screenH * 0.4750, tocolor(255, 255, 255, 255), 1.00, "clear", "center", "center", false, false, false, false, false)
			selectedPlayer = nil
		end
	end

 

Link to comment
17 hours ago, DNL291 said:

Troque por 'selectedPlayer'.

	if selectedPlayer then
		if getElementData (selectedPlayer, "AirNewSCR_Porte_de_Armas") == "Sim" then
			dxDrawText("PDA (#00FF00✔#FFFFFF)", screenW * 0.7661, screenH * 0.4333, screenW * 0.5703, screenH * 0.4750, tocolor(255, 255, 255, 255), 1.00, "clear", "center", "center", false, false, false, true, false)
		else
			dxDrawText("PDA (#FF0000✘#FFFFFF)", screenW * 0.7661, screenH * 0.4333, screenW * 0.5703, screenH * 0.4750, tocolor(255, 255, 255, 255), 1.00, "clear", "center", "center", false, false, false, true, false)
			selectedPlayer = nil
		end
	end

Está exatamente assim, porém bugou tudo, não obtem mais dado nenhum do Player

Link to comment
  • Moderators

Pode ser o element-data não retornando o valor certo. Você também setou nil na variável selectedPlayer, com um valor inválido a verificação não vai executar e nenhum texto vai ser mostrado.

Faça um teste neste código e veja o que mostra no chat e debug:

local weapons = {}

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, false)
	end
end
addEventHandler ("onClientResourceStart", resourceRoot, createPlayerList)

function click (button)
	if button ~= "left" then return end
	
	local sr = guiGridListGetSelectedItem (source)
	if sr and sr ~= -1 then
		local playerName = guiGridListGetItemText (source, sr, 1)
		local thePlayer = _getPlayerFromName (playerName)
		if isElement(thePlayer) then
			for i=1,12 do
				local w = getPedWeapon ( thePlayer, i )
				if w and w ~= 0 then
					weapons[i] = w
				end
			end
			iprint( weapons )
			selectedPlayer = thePlayer
			c = false
		end
		outputChatBox("thePlayer: "..tostring(thePlayer))
	else
		selectedPlayer = nil
		weapons = {}
		outputChatBox("Nenhum jogador selecionado")
	end
end

addEventHandler( "onClientRender", root,
	function()
		dxDrawText( (weapons[2] and "V" or "X"), screenW * 0.3750, screenH * 0.3167, screenW * 0.4336, screenH * 0.3583, tocolor(255, 255, 255, 255), 1.00, "clear", "center", "center", false, false, false, true, false)
	
		--if selectedPlayer then
			local PDA = ""
			if selectedPlayer then
				PDA = getElementData (selectedPlayer, "AirNewSCR_Porte_de_Armas")
			end
			if c ~= true then
				outputChatBox("@PDA: "..tostring(PDA))
				c = true
			end
			if PDA == "Sim" then
				dxDrawText("PDA (#00FF00✔#FFFFFF)", screenW * 0.7661, screenH * 0.4333, screenW * 0.5703, screenH * 0.4750, tocolor(255, 255, 255, 255), 1.00, "clear", "center", "center", false, false, false, true, false)
			else	
					
				dxDrawText("PDA (#FF0000✘#FFFFFF)", screenW * 0.7661, screenH * 0.4333, screenW * 0.5703, screenH * 0.4750, tocolor(255, 255, 255, 255), 1.00, "clear", "center", "center", false, false, false, true, false)
				--selectedPlayer = nil -- você está anulando a variável que é necessária p/ o texto ser mostrado
			end
		--end
	
	end
)

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

 

Edited by DNL291
Link to comment
6 minutes ago, DNL291 said:

Pode ser o element-data não retornando o valor certo. Você também setou nil na variável selectedPlayer, com um valor inválido a verificação não vai executar e nenhum texto vai ser mostrado.

Faça um teste neste código e veja o que mostra no chat e debug:


local weapons = {}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, false)	endendaddEventHandler ("onClientResourceStart", resourceRoot, createPlayerList)function click (button)	if button ~= "left" then return end		local sr = guiGridListGetSelectedItem (source)	if sr and sr ~= -1 then		local playerName = guiGridListGetItemText (source, sr, 1)		local thePlayer = _getPlayerFromName (playerName)		if isElement(thePlayer) then			for i=1,12 do				local w = getPedWeapon ( thePlayer, i )				if w and w ~= 0 then					weapons[i] = w				end			end			iprint( weapons )			selectedPlayer = thePlayer			c = false		end		outputChatBox("thePlayer: "..tostring(thePlayer))	else		selectedPlayer = nil		weapons = {}		outputChatBox("Nenhum jogador selecionado")	endendaddEventHandler( "onClientRender", root,	function()		dxDrawText( (weapons[2] and "V" or "X"), screenW * 0.3750, screenH * 0.3167, screenW * 0.4336, screenH * 0.3583, tocolor(255, 255, 255, 255), 1.00, "clear", "center", "center", false, false, false, true, false)			--if selectedPlayer then			local PDA = ""			if selectedPlayer then				PDA = getElementData (selectedPlayer, "AirNewSCR_Porte_de_Armas")			end			if c ~= true then				outputChatBox("@PDA: "..tostring(PDA))				c = true			end			if PDA == "Sim" then				dxDrawText("PDA (#00FF00✔#FFFFFF)", screenW * 0.7661, screenH * 0.4333, screenW * 0.5703, screenH * 0.4750, tocolor(255, 255, 255, 255), 1.00, "clear", "center", "center", false, false, false, true, false)			else										dxDrawText("PDA (#FF0000✘#FFFFFF)", screenW * 0.7661, screenH * 0.4333, screenW * 0.5703, screenH * 0.4750, tocolor(255, 255, 255, 255), 1.00, "clear", "center", "center", false, false, false, true, false)				--selectedPlayer = nil -- você está anulando a variável que é necessária p/ o texto ser mostrado			end		--end		end)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 falseend

 

Vou testar e em breve te aviso o que deu, provavelmente foi isso ai da variável que você disse mesmo

Link to comment
12 hours ago, DNL291 said:

Pode ser o element-data não retornando o valor certo. Você também setou nil na variável selectedPlayer, com um valor inválido a verificação não vai executar e nenhum texto vai ser mostrado.

Faça um teste neste código e veja o que mostra no chat e debug:


local weapons = {}

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, false)
	end
end
addEventHandler ("onClientResourceStart", resourceRoot, createPlayerList)

function click (button)
	if button ~= "left" then return end
	
	local sr = guiGridListGetSelectedItem (source)
	if sr and sr ~= -1 then
		local playerName = guiGridListGetItemText (source, sr, 1)
		local thePlayer = _getPlayerFromName (playerName)
		if isElement(thePlayer) then
			for i=1,12 do
				local w = getPedWeapon ( thePlayer, i )
				if w and w ~= 0 then
					weapons[i] = w
				end
			end
			iprint( weapons )
			selectedPlayer = thePlayer
			c = false
		end
		outputChatBox("thePlayer: "..tostring(thePlayer))
	else
		selectedPlayer = nil
		weapons = {}
		outputChatBox("Nenhum jogador selecionado")
	end
end

addEventHandler( "onClientRender", root,
	function()
		dxDrawText( (weapons[2] and "V" or "X"), screenW * 0.3750, screenH * 0.3167, screenW * 0.4336, screenH * 0.3583, tocolor(255, 255, 255, 255), 1.00, "clear", "center", "center", false, false, false, true, false)
	
		--if selectedPlayer then
			local PDA = ""
			if selectedPlayer then
				PDA = getElementData (selectedPlayer, "AirNewSCR_Porte_de_Armas")
			end
			if c ~= true then
				outputChatBox("@PDA: "..tostring(PDA))
				c = true
			end
			if PDA == "Sim" then
				dxDrawText("PDA (#00FF00✔#FFFFFF)", screenW * 0.7661, screenH * 0.4333, screenW * 0.5703, screenH * 0.4750, tocolor(255, 255, 255, 255), 1.00, "clear", "center", "center", false, false, false, true, false)
			else	
					
				dxDrawText("PDA (#FF0000✘#FFFFFF)", screenW * 0.7661, screenH * 0.4333, screenW * 0.5703, screenH * 0.4750, tocolor(255, 255, 255, 255), 1.00, "clear", "center", "center", false, false, false, true, false)
				--selectedPlayer = nil -- você está anulando a variável que é necessária p/ o texto ser mostrado
			end
		--end
	
	end
)

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

 

@DNL291 Eis a print, aparentemente está funcionando

 

 

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