Lirbo

aaaaaa

Jul 17th, 2026
27
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 15.28 KB | None | 0 0
  1. ================ account.inc ==================
  2. #if defined _inc_account
  3.     #undef _inc_account
  4. #endif
  5.  
  6. #include <YSI_Coding/y_hooks>
  7.  
  8. #define MAX_ACCOUNT_PASSWORD 32
  9.  
  10. enum E_ACC_DATA
  11. {
  12.     E_ACC_ID,
  13.     E_ACC_USERNAME[MAX_PLAYER_NAME],
  14.     E_ACC_ADMIN,
  15.     E_ACC_CHARACTER_SLOTS,
  16. }
  17. new g_AccData[MAX_PLAYERS][E_ACC_DATA];
  18.  
  19. enum E_ACC_TEMP_DATA
  20. {
  21.     E_ACC_TEMP_REGISTRATION_USERNAME[MAX_PLAYER_NAME],
  22.     E_ACC_TEMP_REGISTRATION_PASSWORD[MAX_ACCOUNT_PASSWORD],
  23.     E_ACC_TEMP_LOGIN_PASSWORD[MAX_ACCOUNT_PASSWORD],
  24.     E_ACC_TEMP_LOGIN_ATTEMPTS_LEFT
  25. }
  26. new g_AccTempData[MAX_PLAYERS][E_ACC_TEMP_DATA];
  27.  
  28. hook function Foo(bar)
  29. {
  30.   printf("hook Foo(%d)@%03d", bar, UNIQUE_SYMBOL);
  31.   return continue(bar);
  32. }
  33.  
  34. hook OnPlayerConnect(playerid)
  35. {
  36.     defer OnPlayerConnectTimer(playerid);
  37. }
  38.  
  39. timer OnPlayerConnectTimer[1000](playerid)
  40. {
  41.     // Setting up the scene
  42.    
  43.     ClearChat(playerid);
  44.     TogglePlayerControllable(playerid, false);
  45.     SetPlayerPos(playerid, 200, 3250, 10);
  46.     TogglePlayerSpectating(playerid, true);
  47.     InterpolateCameraPos(playerid, 200, 3300, -20, 200, 3310, 10, 8000, CAMERA_MOVE);
  48.     InterpolateCameraLookAt(playerid, 200, 3300, -30, 200, 3330, 10, 8000, CAMERA_MOVE);
  49.  
  50.     new query[64];
  51.     mysql_format(g_Sql, query, sizeof(query), "SELECT id FROM accounts WHERE username = '%e'", ReturnPlayerName(playerid));
  52.     mysql_tquery(g_Sql, query, "OnPlayerAccountCheck", "i", playerid);
  53.     return 1;
  54. }
  55.  
  56. hook function ShowPlayerPremadeDialog(playerid, dialogid)
  57. {
  58.     if (dialogid == DIALOG_ACCOUNT_CREATE_USERNAME)
  59.     {
  60.         ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, "Account Creation",
  61.         "{"#COLOR_THEME"}Welcome to "#SERVER_NAME"!\n\n\
  62.         {FFFFFF}Please enter a username for your new Master Account in the field below.\n\n\
  63.         {808080}TIP: All characters you create will be associated with this account, and its name will be displayed in-game for other players.",
  64.         "Next", "Quit");
  65.         return 1;
  66.     }
  67.  
  68.     else if (dialogid == DIALOG_ACCOUNT_CREATE_PASSWORD)
  69.     {
  70.         new string[256];
  71.  
  72.         format(string, sizeof(string),
  73.         "{"#COLOR_THEME"}Username: {FFFFFF}%s\n\
  74.         {"#COLOR_THEME"}Password:\n\n\
  75.         {FFFFFF}Please create a password for your account.\n\n\
  76.         {"#COLOR_TIP"}TIP: Passwords must contain 6-31 characters.",
  77.         g_AccTempData[playerid][E_ACC_TEMP_REGISTRATION_USERNAME]);
  78.  
  79.         ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_PASSWORD, "Account Creation", string, "Next", "Back");
  80.         return 1;
  81.     }
  82.  
  83.     else if (dialogid == DIALOG_ACCOUNT_CREATE_PASSWORD_CONFIRM)
  84.     {
  85.         new string[300], maskedPassword[MAX_ACCOUNT_PASSWORD];
  86.         MaskString(g_AccTempData[playerid][E_ACC_TEMP_REGISTRATION_PASSWORD], "*", maskedPassword);
  87.  
  88.         format(string, sizeof(string),
  89.         "{"#COLOR_THEME"}Username: {FFFFFF}%s\n\
  90.         {"#COLOR_THEME"}Password: {FFFFFF}%s\n\n\
  91.         {FFFFFF}Please confirm your password by entering it once again in the text field below.",
  92.         g_AccTempData[playerid][E_ACC_TEMP_REGISTRATION_USERNAME], maskedPassword);
  93.  
  94.         ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_PASSWORD, "Account Creation", string, "Next", "Back");
  95.         return 1;
  96.     }
  97.  
  98.     else if (dialogid == DIALOG_ACCOUNT_LOGIN)
  99.     {
  100.         new string[86];
  101.  
  102.         format(string, sizeof(string), "{"#COLOR_THEME"}Welcome back, %s!\n\n\
  103.         {FFFFFF}Please enter your password to log in.", ReturnPlayerName(playerid));
  104.  
  105.         ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_PASSWORD, "Login", string, "Login", "Quit");
  106.         return 1;
  107.     }
  108.  
  109.     else if (dialogid == DIALOG_ACCOUNT)
  110.     {
  111.         new query[86];
  112.         mysql_format(g_Sql, query, sizeof(query), "SELECT name, bounty FROM characters WHERE account_id = %d", g_AccData[playerid][E_ACC_ID]);
  113.         mysql_tquery(g_Sql, query, "OnShowPlayerAccountDialog", "i", playerid);
  114.         return 1;
  115.     }
  116.  
  117.     return continue(playerid, dialogid);
  118. }
  119.  
  120. hook OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  121. {
  122.     if (dialogid == DIALOG_ACCOUNT_CREATE_USERNAME)
  123.     {
  124.         if (!response) return KickPlayer(playerid, INVALID_PLAYER_ID, "You have left the server", true, 500);
  125.         if (!strlen(inputtext) || !IsValidNickName(inputtext))
  126.         {
  127.             SendPlayerMessage(playerid, MESSAGE_TYPE_NEGATIVE, "ERROR", "Usernames must contain 3-23 characters, and certain symbols are disallowed.");
  128.             ShowPlayerPremadeDialog(playerid, dialogid);
  129.             return 1;
  130.         }
  131.         format(g_AccTempData[playerid][E_ACC_TEMP_REGISTRATION_USERNAME], MAX_PLAYER_NAME, "%s", inputtext);
  132.         new query[128];
  133.         mysql_format(g_Sql, query, sizeof(query), "SELECT id FROM accounts WHERE username = '%e'", inputtext);
  134.         mysql_tquery(g_Sql, query, "OnPlayerUsernameCheck", "i", playerid);
  135.         return 1;
  136.     }
  137.  
  138.     else if (dialogid == DIALOG_ACCOUNT_CREATE_PASSWORD)
  139.     {
  140.         if (!response) return ShowPlayerPremadeDialog(playerid, DIALOG_ACCOUNT_CREATE_USERNAME);
  141.         new length = strlen(inputtext);
  142.         if (!length || length < 6 || length > 31)
  143.         {
  144.             SendPlayerMessage(playerid, MESSAGE_TYPE_NEGATIVE, "ERROR", "Passwords must contain 6-31 characters!");
  145.             ShowPlayerPremadeDialog(playerid, dialogid);
  146.             return 1;
  147.         }
  148.         format(g_AccTempData[playerid][E_ACC_TEMP_REGISTRATION_PASSWORD], MAX_ACCOUNT_PASSWORD, "%s", inputtext);
  149.         ShowPlayerPremadeDialog(playerid, DIALOG_ACCOUNT_CREATE_PASSWORD_CONFIRM);
  150.         return 1;
  151.     }
  152.  
  153.     else if (dialogid == DIALOG_ACCOUNT_CREATE_PASSWORD_CONFIRM)
  154.     {
  155.         if (!response) return ShowPlayerPremadeDialog(playerid, DIALOG_ACCOUNT_CREATE_PASSWORD);
  156.  
  157.         if (!strlen(inputtext) || strcmp(inputtext, g_AccTempData[playerid][E_ACC_TEMP_REGISTRATION_PASSWORD]))
  158.         {
  159.             SendPlayerMessage(playerid, MESSAGE_TYPE_NEGATIVE, "ERROR", "Passwords don't match, please try again or press on the Back button.");
  160.             ShowPlayerPremadeDialog(playerid, dialogid);
  161.             return 1;
  162.         }
  163.  
  164.         bcrypt_hash(playerid, "OnPlayerRegistrationPasswordHashed", inputtext, BCRYPT_COST);
  165.         return 1;
  166.     }
  167.  
  168.     else if (dialogid == DIALOG_ACCOUNT_LOGIN)
  169.     {
  170.         if (!response) return KickPlayer(playerid, INVALID_PLAYER_ID, "You have left the server.");
  171.  
  172.         if (!strlen(inputtext))
  173.         {
  174.             SendPlayerMessage(playerid, MESSAGE_TYPE_NEGATIVE, "ERROR", "You must enter a password to log in!");
  175.             ShowPlayerPremadeDialog(playerid, dialogid);
  176.             return 1;
  177.         }
  178.  
  179.         new query[128], username[MAX_PLAYER_NAME];
  180.         GetPlayerName(playerid, username);
  181.         format(g_AccTempData[playerid][E_ACC_TEMP_LOGIN_PASSWORD], MAX_ACCOUNT_PASSWORD, "%s", inputtext);
  182.         mysql_format(g_Sql, query, sizeof(query), "SELECT password FROM accounts WHERE username = '%e'", username);
  183.         mysql_tquery(g_Sql, query, "OnPlayerLoginAttempt", "i", playerid);
  184.         return 1;
  185.     }
  186.  
  187.     else if (dialogid == DIALOG_ACCOUNT)
  188.     {
  189.         if (!response) return ShowPlayerPremadeDialog(playerid, dialogid);
  190.         if (listitem == 0)
  191.         {
  192.             ShowPlayerPremadeDialog(playerid, DIALOG_CHARACTER_CREATE_NAME);
  193.             return 1;
  194.         }
  195.         new query[66];
  196.         mysql_format(g_Sql, query, sizeof(query), "SELECT * FROM characters WHERE name = '%e'", inputtext);
  197.         mysql_tquery(g_Sql, query, "OnPlayerLoadCharacter", "i", playerid);
  198.         return 1;
  199.     }
  200.     return 1;
  201. }
  202.  
  203.  
  204. forward OnPlayerAccountCheck(playerid);
  205. public OnPlayerAccountCheck(playerid)
  206. {
  207.     new rows; cache_get_row_count(rows);
  208.     if (!rows)
  209.     {
  210.         ShowPlayerPremadeDialog(playerid, DIALOG_ACCOUNT_CREATE_USERNAME);
  211.         return 1;
  212.     }
  213.     else
  214.     {
  215.         g_AccTempData[playerid][E_ACC_TEMP_LOGIN_ATTEMPTS_LEFT] = 3;
  216.         ShowPlayerPremadeDialog(playerid, DIALOG_ACCOUNT_LOGIN);
  217.         return 1;
  218.     }
  219. }
  220.  
  221. forward OnPlayerRegistrationPasswordHashed(playerid);
  222. public OnPlayerRegistrationPasswordHashed(playerid)
  223. {
  224.     new hashedPassword[BCRYPT_HASH_LENGTH];
  225.     bcrypt_get_hash(hashedPassword);
  226.  
  227.     new query[128];
  228.  
  229.     mysql_format(g_Sql, query, sizeof(query), "INSERT INTO accounts (username, password) VALUES ('%e', '%e')", g_AccTempData[playerid][E_ACC_TEMP_REGISTRATION_USERNAME], hashedPassword);
  230.     mysql_tquery(g_Sql, query, "OnPlayerRegister", "i", playerid);
  231.     return 1;
  232. }
  233.  
  234. forward OnPlayerRegister(playerid);
  235. public OnPlayerRegister(playerid)
  236. {
  237.     SetPlayerName(playerid, g_AccTempData[playerid][E_ACC_TEMP_REGISTRATION_USERNAME]);
  238.     SendPlayerMessage(playerid, MESSAGE_TYPE_POSITIVE, "ACCOUNT", "Your account has been successfully created, please log in to proceed!");
  239.     ShowPlayerPremadeDialog(playerid, DIALOG_ACCOUNT_LOGIN);
  240.     return 1;
  241. }
  242.  
  243. forward OnPlayerLoginAttempt(playerid);
  244. public OnPlayerLoginAttempt(playerid)
  245. {
  246.     new rows; cache_get_row_count(rows);
  247.     // No account found despite being on the login dialog
  248.     if (!rows)
  249.     {
  250.         new string[128], username[MAX_PLAYER_NAME];
  251.         GetPlayerName(playerid, username);
  252.         format(string, sizeof(string), "Could not find username named \"%s\" in the database, please report this issue!", username);
  253.         SendPlayerMessage(playerid, MESSAGE_TYPE_NEGATIVE, "ERROR", string);
  254.         KickPlayer(playerid, INVALID_PLAYER_ID, "Critical Error!", true);
  255.         return 0;
  256.     }
  257.  
  258.     new storedPassword[BCRYPT_HASH_LENGTH];
  259.     cache_get_value_name(0, "password", storedPassword);
  260.     bcrypt_verify(playerid, "OnPlayerLoginPasswordVerify", g_AccTempData[playerid][E_ACC_TEMP_LOGIN_PASSWORD], storedPassword);
  261.     return 1;
  262. }
  263.  
  264. forward OnPlayerLoginPasswordVerify(playerid, bool:success);
  265. public OnPlayerLoginPasswordVerify(playerid, bool:success)
  266. {
  267.     // When a wrong password is entered
  268.     if (!success)
  269.     {
  270.         g_AccTempData[playerid][E_ACC_TEMP_LOGIN_ATTEMPTS_LEFT]--;
  271.         if (g_AccTempData[playerid][E_ACC_TEMP_LOGIN_ATTEMPTS_LEFT] <= 0)
  272.         {
  273.             KickPlayer(playerid, INVALID_PLAYER_ID, "Failure to log in.", true);
  274.             return 0;
  275.         }
  276.         new string[64];
  277.         format(string, sizeof(string), "Invalid password, %d attempts left!", g_AccTempData[playerid][E_ACC_TEMP_LOGIN_ATTEMPTS_LEFT]);
  278.         SendPlayerMessage(playerid, MESSAGE_TYPE_NEGATIVE, "ERROR", string);
  279.         ShowPlayerPremadeDialog(playerid, DIALOG_ACCOUNT_LOGIN);
  280.         return 0;
  281.     }
  282.  
  283.     new username[MAX_PLAYER_NAME];
  284.     GetPlayerName(playerid, username);
  285.     LoadPlayerAccount(playerid, username);
  286.     return 1;
  287. }
  288.  
  289. forward LoadPlayerAccount(playerid, const string:username[]);
  290. public LoadPlayerAccount(playerid, const string:username[])
  291. {
  292.     new query[186];
  293.     mysql_format(g_Sql, query, sizeof(query), "SELECT * FROM accounts WHERE username = '%e'", username);
  294.     mysql_tquery(g_Sql, query, "OnPlayerLoadAccount", "i", playerid);
  295.     return 1;
  296. }
  297.  
  298. forward OnPlayerLoadAccount(playerid);
  299. public OnPlayerLoadAccount(playerid)
  300. {
  301.     if (!IsPlayerConnected(playerid)) return 0; // Security check due to async callback
  302.     cache_get_value_name(0, "username", g_AccData[playerid][E_ACC_USERNAME]);
  303.     cache_get_value_name_int(0, "admin", g_AccData[playerid][E_ACC_ADMIN]);
  304.     cache_get_value_name_int(0, "character_slots", g_AccData[playerid][E_ACC_CHARACTER_SLOTS]);
  305.     ShowPlayerPremadeDialog(playerid, DIALOG_ACCOUNT);
  306.     return 1;
  307. }
  308.  
  309. forward OnShowPlayerAccountDialog(playerid);
  310. public OnShowPlayerAccountDialog(playerid)
  311. {
  312.     new title[MAX_PLAYER_NAME + 10], body[512] = "Character Name\tBounty\n{55FF55}[+] {99FF99}Create a new character";
  313.     format(title, sizeof(title), "%s (Character Slots: %d)", g_AccData[playerid][E_ACC_USERNAME], g_AccData[playerid][E_ACC_CHARACTER_SLOTS]);
  314.     new rows; cache_get_row_count(rows);
  315.     for(new i = 0; i < rows; i++)
  316.     {
  317.         new name[MAX_PLAYER_NAME], bounty, bountyC[14];
  318.         cache_get_value_name(i, "name", name);
  319.         cache_get_value_name_int(i, "bounty", bounty);
  320.         new string[48];
  321.         if(bounty < 1)
  322.         {
  323.             format(string, sizeof(string), "\n%s\tNone", name);
  324.         }
  325.         else
  326.         {
  327.             FormatComma(bounty, bountyC);
  328.             format(string, sizeof(string), "\n%s\tB%s", name, bountyC);
  329.         }
  330.         strcat(body, string);
  331.     }
  332.     ShowPlayerDialog(playerid, DIALOG_ACCOUNT, DIALOG_STYLE_TABLIST_HEADERS, title, body, "Select", "");
  333.     return 1;
  334. }
  335.  
  336. forward OnPlayerUsernameCheck(playerid);
  337. public OnPlayerUsernameCheck(playerid)
  338. {
  339.     new rows; cache_get_row_count(rows);
  340.     if (rows)
  341.     {
  342.         SendPlayerMessage(playerid, MESSAGE_TYPE_NEGATIVE, "ERROR", "This username is already taken!");
  343.         ShowPlayerPremadeDialog(playerid, DIALOG_ACCOUNT_CREATE_USERNAME);
  344.         return 0;
  345.     }
  346.     ShowPlayerPremadeDialog(playerid, DIALOG_ACCOUNT_CREATE_PASSWORD);
  347.     return 1;
  348. }
  349.  
  350.  
  351. ==================== character.inc ======================
  352. #if defined _inc_character
  353.     #undef _inc_character
  354. #endif
  355.  
  356. #include <YSI_Coding/y_hooks>
  357.  
  358. enum E_CHAR_DATA
  359. {
  360.     E_CHAR_NAME[MAX_PLAYER_NAME],
  361.     E_CHAR_BOUNTY,
  362.     E_CHAR_CREW[32],
  363.     E_CHAR_SKIN,
  364.     E_CHAR_MONEY,
  365.     E_CHAR_STRENGTH,
  366.     E_CHAR_DEXTERITY,
  367.     E_CHAR_STAMINA,
  368.     E_CHAR_INTELLIGENCE,
  369.     E_CHAR_BRAWL,
  370.     E_CHAR_MELEE,
  371.     E_CHAR_FIREARMS,
  372.     E_CHAR_BLOCK,
  373.     E_CHAR_DODGE,
  374.     E_CHAR_PERCEPTION,
  375.     E_CHAR_STEALTH,
  376.     E_CHAR_NAVIGATION,
  377.     E_CHAR_CRAFTS,
  378.     E_CHAR_PERFORMANCE,
  379.     E_CHAR_MEDICINE
  380. }
  381. new g_CharData[MAX_PLAYERS][E_CHAR_DATA];
  382.  
  383. hook function Foo(bar)
  384. {
  385.   printf("hook Foo(%d)@%03d", bar, UNIQUE_SYMBOL);
  386.   return continue(bar);
  387. }
  388.  
  389. forward OnPlayerLoadCharacter(playerid);
  390. public OnPlayerLoadCharacter(playerid)
  391. {
  392.     cache_get_value_name(0, "name", g_CharData[playerid][E_CHAR_NAME]);
  393.     cache_get_value_name_int(0, "bounty", g_CharData[playerid][E_CHAR_BOUNTY]);
  394.     cache_get_value_name_int(0, "skin", g_CharData[playerid][E_CHAR_SKIN]);
  395.     return 1;
  396. }
  397.  
  398. hook function ShowPlayerPremadeDialog(playerid, dialogid)
  399. {
  400.     if (dialogid ==  DIALOG_CHARACTER_CREATE_NAME)
  401.     {
  402.         ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, "Character Creation", "{FFFFFF}Please enter a name for your character in the text field below.\n\n\
  403.        {"#COLOR_TIP"}TIP: Names must follow a Surname_Firstname format (e.g., Krell_Balthazar).",
  404.         "Next", "Back");
  405.         return 1;
  406.     }
  407.     return continue(playerid, dialogid);
  408. }
  409.  
  410. hook OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  411. {
  412.     if (dialogid == DIALOG_CHARACTER_CREATE_NAME)
  413.     {
  414.         SendPlayerMessage(playerid, MESSAGE_TYPE_POSITIVE, "Test", "Checking that OnDialogResponse triggers");
  415.         if (!response)
  416.         {
  417.             ShowPlayerPremadeDialog(playerid, DIALOG_ACCOUNT);
  418.             return 1;
  419.         }
  420.        
  421.         if (!IsCharacterNameValid(inputtext))
  422.         {
  423.             SendPlayerMessage(playerid, MESSAGE_TYPE_NEGATIVE, "ERROR", "This name does not follow the Surname_Firstname naming format!");
  424.             ShowPlayerPremadeDialog(playerid, dialogid);
  425.             return 1;
  426.         }
  427.  
  428.         SendPlayerMessage(playerid, MESSAGE_TYPE_POSITIVE, "NICE", "That's a correct name, TODO: mSelection for skins");
  429.         return 1;
  430.     }
  431.     return 1;
  432. }
Add Comment
Please, Sign In to add comment