Guest User

Inventory - Learning

a guest
Dec 1st, 2014
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.42 KB | None | 0 0
  1. #define INV_DIALOG_ID 13337
  2. #define MAX_ITEMS 20
  3. #define MAX_ITEM_STACK 99
  4. #define MAX_ITEM_NAME 24
  5. forward OnPlayerUseItem(playerid,ItemName[]);
  6. new gItemList[(MAX_ITEMS+1)*(MAX_ITEM_NAME+3)];
  7. /*
  8. native AddItem(playerid,ItemName[],Amount);
  9. native RemoveItem(playerid,ItemName[],Amount);
  10. native PlayerHasItem(playerid,ItemName[]);
  11. native GetPlayerItemInfo(playerid,&idx,const ItemName[],len=sizeof(ItemName),&Amount);
  12. native ResetPlayerInventory(playerid);
  13. native ShowInventory(playerid);
  14. native InventoryOnDialogResponse(playerid, dialogid, response, inputtext[]);
  15. native SaveInventory(playerid);
  16. native LoadInventory(playerid);
  17. */
  18. stock _GetItemNamePVar(playerid,item)
  19. {
  20. new tmp[32];
  21. new tmp2[MAX_ITEM_NAME];
  22. format(tmp,32,"PITEMNAME%d",item);
  23. GetPVarString(playerid,tmp,tmp2,MAX_ITEM_NAME);
  24. return tmp2;
  25. }
  26. stock _SetItemNamePVar(playerid,item,ItemName[])
  27. {
  28. new tmp[MAX_ITEM_NAME];
  29. format(tmp,MAX_ITEM_NAME,"PITEMNAME%d",item);
  30. SetPVarString(playerid,tmp,ItemName);
  31. }
  32. stock _GetItemAmountPVar(playerid,item)
  33. {
  34. new tmp[16];
  35. format(tmp,16,"PITEMAMOUNT%d",item);
  36. return GetPVarInt(playerid,tmp);
  37. }
  38. stock _SetItemAmountPVar(playerid,item,Amount)
  39. {
  40. new tmp[16];
  41. format(tmp,16,"PITEMAMOUNT%d",item);
  42. SetPVarInt(playerid,tmp,Amount);
  43. }
  44. stock AddItem(playerid,ItemName[],Amount)
  45. {
  46. new slot=-1;
  47. for(new item;item<MAX_ITEMS;item++)
  48. {
  49. if(!_GetItemAmountPVar(playerid,item))
  50. {
  51. if(slot==-1)slot=item;
  52. continue;
  53. }
  54. if(!strcmp(_GetItemNamePVar(playerid,item),ItemName,true))
  55. {
  56. _SetItemAmountPVar(playerid,item,_GetItemAmountPVar(playerid,item)+Amount);
  57. if(_GetItemAmountPVar(playerid,item)<=0)_SetItemAmountPVar(playerid,item,0);
  58. if(_GetItemAmountPVar(playerid,item)>MAX_ITEM_STACK)
  59. {
  60. _SetItemAmountPVar(playerid,item,MAX_ITEM_STACK);
  61. return 2;
  62. }
  63. return 1;
  64. }
  65. }
  66. if(slot>-1)
  67. {
  68. _SetItemNamePVar(playerid,slot,ItemName);
  69. _SetItemAmountPVar(playerid,slot,Amount);
  70. if(_GetItemAmountPVar(playerid,slot)>MAX_ITEM_STACK)
  71. {
  72. _SetItemAmountPVar(playerid,slot,MAX_ITEM_STACK);
  73. return 2;
  74. }
  75. return 1;
  76. }
  77. return 0;
  78. }
  79. stock RemoveItem(playerid,ItemName[],Amount)
  80. {
  81. for(new item;item<MAX_ITEMS;item++)
  82. {
  83. if(!_GetItemAmountPVar(playerid,item))continue;
  84. if(!strcmp(_GetItemNamePVar(playerid,item),ItemName,true))
  85. {
  86. _SetItemAmountPVar(playerid,item,_GetItemAmountPVar(playerid,item)-Amount);
  87. if(_GetItemAmountPVar(playerid,item)<=0)_SetItemAmountPVar(playerid,item,0);
  88. if(_GetItemAmountPVar(playerid,item)>MAX_ITEM_STACK)
  89. {
  90. _SetItemAmountPVar(playerid,item,MAX_ITEM_STACK);
  91. return 2;
  92. }
  93. return 1;
  94. }
  95. }
  96. return 0;
  97. }
  98. stock PlayerHasItem(playerid,ItemName[])
  99. {
  100. for(new item;item<MAX_ITEMS;item++)
  101. {
  102. if(!_GetItemAmountPVar(playerid,item))continue;
  103. if(!strcmp(_GetItemNamePVar(playerid,item),ItemName,false))return _GetItemAmountPVar(playerid,item);
  104. }
  105. return 0;
  106. }
  107. stock GetPlayerItemInfo(playerid,&idx,ItemName[],len=sizeof(ItemName),&Amount)
  108. {
  109. if(idx>=MAX_ITEMS)return 0;
  110. format(ItemName,len,_GetItemNamePVar(playerid,idx));
  111. Amount=_GetItemAmountPVar(playerid,idx);
  112. idx++;
  113. return 1;
  114. }
  115. stock ResetPlayerInventory(playerid)
  116. {
  117. for(new item;item<MAX_ITEMS;item++)_SetItemAmountPVar(playerid,item,0);
  118. }
  119. stock ShowInventory(playerid)
  120. {
  121. gItemList="";
  122. for(new item;item<MAX_ITEMS;item++)
  123. {
  124. if(!strlen(_GetItemNamePVar(playerid,item))||!_GetItemAmountPVar(playerid,item))continue;
  125. format(gItemList,sizeof(gItemList),"%s\n%d\t\t%s",gItemList,_GetItemAmountPVar(playerid,item),_GetItemNamePVar(playerid,item));
  126. }
  127. format(gItemList,sizeof(gItemList),"Amount\t\tItem Name%s",gItemList);
  128. ShowPlayerDialog(playerid,INV_DIALOG_ID,DIALOG_STYLE_LIST,"Inventory",gItemList,"Use","Close");
  129. SetPVarInt(playerid,"PUSINGDIALOG",1);
  130. }
  131. stock SaveInventory(playerid)
  132. {
  133. gItemList="";
  134. new filename[48];
  135. GetPlayerName(playerid,filename,24);
  136. format(filename,48,"Inventory/%s.inv",filename);
  137. new File:file=fopen(filename,io_write);
  138. for(new item;item<MAX_ITEMS;item++)
  139. {
  140. if(!strlen(_GetItemNamePVar(playerid,item))||!_GetItemAmountPVar(playerid,item))continue;
  141. format(gItemList,sizeof(gItemList),"%s%s\n%d\n",gItemList,_GetItemNamePVar(playerid,item),_GetItemAmountPVar(playerid,item));
  142. }
  143. fwrite(file,gItemList);
  144. fclose(file);
  145. GetPlayerName(playerid,filename,24);
  146. printf("[INV] %s[%d]'s inventory saved.",filename,playerid);
  147. }
  148. stock LoadInventory(playerid)
  149. {
  150. new tstring[48];
  151. new tstring2[12];
  152. GetPlayerName(playerid,tstring,48);
  153. format(tstring,48,"Inventory/%s.inv",tstring);
  154. if(!fexist(tstring))return 0;
  155. new File:file=fopen(tstring,io_read);
  156. fread(file,tstring);
  157. while(tstring[0])
  158. {
  159. format(tstring,strlen(tstring),"%s",tstring); //Delete last character
  160. fread(file,tstring2);
  161. AddItem(playerid,tstring,strval(tstring2));
  162. fread(file,tstring);
  163. }
  164. fclose(file);
  165. GetPlayerName(playerid,tstring,24);
  166. printf("[INV] %s[%d]'s inventory loaded.",tstring,playerid);
  167. return 1;
  168. }
  169. InventoryOnDialogResponse(playerid, dialogid, response, inputtext[])
  170. {
  171. if(dialogid!=INV_DIALOG_ID)return 1;
  172. if(!GetPVarInt(playerid,"PUSINGDIALOG"))return 1;
  173. if(!response)return 1;
  174. if(!strcmp(inputtext,"Amount",true,6))
  175. {
  176. ShowInventory(playerid);
  177. return 1;
  178. }
  179. format(gItemList,MAX_ITEM_NAME,inputtext[strfind(inputtext,"\t")+2]);
  180. if(CallLocalFunction("OnPlayerUseItem","is",playerid,gItemList))ShowInventory(playerid);
  181. else SetPVarInt(playerid,"PUSINGDIALOG",0);
  182. return 1;
  183. }
Advertisement
Add Comment
Please, Sign In to add comment