Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //==============================================================================
- //=======================| Points Streamer v1.3 |=====================
- //=======================| Created by: White_116 |=====================
- //==============================================================================
- #include <a_samp>
- #define MAX_POINTS 501//= 500
- #define MAX_POINTS_TO_STREAM 20
- #define MAX_POINTS_REGION 3000
- #define MAX_POINTS_SETKA_DLINA 60
- #define MAX_POINTS_STORONA_DLINA ((MAX_POINTS_REGION*2)/MAX_POINTS_SETKA_DLINA)
- enum PInfo{Created, WorldId, Type1, Type2, PPosX,PPosY,PPosS,Float:px, Float:py, Float:pz, Float:Range};
- new PointInfo[MAX_POINTS][PInfo];
- new PointsSetkaInfo[MAX_POINTS_STORONA_DLINA][MAX_POINTS_STORONA_DLINA][MAX_POINTS_TO_STREAM];
- new KolvoPointsInKv[MAX_POINTS_STORONA_DLINA][MAX_POINTS_STORONA_DLINA];
- new KolvoPoints;
- new PlayerMultiPoint[MAX_PLAYERS][MAX_POINTS_TO_STREAM*9];
- new PlayerMultiPointKolvo[MAX_PLAYERS];
- new x2,y2,PointOkrug,PointOkrugPos,PointID;
- new Float:PX,Float:PY,Float:PZ;
- //new Okrug[9][2]={{0,0},{0,1},{0,-1},{1,0},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
- new Okrug[9][2]={{0,0},{0,1},{0,-2},{1,1},{-2,0},{2,1},{0,-2},{-2,2},{0,-2}};
- stock W_GetKvPosXY(region,dlina,Float:x,Float:y,&x1,&y1,p=0)
- {
- if(!p)
- {
- // создадим искуственную границу дальше которой человек неможет находится
- if(x<-region)x=-region+1;
- if(y<-region)y=-region+1;
- if(y>region)y=region-1;
- if(x>region)x=region-1;
- }
- x1=floatround((x+region)/dlina,floatround_floor);
- y1=floatround((y+region)/dlina,floatround_floor);
- return 1;
- }
- stock IsValidPoint(PointId)
- {
- if(PointId<1 || PointId>=MAX_POINTS)return 0;
- return PointInfo[PointId][Created];
- }
- stock CreatePoint(Float:x, Float:y, Float:z, Float:range,w,type1=0,type2=0)
- {
- //==================== проверяем, можно ли добавить точку...
- if(KolvoPoints>=MAX_POINTS)return 0;
- for(PointID=1;PointID<MAX_POINTS;PointID++)if(PointInfo[PointID][Created]==0)break;
- if(PointID==MAX_POINTS)return 0;
- //==================== проверяем, можно ли добавить точку...
- W_GetKvPosXY(MAX_POINTS_REGION,MAX_POINTS_SETKA_DLINA,x,y,x2,y2);// узнаём к какому квадрату относится точка
- if(KolvoPointsInKv[x2][y2]>=MAX_POINTS_TO_STREAM)// если перебор точек на 1 квадрат
- {
- return -1;
- }
- //==================== добовляем данные точки...
- PointInfo[PointID][Type1] = type1;PointInfo[PointID][Type2] = type2;
- PointInfo[PointID][PPosX] = x2;PointInfo[PointID][PPosY] = y2;PointInfo[PointID][PPosS] = KolvoPointsInKv[x2][y2];
- PointInfo[PointID][WorldId] = w;
- PointInfo[PointID][px] = x; PointInfo[PointID][py] = y; PointInfo[PointID][pz] = z;
- PointInfo[PointID][Range] = range;
- PointInfo[PointID][Created] = 1;// точка создана
- PointsSetkaInfo[x2][y2][KolvoPointsInKv[x2][y2]]=PointID;// запомним ид точки
- KolvoPointsInKv[x2][y2]++;// запомним количество точек в квадрате
- KolvoPoints++;// запомним сколько всего точек
- return PointID;// отправим ид точки
- }
- stock DestroyPoint(PointId)
- {
- if(!IsValidPoint(PointId))return 0;
- KolvoPoints--;// запомним сколько всего точек
- PointInfo[PointId][Created] = 0;// точка создана
- KolvoPointsInKv[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]]--;// запомним количество точек в квадрате
- if(KolvoPointsInKv[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]]==0)PointsSetkaInfo[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]][ 0 ]=0;
- else
- {
- new PointId2=PointsSetkaInfo[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]][ KolvoPointsInKv[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]] ];
- PointsSetkaInfo[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]][ KolvoPointsInKv[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]] ]=0;
- PointsSetkaInfo[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]][PointInfo[PointId][PPosS]]=PointId2;
- PointInfo[PointId2][PPosS] = PointInfo[PointId][PPosS];
- }
- return 1;
- }
- stock DestroyAllPoint()
- {
- KolvoPoints=0;// запомним сколько всего точек
- for(new j=1;j<MAX_POINTS;j++)PointInfo[j][Created]=0;
- for(new j;j<MAX_POINTS_STORONA_DLINA;j++)for(new k;k<MAX_POINTS_STORONA_DLINA;k++)KolvoPointsInKv[j][k]=0;
- return 1;
- }
- stock SetPointPos(PointId,Float:x,Float:y,Float:z)
- {
- if(!IsValidPoint(PointId))return 0;
- W_GetKvPosXY(MAX_POINTS_REGION,MAX_POINTS_SETKA_DLINA,x,y,x2,y2);// узнаём к какому квадрату будет относиться точка
- if(PointInfo[PointId][PPosX]!=x2 || PointInfo[PointId][PPosY]!=y2)
- {
- //==================== проверяем, можно ли добавить точку...
- if(KolvoPointsInKv[x2][y2]>=MAX_POINTS_TO_STREAM)return -1;
- //==================== перегрупперуем старый квадрат от старой точки
- KolvoPointsInKv[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]]--;// запомним количество точек в квадрате
- if(KolvoPointsInKv[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]]==0)PointsSetkaInfo[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]][ 0 ]=0;
- else
- {
- new PointId2=PointsSetkaInfo[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]][ KolvoPointsInKv[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]] ];
- PointsSetkaInfo[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]][ KolvoPointsInKv[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]] ]=0;
- PointsSetkaInfo[PointInfo[PointId][PPosX]][PointInfo[PointId][PPosY]][PointInfo[PointId][PPosS]]=PointId2;
- PointInfo[PointId2][PPosS] = PointInfo[PointId][PPosS];
- }
- //==================== добовляем данные точки...
- PointsSetkaInfo[x2][y2][KolvoPointsInKv[x2][y2]]=PointId;// запомним ид точки
- PointInfo[PointId][PPosX] = x2;
- PointInfo[PointId][PPosY] = y2;
- PointInfo[PointId][PPosS] = KolvoPointsInKv[x2][y2];
- KolvoPointsInKv[x2][y2]++;// запомним количество точек в квадрате
- }
- PointInfo[PointId][px] = x; PointInfo[PointId][py] = y; PointInfo[PointId][pz] = z;
- return 1;
- }
- stock GetPlayerPoint(playerid)
- {
- GetPlayerPos(playerid,PX,PY,PZ);
- W_GetKvPosXY(MAX_POINTS_REGION,MAX_POINTS_SETKA_DLINA,PX,PY,x2,y2);// узнаём к какому квадрату относится точка
- new WorldID=GetPlayerVirtualWorld(playerid);
- new Float:PointDist=100.0;
- new Float:PointDist2;
- new PointID2;
- for(PointOkrug=0;PointOkrug<9;PointOkrug++)
- {
- x2+=Okrug[PointOkrug][0];
- y2+=Okrug[PointOkrug][1];
- if(-1<x2<MAX_POINTS_STORONA_DLINA && -1<y2<MAX_POINTS_STORONA_DLINA)
- {
- for(PointOkrugPos=0;PointOkrugPos<KolvoPointsInKv[x2][y2];PointOkrugPos++)
- {
- PointID=PointsSetkaInfo[x2][y2][PointOkrugPos];
- if(WorldID == PointInfo[PointID][WorldId] || PointInfo[PointID][WorldId]==-1)
- {
- PointDist2 = GetPlayerDistanceFromPoint(playerid,PointInfo[PointID][px],PointInfo[PointID][py],PointInfo[PointID][pz]);
- if(PointDist2 <= PointInfo[PointID][Range])
- if(PointDist2 < PointDist)
- {
- PointDist = PointDist2;
- PointID2 = PointID;
- }
- }
- }
- }
- }
- return PointID2;
- }
- stock GetPlayerMultiPoint(playerid)
- {
- PlayerMultiPointKolvo[playerid]=0;
- GetPlayerPos(playerid,PX,PY,PZ);
- W_GetKvPosXY(MAX_POINTS_REGION,MAX_POINTS_SETKA_DLINA,PX,PY,x2,y2);// узнаём к какому квадрату относится точка
- new WorldID=GetPlayerVirtualWorld(playerid);
- for(PointOkrug=0;PointOkrug<9;PointOkrug++)
- {
- x2+=Okrug[PointOkrug][0];
- y2+=Okrug[PointOkrug][1];
- if(-1<x2<MAX_POINTS_STORONA_DLINA && -1<y2<MAX_POINTS_STORONA_DLINA)
- {
- for(PointOkrugPos=0;PointOkrugPos<KolvoPointsInKv[x2][y2];PointOkrugPos++)
- {
- PointID=PointsSetkaInfo[x2][y2][PointOkrugPos];
- if(WorldID == PointInfo[PointID][WorldId] || PointInfo[PointID][WorldId]==-1)
- {
- if(IsPlayerInRangeOfPoint(playerid,PointInfo[PointID][Range],PointInfo[PointID][px],PointInfo[PointID][py],PointInfo[PointID][pz]))
- {
- PlayerMultiPoint[playerid][PlayerMultiPointKolvo[playerid]]=PointID;
- PlayerMultiPointKolvo[playerid]++;
- }
- }
- }
- }
- }
- return 1;
- }
Add Comment
Please, Sign In to add comment