#DeltaSCR Posted February 18, 2019 Share Posted February 18, 2019 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
#DaNiLiN Posted February 18, 2019 Share Posted February 18, 2019 Bom, na wiki mesmo deixa um exemplo... '-' local playerList = guiCreateGridList(0.80, 0.40, 0.15, 0.35, true) guiGridListAddColumn(playerList, "Player", 0.85) for _, player in ipairs(getElementsByType("player")) do guiGridListAddRow(playerList, getPlayerName(player)) end Link to comment
Other Languages Moderators androksi Posted February 18, 2019 Other Languages Moderators Share Posted February 18, 2019 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
#DeltaSCR Posted February 18, 2019 Author Share Posted February 18, 2019 (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 February 18, 2019 by danblemes1 Link to comment
Other Languages Moderators androksi Posted February 18, 2019 Other Languages Moderators Share Posted February 18, 2019 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. Link to comment
Other Languages Moderators Lord Henry Posted February 18, 2019 Other Languages Moderators Share Posted February 18, 2019 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. Link to comment
#DeltaSCR Posted February 18, 2019 Author Share Posted February 18, 2019 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 Link to comment
Other Languages Moderators androksi Posted February 18, 2019 Other Languages Moderators Share Posted February 18, 2019 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 Lord Henry Posted February 18, 2019 Other Languages Moderators Share Posted February 18, 2019 (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 February 18, 2019 by Lord Henry 1 Link to comment
Other Languages Moderators androksi Posted February 19, 2019 Other Languages Moderators Share Posted February 19, 2019 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
Other Languages Moderators Lord Henry Posted February 19, 2019 Other Languages Moderators Share Posted February 19, 2019 Manda print por privado de alguns painéis DX que vc fez. Quero ver se vc é bom mesmo. Link to comment
#DeltaSCR Posted February 20, 2019 Author Share Posted February 20, 2019 Bom, eu fiz essa parte do código baseado na WikiMTA, porém o debug está indicando os seguintes erros: Spoiler https://prntscr.com/mnmpty 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
Other Languages Moderators Lord Henry Posted February 20, 2019 Other Languages Moderators Share Posted February 20, 2019 Você botou playerList quando o certo é playersList Link to comment
#DeltaSCR Posted February 20, 2019 Author Share Posted February 20, 2019 1 hour ago, Lord Henry said: Você botou playerList quando o certo é playersList Ah sim, realmente, mas fora isso está tudo certo? Link to comment
Other Languages Moderators Lord Henry Posted February 20, 2019 Other Languages Moderators Share Posted February 20, 2019 A princípio era só isso. Teste e veja se tem mais algum erro no /debugscript 3 Link to comment
DNL291 Posted February 20, 2019 Share Posted February 20, 2019 (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 February 20, 2019 by DNL291 1 Link to comment
#DeltaSCR Posted February 21, 2019 Author Share Posted February 21, 2019 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
#DeltaSCR Posted February 21, 2019 Author Share Posted February 21, 2019 Permaneço com uma duvida, no caso eu pretendo fazer uma verificação com o player selecionado, na verificação, qual seria o elemento? Link to comment
DNL291 Posted February 21, 2019 Share Posted February 21, 2019 (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 February 21, 2019 by DNL291 Link to comment
#DeltaSCR Posted February 21, 2019 Author Share Posted February 21, 2019 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
DNL291 Posted February 21, 2019 Share Posted February 21, 2019 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. 1 Link to comment
#DeltaSCR Posted February 21, 2019 Author Share Posted February 21, 2019 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
DNL291 Posted February 21, 2019 Share Posted February 21, 2019 4 minutes ago, danblemes1 said: Mas "guiGridListGetText" não seria pra obter o Jogador selecionado? Retorna a string ou texto da row selecionada. Link to comment
#DeltaSCR Posted February 21, 2019 Author Share Posted February 21, 2019 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) Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now