RaFaeLs

## SA:MP RaFaeL's area include ##

Jan 27th, 2013
276
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 3.69 KB | None | 0 0
  1. /*
  2.  *                              rl_areas 0.1.2
  3.  *        All right reserved! © By: RaFaeL
  4.  *
  5.  * Owner                : RaFaeL
  6.  * Time                 : 27.01.2013
  7.  *
  8.  * Thanks to:
  9.  *                      RaFaeL                           - Scripting, PAWN
  10.  *                      SA:MP Team past, present, future - SA:MP.
  11.  *
  12.  *
  13.  * Functions:
  14.  *          IsValidAreaID(areaid) - Check if areaID is vaild
  15.  *          CreateArea(X, Y, Z, Radius = DEFAULT_RADIUS, Interior = -1, VirtualWorld = -1) - Create new area (return: areaid)
  16.  *          DestroyArea(areaid) - Destroy created area
  17.  *          IsPlayerInArea(playerid, areaid) - Check if player in specific area
  18.  *          IsPlayerInAnyArea(playerid) - Check if player in any area
  19.  *          GetPlayerArea(playerid) - Get player area
  20.  *
  21.  * CallBacks:
  22.  *          OnPlayerEnterArea(playerid, areaid) - When player get's into area
  23.  *          OnPlayerExitArea(playerid, areaid) - When player get's out of area
  24.  *
  25.  * Update:
  26.  *      27.01.2013:
  27.  *          Other:              - First Release
  28.  *                              - Bug fixed
  29.  *
  30.  */
  31.  
  32. #if defined rl_areas
  33.     #error areas is already defined!
  34. #endif
  35. #define rl_areas
  36.  
  37. #define MAX_AREAS      50
  38. #define STREAM_RATE    500
  39. #define DEFAULT_RADIUS 5.0
  40.  
  41. #define IsValidAreaID(%0) (%0 > 0 && %0 < MAX_AREAS && aInfo[%0][_aUsed])
  42.  
  43. enum aENUM {
  44.         bool:_aUsed,
  45.         Float:_aX,
  46.         Float:_aY,
  47.         Float:_aZ,
  48.         Float:_aRadius,
  49.         _aInterior,
  50.         _aVirtualWorld
  51.     };
  52.    
  53. new
  54.     aInfo[MAX_AREAS][aENUM],
  55.     SERVICE_timer = -1,
  56.     actualAreas[MAX_PLAYERS] = {-1, ...};
  57.    
  58. forward OnPlayerExitArea(playerid, areaid);
  59. forward OnPlayerEnterArea(playerid, areaid);
  60.    
  61. stock CreateArea(Float:X, Float:Y, Float:Z, Float:Radius = DEFAULT_RADIUS, Interior = -1, VirtualWorld = -1) {
  62.     new
  63.         areaid = 1;
  64.     while(areaid < MAX_AREAS && aInfo[areaid][_aUsed]) areaid++;
  65.     if(areaid >= MAX_AREAS) return printf("[warning] You reached maximum number of areas (now: %d)", MAX_AREAS);
  66.    
  67.     if(SERVICE_timer == -1) {
  68.         SERVICE_timer = SetTimer("SERVICE_check", STREAM_RATE, true);
  69.     }
  70.    
  71.     aInfo[areaid][_aUsed] = true;
  72.    
  73.     aInfo[areaid][_aX] = X;
  74.     aInfo[areaid][_aY] = Y;
  75.     aInfo[areaid][_aZ] = Z;
  76.     aInfo[areaid][_aRadius] = Radius;
  77.    
  78.     aInfo[areaid][_aInterior] = Interior;
  79.     aInfo[areaid][_aVirtualWorld] = VirtualWorld;
  80.    
  81.     return areaid;
  82. }
  83. stock DestroyArea(areaid) {
  84.     if(!IsValidAreaID(areaid)) return 0;
  85.     aInfo[areaid][aUsed] = false;
  86.     return 1;
  87. }
  88.  
  89. stock IsPlayerInArea(playerid, areaid)
  90.     return (areaid > 0 && actualAreas[playerid] == areaid);
  91.    
  92. stock IsPlayerInAnyArea(playerid)
  93.     return (actualAreas[playerid] != -1);
  94.    
  95. stock GetPlayerArea(playerid)
  96.     return actualAreas[playerid];
  97.    
  98. forward SERVICE_check();
  99. public SERVICE_check() {
  100.     for(new i = 0, j = MAX_PLAYERS; i <j; i++) if(IsPlayerConnected(i)) {
  101.         new
  102.             Float:prevdist = 100000.00,
  103.             areaid = -1;
  104.        
  105.         for(new area = 0, armax = MAX_AREAS; area < armax; area++) if(aInfo[area][_aUsed] &&
  106.         (aInfo[area][_aVirtualWorld] == -1 || GetPlayerVirtualWorld(i) == aInfo[area][_aVirtualWorld]) && (aInfo[area][_aInterior] == -1 || GetPlayerInterior(i) == aInfo[area][_aInterior]) &&
  107.         IsPlayerInRangeOfPoint(i, aInfo[area][_aRadius], aInfo[area][_aX], aInfo[area][_aY], aInfo[area][_aZ]) && GetPlayerDistanceFromPoint(i, aInfo[area][_aX], aInfo[area][_aY], aInfo[area][_aZ]) < prevdist) {
  108.             prevdist = GetPlayerDistanceFromPoint(i, aInfo[area][_aX], aInfo[area][_aY], aInfo[area][_aZ]);
  109.             areaid = area;
  110.         }
  111.        
  112.         if(actualAreas[i] != areaid) {
  113.             if(actualAreas[i] != 0) CallLocalFunction("OnPlayerExitArea", "dd", i, actualAreas[i]);
  114.             actualAreas[i] = areaid;
  115.             if(areaid != 0) CallLocalFunction("OnPlayerEnterArea", "dd", i, actualAreas[i]);
  116.         }
  117.     }
  118.     return 1;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment