13.02.2018, 18:12
Hello, i have recently converted my gamemode to MYSQL and i got no warnings/errors, but i have a big problem that accounts are not saving.. I will post every code i have here so you can maybe help me.
Sorry for the huge spam but i really need this fixed, i am tired of working on easy-mysql i don't even know the functions of that, i want to start using MYSQL.
BTW: When i log-in the register dialog shows, i type my password there and nothing happens, OnPlayerRegister doesn't get called.
PHP код:
public OnGameModeInit()
{
mysql_log(ERROR | WARNING);
new MySQLOpt: option_id = mysql_init_options();
mysql_set_option(option_id, AUTO_RECONNECT, true);
Database = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DATABASE, option_id);
if(Database == MYSQL_INVALID_HANDLE || mysql_errno(Database) != 0)
{
print("SERVER: Untitled Deathmatch couldn't connect to the MySQL server, closing.");
SendRconCommand("exit");
return 1;
}
print("SERVER: Untitled Deathmatch has connected to the MySQL database.");
PHP код:
public OnGameModeExit()
{
foreach(new i: Player)
{
if(IsPlayerConnected(i))
{
OnPlayerDisconnect(i, 1);
}
}
mysql_close(Database);
PHP код:
public OnPlayerConnect(playerid)
{
new DB_Query[115];
GetPlayerName(playerid, PlayerInfo[playerid][pName], MAX_PLAYER_NAME);
Corrupt_Check[playerid]++;
mysql_format(Database, DB_Query, sizeof(DB_Query), "SELECT * FROM `PLAYERS` WHERE `USERNAME` = '%e' LIMIT 1", PlayerInfo[playerid][pName]);
mysql_tquery(Database, DB_Query, "OnPlayerDataCheck", "ii", playerid, Corrupt_Check[playerid]);
PHP код:
public OnPlayerDisconnect(playerid, reason)
{
Corrupt_Check[playerid]++;
new DB_Query[256];
mysql_format(Database, DB_Query, sizeof(DB_Query), "UPDATE `PLAYERS` SET `SCORE` = %d, `CASH` = %d, `KILLS` = %d, `DEATHS` = %d, `BAN` = %d, `ADMIN` = %d, `WARNINGS` = %d, `VIP` = %d, `TOKENS` = %d, `CHAT` = %d, `SKIN` = %d, `NAMECHANGES` = %d, `MODE` = %d, WHERE `ID` = %d LIMIT 1",
PlayerInfo[playerid][pScore], PlayerInfo[playerid][pCash], PlayerInfo[playerid][pKills], PlayerInfo[playerid][pDeaths], PlayerInfo[playerid][pBan], PlayerInfo[playerid][pAdmin], PlayerInfo[playerid][pWarnings], PlayerInfo[playerid][pVIP], PlayerInfo[playerid][pToken], PlayerInfo[playerid][pChat], PlayerInfo[playerid][pSkin], PlayerInfo[playerid][pNamechanges], PlayerInfo[playerid][pMODE], PlayerInfo[playerid][pID]);
mysql_tquery(Database, DB_Query);
if(cache_is_valid(PlayerInfo[playerid][Player_Cache]))
{
cache_delete(PlayerInfo[playerid][Player_Cache]);
PlayerInfo[playerid][Player_Cache] = MYSQL_INVALID_CACHE;
}
PlayerInfo[playerid][LoggedIn] = false;
print("OnPlayerDisconnect has been called.");
PHP код:
OnDialogResponse
{
switch (dialogid)
{
case DIALOG_LOGIN:
{
if(!response) return Kick(playerid);
new Salted_Key[65];
SHA256_PassHash(inputtext, PlayerInfo[playerid][Salt], Salted_Key, 65);
if(strcmp(Salted_Key, PlayerInfo[playerid][pPassword]) == 0)
{
cache_set_active(PlayerInfo[playerid][Player_Cache]);
cache_get_value_int(0, "ID", PlayerInfo[playerid][pID]);
cache_get_value_int(0, "KILLS", PlayerInfo[playerid][pKills]);
cache_get_value_int(0, "DEATHS", PlayerInfo[playerid][pDeaths]);
cache_get_value_int(0, "SCORE", PlayerInfo[playerid][pScore]);
cache_get_value_int(0, "CASH", PlayerInfo[playerid][pCash]);
cache_get_value_int(0, "BAN", PlayerInfo[playerid][pBan]);
cache_get_value_int(0, "IP", PlayerInfo[playerid][pIP]);
SetPlayerScore(playerid, PlayerInfo[playerid][pScore]);
ResetPlayerMoney(playerid);
GivePlayerMoney(playerid, PlayerInfo[playerid][pCash]);
cache_delete(PlayerInfo[playerid][Player_Cache]);
PlayerInfo[playerid][Player_Cache] = MYSQL_INVALID_CACHE;
PlayerInfo[playerid][LoggedIn] = true;
PlayerInfo[playerid][pMODE] = NO_MODE;
SetSpawnInfo(playerid, 0, PlayerInfo[playerid][pSkin], 1729.2920, -1669.4794, 22.6151 ,42.4700, -1, -1, -1, -1, -1, -1);
SetPlayerInterior(playerid, 0);
SetPlayerVirtualWorld(playerid, 400);
SpawnPlayer(playerid);
SendClientMessageEx(playerid, -1, "SERVER: Welcome back %s", GetPlayerNameEx(playerid));
}
else
{
new String[150];
PlayerInfo[playerid][PasswordFails] += 1;
printf("%s has failed to log-in. (%d)", PlayerInfo[playerid][pName], PlayerInfo[playerid][PasswordFails]);
if (PlayerInfo[playerid][PasswordFails] >= 3)
{
format(String, sizeof(String), "SERVER: %s has been kicked, reason: (%d/3) login fails.", PlayerInfo[playerid][pName], PlayerInfo[playerid][PasswordFails]);
SendClientMessageToAll(COLOR_LIGHTRED, String);
Kick(playerid);
}
else
{
format(String, sizeof(String), "Wrong password, you have %d out of 3 tries.", PlayerInfo[playerid][PasswordFails]);
SendClientMessage(playerid, COLOR_LIGHTRED, String);
format(String, sizeof(String), "{FFFFFF}Welcome back, {00CED1}%s. {FFFFFF}Please type your password below to login into the server.", PlayerInfo[playerid][pName]);
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login", String, "Login", "Leave");
}
}
}
case DIALOG_REGISTER:
{
if(!response) return Kick(playerid);
if(strlen(inputtext) <= 5 || strlen(inputtext) > 60)
{
SendClientMessage(playerid, COLOR_LIGHTRED, "Invalid password length, should be 5 - 60.");
new String[150];
format(String, sizeof(String), "{FFFFFF}Welcome to Untitled Deathmatch, {00CED1}%s. {FFFFFF}Please input a password below to register.", PlayerInfo[playerid][pName]);
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Register", String, "Register", "Leave");
}
else
{
for (new i = 0; i < 10; i++)
{
PlayerInfo[playerid][Salt][i] = random(79) + 47;
}
PlayerInfo[playerid][Salt][10] = 0;
SHA256_PassHash(inputtext, PlayerInfo[playerid][Salt], PlayerInfo[playerid][pPassword], 65);
new DB_Query[225];
mysql_format(Database, DB_Query, sizeof(DB_Query), "INSERT INTO `PLAYERS` (`USERNAME`, `PASSWORD`, `SALT`, `SCORE`, `KILLS`, `CASH`, `DEATHS`, `BAN`, `IP`, `ADMIN`, `WARNINGS`, `VIP`, `TOKENS`, `CHAT`, `SKIN`, `NAMECHANGES`, `MODE`)\
VALUES ('%e', '%s', '%e', '20', '0', '0', '0')", PlayerInfo[playerid][pName], PlayerInfo[playerid][pPassword], PlayerInfo[playerid][Salt]);
mysql_tquery(Database, DB_Query, "OnPlayerRegister", "d", playerid);
}
PHP код:
forward public OnPlayerDataCheck(playerid, corrupt_check);
public OnPlayerDataCheck(playerid, corrupt_check)
{
if (corrupt_check != Corrupt_Check[playerid]) return Kick(playerid);
new String[150];
if(cache_num_rows() > 0)
{
cache_get_value(0, "PASSWORD", PlayerInfo[playerid][pPassword], 65);
cache_get_value(0, "SALT", PlayerInfo[playerid][Salt], 11);
PlayerInfo[playerid][Player_Cache] = cache_save();
format(String, sizeof(String), "{FFFFFF}Welcome back, {00CED1}%s. {FFFFFF}Please type your password below to login into the server.", PlayerInfo[playerid][pName]);
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login", String, "Login", "Leave");
}
else
{
format(String, sizeof(String), "{FFFFFF}Welcome to Untitled Deathmatch, {00CED1}%s. {FFFFFF}Please input a password below to register.", PlayerInfo[playerid][pName]);
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Register", String, "Register", "Leave");
}
return 1;
}
forward public OnPlayerRegister(playerid);
public OnPlayerRegister(playerid)
{
TogglePlayerControllable(playerid, false);
SendClientMessage(playerid, COLOR_WHITE, "Welcome to Untitled Deathmatch.");
SetSpawnInfo(playerid, 0, PlayerInfo[playerid][pSkin], 1729.2920, -1669.4794, 22.6151 ,42.4700, -1, -1, -1, -1, -1, -1);
SetPlayerInterior(playerid, 0);
SetPlayerVirtualWorld(playerid, 400);
SpawnPlayer(playerid);
PlayerInfo[playerid][LoggedIn] = true;
return 1;
}
BTW: When i log-in the register dialog shows, i type my password there and nothing happens, OnPlayerRegister doesn't get called.