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; }