Deci.
Aici este structura tabelului:
Structura de tabel pentru tabelul `accounts`
--
DROP TABLE IF EXISTS `accounts`;
CREATE TABLE IF NOT EXISTS `accounts` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Name` varchar(24) NOT NULL,
`Password` varchar(129) NOT NULL,
`IP` varchar(16) NOT NULL,
`Skin` int(11) NOT NULL,
`Admin` int(10) NOT NULL,
`Helper` int(11) NOT NULL,
`Premium` int(10) NOT NULL,
`Money` int(10) NOT NULL,
`BankMoney` int(11) NOT NULL,
`Group` int(11) NOT NULL,
`Rank` int(11) NOT NULL,
`Leader` int(11) NOT NULL,
`PosX` float NOT NULL,
`PosY` float NOT NULL,
`PosZ` float NOT NULL,
`PosA` float NOT NULL,
`Job` int(11) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Bun.
Acum sa va arat tot ce este legat de MySQL in gamemode.
#define MYSQL_HOST "localhost"
#define MYSQL_USER "-----"
#define MYSQL_DATABASE "-----"
#define MYSQL_PASSWORD "-----"
#define SPAWN_X 1128.8790
#define SPAWN_Y -1489.7399
#define SPAWN_Z -1489.7399
#define SPAWN_A 267.2968
SPAWN_X, SPAWN_Y, SPAWN_Z si SPAWN_A sunt pozitiile la care playerul este spawnat prima data.
Mai departe:
enum PlayerData
{
ID,
Name[MAX_PLAYER_NAME],
Password[129],
IP[16],
Skin,
Admin,
Helper,
Premium,
Money,
BankMoney,
Group,
Rank,
Leader,
Float:posX,
Float:posY,
Float:posZ,
Float:posA,
Job,
Muted,
MutedT,
PhoneNumber,
PhoneCredit,
PhoneBook
};
Acesta este enum-ul meu. Nu am inca toate cele necesare in el, sunt inca la inceput.
forward OnAccountLoad(playerid);
forward OnAccountRegister(playerid);
forward OnAccountCheck(playerid);
public OnAccountLoad(playerid)
{
PlayerInfo[playerid][Admin] = cache_get_field_content_int(0, "Admin");
PlayerInfo[playerid][Helper] = cache_get_field_content_int(0, "Helper");
PlayerInfo[playerid][Premium] = cache_get_field_content_int(0, "Premium");
PlayerInfo[playerid][Money] = cache_get_field_content_int(0, "Money");
PlayerInfo[playerid][BankMoney] = cache_get_field_content_int(0, "BankMoney");
PlayerInfo[playerid][Skin] = cache_get_field_content_int(0, "Skin");
PlayerInfo[playerid][posX] = cache_get_field_content_float(0, "PosX");
PlayerInfo[playerid][posY] = cache_get_field_content_float(0, "PosY");
PlayerInfo[playerid][posZ] = cache_get_field_content_float(0, "PosZ");
PlayerInfo[playerid][posA] = cache_get_field_content_float(0, "PosA");
PlayerInfo[playerid][Job] = cache_get_field_content_int(0, "Job");
PlayerInfo[playerid][Group] = cache_get_field_content_int(0, "Group");
PlayerInfo[playerid][Rank] = cache_get_field_content_int(0, "Rank");
PlayerInfo[playerid][Leader] = cache_get_field_content_int(0, "Leader");
PlayerInfo[playerid][PhoneNumber] = cache_get_field_content_int(0, "Phone Number");
TogglePlayerSpectating(playerid, false);
GivePlayerMoney(playerid, PlayerInfo[playerid][Money]);
SetSpawnInfo(playerid, 0, 23, PlayerInfo[playerid][posX], PlayerInfo[playerid][posY], PlayerInfo[playerid][posZ], PlayerInfo[playerid][posA], 0, 0, 0, 0, 0, 0);
SpawnPlayer(playerid);
gLogged[playerid] = 1;
SendClientMessage(playerid, -1, "You have successfully logged in.");
return true;
}
public OnAccountRegister(playerid)
{
PlayerInfo[playerid][ID] = cache_insert_id();
printf("[Registration] New account registered. Database ID: [%d]", PlayerInfo[playerid][ID]);
TogglePlayerSpectating(playerid, false);
SetSpawnInfo(playerid, 0, 23, SPAWN_X, SPAWN_Y, SPAWN_Z, SPAWN_A, 0, 0, 0, 0, 0, 0);
SpawnPlayer(playerid);
gLogged[playerid] = 1;
return true;
}
public OnAccountCheck(playerid)
{
new rows, fields;
cache_get_data(rows, fields, mysql);
if(rows)
{
cache_get_field_content(0, "Password", PlayerInfo[playerid][Password], mysql, 129);
PlayerInfo[playerid][ID] = cache_get_field_content_int(0, "ID");
ShowPlayerDialog(playerid, LoginDialog, DIALOG_STYLE_INPUT, "Login", "Welcome player!\nYour account has been found in our database. \nPlease fill in your password:", "Login", "Quit");
}
else
{
ShowPlayerDialog(playerid, RegisterDialog, DIALOG_STYLE_INPUT, "Register", "Welcome player!\nYour account has not been registered yet. \nPlease fill in your desired password:", "Register", "Quit");
}
return true;
}
Sub OnGamemodeInit() am urmatoarele:
mysql_log(LOG_ALL);
mysql = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DATABASE, MYSQL_PASSWORD);
if(mysql_errno() != 0)
{
printf("[MySQL] The connection has failed.");
}
else
{
printf("[MySQL] The connection was successful.");
}
Si imi arata de fiecare data in consola: "[MySQL] The connection was successful.", deci se conecteaza.
Mai departe:
Sub OnPlayerConnect am:
new query[128], playername[MAX_PLAYER_NAME];
GetPlayerName(playerid, playername, sizeof(playername));
mysql_format(mysql, query, sizeof(query), "SELECT `Password`, `ID` FROM `accounts` WHERE `Name` = '%e' LIMIT 1", playername);
mysql_tquery(mysql, query, "OnAccountCheck", "i", playerid);
Apoi am asta, in mai multe locuri, ca sa pot salva datele mai des:
new query[128], Float:pos[4];
GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
GetPlayerFacingAngle(playerid, pos[3]);
mysql_format(mysql, query, sizeof(query), "UPDATE `accounts` SET `Group` = %d,`Rank` = %d, `Leader` = %d `Job` = %d, `Skin` = %d, `Money` = %d, `PosX` = %f, `PosY` = %f, `PosZ` = %f, `PosA` = %f, `BankMoney` = %d WHERE `ID` = %d",
PlayerInfo[playerid][Group], PlayerInfo[playerid][Rank], PlayerInfo[playerid][Leader], PlayerInfo[playerid][Job], GetPlayerMoney(playerid), pos[0], pos[1], pos[2], pos[3], PlayerInfo[playerid][ID], PlayerInfo[playerid][BankMoney]);
mysql_tquery(mysql, query, "", "");
Si am ajuns la OnDialogResponse:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case LoginDialog:
{
if(!response) Kick(playerid);
new hashpass[129], query[100], playername[MAX_PLAYER_NAME];
GetPlayerName(playerid, playername, sizeof(playername));
WP_Hash(hashpass, sizeof(hashpass), inputtext);
if(!strcmp(hashpass, PlayerInfo[playerid][Password]))
{
mysql_format(mysql, query, sizeof(query), "SELECT * FROM `accounts` WHERE `Name` = '%e' LIMIT 1", playername);
mysql_tquery(mysql, query, "OnAccountLoad", "i", playerid);
gLogged[playerid] = 1;
}
else
{
SendClientMessage(playerid, -1, "You have specified an incorrect password!");
ShowPlayerDialog(playerid, LoginDialog, DIALOG_STYLE_INPUT, "Login", "Welcome back player!\nYour account has been found in our database. \nPlease fill in your password:", "Login", "Quit");
}
}
case RegisterDialog:
{
if(!response) return Kick(playerid);
if(strlen(inputtext) < 5)
{
SendClientMessage(playerid, -1, "Your password must at least contain more than 4 characters.\nPlease introduct a new one:");
return ShowPlayerDialog(playerid, RegisterDialog, DIALOG_STYLE_INPUT, "Register", "Welcome player!\nYour account has not been registered yet. \nPlease fill in your desired password:", "Register", "Quit");
}
else if(response)
{
new query[512], playername[MAX_PLAYER_NAME], playerip[16];
GetPlayerName(playerid, playername, sizeof(playername));
GetPlayerIp(playerid, playerip, sizeof(playerip));
WP_Hash(PlayerInfo[playerid][Password], 129, inputtext);
mysql_format(mysql, query, sizeof(query), "INSERT INTO `accounts` (`Name`, `Password`, `IP`, `PosX`, `PosY`, `PosZ`, `PosA`) VALUES ('%e', '%e', '%e', 0, 0, 0, %f, %f, %f, %f)", playername, PlayerInfo[playerid][Password], playerip, SPAWN_X, SPAWN_Y, SPAWN_Z, SPAWN_A);
mysql_tquery(mysql, query, "OnAccountRegister", "i", playerid);
gLogged[playerid] = 1;
}
}
Asta e tot. Am unsistem de login/register foarte simplu, vreau sa adaug mai multe lucruri dupa ce o sa invat mai bine mysql, momentan am doar esentialul. Dar pana nu rezolv problema asta nu ma pot apuca de nimic. Asa ca, va rog foarte mult sa ma ajutati.
EDIT: Am uitat sa va spun ceva. Vedeti ca am variabila aia cu gLogged[playerid] la OnAccountRegister. Pai eu am aproape la fiecare comanda if(gLogged[playerid] == 0) return SendClientMessage(...). Comenzile merg, deci in colcuzie, alea se executa.