Sign in to follow this  
Lord Henry

Receber valor existente no Banco de Dados

Recommended Posts

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

28388448f7e94830b0e21dc8e46a506d.png
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.

Share this post


Link to post

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 by Lord Henry

Share this post


Link to post

Acho que se você usasse isto também funcionava:

local accOwner = executeSQLQuery("SELECT 'owner' FROM 'housevip_data' WHERE 'ID'=?", 2)[1]['owner']

 

Edited by DNL291

Share this post


Link to post
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] ?

Share this post


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

Share this post


Link to post
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)

Share this post


Link to post

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 by DNL291

Share this post


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

Share this post


Link to post

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 by DNL291

Share this post


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

Share this post


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

Share this post


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

Share this post


Link to post

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 by DNL291

Share this post


Link to post
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 by Lord Henry

Share this post


Link to post

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.

Share this post


Link to post

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.

Share this post


Link to post
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?

Share this post


Link to post
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 by Lord Henry

Share this post


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

Share this post


Link to post

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 by Lord Henry

Share this post


Link to post

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
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.