Guest User

Inventory System

a guest
Aug 24th, 2017
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.16 KB | None | 0 0
  1. /*
  2. @project_name
  3. Cyanide's Inventory System
  4. @project_author
  5. Cyanide
  6. @license
  7. Mozilla Public License 1.1
  8. @description
  9. This inventory system's name explains it all. This inventory system features
  10. a description feature, which can be used for useful purposes. There's a
  11. load and safe feature installed into the script.
  12. @functions (Scripters Only)
  13. countInventoryItems( clientid ) - Counts the amount of inventory items a player has.
  14. listInventoryItems( clientid, inv_name[ ], inv_description[ ], &inv_int, &index ) - Lists all inventory items, view forum topic for information.
  15. saveInventory( clientid, directory[ ] = INVENTORY_DIRECTORY ) - Saves a inventory.
  16. loadInventory( clientid, directory[ ] = INVENTORY_DIRECTORY ) - Laods a inventory.
  17. getInventoryItemDesc( clientid, itemName[ ] ) - Gets a item's description.
  18. checkInventoryItemQuanity( clientid, itemName[ ] ) - Checks the amount of a item a player has.
  19. checkInventoryItem( clientid, itemName[ ] ) - Checks if a player has a inventory item.
  20. addInventoryItem( clientid, itemName[ ], description[ ], amount ) - Adds a inventory item.
  21. removeInventoryItem( clientid, itemName[ ], amount = 0 ) - Removes a inventory item.
  22. resetInventory( clientid ) - Resets a player's inventory.
  23.  
  24. onPlayerReceiveItem( playerid, itemName[ ], description[ ], amount ) - Called when a player gets item.
  25. onPlayerRemoveItem( playerid, itemName[ ], amount ) - Called when a player loses a item.
  26. onPlayerInventorySaved( playerid, directory[ ] ) - Called when a inventory is saved.
  27. onPlayerInventoryLoaded( playerid, directory[ ] ) - Called when a inventory is loaded.
  28. @commands
  29.  
  30. @credits
  31. Cyanide - Project Launcher & Developer
  32. SA-MP Team - San Andreas Multiplayer Modification.
  33.  
  34. */
  35. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  36. #define INVENTORY_DIRECTORY "playerInventories/%s.ini"
  37. //#define INVENTORY_DEBUG
  38. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  39. forward onPlayerReceiveItem( playerid, itemName[ ], description[ ], amount );
  40. forward onPlayerRemoveItem( playerid, itemName[ ], amount );
  41. forward onPlayerInventorySaved( playerid, directory[ ] );
  42. forward onPlayerInventoryLoaded( playerid, directory[ ] );
  43. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  44. static
  45. inv_string[ 300 ]
  46. ;
  47. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  48. stock countInventoryItems( clientid )
  49. {
  50. #if defined INVENTORY_DEBUG
  51. printf( "countInventoryItems( %i )", clientid );
  52. #endif
  53.  
  54. static
  55. s_index[ 3 ]
  56. ;
  57. s_index[ 0 ] = GetPVarsUpperIndex( clientid );
  58. while( s_index[ 1 ] < s_index[ 0 ] )
  59. {
  60. GetPVarNameAtIndex( clientid, s_index[ 1 ], inv_string, sizeof inv_string );
  61. if( ( strfind( inv_string, "inv_", true ) != -1 ) && ( strfind( inv_string, "d_", true ) == -1 ) )
  62. {
  63. s_index[ 2 ] ++;
  64. }
  65. s_index[ 1 ] ++;
  66. }
  67. return s_index[ 2 ];
  68. }
  69.  
  70. stock listInventoryItems( clientid, inv_name[ ], inv_description[ ], &inv_int, &index )
  71. {
  72. #if defined INVENTORY_DEBUG
  73. printf( "listInventoryItems( %i, %s, %s, %i, %i )", clientid, inv_name, inv_description, inv_int, index );
  74. #endif
  75. if( !countInventoryItems( clientid ) )
  76. return false;
  77.  
  78. static
  79. s_index[ 2 ]
  80. ;
  81. s_index[ 0 ] = GetPVarsUpperIndex( clientid );
  82. s_index[ 1 ] = index;
  83.  
  84. while( s_index[ 1 ] < s_index[ 0 ] )
  85. {
  86. GetPVarNameAtIndex( clientid, s_index[ 1 ], inv_string, sizeof inv_string );
  87. if( ( strfind( inv_string, "inv_", true ) != -1 ) && ( strfind( inv_string, "d_", true ) == -1 ) )
  88. {
  89. inv_name[ 0 ] = EOS, inv_description[ 0 ] = EOS;
  90. sscanf( inv_string, "p<_>{s[100]}s[30]", inv_string );
  91. strcat( inv_name, inv_string, 30 );
  92. strcat( inv_description, getInventoryItemDesc( clientid, inv_name ), 100 );
  93. inv_int = checkInventoryItemQuanity( clientid, inv_name );
  94.  
  95. index ++;
  96. return true;
  97. }
  98. s_index[ 1 ] ++;
  99.  
  100. }
  101. return false;
  102. }
  103.  
  104. stock saveInventory( clientid, directory[ ] = INVENTORY_DIRECTORY )
  105. {
  106. #if defined INVENTORY_DEBUG
  107. printf( "saveInventory( %i, %s )", clientid, directory );
  108. #endif
  109. static
  110. File:s_file,
  111. s_inv[ 3 ][ 100 ],
  112. s_inv_int,
  113. s_index[ 2 ]
  114. ;
  115. GetPlayerName( clientid, inv_string, 24 );
  116. format( inv_string, sizeof inv_string, directory, inv_string );
  117.  
  118. s_index[ 0 ] = GetPVarsUpperIndex( clientid );
  119. s_file = fopen( inv_string, io_write );
  120. while( s_index[ 1 ] < s_index[ 0 ] )
  121. {
  122. GetPVarNameAtIndex( clientid, s_index[ 1 ], inv_string, sizeof inv_string );
  123.  
  124. if( ( strfind( inv_string, "inv_", true ) != -1 ) && ( strfind( inv_string, "d_", true ) == -1 ) )
  125. {
  126. sscanf( inv_string, "p<_>{s[100]}s[30]", s_inv[ 2 ] );
  127. format( s_inv[ 0 ], 100, s_inv[ 2 ] );
  128. format( s_inv[ 1 ], 100, getInventoryItemDesc( clientid, s_inv[ 2 ] ) );
  129.  
  130. s_inv_int = checkInventoryItemQuanity( clientid, s_inv[ 2 ] );
  131.  
  132. format( inv_string, sizeof inv_string, "%s|%s|%i\r\n", s_inv[ 0 ], s_inv[ 1 ], s_inv_int );
  133. fwrite( s_file, inv_string );
  134. }
  135.  
  136. s_index[ 1 ] ++;
  137. }
  138. fclose( s_file );
  139. CallRemoteFunction( "onPlayerInventorySaved", "is", clientid, directory );
  140. }
  141.  
  142. stock loadInventory( clientid, directory[ ] = INVENTORY_DIRECTORY )
  143. {
  144. #if defined INVENTORY_DEBUG
  145. printf( "loadInventory( %i, %s )", clientid, directory );
  146. #endif
  147. static
  148. File:s_file,
  149. s_load[ 2 ][ 100 ],
  150. s_loadint
  151. ;
  152.  
  153. GetPlayerName( clientid, inv_string, 24 );
  154. format( inv_string, sizeof inv_string, directory, inv_string );
  155. s_file = fopen( inv_string, io_read );
  156.  
  157. while( fread( s_file, inv_string ) )
  158. {
  159. sscanf( inv_string, "p<|>s[30]s[100]i", s_load[ 0 ], s_load[ 1 ], s_loadint );
  160. addInventoryItem( clientid, s_load[ 0 ], s_load[ 1 ], s_loadint );
  161. }
  162. fclose( s_file );
  163. CallRemoteFunction( "onPlayerInventoryLoaded", "is", clientid, directory );
  164. return true;
  165. }
  166.  
  167. stock getInventoryItemDesc( clientid, itemName[ ] )
  168. {
  169. #if defined INVENTORY_DEBUG
  170. printf( "getInventoryItemDesc( %i, %s )", clientid, itemName );
  171. #endif
  172. new
  173. returnString[ 100 ]
  174. ;
  175.  
  176. if( !checkInventoryItem( clientid, itemName ) )
  177. return returnString;
  178.  
  179. format( inv_string, sizeof inv_string, "d_inv_%s", itemName );
  180. GetPVarString( clientid, inv_string, returnString, sizeof returnString );
  181. return returnString;
  182. }
  183.  
  184. stock checkInventoryItemQuanity( clientid, itemName[ ] )
  185. {
  186. #if defined INVENTORY_DEBUG
  187. printf( "checkInventoryItemQuanity( %i, %s )", clientid, itemName );
  188. #endif
  189.  
  190. if( !checkInventoryItem( clientid, itemName ) )
  191. return false;
  192.  
  193. format( inv_string, sizeof inv_string, "inv_%s", itemName );
  194. return GetPVarInt( clientid, inv_string );
  195. }
  196.  
  197. stock checkInventoryItem( clientid, itemName[ ] )
  198. {
  199. #if defined INVENTORY_DEBUG
  200. printf( "checkInventoryItem( %i, %s )", clientid, itemName );
  201. #endif
  202.  
  203. format( inv_string, sizeof inv_string, "inv_%s", itemName );
  204.  
  205. if( GetPVarType( clientid, inv_string ) != PLAYER_VARTYPE_NONE )
  206. return true;
  207.  
  208. return false;
  209. }
  210.  
  211. stock addInventoryItem( clientid, itemName[ ], description[ ], amount )
  212. {
  213. #if defined INVENTORY_DEBUG
  214. printf( "addInventoryItem( %i, %s, %s, %i )", clientid, itemName, description, amount );
  215. #endif
  216.  
  217. format( inv_string, sizeof inv_string, "inv_%s", itemName );
  218.  
  219. if( GetPVarType( clientid, inv_string ) == PLAYER_VARTYPE_INT )
  220. SetPVarInt( clientid, inv_string, GetPVarInt( clientid, inv_string ) + amount );
  221. else
  222. SetPVarInt( clientid, inv_string, amount );
  223.  
  224. format( inv_string, sizeof inv_string, "d_inv_%s", itemName );
  225. SetPVarString( clientid, inv_string, description );
  226.  
  227. CallRemoteFunction( "onPlayerReceiveItem", "issi", clientid, itemName, description, amount );
  228. return true;
  229. }
  230.  
  231. stock removeInventoryItem( clientid, itemName[ ], amount = 0 )
  232. {
  233. #if defined INVENTORY_DEBUG
  234. printf( "removeInventoryItem( %i, %s, %s, %i )", clientid, itemName, amount );
  235. #endif
  236.  
  237. format( inv_string, sizeof inv_string, "inv_%s", itemName );
  238.  
  239. if( GetPVarType( clientid, inv_string ) == PLAYER_VARTYPE_INT )
  240. return false;
  241.  
  242. if( !amount || ( GetPVarInt( clientid, inv_string ) - amount <= 0 ) )
  243. {
  244. DeletePVar( clientid, inv_string );
  245. format( inv_string, sizeof inv_string, "d_inv_%s", itemName );
  246. DeletePVar( clientid, inv_string );
  247. }
  248. else
  249. SetPVarInt( clientid, inv_string, GetPVarInt( clientid, inv_string ) - amount );
  250.  
  251. CallRemoteFunction( "onPlayerRemoveItem", "isi", clientid, itemName, amount );
  252. return true;
  253. }
  254.  
  255. stock resetInventory( clientid )
  256. {
  257. #if defined INVENTORY_DEBUG
  258. printf( "resetInventory( %i )", clientid );
  259. #endif
  260.  
  261. static
  262. s_index[ 2 ]
  263. ;
  264. s_index[ 0 ] = GetPVarsUpperIndex( clientid );
  265. while( s_index[ 1 ] < s_index[ 0 ] )
  266. {
  267. GetPVarNameAtIndex( clientid, s_index[ 1 ], inv_string, sizeof inv_string );
  268. print( inv_string );
  269.  
  270. if( strfind( inv_string, "inv_", false ) != -1 )
  271. DeletePVar( clientid, inv_string );
  272.  
  273. s_index[ 1 ] ++;
  274. }
  275. return true;
  276. }
Add Comment
Please, Sign In to add comment