14.02.2019, 22:24
(
Последний раз редактировалось JacKPanK; 14.02.2019 в 22:30.
Причина: Acrescentar cуdigo completo.
)
ESTOU COM UM PROBLEMA ENORME COM ISSO PASSEI O DIA TODO TENDO ESSA IDEIA MAS NГO ESTOU CONSEGUINDO POR EM PRБTICA POR FALTA DE CONHECIMENTO EM MySQL, ALGUКM PODE ME AJUDAR?
O COMANDO PARA CRIAR O VEICULO:
TESTEI MAS DEU ERRADO, O CARRO CRIA MAS NГO SALVA NO BANCO.
A DB:
CODIGO COMPLETO:
O COMANDO PARA CRIAR O VEICULO:
PHP код:
CMD:dv(playerid, params[])
{
new Query[90];
new idplayer, idmodelo, cor1, cor2, Float:Pos[4];
if(sscanf(params, "iiii", idplayer, idmodelo, cor1, cor2)) return SendClientMessage(playerid, -1, "USE: /dv [PLAYERID] [IDCARRO] [COR1] [COR2]");
if(idmodelo < 400 || idmodelo > 611) return SendClientMessage(playerid, -1, "USE IDS entre 400 e 611");
GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);
GetPlayerFacingAngle(playerid,Pos[3]);
if(IsPlayerAdmin(playerid))
{
if(Player[idplayer][pCarros] < 5){
mysql_format(ConexaoSQL, Query, sizeof(Query), "INSERT INTO `zero_vehicles` (`vDono`,`vIDveh`,`vCor1`,`vCor2`,`vPosX`,`vPosZ`,`vPosY`,`vPosA`)\
VALUES ('%i', '%i', '%i', '%i', '%f', '%f', '%f', '%f')", Player[idplayer][pID], idmodelo, cor1, cor2, Pos[0], Pos[2], Pos[1], Pos[3]);
mysql_tquery(ConexaoSQL, Query);
pVeiculoSpawn[idplayer][Player[idplayer][pCarros]][vInfo] = CreateVehicle(idmodelo, Pos[0], Pos[1], Pos[2], Pos[3], cor1, cor2, -1);
new veiculoteste[99];
format(veiculoteste, sizeof(veiculoteste), "Veiculo criado ID:%i , COR1: %i, COR 2: %i, Dono ID: %", idmodelo, cor1, cor2, Player[idplayer][pID]);
SendClientMessage(playerid, -1, veiculoteste);
}else{
SendClientMessage(playerid, -1, "O player jб possui o limite mбximo de carros que й de 5.");
}
}else{
SendClientMessage(playerid, -1, "Vocк nгo й um adminitrador.");
}
return 1;
}
A DB:
PHP код:
CREATE TABLE `zero_vehicles` (
`vID` INT(11) NOT NULL AUTO_INCREMENT,
`vDono` INT(11) NULL DEFAULT '1',
`vIDveh` INT(11) NULL DEFAULT NULL,
`vCor1` INT(11) NULL DEFAULT NULL,
`vCor2` INT(11) NULL DEFAULT NULL,
`vPosX` FLOAT NOT NULL DEFAULT '0',
`vPosZ` FLOAT NOT NULL DEFAULT '0',
`vPosY` FLOAT NOT NULL DEFAULT '0',
`vPosA` FLOAT NOT NULL DEFAULT '0',
PRIMARY KEY (`vID`)
)
COMMENT='Veiculos de Jogadores - Zero'
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
;
Код:
#include <a_samp>
#include <a_objects>
#include <a_vehicles>
#include <zcmd>
#include <dini>
#include <a_mysql>
#include <mapandreas>
#include <sscanf2>
#include a_zones
#define HOST "127.0.0.1"
#define USER "root"
#define PASS ""
#define DBSA "zero_db"
#define REGISTER_DIALOG 1001
#define LOGIN_DIALOG 1002
#define RG_DIALOG 1003
#define GPS_DIALOG 1004
enum PlayerInfos{
pID,
pSenha[24],
pDinheiro,
pScore,
pSkin,
Float:pPosX,
Float:pPosY,
Float:pPosZ,
Float:pPosA,
pTentativasLogin,
pTentativasRegistro,
pLogado,
pCarros,
pCar1,
pCar2,
pCar3,
pCar4,
pCar5
}
new Player[MAX_PLAYERS][PlayerInfos];
enum VehicleInfos{
vInfo,
vModelo,
vCor1,
vCor2,
Float:vPosX,
Float:vPosZ,
Float:vPosY,
Float:vPosA
}
new pVeiculoSpawn[MAX_PLAYERS][5][VehicleInfos];
new MySQL:ConexaoSQL;
forward VerificarContaSQL(playerid);
forward InserirDadosSQL(playerid);
forward CarregarContaSQL(playerid);
forward SalvarContaSQL(playerid);
forward KickPlayerinTime(playerid);
forward CarregarID(iddonocar);
forward CarregarVeiculoSQL(playerid,i);
main()
{
print("\n ---------------------------------");
print(" ----- GAMEMODE ZERO GROUNDS -----");
print("---------------------------------\n");
}
public OnGameModeInit()
{
ConexaoSQL = mysql_connect(HOST,USER,PASS,DBSA);
SetGameModeText("Blank Script");
if(mysql_errno(ConexaoSQL) != 0)
{ // Caso o servidor esteja desligado, vocк nгo ter criado o banco de dados ou algum erro, ele nгo se conecta e te avisa.
print("[MySQL] Falha ao tentar estabelecer conexгo com o banco de dados.");
} else {// Caso de tudo certo, ele tambйm te avisa.
print("[MySQL] Sucesso ao conectar com o banco de dados.");
}
return 1;
}
public OnGameModeExit()
{
return 1;
}
public OnPlayerRequestClass(playerid, classid)
{
SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
return 1;
}
public OnPlayerConnect(playerid)
{
new Query[90];
TogglePlayerSpectating(playerid, 1);// Isso daqui й sу pra sumir o botгo de spawn, tem vбrios dele espalhado pelo code.
mysql_format(ConexaoSQL, Query, sizeof(Query), "SELECT `pSenha`, `pID` FROM `zero_players` WHERE `pNome`='%e'", GetPlayerNameEx(playerid));
// Ele seleciona as colunas "pSenha" e "pID" da tabela jogadores AONDE o nome й igual do player.
mysql_tquery(ConexaoSQL, Query, "VerificarContaSQL", "i", playerid);
// Logo depois de selecionar ele aciona a funзгo para Verificar se ele tem conta ou nгo.
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
// Se o player estiver logado E a razгo do disconnect for 0 ou 1 ou 2, salva a conta e zera os dados para nгo entrar em conflito com a conta de outro jogador.
if(Player[playerid][pLogado] == 1 && reason >= 0)
{
SalvarContaSQL(playerid);
ZerarDadosSQL(playerid);
}
new Query[250];
mysql_format(ConexaoSQL, Query, sizeof(Query), "UPDATE `zero_players` SET `pLogado`='%i'",Player[playerid][pLogado]);
mysql_query(ConexaoSQL, Query);
for(new i = 0; i<6; i++){
DestroyVehicle(pVeiculoSpawn[playerid][i][vInfo]);
}
return 1;
}
stock ZerarDadosSQL(playerid)
{
Player[playerid][pID] = 0;
Player[playerid][pSenha] = 0;
Player[playerid][pDinheiro] = 0;
Player[playerid][pScore] = 0;
Player[playerid][pSkin] = 0;
Player[playerid][pLogado] = 0;
Player[playerid][pTentativasLogin] = 0;
Player[playerid][pTentativasRegistro] = 0;
Player[playerid][pPosX] = 0;
Player[playerid][pPosA] = 0;
Player[playerid][pPosY] = 0;
Player[playerid][pPosA] = 0;
}
stock GetPlayerNameEx(playerid)
{
static pname[MAX_PLAYER_NAME];
GetPlayerName(playerid, pname, MAX_PLAYER_NAME);
return pname;
}
CMD:dv(playerid, params[])
{
new Query[90];
new idplayer, idmodelo, cor1, cor2, Float:Pos[4];
if(sscanf(params, "iiii", idplayer, idmodelo, cor1, cor2)) return SendClientMessage(playerid, -1, "USE: /dv [PLAYERID] [IDCARRO] [COR1] [COR2]");
if(idmodelo < 400 || idmodelo > 611) return SendClientMessage(playerid, -1, "USE IDS entre 400 e 611");
GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);
GetPlayerFacingAngle(playerid,Pos[3]);
if(IsPlayerAdmin(playerid))
{
if(Player[idplayer][pCarros] < 5){
mysql_format(ConexaoSQL, Query, sizeof(Query), "INSERT INTO `zero_vehicles` (`vDono`,`vIDveh`,`vCor1`,`vCor2`,`vPosX`,`vPosZ`,`vPosY`,`vPosA`)\
VALUES ('%i', '%i', '%i', '%i', '%f', '%f', '%f', '%f')", Player[idplayer][pID], idmodelo, cor1, cor2, Pos[0], Pos[2], Pos[1], Pos[3]);
mysql_tquery(ConexaoSQL, Query);
pVeiculoSpawn[idplayer][Player[idplayer][pCarros]][vInfo] = CreateVehicle(idmodelo, Pos[0], Pos[1], Pos[2], Pos[3], cor1, cor2, -1);
new veiculoteste[99];
format(veiculoteste, sizeof(veiculoteste), "Veiculo criado ID:%i , COR1: %i, COR 2: %i, Dono ID: %", idmodelo, cor1, cor2, Player[idplayer][pID]);
SendClientMessage(playerid, -1, veiculoteste);
}else{
SendClientMessage(playerid, -1, "O player jб possui o limite mбximo de carros que й de 5.");
}
}else{
SendClientMessage(playerid, -1, "Vocк nгo й um adminitrador.");
}
return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
new Query[125];
switch(dialogid)
{
case REGISTER_DIALOG:
{
if(!response) // Se ele apertar esc ou na segunda opзгo, vai ser kickado
return Kick(playerid);
if(strlen(inputtext) < 4 || strlen(inputtext) > 24) // Se o que ele digitou for menor 4 e maior que 24, a senha nгo sera aceita
{
SendClientMessage(playerid, 0xFF0000AA, "[SERVER] Escolha uma senha entre 4 a 24 caracteres.");
TogglePlayerSpectating(playerid, 1);
ShowPlayerDialog(playerid, REGISTER_DIALOG, DIALOG_STYLE_INPUT, "Registro", "Digite uma senha para se registrar em nosso servidor", "Registrar", "Sair"); // Mostra o dialog para ele tentar de novo.
Player[playerid][pTentativasRegistro]++; // Adiciona +1 ao erro.
} else { // Se a senha for aceitavel, no caso entre 4 a 24 caracteres
TogglePlayerSpectating(playerid, 0); // Tira ele de espectador, agora ele vai entrar no server
mysql_format(ConexaoSQL, Query, sizeof(Query), "INSERT INTO `zero_players`(`pNome`,`pSenha`) VALUES ('%e', '%e')", GetPlayerNameEx(playerid), inputtext);
// Vai inserir na tabela jogares, nas colunas pNome e pSenha os seguintes valores, o nome do player que ele puxou com a stock e o que ele digitou, o inputtext.
mysql_tquery(ConexaoSQL, Query, "InserirDadosSQL", "i", playerid);
// Ele vai executar o comando acima e vai acionar a funзгo de inserir o ID e criar a conta do player
}
if(Player[playerid][pTentativasRegistro] == 3) // Se ele errar mais de 3 vezes vai ser kickado
{
SendClientMessage(playerid, 0xFF0000AA, "[SERVER] Limite de tentativas de registro excedida.");
Player[playerid][pTentativasRegistro] = 0; // Zerar a variбvel pra caso um outro jogador entre, nгo comeзe com 3 na variбvel
SetTimerEx("KickPlayerinTime", 200, false, "i", playerid); // ele й kickado 200 milisegundos apos isso acontecer, tempo suficiente pra ver a mensagem e ser kickado.
}
}
case LOGIN_DIALOG:
{
if(!response) // Se responder a segunda opзгo ou apertar esc, sera kickado
return Kick(playerid);
if(!strcmp(Player[playerid][pSenha], inputtext, true, 24)) // Compara a senha do player com o que ele digitou
{ // caso esteja certo
TogglePlayerSpectating(playerid, 0); // tira ele de espectador
mysql_format(ConexaoSQL, Query, sizeof(Query), "SELECT * FROM zero_players WHERE pNome='%e'", GetPlayerNameEx(playerid)); // Seleciona tudo aonde o nome dele estб
mysql_tquery(ConexaoSQL, Query, "CarregarContaSQL", "i", playerid); // Executa o carregamento de conta
mysql_format(ConexaoSQL, Query, sizeof(Query), "UPDATE `zero_players` SET `pLogado`='%i'",Player[playerid][pLogado]);
mysql_query(ConexaoSQL, Query);
SendClientMessage(playerid, 0x80FF00AA, "[Server] Logado com sucesso."); // E manda uma mensagem falando que ele logou
for(new i = 0; i<6; i++){
DestroyVehicle(pVeiculoSpawn[playerid][i][vInfo]);
}
} else { // Se nгo for igual
TogglePlayerSpectating(playerid, 1);
SendClientMessage(playerid, 0xFF0000AA, "[SERVER] Senha errada, tente novamente."); // Vai avisar
Player[playerid][pTentativasLogin]++; // Contabilizar +1 erro
ShowPlayerDialog(playerid, LOGIN_DIALOG, DIALOG_STYLE_PASSWORD, "Login", "Digite sua senha para entrar em nosso servidor.", "Confirmar", "Sair"); // Mostra a dialog pra ele tentar dnvo
}
if(Player[playerid][pTentativasLogin] == 3) // Caso ele erre 3 vezes
{
SendClientMessage(playerid, 0xFF0000AA, "[SERVER] Limite de tentativas de login excedida."); // Avisa que ele exedeu o limite
Player[playerid][pTentativasLogin] = 0; // Zera a variбvel pra nгo gerar conflito
SetTimerEx("KickPlayerinTime", 200, false, "i", playerid); // E kicka ele depois de 200 milisegundos, dando tempo de ver a mensagem
}
}
}
return 1;
}
public CarregarVeiculoSQL(playerid,i)
{
cache_get_value_int(0, "vIDveh", pVeiculoSpawn[playerid][i][vModelo]);
cache_get_value_int(0, "vCor1", pVeiculoSpawn[playerid][i][vCor1]);
cache_get_value_int(0, "vCor2", pVeiculoSpawn[playerid][i][vCor2]);
cache_get_value_float(0, "vPosX", pVeiculoSpawn[playerid][i][vPosX]);
cache_get_value_float(0, "vPosZ", pVeiculoSpawn[playerid][i][vPosZ]);
cache_get_value_float(0, "vPosY", pVeiculoSpawn[playerid][i][vPosY]);
cache_get_value_float(0, "vPosA", pVeiculoSpawn[playerid][i][vPosA]);
return 1;
}
public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
return 1;
}
public KickPlayerinTime(playerid)
{
return Kick(playerid);
}
public VerificarContaSQL(playerid)
{
if(cache_num_rows() > 0) // Se for > 0 , existe uma linha com o nome do player, entгo ele tem conta.
{
cache_get_value_name(0, "pSenha", Player[playerid][pSenha], 24); // Jб puxa a senha pra comparar se й igual a que ele vai digitar no dialog.
ShowPlayerDialog(playerid, LOGIN_DIALOG, DIALOG_STYLE_PASSWORD, "Login", "Digite sua senha para entrar em nosso servidor.", "Confirmar", "Sair");
// Abre o dialog pra logar
}else{ // Se nгo for > 0 , nгo existe, ele nгo estб registrado.
ShowPlayerDialog(playerid, REGISTER_DIALOG, DIALOG_STYLE_INPUT, "Registro", "Digite uma senha para se registrar em nosso servidor", "Registrar", "Sair");
// Abre o dialog pra se registrar
}
return 1;
}
public InserirDadosSQL(playerid)
{
new Query[90];
Player[playerid][pID] = cache_insert_id(); // Adiciona o id no player
printf("[MYSQL] Jogador %s registrado como ID %d", GetPlayerNameEx(playerid), Player[playerid][pID]); // Apenas um debug, pra saber se deu tudo certo.
mysql_format(ConexaoSQL, Query, sizeof(Query), "SELECT * FROM zero_players WHERE pID='%i'", Player[playerid][pID]); // Seleciona todas as informaзхes desse player AONDE o id dele й o id dele
mysql_query(ConexaoSQL,Query); // Executa o comando acima
CarregarContaSQL(playerid); // Ele carrega a conta.
return 1;
}
public CarregarContaSQL(playerid)
{
Player[playerid][pLogado] = 1; // Seta a variбvel bool, como true, no caso fala como se vocк tivesse logado.
cache_get_value_int(0, "pID", Player[playerid][pID]); // Carrega o id e armazena nessa variбvel "Player[playerid][pID]"
cache_get_value_int(0, "pDinheiro", Player[playerid][pDinheiro]); // A mesma coisa nesse e nas outras sу que com outra variбvel
cache_get_value_int(0, "pScore", Player[playerid][pScore]);
cache_get_value_int(0, "pSkin", Player[playerid][pSkin]);
cache_get_value_float(0, "pPosX", Player[playerid][pPosX]);
cache_get_value_float(0, "pPosY", Player[playerid][pPosY]);
cache_get_value_float(0, "pPosZ", Player[playerid][pPosZ]);
cache_get_value_float(0, "pPosA", Player[playerid][pPosA]);
cache_get_value_int(0, "pCarros", Player[playerid][pCarros]);
cache_get_value_int(0, "pCar1", Player[playerid][pCar1]);
cache_get_value_int(0, "pCar2", Player[playerid][pCar2]);
cache_get_value_int(0, "pCar3", Player[playerid][pCar3]);
cache_get_value_int(0, "pCar4", Player[playerid][pCar4]);
cache_get_value_int(0, "pCar5", Player[playerid][pCar5]);
// Ele aplica as informaзхes igame
SetPlayerScore(playerid, Player[playerid][pScore]); // seta o score com a variavel do score
GivePlayerMoney(playerid, Player[playerid][pDinheiro]); // seta o dinheiro com a variavel do dinheiro
// Etc....
SetSpawnInfo(playerid, 0, Player[playerid][pSkin], Player[playerid][pPosX], Player[playerid][pPosY], Player[playerid][pPosZ], Player[playerid][pPosA], 0, 0, 0, 0 ,0, 0);
SpawnPlayer(playerid); //Spawna o player
SetPlayerSkin(playerid, Player[playerid][pSkin]);
// Seta a skin dele, porquк as vezes pode bugar no SetSpawnInfo e aparecer a skin do CJ
return 1;
}
public SalvarContaSQL(playerid)
{
if(Player[playerid][pLogado] == 0) // Se ele nгo estiver logado, para ali mesmo
return 0;
new Query[250];
// Usa as variбveis pra pegar os valores in game
Player[playerid][pDinheiro] = GetPlayerMoney(playerid);
Player[playerid][pScore] = GetPlayerScore(playerid);
Player[playerid][pSkin] = GetPlayerSkin(playerid);
GetPlayerPos(playerid, Player[playerid][pPosX], Player[playerid][pPosY], Player[playerid][pPosZ]);
GetPlayerFacingAngle(playerid, Player[playerid][pPosA]);
// Atualiza a tabela jogadores na fila do jogador SETANDO aquelas colunas como %i - interior, nъmero e %f float , nъmero com virgula AONDE estб o ID do jogador
mysql_format(ConexaoSQL, Query, sizeof(Query), "UPDATE `zero_players` SET \
`pDinheiro`='%i', \
`pScore`='%i', \
`pSkin`='%i', \
`pPosX`='%f', \
`pPosY`='%f', \
`pPosZ`='%f', \
`pPosA`='%f' WHERE `pID`='%i'", Player[playerid][pDinheiro],
Player[playerid][pScore],
Player[playerid][pSkin],
Player[playerid][pPosX],
Player[playerid][pPosY],
Player[playerid][pPosZ],
Player[playerid][pPosA],
Player[playerid][pID]);
mysql_query(ConexaoSQL, Query); // Executa o comando
printf("[MYSQL] Dados do Jogador %s ID %d salvo com sucesso", GetPlayerNameEx(playerid), Player[playerid][pID]); // Apenas um debug
return 1;
}




