Jump to content

Receber valor existente no Banco de Dados


Recommended Posts

  • Other Languages Moderators

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.

Link to comment
  • Other Languages Moderators

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
Link to comment
  • Other Languages Moderators
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
  • Moderators
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
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
  • Moderators

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
Link to comment
  • Other Languages Moderators
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
  • Moderators

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
Link to comment
  • Other Languages Moderators
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
  • Moderators
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
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
  • Moderators

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
Link to comment
  • Other Languages Moderators
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
Link to comment
  • Other Languages Moderators

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

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
  • Moderators
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
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
Link to comment
  • Moderators
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

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

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
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...