Ir para conteúdo
Jovial

Tutorial De Luasql

Recommended Posts

Tutorial de LuaSQL



Créditos: Jovial

 

Olá pessoal, estou aqui para ensinar um pouco de LuaSQL para vocês. Este tutorial foi feito por mim, Palmares me deu uma mão no fim, procurando erros. Espero que eu consiga explicar bem, para entender melhor o tutorial leia um tutorial ensinando os comandos de SQL(INSERT, CREATE, UPDATE, etc.).

Não são todos os servers que possuem o LuaSQL, você pode usar o Forgotten Server.

 

Para ver este tutorial em forma de imagem

Registre-se para ver link(s).

.

 

 

O que é LuaSQL?

LuaSQL é uma interface simples entre Lua e um sistema gerenciador de banco de dados (DBMS). Ela permite que um programa Lua:

* Conecte-se aos bancos de dados ODBC, ADO, Oracle, MySQL, SQLite, JDBC e PostgreSQL;

* Execute comandos arbritários do SQL;

* Recupere resultados no modo linha-a-linha de um cursor SQL.

LuaSQL é um software livre e utiliza a mesma licença do Lua 5.0.

Manual:

Registre-se para ver link(s).

 

Conexão

 

Antes de você adicionar/modificar informações no seu banco de dados, você precisa se conectar a ele, primeiro tempos que criar o 'ambiente' de conexão, onde você ira definir que tipo de banco de dados está usando, Exemplo.

assert(luasql.mysql()) para MySQL
assert(luasql.sqlite3()) para SQLite

Para fazer a conecção temos que salvar esse 'ambiente' em uma variável, Exemplo.

environment = assert(luasql.mysql())
ou
environment = assert(luasql.sqlite3())

A função para se conectar com o banco de dados tem a seguinte sintaxe:

connection = assert(environment:connect(mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort)) para MySQL
ou
connection = assert(environment:connect(sqliteDatabase)) para SQLite

Como vocês podem ver, no exemplo acima eu 'guardei' a conexão em uma variável chamada 'connection', para poder executar os comandos depois.

 

Variáveis da conexão em Mysql

 

Como vocês podem ver na conexão com MySQL Precisamos saber 5 coisas mysqlDatabase, mysqlUser, mysqlPass, mysqlHost e mysqlPort.

mysqlDatabase é o Banco o nome do Banco de Dados que você deseja usar, Exemplo: o Forgotten Server usa o 'theforgottenserver'(se você não alterou).
mysqlUser é o usuário usado para se conectar com o MySQL, geralmente é 'root'.
mysqlPass é a senha usada para a conexão com o Mysql.
mysqlHost é o ip de onde se encontra o servidor de MySQL, como ele deverá estar no seu computador deixe como 'localhost'.
mysqlPort é a porta usada para a conexão com o MySQL, use a porta '3306'.
Ficando:
connection = assert(environment:connect('theforgottenserver', 'root', 'minha senha', 'localhost', 3306))

 

Variáveis da conexão em SQLite

 

Para criar uma conexão só é preciso saber o sqliteDatabase, que no forgotten server é 'forgottenserver.s3db', como podem ver, é o nome do arquivo que ira abrigar o banco de dados.

Ficando:

connection = assert(environment:connect('forgottenserver.s3db'))

 

Finalizando uma conexão

 

Para finalizar uma conexão você precisa usar os seguintes comandos:

connection:close() para fechar sua conexão(troque connection pela variável que você armazenou sua conexão)
e
environment:close() para fechar seu 'ambiente' de conexão(troque environment pela variável que você armazenou seu 'ambiente')

 

Executando comandos

 

Para executar algum comando SQL em lua usamos uma função com a seguinte sintaxe:

assert(connection:execute('Comando SQL'))

Exemplo:

assert(connection:execute("INSERT INTO `accounts` (`id`, `password`, `type`, `premdays`) VALUES ('222222', 'tibia', '1', '365');"))
Isto irá criar uma conta 222222/tibia do tipo 1(conta normal) com 365 dias de premium.

 

Pegando informações

 

Para pegar alguma informação de seu banco de dados você precisará salvar seu comando em uma variável, Exemplo:

cursor = assert(connection:execute("SELECT `password` FROM `accounts` WHERE `id` = '222222';"))
Nesse caso coloquei um comando que ira pegar o valor de 'password' na tabela accounts onde o id(numero da conta) for 222222.

Agora para pegar informações dessa variável, no caso 'cursor', você ira ter que usar algumas funções como:

numrows() Retorna: o número de registros no resultado da busca.
fetch() Recupera o próximo registro do resultado.

Você ira ver como usá-los logo abaixo nos exemplos.

 

Exemplos

 

TalkAction que cria account.

Tag: <talkaction words="/createacc" script="account.lua"/>

Modo de usar: Dizer '/createacc "222222/tibia' isso irá criar uma conta 222222/tibia

function onSay(cid, words, param)
--TalkAction by Jovial
if (getPlayerAccess(cid) > 3) then
	tmp,tmp2,acc,pass = string.find(param,'(%d*)/(%w*)') 
	--Esta linha acima pega os valores digitados na fala do player e separa eles em account e senha.
	--Tutorial de patterns em ingles: http://lua-users.org/wiki/PatternsTutorial
	if (acc ~= nil and pass ~= nil) then
		environment = assert(luasql.mysql())
		--Criamos um ambiente de conexão
		connection = assert(environment:connect('theforgottenserver', 'root', 'minha senha', 'localhost', 3306))
		--Agora nos conectamso com o MySQL (não esqueça de colocar sua senha acima)

		ccursor = assert(connection:execute("SELECT * FROM `accounts` WHERE `id` = `"..acc.."`;"))
		--Esta linha seleciona os valores da tabela accounts onde o id(numero da conta) for igual ao que você digitou, para verificar se a conta existe.

		if (cursor:numrows() == 0) then
			--cursor:numrows() retorna a quantidade de resultados, neste caso se eel retornar mais de 0 é porque a conta ja existe, se retornar 0 ela não existe.
			assert(connection:execute("INSERT INTO `accounts` (`id`, `password`, `type`, `premdays`) VALUES ("..acc..", "..pass..", 1, 0);"))
			--Aqui ele ira criar a nova conta.
			doPlayerSendTextMessage(cid,MESSAGE_STATUS_CONSOLE_RED,words..' "'..param..' (Account created.)')
		else
			doPlayerSendCancel(cid,'This account already exists.')
			doPlayerSendTextMessage(cid,MESSAGE_STATUS_CONSOLE_RED,words..' "'..param..' (This account already exists.)')
		end

		connection:close()
		--Fechando a conexão
		environment:close()
		--Fechando o ambiente de conexão
	else
		doPlayerSendCancel(cid,'Invalid account or password.')
		doPlayerSendTextMessage(cid,MESSAGE_STATUS_CONSOLE_RED,words..' "'..param..' (Invalid account or password.)')
	end
else
	doPlayerSendCancel(cid,'You can not use this command.')
end
return FALSE
end

 

Rank por action.

Tag: <action itemid="id do item desejado" script="Rank.lua"/>

function onUse(cid,item,frompos,item2,topos)
--Action by Jovial
local nomes = {}
local level = {}

environment = assert(luasql.mysql())
--Criamos um ambiente de conexão
connection = assert(environment:connect('theforgottenserver', 'root', 'minha senha', 'localhost', 3306))
--Agora nos conectamos com o MySQL (não esqueça de colocar sua senha acima)
cursor = assert(connection:execute("SELECT `name`,`level` FROM `players` ORDER BY `level` DESC LIMIT `0`, `10`;"))
--Aqui peguei os valores 'name' e 'level' dos 10 players com maior level, agora tenho que passar esse valor para uma tabela para que eu possa usá-los

	--By Palmares
row = cursor:fetch ({}, "a")
--A variável 'row' virou uma tabela contendo os valores do primeiro player(o com level mais alto)
while row do
--Irá repetir enquanto existir valores em 'row'
	table.insert(nomes, row.name)
	--Irá adicionar o valor contido em 'row.name' que é o nome de um player na tabela nomes
	table.insert(level, row.level)
	--Irá adicionar o valor contido em 'row.level' que é o level de um player na tabela level
	row = cursor:fetch(row, "a")
	--Irá pegar os valores do próximo player
end
	--/By Palmares

connection:close()
--Fechando a conexão
environment:close()
--Fechando o ambiente de conexão

msg = tableToList(nomes,level)
--Função criada por mim para passar os valores coletados para uma lista
doPlayerPopupFYI(cid, msg)
--Irá abri uma janela para o player, que irá mostrar o rank

return TRUE
end

function tableToList(nomes,level)
--Function by Jovial
local tmp
local str = ''

for tmp = 1,#nomes do
	if (str == '') then
		str = nomes[tmp]..'['..level[tmp]..']'
	else
		str = str .. '\n'..nomes[tmp]..'['..level[tmp]..']'
	end
end
return str
end

Espero que vocês gostem! Qualquer dúvidas poste aqui.

Se achar algum erro no tutorial me avise, pois ele é bem grande e pode ter passado algo despercebido.

 

Abraço;

 

Jovial.

Editado por Jovial

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aprovado jovis...

xD...

bah me disculpa intrometer como voce é preguissoso e nao quer botar dai os noob vao se ###### vao chorar e vao para de programar porque não consegue ahesues :D.

 

Para fazer o query selecionar uma coluna ou tabela é usado ASSENTO ` NÂO AS ' << aspinha:

exemplo para notar:

("SELECT `rank_id` FROM `players` WHERE `name` = " .. p_name .. ";)

onde uma var é normal em todo lua.

:p

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Jovial

@Palmares_

Legal ver vocês aqui.

 

Tomara que queiram fazer parte da familia XTibia

 

Ótimo tutorial

 

SUPER APROVADO

 

 

Ps.: Se tiverem contato com

[V]Dragonheart

PLX... peçam pra ele vir aqui no XTibia também

 

smile_bye.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Jovial(pelo tuto) e Nostradamus(por participar da xfusion)

No site criado pela exfusion projects ele se conecta a database "otserv"(axo que é essa).

Pelo que vi, ele só funciona em SQL, para usa-lo em SQLite como faço???

 

É só mudar o modo de conecção e etc??

E como coloco uma DB de SQLite pra rodar em server(com o que o site se conecta),

pelo que sei, ele não precisa de um servidor separado.

 

Já que estamos em uma era de readaptaçoes, eu axo que seria bem melhor

esquecer-mos o SQL e ficar apenas com SQLite, poi eh bem mais pratico ;)

 

Grato, KingCPI

Compartilhar este post


Link para o post
Compartilhar em outros sites

Simplesmente formidável.

 

Tutorial com certeza aprovado e fixado ;D

 

Parabéns Jovial e palmares.

 

Está rating_5_mini.gif

 

 

Sem mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@KingCPI

Eu não troco o tradicional mysql pelo sqlite, acho o mysql muito bom e mais prático, posso fazer oque eu quiser de qualquer lugar do mundo =D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora


  • Conteúdo Similar

    • Por muriloot1
      Ola Xtibianos precisava de um npc que fale com um char de cada vez. 
       
      Ex1: char nr1 fala hi NPC fala hi  
      Ex2: char nr2 fala hi NPC fala calma estou ocupado no momento  
      Versão 8.6
      Tfs 0.4
    • Por daniel1997
      Bem vindos ao Bigwar 10.99
      Apresento a vocês o Bigwar, Um servidor de War alternativo no mundo Open Tibia. Com Sistemas, Magias e Mapa Próprio... Prezando a qualidade de War e Pvp para o seu publico.
      O Bigwar é um Servidor sério, onde não terá problemas com Staff jogando junto aos players.
      * Sistemas *
      - Bank System
      - Marriage System
      - Boss System (Incluso todos itens possiveis no jogo, inclusive itens vip)
      - Reward System dos Bosses.
      - Loteria 6 vezes por dia, com chances de obter itens vip e Premium Coin.
      - Cadeia system para evitar o ato ilegal de Free Kills.
      - Itens Reformulados para proporcionar maior pvp e war para os players.
      - Classes equilibradas.
      - Sistema !guildpoints dando Premium Points a cada Semana (O lider da guild deve usar o comando)
      - Mount System
      - Cliente Próprio e Muito mais. Venha conferir. !!!
      Servidor 24 Horas online.
      Website: bigwar.sytes.net
      Facebook: www.facebook.com/BigwarOficial/
    • Por pirulitopiu
      esta dando esse error
       
      [09/04/2018 08:36:01] [Error - CreatureScript Interface] 
      [09/04/2018 08:36:01] data/creaturescripts/scripts/player/statsChange.lua:onStatsChange
      [09/04/2018 08:36:01] Description: 
      [09/04/2018 08:36:01] data/creaturescripts/scripts/player/statsChange.lua:112: attempt to index a number value
      [09/04/2018 08:36:01] stack traceback:
      [09/04/2018 08:36:01]     data/creaturescripts/scripts/player/statsChange.lua:112: in function <data/creaturescripts/scripts/player/statsChange.lua:6>
      [09/04/2018 08:41:44] > Broadcasted message: "Para upar mais rapido e so ir dando Cath nos pokemons , mas nao funciona 2 vezes no mesmo pokemon".
       
      <?xml version="1.0" encoding="UTF-8"?>
      <npc name="Rulfs" script="Rulfs.lua" walkinterval="2000" floorchange="0">
          <health now="100" max="100"/>
          <look type="594" head="17" body="54" legs="114" feet="0" addons="2"/>
      </npc>
       
       
      local keywordHandler = KeywordHandler:new()
      local npcHandler = NpcHandler:new(keywordHandler)
      NpcSystem.parseParameters(npcHandler)
      local talkState = {}
      function onCreatureAppear(cid)                npcHandler:onCreatureAppear(cid)             end
      function onCreatureDisappear(cid)             npcHandler:onCreatureDisappear(cid)         end
      function onCreatureSay(cid, type, msg)         npcHandler:onCreatureSay(cid, type, msg)     end
      function onThink()                             npcHandler:onThink()                         end
      function onPlayerEndTrade(cid)                npcHandler:onPlayerEndTrade(cid)            end
      function onPlayerCloseChannel(cid)            npcHandler:onPlayerCloseChannel(cid)        end
      local nome = "Rulfs" -- nome do monstro que vai parecer

      local function greetCallback(cid)
          local msg = 'Olá '.. getCreatureName(cid) ..", vem me desafiar a um duelo?"
          npcHandler:say(msg,cid)
          npcHandler:addFocus(cid)
          return false
      end
      function creatureSayCallback(cid, type, msg)
          if string.lower(msg) == 'bye' or string.lower(msg) == 'xau' then
              npcHandler:resetNpc(cid)
              return false
          end
          if(not npcHandler:isFocused(cid)) then 
              return false
          end
          if (msgcontains(msg, 'sim') or msgcontains(msg, 'yes')) then
              local pos = getCreaturePosition(getNpcId())
              selfSay('Então venha.',cid)
              doCreatureSay(getNpcId(), "MuHuashAUhashSHUuSA", TALKTYPE_MONSTER_YELL)
              npcHandler:resetNpc(cid)
              doRemoveCreature(getNpcId())
              doCreateMonster(nome, pos)
          end
          if (msgcontains(msg, 'nao') or msgcontains(msg, 'no') or msgcontains(msg, 'não')) then
              selfSay('Então tchau.', cid)
              npcHandler:resetNpc(cid)
              return false
          end
              
          return true
      end
      npcHandler:setCallback(CALLBACK_GREET, greetCallback)
      npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
      npcHandler:addModule(FocusModule:new()) 
       
       
      e o monster dele
       
      <?xml version="1.0" encoding="UTF-8"?>
      <monster name="Rulfs" nameDescription="a rulfs" race="blood" experience="900" speed="220" manacost="0">
          <health now="1000" max="1000"/>
          <look type="569" head="17" body="54" legs="114" feet="0" addons="2" corpse="6080"/>
          <targetchange interval="5000" chance="8"/>
          <strategy attack="100" defense="0"/>
          <flags>
              <flag summonable="0"/>
              <flag attackable="1"/>
              <flag hostile="1"/>
              <flag illusionable="0"/>
              <flag convinceable="0"/>
              <flag pushable="0"/>
              <flag canpushitems="1"/>
              <flag canpushcreatures="1"/>
              <flag targetdistance="1"/>
              <flag staticattack="90"/>
              <flag runonhealth="500"/>
          </flags>
          <attacks>
              <attack name="melee" interval="2000" skill="30" attack="50" poison="150"/>
              <attack name="speed" interval="1000" chance="10" range="7" speedchange="-600" duration="20000">
                  <attribute key="areaEffect" value="redshimmer"/>
              </attack>
              <attack name="lifedrain" interval="1000" chance="40" radius="4" target="0" min="-120" max="-250">
                  <attribute key="areaEffect" value="rednote"/>
              </attack>
          </attacks>
          <defenses armor="15" defense="20">
              <defense name="healing" interval="1000" chance="25" min="113" max="187">
                  <attribute key="areaEffect" value="blueshimmer"/>
              </defense>
          </defenses>
          <elements>
              <element firePercent="100"/>
              <element deathPercent="100"/>
              <element earthPercent="100"/>
              <element holyPercent="-20"/>
          </elements>
          <immunities>
              <immunity lifedrain="1"/>
              <immunity paralyze="1"/>
              <immunity invisible="1"/>
          </immunities>
          <voices interval="5000" chance="10">
              <voice sentence="HAHAHAHAHA"/>
          </voices>
          <loot>
              <item id="2148" countmax="60" chance="11250"/><!-- gold coin -->
              <item id="2148" countmax="40" chance="11250"/><!-- gold coin -->
              <item id="2144" chance="2000"/><!-- black pearl -->
              <item id="2656" chance="650"/><!-- blue robe -->
              <item id="2047" chance="70000"/><!-- candle stick -->
              <item id="2237" chance="19000"/><!-- dirty cape -->
              <item id="2177" chance="50"/><!-- life crystal -->
              <item id="2071" chance="1333"/><!-- lyre -->
              <item id="2560" chance="7250"/><!-- mirror -->
              <item id="2411" chance="1600"/><!-- poison dagger -->
              <item id="2655" chance="800"/><!-- red robe -->
              <item id="2214" chance="860"/><!-- ring of healing -->
              <item id="2170" chance="8300"/><!-- silver amulet -->
              <item id="2134" chance="1750"/><!-- silver brooch -->
              <item id="2657" chance="60000"/><!-- simple dress -->
              <item id="2197" chance="1100"/><!-- stone skin amulet -->
              <item id="7589" chance="650"/><!-- strong mana potion -->
              <item id="2175" chance="900"/><!-- spellbook -->
              <item id="2143" chance="410"/><!-- white pearl -->
              <item id="7884" chance="240"/><!-- terra mantle -->
              <item id="2121" chance="410"/><!-- wedding ring -->
              <item id="2124" chance="100"/><!-- crystal ring -->
          </loot>
      </monster>
       
      [09/04/2018 08:36:01] [Error - CreatureScript Interface] 
      [09/04/2018 08:36:01] data/creaturescripts/scripts/player/statsChange.lua:onStatsChange
      [09/04/2018 08:36:01] Description: 
      [09/04/2018 08:36:01] data/creaturescripts/scripts/player/statsChange.lua:112: attempt to index a number value
      [09/04/2018 08:36:01] stack traceback:
      [09/04/2018 08:36:01]     data/creaturescripts/scripts/player/statsChange.lua:112: in function <data/creaturescripts/scripts/player/statsChange.lua:6>
      [09/04/2018 08:41:44] > Broadcasted message: "Para upar mais rapido e so ir dando Cath nos pokemons , mas nao funciona 2 vezes no mesmo pokemon".
    • Por DavyziinC
      ....
    • Por Tony Araujo

       
      Eai galeraaa, bom, hoje eu to aqui pra falar de uma ideia que eu tive após eu ter uma conversa com um brother. Bom, quem acompanha o xTibia a mais de 4 anos, talvez já tenha ouvido falar do meu antigo projeto Arton, Registre-se para ver link(s).
      você poderá ver a página no facebook. Ele era uma mistura de Tibia e MU, tinha alguns sistemas como: Chaos Machine, Fly com Asas, Aprimoramento de equipamentos (+1 +2...), dentre outros sistemas. Aqui eu vou deixar alguns vídeos de alguns sistemas.
       
       
      1. Barra de ataque e demonstração de algumas magias.
       
       
       
      2. Sistema de Chaos Machine (Máquina de melhorias)
       
       
      3. Sistema de atributos e visualização de item.
       
       
      4. Sistema de aprimoramento de items.
       
       
      5. Sistema de equipar armadura somente com uma quantidade de skill.
       
       
      6. Novo sistema de ataque.
       
       
      7. Sistema de batalhas com NPC.
       
       
      Bom, a ideia é a seguinte: Eu quero voltar com o projeto Arton, porém com uma nova identidade (Zen World) e uma nova proposta, porém, sem esquecer das antigas.
      O projeto não utilizará base alguma e será desenvolvido completamente do 0, utilizando o Unity 3D.
      O PVP e a jogabilidade do Tibia será totalmente adaptada a plataforma Mobile, assim levando a dinâmica e emoção do mesmo.
      Uma das novas ideias é lançar o jogo para navegadores e mobiles.
      O Zen World utilizará o sistema de mapas parecido com o do Ragnarok/TibiaME/MU (dividido em partes)
       
      O projeto está aberto a vagas! Então caso você se interesse pelo projeto e deseja ajudar, não deixe de comentar.
       
      Bom galera, eu estou bastante enferrujado para escrever tópicos sobre projetos kkkkk, o meu último já tem bastante tempo. Qualquer dúvida ou caso se interessem, comentem aqui! o Feedback é muito importante.
×