Joaovit13 Posted January 24, 2021 Share Posted January 24, 2021 local accName = getAccountName ( getPlayerAccount ( thePlayer ) ) if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Bronze" ) ) then Ele está me retornando uma Boolean value e não consigo concatenar qual seria o meu erro? Link to comment
Other Languages Moderators androksi Posted January 24, 2021 Other Languages Moderators Share Posted January 24, 2021 thePlayer é, de fato, o parâmetro da sua função que recebe o jogador? Você não está verificando se a função getPlayerAccount está retornando uma conta válida. Use isGuestAccount para verificar. 1 Link to comment
Joaovit13 Posted January 25, 2021 Author Share Posted January 25, 2021 16 hours ago, andreisrw said: thePlayer é, de fato, o parâmetro da sua função que recebe o jogador? Você não está verificando se a função getPlayerAccount está retornando uma conta válida. Use isGuestAccount para verificar. Sim o thePlayer é o parâmetro da minha função, tentei verificar dessa fora porém ainda deu errado local player = getPlayerAccount(thePlayer) if isGuestAccount(player) then if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Bronze" ) ) then Ele está me retornando a Boolean value ainda. Só que agora no getPlayerAccount e no isGuestAccount(player) then Link to comment
Boechat Posted January 25, 2021 Share Posted January 25, 2021 1 hour ago, Joaovit13 said: Sim o thePlayer é o parâmetro da minha função, tentei verificar dessa fora porém ainda deu errado local player = getPlayerAccount(thePlayer) if isGuestAccount(player) then if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Bronze" ) ) then Ele está me retornando a Boolean value ainda. Só que agora no getPlayerAccount e no isGuestAccount(player) then Sua condição está errada, só vai ser verdadeira se for uma conta de convidado, não se não for. E outra, onde você está criando a variável accName?? Teste isso e veja se funciona (não testei) : local account = getPlayerAccount ( thePlayer ) local accName = getAccountName ( account ) if not isGuestAccount(account) then if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Bronze" ) ) then --CÓDIGO end end Link to comment
Joaovit13 Posted January 25, 2021 Author Share Posted January 25, 2021 (edited) 25 minutes ago, Boechat said: Sua condição está errada, só vai ser verdadeira se for uma conta de convidado, não se não for. E outra, onde você está criando a variável accName?? Teste isso e veja se funciona (não testei) : local account = getPlayerAccount ( thePlayer ) local accName = getAccountName ( account ) if not isGuestAccount(account) then if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Bronze" ) ) then --CÓDIGO end end function vipBronze(thePlayer) local account = getPlayerAccount ( thePlayer ) local accName = getAccountName ( account ) if not isGuestAccount(account) then if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Bronze" ) ) then givePlayerMoney(player, 5000) end end end setTimer(vipBronze, 60, 1) Meu código ficou desse jeito porém está dando bad argument no getPlayerAccount, getAccountName e no isGuestAccount e fora a concatenação que ainda está dando erro. Edited January 25, 2021 by Joaovit13 Link to comment
Boechat Posted January 25, 2021 Share Posted January 25, 2021 (edited) 6 minutes ago, Joaovit13 said: function vipBronze(thePlayer) local account = getPlayerAccount ( thePlayer ) local accName = getAccountName ( account ) if not isGuestAccount(account) then if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Bronze" ) ) then givePlayerMoney(player, 5000) end end end setTimer(vipBronze, 60, 1) Meu código ficou desse jeito porém está dando bad argument no getPlayerAccount, getAccountName e no isGuestAccount e fora a concatenação que ainda está dando erro. Esse setTimer está fora da função? Porque pelo visto ele está chamando a função do nada e não está passando o thePlayer como parâmetro. function vipBronze(thePlayer) local account = getPlayerAccount ( thePlayer ) local accName = getAccountName ( account ) if not isGuestAccount(account) then if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Bronze" ) ) then givePlayerMoney(player, 5000) end end end addCommandHandler ('vipbronze', vipBronze) Testa com um comando pra ver se vai funcionar. Se funcionar, o problema é na hora de chamar a função. Aparentemente você n está passando o thePlayer do parâmetro. Lembrando que a pessoa que der o comando deve estar na acl Bronze e todo o código é server-side. Edited January 25, 2021 by Boechat Link to comment
Joaovit13 Posted January 25, 2021 Author Share Posted January 25, 2021 15 minutes ago, Boechat said: Esse setTimer está fora da função? Porque pelo visto ele está chamando a função do nada e não está passando o thePlayer como parâmetro. function vipBronze(thePlayer) local account = getPlayerAccount ( thePlayer ) local accName = getAccountName ( account ) if not isGuestAccount(account) then if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Bronze" ) ) then givePlayerMoney(player, 5000) end end end addCommandHandler ('vipbronze', vipBronze) Testa com um comando pra ver se vai funcionar. Se funcionar, o problema é na hora de chamar a função. Aparentemente você n está passando o thePlayer do parâmetro. Lembrando que a pessoa que der o comando deve estar na acl Bronze e todo o código é server-side. Então pelo addCommandHandler funcionou porém eu queria que a cada tantos minutos dava o dinheiro pro player, quais parâmetros devo passar para o setTimer? Link to comment
Boechat Posted January 25, 2021 Share Posted January 25, 2021 (edited) 7 minutes ago, Joaovit13 said: Então pelo addCommandHandler funcionou porém eu queria que a cada tantos minutos dava o dinheiro pro player, quais parâmetros devo passar para o setTimer? Então você não pode passar o player por parâmetro, deve verificar dentro da função. local tempo = 10000 --tempo em milisegundos function vipBronze() for i, thePlayer in ipairs(getElementsByType('player')) do --Pega todos os players do servidor, joga dentro de um for (estrutura de repetição) local account = getPlayerAccount ( thePlayer ) --Pega conta do player da vez (vai verificar todos os players do servidor, um por um) local accName = getAccountName ( account ) if not isGuestAccount(account) then if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Bronze" ) ) then givePlayerMoney(thePlayer, 5000) end end end end setTimer(vipBronze, tempo, 0) Testa aí e vê se funciona. Edited January 25, 2021 by Boechat 1 Link to comment
Joaovit13 Posted January 25, 2021 Author Share Posted January 25, 2021 11 minutes ago, Boechat said: Então você não pode passar o player por parâmetro, deve verificar dentro da função. local tempo = 10000 --tempo em milisegundos function vipBronze() for i, thePlayer in ipairs(getElementsByType('player')) do --Pega todos os players do servidor, joga dentro de um for (estrutura de repetição) local account = getPlayerAccount ( thePlayer ) --Pega conta do player da vez (vai verificar todos os players do servidor, um por um) local accName = getAccountName ( account ) if not isGuestAccount(account) then if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Bronze" ) ) then givePlayerMoney(thePlayer, 5000) end end end end setTimer(vipBronze, tempo, 0) Testa aí e vê se funciona. Muito Obrigado irmão consegui aqui agora eu entendi que não pode declarar o parâmetro na função e sim dentro dela, muito obrigado mesmo Link to comment
Boechat Posted January 25, 2021 Share Posted January 25, 2021 28 minutes ago, Joaovit13 said: Muito Obrigado irmão consegui aqui agora eu entendi que não pode declarar o parâmetro na função e sim dentro dela, muito obrigado mesmo Por nada, qualquer coisa estamos aí Mas pera, pode declarar parâmetros na função sim! O que acontece é que você não estava chamando a função pra um player específico. Vou te dar um exemplo de um jeito (menos eficiente, porém só pra demonstração) de chamar uma função com parâmetro: function darDinheiro (thePlayer) givePlayerMoney(thePlayer, 5000) end function vipBronze() for i, thePlayer in ipairs(getElementsByType('player')) do local account = getPlayerAccount ( thePlayer ) local accName = getAccountName ( account ) if not isGuestAccount(account) then if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Bronze" ) ) then darDinheiro (thePlayer) --Se todas as condições estiverem ok, chama a função de dar dinheiro passando o player expecífico como parâmetro end end end end setTimer(vipBronze, tempo, 0) Link to comment
Other Languages Moderators androksi Posted January 25, 2021 Other Languages Moderators Share Posted January 25, 2021 A solução encontrada por vocês, é sim eficaz, porém podem haver sobrecargas no servidor, devido à função isObjectInACLGroup. Caso o servidor atinja uma quantidade considerável de jogadores - mais que 100 - essa função pode até causar um NETWORK TROUBLE no servidor. Claro que não é tão assim de forma exagerada, depende de vários fatores, incluindo o potencial de processamento do servidor - mas né, não vamos deixar algo mal feito. Você poderia definir um timer assim que o jogador entrar numa sessão (login). Dessa forma, cada um iria receber o prêmio (ou dinheiro, como vejo no exemplo acima), de acordo com a sessão. Ninguém iria receber ao mesmo tempo, o que já tiraria uma grande responsabilidade do servidor de processar várias informações de uma só vez. Porém, também tenho alguns contras sobre o setTimer. Infelizmente, terá vários timers dentro do resource rodando. O que pode ou não ser um problema - ao meu ver, não é tão prejudicial assim. Mas, venho com outra solução, que seria melhor! Assim que o jogador entrar na sessão, insira-o numa tabela e, ao invés de percorrer todos os jogadores usando o getElementsByType, você iria percorrer apenas a tabela, com alguns jogadores apenas. Isso sim já seria uma ótima solução e que causaria o mínimo de impacto no servidor. Spoiler local premiumPlayers = {} local premiumTimer addEventHandler("onPlayerLogin", root, function(_, pAccount) local accountName = getAccountName(pAccount) if isObjectInACLGroup("user." .. accountName, aclGetGroup("Premium")) then table.insert(premiumPlayers, source) if #premiumPlayers == 1 then if not premiumTimer then premiumTimer = setTimer(function() for k, v in pairs(premiumPlayers) do givePlayerMoney(v, 50000) end end, 60000 * 5, 0) end end end end) addEventHandler("onPlayerQuit", root, function() for k, v in pairs(premiumPlayers) do if v == source then table.remove(premiumPlayers, k) break end end if #premiumPlayers == 0 then if premiumTimer and isTimer(premiumTimer) then killTimer(premiumTimer) premiumTimer = nil end end end) Pode parecer uma solução meio grande à primeira vista, mas é bem otimizada. O timer só irá se iniciar caso algum jogador Premium entre numa sessão - apenas uma vez, claro; O timer também irá se desfazer e ser destruído caso não haja mais jogadores premium no servidor; Concluindo, você evitou de percorrer todos os jogadores do servidor - que poderia ser acima de 100, 200 ou até 300 - para uma simples tabela que haverá alguns jogadores. Acredito eu que, menos de 50 jogadores. O importante é otimizar os timers e ser o mais específico e objetivo possível. 1 Link to comment
Joaovit13 Posted January 25, 2021 Author Share Posted January 25, 2021 1 hour ago, andreisrw said: A solução encontrada por vocês, é sim eficaz, porém podem haver sobrecargas no servidor, devido à função isObjectInACLGroup. Caso o servidor atinja uma quantidade considerável de jogadores - mais que 100 - essa função pode até causar um NETWORK TROUBLE no servidor. Claro que não é tão assim de forma exagerada, depende de vários fatores, incluindo o potencial de processamento do servidor - mas né, não vamos deixar algo mal feito. Você poderia definir um timer assim que o jogador entrar numa sessão (login). Dessa forma, cada um iria receber o prêmio (ou dinheiro, como vejo no exemplo acima), de acordo com a sessão. Ninguém iria receber ao mesmo tempo, o que já tiraria uma grande responsabilidade do servidor de processar várias informações de uma só vez. Porém, também tenho alguns contras sobre o setTimer. Infelizmente, terá vários timers dentro do resource rodando. O que pode ou não ser um problema - ao meu ver, não é tão prejudicial assim. Mas, venho com outra solução, que seria melhor! Assim que o jogador entrar na sessão, insira-o numa tabela e, ao invés de percorrer todos os jogadores usando o getElementsByType, você iria percorrer apenas a tabela, com alguns jogadores apenas. Isso sim já seria uma ótima solução e que causaria o mínimo de impacto no servidor. Hide contents local premiumPlayers = {} local premiumTimer addEventHandler("onPlayerLogin", root, function(_, pAccount) local accountName = getAccountName(pAccount) if isObjectInACLGroup("user." .. accountName, aclGetGroup("Premium")) then table.insert(premiumPlayers, source) if #premiumPlayers == 1 then if not premiumTimer then premiumTimer = setTimer(function() for k, v in pairs(premiumPlayers) do givePlayerMoney(v, 50000) end end, 60000 * 5, 0) end end end end) addEventHandler("onPlayerQuit", root, function() for k, v in pairs(premiumPlayers) do if v == source then table.remove(premiumPlayers, k) break end end if #premiumPlayers == 0 then if premiumTimer and isTimer(premiumTimer) then killTimer(premiumTimer) premiumTimer = nil end end end) Pode parecer uma solução meio grande à primeira vista, mas é bem otimizada. O timer só irá se iniciar caso algum jogador Premium entre numa sessão - apenas uma vez, claro; O timer também irá se desfazer e ser destruído caso não haja mais jogadores premium no servidor; Concluindo, você evitou de percorrer todos os jogadores do servidor - que poderia ser acima de 100, 200 ou até 300 - para uma simples tabela que haverá alguns jogadores. Acredito eu que, menos de 50 jogadores. O importante é otimizar os timers e ser o mais específico e objetivo possível. Eita irmão eu não sabia que podia acontecer esse problema ae, obrigado pelo script e pelo aviso. Link to comment
Boechat Posted January 26, 2021 Share Posted January 26, 2021 18 hours ago, andreisrw said: A solução encontrada por vocês, é sim eficaz, porém podem haver sobrecargas no servidor, devido à função isObjectInACLGroup. Caso o servidor atinja uma quantidade considerável de jogadores - mais que 100 - essa função pode até causar um NETWORK TROUBLE no servidor. Claro que não é tão assim de forma exagerada, depende de vários fatores, incluindo o potencial de processamento do servidor - mas né, não vamos deixar algo mal feito. Você poderia definir um timer assim que o jogador entrar numa sessão (login). Dessa forma, cada um iria receber o prêmio (ou dinheiro, como vejo no exemplo acima), de acordo com a sessão. Ninguém iria receber ao mesmo tempo, o que já tiraria uma grande responsabilidade do servidor de processar várias informações de uma só vez. Porém, também tenho alguns contras sobre o setTimer. Infelizmente, terá vários timers dentro do resource rodando. O que pode ou não ser um problema - ao meu ver, não é tão prejudicial assim. Mas, venho com outra solução, que seria melhor! Assim que o jogador entrar na sessão, insira-o numa tabela e, ao invés de percorrer todos os jogadores usando o getElementsByType, você iria percorrer apenas a tabela, com alguns jogadores apenas. Isso sim já seria uma ótima solução e que causaria o mínimo de impacto no servidor. Reveal hidden contents local premiumPlayers = {} local premiumTimer addEventHandler("onPlayerLogin", root, function(_, pAccount) local accountName = getAccountName(pAccount) if isObjectInACLGroup("user." .. accountName, aclGetGroup("Premium")) then table.insert(premiumPlayers, source) if #premiumPlayers == 1 then if not premiumTimer then premiumTimer = setTimer(function() for k, v in pairs(premiumPlayers) do givePlayerMoney(v, 50000) end end, 60000 * 5, 0) end end end end) addEventHandler("onPlayerQuit", root, function() for k, v in pairs(premiumPlayers) do if v == source then table.remove(premiumPlayers, k) break end end if #premiumPlayers == 0 then if premiumTimer and isTimer(premiumTimer) then killTimer(premiumTimer) premiumTimer = nil end end end) Pode parecer uma solução meio grande à primeira vista, mas é bem otimizada. O timer só irá se iniciar caso algum jogador Premium entre numa sessão - apenas uma vez, claro; O timer também irá se desfazer e ser destruído caso não haja mais jogadores premium no servidor; Concluindo, você evitou de percorrer todos os jogadores do servidor - que poderia ser acima de 100, 200 ou até 300 - para uma simples tabela que haverá alguns jogadores. Acredito eu que, menos de 50 jogadores. O importante é otimizar os timers e ser o mais específico e objetivo possível. Sim, eu também não gosto de usar ACL nem timer, faço tudo por banco de dados ou pelo setAccountData. Já o timer eu substituo por getTickCount () 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