Seregamil

[FS] Dynamic Inventory System

Apr 4th, 2013
2,674
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.  
  3. Система инвентаря
  4. Под все создано 60 слотов, из них 47 - оружие
  5. Для добавления новых предметов - добавьте строчки с вашими названиями в OnGameModeInit
  6. Для того, чтобы ваши предметы заработали - редактируйте функцию switchItem, и измените действие в диалоге ID 22
  7.  
  8. Все предметы, лежащие в инвентаре - полностью сохраняются в директорию inventory/%s.ini, где '%s' - ник игрока
  9. Максимум задействованных слотов для игрока - 20
  10.  
  11.  
  12. Так же спасибо Games & Alex009
  13. */
  14.  
  15. #include <a_samp>
  16. #include mxINI
  17.  
  18. new WeaponNames[47][] = {
  19. "Unarmed","Brass Knuckless","Golf Club","Night Stick","Knife","Basketball Bat","Shovel","Pool Cue",
  20. "Katana","Chainsaw","Purple Dildo","White Dildo","Long White Dildo","White Dildo 2","Flowers","Cane",
  21. "Grenades","Tear Gas","Molotovs","Missle1","Missle2","Missle3","Pistol","Silenced Pistol","Desert Eagle","Shotgun",
  22. "Sawn Off Shotgun","Combat Shotgun","Micro UZI","MP5","AK-47","M4","Tec9","Rifle","Sniper Rifle","RPG",
  23. "Rocket Launcher","Flame Thrower","Minigun","Sachet Chargers","Detonator","Spry Paint","Fire Extinguer",
  24. "Camera","Nightvision Goggles","Thermal Goggles","Parachute"};
  25.  
  26. #define dcmd(%1,%2,%3) if ((strcmp((%3)[1], #%1, true, (%2)) == 0) && ((((%3)[(%2) + 1] == 0) && (dcmd_%1(playerid, "")))||(((%3)[(%2) + 1] == 32) && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1
  27.  
  28. #define MAX_ITEMS 60
  29. #define MAX_PLAYER_ITEM 20
  30.  
  31. new item[MAX_PLAYERS][MAX_ITEMS];
  32. new used[MAX_PLAYERS];
  33. new np[MAX_PLAYERS][MAX_ITEMS];
  34. new npname[MAX_ITEMS][100];
  35. new ida[MAX_ITEMS];
  36. new loading[MAX_ITEMS];
  37.  
  38. main()
  39. {
  40.     print("\n----------------------------------");
  41.     print(" Dynamic Inventory system by Seregamil");
  42.     print("----------------------------------\n");
  43. }
  44.  
  45.  
  46. public OnGameModeInit()
  47. {
  48.     for(new i;i!=47;i++) format(npname[i],100,"%s",WeaponNames[i])/*,printf("NAME: %s | ID: %d",WeaponNames[i],i)*/;
  49.     return 1;
  50. }
  51.  
  52. addItem(playerid,id,name[],value)
  53. {
  54.     if(GetPVarInt(playerid,name) != 0) SetPVarInt(playerid,name,GetPVarInt(playerid,name)+value);
  55.     else SetPVarInt(playerid,name,value);
  56.     new str[128];
  57.     format(str,128,"{a3ff00}%s {ffffff}было обновлено в инвентаре. Стало {a3ff00}[%d]",name,GetPVarInt(playerid,name));
  58.     SendClientMessage(playerid,-1,str);
  59.     item[playerid][id]+=value;
  60.     used[playerid]++;
  61.     np[playerid][id] = GetPVarInt(playerid,name);
  62. }
  63.  
  64. removeItem(playerid,name[],id)
  65. {
  66.     SetPVarInt(playerid,name,0);
  67.     new str[128];
  68.     format(str,128,"{a3ff00}%s{ffffff} было удалено из инвентаря",npname[id]);
  69.     SendClientMessage(playerid,-1,str);
  70.     item[playerid][id]=0;
  71.     used[playerid]--;
  72.     np[playerid][id] = 0;
  73. }
  74.  
  75. infoAllItem(playerid)
  76. {
  77.     new str[300];
  78.     for(new q;q!=MAX_ITEMS;q++) ida[q]=0;
  79.     for(new i;i!=MAX_ITEMS;i++)
  80.     {
  81.         if(item[playerid][i]!=0)
  82.         {
  83.             format(str,sizeof(str),"{ffffff}%s%s | {a3ff00}%d\n",str, npname[i],np[playerid][i]);
  84.             ida[i] = 1;
  85.         }
  86.     }
  87.     ShowPlayerDialog(playerid,15,DIALOG_STYLE_LIST,"  ",str,"Okay","");
  88.     return 1;
  89. }
  90.  
  91. funcItem(playerid,id)
  92. {
  93.     new name[24];
  94.     GetPlayerName(playerid,name,24);
  95.     new str1[100];
  96.     format(str1,100,"{a3ff00}]%s[ {ffffff}Предмет {a3ff00}[%s {ffffff}| {a3ff00}%d]",name,npname[id],np[playerid][id]);
  97.     ShowPlayerDialog(playerid,22,DIALOG_STYLE_LIST,str1,"Использовать\nПередать\nВыбросить","Выбор","Отмена");
  98.     SetPVarInt(playerid,"Clicked",id);
  99. }
  100.  
  101. public OnPlayerConnect(playerid)
  102. {
  103.     for(new x;x!=MAX_ITEMS;x++) item[playerid][x] = 0,np[playerid][x] = 0;
  104.     used[playerid] = 0;
  105.     loadInt(playerid);
  106.     return 1;
  107. }
  108.  
  109. loadInt(playerid)
  110. {
  111.     for(new q;q!=MAX_ITEMS;q++) loading[q] = 0;
  112.     new name[24];
  113.     GetPlayerName(playerid,name,24);
  114.     new str[100];
  115.     format(str,100,"inventory/%s.ini",name);
  116.     if(!fexist(str))
  117.     {
  118.         new file = ini_createFile(str);
  119.         if(file<0) ini_openFile(str);
  120.         for(new x;x!=MAX_ITEMS;x++)
  121.         {
  122.             new str2[100];
  123.             format(str2,100,"Inv%d",x);
  124.             ini_setInteger(playerid,str2,0);
  125.         }
  126.         ini_closeFile(file);
  127.     }
  128.     else
  129.     {
  130.         new file = ini_openFile(str);
  131.         for(new x;x!=MAX_ITEMS;x++)
  132.         {
  133.             new str2[100];
  134.             format(str2,100,"Inv%d",x);
  135.             ini_getInteger(playerid,str2,loading[x]);
  136.             if(loading[x] != 0) addItem(playerid,x,npname[x],loading[x]);
  137.         }
  138.         ini_closeFile(file);
  139.     }
  140. }
  141.  
  142. public OnPlayerDisconnect(playerid, reason)
  143. {
  144.     saveInt(playerid);
  145.     for(new x;x!=MAX_ITEMS;x++) item[playerid][x] = 0,np[playerid][x] = 0;
  146.     used[playerid] = 0;
  147.     return 1;
  148. }
  149.  
  150. saveInt(playerid)
  151. {
  152.     new name[24];
  153.     GetPlayerName(playerid,name,24);
  154.     new str[100];
  155.     format(str,100,"inventory/%s.ini",name);
  156.     if(fexist(str))
  157.     {
  158.         new file = ini_openFile(str);
  159.         for(new x;x!=MAX_ITEMS;x++)
  160.         {
  161.             new str2[100];
  162.             format(str2,100,"Inv%d",x);
  163.             ini_setInteger(playerid,str2,item[playerid][x]);
  164.             removeItem(playerid,npname[x],x);
  165.         }
  166.         ini_closeFile(file);
  167.     }
  168. }
  169.  
  170. public OnPlayerCommandText(playerid, cmdtext[])
  171. {
  172.     dcmd(add,3,cmdtext);
  173.     dcmd(info,4,cmdtext);
  174.     return 0;
  175. }
  176.  
  177. dcmd_add(playerid,params[])
  178. {
  179.     #pragma unused params
  180.     if(used[playerid] == MAX_PLAYER_ITEM) return SendClientMessage(playerid,-1,"MAX");
  181.     if(GetPlayerWeapon(playerid)!=0) addItem(playerid,GetPlayerWeapon(playerid),WeaponNames[GetPlayerWeapon(playerid)],GetPlayerAmmo(playerid));
  182.     RemovePlayerWeapon(playerid, GetPlayerWeapon(playerid));
  183.     return 1;
  184. }
  185.  
  186. RemovePlayerWeapon(playerid, weaponid)
  187. {
  188.     if(!IsPlayerConnected(playerid) || weaponid < 0 || weaponid > 50) return;
  189.     new saveweapon[13], saveammo[13];
  190.     for(new slot = 0; slot < 13; slot++) GetPlayerWeaponData(playerid, slot, saveweapon[slot], saveammo[slot]);
  191.     ResetPlayerWeapons(playerid);
  192.     for(new slot; slot < 13; slot++)
  193.     {
  194.         if(saveweapon[slot] == weaponid || saveammo[slot] == 0) continue;
  195.         GivePlayerWeapon(playerid, saveweapon[slot], saveammo[slot]);
  196.     }
  197.     GivePlayerWeapon(playerid, 0, 1);
  198. }
  199.  
  200. dcmd_info(playerid,params[])
  201. {
  202.     #pragma unused params
  203.     infoAllItem(playerid);
  204.     return 1;
  205. }
  206.  
  207. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  208. {
  209.     if(dialogid == 15)
  210.     {
  211.         if(response)
  212.         {
  213.             new listid = 0;
  214.             for(new i;i!=MAX_ITEMS;i++)
  215.             {
  216.                 if(ida[i] == 1)
  217.                 {
  218.                     if(item[playerid][i] != 0)
  219.                     {
  220.                         if(listitem!=listid) listid++;
  221.                         else
  222.                         {
  223.                             funcItem(playerid,i);
  224.                             for(new x;x!=MAX_ITEMS;x++) ida[x]=0;
  225.                             break;
  226.                         }
  227.                     }
  228.                 }
  229.             }
  230.             return true;
  231.         }
  232.     }
  233.     if(dialogid == 22)
  234.     {
  235.         if(!response) return infoAllItem(playerid);
  236.         if(response)
  237.         {
  238.             if(listitem == 0)
  239.             {
  240.                 if(switchItem(GetPVarInt(playerid,"Clicked")) == 0)
  241.                 {
  242.                     GivePlayerWeapon(playerid,GetPVarInt(playerid,"Clicked"),item[playerid][GetPVarInt(playerid,"Clicked")]);
  243.                     removeItem(playerid,npname[GetPVarInt(playerid,"Clicked")],GetPVarInt(playerid,"Clicked"));
  244.                     SendClientMessage(playerid,-1,"Вы начали использовать предмет");
  245.                 }
  246.             }
  247.             if(listitem == 1) ShowPlayerDialog(playerid,23,DIALOG_STYLE_INPUT,"  ","Введите ID игрока, которому хотите передать данный предмет","Ок","Назад");
  248.             if(listitem == 2) removeItem(playerid,npname[GetPVarInt(playerid,"Clicked")],GetPVarInt(playerid,"Clicked"));
  249.         }
  250.         return true;
  251.     }
  252.     if(dialogid == 23)
  253.     {
  254.         if(!response) return infoAllItem(playerid);
  255.         if(response)
  256.         {
  257.             new id = strval(inputtext);
  258.             if(!IsPlayerConnected(id)) return SendClientMessage(playerid,-1,"Данный игрок отсутствует на нашем сервере");
  259.             if(id == playerid) return SendClientMessage(playerid,-1,"Чувак, это ты");
  260.             if(used[id] == MAX_PLAYER_ITEM) return SendClientMessage(playerid,-1,"У этого игрока инвентарь полон");
  261.             addItem(id,GetPVarInt(playerid,"Clicked"),npname[GetPVarInt(playerid,"Clicked")],np[playerid][GetPVarInt(playerid,"Clicked")]);
  262.             new str[256],name[24];
  263.             GetPlayerName(playerid,name,24);
  264.             format(str,256,"{ffffff}Игрок {a3ff00}%s {ffffff}передал вам предмет {a3ff00}%s [%d]",name,npname[GetPVarInt(playerid,"Clicked")],np[playerid][GetPVarInt(playerid,"Clicked")]);
  265.             ShowPlayerDialog(id,24,DIALOG_STYLE_MSGBOX,"  ",str,"Ок","");
  266.             removeItem(playerid,npname[GetPVarInt(playerid,"Clicked")],GetPVarInt(playerid,"Clicked"));
  267.         }
  268.         return true;
  269.     }
  270.     return 1;
  271. }
  272.  
  273. switchItem(id)
  274. {
  275.     #define WEAPON_ITEM 0
  276.     switch(id)
  277.     {
  278.         case 0..46: return WEAPON_ITEM;
  279.     }
  280.     return -1;
  281. }
RAW Paste Data