Guest User

DGuns code (FS mode)

a guest
Feb 3rd, 2011
610
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 16.14 KB | None | 0 0
  1. // Рекомандация поставить стример от инкогнито, и интегрировать этот ФС в мод. так же, найти закоментеную систему удаления оружия через семь дней, и включить её самостоятельно.
  2. #include <a_samp>
  3. #include <core>
  4. #include <file>
  5. #include <streamer>
  6. // если нет стримера...
  7. //измените:
  8. //  CreateDynamicObject на CreateObject,
  9. //  SetDynamicObjectPos - SetObjectPos,
  10. //  DeleteDynamicObject - DeleteObject,
  11. //и измените MAX_DGUNS на 100 или меньше
  12.  
  13. #define MAX_DGUNS 2048 //помоему оптимальное число (для динам. объектов)
  14.  
  15. enum GunsI
  16. {
  17.     g_gid,  g_exist,    g_gun,  g_ammo, g_date, Float:g_c[4],
  18. }
  19.  
  20. new DGuns[MAX_DGUNS][GunsI];
  21. new Split[MAX_DGUNS][16];
  22. new ts[256];
  23. new bigone[4096]; // если не устраивает размер...
  24. new dialnearguns = 114, dialsameguns = 115; // можете поставить свои значения, если уже используюься
  25.  
  26. forward LoadDGuns();
  27.  
  28. public OnFilterScriptInit()
  29. {
  30.     // сдесь типо нада написать какуюнить бесполезную хрень, типо такойто скрипт, от такого то автора, успешно загружен?))
  31.     LoadDGuns(); // когда то же они должны загружаться? хтя можно и без этого.
  32.     return 1;
  33. }
  34.  
  35. public OnFilterScriptExit()
  36. {
  37.     SaveDGuns(); // выберите сами, когда оружие будет сохраняться. если не будут - как хотите
  38.     return 1;
  39. }
  40. main(){}
  41. stock GetWeaponNameEx(gun) // 90% имен смотрел на gta-wikia.com, там приведены самые вероятные имена оружий и машин
  42. {
  43.     new z[32];
  44.     switch(gun)
  45.     {
  46.         case  0:     z = "Кулак"; // у себя на сервере использую вот такие имена оружий. уберите комент, что бы тоже их использовать.
  47.     /*
  48.         case  1:    z = "Кастет";
  49.         case  16:   z = "F3 Frag grenade";
  50.         case  18:   z = "Molotov Burner";
  51.         case  23:   z = "USP Silienced";
  52.         case  22:   z = "Glock 17";
  53.         case  24:   z = "Desert Eagle .50";
  54.         case  25:   z = "Benelly M2 Tactical";
  55.         case  27:   z = "SPAS-12";
  56.         case  29:   z = "HK54";
  57.         case  30:    z = "AK-47";
  58.         case  31:    z = "Colt M733";
  59.         case  33:    z = "Remington 1870";
  60.         case  34:    z = "CZ550";
  61.         case  35:    z = "RPG-7 Heat";
  62.         case  36:    z = "FGM-148 Javelin";
  63.         case  51:    z = "(Взорвал)";
  64.     */
  65.         default: GetWeaponName(gun,z,32);
  66.     }
  67.     return z;
  68. }
  69.  
  70. stock DGunDate() // авто удаление оружия через X дней (стоит 7) если их не подобрали. например, в другом моде проверка на удаление происходит в час ночи.
  71. {
  72.     for(new i = 0; i < MAX_DGUNS; i++)
  73.     {
  74.         if(DGuns[i][g_exist] == 1)
  75.         {
  76.             DGuns[i][g_date]++;
  77.             if(DGuns[i][g_date] > 7) ClearDGun(i);
  78.         }
  79.     }
  80. }
  81.  
  82. stock GetWeaponModel(weaponid) // сделал Double-O-Seven. прям такой сложный код, что нужно оставить копирайты...
  83. {
  84.     switch(weaponid)
  85.     {
  86.         case 1:     return 331;
  87.         case 2..8:  return weaponid+331;
  88.         case 9:     return 341;
  89.         case 10..15:return weaponid+311;
  90.         case 16..18:return weaponid+326;
  91.         case 22..29:return weaponid+324;
  92.         case 30,31: return weaponid+325;
  93.         case 32:    return 372;
  94.         case 33..45:return weaponid+324;
  95.         case 46:    return 371;
  96.     }
  97.     return 0;
  98. }
  99.  
  100. stock GetWeaponIDOnSlot(playerid,slot)
  101. {
  102.     new g, b;   GetPlayerWeaponData(playerid, slot, g, b)return g;
  103. }
  104.  
  105. stock RemovePlayerWeapon(playerid, weaponid)
  106. {
  107.     if(weaponid <= 0 || weaponid > 50)    return false;
  108.     new saveweapon[13],saveammo[13];
  109.     for(new slot = 0; slot < 13; slot++)    GetPlayerWeaponData(playerid, slot, saveweapon[slot], saveammo[slot]);
  110.     ResetPlayerWeapons(playerid);
  111.     for(new slot; slot < 13; slot++)
  112.     {
  113.         if(saveweapon[slot] == weaponid)    continue;
  114.         else GivePlayerWeapon(playerid, saveweapon[slot], saveammo[slot]);
  115.     }
  116.     GivePlayerWeapon(playerid, 0, 1);
  117.     return true;
  118. }
  119.  
  120. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  121. {
  122.     if(dialogid == dialnearguns)
  123.     {
  124.         if(response)
  125.         {
  126.             new nn[16], zz[16], gun, id;
  127.             format(nn,16,"NearGun%d",listitem); format(zz,16,"NearGunId%d",listitem);
  128.             gun = GetPVarInt(playerid, nn); id = GetPVarInt(playerid, zz);
  129.             if(HasSameGun(playerid, gun))
  130.             {
  131.                 SetPVarInt(playerid,"TempGun",gun); SetPVarInt(playerid,"TempGunID",id);
  132.                 format(ts,256,"{FFFFFF}Вы пытаетесь взять оружие, которое у вас уже есть\n\n\nУ вас есть \n{00FF00}%s{FFFFFF}\n\nВы пытаетесь взять\n{00FF00}%s{FFFFFF}",  GetWeaponNameOnSlot(playerid, GetGunSlot(gun)), GetWeaponNameEx(gun));
  133.                 return ShowPlayerDialog(playerid, dialsameguns, DIALOG_STYLE_MSGBOX, "Вопрос", ts, "Обменять", "Отмена");
  134.             }
  135.             format(ts,256,"* %s подбирает %s *", GetPlayerNameEx(playerid), GetWeaponNameEx(gun));
  136.             NearMessage(playerid, 0x00FF00FF, 17.5, ts);
  137.             GivePlayerWeapon(playerid, gun, DGuns[id][g_ammo]);
  138.             ClearDGun(id);
  139.         }
  140.         else { /* на ваше усмотрение */ }
  141.     }
  142.     if(dialogid == dialsameguns)
  143.     {
  144.         if(response)
  145.         {
  146.             new gun = GetPVarInt(playerid,"TempGun");
  147.             DropGun(playerid, GetWeaponIDOnSlot(playerid, GetGunSlot(gun) ) );
  148.             format(ts,256,"* %s подбирает %s *", GetPlayerNameEx(playerid), GetWeaponNameEx(gun));
  149.             NearMessage(playerid, 0x00FF00FF, 17.5, ts);
  150.             GivePlayerWeapon(playerid, GetPVarInt(playerid,"TempGun"), DGuns[ GetPVarInt(playerid,"TempGunID") ][g_ammo]);
  151.             ClearDGun(GetPVarInt(playerid,"TempGunID"));
  152.         }
  153.         else NearGuns(playerid);
  154.     }
  155.     return 0;
  156. }
  157.  
  158.  
  159. public OnPlayerDeath(playerid, killerid, reason)
  160. {
  161.     DropGun(playerid, GetPlayerWeapon(playerid)); // когда игрог дохнет, он теряет оружие, которое было в руках. можете отключить.
  162.     return 1;
  163. }
  164.  
  165. public OnPlayerText(playerid, text[])
  166. {
  167.     if(text[0] == 'g' && strlen(text) == 1) // если игрок вводит в консоль символ g, и жмет Enter, оружие выбрасываеться
  168.     {
  169.         DropGun(playerid, GetPlayerWeapon(playerid));       return 0; // можете сделать по другому, например по команде.
  170.     }
  171.     return 1;
  172. }
  173.  
  174. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  175. {
  176.     if(newkeys == 2 && !IsPlayerInAnyVehicle(playerid)) NearGuns(playerid); // по нажатии кнопки "присесть" (2) проверяем,есть ли рядом оружие. можете изменить кнопку.
  177.     return 1;
  178. }
  179. // Загрузка из файла
  180. public LoadDGuns()
  181. {
  182.     new string[2048], File:file = fopen("guns.ini"); // стандартный путь - scriptfiles/guns.ini, можете изменить
  183.     if(!fexist("guns.ini")) fopen("guns.ini", io_write);
  184.     for(new i = 0; i < MAX_DGUNS; i++)
  185.     {
  186.         fread(file, string);        split(string, Split, '|');
  187.         DGuns[i][g_exist] = strval(Split[0]);
  188.         if(DGuns[i][g_exist] == 1)
  189.         {
  190.             DGuns[i][g_gun] = strval(Split[1]);         DGuns[i][g_ammo]= strval(Split[2]);         DGuns[i][g_date]= strval(Split[3]);
  191.             DGuns[i][g_c][0] = floatstr(Split[4]);      DGuns[i][g_c][1] = floatstr(Split[5]);      DGuns[i][g_c][2] = floatstr(Split[6]);  DGuns[i][g_c][3] = floatstr(Split[7]);
  192.             DGuns[i][g_gid] = CreateDynamicObject(GetWeaponModel(DGuns[i][g_gun]), floatstr(Split[4]), floatstr(Split[5]), floatstr(Split[6]), 90.0, 0.0, floatstr(Split[7]));
  193.         }
  194.     }
  195.     fclose(file);
  196. }
  197. stock SaveDGuns() // оохранение
  198. {
  199.     new File:fileX = fopen("GF/guns.ini", io_write), position[128];  fclose(fileX);  fileX = fopen("guns.ini", io_append);
  200.     for(new i = 0; i < MAX_DGUNS; i++)
  201.     {
  202.         format(position,128,"%d|%d|%d|%d|%f|%f|%f|%f|\n",DGuns[i][g_exist], DGuns[i][g_gun],DGuns[i][g_ammo],DGuns[i][g_date],DGuns[i][g_c][0],DGuns[i][g_c][1],DGuns[i][g_c][2],DGuns[i][g_c][3]);fwrite(fileX, position);
  203.     }
  204.     fclose(fileX);
  205. }
  206.  
  207. stock HasSameGun(playerid, gun) // сток определения, есть ли у игрока в инвентаре оружие, которое он хочет взять.
  208. {
  209.     for(new i = 0; i < 47; i++)
  210.     {
  211.         new gun_2 = GetWData(playerid, i, 3); // берем айди оружия для i
  212.         if(gun_2 == gun) continue; //  ...
  213.         if(GetWData(playerid, i, 2) <= 0) continue; // если нету патронов
  214.         switch(gun_2)
  215.         {
  216.             case 02..09:    if(gun >= 02 && gun <= 09) return true;
  217.             case 10..15:    if(gun >= 10 && gun <= 15) return true;
  218.             case 22..24:    if(gun >= 22 && gun <= 24) return true;
  219.             case 25..27:    if(gun >= 25 && gun <= 27) return true;
  220.             case 28..29, 32:if(gun == 28 || gun == 29 || gun == 32) return true;
  221.             case 16..18, 39:if(gun >= 16 && gun <= 18 || gun == 39) return true;
  222.             case 35..38:    if(gun >= 35 && gun <= 38) return true;
  223.             case 30..31:    if(gun == 30 || gun == 31) return true;
  224.             case 33, 34:    if(gun == 33 || gun == 34) return true;
  225.             case 41..43:    if(gun >= 41 && gun <= 43) return true;
  226.             case 44..46:    if(gun >= 44 && gun <= 46) return true;
  227.         }
  228.     }
  229.     return false;
  230. }
  231.  
  232. stock DropGun(playerid, weaponid) // сброс оружия
  233. {
  234.     if(weaponid == 0) return false;
  235.     new id = -1;
  236.     for(new i = 0; i < MAX_DGUNS; i++)
  237.     {
  238.         if(DGuns[i][g_exist] == 0) { id = i; break; }
  239.     }
  240.     if(id == -1) return false;
  241.    
  242.     DGuns   [id]    [g_exist]   = 1;
  243.     DGuns   [id]    [g_gun]     = weaponid;
  244.     DGuns   [id]    [g_ammo]    = GetWData(playerid, weaponid, 2);
  245.     DGuns   [id]    [g_date]    = 0;
  246.    
  247.     new Float:f[4], ang = random(360);
  248.    
  249.     GetPlayerPos(playerid,f[0],f[1],f[2]);    GetXYBehindPlayer(playerid, f[0], f[1], -0.75);
  250.  
  251.     DGuns[id][g_c][0] = f[0];    DGuns[id][g_c][1] = f[1];    DGuns[id][g_c][2] = f[2] - 0.95;  DGuns[id][g_c][3] = ang;
  252.  
  253.     DGuns[id][g_gid] = CreateDynamicObject(GetWeaponModel(weaponid),f[0], f[1], f[2] - 0.95, 90.0,0.0, ang);
  254.     RemovePlayerWeapon(playerid, weaponid);
  255.     format(ts, 256, "* %s кидает %s на землю *", GetPlayerNameEx(playerid), GetWeaponNameEx(weaponid) );
  256.     NearMessage(playerid, 0xFF0000AA, 15.0, ts);
  257.     SaveDGuns();
  258.     return true;}
  259.  
  260. stock ClearDGun(id)
  261. {
  262.     DGuns[id][g_exist]= 0;  DGuns[id][g_gun]  = 0;  DGuns[id][g_ammo] = 0;  DGuns[id][g_date] = 0;
  263.     DGuns[id][g_c][0] = 0;  DGuns[id][g_c][1] = 0;  DGuns[id][g_c][2] = 0;  DGuns[id][g_c][3] = 0;
  264.     DestroyDynamicObject(DGuns[id][g_gid]); SaveDGuns();    return true;
  265. }
  266.  
  267. stock NearGuns(playerid) // проверяем близжайшее оружие от игрока
  268. {
  269.     new nn[16], bool:id = false;
  270.     for(new wy = 0; wy < 32; wy++) // проверяем Пивары игрока
  271.     {
  272.         format(nn,16,"NearGun%d",wy); // форматируем NN
  273.         SetPVarInt(playerid,nn,0); // она устанавливаеться на ствол
  274.         format(nn,16,"NearGunId%d",wy); // форматируем 2 переменную
  275.         SetPVarInt(playerid,nn,0); // это айди ствола
  276.     }
  277.     for(new i = 0; i < MAX_DGUNS; i++)
  278.     {
  279.         if(DGuns[i][g_exist] == 1 && IsPlayerInRangeOfPoint(playerid,3.5, DGuns[i][g_c][0], DGuns[i][g_c][1], DGuns[i][g_c][2])) // если ствол существует, и мы около него (3.5 м)
  280.         {
  281.             id = true; //ставим проверку, что хоть 1 ствол найден
  282.             for(new wy = 0; wy < 32; wy++) // проверяем пвары игрока
  283.             {
  284.                 format(nn,16,"NearGun%d",wy); // форматируем NN
  285.                 if(GetPVarInt(playerid,nn) == 0) // если её не существует
  286.                 {
  287.                     SetPVarInt(playerid,nn,DGuns[i][g_gun]); // она устанавливаеться на ствол
  288.                     format(nn,16,"NearGunId%d",wy); // форматируем 2 переменную
  289.                     SetPVarInt(playerid,nn,i); // это айди ствола
  290.                     wy=33; // прекращаем этот подцикл. можно и break. но одинаковое кол-во символов...
  291.                 }
  292.                 else continue; // если она существует, уже задана, идем дальше
  293.             }
  294.         }
  295.     }
  296.     if(!id) return false;
  297.     else { ProceedPickupDialog(playerid); SLAP(playerid,0); }
  298.     return true;
  299. }
  300.  
  301. stock ProceedPickupDialog(playerid) // создание диалога о подборе оружия.
  302. {
  303.     bigone = "";
  304.     new nn[16], zz[16], ss[128];
  305.     for(new i = 0; i < 32; i++)
  306.     {
  307.         format(nn,16,"NearGun%d",i);
  308.         if(GetPVarInt(playerid,nn) > 0)
  309.         {
  310.             format(zz,16,"NearGunId%d",i);
  311.             format(ss,128,"%s - %d ammo\n", GetWeaponNameEx(GetPVarInt(playerid,nn)), DGuns[ GetPVarInt(playerid,zz) ][g_ammo]);
  312.             strins(bigone,ss,strlen(bigone));
  313.         }
  314.     }
  315.     return ShowPlayerDialog(playerid, dialnearguns, DIALOG_STYLE_LIST, "Оружие рядом", bigone, "Взять", "Закрыть");
  316. }
  317. // функции
  318.  
  319. stock GetXYBehindPlayer(playerid, &Float:x, &Float:y, Float:distance) // определение позиции позади игрока
  320. {
  321.     new Float:a;
  322.     GetPlayerPos(playerid, x, y, a);
  323.     GetPlayerFacingAngle(playerid, a);
  324.     if(GetPlayerVehicleID(playerid))
  325.     {
  326.         GetVehicleZAngle(GetPlayerVehicleID(playerid), a);
  327.     }
  328.     x += (distance * floatsin(-a+180, degrees));
  329.     y += (distance * floatcos(-a+180, degrees));
  330. }
  331.  
  332. stock GetWeaponNameOnSlot(playerid,slot)
  333. {
  334.     new g, b, a[128];   GetPlayerWeaponData(playerid, slot, g, b);
  335.     format(a,256,"%s",GetWeaponNameEx(g));
  336.     if(!g) format(a,128,"%s",GetWeaponNameEx(0));
  337.     return a;
  338. }
  339.  
  340. stock GetGunSlot(gun)
  341. {
  342.     switch(gun)
  343.     {
  344.         case 0,1:       return 0;
  345.         case 2..9:      return 1;
  346.         case 22..24:    return 2;
  347.         case 25..27:    return 3;
  348.         case 28,29,32:  return 4;
  349.         case 30,31:     return 5;
  350.         case 33,34:     return 6;
  351.         case 35..38:    return 7;
  352.         case 16..18,39: return 8;
  353.         case 41..43:    return 9;
  354.         case 10..15:    return 10;
  355.         case 44..46:    return 11;
  356.         case 40:        return 12;
  357.     }
  358.     return -1;
  359. }
  360.  
  361. stock split(const strsrc[],strdest[][],delimiter) // известный скрипт написаный непомню кем.
  362. {
  363.     new i, li, aNum, len;
  364.     while(i <= strlen(strsrc))
  365.     {
  366.         if(strsrc[i] == delimiter || i == strlen(strsrc))
  367.         {
  368.             len = strmid(strdest[aNum],strsrc,li,i,128);
  369.             strdest[aNum][len] = 0;
  370.             li = i+1;
  371.             aNum++;
  372.         }
  373.         i++;
  374.     }
  375.     return 1;
  376. }
  377.  
  378. stock GetWData(playerid, gun, task) //скрипт определения имееться ли у игрока оружие, патроны к нему, и т.д.
  379. {
  380.     new getw, geta;
  381.     GetPlayerWeaponData(playerid, GetGunSlot(gun), getw, geta);
  382.     if(task == 0) // имеет ли нужное оружие?
  383.     {
  384.         if  (geta > 0 && getw == gun) return 1;
  385.         else return 404;
  386.     }
  387.     if(task == 1) RemovePlayerWeapon(playerid, gun); // забрать нужно оружие, помоему бессмысленно...
  388.     if(task == 2) return geta; // возвращает кол-во патронов
  389.     if(task == 3) return getw; // возврашает айди оружия.
  390.     return true;
  391. }
  392.  
  393. stock NearMessage(playerid, color, Float:range, text[])
  394. {
  395.     new Float:f[3];  GetPlayerPos(playerid, f[0], f[1], f[2]);
  396.     for(new i = 0; i < MAX_PLAYERS; i++)
  397.     {
  398.         if(IsPlayerInRangeOfPoint(i,range, f[0], f[1], f[2]) && GetPlayerInterior(i) == GetPlayerInterior(playerid))   SendClientMessage(i, color, text);
  399.     }
  400. }
  401.  
  402. stock SLAP(playerid,power)
  403. {
  404.     new Float:x, Float:y, Float:z;  GetPlayerPos(playerid,x,y,z);   SetPlayerPos(playerid,x,y,z+power);
  405. }
  406.  
  407. stock GetPlayerNameEx(playerid) // определение имени игрока, и убирание нижний прочерков
  408. {
  409.     new string[24], str[24];   GetPlayerName(playerid,string,24);
  410.     strmid(str,string,0,strlen(string),24);
  411.     for(new i = 0; i < MAX_PLAYER_NAME; i++)
  412.     {
  413.         if (str[i] == '_')  str[i] = ' ';
  414.     }
  415.     return str;
  416. }
Advertisement
Add Comment
Please, Sign In to add comment