joao2235

[AJUDA] Meu painel GUI não mostra a gridlist.

Recommended Posts

SERVER:

MarkerGuardar = createMarker (359.159, 207.26, 1007.383, "cylinder", 1.5, 255,255,255,50)
setElementInterior(MarkerGuardar, 3) 
setElementDimension(MarkerGuardar, 1)

function AbrirPainelGUI(player)
	triggerClientEvent(player,"showHide", root)
end
addEventHandler("onMarkerHit", MarkerGuardar, AbrirPainelGUI)

CLIENT:

GUIEditor = {
    gridlist = {},
    window = {},
    button = {}
}
addEventHandler("onClientResourceStart", resourceRoot,
    function()
        GUIEditor.window[1] = guiCreateWindow(773, 341, 369, 442, "Guardar Armas", false)
        guiWindowSetSizable(GUIEditor.window[1], false)
        guiSetVisible(GUIEditor.window[1], false)
		centerGUI(GUIEditor.window[1])

        GUIEditor.button[1] = guiCreateButton(785, 740, 134, 33, "Guardar", false, GUIEditor.window[1])


        GUIEditor.button[2] = guiCreateButton(998, 740, 134, 33, "Fechar", false, GUIEditor.window[1])


        GUIEditor.gridlist[1] = guiCreateGridList(781, 370, 351, 362, false, GUIEditor.window[1])
        guiGridListAddColumn(GUIEditor.gridlist[1], "Armas", 0.5)
        guiGridListAddColumn(GUIEditor.gridlist[1], "Munição", 0.5)    
    end
)

function Abrir()
	if guiGetVisible(GUIEditor.window[1]) == true then
		guiSetVisible(GUIEditor.window[1],false)
		showCursor(false)
		guiGridListClear(GUIEditor.gridlist[1])
	elseif guiGetVisible(GUIEditor.window[1]) == false then
		guiSetVisible(GUIEditor.window[1],true)
		showCursor(true)
		guiGridListClear(GUIEditor.gridlist[1])
		triggerServerEvent("getDataFromServer",getLocalPlayer(),getLocalPlayer())
	end
end
addEvent("showHide", true)
addEventHandler("showHide", root , Abrir)

 

Share this post


Link to post
Posted (edited)

Da próxima vez poste na seção de Programação em Lua.

Você está tentando usar a função útil centerWindow (que vc trocou pro nome centerGUI) mas ela não existe no seu código. Funções úteis precisam ter seu código declarado para funcionarem, pois não são funções nativas do MTA.

No seu client tem um triggerServerEvent de um evento que não existe no server.

Você teria descoberto isso se usasse o comando /debugscript 3

Edited by Lord Henry
  • Thanks 1

Share this post


Link to post

Não é necessário passar pra server-side pra abrir o painel já que não necessita de permissão, você pode usar apenas onClientMarkerHit.

Correção:

local sX, sY = guiGetScreenSize ()
local markerGuardar = createMarker (-2407.54, -598.33, 132.64, "cylinder", 1.5, 255, 255, 255, 50)

addEventHandler ("onClientResourceStart", resourceRoot, function ()
	defaultWindow = guiCreateWindow (sX/2 - 185, sY/2 - 220, 370, 440, "Guardar Armas", false)
	guiWindowSetSizable (defaultWindow, false)
	guiSetVisible (defaultWindow, false)
	
	btnGuardar = guiCreateButton (10, 396, 112, 34, "Guardar", false, defaultWindow)
	btnFechar = guiCreateButton (247, 396, 112, 34, "Fechar", false, defaultWindow)
        
	defaultGrid = guiCreateGridList (9, 26, 350, 360, false, defaultWindow)
	guiGridListAddColumn (defaultGrid, "Arma", 0.7)
	guiGridListAddColumn (defaultGrid, "Munição", 0.20)    
end)

addEventHandler ("onClientGUIClick", root, function (btn)
	if btn ~= "left" then return end
	if source == btnGuardar then 
		outputChatBox ("Btn: "..btn, 0, 255, 0)
	elseif source == btnFechar then
		Abrir ()
	end
end)	

addEventHandler ("onClientMarkerHit", getRootElement(), function (hitPlayer, matchingDimension)
	if hitPlayer and getElementType (hitPlayer) == "player" and matchingDimension then
		Abrir ()
	end	
end)

function Abrir ()
	if guiGetVisible (defaultWindow) == true then
		guiSetVisible (defaultWindow, false)
		showCursor (false)
		-- guiGridListClear (defaultGrid)
	elseif guiGetVisible (defaultWindow) == false then
		guiSetVisible (defaultWindow,true)
		showCursor (true)
		-- guiGridListClear (defaultGrid)
	end
end

OBS: Não entendi o motivo de você usar centerWindow sendo que você pode calcular a posição do centro manual. (Fiz isso por você se tiver dúvidas sobre GUI pode dar uma olhada no tópico do @Lord Henry.)

Tópico: Aqui

  • Like 1
  • Thanks 1

Share this post


Link to post

Primeiramente muito obrigado pelo apoio. Tenham certeza de que vocês são decisivos e responsáveis pelo crescimento gigantesco desse game incrível.

Dessa forma no script do Jonas^ todos os Markers abrem o painel. Mas corrigi da seguinte forma:

CLIENT:

local sX, sY = guiGetScreenSize ()

addEventHandler ("onClientResourceStart", resourceRoot, function ()
	defaultWindow = guiCreateWindow (sX/2 - 185, sY/2 - 220, 370, 440, "Guardar Armas", false)
	guiWindowSetSizable (defaultWindow, false)
	guiSetVisible (defaultWindow, false)
	
	btnGuardar = guiCreateButton (10, 396, 112, 34, "Guardar", false, defaultWindow)
	btnFechar = guiCreateButton (247, 396, 112, 34, "Fechar", false, defaultWindow)
        
	defaultGrid = guiCreateGridList (9, 26, 350, 360, false, defaultWindow)
	guiGridListAddColumn (defaultGrid, "Arma", 0.7)
	guiGridListAddColumn (defaultGrid, "Munição", 0.20)    
end)

addEventHandler ("onClientGUIClick", root, function (btn)
	if btn ~= "left" then return end
	if source == btnGuardar then 
		outputChatBox ("Btn: "..btn, 0, 255, 0)
	elseif source == btnFechar then
		Abrir ()
	end
end)	

--[[addEventHandler ("onClientMarkerHit", getRootElement(), function (hitPlayer, matchingDimension)
	if hitPlayer and getElementType (hitPlayer) == "player" and matchingDimension then
		Abrir ()
	end	
end)]]--

function Abrir ()
	if guiGetVisible (defaultWindow) == true then
		guiSetVisible (defaultWindow, false)
		showCursor (false)
		-- guiGridListClear (defaultGrid)
	elseif guiGetVisible (defaultWindow) == false then
		guiSetVisible (defaultWindow,true)
		showCursor (true)
		-- guiGridListClear (defaultGrid)
	end
end
addEvent("painelguiopen", true)
addEventHandler("painelguiopen", root , Abrir)

 

SERVER:

MarkerGuardar = createMarker (359.159, 207.26, 1007.383, "cylinder", 1.5, 255,255,255,50)
setElementInterior(MarkerGuardar, 3) 
setElementDimension(MarkerGuardar, 1)

function AbrirPainelGuardar (source)
	triggerClientEvent (source, "painelguiopen", root)
end
addEventHandler("onMarkerHit", MarkerGuardar, AbrirPainelGuardar)

Estou iniciando como scripter, mas estou cada dia mais buscando me desenvolver. Agradeço novamente o apoio de vocês!

Como faria para conseguir colocar nessa gridlist as armas e o número de munições que o player carrega junto à cada arma ? 

Share this post


Link to post

Tentei algo assim: 
(Sem sucesso)

function updateGridList()
		local rw, cl = guiGridListGetSelectedItem(defaultGrid)
		guiGridListClear(defaultGrid)
		for slot=0, 12 do 
		if ( getPedWeapon(localPlayer, slot) ) then 
			guiGridListAddRow(defaultGrid)
		end
		guiGridListSetSelectedItem(defaultGrid, rw, cl)
	end
end

 

Share this post


Link to post

Na sua linha 6 vc está adicionando uma linha vazia na gridList. E sua linha 5 não faz sentido, pois a função getPedWeapon sempre retorna um valor inteiro, mesmo que o jogador não tenha a arma.

Substitua as linhas 5, 6 e 7 por isso:

if (getPedWeapon (localPlayer, slot) ~= 0) then -- Se o jogador tem uma arma nesse slot, então:
	guiGridListAddRow (defaultGrid, getWeaponNameFromID (getPedWeapon (localPlayer, slot)), getPedTotalAmmo (localPlayer, slot))
end

 

Share this post


Link to post

Substituí, porém sem sucesso...

function updateGridList()
		local rw, cl = guiGridListGetSelectedItem(defaultGrid)
		guiGridListClear(defaultGrid)
		for slot=0, 12 do 
		if (getPedWeapon (localPlayer, slot) ~= 0) then -- Se o jogador tem uma arma nesse slot, então:
			guiGridListAddRow (defaultGrid, getWeaponNameFromID (getPedWeapon (localPlayer, slot)), getPedTotalAmmo (localPlayer, slot))
		end
		guiGridListSetSelectedItem(defaultGrid, rw, cl)
	end
end

Print:
https://imgur.com/a/Yj89Dko

Share this post


Link to post

Era só você ter verificado com: IsElementWithinMarker se o jogador estava no marker x e se sim abriria o painel, não entendi porque passar pra server-side, bom se você realmente deseja fazer uma conexão desnecessária, ai é com você...

 

 

Share this post


Link to post
2 minutes ago, Jonas^ said:

Era só você ter verificado com: IsElementWithinMarker se o jogador estava no marker x e se sim abriria o painel, não entendi porque passar pra server-side, bom se você realmente deseja fazer uma conexão desnecessária, ai é com você...

 

 

Mesmo que estivesse apenas no client-side, ele não me mostra as armas que carrego.

Share this post


Link to post

Parece que vc não está chamando a função updateGridList ( ).

Share this post


Link to post
2 minutes ago, Lord Henry said:

Parece que vc não está chamando a função updateGridList ( ).

Exatamente, percebi isso agora. Como faria para resolver isso ?

Share this post


Link to post
Posted (edited)

Lol, vc não sabe chamar uma função?

Dentro daquela sua função Abrir na linha 91 substitua aquele comentário por updateGridList ()

Edited by Lord Henry

Share this post


Link to post

Ainda não estudei o client-side, parece que existem algumas diferenças. Sei bastante quanto ao server-side, peço desculpas por não saber ainda.

Share this post


Link to post
1 minute ago, Lord Henry said:

eiZUqKG.png

A propósito, essa é sua imagem. Use links diretos.

Exato, essa é minha imagem.

Share this post


Link to post
6 minutes ago, Lord Henry said:

Dentro daquela sua função Abrir na linha 91 substitua aquele comentário por updateGridList ()

Caso não tenha visto meu comentário.

Share this post


Link to post

Top mestre, deu certo! Você me recomendaria algum curso ou vídeo-aula para estudar sobre script MTA avançado ? 

Share this post


Link to post

Quais os princípios que precisaria usar para conseguir fazer tipo um cofre de armas junto à esse script ? 

Share this post


Link to post

Que diferença faria um cofre se esse esquema das armas é feito client-side?

Share this post


Link to post
2 hours ago, Lord Henry said:

Que diferença faria um cofre se esse esquema das armas é feito client-side?

Mestre, o que quero fazer é que o player tenha a opção de pagar para guardar as armas dele e mesmo que ele morra, pode voltar lá depois e pegar essas armas. No caso é no marker e no painel acima que vocês me ajudaram à corrigi-lo. 

Queria saber mais ou menos por cima o que teria que utilizar. Se puder me ajudar, agradeço!

Share this post


Link to post
Posted (edited)
  • setAccountData - Pra salvar as armas guardadas na conta do jogador. Também pode ser usada para salvar a senha do cofre.
  • getAccountData - Para carregar as armas guardadas quando o jogador logar.
  • giveWeapon - Para dar a arma pro jogador.
  • takeWeapon - Para retirar uma arma do jogador.
Edited by Lord Henry
  • Thanks 1

Share this post


Link to post
Posted (edited)
23 hours ago, Lord Henry said:

Pelo que estou vendo, acho mais válido vc estudar lógica de programação.

Mestre, estou estudando esses vídeos que por sinal são bons demais!

Sinceramente, não sei como começar, porque nunca mexi com Client-Side, me entende ? Não sei se crio um evento no server-side e puxo no client-side, se puder me dar esse norte me ajuda demais!

 

Edited by joao2235

Share this post


Link to post

Para chamar os lados cliente/server você usa triggerClientEvent/triggerServerEvent, além de chamar você também pode passar vários tipos de valores.

Uma dica é você começar pelo que você começou fazer, e não pensar lá na frente. Se não entende como fazer trigger, tire um tempo para testar as funções que que mostrei. Faça o mesmo para a marker, armas, GUI.

Os links deste tópico serão de muita ajuda pra você: https://forum.mtasa.com/topic/116681-informações-úteis-scriptingconfiguraçõestutoriais-para-o-mta/

 

Share this post


Link to post
7 hours ago, DNL291 said:

Para chamar os lados cliente/server você usa triggerClientEvent/triggerServerEvent, além de chamar você também pode passar vários tipos de valores.

Uma dica é você começar pelo que você começou fazer, e não pensar lá na frente. Se não entende como fazer trigger, tire um tempo para testar as funções que que mostrei. Faça o mesmo para a marker, armas, GUI.

Os links deste tópico serão de muita ajuda pra você: https://forum.mtasa.com/topic/116681-informações-úteis-scriptingconfiguraçõestutoriais-para-o-mta/

 

Sei como fazer um trigger, mas o que gostaria de saber é como faria para conseguir setar a data das armas que o Player tem e conseguir deixar salva até que ele retorne. Sei sobre a função setElementData e getElementData, só não sei como usaria dentro de uma função no client. Por isso perguntei se precisaria criar no server-side e então puxar com o trigger server para uma função no client.

Espero que me entenda, peço desculpas por não saber muito, estou buscando aprender. Ficaria grato demais se pudesse me ajudar.

Share this post


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.