#include <a_samp> #include <a_mysql> //Without this, we won't be able to use all mysql functions #pragma tabsize 0 #define FILTERSCRIPT #define host "localhost" //This will be your mysql host. Default for xampp is localhost #define user "root" //This will be your mysql username. Default for xampp is root #define db "legend" //This is your database name. Remember we have created a database called server before. #define pass "" //This is your mysql password. In xampp, the password didn't set. So leave it empty. //dialogs #define dregister 6287 //dialog register id #define dlogin 6288 // ^ static mysql, //This variable will be used to manage our database Name[MAX_PLAYERS][24], //We will use this variable to store player's name. IP[MAX_PLAYERS][16] //We will use this variable to store player's ip. ; native WP_Hash(buffer[], len, const str[]); //whirlpool, for hashing our password enum PDATA //We name our enumerator as PDATA (which stands for PlayerDATA). You can name it however you want. { ID, //Will be used later to store player's ID from database so we can use it anywhere later Password[129], //We will load player's password into this varible from database Admin, //We will load player's admin level from database into this variable so we can use it anywhere later. Money, //We will load player's money from database into this variable so we can use it anywhere later. } new pInfo[MAX_PLAYERS][PDATA]; //Variable that stores enumerator above public OnFilterScriptInit() { print("\n--------------------------------------"); print(" Blank Filterscript by your name here"); print("--------------------------------------\n"); return 1; } public OnFilterScriptExit() { return 1; } main() { print("\n----------------------------------"); print(" Blank Gamemode by your name here"); print("----------------------------------\n"); } public OnGameModeInit() { mysql_log(LOG_ERROR | LOG_WARNING | LOG_DEBUG); //Let's enable debugging so we can detect a problem(if there is) mysql = mysql_connect(host, user, db, pass); //This function will connect your server to database. Remember we have defined our host, username, database and password. It's time to use it here. if(mysql_errno(mysql) != 0) print("Could not connect to database!"); //This will tell if your connection to database is successful or not. If it's not, check your host, username, database and password. Make sure they all right. return 1; } public OnGameModeExit() { return 1; } public OnPlayerRequestClass(playerid, classid) { return 1; } public OnPlayerConnect(playerid) { new query[128]; //We use this variable to format our query GetPlayerName(playerid, Name[playerid], 24); //Getting player's name GetPlayerIp(playerid, IP[playerid], 16); //Getting layer's IP mysql_format(mysql, query, sizeof(query),"SELECT `Password`, `ID` FROM `players` WHERE `Username` = '%e' LIMIT 1", Name[playerid]); // - We use mysql_format instead of format because we can use an %e specifier. %e specifier escapes a string so we can avoid sql injection which means we don't have to use mysql_real_escape_string // - Formatting our query; SELECT `Password`, `ID` FROM `players` WHERE `Username`='%e' means we are selecting a Password and ID's column in the table that has player's name in Username column. // - LIMIT 1; we only need 1 result to be shown mysql_tquery(mysql, query, "OnAccountCheck", "i", playerid); //lets execute the formatted query and when the execution is done, a callback OnAccountCheck will be called //You can name the callback however you like return 1; } public OnPlayerDisconnect(playerid, reason) { new query[128] ; //query[128] is for formatting our query and Float ![]() mysql_format(mysql, query, sizeof(query), "UPDATE `players` SET `Admin`=%d, `Money`=%d, WHERE `ID`=%d",\ pInfo[playerid][Admin], pInfo[playerid][Money], pInfo[playerid][ID]); //We update the table(`players`) by getting player's admin level, level, money, mysql_tquery(mysql, query, "", ""); //let's execute the query. return 1; } public OnPlayerSpawn(playerid) { return 1; } public OnPlayerDeath(playerid, killerid, reason) { return 1; } public OnVehicleSpawn(vehicleid) { return 1; } public OnVehicleDeath(vehicleid, killerid) { return 1; } public OnPlayerText(playerid, text[]) { return 1; } public OnPlayerCommandText(playerid, cmdtext[]) { if (strcmp("/mycommand", cmdtext, true, 10) == 0) { // Do something here return 1; } return 0; } public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger) { return 1; } public OnPlayerExitVehicle(playerid, vehicleid) { return 1; } public OnPlayerStateChange(playerid, newstate, oldstate) { return 1; } public OnPlayerEnterCheckpoint(playerid) { return 1; } public OnPlayerLeaveCheckpoint(playerid) { return 1; } public OnPlayerEnterRaceCheckpoint(playerid) { return 1; } public OnPlayerLeaveRaceCheckpoint(playerid) { return 1; } public OnRconCommand(cmd[]) { return 1; } public OnPlayerRequestSpawn(playerid) { return 1; } public OnObjectMoved(objectid) { return 1; } public OnPlayerObjectMoved(playerid, objectid) { return 1; } public OnPlayerPickUpPickup(playerid, pickupid) { return 1; } public OnVehicleMod(playerid, vehicleid, componentid) { return 1; } public OnVehiclePaintjob(playerid, vehicleid, paintjobid) { return 1; } public OnVehicleRespray(playerid, vehicleid, color1, color2) { return 1; } public OnPlayerSelectedMenuRow(playerid, row) { return 1; } public OnPlayerExitedMenu(playerid) { return 1; } public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid) { return 1; } public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) { return 1; } public OnRconLoginAttempt(ip[], password[], success) { return 1; } public OnPlayerUpdate(playerid) { return 1; } public OnPlayerStreamIn(playerid, forplayerid) { return 1; } public OnPlayerStreamOut(playerid, forplayerid) { return 1; } public OnVehicleStreamIn(vehicleid, forplayerid) { return 1; } public OnVehicleStreamOut(vehicleid, forplayerid) { return 1; } public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { switch(dialogid) { case dlogin: //login dialog { if(!response) Kick(playerid); //if they clicked Quit, we will kick them new hpass[129]; //for password hashing new query[100]; // for formatting our query. WP_Hash(hpass, 129, inputtext); //hashing inputtext if(!strcmp(hpass, pInfo[playerid][Password])) //remember we have loaded player's password into this variable, pInfo[playerid][Password] earlier. Now let's use it to compare the hashed password with password that we load { //if the hashed password matches with the loaded password from database mysql_format(mysql, query, sizeof(query), "SELECT * FROM `players` WHERE `Username` = '%e' LIMIT 1", Name[playerid]); //let's format our query //We select all rows in the table that has your name and limit the result to 1 mysql_tquery(mysql, query, "OnAccountLoad", "i", playerid); //lets execute the formatted query and when the execution is done, a callback OnAccountLoad will be called //You can name the callback however you like } else //if the hashed password didn't match with the loaded password(pInfo[playerid][Password]) { //we tell them that they have inserted a wrong password ShowPlayerDialog(playerid, dlogin, DIALOG_STYLE_INPUT, "Login", "In order to play, you need to login\nWrong password!", "Login", "Quit"); } } case dregister: //register dialog { if(!response) return Kick(playerid); //if they clicked Quit, we will kick them if(strlen(inputtext) < 6) return ShowPlayerDialog(playerid, dregister, DIALOG_STYLE_INPUT, "Register", "In order to play, you need to register.\nYour password must be at least 6 characters long!", "Register", "Quit"); //strlen checks a lenght of a string. so if player types their password that is lower than 6, we tell them; Your password must be at least 6 characters long! new query[300]; WP_Hash(pInfo[playerid][Password], 129, inputtext); //hashing inputtext mysql_format(mysql, query, sizeof(query), "INSERT INTO `players` (`Username`, `Password`, `IP`, `Admin`, `Money`) VALUES ('%e', '%s', '%s', 0, 0, 0, 0.0, 0.0, 0.0)", Name[playerid], pInfo[playerid][Password], IP[playerid]); //Now let's create a new row and insert player's information in it mysql_tquery(mysql, query, "OnAccountRegister", "i", playerid); //let's execute the query } } return 1; } public OnPlayerClickPlayer(playerid, clickedplayerid, source) { return 1; } forward OnAccountCheck(playerid); //Now once the query has been processed; public OnAccountCheck(playerid) { new rows, fields; //a variable that will be used to retrieve rows and fields in the database. cache_get_data(rows, fields, mysql);//let's get the rows and fields from the database. if(rows) //if there is row {//then cache_get_field_content(0, "PASS", pInfo[playerid][Password], mysql, 129); //we will load player's password into pInfo[playerid][Password] to be used in logging in pInfo[playerid][ID] = cache_get_field_content_int(0, "ID"); //now let's load player's ID into pInfo[playerid][ID] so we can use it later printf("%s", pInfo[playerid][Password]); //OPTIONAL: Just for debugging. If it didn't show your password, then there must be something wrong while getting player's password ShowPlayerDialog(playerid, dlogin, DIALOG_STYLE_INPUT, "Login", "In order to play, you need to login", "Login", "Quit"); //And since we found a result from the database, which means, there is an account; we will show a login dialog } else //if we didn't find any rows from the database, that means, no accounts were found { ShowPlayerDialog(playerid, dregister, DIALOG_STYLE_INPUT, "Register", "In order to play, you need to register.", "Register", "Quit"); //So we show them a dialog register } return 1; } forward OnAccountLoad(playerid); forward OnAccountRegister(playerid); //let's load player's information public OnAccountLoad(playerid) { pInfo[playerid][Admin] = cache_get_field_content_int(0, "Admin"); //we're getting a field 4 from row 0. And since it's an integer, we use cache_get_row_int pInfo[playerid][Money] = cache_get_field_content_int(0, "Money");//Above GivePlayerMoney(playerid, pInfo[playerid][Money]);//Let's set their money //For player's position, set it once they spawn(OnPlayerSpawn) SendClientMessage(playerid, -1, "Successfully logged in"); //tell them that they have successfully logged in return 1; } public OnAccountRegister(playerid) { pInfo[playerid][ID] = cache_insert_id(); //loads the ID of the player in the variable once they registered. printf("New account registered. ID: %d", pInfo[playerid][ID]); //just for debugging. return 1; } |