12.12.2013, 21:07
pawn Code:
#include <a_samp>
#include <a_mysql>
#include <zcmd>
#include <sscanf2>
#include <foreach>
#include <streamer>
native WP_Hash(buffer[], len, const str[]);
//MySQL connection handle
new gHandle;
//player data
enum E_PLAYERS
{
ID,
Name[MAX_PLAYER_NAME],
Password[129],
Money,
Score,
bool:IsLoggedIn,
bool:IsRegistered,
LoginAttempts,
LoginTimer
};
new Player[MAX_PLAYERS][E_PLAYERS];
//dialog data
enum {
DIALOG_UNUSED,
DIALOG_LOGIN,
DIALOG_REGISTER,
};
public OnGameModeInit()
{
mySQL_init();
return 1;
}
public OnGameModeExit()
{
mysql_close(gHandle);
return 1;
}
stock mySQL_init()
{
mysql_debug(1);
gHandle = mysql_connect(SQL_HOST, SQL_USER, SQL_DB, SQL_PASS);
/* Table Structure - kind of messy, I know. */
mysql_function_query(gHandle, "CREATE TABLE IF NOT EXISTS `players` ( \
`id` int(11) NOT NULL AUTO_INCREMENT, \
`username` varchar(24) NOT NULL, \
`password` varchar(129) NOT NULL, \
`money` int(11) NOT NULL, \
`skin` int(11) NOT NULL, \
PRIMARY KEY (`id`) \
)", false, "SendQuery", "");
return 1;
}
forward SendQuery();
public SendQuery()
{
return 1;
}
public OnPlayerConnect(playerid)
{
SetTimerEx("SafeOnPlayerConnect", 250, 0, "d", playerid);
return 1;
}
forward SafeOnPlayerConnect(playerid);
public SafeOnPlayerConnect(playerid)
{
Player[playerid][IsLoggedIn] = true;
CheckAccount(playerid);
return 1;
}
public OnPlayerDisconnect(playerid,reason)
{
SaveAccount(playerid);
return 1;
}
stock CheckAccount(playerid)
{
new query[82];
format(query, sizeof(query), "SELECT id, password FROM `players` WHERE `username` = '%s' LIMIT 1", GetName(playerid));
mysql_function_query(gHandle, query, true, "OnAccountCheck", "d", playerid);
return 1;
}
forward OnAccountCheck(playerid);
public OnAccountCheck(playerid)
{
if(playerid != INVALID_PLAYER_ID)
{
new rows, fields, string[128];
cache_get_data(rows, fields, gHandle);
if(rows)
{
Player[playerid][ID] = cache_get_row_int(0, 0, gHandle);
cache_get_row(0, 2, Player[playerid][Password], gHandle, 129);
format(string, sizeof(string), CHAT_WHITE "This account (" CHAT_YELLOW "%s" CHAT_WHITE ") is registered. Please login by entering your password in the field below:", GetName(playerid));
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login", string, "Login", "Abort");
Player[playerid][IsRegistered] = true;
}
else
{
format(string, sizeof(string), CHAT_WHITE "Welcome " CHAT_YELLOW "%s" CHAT_WHITE ", you can register by entering your password in the field below:", GetName(playerid));
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registration", string, "Register", "Abort");
Player[playerid][IsRegistered] = false;
}
}
return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case DIALOG_LOGIN:
{
if(!response)
return Kick(playerid);
new hashed_pass[129];
WP_Hash(hashed_pass, sizeof(hashed_pass), inputtext);
if(strcmp(hashed_pass, Player[playerid][Password]) == 0)
{
Player[playerid][IsLoggedIn] = true;
LoadAccount(playerid);
}
else
{
Player[playerid][LoginAttempts]++;
if(Player[playerid][LoginAttempts] >= 3)
{
ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_MSGBOX, "Login", "You have mistyped your password too often (3 times).", "Okay", "");
DelayedKick(playerid);
}
else
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login", "Wrong password!\nPlease enter your password in the field below:", "Login", "Abort");
}
}
case DIALOG_REGISTER:
{
if(!response) return Kick(playerid);
if(strlen(inputtext) <= 3)
return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registration",
"Your password must be longer than 3 characters!\nPlease enter your password in the field below:",
"Register", "Abort");
new Hashpass[129];
WP_Hash(Hashpass, sizeof(Hashpass), inputtext);
CreateAccount(playerid, Hashpass);
}
default: return 0;
}
return 1;
}
stock LoadAccount(playerid)
{
new query[128];
format(query, sizeof(query), "SELECT * FROM `players` WHERE `id` = %d", Player[playerid][ID]);
mysql_function_query(gHandle, query, true, "OnAccountLoad", "d", playerid);
}
forward OnAccountLoad(playerid);
public OnAccountLoad(playerid)
{
new temp[40];
format(temp, sizeof(temp), "SERVER: Welcome %s", GetName(playerid));
SendClientMessage(playerid, -1, temp);
Player[playerid][Money] = cache_get_row_int(0, 3, gHandle),
Player[playerid][Score] = cache_get_row_int(0, 4, gHandle);
return 1;
}
stock CreateAccount(playerid, pass[129])
{
new query[240];
format(query, sizeof(query), "INSERT INTO `players` (username, password) VALUES (\'%s\', \'%s\')",
GetName(playerid),
pass
);
mysql_function_query(gHandle, query, false, "OnAccountCreate", "d", playerid);
}
forward OnAccountCreate(playerid);
public OnAccountCreate(playerid)
{
Player[playerid][ID] = mysql_insert_id();
return 1;
}
stock SaveAccount(playerid)
{
new query[300];
new money, score;
money = GetPlayerMoney(playerid);
score = GetPlayerScore(playerid);
format(query, sizeof(query), "UPDATE `players` SET money = %d, score = %d WHERE `id` = %d",
money,
score,
Player[playerid][ID]
);
mysql_function_query(gHandle, query, false, "SendQuery", "");
return 1;
}