Advertisement
BigETI

b_io_fs.pwn

Apr 24th, 2013
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 10.10 KB | None | 0 0
  1. // A way to read and write binary files and handle them as player stats files
  2.  
  3. #include <a_samp>
  4. #include <b_io> // http://pastebin.com/HhZmT4JV
  5.  
  6. #define RED                 0xFF0000FF
  7. #define PLAYER_FILE         "%s.bacc"
  8. #define MAX_WEAPON_SLOTS    (13)
  9.  
  10. BIO_E::ENUM P_STATS_ENUM
  11. {
  12.     BIO_E::16<P_STATS_SKIN>,
  13.     BIO_E::32<P_STATS_MONEY>,
  14.     BIO_E::32<P_STATS_SCORE>,
  15.     BIO_E::8A<P_STATS_WEAPON>[MAX_WEAPON_SLOTS],
  16.     BIO_E::32A<P_STATS_AMMO>[MAX_WEAPON_SLOTS],
  17.     BIO_E::FA<P_STATS_POS>[4],
  18.     BIO_E::8A<P_STATS_IP>[16]
  19. }
  20.  
  21. new player_stats[MAX_PLAYERS][P_STATS_ENUM];
  22.  
  23. stock LoadPlayerStats(playerid)
  24. {
  25.     new pip[16], file_name[64], pname[MAX_PLAYER_NAME];
  26.     GetPlayerIp(playerid, pip, sizeof pip);
  27.     SetPVarString(playerid, "b_io_fs_IP", pip);
  28.     GetPlayerName(playerid, pname, sizeof pname);
  29.     format(file_name, sizeof file_name, PLAYER_FILE, pname);
  30.     if(BIO::exist(file_name))
  31.     {
  32.         new BFile:file_handle = BIO::open(file_name, b_io_mode_read);
  33.         if(file_handle)
  34.         {
  35.             player_stats[playerid][P_STATS_SKIN] = BIO::read_16(file_handle, P_STATS_SKIN, seek_start);
  36.             printf("Skin: %d", player_stats[playerid][P_STATS_SKIN]);
  37.             player_stats[playerid][P_STATS_MONEY] = BIO::read_32(file_handle, P_STATS_MONEY, seek_start);
  38.             player_stats[playerid][P_STATS_SCORE] = BIO::read_32(file_handle, P_STATS_SCORE, seek_start);
  39.             BIO::read_8_arr(file_handle, player_stats[playerid][P_STATS_WEAPON], MAX_WEAPON_SLOTS, P_STATS_WEAPON, seek_start);
  40.             BIO::read_32_arr(file_handle, player_stats[playerid][P_STATS_AMMO], MAX_WEAPON_SLOTS, P_STATS_AMMO, seek_start);
  41.             BIO::read_32_arr(file_handle, _:player_stats[playerid][P_STATS_POS], 4, P_STATS_POS, seek_start);
  42.             BIO::read_8_arr(file_handle, player_stats[playerid][P_STATS_IP], 16, P_STATS_IP, seek_start);
  43.             BIO::close(file_handle);
  44.             SendClientMessage(playerid, RED, "Your stats (before they was saved):");
  45.             new str[128];
  46.             format(str, sizeof str, "-> Skin: %d", player_stats[playerid][P_STATS_SKIN]);
  47.             SendClientMessage(playerid, RED, str);
  48.             format(str, sizeof str, "-> Money: %d", player_stats[playerid][P_STATS_MONEY]);
  49.             SendClientMessage(playerid, RED, str);
  50.             format(str, sizeof str, "-> Score: %d", player_stats[playerid][P_STATS_SCORE]);
  51.             SendClientMessage(playerid, RED, str);
  52.             format(str, sizeof str, "-> Position: X: %.4f; Y: %.4f; Z: %.4f; RotZ: %.4f", player_stats[playerid][P_STATS_POS][0], player_stats[playerid][P_STATS_POS][1], player_stats[playerid][P_STATS_POS][2], player_stats[playerid][P_STATS_POS][3]);
  53.             SendClientMessage(playerid, RED, str);
  54.             format(str, sizeof str, "-> IP: %s", player_stats[playerid][P_STATS_IP]);
  55.             SendClientMessage(playerid, RED, str);
  56.             SetPVarInt(playerid, "b_io_fs_loaded", 1);
  57.         }
  58.         else printf("Failed to open file \"%s\"", file_name);
  59.         return 1;
  60.     }
  61.     return 0;
  62. }
  63.  
  64. stock SavePlayerStats(playerid)
  65. {
  66.     new file_name[64], pname[MAX_PLAYER_NAME];
  67.     GetPlayerName(playerid, pname, sizeof pname);
  68.     format(file_name, sizeof file_name, PLAYER_FILE, pname);
  69.     new BFile:file_handle = BIO::open(file_name, b_io_mode_write);
  70.     if(file_handle)
  71.     {
  72.         BIO::write_16(file_handle, player_stats[playerid][P_STATS_SKIN] = GetPlayerSkin(playerid), P_STATS_SKIN, seek_start);
  73.         BIO::write_32(file_handle, player_stats[playerid][P_STATS_MONEY] = GetPlayerMoney(playerid), P_STATS_MONEY, seek_start);
  74.         BIO::write_32(file_handle, player_stats[playerid][P_STATS_SCORE] = GetPlayerScore(playerid), P_STATS_SCORE, seek_start);
  75.         for(new i = 0; i < MAX_WEAPON_SLOTS; i++) GetPlayerWeaponData(playerid, i, player_stats[playerid][P_STATS_WEAPON][i], player_stats[playerid][P_STATS_AMMO][i]);
  76.         BIO::write_8_arr(file_handle, player_stats[playerid][P_STATS_WEAPON], MAX_WEAPON_SLOTS, P_STATS_WEAPON, seek_start);
  77.         BIO::write_32_arr(file_handle, player_stats[playerid][P_STATS_AMMO], MAX_WEAPON_SLOTS, P_STATS_AMMO, seek_start);
  78.         GetPlayerPos(playerid, player_stats[playerid][P_STATS_POS][0], player_stats[playerid][P_STATS_POS][1], player_stats[playerid][P_STATS_POS][2]);
  79.         GetPlayerFacingAngle(playerid, player_stats[playerid][P_STATS_POS][3]);
  80.         BIO::write_32_arr(file_handle, _:player_stats[playerid][P_STATS_POS], 4, P_STATS_POS, seek_start);
  81.         GetPVarString(playerid, "b_io_fs_IP", player_stats[playerid][P_STATS_IP], 16);
  82.         BIO::write_8_arr(file_handle, player_stats[playerid][P_STATS_IP], 16, P_STATS_IP, seek_start);
  83.         BIO::close(file_handle);
  84.         SetPVarInt(playerid, "b_io_fs_loaded", 1);
  85.         return 1;
  86.     }
  87.     printf("Failed to open file \"%s\"", file_name);
  88.     return 0;
  89. }
  90.  
  91. public OnFilterScriptInit()
  92. {
  93.     for(new i = 0; i < MAX_PLAYERS; i++) if(IsPlayerConnected(i)) LoadPlayerStats(i);
  94.     print("\n===================================================");
  95.     print("= Binary files I/O plugin's example filter script =");
  96.     print("=                                  Made by BigETI =");
  97.     print("= Loaded!                                         =");
  98.     print("===================================================\n");
  99.     return 1;
  100. }
  101.  
  102. public OnFilterScriptExit()
  103. {
  104.     for(new i = 0; i < MAX_PLAYERS; i++)
  105.     {
  106.         if(!IsPlayerConnected(i)) continue;
  107.         SavePlayerStats(i);
  108.         DeletePVar(i, "b_io_fs_loaded");
  109.     }
  110.     print("\n===================================================");
  111.     print("= Binary files I/O plugin's example filter script =");
  112.     print("=                                  Made by BigETI =");
  113.     print("= Unloaded!                                       =");
  114.     print("===================================================\n");
  115.     return 1;
  116. }
  117.  
  118. public OnPlayerConnect(playerid)
  119. {
  120.     LoadPlayerStats(playerid);
  121.     return 1;
  122. }
  123.  
  124. public OnPlayerDisconnect(playerid, reason)
  125. {
  126.     SavePlayerStats(playerid);
  127.     return 1;
  128. }
  129.  
  130. public OnPlayerSpawn(playerid) return 1;
  131.  
  132. public OnPlayerDeath(playerid, killerid, reason)
  133. {
  134.     if(SavePlayerStats(playerid)) return SendClientMessage(playerid, RED, "You died, so your stats have been saved.");
  135.     return SendClientMessage(playerid, RED, "You died, but your stats can't be saved, because of an unknown error.");
  136. }
  137.  
  138. public OnPlayerCommandText(playerid, cmdtext[])
  139. {
  140.     if(!strcmp("/savemystats", cmdtext, true))
  141.     {
  142.         if(SavePlayerStats(playerid)) return SendClientMessage(playerid, RED, "Your stats has been successfully saved!");
  143.         return SendClientMessage(playerid, RED, "Failed to save your current stats!");
  144.     }
  145.     if(!strcmp("/returnmystats", cmdtext, true))
  146.     {
  147.         if(GetPVarType(playerid, "b_io_fs_loaded") == 0) return SendClientMessage(playerid, RED, "Please use \"/savemystats\", die, or re-log before you can use this command.");
  148.         SetPlayerPos(playerid, player_stats[playerid][P_STATS_POS][0], player_stats[playerid][P_STATS_POS][1], player_stats[playerid][P_STATS_POS][2]);
  149.         SetPlayerFacingAngle(playerid, player_stats[playerid][P_STATS_POS][3]);
  150.         SetCameraBehindPlayer(playerid);
  151.         SetPlayerSkin(playerid, player_stats[playerid][P_STATS_SKIN]);
  152.         ResetPlayerMoney(playerid);
  153.         GivePlayerMoney(playerid, player_stats[playerid][P_STATS_MONEY]);
  154.         SetPlayerScore(playerid, player_stats[playerid][P_STATS_SCORE]);
  155.         ResetPlayerWeapons(playerid);
  156.         for(new i = 0; i < MAX_WEAPON_SLOTS; i++) GivePlayerWeapon(playerid, player_stats[playerid][P_STATS_WEAPON][i], player_stats[playerid][P_STATS_AMMO][i]);
  157.         return SendClientMessage(playerid, RED, "You have successfully returned your older stats back.");
  158.     }
  159.     if(!strcmp("/checkskin", cmdtext, true))
  160.     {
  161.         if(GetPVarType(playerid, "b_io_fs_loaded") == 0) return SendClientMessage(playerid, RED, "Please use \"/savemystats\", die, or re-log before you can use this command.");
  162.         new str[128], file_name[64], pname[MAX_PLAYER_NAME];
  163.         GetPlayerName(playerid, pname, sizeof pname);
  164.         format(file_name, sizeof file_name, PLAYER_FILE, pname);
  165.         BIO_I::open(file_name, b_io_mode_read);
  166.         format(str, sizeof str, "Your skin is saved as ID %d", BIO_I::read_16(P_STATS_SKIN));
  167.         SendClientMessage(playerid, RED, str);
  168.         return 1;
  169.     }
  170.     if(!strcmp("/checkmoney", cmdtext, true))
  171.     {
  172.         if(GetPVarType(playerid, "b_io_fs_loaded") == 0) return SendClientMessage(playerid, RED, "Please use \"/savemystats\", die, or re-log before you can use this command.");
  173.         new str[128], file_name[64], pname[MAX_PLAYER_NAME];
  174.         GetPlayerName(playerid, pname, sizeof pname);
  175.         format(file_name, sizeof file_name, PLAYER_FILE, pname);
  176.         BIO_I::open(file_name, b_io_mode_read);
  177.         format(str, sizeof str, "Your money is saved as %d", BIO_I::read_32(P_STATS_MONEY));
  178.         SendClientMessage(playerid, RED, str);
  179.         return 1;
  180.     }
  181.     if(!strcmp("/checkscore", cmdtext, true))
  182.     {
  183.         if(GetPVarType(playerid, "b_io_fs_loaded") == 0) return SendClientMessage(playerid, RED, "Please use \"/savemystats\", die, or re-log before you can use this command.");
  184.         new str[128], file_name[64], pname[MAX_PLAYER_NAME];
  185.         GetPlayerName(playerid, pname, sizeof pname);
  186.         format(file_name, sizeof file_name, PLAYER_FILE, pname);
  187.         BIO_I::open(file_name, b_io_mode_read);
  188.         format(str, sizeof str, "Your score is saved as %d", BIO_I::read_32(P_STATS_SCORE));
  189.         SendClientMessage(playerid, RED, str);
  190.         return 1;
  191.     }
  192.     if(!strcmp("/checkpos", cmdtext, true))
  193.     {
  194.         if(GetPVarType(playerid, "b_io_fs_loaded") == 0) return SendClientMessage(playerid, RED, "Please use \"/savemystats\", die, or re-log before you can use this command.");
  195.         new str[128], file_name[64], pname[MAX_PLAYER_NAME], Float:p_pos[4];
  196.         GetPlayerName(playerid, pname, sizeof pname);
  197.         format(file_name, sizeof file_name, PLAYER_FILE, pname);
  198.         BIO_I::open(file_name, b_io_mode_read);
  199.         BIO_I::read_32_arr(_:p_pos, 4, P_STATS_POS);
  200.         format(str, sizeof str, "Your pos is saved as X: %.4f; Y: %.4f; Z: %.4f; RotZ: %.4f", p_pos[0], p_pos[1], p_pos[2], p_pos[3]);
  201.         SendClientMessage(playerid, RED, str);
  202.         return 1;
  203.     }
  204.     if(!strcmp("/checkip", cmdtext, true))
  205.     {
  206.         if(GetPVarType(playerid, "b_io_fs_loaded") == 0) return SendClientMessage(playerid, RED, "Please use \"/savemystats\", die, or re-log before you can use this command.");
  207.         new str[128], file_name[64], pname[MAX_PLAYER_NAME], ip[16];
  208.         GetPlayerName(playerid, pname, sizeof pname);
  209.         format(file_name, sizeof file_name, PLAYER_FILE, pname);
  210.         BIO_I::open(file_name, b_io_mode_read);
  211.         BIO_I::read_8_arr(ip, 16, P_STATS_IP, seek_start);
  212.         format(str, sizeof str, "Your IP is saved as %s", ip);
  213.         SendClientMessage(playerid, RED, str);
  214.         return 1;
  215.     }
  216.     return 0;
  217. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement