Other Languages Moderators Lord Henry Posted May 7, 2017 Other Languages Moderators Share Posted May 7, 2017 Olá pessoas peçonhentas. Bom, estou fazendo uns testes com portão que abre somente para determinado jogador cuja conta seja igual a um determinado campo do banco de dados. Por exemplo, quero que o portão abra somente quando o jogador da conta "lordhenry" se aproxime, mas não é tão simples, pois essa conta pode mudar caso ele venda a casa, dai o valor passa a ser vazio. Dai se outra pessoa comprar a casa, dai a conta dessa pessoa fica naquele campo que estava vazio e o portão passa a abrir somente com a conta dessa pessoa. Eu estou pensando em usar executeSQLQuery("SELECT.... Mas não sei o que declarar após isso para ele receber o valor daquela célula do banco de dados. Tentei usar: local accOwner = executeSQLQuery("SELECT 'owner' FROM 'housevip_data' WHERE 'ID'=?", 2) Ou também: local accOwner = executeSQLQuery("SELECT 'ID' FROM 'housevip_data' WHERE 'owner'=?", 2) Mas não da certo pois ele retorna uma tabela em vez de um valor. Link to comment
Other Languages Moderators Lord Henry Posted May 7, 2017 Author Other Languages Moderators Share Posted May 7, 2017 (edited) Malandramente consegui fazendo dessa forma por comando: outputChatBox ("Para movimentar o portão da casa do CJ, use o comando /garagem") outputChatBox ("Você precisa ser o proprietário da casa do CJ.") function checkOwnership (thePlayer) local houseID = 2 local hr = executeSQLQuery( "SELECT * FROM housevip_data WHERE ID=?", houseID ); -- Seleciona todo mundo do housevip_data onde a linha cujo ID seja 2 (houseID). -- Se eu trocar o houseID (2) por 1 na linha acima, ele retorna vazio pois vai pegar a linha do ID 1. local donoCJ = hr[1].owner -- Recebe o valor da coluna 'owner' da linha do ID 2. --Não sei por qual motivo coloquei 1 ali no [], só sei que se mudar dai n funciona mais '-' local acc = getAccountName(getPlayerAccount(thePlayer))--Acc recebe a conta de quem executou o comando. if donoCJ == acc then -- Se a conta do dono da casa for igual a conta de quem executou o comando, faz o seguinte: if isGarageOpen (9) then -- Se a garagem da casa do CJ estiver aberta, faz o seguinte: setGarageOpen (9, false) -- Fecha a garagem. else -- Senão, se estiver fechada, faz o seguinte: setGarageOpen (9, true) -- Abre a garagem. end else -- Se a conta do dono da casa for diferente da conta de quem executou o comando, faz o seguinte: outputChatBox ("Você não é o proprietário da casa ID "..houseID, thePlayer) end end addCommandHandler ("garagem", checkOwnership) Agora só vou criar os ColCuboid para fazer isso automaticamente quando o jogador colidir no collider da garagem. Edited May 7, 2017 by Lord Henry Link to comment
DNL291 Posted May 8, 2017 Share Posted May 8, 2017 (edited) Acho que se você usasse isto também funcionava: local accOwner = executeSQLQuery("SELECT 'owner' FROM 'housevip_data' WHERE 'ID'=?", 2)[1]['owner'] Edited May 8, 2017 by DNL291 Link to comment
Other Languages Moderators Lord Henry Posted May 8, 2017 Author Other Languages Moderators Share Posted May 8, 2017 1 minute ago, DNL291 said: Acho que se você usasse isto também funcionava: local accOwner = executeSQLQuery("SELECT 'owner' FROM 'housevip_data' WHERE 'ID'=?", 2)[1]['owner'] Mas oq significa o [1] ? Link to comment
DNL291 Posted May 8, 2017 Share Posted May 8, 2017 2 minutes ago, Lord Henry said: Mas oq significa o [1] ? Não sei te explicar o porque, talvez retorne o valor numa tabela e pra acessar ele você indexa o primeiro valor da tabela. Só suposição minha... não sou muito familiar com SQL só usei 2 vezes pra fazer scripts e obtive o valor dessa forma que mencionei. Te aconselho a pesquisar cada dúvida que surgir, vai te ajudar a se aprofundar mais nessa linguagem. Link to comment
Other Languages Moderators Lord Henry Posted May 8, 2017 Author Other Languages Moderators Share Posted May 8, 2017 Just now, DNL291 said: Não sei te explicar o porque, talvez retorne o valor numa tabela e pra acessar ele você indexa o primeiro valor da tabela. Só suposição minha... não sou muito familiar com SQL só usei 2 vezes pra fazer scripts e obtive o valor dessa forma que mencionei. Te aconselho a pesquisar cada dúvida que surgir, vai te ajudar a se aprofundar mais nessa linguagem. Hum... A propósito, o seu exemplo não deu certo.ERROR: attempt to index field '?' (a nil value) Link to comment
DNL291 Posted May 8, 2017 Share Posted May 8, 2017 (edited) Então acho que a função executeSQLQuery e funções DB tem suas diferenças, porque indexei o valor da tabela usando dbQuery. Achei que funcionasse no seu caso também, depois que li que retorna uma tabela.... Mas acredito que você possa obter o dono indexando essa tabela. Edit: é questão de fazer teste pra saber Edited May 8, 2017 by DNL291 Link to comment
Other Languages Moderators Lord Henry Posted May 8, 2017 Author Other Languages Moderators Share Posted May 8, 2017 1 minute ago, DNL291 said: Então acho que a função executeSQLQuery e funções DB tem suas diferenças, porque indexei o valor da tabela usando dbQuery. Achei que funcionasse no seu caso também, depois que li que retorna uma tabela.... Mas acredito que você possa obter o dono indexando essa tabela. Pelo o que eu li, dbQuery só é usado para banco de dados customizados, mas estou usando o banco de dados padrão (registry.db) pois é ali que o resource das casas criou a tabela. Link to comment
DNL291 Posted May 8, 2017 Share Posted May 8, 2017 (edited) Sim, eu percebi isso, mas ambos devem funcionar da mesma forma. Fiz um teste aqui e retornou o valor, indexando a tabela da forma que eu disse: run executeSQLQuery("CREATE TABLE IF NOT EXISTS teste (valor1 TEXT, string TEXT, numero INT)") run executeSQLQuery("INSERT INTO teste(valor1,string,numero) VALUES(?,?,?)", "Danilo", "dono", 100 ) run r=executeSQLQuery("SELECT valor1 FROM teste WHERE numero=?", 100 ) print( r[1]['valor1'] ) Usei esse código. Remove as virgulas e tenta fazer da mesma forma, seguindo a maneira que tá no código, deve funcionar. Edited May 8, 2017 by DNL291 Link to comment
Other Languages Moderators Lord Henry Posted May 8, 2017 Author Other Languages Moderators Share Posted May 8, 2017 10 minutes ago, DNL291 said: Sim, eu percebi isso, mas ambos devem funcionar da mesma forma. Fiz um teste aqui e retornou o valor, indexando a tabela da forma que eu disse: run executeSQLQuery("CREATE TABLE IF NOT EXISTS teste (valor1 TEXT, string TEXT, numero INT)") run executeSQLQuery("INSERT INTO teste(valor1,string,numero) VALUES(?,?,?)", "Danilo", "dono", 100 ) run r=executeSQLQuery("SELECT valor1 FROM teste WHERE numero=?", 100 ) print( r[1]['valor1'] ) Usei esse código. Remove as virgulas e tenta fazer da mesma forma, seguindo a maneira que tá no código, deve funcionar. Quer que eu crie uma nova tabela, insira os valores nela e depois selecione-os? Eu não entendi direito oq vc quis dizer com "indexar" Eu fiz assim e ele retornou lordhenry local dono = executeSQLQuery ("SELECT owner FROM housevip_data WHERE ID=?", 2) print(dono[1].owner) Era pra retornar isso mesmo, só que o portão não funciona mais '-' Mas não gera erros. Link to comment
DNL291 Posted May 8, 2017 Share Posted May 8, 2017 5 minutes ago, Lord Henry said: Quer que eu crie uma nova tabela, insira os valores nela e depois selecione-os? Eu não entendi direito oq vc quis dizer com "indexar" Indexar é esta ação: tabela = { "ok" } tabela[1] -- [1] indexando a tabela Desculpe, acho que tô incomodando com essa ideia, mas respondendo: Não precisa criar outra tabela, era só testar mesmo porque pode ser um equivoco ao tentar obter o valor. Se baseando no código que postei que funcionou, talvez você encontre onde estava errado no seu código Link to comment
Other Languages Moderators Lord Henry Posted May 8, 2017 Author Other Languages Moderators Share Posted May 8, 2017 1 minute ago, DNL291 said: Se baseando no código que postei que funcionou, talvez você encontre onde estava errado no seu código Vou deixar assim: local dono = executeSQLQuery ("SELECT owner FROM housevip_data WHERE ID=?", 2) local dono = dono[1].owner Dessa forma está funcionando tranquilo. function checkOwnership (thePlayer) local dono = executeSQLQuery ("SELECT owner FROM housevip_data WHERE ID=?", 2) local dono = dono[1].owner local acc = getAccountName(getPlayerAccount(thePlayer)) if dono == acc then if isGarageOpen (9) then setGarageOpen (9, false) else setGarageOpen (9, true) end else outputChatBox ("Você não é o proprietário da casa ID 2.", thePlayer) end end addCommandHandler ("garagem", checkOwnership) Vc pode testar criando uma tabela pequena com uma coluna 'ID' e uma coluna 'owner', dai vc coloca 2 no ID e a sua conta no owner pra testar. addEventHandler ('onResourceStart', resourceRoot, function() executeSQLQuery ("CREATE TABLE IF NOT EXISTS housevip_data (ID INTEGER, owner TEXT)") end) Depois você desloga e tenta mover o portão de novo. Link to comment
DNL291 Posted May 8, 2017 Share Posted May 8, 2017 (edited) Está funcionando esse código? Obs: Use if isGuestAccount(getPlayerAccount(thePlayer)) then return end Pra contas não-logadas não serem permitidas - essas usam o nick do jogador (Edit: na verdade não retorna o nick). Edited May 8, 2017 by DNL291 Link to comment
Other Languages Moderators Lord Henry Posted May 8, 2017 Author Other Languages Moderators Share Posted May 8, 2017 (edited) 14 hours ago, DNL291 said: Está funcionando esse código? Obs: Use if isGuestAccount(getPlayerAccount(thePlayer)) then return end Pra contas não-logadas não serem permitidas - essas usam o nick do jogador (Edit: na verdade não retorna o nick). Eu coloquei como dono da primeira casa guest e depois desloguei. Dai o jogador deslogado conseguiu movimentar o portão...mas dai seria um problema com criação de contas, pois não deveria ser possível criar uma conta chamada guest. Vou ver onde fica o comando /register e tentar bloquear o /register guest e o /register Console. Edited May 8, 2017 by Lord Henry Link to comment
Other Languages Moderators Lord Henry Posted May 8, 2017 Author Other Languages Moderators Share Posted May 8, 2017 Pronto, fui no admin_server.lua, procurei por register. Dai lá eu adicionei essa condição: elseif username == "guest" or username == "Guest" or username == "Console" or username == "console" then outputChatBox ( "register: - Esta conta é proibida de ser registrada.", player, 255, 100, 70 ) outputServerLog ( "ADMIN ERROR: "..getPlayerName ( player ).." tried to register account '"..username.."' (IP: "..getPlayerIP(player).." Serial: "..getPlayerSerial(player)..")" ) Dai ficou assim: addCommandHandler ( "register", function ( player, command, arg1, arg2 ) local username = getPlayerName ( player ) local password = arg1 if ( arg2 ) then username = arg1 password = arg2 end if ( password ~= nil ) then if ( string.len ( password ) < 4 ) then outputChatBox ( "register: - Senha precisa ser no mínimo 4 caracteres.", player, 255, 100, 70 ) elseif ( getAccount ( username ) ) then outputChatBox ( "register: - Esta conta já existe.", player, 255, 100, 70 ) elseif username == "guest" or username == "Guest" or username == "Console" or username == "console" then outputChatBox ( "register: - Esta conta é proibida de ser registrada.", player, 255, 100, 70 ) outputServerLog ( "ADMIN ERROR: "..getPlayerName ( player ).." tried to register account '"..username.."' (IP: "..getPlayerIP(player).." Serial: "..getPlayerSerial(player)..")" ) elseif ( addAccount ( username, password ) ) then outputChatBox ( "Você se registrou com sucesso! Username: '"..username.."', Senha: '"..password.."'(não esqueça)", player, 255, 100, 70 ) outputServerLog ( "ADMIN: "..getPlayerName ( player ).." registered account '"..username.."' (IP: "..getPlayerIP(player).." Serial: "..getPlayerSerial(player)..")" ) else outputChatBox ( "Unknown Error", player, 255, 100, 70 ) end else outputChatBox ( "register: - Sintaxe é 'register <login> <senha>'", player, 255, 100, 70 ) end end ) Vou ver se mexo no sistema de casas para impedir que jogadores registrados com conta guest consigam comprar casas. Me referindo a outros servidores que não possuem esse bloqueio no /register. Link to comment
Other Languages Moderators Lord Henry Posted May 8, 2017 Author Other Languages Moderators Share Posted May 8, 2017 Pronto, já consegui. Agora jogadores logados na conta guest também não vão mais poder comprar casas, mesmo se for uma conta registrada. Link to comment
DNL291 Posted May 9, 2017 Share Posted May 9, 2017 10 hours ago, Lord Henry said: Eu coloquei como dono da primeira casa guest e depois desloguei. Dai o jogador deslogado conseguiu movimentar o portão...mas dai seria um problema com criação de contas, pois não deveria ser possível criar uma conta chamada guest. Vou ver onde fica o comando /register e tentar bloquear o /register guest e o /register Console. Ainda não entendi porque editar o código do /register. Não é só usar isGuestAccount pra saber se o jogador tá logado e permitir que o portão abra/fecha pra quem está logado apenas? Link to comment
Other Languages Moderators Lord Henry Posted May 9, 2017 Author Other Languages Moderators Share Posted May 9, 2017 (edited) 9 hours ago, DNL291 said: Ainda não entendi porque editar o código do /register. Não é só usar isGuestAccount pra saber se o jogador tá logado e permitir que o portão abra/fecha pra quem está logado apenas? Jogadores deslogados não conseguem comprar casas, logo não tem como eles abrirem os portões. O que eu fiz foi bloquear quem está logado com uma conta chamada guest. Estes agora não conseguem mais comprar casas, mesmo estando logados. O que eu quero dizer é que não há necessidade de fazer essa verificação no resource das garagens pois ela já existe no resource das casas. Os dois resources funcionam de maneira sincronizada. 9 hours ago, DNL291 said: [...] o portão abra/fecha pra quem está logado apenas? O portão abre/fecha somente pra quem comprou a respectiva casa. Para comprar precisa estar logado. 9 hours ago, DNL291 said: Ainda não entendi porque editar o código do /register. Isso foi necessário para evitar que jogadores burlem os sistemas anti-guest de todos os demais resources. Porque isGuestAccount não detecta jogadores logados, somente os deslogados. Se eu não bloquear essa conta no register, o jogador pode criar uma conta chamada guest e conseguir comprar uma casa, pois o isGuestAccount não irá bloqueá-lo pois ele está logado. Foi por esse motivo que eu preferi fazer o bloqueio dessa conta no /register. O problema de criar uma conta chamada guest, é que dai jogadores deslogados passam a ter acesso à casa também, pois a conta deslogada usa a mesma string da conta logada guest. Edited May 9, 2017 by Lord Henry Link to comment
DNL291 Posted May 9, 2017 Share Posted May 9, 2017 10 hours ago, Lord Henry said: Porque isGuestAccount não detecta jogadores logados, somente os deslogados. Se eu não bloquear essa conta no register, o jogador pode criar uma conta chamada guest e conseguir comprar uma casa, pois o isGuestAccount não irá bloqueá-lo pois ele está logado. Foi por esse motivo que eu preferi fazer o bloqueio dessa conta no /register. Não, essa função detecta se o jogador está logado também. Como diz a citação da Wiki: Quote As a consequence, this function will check if a player is logged in or not. Então não tem problema caso o jogador crie uma conta chamada guest, é só verificar se está logado ou não, se tiver, é uma conta registrada, isto é, conta válida e não conta-convidado que na verdade está deslogado. Link to comment
Other Languages Moderators Lord Henry Posted May 10, 2017 Author Other Languages Moderators Share Posted May 10, 2017 (edited) Hum...já entendi oq vc quer dizer. Ok, vou colocar a verificação nas garagens tbm...apesar de já ter essa verificação nas casas. Edited May 10, 2017 by Lord Henry 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