Guest User

Points Streamer v1.3

a guest
May 21st, 2012
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 8.60 KB | None | 0 0
  1. //==============================================================================
  2. //=======================|      Points Streamer v1.3      |=====================
  3. //=======================|      Created by: White_116     |=====================
  4. //==============================================================================
  5. #include <a_samp>
  6.  
  7. #define MAX_POINTS 501//= 500
  8. #define MAX_POINTS_TO_STREAM 20
  9. #define MAX_POINTS_REGION 3000
  10. #define MAX_POINTS_SETKA_DLINA 60
  11. #define MAX_POINTS_STORONA_DLINA ((MAX_POINTS_REGION*2)/MAX_POINTS_SETKA_DLINA)
  12.  
  13. enum PInfo{Created, WorldId, Type1, Type2, PPosX,PPosY,PPosS,Float:px, Float:py, Float:pz, Float:Range};
  14. new PointInfo[MAX_POINTS][PInfo];
  15.  
  16. new PointsSetkaInfo[MAX_POINTS_STORONA_DLINA][MAX_POINTS_STORONA_DLINA][MAX_POINTS_TO_STREAM];
  17. new KolvoPointsInKv[MAX_POINTS_STORONA_DLINA][MAX_POINTS_STORONA_DLINA];
  18. new KolvoPoints;
  19. new PlayerMultiPoint[MAX_PLAYERS][MAX_POINTS_TO_STREAM*9];
  20. new PlayerMultiPointKolvo[MAX_PLAYERS];
  21. new x2,y2,PointOkrug,PointOkrugPos,PointID;
  22. new Float:PX,Float:PY,Float:PZ;
  23. //new Okrug[9][2]={{0,0},{0,1},{0,-1},{1,0},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
  24.  
  25. new Okrug[9][2]={{0,0},{0,1},{0,-2},{1,1},{-2,0},{2,1},{0,-2},{-2,2},{0,-2}};
  26.  
  27.  
  28.  
  29. stock W_GetKvPosXY(region,dlina,Float:x,Float:y,&x1,&y1,p=0)
  30. {
  31.     if(!p)
  32.     {
  33.         // создадим искуственную границу дальше которой человек неможет находится
  34.         if(x<-region)x=-region+1;
  35.         if(y<-region)y=-region+1;
  36.         if(y>region)y=region-1;
  37.         if(x>region)x=region-1;
  38.     }
  39.     x1=floatround((x+region)/dlina,floatround_floor);
  40.     y1=floatround((y+region)/dlina,floatround_floor);
  41.     return 1;
  42. }
  43.  
  44. stock IsValidPoint(PointId)
  45. {
  46.     if(PointId<1 || PointId>=MAX_POINTS)return 0;
  47.     return PointInfo[PointId][Created];
  48. }
  49.  
  50. stock CreatePoint(Float:x, Float:y, Float:z, Float:range,w,type1=0,type2=0)
  51. {
  52. //==================== проверяем, можно ли добавить точку...
  53.     if(KolvoPoints>=MAX_POINTS)return 0;
  54.     for(PointID=1;PointID<MAX_POINTS;PointID++)if(PointInfo[PointID][Created]==0)break;
  55.     if(PointID==MAX_POINTS)return 0;
  56. //==================== проверяем, можно ли добавить точку...
  57.     W_GetKvPosXY(MAX_POINTS_REGION,MAX_POINTS_SETKA_DLINA,x,y,x2,y2);// узнаём к какому квадрату относится точка
  58.     if(KolvoPointsInKv[x2][y2]>=MAX_POINTS_TO_STREAM)// если перебор точек на 1 квадрат
  59.     {
  60.         return -1;
  61.     }
  62. //==================== добовляем данные точки...
  63.     PointInfo[PointID][Type1] = type1;PointInfo[PointID][Type2] = type2;
  64.     PointInfo[PointID][PPosX] = x2;PointInfo[PointID][PPosY] = y2;PointInfo[PointID][PPosS] = KolvoPointsInKv[x2][y2];
  65.     PointInfo[PointID][WorldId] = w;
  66.     PointInfo[PointID][px] = x; PointInfo[PointID][py] = y; PointInfo[PointID][pz] = z;
  67.     PointInfo[PointID][Range] = range;
  68.     PointInfo[PointID][Created] = 1;//  точка создана
  69.    
  70.     PointsSetkaInfo[x2][y2][KolvoPointsInKv[x2][y2]]=PointID;//  запомним ид точки
  71.     KolvoPointsInKv[x2][y2]++;//    запомним количество точек в квадрате
  72.     KolvoPoints++;//    запомним сколько всего точек
  73.  
  74.     return PointID;//  отправим ид точки
  75. }
  76.  
  77. stock DestroyPoint(PointId)
  78. {
  79.     if(!IsValidPoint(PointId))return 0;
  80.     KolvoPoints--;//    запомним сколько всего точек
  81.     PointInfo[PointId][Created] = 0;//  точка создана
  82.    
  83.     KolvoPointsInKv[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]]--;//  запомним количество точек в квадрате
  84.     if(KolvoPointsInKv[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]]==0)PointsSetkaInfo[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]][ 0 ]=0;
  85.     else
  86.     {
  87.         new PointId2=PointsSetkaInfo[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]][ KolvoPointsInKv[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]] ];
  88.         PointsSetkaInfo[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]][ KolvoPointsInKv[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]] ]=0;
  89.         PointsSetkaInfo[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]][PointInfo[PointId][PPosS]]=PointId2;
  90.         PointInfo[PointId2][PPosS] = PointInfo[PointId][PPosS];
  91.     }
  92.     return 1;
  93. }
  94.  
  95. stock DestroyAllPoint()
  96. {
  97.     KolvoPoints=0;//    запомним сколько всего точек
  98.     for(new j=1;j<MAX_POINTS;j++)PointInfo[j][Created]=0;
  99.     for(new j;j<MAX_POINTS_STORONA_DLINA;j++)for(new k;k<MAX_POINTS_STORONA_DLINA;k++)KolvoPointsInKv[j][k]=0;
  100.     return 1;
  101. }
  102.  
  103. stock SetPointPos(PointId,Float:x,Float:y,Float:z)
  104. {
  105.     if(!IsValidPoint(PointId))return 0;
  106.     W_GetKvPosXY(MAX_POINTS_REGION,MAX_POINTS_SETKA_DLINA,x,y,x2,y2);// узнаём к какому квадрату будет относиться точка
  107.     if(PointInfo[PointId][PPosX]!=x2 || PointInfo[PointId][PPosY]!=y2)
  108.     {
  109.         //==================== проверяем, можно ли добавить точку...
  110.         if(KolvoPointsInKv[x2][y2]>=MAX_POINTS_TO_STREAM)return -1;
  111.         //==================== перегрупперуем старый квадрат от старой точки
  112.         KolvoPointsInKv[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]]--;//  запомним количество точек в квадрате
  113.         if(KolvoPointsInKv[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]]==0)PointsSetkaInfo[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]][ 0 ]=0;
  114.         else
  115.         {
  116.             new PointId2=PointsSetkaInfo[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]][ KolvoPointsInKv[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]] ];
  117.             PointsSetkaInfo[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]][ KolvoPointsInKv[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]] ]=0;
  118.             PointsSetkaInfo[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]][PointInfo[PointId][PPosS]]=PointId2;
  119.             PointInfo[PointId2][PPosS] = PointInfo[PointId][PPosS];
  120.         }
  121.         //==================== добовляем данные точки...
  122.         PointsSetkaInfo[x2][y2][KolvoPointsInKv[x2][y2]]=PointId;//  запомним ид точки
  123.         PointInfo[PointId][PPosX] = x2;
  124.         PointInfo[PointId][PPosY] = y2;
  125.         PointInfo[PointId][PPosS] = KolvoPointsInKv[x2][y2];
  126.         KolvoPointsInKv[x2][y2]++;//    запомним количество точек в квадрате
  127.     }
  128.     PointInfo[PointId][px] = x; PointInfo[PointId][py] = y; PointInfo[PointId][pz] = z;
  129.     return 1;
  130. }
  131.  
  132. stock GetPlayerPoint(playerid)
  133. {
  134.     GetPlayerPos(playerid,PX,PY,PZ);
  135.     W_GetKvPosXY(MAX_POINTS_REGION,MAX_POINTS_SETKA_DLINA,PX,PY,x2,y2);//   узнаём к какому квадрату относится точка
  136.     new WorldID=GetPlayerVirtualWorld(playerid);
  137.     new Float:PointDist=100.0;
  138.     new Float:PointDist2;
  139.     new PointID2;
  140.  
  141.     for(PointOkrug=0;PointOkrug<9;PointOkrug++)
  142.     {
  143.         x2+=Okrug[PointOkrug][0];
  144.         y2+=Okrug[PointOkrug][1];
  145.         if(-1<x2<MAX_POINTS_STORONA_DLINA && -1<y2<MAX_POINTS_STORONA_DLINA)
  146.         {
  147.             for(PointOkrugPos=0;PointOkrugPos<KolvoPointsInKv[x2][y2];PointOkrugPos++)
  148.             {
  149.                 PointID=PointsSetkaInfo[x2][y2][PointOkrugPos];
  150.                 if(WorldID == PointInfo[PointID][WorldId] || PointInfo[PointID][WorldId]==-1)
  151.                 {
  152.                     PointDist2 = GetPlayerDistanceFromPoint(playerid,PointInfo[PointID][px],PointInfo[PointID][py],PointInfo[PointID][pz]);
  153.                     if(PointDist2 <= PointInfo[PointID][Range])
  154.                     if(PointDist2 < PointDist)
  155.                     {
  156.                         PointDist = PointDist2;
  157.                         PointID2 = PointID;
  158.                     }
  159.                 }
  160.             }
  161.         }
  162.     }
  163.     return PointID2;
  164. }
  165.  
  166. stock GetPlayerMultiPoint(playerid)
  167. {
  168.     PlayerMultiPointKolvo[playerid]=0;
  169.     GetPlayerPos(playerid,PX,PY,PZ);
  170.     W_GetKvPosXY(MAX_POINTS_REGION,MAX_POINTS_SETKA_DLINA,PX,PY,x2,y2);//   узнаём к какому квадрату относится точка
  171.     new WorldID=GetPlayerVirtualWorld(playerid);
  172.  
  173.     for(PointOkrug=0;PointOkrug<9;PointOkrug++)
  174.     {
  175.         x2+=Okrug[PointOkrug][0];
  176.         y2+=Okrug[PointOkrug][1];
  177.         if(-1<x2<MAX_POINTS_STORONA_DLINA && -1<y2<MAX_POINTS_STORONA_DLINA)
  178.         {
  179.             for(PointOkrugPos=0;PointOkrugPos<KolvoPointsInKv[x2][y2];PointOkrugPos++)
  180.             {
  181.                 PointID=PointsSetkaInfo[x2][y2][PointOkrugPos];
  182.                 if(WorldID == PointInfo[PointID][WorldId] || PointInfo[PointID][WorldId]==-1)
  183.                 {
  184.                     if(IsPlayerInRangeOfPoint(playerid,PointInfo[PointID][Range],PointInfo[PointID][px],PointInfo[PointID][py],PointInfo[PointID][pz]))
  185.                     {
  186.                         PlayerMultiPoint[playerid][PlayerMultiPointKolvo[playerid]]=PointID;
  187.                         PlayerMultiPointKolvo[playerid]++;
  188.                     }
  189.                 }
  190.             }
  191.         }
  192.     }
  193.     return 1;
  194. }
Add Comment
Please, Sign In to add comment