Jump to content

[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)

 

Link to comment
  • Other Languages Moderators

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

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

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 ? 

Link to comment

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

 

Link to comment
  • Other Languages Moderators

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

 

Link to comment

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

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

Link to comment
  • Other Languages Moderators

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

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

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

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.multitheftauto.com/topic/116681-informações-úteis-scriptingconfiguraçõestutoriais-para-o-mta/

 

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

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