main Posted January 10, 2019 Share Posted January 10, 2019 function countPlayerAccount(player) local result = 0 local serial = getPlayerSerial(player) for _, account in ipairs(getAccounts()) do if getAccountData(account, "serial") == serial then result = result + 1 end end return result end Fiz essa função há um tempo para não permitir criar mais de 2 contas por serial, porém esse loop do getAccounts() laga o servidor quando executado, qual outra possibilidade de fazer isso? Link to comment
Other Languages Moderators Lord Henry Posted January 10, 2019 Other Languages Moderators Share Posted January 10, 2019 Bom, eu uso esse painel de login que também só permite 1 conta por serial. Na parte de registrar contas, ele verifica se já existe uma conta com o serial do jogador que está tentando registrar uma conta. Se tiver, bloqueia o registro e pede para que ele logue nela. Em vez de você usar getAccountData que é um pouco pesado de processar, use a função getAccountsBySerial, que retorna todas as contas que possuem o serial específico. Se existe alguma, então cancela o registro do jogador e pede para que ele logue nela. local myAccounts = getAccountsBySerial (getPlayerSerial (client)) -- myAccounts é uma table com todas as contas que existem com o serial do jogador. if myAccounts[1] then -- Se existe o primeiro item da table, então: outputChatBox ("Você já tem uma conta registrada. Logue nela: "..getAccountName(myAccounts[1]), client) -- Manda isso no chat do jogador, informando o login da conta que já existe. end 1 Link to comment
Other Languages Moderators androksi Posted January 10, 2019 Other Languages Moderators Share Posted January 10, 2019 O melhor a se fazer é criar um banco de dados com as contas dos jogadores. Sendo assim, com um SELECT (bem escrito), levaria menos de 1 segundo para realizar uma verificação. 1 Link to comment
Other Languages Moderators Lord Henry Posted January 10, 2019 Other Languages Moderators Share Posted January 10, 2019 (edited) 41 minutes ago, asrzk said: O melhor a se fazer é criar um banco de dados com as contas dos jogadores. Discordo. Não acho útil criar outro banco de dados para colocar as contas dos jogadores. Não tem motivo algum pra fazer isso. É melhor usar o banco de dados nativo para isso. Edited January 10, 2019 by Lord Henry 2 Link to comment
Other Languages Moderators androksi Posted January 10, 2019 Other Languages Moderators Share Posted January 10, 2019 1 minute ago, Lord Henry said: Discordo. Por que discorda. Lord? Para mim, banco de dados além de ser um ótimo recurso para armazenar dados e obtê-los de forma rápida, as chances de você perder os dados são menores. Já dados salvos na internal ou registry, podem ser perdidos facilmente caso ocorra alguma falha na hospedagem do servidor ou algo do tipo. Também, banco de dados (MySQL pra ser mais específico), possui comandos de realizar backup e salvar em determinado local. Bem, é assim que eu trabalho: usando banco de dados. Cada um faz do seu jeito. Link to comment
Other Languages Moderators Lord Henry Posted January 10, 2019 Other Languages Moderators Share Posted January 10, 2019 (edited) 3 minutes ago, asrzk said: Por que discorda. Lord? Discordo de vc ter dito que é mais fácil criar um banco de dados pra salvar as contas. Isso é desnecessário, pois já existe um banco de dados nativo para salvar as contas, não há motivo para criar algo que já existe. Além disso todas as funções nativas de obter dados das contas deixariam de funcionar. No fim das contas é mais uma coisa pra ficar dando dores de cabeça mais tarde. Edited January 10, 2019 by Lord Henry 1 Link to comment
Other Languages Moderators androksi Posted January 10, 2019 Other Languages Moderators Share Posted January 10, 2019 2 minutes ago, Lord Henry said: Discordo de vc ter dito que é mais fácil criar um banco de dados pra salvar as contas. Isso não é possível, pois já existe um banco de dados nativo para salvar as contas, não há motivo para criar algo que já existe. Ah, sim, tudo bem. Desculpe a minha má interpretação. É que eu costumo trabalhar com servidores vinculados à sites. Neste caso, para mim, é mais fácil. De qualquer forma; você está correto sobre criar coisas que já existem, não faz sentido. AHAUHAHUAUHA 1 Link to comment
[M]ister Posted January 10, 2019 Share Posted January 10, 2019 Só uma dica também, antes de querer criar essa limitação, seria adequado utilizar métodos eficazes de recuperação de senha, pois constantemente o pessoal acaba se esquecendo de suas senhas (usam o “salvar senha” e em algum tempo limpa o cache e se esquece) e caso não consigam jogar criando uma outra conta, a perda de players seria considerável. Exemplos recuperação de senha: Por e-mail (usando API, ex: https://www.mailgun.com, https://sendgrid.com, ou então um Servidor Web + Gmail) Por informações pessoais (data nascimento / nome do cachorro / da escola / da mãe ….) 1 Link to comment
main Posted January 10, 2019 Author Share Posted January 10, 2019 3 hours ago, Lord Henry said: Bom, eu uso esse painel de login que também só permite 1 conta por serial. Na parte de registrar contas, ele verifica se já existe uma conta com o serial do jogador que está tentando registrar uma conta. Se tiver, bloqueia o registro e pede para que ele logue nela. Em vez de você usar getAccountData que é um pouco pesado de processar, use a função getAccountsBySerial, que retorna todas as contas que possuem o serial específico. Se existe alguma, então cancela o registro do jogador e pede para que ele logue nela. local myAccounts = getAccountsBySerial (getPlayerSerial (client)) -- myAccounts é uma table com todas as contas que existem com o serial do jogador. if myAccounts[1] then -- Se existe o primeiro item da table, então: outputChatBox ("Você já tem uma conta registrada. Logue nela: "..getAccountName(myAccounts[1]), client) -- Manda isso no chat do jogador, informando o login da conta que já existe. end Já utilizei essa função a um tempo atrás para a mesma coisa, porém, não usei dessa forma. Muito obrigado @Lord Henry. Link to comment
main Posted January 10, 2019 Author Share Posted January 10, 2019 21 minutes ago, MaligNos said: Só uma dica também, antes de querer criar essa limitação, seria adequado utilizar métodos eficazes de recuperação de senha, pois constantemente o pessoal acaba se esquecendo de suas senhas (usam o “salvar senha” e em algum tempo limpa o cache e se esquece) e caso não consigam jogar criando uma outra conta, a perda de players seria considerável. Exemplos recuperação de senha: Por e-mail (usando API, ex: https://www.mailgun.com, https://sendgrid.com, ou então um Servidor Web + Gmail) Por informações pessoais (data nascimento / nome do cachorro / da escola / da mãe ….) Obrigado pela dica. Eu tenho um sistema de recuperação de senha em PHP(é preciso fazer a hospedagem desse arquivo em algum domínio) que funciona através da função callRemote. Caso o jogador esquecer a senha, ele irá escrever seu nome de usuário e clicar no botão de recuperação, será enviado um e-mail dizendo a senha dele para o e-mail que ele cadastrou na hora que se registrou no servidor. (Isso tudo no próprio painel de login). Link to comment
DNL291 Posted January 10, 2019 Share Posted January 10, 2019 (edited) getAccountsBySerial na verdade já funciona com um SELECT pra retornar as contas, então dizer que um sistema de contas que utiliza banco de dados é mais rápido pode ser um engano. Aqui está como a função é definida no código fonte do MTA: https://github.com/multitheftauto/mtasa-blue/blob/master/Server/mods/deathmatch/logic/CAccountManager.cpp#L903 Edited January 10, 2019 by DNL291 1 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