Advertisement
Guest User

Fire system

a guest
Dec 22nd, 2014
328
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 3.78 KB | None | 0 0
  1. /*
  2.     ~~Fire System~~
  3.         by Kaz
  4. */
  5. #if !defined MAX_FIRE
  6.     #define MAX_FIRE 20
  7. #endif
  8. #define FIRE_TIMER 500
  9.  
  10. // USTAWIENIA
  11.  
  12. #define TXT_TEXT "%d | %d/20%",id, Fire[id][Health] // Ogólne ustawienia 3d tekstu (id - id pożaru, health - życie pożaru) - można tutaj kolorować i takie tam
  13.  
  14. enum _fire
  15. {
  16.     bool:use,
  17.     object,
  18.     Float:fX,
  19.     Float:fY,
  20.     Float:fZ,
  21.     Text3D:info,
  22.     Health
  23. }
  24. new Fire[MAX_FIRE][_fire];
  25. new _firestr[10];
  26.  
  27. stock FireSystem_Init(){
  28.     SetTimer("FireUpdate", FIRE_TIMER, true);
  29.     return 1;
  30. }
  31.  
  32. #define HOLDING(%0) \
  33.     ((newkeys & (%0)) == (%0)) 
  34.    
  35. forward FireUpdate();
  36. public FireUpdate(){
  37.     for(new playerid; playerid < GetMaxPlayers(); playerid++){
  38.         new id = GetClosestFire(playerid);
  39.         if(id == -1) continue;
  40.         if(GetPlayerWeapon(playerid) == 42){
  41.             new newkeys,l,u;
  42.             GetPlayerKeys(playerid, newkeys, l, u);
  43.             if(HOLDING(KEY_FIRE)){ 
  44.                 if(IsPlayerLookingAtPoint(playerid, Fire[id][fX], Fire[id][fY], Fire[id][fZ])){
  45.                     if(Fire[id][Health] != 0){
  46.                         Fire[id][Health]-=1;
  47.                         format(_firestr, sizeof(_firestr),TXT_TEXT);
  48.                         Update3DTextLabelText(Fire[id][info], 0xFFFFFFFFF, _firestr);
  49.                         CallRemoteFunction("OnPlayerPutOutFire", "ddd", playerid, id, false);
  50.                     }
  51.                     else {
  52.                         DeleteFire(id);
  53.                         CallRemoteFunction("OnPlayerPutOutFire", "ddd", playerid, id, true);
  54.                     }
  55.                 }
  56.             }
  57.         }
  58.     }
  59.     return 1;
  60. }
  61.  
  62. stock AddFire(Float:X, Float:Y, Float:Z){
  63.     new id = GetFreeFireID();
  64.     if(id == -1)
  65.         return -1;
  66.     Fire[id][use] = true;
  67.     Fire[id][fX] = X;
  68.     Fire[id][fY] = Y;
  69.     Fire[id][fZ] = Z;
  70.     Fire[id][Health] = 10+random(10);
  71.     Fire[id][object] = CreateObject(3461, X, Y, Z-2.61, 0, 0, 0.0);
  72.     format(_firestr, sizeof(_firestr),TXT_TEXT);
  73.     Fire[id][info] = Create3DTextLabel(_firestr, 0xFFFFFFFFF, X, Y, Z, 20, 0);
  74.     CallRemoteFunction("OnFireAdd", "d", id);
  75.     return id;
  76. }
  77.  
  78. stock DeleteFire(id){
  79.     CallRemoteFunction("OnFireDelete", "d", id);
  80.     Fire[id][use] = false;
  81.     Fire[id][fX] = 0.0;
  82.     Fire[id][fY] = 0.0;
  83.     Fire[id][fZ] = 0.0;
  84.     Fire[id][Health] = 0;
  85.     DestroyObject(Fire[id][object]);
  86.     Fire[id][object] = -1;
  87.     Delete3DTextLabel(Fire[id][info]);
  88.     return 1;
  89. }
  90.  
  91. stock GetClosestFire(playerid){
  92.     for(new i; i < MAX_FIRE; i++){
  93.         if(Fire[i][use] == true && IsPlayerInRangeOfPoint(playerid, 1, Fire[i][fX],  Fire[i][fY],  Fire[i][fZ])){
  94.             CallRemoteFunction("OnPlayerNearFire", "dd",playerid, i);
  95.             return i;
  96.         }
  97.     }
  98.     return -1;
  99. }      
  100. stock GetFreeFireID(){
  101.     for(new i; i < MAX_FIRE; i++){
  102.         if(Fire[i][use] == false){
  103.             return i;
  104.         }
  105.     }
  106.     return -1;
  107. }
  108.  
  109. stock IsPlayerLookingAtPoint(playerid,Float:X,Float:Y,Float:Z,Float:ViewWidth=22.5,Float:ViewHeight=10.0)
  110. {
  111.     new Float:cx,Float:cy,Float:cz,Float:pa1,Float:pa2,Float:ca1,Float:ca2,Float:px,Float:py,Float:pz;
  112.     GetPlayerCameraFrontVector(playerid,cx,cy,cz);
  113.     GetPlayerPos(playerid,px,py,pz);
  114.     pz+=2.0;
  115.     cx=floatadd(cx,px);
  116.     cy=floatadd(cy,py);
  117.     cz=floatadd(cz,pz);
  118.     pa1=atan2(X-px,Y-py);
  119.     if(pa1>360)pa1=floatsub(pa1,360);
  120.     if(pa1<0)pa1=floatadd(pa1,360);
  121.     pa2=atan2(Y-py,Z-pz);
  122.     if(pa2>360)pa2=floatsub(pa2,360);
  123.     if(pa2<0)pa2=floatadd(pa2,360);
  124.     ca1=atan2(cx-px,cy-py);
  125.     if(ca1>360)ca1=floatsub(ca1,360);
  126.     if(ca1<0)ca1=floatadd(ca1,360);
  127.     ca2=atan2(cy-py,cz-pz);
  128.     if(ca2>360)ca2=floatsub(ca2,360);
  129.     if(ca2<0)ca2=floatadd(ca2,360);
  130.     if((ca1>(pa1-ViewWidth))&&(ca1<(pa1+ViewWidth))&&(ca2>(pa2-ViewHeight))&&(ca2<(pa2+ViewHeight)))return 1;
  131.     if((pa1-ViewWidth)<0)
  132.     {
  133.         ca1-=360.0;
  134.         if((ca1>(pa1-ViewWidth))&&(ca1<(pa1+ViewWidth))&&(ca2>(pa2-ViewHeight))&&(ca2<(pa2+ViewHeight)))return 1;
  135.     }
  136.     if((pa1+ViewWidth)>360)
  137.     {
  138.         ca1+=360.0;
  139.         if((ca1>(pa1-ViewWidth))&&(ca1<(pa1+ViewWidth))&&(ca2>(pa2-ViewHeight))&&(ca2<(pa2+ViewHeight)))return 1;
  140.     }
  141.     return 0;
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement