Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // SA-MP Roleplay Server by Furzer
- #include <a_samp>
- #include <a_mysql>
- #include <zcmd>
- #include <sscanf2>
- #include <data>
- #define mysql_host "localhost" //your destination server
- #define mysql_user "root" //default user name of wampserver
- #define mysql_password "" //wampserver has no default password unless you have set one.
- #define mysql_database "rp"//the name of your database
- new MySQL:mysql;
- new field[128];
- #define mysql_fetch_float(%0,%1) mysql_fetch_field(%0,field); \
- %1=floatstr(field)
- #define mysql_fetch_string(%0,%1) mysql_fetch_field(%0,%1)
- #define mysql_fetch_int(%0,%1) mysql_fetch_field(%0,field); \
- %1=strval(field)
- main()
- {
- print("\n----------------------------------");
- print(" Blank Gamemode by your name here");
- print("----------------------------------\n");
- }
- enum PlayerInfo
- {
- ID, // id of the player
- Name[24], // name of the player
- pAdmin, // admin level of the player
- pMoney, //money of the player
- pKills, // Kills of the player
- pDeaths, // deaths of the player
- pLevel, // score of the player
- IP[16], // Storing the ip of the player
- Logged, // Players logged in or not variable
- IsRegistered //checks if the player is registered or not.
- };
- new pInfo[MAX_PLAYERS][PlayerInfo];
- stock MySQL_Register(playerid, passwordstring[])
- {
- new Query[300];
- mysql_real_escape_string();(pInfo[playerid][Name], pInfo[playerid][Name]);
- // escaping the name of the player to avoid sql_injections.
- mysql_real_escape_string();(pInfo[playerid][IP], pInfo[playerid][IP]);
- // escaping the IP of the player to avoid sql_injections.
- // as you might've seen we haven't escaped the password here because it was already escaped in our register dialog
- format(Query, sizeof(Query), "INSERT INTO `playerdata` (`name`, `password`, `ip`) VALUES('%s', '%d', '%s')", pInfo[playerid][Name], udb_hash(passwordstring), pInfo[playerid][IP]); // Here we use the INSERT option and insert the name, password, and ip of the player in the database.
- // we don't insert the score, admin, or any other variable because its automatically 0.
- mysql_query(Query);
- // here we do not need to mysql_store_result or mysql_free_result
- // because we are only inserting data in the database not selecting it
- //next we set the players logged variable to 1.
- //and the isregistered variable to 1 aswell.
- SendClientMessage(playerid, -1, "You have now been successfully registered on this server!");
- pInfo[playerid][Logged] = 1; //Sets the login variable to 1, meaning logged in.
- pInfo[playerid][IsRegistered] = 1; // sets the registered variable to 1. meaning registered.
- return 1;
- }
- stock MySQL_Login(playerid)
- {
- new Query[500];
- mysql_real_escape_string()(pInfo[playerid][Name], pInfo[playerid][Name]); // escaping the name of the player to avoid sql_injections.
- format(Query, sizeof(Query), "SELECT * FROM `playerdata` WHERE `name` COLLATE latin1_general_cs = '%s' LIMIT 1", pInfo[playerid][Name]);
- mysql_query(Query);
- // here we select all of the user's data in the database and store it
- while(mysql_fetch_field(Query))
- // here after the server has selected the user
- //from the database and stored its data we extract that data onto our enums.
- {
- mysql_fetch_int("id", pInfo[playerid][ID]);
- // the special identifier of a user called "id"
- mysql_fetch_int("admin", pInfo[playerid][pAdmin]);
- // the admin level of the player
- mysql_fetch_int("score", pInfo[playerid][pLevel]); SetPlayerScore(playerid, pInfo[playerid][pLevel]);
- // here we fetch the score and save it to the enum and also save it to the server by using setplayerscore
- mysql_fetch_int("money", pInfo[playerid][pMoney]); GivePlayerMoney(playerid, pInfo[playerid][pMoney]);
- // here we fetch the score and save it to the enum and also save it to the server by using setplayerscore
- mysql_fetch_int("kills", pInfo[playerid][pKills]);
- // the amount of kills a player has
- mysql_fetch_int("deaths", pInfo[playerid][pDeaths]);
- // the amount of deaths a player has
- //
- // the way to fetch a users stats from the database is:
- //mysql_fetch_int("table_name", variable_to_store_in); remember the "table_name" is case sensitive!
- }
- // here we free our result and end the SELECT process. Remember this is very important otherwise you may receive high amount of lag in your server!
- pInfo[playerid][Logged] = 1; // sets the logged variable to 1 meaning logged in.
- return 1;
- }
- public OnGameModeInit()
- {
- mysql = mysql_init(LOG_ALL); // Tells sql to log all mysql features used in the script
- new Connection = mysql_connect(mysql_host, mysql_user, mysql_password, mysql_database, mysql); // connects with the mysql database
- if(Connection) //checks if the database is successfully connected
- {
- new dest[200];
- mysql_stat(dest); // display the mysql database statistics.
- printf(dest);
- printf(">> MySQL connection successfully initialized"); // if it is connected it will display this line, if not then it wont display anything.
- }
- 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[500];
- GetPlayerName(playerid, pInfo[playerid][Name], 24); //gets the player's name and stores it to to your enum pInfo[playerid][Name]
- GetPlayerIp(playerid, pInfo[playerid][IP], 16); //Gets the IP of the player and stores it to pInfo[playerid][IP]
- mysql_real_escape_string();(pInfo[playerid][Name], pInfo[playerid][Name]); // now we have to escape the name inorder to escape any mysql injections. ([url]http://en.wikipedia.org/wiki/SQL_injection[/url])
- format(Query, 500, "SELECT `name` FROM `playerdata` WHERE `name` COLLATE latin1_general_cs = '%s' LIMIT 1", pInfo[playerid][Name]); // here we are selecting the name of the player who logged in from the database.
- mysql_query(Query); // we query the statement above
- if(cache_num_rows() > 0) // if the database has more then one table with the given name
- {//then
- ShowPlayerDialog(playerid, 1, DIALOG_STYLE_PASSWORD, "Login", "This account is registered! Please log in:", "Login", ""); // show the login dialog and tell the player to login.
- }
- else // else if the database found no tables with the given name
- { // then
- ShowPlayerDialog(playerid, 2, DIALOG_STYLE_PASSWORD, "Register", "This account not registered yet! Please register:", "Register", "");// show the register dialog and tell the player to register
- }
- //You must always free the mysql result to avoid
- //there being massive memory usage.
- return 1;
- }
- SavePlayer(playerid)
- {
- if(pInfo[playerid][Logged] == 1)
- // checks if the player is logged
- {
- new Query[500];
- format(Query, 500, "UPDATE `playerdata` SET `admin` = '%d', `score` = '%d', `money` = '%d', `kills` = '%d', `deaths` = '%d' WHERE `id` = '%d' LIMIT 1",
- pInfo[playerid][pAdmin],
- pInfo[playerid][pLevel],
- pInfo[playerid][pMoney],
- pInfo[playerid][pKills],
- pInfo[playerid][pDeaths],
- pInfo[playerid][ID]);
- mysql_query(Query);
- //this basically gets the variables and stores it to the players special identifier called "ID".
- }
- }
- public OnPlayerDisconnect(playerid, reason)
- {
- SavePlayer(playerid);
- 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[])
- {
- if(dialogid == 2) //If Dialog is our register dialog
- {
- if(response) //If they click the button register
- {
- if(!strlen(inputtext) || strlen(inputtext) > 68) //checks if password is more then 68 characters or nothing.
- {
- SendClientMessage(playerid, 0xFF0000, "You must insert a password between 1-68 characters!");
- ShowPlayerDialog(playerid, 2, DIALOG_STYLE_PASSWORD, "Register", "This account not registered yet! Please register:", "Register", "");// show the register dialog again.
- }
- else if(strlen(inputtext) > 0 && strlen(inputtext) < 68) // if the password is in between 1 - 68 characters
- {
- new escpass[100];
- mysql_real_escape_string(inputtext, escpass); // here we escape the data again to avoid any mysql injection,
- //remember to always to do this when SELECT'ing or INSERT'ing any data in the database
- MySQL_Register(playerid, escpass); // Here we are going to another function to register the player.
- }
- }
- if(!response)
- {
- SendClientMessage(playerid, 0xFF0000, "You must register before you can login!");
- ShowPlayerDialog(playerid, 2, DIALOG_STYLE_PASSWORD, "Register", "This account not registered yet! Please register:", "Register", "");// show the register dialog again.
- }
- }
- if(dialogid == 1) //Dialog login
- {
- if(!response) //If they click the cancel button
- {
- SendClientMessage(playerid, 0xFF0000, "You must login before you spawn!"); //Sends the client a error message
- Kick(playerid); // and kicks him. ( you can change it to show the player the login dialog again by uncommenting the bottem line and commenting this one.
- //ShowPlayerDialog(playerid, 1, DIALOG_STYLE_PASSWORD, "Login", "This account is registered! Please log in:", "Login", "");
- }
- if(response) //If the player clicked login
- {
- if(!strlen(inputtext) || strlen(inputtext) > 68) //if the password is not 1 to 100 characters
- {
- SendClientMessage(playerid, 0xFF0000, "You must insert a password between 1-68 characters!"); //Sends the client a error message
- ShowPlayerDialog(playerid, 1, DIALOG_STYLE_PASSWORD, "Login","Your user is registered! Please login with your password below!\n{FF0000} Please enter a password between 0 and 68 characters","Login","Cancel");
- return 1;
- }
- mysql_real_escape_string(inputtext, inputtext); //Here we escape the inputtext to avoid SQL injections as stated above.
- mysql_real_escape_string(pInfo[playerid][Name], pInfo[playerid][Name]); // escapeing ^^
- new Query[500];
- format(Query, 500, "SELECT * FROM `playerdata` WHERE `name` COLLATE latin1_general_cs = '%s' AND `password` = '%d'", pInfo[playerid][Name], udb_hash(inputtext)); // now here check the database if the player has given the proper password.HTTP
- mysql_query(Query);
- if(mysql_num_rows() > 0) { // if the password the player provided is correct and matches the database
- MySQL_Login(playerid); // we will call this function and log the player in.
- } else {
- //other wise this means that the password that the player
- //typed was incorrect and we will resend the dialog.
- ShowPlayerDialog(playerid, 1, DIALOG_STYLE_PASSWORD, "Login","Your user is registered! Please login with your password below!\n The password you typed was incorrect!","Login","Cancel"); //Shows our login dialog again.
- }
- }
- }
- return 1;
- }
- public OnPlayerClickPlayer(playerid, clickedplayerid, source)
- {
- return 1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement