08.12.2015, 16:52
(
Последний раз редактировалось HaRdiiZin; 14.06.2016 в 21:25.
Причина: Tуpico editado
)

Aprendendo conceitos bбsicos de SQLite.
- Нndice:
Veja oque serб abordado neste tуpico.
- Introduзгo ao SQLite
- Oque й, e sua Histуria
- Como conectar com o banco de dados.
- Criando meu banco de dados!
- Conhecendo as funзхes do SQLite
- Atualizando, selecionando, inserindo e deletando dados da tabela.
- Perguntas & Respostas
- Sistema de login & registro em SQL
- Conclusхes finais
- Introduзгo ao SQLite
- Intruduзгo ao SQLite
- Oque й, e sua Histуria
SQLite й uma biblioteca em linguagem C que implementa um banco de dados SQL embutido. Programas que usam a biblioteca SQLite podem ter acesso a banco de dados SQL sem executar um processo SGBD separado. SQLite nгo й uma biblioteca cliente usada para conectar com um grande servidor de banco de dados, mas sim o prуprio servidor. A biblioteca SQLite lк e escreve diretamente para e do arquivo do banco de dados no disco. O uso do SQLite й recomendado onde a simplicidade da administraзгo, implementaзгo e manutenзгo sгo mais importantes que incontбveis recursos que SGBDs mais voltados para aplicaзхes complexas possivelmente implementam. As situaзхes onde a simplicidade й a melhor escolha sгo muito mais freqьentes do que pode-se imaginar. E vocк sabia que SQLite, faz quase, ou atй o mesmo papel que o MySQL? Isto porque o SQLite foi criado, assim como o MySQL com uma linguagem chamada de Structured Query Language, ou Linguagem de Consulta Estruturada(SQL), que й a linguagem de pesquisa declarativa padrгo para banco de dados relacional (base de dados relacional), daн vem o nome SQLite, ou MySQL como tantos conhecem
. SQL foi desenvolvido originalmente no inнcio dos anos 70 nos laboratуrios da IBM em San Jose, dentro do projeto System R, que tinha por objetivo demonstrar a viabilidade da implementaзгo do modelo relacional proposto por E. F. Codd. O nome original da linguagem era SEQUEL, acrфnimo para "Structured English Query Language", vindo daн o facto de, atй hoje, a sigla, em inglкs, ser comumente pronunciada "sнquel" ao invйs de "йs-kiъ-йl", letra a letra. No entanto, em portuguкs, a pronъncia mais corrente й a letra a letra: "йsse-quк-йle". Entгo gente, vamos comeзar a falar certo o correto й 'йsse-quк-йle'.
- Como conectar com o banco de dados.
No sa-mp para ter acesso as funзхes do SQLite nativo, basta adicionar a include padrгo do sa-mp(a_samp), pois a mesma jб carrega com sigo mesmo a a_sampdb, que й responsбvel pelas funзхes do SQLite.
Entгo:
Porйm, alйm de incluir a a_samp precisamos tambйm fazer a 'conexгo' com o banco de dados.PHP код:#include <a_samp>
Com isto jб podemos comeзar usar o SQLite da forma mais bбsica possнvel.PHP код:#include <a_samp>
main(){}
new DB:Connect;
public OnGameModeInit()
{
Connect = db_open("mydb.db");
return 1;
}
- Criando meu banco de dados!
Para criarmos nosso banco de dados eu optei por usar um programa muito bom, e que muitos usam o SQLite Browser que й um programa muito bom para manipulaзгo, e que eu uso e recomendo. Com ele vocк poderб deletar, inserir e atualizar.. Vamos lб entгo, acompanhe o vнdeo abaixo!
[ame="http://www.youtube.com/watch?v=q-X4jLNH3i8"]Tutorial..[/ame]
Caso queira aprender a criar seu banco de dados, manualmente sem ajuda de programas veja meu outro tutorial que й relacionado a exatamente isso, veja.
- Oque й, e sua Histуria
- Conhecendo as funзхes do SQLite:
Para vocк poder usar o SQLite em seu servidor, certamente terгo funcхes na qual vocк irб utilizar para abrir, fechar uma db e atй mesmo inserir, atualizar, selecionar dados de uma tabela. Hoje, conheceremos algumas delas!- db_open: Como jб vimos acima, й usada para abrir uma conexгo com um banco de dados SQLite. O modo de uso, й muito simples e nуs jб vimos, porйm vamos tambйm aprender a aprimorar a nossa conexгo, veja como:
a funзгo acima, verificarб se a conexгo foi efetuada com sucesso, e se isso for igual a falso, ou seja.. se a conexгo falhar ao conectar o servidor serб desligado.PHP код:#include <a_samp>
main(){}
new DB:Connect;
public OnGameModeInit()
{
if((Connect = db_open("mydb.db")) == DB:0)
{
return SendRconCommand("exit");
}
return 1;
}
- db_close: Se temos uma funзгo para abrir uma conexгo, certamente teremos outra para fechar essa mesma conexгo. A db_close, ficarб responsбvel em fechar um banco de dados SQLite que foi aberto com db_open, como nуs fizemos acima...entгo usando a mesma handle de conexгo(Connect) fecharemos essa conexгo..
lembrando, que nгo podemos fechar algo que nгo foi aberto, ou ao menos nem criado.PHP код:public OnGameModeExit()
{
db_close(Connect);
return 1;
}
- db_query: Essa, serб sem dъvidas a funзгo mais usada por vocк. Pois serб com ela que vocк terб todas as possibilidades de inserir, atualizar, deletar e tudo oque o SQLite oferece. Vamos ver um exemplo simples dessa funзгo:
Vamos a outro exemplo.PHP код:new DB:db_handle;
// ...
public OnGameModeInit()
{
// Cria uma conexгo com o banco de dados.
if((db_handle = db_open("example.db")) == DB:0)
{
// Printa um erro no console caso o banco de dados nгo seja encontrado.
print("Nao foi possivel encontrar \"example.db\".");
SendRconCommand("exit");
}
else
{
// Se o banco foi encontrado, gera uma mensagem de sucesso.
print("Conecao com \"example.db\" efetuada!");
}
// ...
return 1;
}
public OnGameModeExit()
{
// Fecha a conexгo com o banco de dados...
db_close(db_handle);
// ...
return 1;
}
public OnPlayerSpawn(playerid)
{
// Declara query e p_name.
static query[98], p_name[MAX_PLAYER_NAME+1];
// Guarda o nome do jogador na vбriavel p_nome.
GetPlayerName(playerid, p_name, sizeof p_name);
// Formata a "query"
format(query, sizeof query, "INSERT INTO `spawn_log` (`PlayerID`,`PlayerName`) VALUES (%d,'%s')", playerid, p_name);
// Libera o resultado e insere um log na tabela 'spawn_log'..
db_free_result(db_query(db_handle, query));
// ...
return 1;
}
PHP код://Selecionando.
db_query(db_handle, "SELECT * FROM `contas` WHERE `nome`='HaRdiiZin'");
// Selecionar tudo da tabela contas onde o nome for HaRdiiZin.
//Atualizar.
db_query(db_handle, "UPDATE `contas` SET `nome`='HaRdiiZola' WHERE `nome`='HaRdiiZin'");
// Atualizar a tabela colunas e alterar o nome para HaRdiiZola onde o nome for HaRdiiZin.
- db_free_result: Essa funзгo, libera um resultado da memуria alocada a partir db_query. O modo de uso й suuuuper fбcil, veja vocк mesmo: Vamos supor que estamos criando um sistema de login & registro para nosso servidor, e precisamos checar se o player jб й registrado ou nгo.. fariamos da seguinte forma:
Explicaзгo: Para este caso, a gente precisou guardar o resultado da query para saber se o player era registrado e depois liberamos esse resultado usando db_free_result. Tambйm, utilizamos a db_num_rows, que a gente vai falar jб,jб para que serve..PHP код://...
public OnPlayerConnect(playerid)
{
// Declara nome e query.
new nome[MAX_PLAYERS], query[128], DBResult:Resultado;
// Guarda o nome do player na vбriavel nome.
GetPlayerName(playerid, nome, sizeof nome);
// Formata a query.
format(query, sizeof query, "SELECT * FROM `contas` WHERE `nome`='%q'", nome);
// Seleciona tudo da tabela contas que conter o nome do player.
Resultado = db_query(db_handle,query);
// Retorna o nъmero de linhas da query, nesse caso se nгo houver nenhuma linha signfica que o player nгo tem uma conta no servidor.
if(db_num_rows(Resultado) == 0)
{
// Nгo tem uma conta.
}
else
{
// Tem uma conta.
}
db_free_result(Resultado);
return 1;
}
- db_num_rows: Essa funзгo й responsбvel por retornar o nъmero de linhas de uma query, e deve ser usada em conjunto com a db_free_result. Veja como usa-la:
Vamos entender melhor:PHP код://...
public OnPlayerConnect(playerid)
{
// Declara nome e query.
new nome[MAX_PLAYERS], query[128], DBResult:Resultado;
// Guarda o nome do player na vбriavel nome.
GetPlayerName(playerid, nome, sizeof nome);
// Formata a query.
format(query, sizeof query, "SELECT * FROM `contas` WHERE `nome`='%q'", nome);
// Seleciona tudo da tabela contas que conter o nome do player.
Resultado = db_query(db_handle,query);
// Retorna o nъmero de linhas da query, nesse caso se nгo houver nenhuma linha signfica que o player nгo tem uma conta no servidor.
if(db_num_rows(Resultado) == 0)
{
// Nгo tem uma conta.
}
else
{
// Tem uma conta.
}
db_free_result(Resultado);
- Aqui criamos nossa query, oque vocк pode nгo ter percebido й que antes da funзгo db_query utilizamos a vбriavel Resultado, que foi declarada lб em cima, junto com a query.. Para cria-la, basta usar por exemplo: "new DBResult:Resultado;";PHP код:
// Formata a query.
format(query, sizeof query, "SELECT * FROM `contas` WHERE `nome`='%q'", nome);
// Seleciona tudo da tabela contas que conter o nome do player.
Resultado = db_query(db_handle,query);
- Aqui fazemos a verificar, perguntando se o nъmero de linhas retornadas da query й igual a zero. Se for, й porque o player nгo tem uma conta.PHP код:
if(db_num_rows(Resultado) == 0)
- Liberamos o resultado da memуria alocada.PHP код:
db_free_result(Resultado);
- db_get_field_assoc: Obtem o conteъdo do campo com o nome especificado, lembrando que hб uma funзгo bastante semelhante, a db_get_field porйm neste tutorial nгo comentбremos sobre ela.
Certo, agora vamos entender o cуdigo do exemplo:PHP код:public OnPlayerConnect(playerid)
{
// Declara nome e query.
new nome[MAX_PLAYERS], query[128], DBResult:Resultado;
// Guarda o nome do player na vбriavel nome.
GetPlayerName(playerid, nome, sizeof nome);
// Formata a query.
format(query, sizeof query, "SELECT * FROM `contas` WHERE `nome`='%q'", nome);
// Seleciona tudo da tabela contas que conter o nome do player.
Resultado = db_query(db_handle,query);
// Retorna o nъmero de linhas da query, nesse caso se nгo houver nenhuma linha signfica que o player nгo tem uma conta no servidor.
if(db_num_rows(Resultado) == 0)
{
// Nгo tem uma conta.
ShowPlayerDialog(...
}
else
{
// Tem uma conta.
new field[10];
db_get_field_assoc(Resultado, "level", field, sizeof(field));
level = strval(field);
}
db_free_result(Resultado);
}
- Aqui declaramos a vбriavel field com 10 celulas, e usamos nossa funзгo para pegar os dados da coluna level.PHP код:
new field[10];
db_get_field_assoc(Resultado, "level", field, sizeof(field));
- Nessa parte, na vбriavel level que foi usada somente de exemplo, inserimos nela o valor do field. Ai vocк deve estar perguntando, mais porque eu jб nгo fiz isso direto, assim poupando declarar a vбriavel field? Bom, isto porque se vocк tentar fazer desta maneira irб gerar um erro no seu cуdigo, por isso foi feito assim. Agora vamos a outro exemplo.PHP код:
level = strval(field);
PHP код:new field[10], Float:PosX[MAX_PLAYERS];
db_get_field_assoc(Resultado, "PosicaoX", field, sizeof(field));
PosX[playerid] = float(strval(field));
- db_open: Como jб vimos acima, й usada para abrir uma conexгo com um banco de dados SQLite. O modo de uso, й muito simples e nуs jб vimos, porйm vamos tambйm aprender a aprimorar a nossa conexгo, veja como:
- Atualizando, selecionando, inserindo e deletando dados da tabela.
Vamos entгo para as instruзхes que vocкs usarгo e muito, muito mesmo. Vamos comeзar com a de inserзгo a INSERT, com ela vocк poderб inserir dados em sua tabela. Mas antes, vamos entender oque й tabela, coluna, e dados. Tabela, й como se fosse um armбrio, jб as colunas seriam suas gavetas, e os dados, obviamente seriam oque hб dentro destas gavetas.. pensando desta maneira, tenho certeza que vocк nunca irб se esquecer.. Entгo vamos lб. Para vocк usar qualquer uma das instruзхes que vou passar a baixo vocк deverб a funзгo db_query, que й uma nativa que vem com a a_sampdb que nуs jб vimos como instala-la. A linguagem SQL й dividida em subconjuntos de acordo com as operaзхes que queremos efetuar sobre um banco de dados, porйm sу veremos algumas.. Comeзaremos com a Linguagem de Manipulaзгo de Dados.
- Linguagem de Manipulaзгo de Dados.
DML(sigla em inglкs) й um subconjunto da linguagem SQL que й utilizado para realizar inclusхes, consultas, alteraзхes e exclusхes de dados presentes em registros, dentro dela temos as instruзхes INSERT, UPDATE e DELETE.
- INSERT
A insert, como proprio nome jб diz insere um dado em seu banco de dados, ela й uma das sintaxes mais simples que tem, veja.
Vamos entender o cуdigo, como jб vimos estamos usando a tabela que criamos no vнdeo que eu deixei a cima, ensinando como criava um banco de dados. Nele, a gente definiu que a coluna03 seria do tipo AUTOINCREMENT, e por isso nгo precisaremos inseri-lo em nossa query, pois o sql jб faz isso sozinho e insere um novo id para a coluna. A coluna01, receberб entгo o valor de 0, e a coluna02, o valor HaRdiiZin. Lembre-se, que isso sу й possнvel pois na hora que criarmos nosso banco de dados definimos que nossa coluna seria do tipo TEXT, caso contrбrio nгo poderiamos inserir, por isso й muito importante prestar muita atenзгo na hora de criar uma db. A sintaxe do INSERT, й muito bбsica.. vamos observar:PHP код:db_query(db, "INSERT INTO `minhatabela` (`coluna01`, `coluna02`) VALUES ('0', 'HaRdiiZin')")
Sendo assim, a onde temos `tabela`, seria o nome da tabela que vocк gostaria de inserir um dado, nesse por exemplo, caso vocк quisesse adicionar um dado na tabela jogadores, bastaria fazer do seguinte modo: INSERT INTO `jogadores`... continuando, teriamos que definir as colunas em que desejariamos adicionar o dado, vamos supor que vocк estб cadastrando um novo usuбrio, e gostaria de salvar o nick e a senha do mesmo. Entгo, ficaria do seguinte modo: INSERT INTO `jogadores` (`nick`, `senha`) e para complementar a sintaxe, temos a clausula VALUE que como o proprio nome jб diz, seria os valores que esse 'comando' iria inserir na tabela jogadores, nas colunas nick e senha. O modo й muito simples: INSERT INTO `jogadores` (`nick`, `senha`) VALUES ('HaRdiiZin', 'higor123'). Entгo o resultado final, seria:PHP код:INSERT INTO `tabela` (`colunas`) VALUES ('valores')
que retornaria para gente, uma inserзгo perfeita na tabela jogadores, inserindo nas colunas nick e senha, HaRdiiZin e higor123 respectivamente.PHP код:INSERT INTO `jogadores` (`nick`, `senha`) VALUES ('HaRdiiZin', 'higor123')
-
Lembrando, que isso й o modo bбsico de como usar a intruзгo INSERT, se vocк quiser se aprofundar no SQL recomendo que aguarde meu proximo tutorial(se tiver) ou que saia a procura de alguns pela internet nгo relacionados a SA-MP.
- DELETE
A instruзгo delete, como o proprio nome jб diz deleta algum valor de sua tabela, e o modo de uso й extremamente fбcil.
e para usa-la, ela tambйm deve ser colocada dentro da db_query do seguinte modo.PHP код:DELETE * FROM `minhatabela` WHERE `coluna01` = 'HaRdiiZin'
PHP код:public OnPlayerConnect(playerid)
{
db_query(db, "DELETE * FROM `minhatabela` WHERE `coluna01` = 'HaRdiiZin'");
return 1;
}
- UPDATE
A instruзгo update, й responsбvel por fazer a atualizaзгo dos dados de sua tabela, basicamente para usa-la vocк sу precisara informar a tabela que quer atualizar, os dados que serгo atualizados e opcionalmente onde ela teria efeito.
Dessa maneira, fariamos que cada vez que o player logasse no servidor fosse atualizado a ъltima data de login dele. Simples nгo й?PHP код:public OnPlayerConnect(playerid)
{
// Declara nome e query.
new nome[MAX_PLAYERS], query[128];
// Guarda o nome do player na vбriavel nome.
GetPlayerName(playerid, nome, sizeof nome);
format(query, sizeof query, "UPDATE `contas` SET `ultlogin`='%d' WHERE `nome`='%q'", nome, gettime());
db_query(db, query);
return 1;
}
- INSERT
- Linguagem de Consulta de Dados
Embora tenha apenas um comando, a DQL й a parte da SQL mais utilizada. O comando SELECT permite ao usuбrio especificar uma consulta ("query") como uma descriзгo do resultado desejado. Esse comando й composto de vбrias clбusulas e opзхes, possibilitando elaborar consultas das mais simples аs mais elaboradas.
- SELECT
O Select й o principal comando usado em SQL para realizar consultas a dados pertencentes a uma tabela, vamos ver um simples exemplo de como usa-lo no pawn.
Mais para vocк entender melhor, vamos ver as clausulas que o SELECT tem consigo:PHP код:public OnPlayerConnect(playerid)
{
db_query(db, "SELECT * FROM `minhatabela` WHERE `coluna`='%s'");
return 1;
}
OBS: Sу veremos duas nesse tutorial, mais saнba que hб mais de duas!PHP код:FROM – Utilizada para especificar a tabela que se vai selecionar os registros.
WHERE – Utilizada para especificar as condiзхes que devem reunir os registros que serгo selecionados.
Entгo como vocк viu, e se vocк sabe um pouquinho de inglкs jб sabemos que a FROM й o local, e WHERE й a mesma coisa que perguntar a onde.
E para complementar um pouquinho mais o seu conhecimento, vamos ver tambйm como usar Operadores Lуgicos no SQL.
Entгo vamos ver um exemplo usando oque a gente viu atй aqui.PHP код:AND – E lуgico. Avalia as condiзхes e devolve um valor verdadeiro caso ambos sejam corretos.
OR – OU lуgico. Avalia as condiзхes e devolve um valor verdadeiro se algum for correto.
NOT – Negaзгo lуgica. Devolve o valor contrбrio da expressгo.
Mais uma coisa que precisamos entender, como vocк pode ter visto eu estou utilizando apуs o SELECT um asterisco (*) com este asterisco estamos indicando que iremos selecionar todas as colunas, porйm podemos tambйm selecionar apenas as colunas que quisermos da seguinte forma:PHP код:// Exemplo 01:
db_query(db, "SELECT * FROM `contas` WHERE `nome` = 'HaRdiiZin' AND `senha` = 'teste'");
// Exemplo 02:
db_query(db, "SELECT * FROM `teste` WHERE `teste01` = '5' OR `teste02` = '6'");
PHP код:db_query(db, "SELECT `id, senha` FROM `contas` WHERE `nome` = 'HaRdiiZin'");
- SELECT
- Linguagem de Manipulaзгo de Dados.
- Perguntas & Respostas
-
Pergunta: Qual й melhor MySQL ou SQLite? Qual a diferenзa de um ao outro?
Resposta:
-
Pergunta: Й possнvel fazer as mesmas coisas em SQLite do que em MySQL?
Resposta:
-
Pergunta: Qual й melhor MySQL ou SQLite? Qual a diferenзa de um ao outro?
- Sistema de login & registro em SQL
Tуpico original.PHP код:/*
___ ____ _________ ______ ______ /
/ / \ /\ | | \ | | / | /
| | \/ | | | | | | /
\______ | | | |_____/ | | | |/\
\ |----| | | \ | | | | \
| | /\ | | | | | | | \
_______/ | | \/ | | | \______/ \______ | |
San Andreas Truck - 2015®
*/
/*
*
* Autor do gamemode: HaRdiiZin
* Data de criaзгo: 26/10/15
* Nome do projeto: San Andreas Truck
* Descriзгo: Este projeto foi iniciado somente para relembrar as funзхes do sqlite,
* e tambйm porque eu iria iniciar um projeto de trucking mais acabei desistindo
* dele por falta de tempo, jб que eu tenho outro projeto em andamento..
*
*/
/*
*
* O que hб no gamemode?
* Como eu desisti nos primeiros dias de desenvolvimento, praticamente nem fiz nada no gamemode. Ele й uma base, uma base na qual
* novatos na linguagem possam aprender mais, e tambйm conhecer o quгo ъtil й o sqlite no sa-mp e como podemos utiliza-lo, atualmente o gamemode
* sу tem o sistema de login e registro, ambos funcionando 100% e salvando, admin, skin, e ъltima posiзгo. Espero que gostem!
*
*/
//--------------------------------------------------------------
/* Includes necessбrias para o bom funcionamento do servidor. */
#include <a_samp>
#include <foreach>
#include <mSelection>
/* Configuraзхes gerais do servidor. */
#define serverNome "hostname San Andreas Truck | HaRdiiZin®"
#define serverPass "password 0"
#define serverLang "language Portugues - Brasil"
#define serverMod "by HaRdiiZin® - v0.1 R1"
#define serverMap "mapname San Andreas"
#define serverSite "weburl www.forum.sa-mp.com"
#define Kick(%0) SetTimerEx("Kicka", 100, false, "i", %0)
#define Ban(%0) SetTimerEx("Bana", 100, false, "i", %0)
/* Enums e outras vбriaveis.. */
enum
{
Branco = 0xFFFFFFFF,
Verde = 0x29BF33FF,
Vermelho = 0xFF0000FF,
Azul = 0x1DA7B9FF,
Rosa = 0xB837C1FF,
Roxo = 0xB11BCFFF,
Amarelo = 0xFFF300FF,
Laranja = 0xFFC000FF
};
enum
{
Login,
Registro,
SelectSkin
};
enum player_data
{
Admin,
Skin,
Float:px,
Float:py,
Float:pz,
Float:pa
};
new DB:Connect;
new pInfo[MAX_PLAYERS][player_data];
/* Necessarias para o script */
main() { print("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n> HaRdiiZin®"); }
public OnGameModeInit()
{
LoadServerConfig();
/* Carrega o banco de dados */
Connect = db_open("sql.db"); // Abre o banco de dados..
db_free_result(db_query(Connect, "CREATE TABLE IF NOT EXISTS `contas` (`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,`nome` TEXT NOT NULL,`senha` TEXT NOT NULL,`admin` INTEGER NOT NULL,`skin` INTEGER NOT NULL,`px` INTEGER NOT NULL,`py` INTEGER NOT NULL,`pz` INTEGER NOT NULL,`pa` INTEGER NOT NULL);"));
// Cria as tabelas caso elas nгo existam..
/* Inserir uma conta na tabela, caso a AutoRegister esteja habilitada. */
#if defined AutoRegister
db_query(Connect, "INSERT INTO `contas` (`nome`, `senha`, `admin`, `skin`, `px`, `py`, `pz`, `pa`) VALUES ('HaRdiiZin', 'teste', '0', '4', '0.0', '0.0', '0.0', '0.0')");
//Somente para testes..
#endif
return 1;
}
public OnGameModeExit()
{
for(new i = 0; i < MAX_PLAYERS; i++) SavePlayer(i);
return 1;
}
public OnPlayerConnect(playerid)
{
SetTimerEx("OnPlayerConnected", 100, false, "i", playerid);
return 1;
}
forward OnPlayerConnected(playerid);
public OnPlayerConnected(playerid)
{
/* Seta a camera do player e outras funзхes .*/
TogglePlayerSpectating(playerid, true);
InterpolateCameraPos(playerid, 1462.9407, -867.8122, 105.3706, 1322.1545, -956.1140, 136.5105, 10000, CAMERA_MOVE);
InterpolateCameraLookAt(playerid, 1462.3888, -866.9811, 104.9506, 1322.5913, -955.2172, 136.1455, 10000, CAMERA_MOVE);
/* Verifica se o player tem ou nгo uma conta, caso ele tenha ele serб jogado para dialog de login, se nгo ele irб para de registro. */
new query[61], DBResult:Result;
format(query, sizeof(query), "SELECT * FROM `contas` WHERE `nome` = '%s'", DB_Escape(GetName(playerid)));
Result = db_query(Connect, query);
if(db_num_rows(Result) == 0)
{
//Nгo tem uma conta..
ShowPlayerDialog(playerid, Registro, DIALOG_STYLE_PASSWORD, "{FF0000}# {FFFFFF}San Andreas: Truck", "{FFFFFF}Digite uma senha segura para que vocк se registre.", "Registrar", "");
}
else
{
//Tem uma conta..
ShowPlayerDialog(playerid, Login, DIALOG_STYLE_PASSWORD, "{FF0000}# {FFFFFF}San Andreas: Truck", "{FFFFFF}Digite a sua senha para logar-se", "Logar", "");
}
db_free_result(Result);
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
SavePlayer(playerid);
return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == Registro)
{
if(!response) Kick(playerid);
new query[300];
format(query, sizeof(query), "INSERT INTO `contas` (`nome`, `senha`, `admin`, `skin`, `px`, `py`, `pz`, `pa`) VALUES ('%s', '%s', '0', '0', '0.0', '0.0', '0.0', '0.0')", DB_Escape(GetName(playerid)), DB_Escape(inputtext));
db_free_result(db_query(Connect, query));
pInfo[playerid][Admin] = 0;
pInfo[playerid][Skin] = 0;
pInfo[playerid][px] = 0.0;
pInfo[playerid][py] = 0.0;
pInfo[playerid][pz] = 0.0;
pInfo[playerid][pa] = 0.0;
new skins_array[] =
{
20,23,26,27,29,32,33,34,37,43,44,45,49,51,52,57,58,59,60,68,72,73,81,96,97,101
};
ShowModelSelectionMenuEx(playerid, skins_array, 26, "Selecione sua skin", SelectSkin, 0.0, 0.0, 0.0);
return 1;
}
if(dialogid == Login)
{
if(!response) Kick(playerid);
new query[118], DBResult:Result;
format(query, sizeof(query), "SELECT * FROM `contas` WHERE `nome` = '%s' AND `senha` = '%s'", DB_Escape(GetName(playerid)), DB_Escape(inputtext));
Result = db_query(Connect, query);
if(db_num_rows(Result) == 0)
{
SendClientMessage(playerid, Vermelho, "* Vocк errou sua senha!");
Kick(playerid);
return 0;
}
else
{
//Acertou a senha
new Field[20];
db_get_field_assoc(Result, "admin", Field, sizeof(Field));
pInfo[playerid][Admin] = strval(Field);
db_get_field_assoc(Result, "skin", Field, sizeof(Field));
pInfo[playerid][Skin] = strval(Field);
db_get_field_assoc(Result, "px", Field, sizeof(Field));
pInfo[playerid][px] = float(strval(Field));
db_get_field_assoc(Result, "py", Field, sizeof(Field));
pInfo[playerid][py] = float(strval(Field));
db_get_field_assoc(Result, "pz", Field, sizeof(Field));
pInfo[playerid][pz] = float(strval(Field));
db_get_field_assoc(Result, "pa", Field, sizeof(Field));
pInfo[playerid][pa] = float(strval(Field));
TogglePlayerSpectating(playerid, false);
LoadPlayer(playerid);
}
db_free_result(Result);
return 1;
}
return 1;
}
public OnPlayerModelSelectionEx(playerid, response, extraid, modelid)
{
if(extraid == SelectSkin)
{
if(!response)
{
pInfo[playerid][Skin] = 4;
TogglePlayerSpectating(playerid, false);
LoadPlayer(playerid);
}
else
{
pInfo[playerid][Skin] = modelid;
TogglePlayerSpectating(playerid, false);
LoadPlayer(playerid);
}
return 1;
}
return 1;
}
/* Funзхes necessбrias */
LoadPlayer(playerid)
{
SpawnPlayer(playerid);
SetPlayerPos(playerid, pInfo[playerid][px], pInfo[playerid][py], pInfo[playerid][pz]);
SetPlayerFacingAngle(playerid, pInfo[playerid][pa]);
SetPlayerSkin(playerid, pInfo[playerid][Skin]);
return 1;
}
SavePlayer(playerid)
{
new query[300], DBResult:Result;
GetPlayerPos(playerid, pInfo[playerid][px], pInfo[playerid][py], pInfo[playerid][pz]);
GetPlayerFacingAngle(playerid, pInfo[playerid][pa]);
format(query, sizeof(query), "UPDATE `contas` SET `admin`='%d', `skin`='%d', `px`='%f', `py`='%f', `pz`='%f', `pa`='%f' WHERE `nome` = '%s'",
pInfo[playerid][Admin],
GetPlayerSkin(playerid),
pInfo[playerid][px],
pInfo[playerid][py],
pInfo[playerid][pz],
pInfo[playerid][pa],
DB_Escape(GetName(playerid)));
Result = db_query(Connect, query);
db_free_result(Result);
return 1;
}
LoadServerConfig()
{
new input[40]; // Cria a variavel com 40 cйlulas necessбrias..
/* Setando as configuraзхes de nome, etc */
format(input, sizeof(input), serverNome); // Seta o hostname do servidor.
SendRconCommand(input);
format(input, sizeof(input), serverPass); // Seta a senha do servidor.
SendRconCommand(input);
format(input, sizeof(input), serverLang); // Seta a linguagem que o servidor terб.
SendRconCommand(input);
format(input, sizeof(input), serverMod); // Seta o mode do servidor.
SetGameModeText(input);
format(input, sizeof(input), serverMap); // Seta o nome do mapa do servidor..
SendRconCommand(input);
format(input, sizeof(input), serverSite); // Seta o nome do mapa do servidor..
SendRconCommand(input);
#undef serverNome
#undef serverPass
#undef serverLang
#undef serverMod
#undef serverMap
#undef serverSite
/* Seta as configuraзхes para como o GTA deverб se portar em relaзгo ao servidor. */
ShowPlayerMarkers(PLAYER_MARKERS_MODE_OFF);
ShowNameTags(1);
AllowAdminTeleport(1);
UsePlayerPedAnims();
DisableInteriorEnterExits();
EnableStuntBonusForAll(true);
LimitGlobalChatRadius(15.0);
EnableTirePopping(1);
//ManualVehicleEngineAndLights();
return 1;
}
GetName(playerid)
{
new
gName[MAX_PLAYER_NAME + 1];
GetPlayerName(playerid, gName, sizeof(gName));
return gName;
}
forward Kicka(p); public Kicka(p)
{
#undef Kick
Kick(p);
#define Kick(%0) SetTimerEx("Kicka", 100, false, "i", %0)
return 1;
}
forward Bana(p); public Bana(p)
{
#undef Ban
Ban(p);
#define Ban(%0) SetTimerEx("Bana", 100, false, "i", %0)
return 1;
}
DB_Escape(text[])
{
new
ret[80 * 2],
ch,
i,
j;
while ((ch = text[i++]) && j < sizeof (ret))
{
if (ch == '\'')
{
if (j < sizeof (ret) - 2)
{
ret[j++] = '\'';
ret[j++] = '\'';
}
}
else if (j < sizeof (ret))
{
ret[j++] = ch;
}
else
{
j++;
}
}
ret[sizeof (ret) - 1] = '\0';
return ret;
// '''
}
- Conclusхes finais
Espero que consiga entender o tutorial, eu criei com muito carinho para vocк! Bons estudos para vocк, se tiver qualquer erro por favor me reporte.
Agradecimentos а:- Wikipйdia
- Wiki-samp
- EditPawn por dar sugestхes do que adicionar.



