Jump to content

Search the Community

Showing results for tags 'sqlite'.

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Multi Theft Auto: San Andreas 1.x
    • Support for MTA:SA 1.x
    • User Guides
    • Open Source Contributors
    • Suggestions
    • Ban appeals
  • General MTA
    • News
    • Media
    • Site/Forum/Discord/Mantis/Wiki related
    • MTA Chat
    • Other languages
  • MTA Community
    • Scripting
    • Maps
    • Resources
    • Other Creations & GTA modding
    • Competitive gameplay
    • Servers
  • Other
    • General
    • Multi Theft Auto 0.5r2
    • Third party GTA mods
  • Archive
    • Archived Items
    • Trash

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Member Title


Gang


Location


Occupation


Interests

Found 18 results

  1. local markers1 = { { x=-2405, y=-599, z=132 }, --2405, -599, 132.648 { x=150, y=250, z=15 }, { x=200, y=300, z=20 } } local markers2 = { { x=50, y=100, z=5 }, { x=75, y=125, z=7.5 }, { x=100, y=150, z=10 } } local markers3 = { { x=-50, y=-100, z=5 }, { x=-75, y=-125, z=7.5 }, { x=-100, y=-150, z=10 } } -- Abra o arquivo SQLite local db = dbConnect("sqlite", "estoque.db") -- Crie uma tabela para o conjunto 1 dbExec(db, "CREATE TABLE IF NOT EXISTS estoque_conjunto1 (id INTEGER PRIMARY KEY AUTOINCREMENT, nome TEXT, quantidade INTEGER, gasolina INTEGER)") -- Crie uma tabela para o conjunto 2 dbExec(db, "CREATE TABLE IF NOT EXISTS estoque_conjunto2 (id INTEGER PRIMARY KEY AUTOINCREMENT, nome TEXT, quantidade INTEGER, gasolina INTEGER)") -- Crie uma tabela para o conjunto 3 dbExec(db, "CREATE TABLE IF NOT EXISTS estoque_conjunto3 (id INTEGER PRIMARY KEY AUTOINCREMENT, nome TEXT, quantidade INTEGER, gasolina INTEGER)") function onMarkerHit(hitElement, matchingDimension) if (matchingDimension and getElementType(hitElement) == "player") then local conjunto = getElementData(source, "conjunto") if (not conjunto or conjunto < 1 or conjunto > 3) then outputDebugString("Invalid conjunto specified for marker.") return end local query = "SELECT gasolina FROM estoque_conjunto" .. conjunto .. " WHERE id = 1" local result = dbQuery(db, query) local rows = dbPoll(result, -1) if (not rows or #rows ~= 1) then outputDebugString("Failed to retrieve gasolina value for conjunto " .. conjunto .. ".") outputChatBox("Não foi possível obter a quantidade de gasolina para o conjunto " .. conjunto .. ".", hitElement, 255, 0, 0) else local gasolina = rows[1].gasolina outputChatBox("Este conjunto contém " .. gasolina .. " unidades de gasolina.", hitElement, 0, 255, 0) end end end -- Adicione um event handler para cada marker for _, markerData in ipairs(markers1) do local marker = createMarker(markerData.x, markerData.y, markerData.z, "cylinder", 2, 255, 0, 0, 150) setElementData(marker, "conjunto", 1) addEventHandler("onMarkerHit", marker, onMarkerHit) end for _, markerData in ipairs(markers2) do local marker = createMarker(markerData.x, markerData.y, markerData.z, "cylinder", 2, 255, 0, 0, 150) setElementData(marker, "conjunto", 2) addEventHandler("onMarkerHit", marker, onMarkerHit) end for _, markerData in ipairs(markers3) do local marker = createMarker(markerData.x, markerData.y, markerData.z, "cylinder", 2, 255, 0, 0, 150) setElementData(marker, "conjunto", 3) addEventHandler("onMarkerHit", marker, onMarkerHit) end function addGasolinaCommand(player, command, conjunto, amount) -- Check if the conjunto is valid conjunto = tonumber(conjunto) if (not conjunto or conjunto < 1 or conjunto > 3) then outputChatBox("Por favor, especifique um número de conjunto válido (1, 2 ou 3).", player, 255, 0, 0) return end -- Check if the amount is valid amount = tonumber(amount) if (not amount or amount <= 0) then outputChatBox("Por favor, especifique uma quantidade válida de gasolina para adicionar.", player, 255, 0, 0) return end -- Update the gasolina value for the specified conjunto local query = "UPDATE estoque_conjunto" .. conjunto .. " SET gasolina = gasolina + " .. amount local result = dbExec(db, query) if (not result) then outputDebugString("Failed to update gasolina for conjunto " .. conjunto .. ".") outputChatBox("Não foi possível atualizar a quantidade de gasolina para o conjunto " .. conjunto .. ".", player, 255, 0, 0) else outputChatBox("Adicionado " .. amount .. " unidades de gasolina ao conjunto " .. conjunto .. ".", player, 0, 255, 0) end end -- Register the command addCommandHandler("addgasolina", addGasolinaCommand) teoricamente ao entrar no marker deveria exibir a quantidade de combustivel disponivel no posto porem está exibindo ( Não foi possível obter a quantidade de gasolina para o conjunto ) alguma ideia de como fazer isso funcionar corretamente
  2. Bom Minha duvida é a seguinte estou tentando obter os dados salvo da data-base, que eu fiz para treinar mas a questão e que no final só consigo retornar table não o valor dentro dela local db = dbConnect("sqlite","db/savesystem.db") function loaddb() dbExec(db,"CREATE TABLE IF NOT EXISTS SaveSystem(Account TEXT, Serial TEXT, Money REAL, POS TEXT, Skin TEXT )") print("DATA BASE CRIADA") end addEventHandler("onResourceStart",getRootElement(getThisResource()),loaddb) addEventHandler("onPlayerQuit",root,function() local result = dbPoll(dbQuery(db,"SELECT * FROM SaveSystem WHERE Account = ?",getAccountName(getPlayerAccount(source))),-1) if #result < 1 then local posx, posy,posz = getElementPosition(source) local skin = getElementModel(source) local serial = getPlayerSerial(source) local money = getPlayerMoney(source) local acc = getAccountName(getPlayerAccount(source)) local pos = {posx,posy,posz} dbExec(db,"INSERT INTO SaveSystem(Account,Serial,Money,POS,Skin) VALUES(?,?,?,?,?)",acc,serial,money,toJSON(pos),skin) print("DATA BASE INSERIU") else local posx, posy,posz = getElementPosition(source) local skin = getElementModel(source) local serial = getPlayerSerial(source) local money = getPlayerMoney(source) local acc = getAccountName(getPlayerAccount(source)) local pos = {posx,posy,posz} dbExec(db,"UPDATE SaveSystem SET Account=?,Serial=?,Money=?,POS=?,Skin=?",acc,serial,money,toJSON(pos),skin) print("DATA ATUALIZOU") end end) addEventHandler("onPlayerLogin",root,function() local result = dbPoll(dbQuery(db,"SELECT * FROM SaveSystem WHERE Account = ?",getAccountName(getPlayerAccount(source))),-1) if #result > 0 then setPlayerMoney(source,result[3]["SaveSystem"] ) --setPlayerMoney(source,dbPoll(dbQuery(db,"SELECT * FROM SaveSystem WHERE Money = ?",-1))) tentei dessa forma mas retorna table tb else return print("N tem info") end end)
  3. O que é? Pra que serve? Um banco de dados é onde ficam salvos diversos tipos de dados que são usados entre as sessões dos jogadores e do servidor, isto significa que mesmo se o jogador relogar no servidor ou até mesmo o servidor reiniciar, os dados salvos no banco de dados não são perdidos. (se o script que salvou lá foi feito corretamente). O que posso salvar neles? O MTA já cria 2 bancos de dados padrão quando vc cria seu servidor, são eles: internal.db - Onde são salvos todos os dados das contas dos jogadores, login, senha, grana do bolso, posição do jogador quando deslogou, vida, colete, skin, armas, munição, etc. registry.db - Onde são salvos todos os dados que são utilizados pelos resources, como por exemplo melhores pontuações das corridas (race gamemode), proprietários das casas, dados bancários dos jogadores, saldo bancário dos jogadores, carros comprados pelos jogadores, roupas compradas pelos jogadores, empresas adquiridas pelos jogadores, etc. Onde eles estão? Estes dois bancos de dados estão na pasta deathmatch do seu servidor, estão na linguagem SQLite. Você ainda pode criar outros bancos de dados externos, para serem usados pelos resources, mas na minha opinião isso não é recomendável, uma vez que vc usaria MySQL, que é mais complexo e exige certos cuidados de acesso e domínio, mas alguns servidores profissionais precisam fazer assim pois fizeram os bancos de dados ficarem fora do servidor em outro IP por segurança, dai é necessário ter bancos de dados externos. Nesse tutorial vamos tratar somente dos bancos de dados nativos do MTA, por serem mais fáceis de entender. Como mexo neles? Para salvar alguma coisa na conta do jogador, isto é, no internal.db, você usa setAccountData, e para obter esses dados depois, use getAccountData. É extremamente simples, funciona da mesma forma que um setElementData, mas em vez de salvar uma data temporária em um elemento, salva uma data permanente numa conta. Porém, para salvar alguma coisa no registry.db, é um pouco mais complicado, uma vez que vc vai precisar criar uma tabela nova para cada resource. Por exemplo, vc acabou de criar um resource de ranking por kills/deaths e você deseja salvar esse ranking no banco de dados para que ao reiniciar o resource ou o servidor, o ranking não seja perdido. Para isso vc vai precisar primeiramente criar uma tabela no banco de dados registry.db, essa tabela será acessada pelo resource, que irá salvar os dados dele lá. Para fazer qualquer coisa neste banco de dados (criar tabelas, inserir, alterar, remover, deletar, inserir colunas em determinada tabela, etc) vc vai precisar usar isso: executeSQLQuery. Aqui, será necessário conhecimento em SQL para fazer isso, mas é mais fácil do que aprender uma linguagem de programação nova, pois suas opções e sintaxes são menores do que uma linguagem inteira de programação, você não vai inventar nenhum sistema novo aqui, apenas criar e gerenciar tabelas e dados. Criar tabela nova no banco de dados: (o Caps Lock não é uma regra, mas é melhor para entender o que é código e o que é nome) [Os seguintes códigos só funcionam server-side] executeSQLQuery ("CREATE TABLE IF NOT EXISTS nomedatabela (nomecoluna1 TEXT, nomecoluna2 REAL, nomecoluna3 INTEGER)") TEXT = Valores desta coluna serão textos. Podem ter símbolos, números e espaços. REAL = Valores desta coluna serão numéricos reais. (números decimais, positivos, negativos e 0.0) INTEGER = Valores desta coluna serão numéricos inteiros. (positivos, negativos e 0) (não existe tipo BOOLEAN, use TEXT e insira valor "false" ou "true") (existe valor NULL, é diferente de vazio e diferente de 0. NULL significa ausência de dados. O NULL aparece quando você cria uma linha ou coluna nova sem atribuir valores a elas.) Deletar tabela do banco de dados: executeSQLQuery ("DROP TABLE nomedatabela") Todas as linhas, colunas, células e valores desta tabela são deletados junto. Deletar linhas da tabela: (as células não ficarão NULL) executeSQLQuery ("DELETE FROM nomedatabela WHERE colunaespecífica=?", valorDaCelulaEspecifica) O ? indica que o valor está após a declaração do SQL. Você poderia colocar o valor direto no lugar do ?. Mas por alguma razão, as vezes isso gera erro. Além disso, se o valor da célula estiver em uma variável no seu script, você não pode declarar a variável no lugar do ?. Ali só pode ser o valor direto, pois a declaração SQL inteira se trata de uma string. Por isso o uso do ?, que está recebendo o valor da variável que está depois da vírgula. Obs: Para verificar se uma célula tem valor nulo, não se usa os operadores lógicos de ==, <= >=. Para isso, usa-se IS NULL ou IS NOT NULL. Ex: executeSQLQuery ("DELETE nomecoluna1,nomecoluna2 FROM nomedatabela WHERE nomecoluna3 IS NULL") Isso vai deletar todas as células da coluna 1 e coluna 2 onde a coluna 3 tem uma célula de valor NULL. Se a coluna 3 não tiver nenhuma célula de valor NULL, nada acontece. Inserir nova linha de valores: (ele vai criar automaticamente uma nova linha com novas células) executeSQLQuery ("INSERT INTO nomedatabela(nomecoluna1,nomecoluna2,nomecoluna3) VALUES(?,?,?)", valorCelulaColuna1, valorCelulaColuna2, valorCelulaColuna3) Neste caso, ele está inserindo 3 novos valores, cada valor em uma coluna. Se você não declarar os nomes das colunas, ele vai preencher na ordem das colunas automaticamente. Você pode deixar de declarar uma coluna se não quiser atribuir valor na célula daquela coluna. Se o tipo de valor da variável não for do tipo de dado daquela coluna, dará erro. Atualizar valores de células que já existem em uma tabela: (não é possível alterar os tipos de valores, é necessário editar o tipo da coluna se quiser fazer isso) executeSQLQuery ("UPDATE nomedatabela SET nomecoluna2=?,nomecoluna3=? WHERE nomecoluna1=?", valorCelulaColuna2, valorCelulaColuna3, valorCelulaColuna1) No caso acima, ele vai atualizar as células das colunas 2 e 3 onde o valor da célula da coluna 1 for igual ao valor de valorColunaCelula1. OBS: Nada impede que você coloque as primeiras variáveis junto à declaração SQL, mas para fazer isso você deve "cortar" a string, inserir as variáveis e depois continuar a string, Ex: executeSQLQuery ("UPDATE nomedatabela SET nomecoluna2= '".. valorCelulaColuna2 .."',nomecoluna3='".. valorCelulaColuna2 .."' WHERE nomecoluna1=?", valorCelulaColuna1) Lembrando que o valor destas variáveis também são strings na declaração, portanto use aspas simples antes e depois de cada corte para transformar os valores em string. Os dois pontos (..) significam que estes valores fazem parte do argumento SQL. Da mesma forma, se vc usar "1" .. "1", será igual a "11". (Por isso acho muito mais fácil deixar tudo ? na declaração SQL e colocar as variáveis todas após a string.) Selecionar determinadas células da tabela: (usado geralmente para obter os valores destas células para usar no script, você pode selecionar somente 1 célula ou várias) executeSQLQuery ("SELECT nomecoluna1,nomecoluna2 FROM nomedatabela WHERE nomecoluna3=?", valorCelulaColuna3) Neste exemplo, ele vai selecionar a célula da coluna 1 e a célula da coluna 2, na linha onde a célula da coluna 3 for igual a valorCelulaColuna3. Alterar a tabela (adicionar coluna nova) [SQLite não suporta deletar coluna nem editar tipo de coluna] executeSQLQuery ("ALTER TABLE nomedatabela ADD nomecoluna4 REAL") Devido a limitações do SQLite, ALTER TABLE não pode ser usado para deletar uma coluna nem para editar seu tipo. Para fazer isso é necessário recriar a tabela inteira com as novas alterações. No exemplo acima, ele vai adicionar uma nova coluna chamada "nomecoluna4". Tá, mas como ficaria tudo isso dentro de um script? Fiz um código com vários testes de banco de dados. Cada comando faz alguma coisa. É possível mexer em um banco de dados manualmente sem usar scripts? Sim, é possível. Eu mesmo costumo fazer isso para corrigir algumas coisas rápidas sem precisar programar mais nada. Para poder abrir os bancos de dados (internal.db e registry.db) você deve usar um programa chamado DB Browser for SQLite. Um programa gratuito, leve e bem fácil de entender. Nele você consegue acessar todas as tabelas do banco de dados e editar os valores como se fosse em uma planilha do Excel. Basta ir na aba Navegar dados, selecionar a tabela que deseja modificar, clicar em cima da célula cujo valor deseja atualizar, digitar o novo valor, clicar em Aplicar e depois clicar em Escrever modificações (salvar banco de dados). Pronto! E tem mais! Se você já tiver conhecimento avançado com a linguagem SQL, você também pode fazer alterações avançadas via código dentro do programa. Basta acessar a aba Executar SQL, escrever o comando SQL corretamente e depois clicar no botão de Play. Espero ter ajudado.
  4. So hi guys, I've been lately working on some scripts just for fun to get familiar with this concept of creating my own resources and now I would like to ask you if someone could explain to me how can I get data from a database and then compare that data with let's say something like account name of a player. Yes, I know I'm supposed to use dbQuerry and dbPoll but I just can't get it to work, so if you'd be so kind to show me in a simple example how to compare the two I'd be really grateful. So let's say the problem is how can I compare user account name and maybe a ownerName(of a house perhaps or a car) which is stored in my database
  5. Olá pessoal, boa tarde! Faz tempo que tenho um conhecimento relativamente avançado em Lua e MTA Scripting, porém não sabia absolutamente NADA em relação á banco de dados SQLite. Há pouco tempo atrás aprendi sobre, porém preciso de ajuda com o seguinte problema: » Preciso salvar no banco de dados, a cada vez que um comando é efetuado, salvar +1 número na célula da coluna... Deu pra entender? Tipo assim: Carro Estoque Camaro 1 Quando eu efetuar o comando: Carro Estoque Camaro 1 +1 *eu preciso pegar o valor existente na coluna e somar 1, porém estou com problemas para fazer haha *Não postei meu código pois simplesmente não consegui fazer um... hahah
  6. Opa, estou começando a mexer com sqlite e no momento estou tentando fazer um simples registro por comando... porém não consigo segue abaixo o codigo: local connect = dbConnect("sqlite", "registry.db") addEventHandler("onResourceStart", resourceRoot, function() local exec = executeSQLQuery("CREATE TABLE IF NOT EXISTS registroPessoal (ID INTEGER NOT NULL PRIMARY KEY, username TEXT, password TEXT, mtaserial INTEGER, PosX REAL, PosY REAL, PosZ REAL, accountName TEXT)" ) local query = dbQuery( connect, "SELECT * FROM registroPessoal") outputChatBox(tostring(query)) local resultado, searchs, msg = dbPoll(query, 0) if resultado == false then outputConsole( "dbPoll falhou. Erro srch: " .. tostring(searchs) .. " Erro msg: " .. tostring(msg) ) end end) addCommandHandler ("registrar", function(jog, cmd, val1, val2) local valor = dbQuery ( connect , "SELECT username, mtaserial FROM registroPessoal" ) outputDebugString("02") local resultado = dbPoll ( valor ,-1 ) outputDebugString("03") if resultado then outputDebugString("04") for _, search in ipairs ( resultado ) do outputDebugString("05") if (search["username"]) == val1 or search["mtaserial"] == serial then outputDebugString("07") outputChatBox("Esse nome de usuário já existe ou você já possui uma conta! tente novamente", jog) else outputDebugString("08") local serial = getPlayerSerial(jog) local password = tostring(val2) local nmAccount = getAccountName(getPlayerAccount(jog)) local PosX, PosY, PosZ = getElementPosition(jog) executeSQLQuery( "INSERT INTO registroPessoal (username, password, mtaserial, PosX, PosY, PosZ, accountName) valorS(?,?,?,?,?,?,?)", val1, password, serial, PosX, PosY, PosZ, nmAccount ) outputChatBox("Registro bem sucedido!", jog) end end end end) addCommandHandler("deltable", function() executeSQLQuery("DROP TABLE registroPessoal") outputDebugString("table deletada") end ) Fiz a debugação e a função de registrar para antes do for _, search, no caso no outPutDebugString("04"), a partir disto não se lê mais nada, então o problema deve se encontrar no dbPoll... Porém como não tenho muito conhecimento não sei oq esta sendo feito de errado...
  7. Tell me, what is better: MySQL, SQLite or XML? (You need to save (and retrieve) many user settings)
  8. Olá pessoas deliciosamente bonitas! Bom, estou desenvolvendo um save-system por SQLite, porém, na parte de salvar as coordenadas do jogador, do contrário de salvar cada um dos tipos de coordenadas em uma coluna (X - Y - Z) eu queria salvar em uma única coluna (Coordenadas), mas como vocês devem saber, dados obtidos de um db são retornados como string, então utilizei Vector3 e tonumber, mas com o tonumber retorna um valor nulo, e sem ele retorna uma string, como eu poderia fazer para retornar o valor original de coordenadas? Código: local x2, y2, z2 = 675.99396,-1692.27075,8.70498 -- LUGAR QUE VAI SPAWNAR QUANDO CRIAR CONTA NOVA local db = exports.ds_sqlite db:exec("CREATE TABLE IF NOT EXISTS Usuarios (Nick TEXT, Usuario TEXT, Serial TEXT, Skin INT, Dinheiro INT, Coordenadas TEXT, Interior INT, Dimensao INT, Procurado INT)") function loadUsuarios(player, acc) local accName = getAccountName(getPlayerAccount(player)) local datas = db:query("SELECT * FROM Usuarios WHERE Usuario=? LIMIT 1", accName) if (datas and type(datas) == "table" and #datas > 0) then -- @Datas setElementData(player, "CRP:Skin", tonumber(datas[1]["Skin"])) setElementData(player, "CRP:Dinheiro", tonumber(datas[1]["Dinheiro"])) setElementData(player, "CRP:Coordenadas", datas[1]["Coordenadas"]) setElementData(player, "CRP:Interior", tonumber(datas[1]["Interior"])) setElementData(player, "CRP:Dimensao", tonumber(datas[1]["Dimensao"])) setElementData(player, "CRP:Procurado", tonumber(datas[1]["Procurado"])) iprint(datas[1]["Coordenadas"]) -- @Funções setCameraTarget(player, player) fadeCamera(player, true, 2.0) spawnPlayer(player, Vector3(datas[1]["Coordenadas"])) setElementPosition(player, Vector3(datas[1]["Coordenadas"])) setElementModel(player, tonumber(datas[1]["Skin"])) setPlayerMoney(player, tonumber(datas[1]["Dinheiro"])) setElementInterior(player, tonumber(datas[1]["Interior"])) setElementDimension(player, tonumber(datas[1]["Dimensao"])) setPlayerWantedLevel(player, tonumber(datas[1]["Procurado"])) else setCameraTarget(player, player) fadeCamera(player, true, 2.0) spawnPlayer(player, x2, y2, z2) setElementPosition(player, x2, y2, z2) local x, y, z = getElementPosition(player) db:exec("INSERT INTO Usuarios VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", getPlayerName(player):gsub("#%x%x%x%x%x%x", ""), accName, getPlayerSerial(player), getElementModel(player), getPlayerMoney(player), x..","..y..","..z + 0.7, getElementInterior(player), getElementDimension(player), getPlayerWantedLevel(player)) end end function saveUsuarios(player, acc) local accName = getAccountName(getPlayerAccount(player)) local datas = db:query("SELECT * FROM Usuarios WHERE Usuario=? LIMIT 1", accName) if (#datas > 0) then local x, y, z = getElementPosition(player) db:query("UPDATE Usuarios SET Nick=?, Usuario=?, Serial=?, Skin=?, Dinheiro=?, Coordenadas=?, Interior=?, Dimensao=?, Procurado=?", getPlayerName(player):gsub("#%x%x%x%x%x%x", ""), accName, getPlayerSerial(player), getElementModel(player), getPlayerMoney(player), x..","..y..","..z + 0.7, getElementInterior(player), getElementDimension(player), getPlayerWantedLevel(player)) end end addEventHandler("onPlayerLogin", root, function() for index, players in ipairs(getElementsByType("player")) do if (players == source) then local account = getPlayerAccount(players) loadUsuarios(players, account) end end end ) addEventHandler("onPlayerQuit", root, function() for index, players in ipairs(getElementsByType("player")) do if (players == source) then local account = getPlayerAccount(players) if (account) then saveUsuarios(players, account) end end end end )
  9. So, i choose MTA over SAMP recently, to start learn scripting and developing my own server. Okay... I'm reading some scripts and by them, start browsing about the MTA's integrated systems that could help me develop an amazing or at least good experience, to my self and other players. The first thing that I've been facing is SQLite. I understood that it's a language of some kind to create a database, which could have: group names with their slots and store any change related with those; Items in market with fluctuating price; Car names, colors or price that are owned by the players; Inventory system, etc... But, when i read about SQlite i noticed that there's some features that could be invasive, since it can access third-party programs or CSV files to create analysis between variables. In resume, i want to know if all assets that i could use normally with SQlite is available on MTA:SA.
  10. so i have this code exports.scoreboard:addScoreboardColumn( 'time', root, 150 ) -- Online time is the element data local DB = dbConnect( "sqlite", "time.db" ) addEventHandler("onResourceStart", resourceRoot, function ( ... ) dbExec( DB, "CREATE TABLE IF NOT EXISTS online( playerACC, weeks,days, hours, minutes, secs )") for i, player in ipairs( getElementsByType("player") ) do local accountN = getAccountName( getPlayerAccount( player ) ) local getData = dbPoll( dbQuery( DB, "SELECT * FROM online WHERE playerACC=?", accountN), -1 ) if ( #getData == 0 ) then setPlayerTime( player, 0, 0, 0, 0, 0 ) else for i, data in ipairs( getData ) do local weeks = data.weeks or 0 local days = data.days or 0 local hours = data.hours or 0 local minutes = data.minutes or 0 local seconds = data.secs or 0 setPlayerTime( player, weeks ,days, hours, minutes, seconds ) end end setTimer( updatePlayerTime, 1000, 0, player ) end end) addEventHandler("onPlayerLogin", root, function ( ... ) local accountN = getAccountName( getPlayerAccount( source ) ) local getData = dbPoll( dbQuery( DB, "SELECT * FROM online WHERE playerACC=?", accountN), -1 ) if ( #getData == 0 ) then setPlayerTime( source, 0, 0, 0, 0, 0 ) else for i, data in ipairs( getData ) do local weeks = data.weeks or 0 local days = data.days or 0 local hours = data.hours or 0 local minutes = data.minutes or 0 local seconds = data.secs or 0 setPlayerTime( source, weeks ,days, hours, minutes, seconds ) end end setTimer( updatePlayerTime, 1000, 0, source ) end) function setPlayerTime( player, weeks ,days, hours, minutes, secs ) local accountN = getAccountName( getPlayerAccount( player ) ) if ( accountN ) then local dbe = dbQuery( DB, "SELECT * FROM online WHERE playerACC=?", accountN) local result = dbPoll( dbe, -1 ) local realTime = table.concat{ weeks.."w ",days.."d "..hours.."h ", minutes.."min.", secs.."s " } --", secs.."s " setElementData( player, "time", realTime ) if ( #result == 0 ) then dbExec( DB, "INSERT INTO online( playerACC, weeks, days, hours, minutes, secs ) VALUES( ?, ?, ?, ?, ?, ? ) ", accountN, tonumber( weeks ), tonumber( days ), tonumber( hours ), tonumber( minutes ), tonumber( secs ) ) else dbExec( DB, "UPDATE online SET playerACC=?, weeks=?, days=?, hours=?, minutes=?, secs=?", accountN, tonumber( weeks ), tonumber( days ), tonumber( hours ), tonumber( minutes ), tonumber( secs) ) end end end function updatePlayerTime( player ) local accountN = getAccountName( getPlayerAccount( player ) ) if ( accountN ) then local getData = dbPoll( dbQuery( DB, "SELECT * FROM online WHERE playerACC=?", accountN), -1 ) if ( getData ) then for index, data in ipairs( getData ) do data.secs = data.secs + 1 if ( data.secs == 5 ) then data.hours = data.hours + 1 data.secs = 0 elseif ( data.minutes == 60 ) then data.hours = data.hours + 1 data.minutes = 0 elseif ( data.hours == 24 ) then data.days = data.days + 1 data.hours = 0 elseif ( data.days == 7 ) then data.weeks = data.weeks + 1 data.days = 0 end setPlayerTime( player, data.weeks, data.days, data.hours, data.minutes, data.secs ) end end end end And i have 3problems and one question . 1st problem WARNING: [gameplay]/killcount-scoreboard/server.lua 62. bad argument @ 'getAccountName' [Expected element at argument 1] [DUP x11] . 2nd problem that it converts seconds 60sec to 1min i tried changing it and it worked but it can't convert second third and fourth only seconds. 3rd problem that it saves data only to one account for example there is 3players it should load time every player but it load 1st only acc for example on sqlite it shows: Dziugasc I 0weeks I 0days I 15hours I 35minutes I 45 seconds Dziugasc I 0weeks I 0days I 15hours I 35minutes I 45 seconds Dziugasc I 0weeks I 0days I 15hours I 35minutes I 45 seconds And question how to make that it would show only time that player was online for example he was online only 1d and 18hours and on scoreboard it would show 1d 18h in my scoreboard it shows 0w 0d 0h 15min. [I don't need 0 that way it would be nicer to look.
  11. so i tried to make saving system that saves kills and deaths but it doesn't save full script local root = getRootElement() local scoresRoot = getResourceRootElement(getThisResource()) local scoreColumns = {"Kills", "Deaths", "ratio", "status"} local isColumnActive = {} local KDR_DECIMAL_PLACES = 2 --http://lua-users.org/wiki/SimpleRound local function round(num, idp) local mult = 10^(idp or 0) return math.floor(num * mult + 0.5) / mult end local function setScoreData (element, column, data) if isColumnActive[column] then setElementData(element, column, data) end end local dbConnection = dbConnect("sqlite", "backupexprank.db") local qh = dbQuery( dbConnection,"CREATE TABLE IF NOT EXISTS scores (name text,Kills text,Deaths text)") dbFree( qh ) function saveScore(sourcePlayer) local account = getPlayerAccount(sourcePlayer) local name = getAccountName(account) local Kills = getAccountData(account, "Kills") local Deaths = getAccountData(account, "Deaths") local qh = dbQuery( dbConnection, "SELECT * FROM scores where name=?",name) local res = dbPoll(qh,-1) dbFree( qh ) if #res > 0 then dbExec( dbConnection, "UPDATE scores SET Deaths=? where name=? ", Deaths,name ) dbExec( dbConnection, "UPDATE scores SET Kills=? where name=? ", Kills,name ) outputChatBox ( "Saved account " .. name .. " with the Kills " .. Kills .. " with the Deaths" .. Deaths .. " to our database") else dbExec(dbConnection, "INSERT INTO scores VALUES(?, ?, ?)", name, Kills, Deaths) outputChatBox ( "Saved account " .. name .. " with the Kills " .. Kills .. " with the Deaths" .. Deaths .. " to our database") end end addCommandHandler("savestats", saveScore) local function resetScores (element) setScoreData(element, "Kills", 0) setScoreData(element, "Deaths", 0) local status = "" if isPedDead(element) then status = "Dead" end setScoreData(element, "status", status) end local function updateRatio (element) local Deaths = getElementData(element, "Deaths") if Deaths == 0 then setScoreData(element, "ratio", "-") else local kdr = round(getElementData(element, "Kills") / Deaths, KDR_DECIMAL_PLACES) setScoreData(element, "ratio", tostring(kdr)) end end function updateActiveColumns () for i, column in ipairs(scoreColumns) do if get(column) then isColumnActive[column] = true exports.scoreboard:addScoreboardColumn(column) elseif isColumnActive[column] then isColumnActive[column] = false exports.scoreboard:removeScoreboardColumn(column) end end end addEventHandler("onResourceStart", scoresRoot, function () updateActiveColumns() for i, player in ipairs(getElementsByType("player")) do resetScores(player) end end ) addEventHandler("onResourceStop", scoresRoot, function () for i, column in ipairs(scoreColumns) do if isColumnActive[column] then exports.scoreboard:removeScoreboardColumn(column) end end end ) addEventHandler("onPlayerJoin", root, function () resetScores(source) end ) addEventHandler("onPlayerWasted", root, function (ammo, killer, weapon) if killer then if killer ~= source then -- killer killed victim setScoreData(killer, "Kills", getElementData(killer, "Kills") + 1) setScoreData(source, "Deaths", getElementData(source, "Deaths") + 1) if isColumnActive["ratio"] then updateRatio(killer) updateRatio(source) end else -- victim killed himself setScoreData(source, "self", getElementData(source, "self") + 1) end else -- victim died setScoreData(source, "Deaths", getElementData(source, "Deaths") + 1) if isColumnActive["ratio"] then updateRatio(source) end end setScoreData(source, "status", "Dead") end ) addEventHandler("onPlayerSpawn", root, function () setScoreData(source, "status", "") end ) i need that it would save always without typing command like player died save to db
  12. #LycaN

    MySQL internal dbs

    How can I change the MTA internal db (internal.db and registry.db) to MySQL, maintening the functions like getAccountData, getElementData ?
  13. Hello fellows how are you ? Today i want to use database connections Into a simple script that im gonna make about user settings The script is simple a gui opens up and the user selects if he wants to enable disable some graphical settings (car reflection, water, detail, contrast, show fps counter etc blah blah) Script is made and works perfect but i want to save each user settings to database(sqlite for now since i don't want to have remote control of database for now so mysql is not needed) so when he logs on to server the settings he set before will be applied, and also if hes new user server will make a new list in database for that user with default settings (1(enable) for each setting)) anyway i don't need you to tell me how exaclty im gonna code that cause you will get through much work but i want to give me the idea how the hell am i gonna do this because the wiki is helpless in these things if you want some example how bad i am in scripting sql see below: playerSettings = {} function playerJoin() local settingsQuery = dbQuerry(connectionDb,"select * from settings") local settingsQueryResult = dbPoll(settingsQuery, -1) for i, user in pairs(settingsQueryResult) do local playerName = getAccountName(source) table.insert(playerSettings,playerName) end end addEventHandler("onPlayerJoin", resourceRoot, playerJoin) thanks in advance
  14. Hello guys, Yesterday I didn't have anything to do so I decided to convert MTA Paradise to SQLite, ( just the sql resource needs to be changed ). The resource has not all the capabilities of the original one like editing already existing columns, but the other features are working OK. Now you won't need any mySQL host or module http://www72.zippyshare.com/v/CeQ6O7FB/file.html
  15. When i try updating the database it does not work when using the WHERE clause... I get no errors. Here's all the code
  16. I have the following, which just gets "skin", "cash" and "wasWanted" from the DB function spawnOnLogin () playerName = getPlayerName(source) local findPlayer = dbQuery(db, "SELECT `skin`, `cash`, `wasWanted` FROM player_stuff WHERE name=?", playerName ) local dataresult = dbPoll ( findPlayer, -1 ) if dataresult[1] then local skin = dataresult["skin"] local cash = dataresult["cash"] local wasWanted = dataresult["wasWanted"] end end addEventHandler("onPlayerJoin", getRootElement(), spawnOnLogin) the variables "skin", "cash" and "wasWanted" all come back nil, since I can't work out the right way to get the result. Been looking for ages but can't find the right way to do it, can someone explain to me how I retrieve these values from the query result properly? Thanks
  17. Estoy creando un sistema de guardado de cuentas en SQLite pero tengo problemas. Con el código a continuación, cuando le doy a registrar, siempre me dice que hay una cuenta ya creada (cuando la .db está vacía) y cuando le doy a loguear, con lo que sea, puedo entrar. addEventHandler( "onResourceStart", resourceRoot, function( ) sql = dbConnect ( "sqlite" , "accounts.db" ) -- Create the connection playersTable = dbQuery ( sql , "CREATE TABLE IF NOT EXISTS accounts (account TEXT,password TEXT,serial TEXT)" ) if fileExists( "accounts.db" ) and sql and playersTable then outputDebugString( "Succefully connected SQLite resource" ) else outputDebugString( "Failed to connect SQLite" ) end end ) function tryRegister( player, username, password ) if username and password then local exists = dbQuery ( sql , "SELECT * FROM accounts WHERE account = ?", username ) local result = dbPoll( exists, 0 ) if result then triggerClientEvent( player, "loginPanel:executeMessage", player, "Account already exists" ) return else local serial = getPlayerSerial( player ) if serial then local qh = dbQuery ( sql , "INSERT INTO accounts (account,password,serial) VALUES (?,?,?)", username, password, serial ) local result = dbPoll( qh, -1 ) if result then triggerClientEvent( player, "loginPanel:executeMessage", player, "Succefully registered. Welcome" ) return true else triggerClientEvent( player, "loginPanel:executeMessage", player, "Error, contact with server admin" ) return end else triggerClientEvent( player, "loginPanel:executeMessage", player, "Fatal error. No serial found." ) return end end else triggerClientEvent( player, "loginPanel:executeMessage", player, "Type username and password" ) return end end function tryLogin( player, username, password ) if username and password then local exists = dbQuery ( sql , "SELECT * FROM accounts WHERE account = ? AND password = ?", username, password ) local result = dbPoll( exists, -1 ) if result then local x, y, z = 2272.0419921875, 2354.5302734375, 4.8202133178711 spawnPlayer( player, x, y, z ) triggerClientEvent(client, "onClientPlayerLogin", client) return true else triggerClientEvent( player, "loginPanel:executeMessage", player, "Account does not exists" ) return end else triggerClientEvent( player, "loginPanel:executeMessage", player, "Type username and password" ) return end end function performLogin (username, password, type) local account = getAccount( username, password ) if type == "login" then tryLogin( client, username, password ) elseif type == "register" then if username and #username > 3 then if password and #password > 8 then tryRegister( client, username, password ) else triggerClientEvent( client, "loginPanel:executeMessage", client, "Required password characters: 8" ) end else triggerClientEvent( client, "loginPanel:executeMessage", client, "Incorrect username. More than 3 characters" ) end elseif type == "leave" then kickPlayer ( client, "See you soon (Leaving)" ) end end addEvent("loginPanel:performLogin", true) addEventHandler("loginPanel:performLogin", root, performLogin ) ¿Me echan una mano? No sé como funciona correctamente el dbPoll y demás PD: Disculpad los dos temas, con el nuevo diseño no puedo borrar
×
×
  • Create New...