ZiGGi

CarRealDestroy

May 17th, 2011
801
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 5.38 KB | None | 0 0
  1. /*
  2.  
  3.     Название: CarRealDestroy
  4.     Описание: позволяет гореть транспорту определённое время и тушить его огнетушителем
  5.     Автор: ZiGGi
  6.     Версия: 1.0
  7.    
  8.     Справка: если лаганёт, то тачка может бахнуть.
  9.              уменьшать значения в тушении не рекомендуется;)
  10.  
  11. */
  12.  
  13.  
  14. #include <a_samp>
  15.  
  16. #define CAR_AMOUNT 2000 // количество всего транспорта
  17. #define CAR_TIME_KILL 90 // через сколько секунд взорвётся тачка
  18.  
  19. new veh_fiered[CAR_AMOUNT char];
  20. new veh_kill[CAR_AMOUNT char];
  21. new veh_stew[CAR_AMOUNT char];
  22. new veh_time[CAR_AMOUNT];
  23. new veh_spawned[CAR_AMOUNT char];
  24. new fixcar1timer,fixcar2timer,osttimer,vttimer;
  25.  
  26. public OnFilterScriptInit()
  27. {
  28.     osttimer = SetTimer("OneSecondTimer",1000,1);
  29.     vttimer = SetTimer("VehTimer",100,1);
  30.    
  31.     for(new veh_id=0;veh_id<CAR_AMOUNT;veh_id++)
  32.     {
  33.         if(GetVehicleModel(veh_id) == 0) continue;
  34.         veh_fiered{veh_id} = 0;
  35.         veh_kill{veh_id} = 0;
  36.         veh_stew{veh_id} = 0;
  37.         veh_time[veh_id] = 0;
  38.         veh_spawned{veh_id} = 1;
  39.     }
  40.     print("CarRealDestroy init");
  41.     return 1;
  42. }
  43.  
  44. public OnFilterScriptExit()
  45. {
  46.     if(osttimer != 0) KillTimer(osttimer);
  47.     if(vttimer != 0) KillTimer(vttimer);
  48.    
  49.     for(new veh_id=0;veh_id<CAR_AMOUNT;veh_id++)
  50.     {
  51.         veh_fiered{veh_id} = 0;
  52.         veh_kill{veh_id} = 0;
  53.         veh_stew{veh_id} = 0;
  54.         veh_time[veh_id] = 0;
  55.         veh_spawned{veh_id} = 0;
  56.     }
  57.     print("CarRealDestroy exit");
  58.     return 1;
  59. }
  60.  
  61. public OnVehicleDeath(vehicleid, killerid)
  62. {
  63.     veh_time[vehicleid] = 0;
  64.     veh_kill{vehicleid} = 0;
  65.     veh_fiered{vehicleid} = 0;
  66.     veh_stew{vehicleid} = 0;
  67.     return 1;
  68. }
  69.  
  70. public OnVehicleSpawn(vehicleid)
  71. {
  72.     veh_fiered{vehicleid} = 0;
  73.     veh_kill{vehicleid} = 0;
  74.     veh_stew{vehicleid} = 0;
  75.     veh_time[vehicleid] = 0;
  76.     veh_spawned{vehicleid} = 1;
  77.     return 1;
  78. }
  79.  
  80. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  81. {
  82.     if((newkeys & KEY_FIRE) && !(oldkeys & KEY_FIRE) && GetPlayerWeapon(playerid) == 42) // 42 - огнетушитель
  83.     {
  84.         new veh_id = GetPlayerToFaceVehicleID(playerid,4);
  85.         if(veh_id == -1 || veh_fiered{veh_id} == 0) return 0;
  86.         veh_stew{veh_id} = 1;
  87.         VehicleFiered(playerid,veh_id);
  88.         return 1;
  89.     }
  90.     return 1;
  91. }
  92.  
  93. // тушим тачку
  94. forward VehicleFiered(playerid,veh_id);
  95. public VehicleFiered(playerid,veh_id)
  96. {
  97.     new Float:veh_hp;
  98.     GetVehicleHealth(veh_id,veh_hp);
  99.     SetVehicleHealth(veh_id,veh_hp+10);
  100.     if(veh_hp > 250) SetVehicleHealth(veh_id,251);
  101.     new keys,ud,lr;
  102.     GetPlayerKeys(playerid,keys,ud,lr);
  103.     if(!(keys & KEY_FIRE) && GetPlayerWeapon(playerid) == 42)
  104.     {
  105.         veh_stew{veh_id} = 0;
  106.         if(veh_hp > 250)
  107.         {
  108.             veh_fiered{veh_id} = 0;
  109.             veh_kill{veh_id} = 0;
  110.             veh_time[veh_id] = 0;
  111.             return 0;
  112.         }
  113.         FixCar1(veh_id);
  114.         return 0;
  115.     }
  116.     SetTimerEx("VehicleFiered",100, 0, "dd",playerid,veh_id);
  117.     return 1;
  118. }
  119. //
  120.  
  121. // проверяем тачки на горение
  122. forward VehTimer();
  123. public VehTimer()
  124. {
  125.     for(new veh_id=0,Float:veh_hp;veh_id<CAR_AMOUNT;veh_id++)
  126.     {
  127.         if(GetVehicleModel(veh_id) == 0) continue;
  128.         GetVehicleHealth(veh_id,veh_hp);
  129.         if(veh_hp <= 250 && veh_spawned{veh_id} == 1)
  130.         {
  131.             if(veh_fiered{veh_id} == 0 && veh_kill{veh_id} == 0)
  132.             {
  133.                 veh_fiered{veh_id} = 1;
  134.                 FixCar1(veh_id);
  135.             }
  136.         }
  137.     }
  138.     return 1;
  139. }
  140. //
  141.  
  142. // колдуем с здоровьем тачки
  143. forward FixCar1(vehid);
  144. public FixCar1(vehid)
  145. {
  146.     if(veh_stew{vehid} == 1) return 1;
  147.     SetVehicleHealth(vehid,200);
  148.     if(veh_fiered{vehid} == 1 && veh_kill{vehid} == 0) fixcar2timer = SetTimerEx("FixCar2",300,0,"d",vehid);
  149.     return 1;
  150. }
  151.  
  152. forward FixCar2(vehid);
  153. public FixCar2(vehid)
  154. {
  155.     if(veh_stew{vehid} == 1) return 1;
  156.     SetVehicleHealth(vehid,500);
  157.     fixcar1timer = SetTimerEx("FixCar1",60,0,"d",vehid);
  158.     return 1;
  159. }
  160. //
  161.  
  162. // отсчёт времени до взрыва тачки
  163. forward OneSecondTimer();
  164. public OneSecondTimer()
  165. {
  166.     for(new veh_id=0;veh_id<CAR_AMOUNT;veh_id++)
  167.     {
  168.         if(GetVehicleModel(veh_id) == 0) continue;
  169.         if(veh_fiered{veh_id} == 1)
  170.         {
  171.             veh_time[veh_id]++;
  172.             if(veh_time[veh_id] >= CAR_TIME_KILL)
  173.             {
  174.                 KillTimer(fixcar1timer);
  175.                 KillTimer(fixcar2timer);
  176.                 veh_time[veh_id] = 0;
  177.                 veh_kill{veh_id} = 1;
  178.                 veh_fiered{veh_id} = 0;
  179.                 veh_spawned{veh_id} = 0;
  180.                 SetVehicleHealth(veh_id,200);
  181.             }
  182.         }
  183.     }
  184.     return 1;
  185. }
  186. //
  187.  
  188. stock GetPlayerToFaceVehicleID(playerid,Float:radius)
  189. {
  190.     #define range 60
  191.     new Float:X,Float:Y,Float:Z,Float:pA;
  192.     GetPlayerPos(playerid, X, Y, Z);
  193.     GetPlayerFacingAngle(playerid, pA);
  194.     for(new veh_id=0,Float:vX,Float:vY,Float:vZ,Float:ang;
  195.         veh_id<2000;
  196.         veh_id++
  197.     )
  198.     {
  199.         if(!IsVehicleStreamedIn(veh_id,playerid)) continue;
  200.         GetVehiclePos(veh_id, vX, vY, vZ);
  201.         if(!IsPlayerInRangeOfPoint(playerid,radius,vX,vY,vZ)) continue;
  202.  
  203.         if( Y > vY ) ang = (-acos((X - vX) / floatsqroot((X - vX)*(X - vX) + (Y - vY)*(Y - vY))) - 90.0);
  204.         else if( Y < vY && X < vX ) ang = (acos((X - vX) / floatsqroot((X - vX)*(X - vX) + (Y - vY)*(Y - vY))) - 450.0);
  205.         else if( Y < vY ) ang = (acos((X - vX) / floatsqroot((X - vX)*(X - vX) + (Y - vY)*(Y - vY))) - 90.0);
  206.  
  207.         if(AngleInRangeOfAngle(-ang, pA, range)) return veh_id;
  208.     }
  209.     #undef range
  210.     return -1;
  211. }
  212.  
  213. stock AngleInRangeOfAngle(Float:a1, Float:a2, Float:range)
  214. {
  215.  
  216.     a1 -= a2;
  217.     if((a1 < range) && (a1 > -range)) return true;
  218.  
  219.     return false;
  220.  
  221. }
Advertisement
Add Comment
Please, Sign In to add comment