Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #if defined _W_OS_included
- #endinput
- #endif
- #define _W_OS_included
- #pragma library W_OS
- /*============================================================================*\
- =======================| Static Object Streamer v5.0 |===================
- =======================| Created by: White_116 |===================
- =======================| Date: 17.04.2013 |===================
- ================================================================================
- native CreateStaticObject(modelid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz, Float:dist=400.0); //Создание статического объекта
- native StartStaticObjectsStreamer(krug, time); //Запуск стримера
- native StopStaticObjectsStreamer(); //Остановка стримера
- native OS_SetPlayerPos(playerid,Float:x,Float:y); //Принудительное обновление чанков при смене позиции игрока
- native OS_PlayerConnect(playerid); //Подключение игрока
- native OS_ChunksUpdate(playerid, OldChunk, NewChunk); //Принудительное обновление чанков
- native OS_DestroyAllChunk(playerid); //Удаление всех чанков для игрока
- native MoveStaticObject(objectid, Float:x, Float:y, Float:z, Float:s, Float:rx = -1000.0, Float:ry = -1000.0, Float:rz = -1000.0); //Движение объекта
- native SetStaticObjectRot(objectid, Float:rx, Float:ry, Float:rz); //Смена ротации объекта
- native SetStaticObjectPos(objectid, Float:x, Float:y, Float:z); //Смена позиции объекта
- \*============================================================================*/
- #if !defined MAX_OBJECTS_KOLVO
- #define MAX_OBJECTS_KOLVO (5000) //Максимальное количество обьектов
- #endif
- #if !defined MAX_OBJECTS_STREAM
- #define MAX_OBJECTS_STREAM (500) //Максимальное количество обьектов для стрима(max=1000)
- #endif
- #if !defined MAX_OBJECTS_IN_CHUNK
- #define MAX_OBJECTS_IN_CHUNK (50) //Максимальное количество обьектов в чанке(max=255)
- #endif
- #define MAX_DlINA_DLYA_OBRABOTKI (3000) //Граница
- #define MAX_RAZMER_CHUNKA (80) //Длина чанка
- #define MAX_KOLV0_CHUNKOV_NA_STORONU (75) //Количество чанков на одну сторону границы (MAX_DlINA_DLYA_OBRABOTKI * 2) / MAX_RAZMER_CHUNKA
- #define MAX_CHUNKS (5626) //Количество чанков (MAX_KOLV0_CHUNKOV_NA_STORONU * MAX_KOLV0_CHUNKOV_NA_STORONU) + 1
- //#define DeBug
- //#define DinObj
- new OS_KolvoObjects;
- new OS_KolvoObjectsInChunk[MAX_CHUNKS char];
- new OS_ChunksInfo[MAX_CHUNKS][MAX_OBJECTS_IN_CHUNK];
- new OS_CCP[MAX_CHUNKS][MAX_CHUNKS char];
- new OS_CPC[MAX_CHUNKS][226];
- new OS_CreateChunks[226];
- new OS_KolvoChunksInPos[MAX_CHUNKS char];
- new OS_modelid[MAX_OBJECTS_KOLVO+1],
- OS_objectid[MAX_PLAYERS][MAX_OBJECTS_KOLVO+1],//MAX_PLAYERS
- Float:OS_x[MAX_OBJECTS_KOLVO+1],
- Float:OS_y[MAX_OBJECTS_KOLVO+1],
- Float:OS_z[MAX_OBJECTS_KOLVO+1],
- Float:OS_rx[MAX_OBJECTS_KOLVO+1],
- Float:OS_ry[MAX_OBJECTS_KOLVO+1],
- Float:OS_rz[MAX_OBJECTS_KOLVO+1],
- Float:OS_dist[MAX_OBJECTS_KOLVO+1];
- new OS_PlayerChunk[MAX_PLAYERS];
- new OS_DontUpdate[MAX_PLAYERS char];
- new OS_Timer, OS_TimerStatus, OS_Start;
- new const sorty[225][2]=
- {
- {0,0},
- //1**************
- {0,1},{0,-1},{1,0},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1},
- //2**************
- {0,2},{0,-2},{2,0},{-2,0},{2,1},{2,-1},{-2,1},{-2,-1},{1,2},{1,-2},{-1,2},{-1,-2},{2,2},{2,-2},{-2,2},{-2,-2},
- //3**************
- {0,3},{0,-3},{3,0},{-3,0},{3,1},{3,-1},{-3,1},{-3,-1},{1,3},{1,-3},{-1,3},{-1,-3},{3,2},{3,-2},{-3,2},{-3,-2},{2,3},{2,-3},{-2,3},{-2,-3},{3,3},{3,-3},{-3,3},{-3,-3},
- //4**************
- {0,4},{0,-4},{4,0},{-4,0},{4,1},{4,-1},{-4,1},{-4,-1},{1,4},{1,-4},{-1,4},{-1,-4},{4,2},{4,-2},{-4,2},{-4,-2},{2,4},{2,-4},{-2,4},{-2,-4},{4,3},{4,-3},{-4,3},{-4,-3},{3,4},{3,-4},{-3,4},{-3,-4},{4,4},{4,-4},{-4,4},{-4,-4},
- //5**************
- {0,5},{0,-5},{5,0},{-5,0},{5,1},{5,-1},{-5,1},{-5,-1},{1,5},{1,-5},{-1,5},{-1,-5},{5,2},{5,-2},{-5,2},{-5,-2},{2,5},{2,-5},{-2,5},{-2,-5},{5,3},{5,-3},{-5,3},{-5,-3},{3,5},{3,-5},{-3,5},{-3,-5},{5,4},{5,-4},{-5,4},{-5,-4},{4,5},{4,-5},{-4,5},{-4,-5},{5,5},{5,-5},{-5,5},{-5,-5},
- //6**************
- {0,6},{0,-6},{6,0},{-6,0},{6,1},{6,-1},{-6,1},{-6,-1},{1,6},{1,-6},{-1,6},{-1,-6},{6,2},{6,-2},{-6,2},{-6,-2},{2,6},{2,-6},{-2,6},{-2,-6},{6,3},{6,-3},{-6,3},{-6,-3},{3,6},{3,-6},{-3,6},{-3,-6},{6,4},{6,-4},{-6,4},{-6,-4},{4,6},{4,-6},{-4,6},{-4,-6},{6,5},{6,-5},{-6,5},{-6,-5},{5,6},{5,-6},{-5,6},{-5,-6},{6,6},{6,-6},{-6,6},{-6,-6},
- //7**************
- {0,7},{0,-7},{7,0},{-7,0},{7,1},{7,-1},{-7,1},{-7,-1},{1,7},{1,-7},{-1,7},{-1,-7},{7,2},{7,-2},{-7,2},{-7,-2},{2,7},{2,-7},{-2,7},{-2,-7},{7,3},{7,-3},{-7,3},{-7,-3},{3,7},{3,-7},{-3,7},{-3,-7},{7,4},{7,-4},{-7,4},{-7,-4},{4,7},{4,-7},{-4,7},{-4,-7},{7,5},{7,-5},{-7,5},{-7,-5},{5,7},{5,-7},{-5,7},{-5,-7},{7,6},{7,-6},{-7,6},{-7,-6},{6,7},{6,-7},{-6,7},{-6,-7},{7,7},{7,-7},{-7,7},{-7,-7}
- };
- //==============================================================================
- stock OS_GetChunkPos(Float:x,Float:y)
- {
- // создадим искуственную границу дальше которой человек неможет находится
- if(x<-MAX_DlINA_DLYA_OBRABOTKI)x=-MAX_DlINA_DLYA_OBRABOTKI+1.0;
- if(y<-MAX_DlINA_DLYA_OBRABOTKI)y=-MAX_DlINA_DLYA_OBRABOTKI+1.0;
- if(y>MAX_DlINA_DLYA_OBRABOTKI)y=MAX_DlINA_DLYA_OBRABOTKI-1.0;
- if(x>MAX_DlINA_DLYA_OBRABOTKI)x=MAX_DlINA_DLYA_OBRABOTKI-1.0;
- return ((floatround((x+MAX_DlINA_DLYA_OBRABOTKI)/MAX_RAZMER_CHUNKA,floatround_floor)*MAX_KOLV0_CHUNKOV_NA_STORONU) + floatround((y+MAX_DlINA_DLYA_OBRABOTKI)/MAX_RAZMER_CHUNKA,floatround_floor) + 1);
- }
- forward OS_ChunksUpdateForAll();
- public OS_ChunksUpdateForAll()
- {
- new Float:x,Float:y,Float:z;
- new NewChunk;
- for(new playerid=OS_TimerStatus; playerid < MAX_PLAYERS; playerid+=10) // пройдёмся по всем игрокам
- if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid) && !OS_DontUpdate{playerid}) // если для него не замороженна обработка
- {
- GetPlayerPos(playerid,x,y,z); // найдём позицию
- new vehicleid=GetPlayerVehicleID(playerid);
- if(vehicleid)
- {
- GetVehicleZAngle(vehicleid, z);
- x+=(MAX_RAZMER_CHUNKA * floatsin(-z, degrees));
- y+=(MAX_RAZMER_CHUNKA * floatcos(-z, degrees));
- }
- NewChunk=OS_GetChunkPos(x,y);
- if(OS_PlayerChunk[playerid] != NewChunk)
- {
- #if !defined DeBug
- OS_ChunksUpdate(playerid, OS_PlayerChunk[playerid], NewChunk);
- #else
- new str[128], tick=GetTickCount();
- OS_ChunksUpdate(playerid, OS_PlayerChunk[playerid], NewChunk);
- format(str, 128, "Update. {00FF00}Time {FF0000}%d{FFFFFF}, {00FF00}chunk {FF0000}%d{FFFFFF}", GetTickCount()-tick, NewChunk);
- SendClientMessage(playerid,-1,str);
- #endif
- }
- }
- if(OS_TimerStatus == 9) OS_TimerStatus=0; else OS_TimerStatus++;
- return 1;
- }
- stock OS_ChunksUpdate(playerid, OldChunk, NewChunk)
- {
- OS_CreateChunks=OS_CPC[NewChunk];
- for(new i=OS_KolvoChunksInPos{OldChunk}; i ; i--)
- if(OS_CCP[NewChunk]{OS_CPC[OldChunk][i]}) OS_CreateChunks[OS_CCP[NewChunk]{OS_CPC[OldChunk][i]}]=0; else OS_DestroyChunk(playerid,OS_CPC[OldChunk][i]);
- for(new i=OS_KolvoChunksInPos{NewChunk}; i ; i--)
- if(OS_CreateChunks[i]) OS_CreateChunk(playerid,OS_CreateChunks[i]);
- OS_PlayerChunk[playerid]=NewChunk;
- }
- stock OS_CreateChunk(playerid,id)
- {
- for(new k, i=OS_KolvoObjectsInChunk{id}-1; i > -1; i--)
- {
- k=OS_ChunksInfo[id][i];
- OS_objectid[playerid][k]=CreatePlayerObject(playerid,OS_modelid[k],OS_x[k],OS_y[k],OS_z[k],OS_rx[k],OS_ry[k],OS_rz[k],OS_dist[k]);
- }
- }
- stock OS_DestroyChunk(playerid,id)
- {
- for(new i=OS_KolvoObjectsInChunk{id}-1; i > -1; i--)
- {
- DestroyPlayerObject(playerid,OS_objectid[playerid][ OS_ChunksInfo[id][i] ]);
- #if defined DinObj
- OS_objectid[playerid][ OS_ChunksInfo[id][i] ]=0;
- #endif
- }
- }
- stock OS_DestroyAllChunk(playerid)
- {
- for(new k=OS_KolvoChunksInPos{OS_PlayerChunk[playerid]}; k ; k--)OS_DestroyChunk(playerid, OS_CPC[OS_PlayerChunk[playerid]][k]);
- OS_PlayerChunk[playerid]=0;
- }
- //==============================================================================
- stock CreateStaticObject(modelid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz, Float:dist=400.0)
- {
- if(modelid < 1)
- {
- #if defined DeBug
- printf("W_OS-Ошибка: Не верное значение modelid =%d=", modelid);
- #endif
- return -2;
- }
- if(OS_KolvoObjects >= MAX_OBJECTS_KOLVO)// если достигли лимита
- {
- #if defined DeBug
- printf("W_OS-Ошибка: Количество объектов привышает максимально допустимого значения MAX_OBJECTS_KOLVO =%d=", MAX_OBJECTS_KOLVO);
- #endif
- return 0;
- }
- new chunk=OS_GetChunkPos(x,y);
- if(OS_KolvoObjectsInChunk{chunk} >= MAX_OBJECTS_IN_CHUNK)// если перебор объектов на 1 ячейку
- {
- #if defined DeBug
- printf("W_OS-Ошибка: Чанк =%d= заполнен, придел MAX_OBJECTS_IN_CHUNK =%d=", chunk, MAX_OBJECTS_IN_CHUNK);
- #endif
- return -1;// если перебор точек на 1 квадрат
- }
- OS_KolvoObjects++;// установим новый ид
- OS_ChunksInfo[chunk][OS_KolvoObjectsInChunk{chunk}]=OS_KolvoObjects;// запомним ид объекта
- OS_KolvoObjectsInChunk{chunk}++;// запомним количество объектов в ячейке
- OS_modelid[OS_KolvoObjects]=modelid;
- OS_x[OS_KolvoObjects]=x;
- OS_y[OS_KolvoObjects]=y;
- OS_z[OS_KolvoObjects]=z;
- OS_rx[OS_KolvoObjects]=rx;
- OS_ry[OS_KolvoObjects]=ry;
- OS_rz[OS_KolvoObjects]=rz;
- OS_dist[OS_KolvoObjects]=dist;
- return OS_KolvoObjects;
- }
- stock StaticObjectsAnaliz(krug)
- {
- #if defined DeBug
- printf("\t\t%d объектов подготовленно на анализ.\n\t\tЗапуск анализа.", OS_KolvoObjects);
- new tick=GetTickCount();
- #endif
- new g=(krug + krug + 1)*(krug + krug + 1);
- for(new x; x < MAX_KOLV0_CHUNKOV_NA_STORONU; x++)
- for(new y=1; y <= MAX_KOLV0_CHUNKOV_NA_STORONU; y++)
- {
- new kolvo;
- new KvPos=((x*MAX_KOLV0_CHUNKOV_NA_STORONU) + y);
- for(new i;i<g;i++)
- {
- StaticObjectsA(KvPos,kolvo,x,y,i);
- if(kolvo == MAX_OBJECTS_STREAM)break;
- }
- for(new s=1, i=OS_KolvoChunksInPos{KvPos}-1; i > -1; )
- {
- OS_CPC[KvPos][s]=OS_CreateChunks[i];
- OS_CCP[KvPos]{OS_CreateChunks[i]}=s;
- s++;
- i--;
- }
- }
- #if defined DeBug
- printf("\t\tАнализ завершён! Длительность анализа %d мс.", GetTickCount()-tick);
- #endif
- return 1;
- }
- stock StaticObjectsA(KvPos,&kolvo,x,y,i)
- if(kolvo < MAX_OBJECTS_STREAM)
- {
- x+=sorty[i][0];
- y+=sorty[i][1];
- if(0 <= x < MAX_KOLV0_CHUNKOV_NA_STORONU)
- if(0 < y <= MAX_KOLV0_CHUNKOV_NA_STORONU)
- {
- new chunk=((x*MAX_KOLV0_CHUNKOV_NA_STORONU) + y);
- if(OS_KolvoObjectsInChunk{chunk})
- if((kolvo+OS_KolvoObjectsInChunk{chunk}) < MAX_OBJECTS_STREAM)
- {
- kolvo+=OS_KolvoObjectsInChunk{chunk}; //отправим количество ебъектов
- OS_CreateChunks[OS_KolvoChunksInPos{KvPos}]=chunk;
- OS_KolvoChunksInPos{KvPos}++;
- }
- }
- }
- //==============================================================================
- //==============================================================================
- //==============================================================================
- #if defined DinObj
- //OS_MovePlayerObject(playerid, objectid, Float:X, Float:Y, Float:Z, Float:Speed, Float:RotX = -1000.0, Float:RotY = -1000.0, Float:RotZ = -1000.0)
- stock MoveStaticObject(objectid, Float:x, Float:y, Float:z, Float:s, Float:rx = -1000.0, Float:ry = -1000.0, Float:rz = -1000.0)
- {
- if(0 < objectid < MAX_OBJECTS_KOLVO)// если достигли лимита
- if(OS_modelid[objectid])
- {
- OS_x[objectid]=x;
- OS_y[objectid]=y;
- OS_z[objectid]=z;
- if(rx != -1000.0)
- {
- OS_rx[objectid]=rx;
- OS_ry[objectid]=ry;
- OS_rz[objectid]=rz;
- for(new playerid; playerid < MAX_PLAYERS; playerid++)
- if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid) && !OS_DontUpdate{playerid})
- if(OS_objectid[playerid][objectid]) MovePlayerObject(playerid, OS_objectid[playerid][objectid], x, y, z, s, rx, ry, rz);
- return 1;
- }
- for(new playerid; playerid < MAX_PLAYERS; playerid++)
- if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid) && !OS_DontUpdate{playerid})
- if(OS_objectid[playerid][objectid]) MovePlayerObject(playerid, OS_objectid[playerid][objectid], x, y, z, s);
- return 1;
- }
- return 0;
- }
- stock SetStaticObjectPos(objectid, Float:x, Float:y, Float:z)
- {
- if(0 < objectid < MAX_OBJECTS_KOLVO)// если достигли лимита
- if(OS_modelid[objectid])
- {
- OS_x[objectid]=x;
- OS_y[objectid]=y;
- OS_z[objectid]=z;
- for(new playerid; playerid < MAX_PLAYERS; playerid++)
- if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid) && !OS_DontUpdate{playerid})
- if(OS_objectid[playerid][objectid]) SetPlayerObjectPos(playerid, OS_objectid[playerid][objectid], x, y, z);
- return 1;
- }
- return 0;
- }
- stock SetStaticObjectRot(objectid, Float:rx, Float:ry, Float:rz)
- {
- if(0 < objectid < MAX_OBJECTS_KOLVO)// если достигли лимита
- if(OS_modelid[objectid])
- {
- OS_rx[objectid]=rx;
- OS_ry[objectid]=ry;
- OS_rz[objectid]=rz;
- for(new playerid; playerid < MAX_PLAYERS; playerid++)
- if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid) && !OS_DontUpdate{playerid})
- if(OS_objectid[playerid][objectid]) SetPlayerObjectRot(playerid, OS_objectid[playerid][objectid], rx, ry, rz);
- return 1;
- }
- return 0;
- }
- #endif
- //==============================================================================
- //==============================================================================
- //==============================================================================
- forward StartStaticObjectsStreamer(krug, time);
- public StartStaticObjectsStreamer(krug, time)
- {
- if(OS_Start)
- {
- #if defined DeBug
- print("W_OS-Ошибка: Стример уже был запушен!");
- #endif
- return -1;
- }
- if(!(0 < krug < 8))
- {
- #if defined DeBug
- printf("W_OS-Ошибка: Не верное количество кругов обработки =%d=", krug);
- #endif
- return -2;
- }
- OS_Start=1;
- StaticObjectsAnaliz(krug);//1..7
- OS_Timer=SetTimer("OS_ChunksUpdateForAll", time, 1);// 1 секунда, 200-2 секунды
- return OS_Timer;
- }
- forward StopStaticObjectsStreamer();
- public StopStaticObjectsStreamer()
- {
- if(!OS_Start)
- {
- #if defined DeBug
- print("W_OS-Ошибка: Стример не был запушен!");
- #endif
- return -1;
- }
- KillTimer(OS_Timer);
- for(new playerid; playerid < MAX_PLAYERS; playerid++) if(IsPlayerConnected(playerid) && OS_PlayerChunk[playerid]) OS_DestroyAllChunk(playerid);
- return 1;
- }
- forward OS_SetPlayerPos(playerid,Float:x,Float:y);
- public OS_SetPlayerPos(playerid,Float:x,Float:y)
- {
- if(!IsPlayerConnected(playerid) && IsPlayerNPC(playerid) && OS_DontUpdate{playerid})return 0;
- new NewChunk=OS_GetChunkPos(x,y);
- if(OS_PlayerChunk[playerid]!=NewChunk)OS_ChunksUpdate(playerid, OS_PlayerChunk[playerid], NewChunk);
- return 1;
- }
- forward OS_PlayerConnect(playerid);
- public OS_PlayerConnect(playerid)
- {
- for(new i; i < MAX_OBJECTS_KOLVO; i++) OS_objectid[playerid][i]=0;
- OS_PlayerChunk[playerid]=0;
- OS_DontUpdate{playerid}=0;
- }
- #undef MAX_OBJECTS_STREAM
- #undef MAX_OBJECTS_IN_CHUNK
- #undef MAX_DlINA_DLYA_OBRABOTKI
- #undef MAX_RAZMER_CHUNKA
- #undef MAX_KOLV0_CHUNKOV_NA_STORONU
- #undef MAX_CHUNKS
Add Comment
Please, Sign In to add comment