Guest User

Static Object Streamer v5.0

a guest
Apr 17th, 2013
301
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 16.42 KB | None | 0 0
  1. #if defined _W_OS_included
  2.     #endinput
  3. #endif
  4. #define _W_OS_included
  5. #pragma library W_OS
  6. /*============================================================================*\
  7. =======================|    Static Object Streamer v5.0     |===================
  8. =======================|      Created by: White_116         |===================
  9. =======================|        Date: 17.04.2013            |===================
  10. ================================================================================
  11. native CreateStaticObject(modelid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz, Float:dist=400.0);                      //Создание статического объекта
  12. native StartStaticObjectsStreamer(krug, time);                                                                                      //Запуск стримера
  13. native StopStaticObjectsStreamer();                                                                                                 //Остановка стримера
  14. native OS_SetPlayerPos(playerid,Float:x,Float:y);                                                                                   //Принудительное обновление чанков при смене позиции игрока
  15. native OS_PlayerConnect(playerid);                                                                                                  //Подключение игрока
  16. native OS_ChunksUpdate(playerid, OldChunk, NewChunk);                                                                               //Принудительное обновление чанков
  17. native OS_DestroyAllChunk(playerid);                                                                                                //Удаление всех чанков для игрока
  18.  
  19. native MoveStaticObject(objectid, Float:x, Float:y, Float:z, Float:s, Float:rx = -1000.0, Float:ry = -1000.0, Float:rz = -1000.0);  //Движение объекта
  20. native SetStaticObjectRot(objectid, Float:rx, Float:ry, Float:rz);                                                                  //Смена ротации объекта
  21. native SetStaticObjectPos(objectid, Float:x, Float:y, Float:z);                                                                     //Смена позиции объекта
  22. \*============================================================================*/
  23. #if !defined MAX_OBJECTS_KOLVO
  24.     #define MAX_OBJECTS_KOLVO               (5000)      //Максимальное количество обьектов
  25. #endif
  26. #if !defined MAX_OBJECTS_STREAM
  27.     #define MAX_OBJECTS_STREAM              (500)       //Максимальное количество обьектов для стрима(max=1000)
  28. #endif
  29. #if !defined MAX_OBJECTS_IN_CHUNK
  30.     #define MAX_OBJECTS_IN_CHUNK            (50)        //Максимальное количество обьектов в чанке(max=255)
  31. #endif
  32. #define MAX_DlINA_DLYA_OBRABOTKI            (3000)      //Граница
  33. #define MAX_RAZMER_CHUNKA                   (80)        //Длина чанка
  34. #define MAX_KOLV0_CHUNKOV_NA_STORONU        (75)        //Количество чанков на одну сторону границы                 (MAX_DlINA_DLYA_OBRABOTKI * 2) / MAX_RAZMER_CHUNKA
  35. #define MAX_CHUNKS                          (5626)      //Количество чанков                                         (MAX_KOLV0_CHUNKOV_NA_STORONU * MAX_KOLV0_CHUNKOV_NA_STORONU) + 1
  36.  
  37. //#define DeBug
  38. //#define DinObj
  39.  
  40. new OS_KolvoObjects;
  41. new OS_KolvoObjectsInChunk[MAX_CHUNKS char];
  42. new OS_ChunksInfo[MAX_CHUNKS][MAX_OBJECTS_IN_CHUNK];
  43.  
  44. new OS_CCP[MAX_CHUNKS][MAX_CHUNKS char];
  45. new OS_CPC[MAX_CHUNKS][226];
  46. new OS_CreateChunks[226];
  47. new OS_KolvoChunksInPos[MAX_CHUNKS char];
  48.  
  49. new OS_modelid[MAX_OBJECTS_KOLVO+1],
  50.     OS_objectid[MAX_PLAYERS][MAX_OBJECTS_KOLVO+1],//MAX_PLAYERS
  51.     Float:OS_x[MAX_OBJECTS_KOLVO+1],
  52.     Float:OS_y[MAX_OBJECTS_KOLVO+1],
  53.     Float:OS_z[MAX_OBJECTS_KOLVO+1],
  54.     Float:OS_rx[MAX_OBJECTS_KOLVO+1],
  55.     Float:OS_ry[MAX_OBJECTS_KOLVO+1],
  56.     Float:OS_rz[MAX_OBJECTS_KOLVO+1],
  57.     Float:OS_dist[MAX_OBJECTS_KOLVO+1];
  58.  
  59. new OS_PlayerChunk[MAX_PLAYERS];
  60. new OS_DontUpdate[MAX_PLAYERS char];
  61. new OS_Timer, OS_TimerStatus, OS_Start;
  62.  
  63. new const sorty[225][2]=
  64. {
  65. {0,0},
  66. //1**************
  67. {0,1},{0,-1},{1,0},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1},
  68. //2**************
  69. {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},
  70. //3**************
  71. {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},
  72. //4**************
  73. {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},
  74. //5**************
  75. {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},
  76. //6**************
  77. {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},
  78. //7**************
  79. {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}
  80. };
  81.  
  82. //==============================================================================
  83. stock OS_GetChunkPos(Float:x,Float:y)
  84. {
  85.     // создадим искуственную границу дальше которой человек неможет находится
  86.     if(x<-MAX_DlINA_DLYA_OBRABOTKI)x=-MAX_DlINA_DLYA_OBRABOTKI+1.0;
  87.     if(y<-MAX_DlINA_DLYA_OBRABOTKI)y=-MAX_DlINA_DLYA_OBRABOTKI+1.0;
  88.     if(y>MAX_DlINA_DLYA_OBRABOTKI)y=MAX_DlINA_DLYA_OBRABOTKI-1.0;
  89.     if(x>MAX_DlINA_DLYA_OBRABOTKI)x=MAX_DlINA_DLYA_OBRABOTKI-1.0;
  90.  
  91.     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);
  92. }
  93.  
  94. forward OS_ChunksUpdateForAll();
  95. public OS_ChunksUpdateForAll()
  96. {
  97.     new Float:x,Float:y,Float:z;
  98.     new NewChunk;
  99.    
  100.     for(new playerid=OS_TimerStatus; playerid < MAX_PLAYERS; playerid+=10)  // пройдёмся по всем игрокам
  101.     if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid) && !OS_DontUpdate{playerid})   // если для него не замороженна обработка
  102.     {
  103.         GetPlayerPos(playerid,x,y,z);   // найдём позицию
  104.         new vehicleid=GetPlayerVehicleID(playerid);
  105.         if(vehicleid)
  106.         {
  107.             GetVehicleZAngle(vehicleid, z);
  108.             x+=(MAX_RAZMER_CHUNKA * floatsin(-z, degrees));
  109.             y+=(MAX_RAZMER_CHUNKA * floatcos(-z, degrees));
  110.         }
  111.         NewChunk=OS_GetChunkPos(x,y);
  112.         if(OS_PlayerChunk[playerid] != NewChunk)
  113.         {
  114.             #if !defined DeBug
  115.                 OS_ChunksUpdate(playerid, OS_PlayerChunk[playerid], NewChunk);
  116.             #else
  117.                 new str[128], tick=GetTickCount();
  118.                 OS_ChunksUpdate(playerid, OS_PlayerChunk[playerid], NewChunk);
  119.                 format(str, 128, "Update. {00FF00}Time {FF0000}%d{FFFFFF}, {00FF00}chunk {FF0000}%d{FFFFFF}", GetTickCount()-tick, NewChunk);
  120.                 SendClientMessage(playerid,-1,str);
  121.             #endif
  122.         }
  123.     }
  124.     if(OS_TimerStatus == 9) OS_TimerStatus=0; else OS_TimerStatus++;
  125.     return 1;
  126. }
  127.  
  128. stock OS_ChunksUpdate(playerid, OldChunk, NewChunk)
  129. {
  130.     OS_CreateChunks=OS_CPC[NewChunk];
  131.     for(new i=OS_KolvoChunksInPos{OldChunk}; i ; i--)
  132.         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]);
  133.  
  134.     for(new i=OS_KolvoChunksInPos{NewChunk}; i ; i--)
  135.         if(OS_CreateChunks[i]) OS_CreateChunk(playerid,OS_CreateChunks[i]);
  136.        
  137.     OS_PlayerChunk[playerid]=NewChunk;
  138. }
  139.  
  140. stock OS_CreateChunk(playerid,id)
  141. {
  142.     for(new k, i=OS_KolvoObjectsInChunk{id}-1; i > -1; i--)
  143.     {
  144.         k=OS_ChunksInfo[id][i];
  145.         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]);
  146.     }
  147. }
  148.  
  149. stock OS_DestroyChunk(playerid,id)
  150. {
  151.     for(new i=OS_KolvoObjectsInChunk{id}-1; i > -1; i--)
  152.     {
  153.         DestroyPlayerObject(playerid,OS_objectid[playerid][ OS_ChunksInfo[id][i] ]);
  154.         #if defined DinObj
  155.             OS_objectid[playerid][ OS_ChunksInfo[id][i] ]=0;
  156.         #endif
  157.     }
  158. }
  159.  
  160. stock OS_DestroyAllChunk(playerid)
  161. {
  162.     for(new k=OS_KolvoChunksInPos{OS_PlayerChunk[playerid]}; k ; k--)OS_DestroyChunk(playerid, OS_CPC[OS_PlayerChunk[playerid]][k]);
  163.     OS_PlayerChunk[playerid]=0;
  164. }
  165. //==============================================================================
  166. stock CreateStaticObject(modelid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz, Float:dist=400.0)
  167. {
  168.     if(modelid < 1)
  169.     {
  170.         #if defined DeBug
  171.             printf("W_OS-Ошибка: Не верное значение  modelid =%d=", modelid);
  172.         #endif
  173.         return -2;
  174.     }
  175.     if(OS_KolvoObjects >= MAX_OBJECTS_KOLVO)//  если достигли лимита
  176.     {
  177.         #if defined DeBug
  178.             printf("W_OS-Ошибка: Количество объектов привышает максимально допустимого значения MAX_OBJECTS_KOLVO =%d=", MAX_OBJECTS_KOLVO);
  179.         #endif
  180.         return 0;
  181.     }
  182.     new chunk=OS_GetChunkPos(x,y);
  183.     if(OS_KolvoObjectsInChunk{chunk} >= MAX_OBJECTS_IN_CHUNK)// если перебор объектов на 1 ячейку
  184.     {
  185.         #if defined DeBug
  186.             printf("W_OS-Ошибка: Чанк =%d= заполнен, придел MAX_OBJECTS_IN_CHUNK =%d=", chunk, MAX_OBJECTS_IN_CHUNK);
  187.         #endif
  188.         return -1;//    если перебор точек на 1 квадрат
  189.     }
  190.  
  191.     OS_KolvoObjects++;//   установим новый ид
  192.     OS_ChunksInfo[chunk][OS_KolvoObjectsInChunk{chunk}]=OS_KolvoObjects;//  запомним ид объекта
  193.     OS_KolvoObjectsInChunk{chunk}++;//  запомним количество объектов в ячейке
  194.     OS_modelid[OS_KolvoObjects]=modelid;
  195.     OS_x[OS_KolvoObjects]=x;
  196.     OS_y[OS_KolvoObjects]=y;
  197.     OS_z[OS_KolvoObjects]=z;
  198.     OS_rx[OS_KolvoObjects]=rx;
  199.     OS_ry[OS_KolvoObjects]=ry;
  200.     OS_rz[OS_KolvoObjects]=rz;
  201.     OS_dist[OS_KolvoObjects]=dist;
  202.    
  203.     return OS_KolvoObjects;
  204. }
  205.  
  206. stock StaticObjectsAnaliz(krug)
  207. {
  208.     #if defined DeBug
  209.         printf("\t\t%d объектов подготовленно на анализ.\n\t\tЗапуск анализа.", OS_KolvoObjects);
  210.         new tick=GetTickCount();
  211.     #endif
  212.    
  213.     new g=(krug + krug + 1)*(krug + krug + 1);
  214.     for(new x; x < MAX_KOLV0_CHUNKOV_NA_STORONU; x++)
  215.     for(new y=1; y <= MAX_KOLV0_CHUNKOV_NA_STORONU; y++)
  216.     {
  217.         new kolvo;
  218.         new KvPos=((x*MAX_KOLV0_CHUNKOV_NA_STORONU) + y);
  219.  
  220.         for(new i;i<g;i++)
  221.         {
  222.             StaticObjectsA(KvPos,kolvo,x,y,i);
  223.             if(kolvo == MAX_OBJECTS_STREAM)break;
  224.         }
  225.  
  226.         for(new s=1, i=OS_KolvoChunksInPos{KvPos}-1; i > -1; )
  227.         {
  228.             OS_CPC[KvPos][s]=OS_CreateChunks[i];
  229.             OS_CCP[KvPos]{OS_CreateChunks[i]}=s;
  230.             s++;
  231.             i--;
  232.         }
  233.     }
  234.     #if defined DeBug
  235.         printf("\t\tАнализ завершён! Длительность анализа %d мс.", GetTickCount()-tick);
  236.     #endif
  237.     return 1;
  238. }
  239.  
  240. stock StaticObjectsA(KvPos,&kolvo,x,y,i)
  241. if(kolvo < MAX_OBJECTS_STREAM)
  242. {
  243.     x+=sorty[i][0];
  244.     y+=sorty[i][1];
  245.     if(0 <= x < MAX_KOLV0_CHUNKOV_NA_STORONU)
  246.     if(0 < y <= MAX_KOLV0_CHUNKOV_NA_STORONU)
  247.     {
  248.         new chunk=((x*MAX_KOLV0_CHUNKOV_NA_STORONU) + y);
  249.         if(OS_KolvoObjectsInChunk{chunk})
  250.         if((kolvo+OS_KolvoObjectsInChunk{chunk}) < MAX_OBJECTS_STREAM)
  251.         {
  252.             kolvo+=OS_KolvoObjectsInChunk{chunk};    //отправим количество ебъектов
  253.             OS_CreateChunks[OS_KolvoChunksInPos{KvPos}]=chunk;
  254.             OS_KolvoChunksInPos{KvPos}++;
  255.         }
  256.     }
  257. }
  258. //==============================================================================
  259. //==============================================================================
  260. //==============================================================================
  261. #if defined DinObj
  262. //OS_MovePlayerObject(playerid, objectid, Float:X, Float:Y, Float:Z, Float:Speed, Float:RotX = -1000.0, Float:RotY = -1000.0, Float:RotZ = -1000.0)
  263. stock MoveStaticObject(objectid, Float:x, Float:y, Float:z, Float:s, Float:rx = -1000.0, Float:ry = -1000.0, Float:rz = -1000.0)
  264. {
  265.     if(0 < objectid < MAX_OBJECTS_KOLVO)//  если достигли лимита
  266.     if(OS_modelid[objectid])
  267.     {
  268.         OS_x[objectid]=x;
  269.         OS_y[objectid]=y;
  270.         OS_z[objectid]=z;
  271.         if(rx != -1000.0)
  272.         {
  273.             OS_rx[objectid]=rx;
  274.             OS_ry[objectid]=ry;
  275.             OS_rz[objectid]=rz;
  276.             for(new playerid; playerid < MAX_PLAYERS; playerid++)
  277.             if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid) && !OS_DontUpdate{playerid})
  278.             if(OS_objectid[playerid][objectid]) MovePlayerObject(playerid, OS_objectid[playerid][objectid], x, y, z, s, rx, ry, rz);
  279.            
  280.             return 1;
  281.         }
  282.         for(new playerid; playerid < MAX_PLAYERS; playerid++)
  283.         if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid) && !OS_DontUpdate{playerid})
  284.         if(OS_objectid[playerid][objectid]) MovePlayerObject(playerid, OS_objectid[playerid][objectid], x, y, z, s);
  285.         return 1;
  286.     }
  287.     return 0;
  288. }
  289.  
  290. stock SetStaticObjectPos(objectid, Float:x, Float:y, Float:z)
  291. {
  292.     if(0 < objectid < MAX_OBJECTS_KOLVO)//  если достигли лимита
  293.     if(OS_modelid[objectid])
  294.     {
  295.         OS_x[objectid]=x;
  296.         OS_y[objectid]=y;
  297.         OS_z[objectid]=z;
  298.        
  299.         for(new playerid; playerid < MAX_PLAYERS; playerid++)
  300.         if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid) && !OS_DontUpdate{playerid})
  301.         if(OS_objectid[playerid][objectid]) SetPlayerObjectPos(playerid, OS_objectid[playerid][objectid], x, y, z);
  302.         return 1;
  303.     }
  304.     return 0;
  305. }
  306.  
  307. stock SetStaticObjectRot(objectid, Float:rx, Float:ry, Float:rz)
  308. {
  309.     if(0 < objectid < MAX_OBJECTS_KOLVO)//  если достигли лимита
  310.     if(OS_modelid[objectid])
  311.     {
  312.         OS_rx[objectid]=rx;
  313.         OS_ry[objectid]=ry;
  314.         OS_rz[objectid]=rz;
  315.  
  316.         for(new playerid; playerid < MAX_PLAYERS; playerid++)
  317.         if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid) && !OS_DontUpdate{playerid})
  318.         if(OS_objectid[playerid][objectid]) SetPlayerObjectRot(playerid, OS_objectid[playerid][objectid], rx, ry, rz);
  319.         return 1;
  320.     }
  321.     return 0;
  322. }
  323. #endif
  324.  
  325. //==============================================================================
  326. //==============================================================================
  327. //==============================================================================
  328. forward StartStaticObjectsStreamer(krug, time);
  329. public StartStaticObjectsStreamer(krug, time)
  330. {
  331.     if(OS_Start)
  332.     {
  333.         #if defined DeBug
  334.             print("W_OS-Ошибка: Стример уже был запушен!");
  335.         #endif
  336.         return -1;
  337.     }
  338.     if(!(0 < krug < 8))
  339.     {
  340.         #if defined DeBug
  341.             printf("W_OS-Ошибка: Не верное количество кругов обработки =%d=", krug);
  342.         #endif
  343.         return -2;
  344.     }
  345.    
  346.     OS_Start=1;
  347.     StaticObjectsAnaliz(krug);//1..7
  348.     OS_Timer=SetTimer("OS_ChunksUpdateForAll", time, 1);// 1 секунда, 200-2 секунды
  349.     return OS_Timer;
  350. }
  351.  
  352. forward StopStaticObjectsStreamer();
  353. public StopStaticObjectsStreamer()
  354. {
  355.     if(!OS_Start)
  356.     {
  357.         #if defined DeBug
  358.             print("W_OS-Ошибка: Стример не был запушен!");
  359.         #endif
  360.         return -1;
  361.     }
  362.     KillTimer(OS_Timer);
  363.     for(new playerid; playerid < MAX_PLAYERS; playerid++) if(IsPlayerConnected(playerid) && OS_PlayerChunk[playerid]) OS_DestroyAllChunk(playerid);
  364.     return 1;
  365. }
  366.  
  367. forward OS_SetPlayerPos(playerid,Float:x,Float:y);
  368. public OS_SetPlayerPos(playerid,Float:x,Float:y)
  369. {
  370.     if(!IsPlayerConnected(playerid) && IsPlayerNPC(playerid) && OS_DontUpdate{playerid})return 0;
  371.  
  372.     new NewChunk=OS_GetChunkPos(x,y);
  373.     if(OS_PlayerChunk[playerid]!=NewChunk)OS_ChunksUpdate(playerid, OS_PlayerChunk[playerid], NewChunk);
  374.     return 1;
  375. }
  376.  
  377. forward OS_PlayerConnect(playerid);
  378. public OS_PlayerConnect(playerid)
  379. {
  380.     for(new i; i < MAX_OBJECTS_KOLVO; i++) OS_objectid[playerid][i]=0;
  381.     OS_PlayerChunk[playerid]=0;
  382.     OS_DontUpdate{playerid}=0;
  383. }
  384.  
  385. #undef MAX_OBJECTS_STREAM
  386. #undef MAX_OBJECTS_IN_CHUNK
  387. #undef MAX_DlINA_DLYA_OBRABOTKI
  388. #undef MAX_RAZMER_CHUNKA
  389. #undef MAX_KOLV0_CHUNKOV_NA_STORONU
  390. #undef MAX_CHUNKS
Add Comment
Please, Sign In to add comment