Seregamil

[FS] Dynamic Inventory System

Apr 4th, 2013
2,739
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

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×