BigETI

bstreamer.inc

Oct 23rd, 2012
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 52.01 KB | None | 0 0
  1. /*
  2.     BStreamer include made by BigETI © 2012
  3.  
  4.     Defines:
  5.         - USE_MAP_FILES
  6.         - LIMIT_B_OBJECTS
  7.         - MAX_B_OBJECTS
  8.         - B_OBJECT_STREAM_DISTANCE
  9.         - B_OBJECT_TICK
  10.         - USE_CAMERA_STREAM
  11.  
  12.  
  13.     Callbacks:
  14.  
  15.         - OnBObjectStreamIn(playerid, bobjectid, pobjectid)
  16.         - OnBObjectStreamOut(playerid, bobjectid, pobjectid)
  17.         - OnBObjectMoved(bobjectid)
  18.  
  19.  
  20.     Stocks:
  21.  
  22.         - CreateBObject(modelid, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ, Float:DrawDistance = B_OBJECT_STREAM_DISTANCE, worldid = -1, interiorid = -1, playerid = -1)
  23.         - DestroyBObject(bobjectid)
  24.         - DestroyAllBObjects(single_vworld = -1)
  25.         - SetBObjectPos(bobjectid, Float:X, Float:Y, Float:Z)
  26.         - SetBObjectPosEx(bobjectid, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ)
  27.         - GetBObjectPos(bobjectid, &Float:X, &Float:Y, &Float:Z)
  28.         - GetBObjectPosEx(bobjectid, &Float:X, &Float:Y, &Float:Z, &Float:rX, &Float:rY, &Float:rZ)
  29.         - SetBObjectRot(bobjectid, Float:rX, Float:rY, Float:rZ)
  30.         - GetBObjectRot(bobjectid, &Float:rX, &Float:rY, &Float:rZ)
  31.         - bStream_SetUpdate(updatetime = B_OBJECT_TICK)
  32.         - AssignBObjectForVirtualWorld(bobjectid, worldid = -1)
  33.         - AssignBObjectForInterior(bobjectid, interiorid = -1)
  34.         - AssignBObjectForPlayer(bobjectid, playerid = -1)
  35.         - MoveBObject(bobjectid, Float:X, Float:Y, Float:Z, Float:speed, Float:rX = -1000.0, Float:rY = -1000.0, Float:rZ = -1000.0)
  36.         - StopBObject(bobjectid)
  37.         - AttachCameraToBObject(playerid, bobjectid)
  38.         - SaveBMap(const file_name[], bool:use_vworld = false, vworld = -1)
  39.         - LoadBMap(const file_name[], bool:error_clear = true, bool:use_vworld = false, vworld = -1)
  40.         - SavePWN(const file_name[], bool:use_vworld = false, vworld = -1)
  41.         - LoadPWN(const file_name[], bool:error_clear = true, bool:use_vworld = false, vworld = -1)
  42.         - BMap_To_PWN(bmap_fname[], pwn_fname[], bool:error_clear = true, bool:use_single_vworld = false, single_vworld = -1)
  43.         - PWN_To_BMap(pwn_fname[], bmap_fname[], bool:use_single_vworld = false, single_vworld = -1)
  44.         - CreateBVehicle(vehicletype, Float:x, Float:y, Float:z, Float:rotation, color1, color2, respawn_delay, interior = 0, vworld = 0)
  45.         - DestroyBVehicle(vehicleid)
  46.         - DestroyAllBVehicles(bool:use_vworld = false, vworld = 0)
  47.         - GetBVehicleColors(vehicleid, &color1, &color2)
  48.         - GetBVehicleData(vehicleid, &color1, &color2, &respawn_delay, &interior)
  49.         - IsCameraInRangeOfPoint(playerid, Float:range, Float:X, Float:Y, Float:Z)
  50.  
  51.  
  52.     Macros:
  53.  
  54.         - IsValidBObject(bobjectid)
  55.         - IsBObjectMoving(bobjectid)
  56.         - IsValidBVehicle(vehicleid)
  57.         - GetBVehicleColor1(vehicleid)
  58.         - GetBVehicleColor2(vehicleid)
  59.         - GetBVehicleResDelay(vehicleid)
  60.         - GetBVehicleInterior(vehicleid)
  61.  
  62. */
  63. #if !defined LIMIT_B_OBJECTS
  64.     #define LIMIT_B_OBJECTS             (400)
  65. #endif
  66. #if !defined MAX_B_OBJECTS
  67.     #define MAX_B_OBJECTS               (2000)
  68. #endif
  69. #if !defined B_OBJECT_STREAM_DISTANCE
  70.     #define B_OBJECT_STREAM_DISTANCE    (200.0)
  71. #endif
  72. #if !defined B_OBJECT_TICK
  73.     #define B_OBJECT_TICK               (100)
  74. #endif
  75.  
  76. #if defined B_STREAMER_INCLUDED_
  77.     #endinput
  78. #endif
  79. #define B_STREAMER_INCLUDED_
  80. #include <a_samp>
  81. #include <foreach>
  82. #if defined USE_MAP_FILES
  83.     #tryinclude <sscanf2>
  84. #endif
  85. #define IsValidBObject(%0)  (((%0)>=0&&(%0)<MAX_B_OBJECTS)?bStream[(%0)][bStream_Is]:false)
  86. #define IsBObjectMoving(%0) (((%0)>=0&&(%0)<MAX_B_OBJECTS)?bStream[(%0)][bStream_Moving]:false)
  87. #define IsValidBVehicle(%0) (((%0)>0&&(%0)<=MAX_VEHICLES)?bVStream[(%0)-1][bVStream_Is]:false)
  88. #define GetBVehicleColor1(%0) (((%0)>0&&(%0)<=MAX_VEHICLES)?bVStream[(%0)-1][bVStream_Color1]:0)
  89. #define GetBVehicleColor2(%0) (((%0)>0&&(%0)<=MAX_VEHICLES)?bVStream[(%0)-1][bVStream_Color2]:0)
  90. #define GetBVehicleResDelay(%0) (((%0)>0&&(%0)<=MAX_VEHICLES)?bVStream[(%0)-1][btVStream_Respawn]:0)
  91. #define GetBVehicleInterior(%0) (((%0)>0&&(%0)<=MAX_VEHICLES)?bVStream[(%0)-1][bVStream_Interior]:0)
  92.  
  93. enum bStreamInfos
  94. {
  95.     bool:bStream_Is,
  96.     bStream_Model,
  97.     Float:bStream_X,
  98.     Float:bStream_Y,
  99.     Float:bStream_Z,
  100.     Float:bStream_rX,
  101.     Float:bStream_rY,
  102.     Float:bStream_rZ,
  103.     Float:bStream_DrawDistance,
  104.     bStream_VWorld,
  105.     bStream_Interior,
  106.     bStream_PlayerID,
  107.     bool:bStream_Moving,
  108.     bStream_MoveTick,
  109.     Float:bStream_toX,
  110.     Float:bStream_toY,
  111.     Float:bStream_toZ,
  112.     Float:bStream_toRX,
  113.     Float:bStream_toRY,
  114.     Float:bStream_toRZ,
  115.     Float:bStream_Speed,
  116.     bStream_MoveTime,
  117.     bStream_MoveTimer,
  118.     bStream_pObjectID[MAX_PLAYERS],
  119.     bool:bStream_pTryAttachCam[MAX_PLAYERS]
  120. };
  121.  
  122. enum btStreamInfos
  123. {
  124.     btStream_Model,
  125.     Float:btStream_X,
  126.     Float:btStream_Y,
  127.     Float:btStream_Z,
  128.     Float:btStream_rX,
  129.     Float:btStream_rY,
  130.     Float:btStream_rZ,
  131.     Float:btStream_DrawDistance,
  132.     btStream_VWorld,
  133.     btStream_Interior,
  134.     btStream_PlayerID,
  135. };
  136.  
  137. enum bVStreamInfos
  138. {
  139.     bool:bVStream_Is,
  140.     bVStream_Color1,
  141.     bVStream_Color2,
  142.     bVStream_Respawn,
  143.     bVStream_Interior,
  144. }
  145.  
  146. enum btVStreamInfos
  147. {
  148.     btVStream_Model,
  149.     Float:btVStream_X,
  150.     Float:btVStream_Y,
  151.     Float:btVStream_Z,
  152.     Float:btVStream_rZ,
  153.     btVStream_Color1,
  154.     btVStream_Color2,
  155.     btVStream_Respawn,
  156.     btVStream_Interior,
  157.     btVStream_VWorld,
  158. }
  159.  
  160. new bStreamTimer, bStream[MAX_B_OBJECTS][bStreamInfos], bStreamCallBacks, Iterator:Iter_BObject<MAX_B_OBJECTS>, Iterator:Iter_BVehicle<MAX_B_OBJECTS>, bStream_Max = 0, bVStream[MAX_VEHICLES][bVStreamInfos];
  161.  
  162. forward bStream_Update();
  163. forward OnBObjectStreamIn(playerid, bobjectid, pobjectid);
  164. forward OnBObjectStreamOut(playerid, bobjectid, pobjectid);
  165. forward OnBObjectMoved(bobjectid);
  166.  
  167. stock CreateBObject(modelid, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ, Float:DrawDistance = B_OBJECT_STREAM_DISTANCE, worldid = -1, interiorid = -1, playerid = -1)
  168. {
  169.     for(new i = 0; i < bStream_Max+1; i++)
  170.     {
  171.         if(bStream[i][bStream_Is]) continue;
  172.         bStream[i][bStream_Model] = modelid;
  173.         bStream[i][bStream_X] = X;
  174.         bStream[i][bStream_Y] = Y;
  175.         bStream[i][bStream_Z] = Z;
  176.         bStream[i][bStream_rX] = rX;
  177.         bStream[i][bStream_rY] = rY;
  178.         bStream[i][bStream_rZ] = rZ;
  179.         bStream[i][bStream_DrawDistance] = DrawDistance;
  180.         bStream[i][bStream_VWorld] = worldid;
  181.         bStream[i][bStream_Interior] = interiorid;
  182.         bStream[i][bStream_PlayerID] = playerid;
  183.         bStream[i][bStream_Is] = true;
  184.         if(i >= bStream_Max) bStream_Max = i+1;
  185.         Iter_Add(Iter_BObject, i);
  186.         return i;
  187.     }
  188.     return -1;
  189. }
  190.  
  191. stock DestroyBObject(bobjectid)
  192. {
  193.     if(bobjectid < 0 || bobjectid >= MAX_B_OBJECTS) return false;
  194.     if(!bStream[bobjectid][bStream_Is]) return false;
  195.     bStream[bobjectid][bStream_Is] = false;
  196.     bStream[bobjectid][bStream_Moving] = false;
  197.     new pobj;
  198.     foreach(Player, playerid)
  199.     {
  200.         if((pobj = bStream[bobjectid][bStream_pObjectID][playerid]) == -1) continue;
  201.         bStream[bobjectid][bStream_pObjectID][playerid] = -1;
  202.         DestroyPlayerObject(playerid, pobj);
  203.     }
  204.     return true;
  205. }
  206.  
  207. stock DestroyAllBObjects(single_vworld = -1)
  208. {
  209.     if(single_vworld != -1)
  210.     {
  211.         new pobj = -1;
  212.         foreach(Iter_BObject, i)
  213.         {
  214.             if(!bStream[i][bStream_Is]) continue;
  215.             if(bStream[i][bStream_VWorld] != single_vworld) continue;
  216.             bStream[i][bStream_Is] = false;
  217.             bStream[i][bStream_Moving] = false;
  218.             foreach(Player, playerid)
  219.             {
  220.                 if((pobj = bStream[i][bStream_pObjectID][playerid]) == -1) continue;
  221.                 bStream[i][bStream_pObjectID][playerid] = -1;
  222.                 DestroyPlayerObject(playerid, pobj);
  223.             }
  224.         }
  225.     }
  226.     else
  227.     {
  228.         new pobj = -1;
  229.         for(new i = 0; i < MAX_B_OBJECTS; i++)
  230.         {
  231.             if(!bStream[i][bStream_Is]) continue;
  232.             bStream[i][bStream_Is] = false;
  233.             bStream[i][bStream_Moving] = false;
  234.             foreach(Player, playerid)
  235.             {
  236.                 if((pobj = bStream[i][bStream_pObjectID][playerid]) == -1) continue;
  237.                 bStream[i][bStream_pObjectID][playerid] = -1;
  238.                 DestroyPlayerObject(playerid, pobj);
  239.             }
  240.         }
  241.     }
  242. }
  243.  
  244. stock SetBObjectPos(bobjectid, Float:X, Float:Y, Float:Z)
  245. {
  246.     if(bobjectid < 0 || bobjectid >= MAX_B_OBJECTS) return false;
  247.     if(!bStream[bobjectid][bStream_Is]) return false;
  248.     bStream[bobjectid][bStream_X] = X;
  249.     bStream[bobjectid][bStream_Y] = Y;
  250.     bStream[bobjectid][bStream_Z] = Z;
  251.     foreach(Player, playerid)
  252.     {
  253.         if(bStream[bobjectid][bStream_pObjectID][playerid] == -1) continue;
  254.         SetPlayerObjectPos(playerid, bStream[bobjectid][bStream_pObjectID][playerid], X, Y, Z);
  255.     }
  256.     return true;
  257. }
  258.  
  259. stock SetBObjectPosEx(bobjectid, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ)
  260. {
  261.     if(bobjectid < 0 || bobjectid >= MAX_B_OBJECTS) return false;
  262.     if(!bStream[bobjectid][bStream_Is]) return false;
  263.     bStream[bobjectid][bStream_X] = X;
  264.     bStream[bobjectid][bStream_Y] = Y;
  265.     bStream[bobjectid][bStream_Z] = Z;
  266.     bStream[bobjectid][bStream_rX] = rX;
  267.     bStream[bobjectid][bStream_rY] = rY;
  268.     bStream[bobjectid][bStream_rZ] = rZ;
  269.     foreach(Player, playerid)
  270.     {
  271.         if(bStream[bobjectid][bStream_pObjectID][playerid] == -1) continue;
  272.         SetPlayerObjectRot(playerid, bStream[bobjectid][bStream_pObjectID][playerid], rX, rY, rZ);
  273.         SetPlayerObjectPos(playerid, bStream[bobjectid][bStream_pObjectID][playerid], X, Y, Z);
  274.     }
  275.     return true;
  276. }
  277.  
  278. stock GetBObjectPos(bobjectid, &Float:X, &Float:Y, &Float:Z)
  279. {
  280.     if(bobjectid < 0 || bobjectid >= MAX_B_OBJECTS) return;
  281.     if(!bStream[bobjectid][bStream_Is]) return;
  282.     if(bStream[bobjectid][bStream_Moving])
  283.     {
  284.         new tick = GetTickCount()-bStream[bobjectid][bStream_MoveTick];
  285.         X = bStream[bobjectid][bStream_X]+floatmul(floatdiv(bStream[bobjectid][bStream_toX]-bStream[bobjectid][bStream_X], bStream[bobjectid][bStream_MoveTime]), tick);
  286.         Y = bStream[bobjectid][bStream_Y]+floatmul(floatdiv(bStream[bobjectid][bStream_toY]-bStream[bobjectid][bStream_Y], bStream[bobjectid][bStream_MoveTime]), tick);
  287.         Z = bStream[bobjectid][bStream_Z]+floatmul(floatdiv(bStream[bobjectid][bStream_toZ]-bStream[bobjectid][bStream_Z], bStream[bobjectid][bStream_MoveTime]), tick);
  288.     }
  289.     else
  290.     {
  291.         X = bStream[bobjectid][bStream_X];
  292.         Y = bStream[bobjectid][bStream_Y];
  293.         Z = bStream[bobjectid][bStream_Z];
  294.     }
  295. }
  296.  
  297. stock GetBObjectPosEx(bobjectid, &Float:X, &Float:Y, &Float:Z, &Float:rX, &Float:rY, &Float:rZ)
  298. {
  299.     if(bobjectid < 0 || bobjectid >= MAX_B_OBJECTS) return;
  300.     if(!bStream[bobjectid][bStream_Is]) return;
  301.     new tick = GetTickCount()-bStream[bobjectid][bStream_MoveTick];
  302.     if(bStream[bobjectid][bStream_Moving] && tick < bStream[bobjectid][bStream_MoveTime])
  303.     {
  304.         X = bStream[bobjectid][bStream_X]+floatmul(floatdiv(bStream[bobjectid][bStream_toX]-bStream[bobjectid][bStream_X], bStream[bobjectid][bStream_MoveTime]), tick);
  305.         Y = bStream[bobjectid][bStream_Y]+floatmul(floatdiv(bStream[bobjectid][bStream_toY]-bStream[bobjectid][bStream_Y], bStream[bobjectid][bStream_MoveTime]), tick);
  306.         Z = bStream[bobjectid][bStream_Z]+floatmul(floatdiv(bStream[bobjectid][bStream_toZ]-bStream[bobjectid][bStream_Z], bStream[bobjectid][bStream_MoveTime]), tick);
  307.         rX = bStream[bobjectid][bStream_rX]+floatmul(floatdiv(bStream[bobjectid][bStream_toRX]-bStream[bobjectid][bStream_rX], bStream[bobjectid][bStream_MoveTime]), tick);
  308.         rY = bStream[bobjectid][bStream_rY]+floatmul(floatdiv(bStream[bobjectid][bStream_toRY]-bStream[bobjectid][bStream_rY], bStream[bobjectid][bStream_MoveTime]), tick);
  309.         rZ = bStream[bobjectid][bStream_rZ]+floatmul(floatdiv(bStream[bobjectid][bStream_toRZ]-bStream[bobjectid][bStream_rZ], bStream[bobjectid][bStream_MoveTime]), tick);
  310.     }
  311.     else
  312.     {
  313.         X = bStream[bobjectid][bStream_X];
  314.         Y = bStream[bobjectid][bStream_Y];
  315.         Z = bStream[bobjectid][bStream_Z];
  316.         rX = bStream[bobjectid][bStream_rX];
  317.         rY = bStream[bobjectid][bStream_rY];
  318.         rZ = bStream[bobjectid][bStream_rZ];
  319.     }
  320. }
  321.  
  322. stock SetBObjectRot(bobjectid, Float:rX, Float:rY, Float:rZ)
  323. {
  324.     if(bobjectid < 0 || bobjectid >= MAX_B_OBJECTS) return false;
  325.     if(!bStream[bobjectid][bStream_Is]) return false;
  326.     bStream[bobjectid][bStream_rX] = rX;
  327.     bStream[bobjectid][bStream_rY] = rY;
  328.     bStream[bobjectid][bStream_rZ] = rZ;
  329.     foreach(Player, playerid)
  330.     {
  331.         if(bStream[bobjectid][bStream_pObjectID][playerid] == -1) continue;
  332.         SetPlayerObjectRot(playerid, bStream[bobjectid][bStream_pObjectID][playerid], rX, rY, rZ);
  333.     }
  334.     return true;
  335. }
  336.  
  337. stock GetBObjectRot(bobjectid, &Float:rX, &Float:rY, &Float:rZ)
  338. {
  339.     if(bobjectid < 0 || bobjectid >= MAX_B_OBJECTS) return;
  340.     if(!bStream[bobjectid][bStream_Is]) return;
  341.     new tick = GetTickCount()-bStream[bobjectid][bStream_MoveTick];
  342.     if(bStream[bobjectid][bStream_Moving] && tick < bStream[bobjectid][bStream_MoveTime])
  343.     {
  344.         rX = bStream[bobjectid][bStream_rX]+floatmul(floatdiv(bStream[bobjectid][bStream_toRX]-bStream[bobjectid][bStream_rX], bStream[bobjectid][bStream_MoveTime]), tick);
  345.         rY = bStream[bobjectid][bStream_rY]+floatmul(floatdiv(bStream[bobjectid][bStream_toRY]-bStream[bobjectid][bStream_rY], bStream[bobjectid][bStream_MoveTime]), tick);
  346.         rZ = bStream[bobjectid][bStream_rZ]+floatmul(floatdiv(bStream[bobjectid][bStream_toRZ]-bStream[bobjectid][bStream_rZ], bStream[bobjectid][bStream_MoveTime]), tick);
  347.     }
  348.     else
  349.     {
  350.         rX = bStream[bobjectid][bStream_rX];
  351.         rY = bStream[bobjectid][bStream_rY];
  352.         rZ = bStream[bobjectid][bStream_rZ];
  353.     }
  354. }
  355.  
  356. stock bStream_SetUpdate(updatetime = B_OBJECT_TICK)
  357. {
  358.     if(bStreamTimer != 0) KillTimer(bStreamTimer);
  359.     bStreamTimer = 0;
  360.     bStreamTimer = SetTimer("bStream_Update", updatetime, true);
  361. }
  362.  
  363. stock AssignBObjectForVirtualWorld(bobjectid, worldid = -1)
  364. {
  365.     if(bobjectid < 0 || bobjectid >= MAX_B_OBJECTS) return false;
  366.     if(!bStream[bobjectid][bStream_Is]) return false;
  367.     bStream[bobjectid][bStream_PlayerID] = worldid;
  368.     return true;
  369. }
  370.  
  371. stock AssignBObjectForInterior(bobjectid, interiorid = -1)
  372. {
  373.     if(bobjectid < 0 || bobjectid >= MAX_B_OBJECTS) return false;
  374.     if(!bStream[bobjectid][bStream_Is]) return false;
  375.     bStream[bobjectid][bStream_PlayerID] = worldid;
  376.     return true;
  377. }
  378.  
  379. stock AssignBObjectForPlayer(bobjectid, playerid = -1)
  380. {
  381.     if(bobjectid < 0 || bobjectid >= MAX_B_OBJECTS) return false;
  382.     if(!bStream[bobjectid][bStream_Is]) return false;
  383.     if(!IsPlayerConnected(playerid) && playerid != -1) return false;
  384.     bStream[bobjectid][bStream_PlayerID] = playerid;
  385.     return true;
  386. }
  387.  
  388. stock MoveBObject(bobjectid, Float:X, Float:Y, Float:Z, Float:speed, Float:rX = -1000.0, Float:rY = -1000.0, Float:rZ = -1000.0)
  389. {
  390.     if(bobjectid < 0 || bobjectid >= MAX_B_OBJECTS) return false;
  391.     if(!bStream[bobjectid][bStream_Is]) return false;
  392.     if(bStream[bobjectid][bStream_Moving])
  393.     {
  394.         if(bStream[bobjectid][bStream_MoveTimer] != 0)
  395.         {
  396.             KillTimer(bStream[bobjectid][bStream_MoveTimer]);
  397.             bStream[bobjectid][bStream_MoveTimer] = 0;
  398.         }
  399.         foreach(Player, playerid) {if(bStream[bobjectid][bStream_pObjectID][playerid] != -1) StopPlayerObject(playerid, bStream[bobjectid][bStream_pObjectID][playerid]);}
  400.         new Float:bObjPos[6];
  401.         GetBObjectPosEx(bobjectid, bObjPos[0], bObjPos[1], bObjPos[2], bObjPos[3], bObjPos[4], bObjPos[5]);
  402.         SetBObjectPosEx(bobjectid, bObjPos[0], bObjPos[1], bObjPos[2], bObjPos[3], bObjPos[4], bObjPos[5]);
  403.         bStream[bobjectid][bStream_Moving] = false;
  404.     }
  405.     bStream[bobjectid][bStream_MoveTick] = GetTickCount();
  406.     bStream[bobjectid][bStream_toX] = X;
  407.     bStream[bobjectid][bStream_toY] = Y;
  408.     bStream[bobjectid][bStream_toZ] = Z;
  409.     bStream[bobjectid][bStream_toRX] = rX;
  410.     bStream[bobjectid][bStream_toRY] = rY;
  411.     bStream[bobjectid][bStream_toRZ] = rZ;
  412.     bStream[bobjectid][bStream_Speed] = speed;
  413.     bStream[bobjectid][bStream_MoveTime] = floatround(floatdiv(floatsqroot((X-bStream[bobjectid][bStream_X])*(X-bStream[bobjectid][bStream_X])+(Y-bStream[bobjectid][bStream_Y])*(Y-bStream[bobjectid][bStream_Y])+(Z-bStream[bobjectid][bStream_Z])*(Z-bStream[bobjectid][bStream_Z])), speed)*1000);
  414.     bStream[bobjectid][bStream_Moving] = true;
  415.     bStream[bobjectid][bStream_MoveTimer] = SetTimerEx("bStream_ObjectMoved", bStream[bobjectid][bStream_MoveTime], false, "iffffff", bobjectid, X, Y, Z, rX, rY, rZ);
  416.     foreach(Player, playerid) {if(bStream[bobjectid][bStream_pObjectID][playerid] != -1) MovePlayerObject(playerid, bStream[bobjectid][bStream_pObjectID][playerid], X, Y, Z, speed, rX, rY, rZ);}
  417.     return true;
  418. }
  419.  
  420. forward bStream_ObjectMoved(bobjectid, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ);
  421. public bStream_ObjectMoved(bobjectid, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ)
  422. {
  423.     bStream[bobjectid][bStream_MoveTimer] = 0;
  424.     bStream[bobjectid][bStream_Moving] = false;
  425.     foreach(Player, playerid) {if(bStream[bobjectid][bStream_pObjectID][playerid] != -1) StopPlayerObject(playerid, bStream[bobjectid][bStream_pObjectID][playerid]);}
  426.     SetBObjectPosEx(bobjectid, X, Y, Z, rX, rY, rZ);
  427.     return (bStreamCallBacks&0x4 != 0 ? CallLocalFunction("OnBObjectMoved", "d", bobjectid) : 1);
  428. }
  429.  
  430. stock StopBObject(bobjectid)
  431. {
  432.     if(bobjectid < 0 || bobjectid >= MAX_B_OBJECTS) return false;
  433.     if(!bStream[bobjectid][bStream_Is]) return false;
  434.     if(!bStream[bobjectid][bStream_Moving]) return false;
  435.     if(bStream[bobjectid][bStream_MoveTimer] != 0)
  436.     {
  437.         KillTimer(bStream[bobjectid][bStream_MoveTimer]);
  438.         bStream[bobjectid][bStream_MoveTimer] = 0;
  439.     }
  440.     foreach(Player, playerid) {if(bStream[bobjectid][bStream_pObjectID][playerid] != -1) StopPlayerObject(playerid, bStream[bobjectid][bStream_pObjectID][playerid]);}
  441.     new Float:bObjPos[6];
  442.     GetBObjectPosEx(bobjectid, bObjPos[0], bObjPos[1], bObjPos[2], bObjPos[3], bObjPos[4], bObjPos[5]);
  443.     SetBObjectPosEx(bobjectid, bObjPos[0], bObjPos[1], bObjPos[2], bObjPos[3], bObjPos[4], bObjPos[5]);
  444.     bStream[bobjectid][bStream_Moving] = false;
  445. }
  446.  
  447. stock AttachCameraToBObject(playerid, bobjectid)
  448. {
  449.     if(!IsPlayerConnected(playerid)) return false;
  450.     if(bobjectid < 0 || bobjectid >= MAX_B_OBJECTS) return false;
  451.     if(bStream[bobjectid][bStream_pObjectID][playerid] != -1) AttachCameraToPlayerObject(playerid, bStream[bobjectid][bStream_pObjectID][playerid]);
  452.     else
  453.     {
  454.         SetPlayerCameraPos(playerid, bStream[bobjectid][bStream_X], bStream[bobjectid][bStream_Y], bStream[bobjectid][bStream_Z]);
  455.         bStream[bobjectid][bStream_pTryAttachCam][playerid] = true;
  456.     }
  457.     return true;
  458. }
  459. #if defined USE_MAP_FILES
  460. stock SaveBMap(const file_name[], bool:use_vworld = false, vworld = -1)
  461. {
  462.     new File:bmapfile = fopen(file_name, io_write);
  463.     if(!bmapfile)
  464.     {
  465.         printf("Couldn't open file \"%s\".", file_name);
  466.         return 0;
  467.     }
  468.     new countobjects = 0, countvehicles = 0;
  469.     foreach(Iter_BObject, i)
  470.     {
  471.         if(!bStream[i][bStream_Is]) continue;
  472.         fputchar(bmapfile, 1, false);
  473.         for(new j = 0; j < 4; j++) fputchar(bmapfile, (bStream[i][bStream_Model]>>>(j*8))&0xFF, false);
  474.         for(new j = 0; j < 4; j++) fputchar(bmapfile, (_:bStream[i][bStream_X]>>>(j*8))&0xFF, false);
  475.         for(new j = 0; j < 4; j++) fputchar(bmapfile, (_:bStream[i][bStream_Y]>>>(j*8))&0xFF, false);
  476.         for(new j = 0; j < 4; j++) fputchar(bmapfile, (_:bStream[i][bStream_Z]>>>(j*8))&0xFF, false);
  477.         for(new j = 0; j < 4; j++) fputchar(bmapfile, (_:bStream[i][bStream_rX]>>>(j*8))&0xFF, false);
  478.         for(new j = 0; j < 4; j++) fputchar(bmapfile, (_:bStream[i][bStream_rY]>>>(j*8))&0xFF, false);
  479.         for(new j = 0; j < 4; j++) fputchar(bmapfile, (_:bStream[i][bStream_rZ]>>>(j*8))&0xFF, false);
  480.         for(new j = 0; j < 4; j++) fputchar(bmapfile, (_:bStream[i][bStream_DrawDistance]>>>(j*8))&0xFF, false);
  481.         if(use_vworld) for(new j = 0; j < 4; j++) fputchar(bmapfile, (vworld>>>(j*8))&0xFF, false);
  482.         else for(new j = 0; j < 4; j++) fputchar(bmapfile, (bStream[i][bStream_VWorld]>>>(j*8))&0xFF, false);
  483.         for(new j = 0; j < 4; j++) fputchar(bmapfile, (bStream[i][bStream_Interior]>>>(j*8))&0xFF, false);
  484.         for(new j = 0; j < 4; j++) fputchar(bmapfile, (bStream[i][bStream_PlayerID]>>>(j*8))&0xFF, false);
  485.         countobjects++;
  486.     }
  487.     new BVehInfo[btVStreamInfos];
  488.     foreach(Iter_BVehicle, i)
  489.     {
  490.         fputchar(bmapfile, 2, false);
  491.         BVehInfo[btVStream_Model] = GetVehicleModel(i);
  492.         for(new j = 0; j < 4; j++) fputchar(bmapfile, (BVehInfo[btVStream_Model]>>>(j*8))&0xFF, false);
  493.         GetVehiclePos(i, BVehInfo[btVStream_X], BVehInfo[btVStream_Y], BVehInfo[btVStream_Z]);
  494.         for(new j = 0; j < 4; j++) fputchar(bmapfile, (_:BVehInfo[btVStream_X]>>>(j*8))&0xFF, false);
  495.         for(new j = 0; j < 4; j++) fputchar(bmapfile, (_:BVehInfo[btVStream_Y]>>>(j*8))&0xFF, false);
  496.         for(new j = 0; j < 4; j++) fputchar(bmapfile, (_:BVehInfo[btVStream_Z]>>>(j*8))&0xFF, false);
  497.         GetVehicleZAngle(i, BVehInfo[btVStream_rZ]);
  498.         for(new j = 0; j < 4; j++) fputchar(bmapfile, (_:BVehInfo[btVStream_rZ]>>>(j*8))&0xFF, false);
  499.         for(new j = 0; j < 4; j++) fputchar(bmapfile, (bVStream[i-1][bVStream_Color1]>>>(j*8))&0xFF, false);
  500.         for(new j = 0; j < 4; j++) fputchar(bmapfile, (bVStream[i-1][bVStream_Color2]>>>(j*8))&0xFF, false);
  501.         for(new j = 0; j < 4; j++) fputchar(bmapfile, (bVStream[i-1][bVStream_Respawn]>>>(j*8))&0xFF, false);
  502.         for(new j = 0; j < 4; j++) fputchar(bmapfile, (bVStream[i-1][bVStream_Interior]>>>(j*8))&0xFF, false);
  503.         if(use_vworld) for(new j = 0; j < 4; j++) fputchar(bmapfile, (vworld>>>(j*8))&0xFF, false);
  504.         else
  505.         {
  506.             BVehInfo[btVStream_VWorld] = GetVehicleVirtualWorld(i);
  507.             for(new j = 0; j < 4; j++) fputchar(bmapfile, (BVehInfo[btVStream_VWorld]>>>(j*8))&0xFF, false);
  508.         }
  509.         countvehicles++;
  510.     }
  511.     fclose(bmapfile);
  512.     printf("\"%s\" %d objects and %d vehicles have been saved!", file_name, countobjects, countvehicles);
  513.     return 1;
  514. }
  515.  
  516. stock LoadBMap(const file_name[], bool:error_clear = true, bool:use_vworld = false, vworld = -1)
  517. {
  518.     if(!fexist(file_name))
  519.     {
  520.         printf("File \"%s\" does not exist!", file_name);
  521.         return 0;
  522.     }
  523.     new File:bmapfile = fopen(file_name, io_read);
  524.     if(!bmapfile)
  525.     {
  526.         printf("Couldn't open file \"%s\".", file_name);
  527.         return 0;
  528.     }
  529.     new funcid, buffer, objpos = 0, vehpos = 0, BMapInfo[btStreamInfos], BVehInfo[btVStreamInfos], testval = -1;
  530.     while((funcid = fgetchar(bmapfile, 0, false)) != -1)
  531.     {
  532.         switch(funcid)
  533.         {
  534.             case 1:
  535.             {
  536.                 for(new argpos = 0; argpos < 11; argpos++)
  537.                 {
  538.                     for(new i = 0; i < 4; i++)
  539.                     {
  540.                         testval = fgetchar(bmapfile, 0, false);
  541.                         if(testval == -1)
  542.                         {
  543.                             if(error_clear)
  544.                             {
  545.                                 DestroyAllBObjects(vworld);
  546.                                 DestroyAllBVehicles(use_vworld, vworld);
  547.                             }
  548.                             fclose(bmapfile);
  549.                             printf("Map \"%s\" is broken.", file_name);
  550.                             return 0;
  551.                         }
  552.                         buffer |= testval<<(i*8);
  553.                     }
  554.                     switch(argpos)
  555.                     {
  556.                         case 0: BMapInfo[btStream_Model] = buffer;
  557.                         case 1: BMapInfo[btStream_X] = Float:buffer;
  558.                         case 2: BMapInfo[btStream_Y] = Float:buffer;
  559.                         case 3: BMapInfo[btStream_Z] = Float:buffer;
  560.                         case 4: BMapInfo[btStream_rX] = Float:buffer;
  561.                         case 5: BMapInfo[btStream_rY] = Float:buffer;
  562.                         case 6: BMapInfo[btStream_rZ] = Float:buffer;
  563.                         case 7:
  564.                         {
  565.                             BMapInfo[btStream_DrawDistance] = Float:buffer;
  566.                             if(use_vworld)
  567.                             {
  568.                                 fseek(bmapfile, 4, seek_current);
  569.                                 argpos++;
  570.                                 BMapInfo[btStream_VWorld] = vworld;
  571.                             }
  572.                         }
  573.                         case 8: BMapInfo[btStream_VWorld] = buffer;
  574.                         case 9: BMapInfo[btStream_Interior] = buffer;
  575.                         case 10:
  576.                         {
  577.                             BMapInfo[btStream_PlayerID] = buffer;
  578.                             if(CreateBObject(BMapInfo[btStream_Model], BMapInfo[btStream_X], BMapInfo[btStream_Y], BMapInfo[btStream_Z], BMapInfo[btStream_rX], BMapInfo[btStream_rY], BMapInfo[btStream_rZ], BMapInfo[btStream_DrawDistance], BMapInfo[btStream_VWorld], BMapInfo[btStream_Interior], BMapInfo[btStream_PlayerID]) == -1)
  579.                             {
  580.                                 if(error_clear)
  581.                                 {
  582.                                     DestroyAllBObjects(vworld);
  583.                                     DestroyAllBVehicles(use_vworld, vworld);
  584.                                 }
  585.                                 fclose(bmapfile);
  586.                                 printf("Map \"%s\" overflow. Server can't load more than %d objects!", file_name, MAX_B_OBJECTS);
  587.                                 return 0;
  588.                             }
  589.                             objpos++;
  590.                         }
  591.                     }
  592.                     buffer = 0;
  593.                 }
  594.             }
  595.             case 2:
  596.             {
  597.                 for(new argpos = 0; argpos < 10; argpos++)
  598.                 {
  599.                     for(new i = 0; i < 4; i++)
  600.                     {
  601.                         testval = fgetchar(bmapfile, 0, false);
  602.                         if(testval == -1)
  603.                         {
  604.                             if(error_clear)
  605.                             {
  606.                                 DestroyAllBObjects(vworld);
  607.                                 DestroyAllBVehicles(use_vworld, vworld);
  608.                             }
  609.                             fclose(bmapfile);
  610.                             printf("Map \"%s\" is broken.", file_name);
  611.                             return 0;
  612.                         }
  613.                         buffer |= testval<<(i*8);
  614.                     }
  615.                     switch(argpos)
  616.                     {
  617.                         case 0: BVehInfo[btVStream_Model] = buffer;
  618.                         case 1: BVehInfo[btVStream_X] = Float:buffer;
  619.                         case 2: BVehInfo[btVStream_Y] = Float:buffer;
  620.                         case 3: BVehInfo[btVStream_Z] = Float:buffer;
  621.                         case 4: BVehInfo[btVStream_rZ] = Float:buffer;
  622.                         case 5: BVehInfo[btVStream_Color1] = buffer;
  623.                         case 6: BVehInfo[btVStream_Color2] = buffer;
  624.                         case 7: BVehInfo[btVStream_Respawn] = buffer;
  625.                         case 8:
  626.                         {
  627.                             BVehInfo[btVStream_Interior] = buffer;
  628.                             if(use_vworld)
  629.                             {
  630.                                 fseek(bmapfile, 4, seek_current);
  631.                                 argpos++;
  632.                                 BVehInfo[btVStream_VWorld] = vworld;
  633.                                 if(CreateBVehicle(BVehInfo[btVStream_Model], BVehInfo[btVStream_X], BVehInfo[btVStream_Y], BVehInfo[btVStream_Z], BVehInfo[btVStream_rZ], BVehInfo[btVStream_Color1], BVehInfo[btVStream_Color2], BVehInfo[btVStream_Respawn], BVehInfo[btVStream_Interior], BVehInfo[btVStream_VWorld]) == 0)
  634.                                 {
  635.                                     if(error_clear)
  636.                                     {
  637.                                         DestroyAllBObjects(vworld);
  638.                                         DestroyAllBVehicles(use_vworld, vworld);
  639.                                     }
  640.                                     fclose(bmapfile);
  641.                                     printf("Map \"%s\" overflow. Server can't load more than %d vehicles!", file_name, MAX_VEHICLES);
  642.                                     return 0;
  643.                                 }
  644.                                 vehpos++;
  645.                             }
  646.                         }
  647.                         case 9:
  648.                         {
  649.                             BVehInfo[btVStream_VWorld] = buffer;
  650.                             if(CreateBVehicle(BVehInfo[btVStream_Model], BVehInfo[btVStream_X], BVehInfo[btVStream_Y], BVehInfo[btVStream_Z], BVehInfo[btVStream_rZ], BVehInfo[btVStream_Color1], BVehInfo[btVStream_Color2], BVehInfo[btVStream_Respawn], BVehInfo[btVStream_Interior], BVehInfo[btVStream_VWorld]) == 0)
  651.                             {
  652.                                 if(error_clear)
  653.                                 {
  654.                                     DestroyAllBObjects(vworld);
  655.                                     DestroyAllBVehicles(use_vworld, vworld);
  656.                                 }
  657.                                 fclose(bmapfile);
  658.                                 printf("Map \"%s\" overflow. Server can't load more than %d vehicles!", file_name, MAX_VEHICLES);
  659.                                 return 0;
  660.                             }
  661.                             vehpos++;
  662.                         }
  663.                     }
  664.                     buffer = 0;
  665.                 }
  666.             }
  667.             default:
  668.             {
  669.                 if(error_clear)
  670.                 {
  671.                     DestroyAllBObjects(vworld);
  672.                     DestroyAllBVehicles(use_vworld, vworld);
  673.                 }
  674.                 fclose(bmapfile);
  675.                 printf("Map \"%s\" unknown function ID: %d", file_name, funcid);
  676.                 return 0;
  677.             }
  678.         }
  679.     }
  680.     printf("Map \"%s\" %d objects and %d vehicles loaded.", file_name, objpos, vehpos);
  681.     fclose(bmapfile);
  682.     return 1;
  683. }
  684.  
  685. stock SavePWN(const file_name[], bool:use_vworld = false, vworld = -1)
  686. {
  687.     new File:pwnfile = fopen(file_name, io_write);
  688.     if(!pwnfile)
  689.     {
  690.         printf("Couldn't open file \"%s\".", file_name);
  691.         return 0;
  692.     }
  693.     new countobjects = 0, countvehicles = 0, writestr[256], Float:vehdata[4], bool:nline = false;
  694.     foreach(Iter_BObject, i)
  695.     {
  696.         if(!bStream[i][bStream_Is]) continue;
  697.         if(nline) format(writestr, sizeof writestr, "\r\nCreateBObject(%d, %0.8f, %0.8f, %0.8f, %0.8f, %0.8f, %0.8f, %0.8f, %d, %d, %d);"
  698.             , bStream[i][bStream_Model], bStream[i][bStream_X], bStream[i][bStream_Y], bStream[i][bStream_Z]
  699.             , bStream[i][bStream_rX], bStream[i][bStream_rY], bStream[i][bStream_rZ]
  700.             , bStream[i][bStream_DrawDistance]
  701.             , (use_vworld?vworld:bStream[i][bStream_VWorld]), bStream[i][bStream_Interior], bStream[i][bStream_PlayerID]
  702.         );
  703.         else
  704.         {
  705.             nline = true;
  706.             format(writestr, sizeof writestr, "CreateBObject(%d, %0.8f, %0.8f, %0.8f, %0.8f, %0.8f, %0.8f, %0.8f, %d, %d, %d);"
  707.                 , bStream[i][bStream_Model], bStream[i][bStream_X], bStream[i][bStream_Y], bStream[i][bStream_Z]
  708.                 , bStream[i][bStream_rX], bStream[i][bStream_rY], bStream[i][bStream_rZ]
  709.                 , bStream[i][bStream_DrawDistance]
  710.                 , (use_vworld?vworld:bStream[i][bStream_VWorld]), bStream[i][bStream_Interior], bStream[i][bStream_PlayerID]
  711.             );
  712.         }
  713.         fwrite(pwnfile, writestr);
  714.         countobjects++;
  715.     }
  716.     foreach(Iter_BVehicle, i)
  717.     {
  718.         GetVehiclePos(i, vehdata[0], vehdata[1], vehdata[2]);
  719.         GetVehicleZAngle(i, vehdata[3]);
  720.         if(nline) format(writestr, sizeof writestr, "\r\nCreateBVehicle(%d, %0.8f, %0.8f, %0.8f, %0.8f, %d, %d, %d, %d, %d);"
  721.             , GetVehicleModel(i)
  722.             , vehdata[0], vehdata[1], vehdata[2], vehdata[3]
  723.             , bVStream[i-1][bVStream_Color1], bVStream[i-1][bVStream_Color2]
  724.             , bVStream[i-1][bVStream_Respawn], bVStream[i-1][bVStream_Interior], (use_vworld?vworld:GetVehicleVirtualWorld(i))
  725.         );
  726.         else
  727.         {
  728.             nline = true;
  729.             format(writestr, sizeof writestr, "CreateBVehicle(%d, %0.8f, %0.8f, %0.8f, %0.8f, %d, %d, %d, %d, %d);"
  730.                 , GetVehicleModel(i)
  731.                 , vehdata[0], vehdata[1], vehdata[2], vehdata[3]
  732.                 , bVStream[i-1][bVStream_Color1], bVStream[i-1][bVStream_Color2]
  733.                 , bVStream[i-1][bVStream_Respawn], bVStream[i-1][bVStream_Interior], (use_vworld?vworld:GetVehicleVirtualWorld(i))
  734.             );
  735.         }
  736.         fwrite(pwnfile, writestr);
  737.         countvehicles++;
  738.     }
  739.     fclose(pwnfile);
  740.     printf("\"%s\" %d objects and %d vehicles have been saved!", file_name, countobjects, countvehicles);
  741.     return 1;
  742. }
  743.  
  744. stock LoadPWN(const file_name[], bool:error_clear = true, bool:use_vworld = false, vworld = -1)
  745. {
  746.     if(!fexist(file_name))
  747.     {
  748.         printf("File \"%s\" does not found!", file_name);
  749.         return 0;
  750.     }
  751.     new File:pwnfile = fopen(file_name, io_read);
  752.     if(!pwnfile)
  753.     {
  754.         printf("Couldn't open file \"%s\".", file_name);
  755.         return 0;
  756.     }
  757.     new buffer[256], bufferlen, objpos = 0, vehpos = 0, bool:incomment = false, pos = -1, BMapInfo[btStreamInfos], BVehInfo[btVStreamInfos], line = 0, formatstr[64], bool:commentjmp;
  758.     while(fread(pwnfile, buffer))
  759.     {
  760.         bufferlen = strlen(buffer);
  761.         for(new i = bufferlen-1; i >= 0; i--)
  762.         {
  763.             if(buffer[i] == '\r' || buffer[i] == '\n')
  764.             {
  765.                 buffer[i] = EOS;
  766.                 bufferlen = i;
  767.             }
  768.             else if(buffer[i] == '\t') buffer[i] = ' ';
  769.         }
  770.         if(incomment)
  771.         {
  772.             for(new i = 0; i < bufferlen-1; i++)
  773.             {
  774.                 if(buffer[i] == '*')
  775.                 {
  776.                     if(buffer[i+1] == '/')
  777.                     {
  778.                         incomment = false;
  779.                         for(new j = i+1; j >= 0; j--) buffer[j] = ' ';
  780.                         goto bstreamer_nocomment;
  781.                     }
  782.                 }
  783.             }
  784.         }
  785.         else
  786.         {
  787.             bstreamer_nocomment:
  788.             for(new i = bufferlen-2; i >= 0; i--)
  789.             {
  790.                 if(buffer[i] == '/')
  791.                 {
  792.                     if(buffer[i+1] == '/')
  793.                     {
  794.                         for(new j = i; j < bufferlen; j++) buffer[j] = EOS;
  795.                         bufferlen = i;
  796.                     }
  797.                     else if(buffer[i+1] == '*')
  798.                     {
  799.                         incomment = true;
  800.                         for(new j = i+2; j < bufferlen-1; j++)
  801.                         {
  802.                             if(buffer[j] == '*')
  803.                             {
  804.                                 if(buffer[j+1] == '/')
  805.                                 {
  806.                                     incomment = false;
  807.                                     for(new k = j+1; k >= i+1; k--) buffer[k] = ' ';
  808.                                 }
  809.                             }
  810.                         }
  811.                         if(incomment)
  812.                         {
  813.                             for(new j = bufferlen-1; j >= i; j--) buffer[j] = EOS;
  814.                             bufferlen = i;
  815.                             commentjmp = true;
  816.                             goto bstreamer_comment;
  817.                         }
  818.                     }
  819.                 }
  820.             }
  821.             bstreamer_comment:
  822.             if(commentjmp)
  823.             {
  824.                 commentjmp = false;
  825.                 line++;
  826.                 continue;
  827.             }
  828.             pos = strfind(buffer, "CreateBObject(", true);
  829.             if(pos != -1)
  830.             {
  831.                 for(new i = bufferlen-1; i >= 0; i--)
  832.                 {
  833.                     switch(buffer[i])
  834.                     {
  835.                         case '0'..'9', '.', '-':{}
  836.                         default: buffer[i] = ' ';
  837.                     }
  838.                 }
  839.                 format(formatstr, sizeof formatstr, "dffffffF(%.4f)D(-1)D(-1)D(-1)", B_OBJECT_STREAM_DISTANCE);
  840.                 if(!sscanf(buffer, formatstr
  841.                     , BMapInfo[btStream_Model]
  842.                     , BMapInfo[btStream_X]
  843.                     , BMapInfo[btStream_Y]
  844.                     , BMapInfo[btStream_Z]
  845.                     , BMapInfo[btStream_rX]
  846.                     , BMapInfo[btStream_rY]
  847.                     , BMapInfo[btStream_rZ]
  848.                     , BMapInfo[btStream_DrawDistance]
  849.                     , BMapInfo[btStream_VWorld]
  850.                     , BMapInfo[btStream_Interior]
  851.                     , BMapInfo[btStream_PlayerID]))
  852.                 {
  853.                     if(CreateBObject(BMapInfo[btStream_Model], BMapInfo[btStream_X], BMapInfo[btStream_Y], BMapInfo[btStream_Z], BMapInfo[btStream_rX], BMapInfo[btStream_rY], BMapInfo[btStream_rZ], BMapInfo[btStream_DrawDistance], (use_vworld?vworld:BMapInfo[btStream_VWorld]), BMapInfo[btStream_Interior], BMapInfo[btStream_PlayerID]) == -1)
  854.                     {
  855.                         if(error_clear)
  856.                         {
  857.                             DestroyAllBObjects(vworld);
  858.                             DestroyAllBVehicles(use_vworld, vworld);
  859.                         }
  860.                         fclose(pwnfile);
  861.                         printf("Map \"%s\" overflow. Server can't load more than %d objects!", file_name, MAX_B_OBJECTS);
  862.                         return 0;
  863.                     }
  864.                     objpos++;
  865.                 }
  866.                 else printf("Line %d (CreateBObject) invalid amount of arguments.", line+1);
  867.                 pos = -1;
  868.                 line++;
  869.                 continue;
  870.             }
  871.             pos = strfind(buffer, "CreateBVehicle(", true);
  872.             if(pos != -1)
  873.             {
  874.                 for(new i = bufferlen-1; i >= 0; i--)
  875.                 {
  876.                     switch(buffer[i])
  877.                     {
  878.                         case '0'..'9', '.', '-':{}
  879.                         default: buffer[i] = ' ';
  880.                     }
  881.                 }
  882.                 if(!sscanf(buffer, "dffffdddD(0)D(0)"
  883.                     , BVehInfo[btVStream_Model]
  884.                     , BVehInfo[btVStream_X]
  885.                     , BVehInfo[btVStream_Y]
  886.                     , BVehInfo[btVStream_Z]
  887.                     , BVehInfo[btVStream_rZ]
  888.                     , BVehInfo[btVStream_Color1]
  889.                     , BVehInfo[btVStream_Color2]
  890.                     , BVehInfo[btVStream_Respawn]
  891.                     , BVehInfo[btVStream_Interior]
  892.                     , BVehInfo[btVStream_VWorld]))
  893.                 {
  894.                     if(CreateBVehicle(BVehInfo[btVStream_Model], BVehInfo[btVStream_X], BVehInfo[btVStream_Y], BVehInfo[btVStream_Z], BVehInfo[btVStream_rZ], BVehInfo[btVStream_Color1], BVehInfo[btVStream_Color2], BVehInfo[btVStream_Respawn], BVehInfo[btVStream_Interior], BVehInfo[btVStream_VWorld]) == 0)
  895.                     {
  896.                         if(error_clear)
  897.                         {
  898.                             DestroyAllBObjects(vworld);
  899.                             DestroyAllBVehicles(use_vworld, vworld);
  900.                         }
  901.                         fclose(pwnfile);
  902.                         printf("Map \"%s\" overflow. Server can't load more than %d vehicles!", file_name, MAX_VEHICLES);
  903.                         return 0;
  904.                     }
  905.                     objpos++;
  906.                     vehpos++;
  907.                 }
  908.                 else printf("Line %d (CreateBVehicle) invalid amount of arguments.", line+1);
  909.                 pos = -1;
  910.                 line++;
  911.                 continue;
  912.             }
  913.         }
  914.         line++;
  915.     }
  916.     fclose(pwnfile);
  917.     printf("Map \"%s\" %d objects and %d vehicles have been loaded!", file_name, objpos, vehpos);
  918.     return 1;
  919. }
  920.  
  921. stock BMap_To_PWN(bmap_fname[], pwn_fname[], bool:error_clear = true, bool:use_single_vworld = false, single_vworld = -1)
  922. {
  923.     if(!fexist(bmap_fname))
  924.     {
  925.         printf("File \"%s\" does not exist!", bmap_fname);
  926.         return 0;
  927.     }
  928.     new File:bmapfile = fopen(bmap_fname, io_read);
  929.     if(!bmapfile)
  930.     {
  931.         printf("Couldn't open file \"%s\".", bmap_fname);
  932.         return 0;
  933.     }
  934.     new File:pwnfile = fopen(pwn_fname, io_write);
  935.     if(!pwnfile)
  936.     {
  937.         printf("Couldn't open file \"%s\".", pwn_fname);
  938.         return 0;
  939.     }
  940.     new funcid, buffer = 0, funcpos = 0, objpos = 0, vehpos = 0, writestr[256], testval;
  941.     while((funcid = fgetchar(bmapfile, 0, false)) != -1)
  942.     {
  943.         switch(funcid)
  944.         {
  945.             case 1:
  946.             {
  947.                 for(new argpos = 0; argpos < 11; argpos++)
  948.                 {
  949.                     for(new i = 0; i < 4; i++)
  950.                     {
  951.                         testval = fgetchar(bmapfile, 0, false);
  952.                         if(testval == -1)
  953.                         {
  954.                             fclose(bmapfile);
  955.                             fclose(pwnfile);
  956.                             if(error_clear) fremove(pwn_fname);
  957.                             printf("Map \"%s\" is broken.", bmap_fname);
  958.                             return 0;
  959.                         }
  960.                         buffer |= testval<<(i*8);
  961.                     }
  962.                     switch(argpos)
  963.                     {
  964.                         case 0:
  965.                         {
  966.                             if(funcpos == 0) format(writestr, sizeof writestr, "CreateBObject(%d, ", buffer);
  967.                             else format(writestr, sizeof writestr, "\r\nCreateBObject(%d, ", buffer);
  968.                         }
  969.                         case 1..6: format(writestr, sizeof writestr, "%s%0.8f, ", writestr, Float:buffer);
  970.                         case 7:
  971.                         {
  972.                             format(writestr, sizeof writestr, "%s%0.8f, ", writestr, Float:buffer);
  973.                             if(use_single_vworld)
  974.                             {
  975.                                 fseek(bmapfile, 4, seek_current);
  976.                                 argpos++;
  977.                                 format(writestr, sizeof writestr, "%s%d, ", writestr, single_vworld);
  978.                             }
  979.                         }
  980.                         case 8,9: format(writestr, sizeof writestr, "%s%d, ", writestr, buffer);
  981.                         case 10:
  982.                         {
  983.                             format(writestr, sizeof writestr, "%s%d);", writestr, buffer);
  984.                             fwrite(pwnfile, writestr);
  985.                             objpos++;
  986.                             funcpos++;
  987.                         }
  988.                     }
  989.                     buffer = 0;
  990.                 }
  991.             }
  992.             case 2:
  993.             {
  994.                 for(new argpos = 0; argpos < 10; argpos++)
  995.                 {
  996.                     for(new i = 0; i < 4; i++)
  997.                     {
  998.                         testval = fgetchar(bmapfile, 0, false);
  999.                         if(testval == -1)
  1000.                         {
  1001.                             fclose(bmapfile);
  1002.                             fclose(pwnfile);
  1003.                             if(error_clear) fremove(pwn_fname);
  1004.                             printf("Map \"%s\" is broken.", bmap_fname);
  1005.                             return 0;
  1006.                         }
  1007.                         buffer |= testval<<(i*8);
  1008.                     }
  1009.                     switch(argpos)
  1010.                     {
  1011.                         case 0:
  1012.                         {
  1013.                             if(funcpos == 0) format(writestr, sizeof writestr, "CreateBVehicle(%d, ", buffer);
  1014.                             else format(writestr, sizeof writestr, "\r\nCreateBVehicle(%d, ", buffer);
  1015.                         }
  1016.                         case 1..4: format(writestr, sizeof writestr, "%s%0.8f, ", writestr, Float:buffer);
  1017.                         case 5..7: format(writestr, sizeof writestr, "%s%d, ", writestr, buffer);
  1018.                         case 8:
  1019.                         {
  1020.                             format(writestr, sizeof writestr, "%s%d, ", writestr, buffer);
  1021.                             if(use_single_vworld)
  1022.                             {
  1023.                                 fseek(bmapfile, 4, seek_current);
  1024.                                 argpos++;
  1025.                                 format(writestr, sizeof writestr, "%s%d);", writestr, single_vworld);
  1026.                                 fwrite(pwnfile, writestr);
  1027.                                 vehpos++;
  1028.                                 funcpos++;
  1029.                             }
  1030.                         }
  1031.                         case 9:
  1032.                         {
  1033.                             format(writestr, sizeof writestr, "%s%d);", writestr, buffer);
  1034.                             fwrite(pwnfile, writestr);
  1035.                             vehpos++;
  1036.                             funcpos++;
  1037.                         }
  1038.                     }
  1039.                     buffer = 0;
  1040.                 }
  1041.             }
  1042.             default:
  1043.             {
  1044.                 fclose(bmapfile);
  1045.                 fclose(pwnfile);
  1046.                 if(error_clear) fremove(pwn_fname);
  1047.                 printf("Map \"%s\" unknown function ID: %d", bmap_fname, funcid);
  1048.                 return 0;
  1049.             }
  1050.         }
  1051.     }
  1052.     printf("Map \"%s\" -> \"%s\" %d objects and %d vehicles converted.", bmap_fname, pwn_fname, objpos, vehpos);
  1053.     fclose(bmapfile);
  1054.     fclose(pwnfile);
  1055.     return 1;
  1056. }
  1057.  
  1058. stock PWN_To_BMap(pwn_fname[], bmap_fname[], bool:use_single_vworld = false, single_vworld = -1)
  1059. {
  1060.     if(!fexist(pwn_fname))
  1061.     {
  1062.         printf("File \"%s\" does not found!", pwn_fname);
  1063.         return 0;
  1064.     }
  1065.     new File:pwnfile = fopen(pwn_fname, io_read);
  1066.     if(!pwnfile)
  1067.     {
  1068.         printf("Couldn't open file \"%s\".", pwn_fname);
  1069.         return 0;
  1070.     }
  1071.     new File:bmapfile = fopen(bmap_fname, io_write);
  1072.     if(!bmapfile)
  1073.     {
  1074.         printf("Couldn't open file \"%s\".", bmap_fname);
  1075.         return 0;
  1076.     }
  1077.     new buffer[256], bufferlen, objpos = 0, vehpos = 0, bool:incomment = false, pos = -1, BMapInfo[btStreamInfos], BVehInfo[btVStreamInfos], line = 0, formatstr[64], bool:commentjmp;
  1078.     while(fread(pwnfile, buffer))
  1079.     {
  1080.         bufferlen = strlen(buffer);
  1081.         for(new i = bufferlen-1; i >= 0; i--)
  1082.         {
  1083.             if(buffer[i] == '\r' || buffer[i] == '\n')
  1084.             {
  1085.                 buffer[i] = EOS;
  1086.                 bufferlen = i;
  1087.             }
  1088.             else if(buffer[i] == '\t') buffer[i] = ' ';
  1089.         }
  1090.         if(incomment)
  1091.         {
  1092.             for(new i = 0; i < bufferlen-1; i++)
  1093.             {
  1094.                 if(buffer[i] == '*')
  1095.                 {
  1096.                     if(buffer[i+1] == '/')
  1097.                     {
  1098.                         incomment = false;
  1099.                         for(new j = i+1; j >= 0; j--) buffer[j] = ' ';
  1100.                         goto bstreamer_nocomment;
  1101.                     }
  1102.                 }
  1103.             }
  1104.         }
  1105.         else
  1106.         {
  1107.             bstreamer_nocomment:
  1108.             for(new i = bufferlen-2; i >= 0; i--)
  1109.             {
  1110.                 if(buffer[i] == '/')
  1111.                 {
  1112.                     if(buffer[i+1] == '/')
  1113.                     {
  1114.                         for(new j = i; j < bufferlen; j++) buffer[j] = EOS;
  1115.                         bufferlen = i;
  1116.                     }
  1117.                     else if(buffer[i+1] == '*')
  1118.                     {
  1119.                         incomment = true;
  1120.                         for(new j = i+2; j < bufferlen-1; j++)
  1121.                         {
  1122.                             if(buffer[j] == '*')
  1123.                             {
  1124.                                 if(buffer[j+1] == '/')
  1125.                                 {
  1126.                                     incomment = false;
  1127.                                     for(new k = j+1; k >= i+1; k--) buffer[k] = ' ';
  1128.                                 }
  1129.                             }
  1130.                         }
  1131.                         if(incomment)
  1132.                         {
  1133.                             for(new j = bufferlen-1; j >= i; j--) buffer[j] = EOS;
  1134.                             bufferlen = i;
  1135.                             commentjmp = true;
  1136.                             goto bstreamer_comment;
  1137.                         }
  1138.                     }
  1139.                 }
  1140.             }
  1141.             bstreamer_comment:
  1142.             if(commentjmp)
  1143.             {
  1144.                 commentjmp = false;
  1145.                 line++;
  1146.                 continue;
  1147.             }
  1148.             pos = strfind(buffer, "CreateBObject(", true);
  1149.             if(pos != -1)
  1150.             {
  1151.                 for(new i = bufferlen-1; i >= 0; i--)
  1152.                 {
  1153.                     switch(buffer[i])
  1154.                     {
  1155.                         case '0'..'9', '.', '-':{}
  1156.                         default: buffer[i] = ' ';
  1157.                     }
  1158.                 }
  1159.                 format(formatstr, sizeof formatstr, "dffffffF(%.4f)D(-1)D(-1)D(-1)", B_OBJECT_STREAM_DISTANCE);
  1160.                 if(!sscanf(buffer, formatstr
  1161.                     , BMapInfo[btStream_Model]
  1162.                     , BMapInfo[btStream_X]
  1163.                     , BMapInfo[btStream_Y]
  1164.                     , BMapInfo[btStream_Z]
  1165.                     , BMapInfo[btStream_rX]
  1166.                     , BMapInfo[btStream_rY]
  1167.                     , BMapInfo[btStream_rZ]
  1168.                     , BMapInfo[btStream_DrawDistance]
  1169.                     , BMapInfo[btStream_VWorld]
  1170.                     , BMapInfo[btStream_Interior]
  1171.                     , BMapInfo[btStream_PlayerID]))
  1172.                 {
  1173.                     fputchar(bmapfile, 1, false);
  1174.                     for(new j = 0; j < 4; j++) fputchar(bmapfile, (BMapInfo[btStream_Model]>>>(j*8))&0xFF, false);
  1175.                     for(new j = 0; j < 4; j++) fputchar(bmapfile, (_:BMapInfo[btStream_X]>>>(j*8))&0xFF, false);
  1176.                     for(new j = 0; j < 4; j++) fputchar(bmapfile, (_:BMapInfo[btStream_Y]>>>(j*8))&0xFF, false);
  1177.                     for(new j = 0; j < 4; j++) fputchar(bmapfile, (_:BMapInfo[btStream_Z]>>>(j*8))&0xFF, false);
  1178.                     for(new j = 0; j < 4; j++) fputchar(bmapfile, (_:BMapInfo[btStream_rX]>>>(j*8))&0xFF, false);
  1179.                     for(new j = 0; j < 4; j++) fputchar(bmapfile, (_:BMapInfo[btStream_rY]>>>(j*8))&0xFF, false);
  1180.                     for(new j = 0; j < 4; j++) fputchar(bmapfile, (_:BMapInfo[btStream_rZ]>>>(j*8))&0xFF, false);
  1181.                     for(new j = 0; j < 4; j++) fputchar(bmapfile, (_:BMapInfo[btStream_DrawDistance]>>>(j*8))&0xFF, false);
  1182.                     if(use_single_vworld) for(new j = 0; j < 4; j++) fputchar(bmapfile, (single_vworld>>>(j*8))&0xFF, false);
  1183.                     else for(new j = 0; j < 4; j++) fputchar(bmapfile, (BMapInfo[btStream_VWorld]>>>(j*8))&0xFF, false);
  1184.                     for(new j = 0; j < 4; j++) fputchar(bmapfile, (BMapInfo[btStream_Interior]>>>(j*8))&0xFF, false);
  1185.                     for(new j = 0; j < 4; j++) fputchar(bmapfile, (BMapInfo[btStream_PlayerID]>>>(j*8))&0xFF, false);
  1186.                     objpos++;
  1187.                 }
  1188.                 else printf("Line %d (CreateBObject) invalid amount of arguments.", line+1);
  1189.                 pos = -1;
  1190.                 line++;
  1191.                 continue;
  1192.             }
  1193.             pos = strfind(buffer, "CreateBVehicle(", true);
  1194.             if(pos != -1)
  1195.             {
  1196.                 for(new i = bufferlen-1; i >= 0; i--)
  1197.                 {
  1198.                     switch(buffer[i])
  1199.                     {
  1200.                         case '0'..'9', '.', '-':{}
  1201.                         default: buffer[i] = ' ';
  1202.                     }
  1203.                 }
  1204.                 if(!sscanf(buffer, "dffffdddD(0)D(0)"
  1205.                     , BVehInfo[btVStream_Model]
  1206.                     , BVehInfo[btVStream_X]
  1207.                     , BVehInfo[btVStream_Y]
  1208.                     , BVehInfo[btVStream_Z]
  1209.                     , BVehInfo[btVStream_rZ]
  1210.                     , BVehInfo[btVStream_Color1]
  1211.                     , BVehInfo[btVStream_Color2]
  1212.                     , BVehInfo[btVStream_Respawn]
  1213.                     , BVehInfo[btVStream_Interior]
  1214.                     , BVehInfo[btVStream_VWorld]))
  1215.                 {
  1216.                     fputchar(bmapfile, 2, false);
  1217.                     for(new j = 0; j < 4; j++) fputchar(bmapfile, (BVehInfo[btVStream_Model]>>>(j*8))&0xFF, false);
  1218.                     for(new j = 0; j < 4; j++) fputchar(bmapfile, (_:BVehInfo[btVStream_X]>>>(j*8))&0xFF, false);
  1219.                     for(new j = 0; j < 4; j++) fputchar(bmapfile, (_:BVehInfo[btVStream_Y]>>>(j*8))&0xFF, false);
  1220.                     for(new j = 0; j < 4; j++) fputchar(bmapfile, (_:BVehInfo[btVStream_Z]>>>(j*8))&0xFF, false);
  1221.                     for(new j = 0; j < 4; j++) fputchar(bmapfile, (_:BVehInfo[btVStream_rZ]>>>(j*8))&0xFF, false);
  1222.                     for(new j = 0; j < 4; j++) fputchar(bmapfile, (BVehInfo[btVStream_Color1]>>>(j*8))&0xFF, false);
  1223.                     for(new j = 0; j < 4; j++) fputchar(bmapfile, (BVehInfo[btVStream_Color2]>>>(j*8))&0xFF, false);
  1224.                     for(new j = 0; j < 4; j++) fputchar(bmapfile, (BVehInfo[btVStream_Respawn]>>>(j*8))&0xFF, false);
  1225.                     for(new j = 0; j < 4; j++) fputchar(bmapfile, (BVehInfo[btVStream_Interior]>>>(j*8))&0xFF, false);
  1226.                     if(use_single_vworld) for(new j = 0; j < 4; j++) fputchar(bmapfile, (single_vworld>>>(j*8))&0xFF, false);
  1227.                     else for(new j = 0; j < 4; j++) fputchar(bmapfile, (BVehInfo[btVStream_VWorld]>>>(j*8))&0xFF, false);
  1228.                     vehpos++;
  1229.                 }
  1230.                 else printf("Line %d (CreateBVehicle) invalid amount of arguments.", line+1);
  1231.                 pos = -1;
  1232.                 line++;
  1233.                 continue;
  1234.             }
  1235.         }
  1236.         line++;
  1237.     }
  1238.     fclose(pwnfile);
  1239.     fclose(bmapfile);
  1240.     printf("\"%s\" -> \"%s\" %d objects and %d vehicles have been converted!", pwn_fname, bmap_fname, objpos, vehpos);
  1241.     return 1;
  1242. }
  1243. #endif
  1244.  
  1245. stock CreateBVehicle(vehicletype, Float:x, Float:y, Float:z, Float:rotation, color1, color2, respawn_delay, interior = 0, vworld = 0)
  1246. {
  1247.     new vehicleid = CreateVehicle(vehicletype, x, y, z, rotation, color1, color2, respawn_delay);
  1248.     if(vehicleid == 0) return 0;
  1249.     if(interior != 0) LinkVehicleToInterior(vehicleid, interior);
  1250.     if(vworld != 0) SetVehicleVirtualWorld(vehicleid, vworld);
  1251.     bVStream[vehicleid-1][bVStream_Interior] = interior;
  1252.     bVStream[vehicleid-1][bVStream_Color1] = color1;
  1253.     bVStream[vehicleid-1][bVStream_Color2] = color2;
  1254.     bVStream[vehicleid-1][bVStream_Is] = true;
  1255.     Iter_Add(Iter_BVehicle, vehicleid);
  1256.     return vehicleid;
  1257. }
  1258.  
  1259. stock DestroyBVehicle(vehicleid)
  1260. {
  1261.     if(vehicleid < 1 || vehicleid > MAX_VEHICLES) return false;
  1262.     if(!bVStream[vehicleid-1][bVStream_Is]) return false;
  1263.     bVStream[vehicleid-1][bVStream_Is] = false;
  1264.     DestroyVehicle(vehicleid);
  1265.     Iter_Remove(Iter_BVehicle, vehicleid);
  1266.     return true;
  1267. }
  1268.  
  1269. stock DestroyAllBVehicles(bool:use_vworld = false, vworld = 0)
  1270. {
  1271.     if(use_vworld)
  1272.     {
  1273.         foreach(Iter_BVehicle, i)
  1274.         {
  1275.             if(!bVStream[i-1][bVStream_Is]) continue;
  1276.             if(use_vworld) if(vworld != GetVehicleVirtualWorld(i)) continue;
  1277.             bVStream[i-1][bVStream_Is] = false;
  1278.             DestroyVehicle(i);
  1279.             new ni;
  1280.             Iter_SafeRemove(Iter_BVehicle, i, ni);
  1281.             i = ni;
  1282.         }
  1283.         Iter_Clear(Iter_BVehicle);
  1284.     }
  1285.     else
  1286.     {
  1287.         foreach(Iter_BVehicle, i)
  1288.         {
  1289.             if(!bVStream[i-1][bVStream_Is]) continue;
  1290.             if(use_vworld) if(vworld != GetVehicleVirtualWorld(i)) continue;
  1291.             bVStream[i-1][bVStream_Is] = false;
  1292.             DestroyVehicle(i);
  1293.         }
  1294.         Iter_Clear(Iter_BVehicle);
  1295.     }
  1296. }
  1297.  
  1298. stock GetBVehicleColors(vehicleid, &color1, &color2)
  1299. {
  1300.     if(vehicleid <= 0 || vehicleid > MAX_VEHICLES) return;
  1301.     color1 = bVStream[vehicleid-1][bVStream_Color1];
  1302.     color2 = bVStream[vehicleid-1][bVStream_Color2];
  1303. }
  1304.  
  1305. stock GetBVehicleData(vehicleid, &color1, &color2, &respawn_delay, &interior)
  1306. {
  1307.     if(vehicleid <= 0 || vehicleid > MAX_VEHICLES) return;
  1308.     color1 = bVStream[vehicleid-1][bVStream_Color1];
  1309.     color2 = bVStream[vehicleid-1][bVStream_Color2];
  1310.     respawn_delay = bVStream[vehicleid-1][bVStream_Respawn];
  1311.     interior = bVStream[vehicleid-1][bVStream_Interior];
  1312. }
  1313.  
  1314. stock IsCameraInRangeOfPoint(playerid, Float:range, Float:X, Float:Y, Float:Z)
  1315. {
  1316.     new Float:pCamPos[3];
  1317.     GetPlayerCameraPos(playerid, pCamPos[0], pCamPos[1], pCamPos[2]);
  1318.     if(floatsqroot((X-pCamPos[0])*(X-pCamPos[0])+(Y-pCamPos[1])*(Y-pCamPos[1])+(Z-pCamPos[2])*(Z-pCamPos[2])) <= range) return true;
  1319.     return false;
  1320. }
  1321.  
  1322. #if defined FILTERSCRIPT
  1323. public OnFilterScriptInit()
  1324. #else
  1325. public OnGameModeInit()
  1326. #endif
  1327. {
  1328.     bStreamCallBacks = ((funcidx("OnBObjectStreamIn") != -1 ? 0x1 : 0x0)|(funcidx("OnBObjectStreamOut") != -1 ? 0x2 : 0x0)|(funcidx("OnBObjectMoved") != -1 ? 0x4: 0x0));
  1329.     for(new i = 0; i < MAX_B_OBJECTS; i++) for(new j = 0; j < MAX_PLAYERS; j++) bStream[i][bStream_pObjectID][j] = -1;
  1330.     bStreamTimer = SetTimer("bStream_Update", B_OBJECT_TICK, true);
  1331. #if defined FILTERSCRIPT
  1332.     return CallLocalFunction("bStream_OnFilterScriptInit", "");
  1333. #else
  1334.     return CallLocalFunction("bStream_OnGameModeInit", "");
  1335. #endif
  1336. }
  1337. #if defined FILTERSCRIPT
  1338.     #if defined _ALS_OnFilterScriptInit
  1339.         #undef OnFilterScriptInit
  1340.     #else
  1341.         #define _ALS_OnFilterScriptInit
  1342.     #endif
  1343.     #define OnFilterScriptInit bStream_OnFilterScriptInit
  1344. forward bStream_OnFilterScriptInit();
  1345. #else
  1346.     #if defined _ALS_OnGameModeInit
  1347.         #undef OnGameModeInit
  1348.     #else
  1349.         #define _ALS_OnGameModeInit
  1350.     #endif
  1351.     #define OnGameModeInit bStream_OnGameModeInit
  1352. forward bStream_OnGameModeInit();
  1353. #endif
  1354.  
  1355. public bStream_Update()
  1356. {
  1357.     foreach(Player, playerid)
  1358.     {
  1359.         new bstreamcount = 0;
  1360.         foreach(Iter_BObject, i)
  1361.         {  
  1362.             if(bstreamcount >= LIMIT_B_OBJECTS)
  1363.             {
  1364.                 if(bStream[i][bStream_pObjectID][playerid] != -1)
  1365.                 {
  1366.                     if(bStreamCallBacks&2?CallLocalFunction("OnBObjectStreamOut", "ddd", playerid, i, bStream[i][bStream_pObjectID][playerid]):1)
  1367.                     {
  1368.                         DestroyPlayerObject(playerid, bStream[i][bStream_pObjectID][playerid]);
  1369.                         bStream[i][bStream_pObjectID][playerid] = -1;
  1370.                     }
  1371.                 }
  1372.             }
  1373.             else
  1374.             {
  1375.                 if(bStream[i][bStream_Is])
  1376.                 {
  1377.                     if(bStream[i][bStream_Moving])
  1378.                     {
  1379.                         new Float:bObjPos[3];
  1380.                         GetBObjectPos(i, bObjPos[0], bObjPos[1], bObjPos[2]);
  1381. #if defined USE_CAMERA_STREAM
  1382.                         if(IsCameraInRangeOfPoint(playerid, bStream[i][bStream_DrawDistance], bObjPos[0], bObjPos[1], bObjPos[2]) && (bStream[i][bStream_VWorld] == -1 || bStream[i][bStream_VWorld] == GetPlayerVirtualWorld(playerid)) && (bStream[i][bStream_Interior] == -1 || bStream[i][bStream_Interior] == GetPlayerInterior(playerid)) && (bStream[i][bStream_PlayerID] == -1 || bStream[i][bStream_PlayerID] == playerid))
  1383. #else
  1384.                         if(IsPlayerInRangeOfPoint(playerid, bStream[i][bStream_DrawDistance], bObjPos[0], bObjPos[1], bObjPos[2]) && (bStream[i][bStream_VWorld] == -1 || bStream[i][bStream_VWorld] == GetPlayerVirtualWorld(playerid)) && (bStream[i][bStream_Interior] == -1 || bStream[i][bStream_Interior] == GetPlayerInterior(playerid)) && (bStream[i][bStream_PlayerID] == -1 || bStream[i][bStream_PlayerID] == playerid))
  1385. #endif
  1386.                         {
  1387.                             if(bStream[i][bStream_pObjectID][playerid] == -1)
  1388.                             {
  1389.                                 bStream[i][bStream_pObjectID][playerid] = CreatePlayerObject(playerid, bStream[i][bStream_Model], bStream[i][bStream_X], bStream[i][bStream_Y], bStream[i][bStream_Z], bStream[i][bStream_rX], bStream[i][bStream_rY], bStream[i][bStream_rZ], bStream[i][bStream_DrawDistance]);
  1390.                                 if(bStream[i][bStream_pTryAttachCam][playerid]) AttachCameraToPlayerObject(playerid, bStream[i][bStream_pObjectID][playerid]);
  1391.                                 MovePlayerObject(playerid, bStream[i][bStream_pObjectID][playerid], bStream[i][bStream_toX], bStream[i][bStream_toY], bStream[i][bStream_toZ], bStream[i][bStream_Speed], bStream[i][bStream_toRX], bStream[i][bStream_toRY], bStream[i][bStream_toRZ]);
  1392.                                 if(bStreamCallBacks&1) CallLocalFunction("OnBObjectStreamIn", "ddd", playerid, i, bStream[i][bStream_pObjectID][playerid]);
  1393.                             }
  1394.                             bstreamcount++;
  1395.                         }
  1396.                         else if(bStream[i][bStream_pObjectID][playerid] != -1)
  1397.                         {
  1398.                             if((bStreamCallBacks&2?CallLocalFunction("OnBObjectStreamOut", "ddd", playerid, i, bStream[i][bStream_pObjectID][playerid]):1))
  1399.                             {
  1400.                                 DestroyPlayerObject(playerid, bStream[i][bStream_pObjectID][playerid]);
  1401.                                 bStream[i][bStream_pObjectID][playerid] = -1;
  1402.                             }
  1403.                         }
  1404.                     }
  1405.                     else
  1406.                     {
  1407. #if defined USE_CAMERA_STREAM
  1408.                         if(IsCameraInRangeOfPoint(playerid, bStream[i][bStream_DrawDistance], bStream[i][bStream_X], bStream[i][bStream_Y], bStream[i][bStream_Z]) && (bStream[i][bStream_VWorld] == -1 || bStream[i][bStream_VWorld] == GetPlayerVirtualWorld(playerid)) && (bStream[i][bStream_Interior] == -1 || bStream[i][bStream_Interior] == GetPlayerInterior(playerid)) && (bStream[i][bStream_PlayerID] == -1 || bStream[i][bStream_PlayerID] == playerid))
  1409. #else
  1410.                         if(IsPlayerInRangeOfPoint(playerid, bStream[i][bStream_DrawDistance], bStream[i][bStream_X], bStream[i][bStream_Y], bStream[i][bStream_Z]) && (bStream[i][bStream_VWorld] == -1 || bStream[i][bStream_VWorld] == GetPlayerVirtualWorld(playerid)) && (bStream[i][bStream_Interior] == -1 || bStream[i][bStream_Interior] == GetPlayerInterior(playerid)) && (bStream[i][bStream_PlayerID] == -1 || bStream[i][bStream_PlayerID] == playerid))
  1411. #endif
  1412.                         {
  1413.                             if(bStream[i][bStream_pObjectID][playerid] == -1)
  1414.                             {
  1415.                                 bStream[i][bStream_pObjectID][playerid] = CreatePlayerObject(playerid, bStream[i][bStream_Model], bStream[i][bStream_X], bStream[i][bStream_Y], bStream[i][bStream_Z], bStream[i][bStream_rX], bStream[i][bStream_rY], bStream[i][bStream_rZ], bStream[i][bStream_DrawDistance]);
  1416.                                 if(bStream[i][bStream_pTryAttachCam][playerid]) AttachCameraToPlayerObject(playerid, bStream[i][bStream_pObjectID][playerid]);
  1417.                                 if(bStreamCallBacks&1) CallLocalFunction("OnBObjectStreamIn", "ddd", playerid, i, bStream[i][bStream_pObjectID][playerid]);
  1418.                             }
  1419.                             bstreamcount++;
  1420.                         }
  1421.                         else if(bStream[i][bStream_pObjectID][playerid] != -1)
  1422.                         {
  1423.                             if((bStreamCallBacks&2?CallLocalFunction("OnBObjectStreamOut", "ddd", playerid, i, bStream[i][bStream_pObjectID][playerid]):1))
  1424.                             {
  1425.                                 DestroyPlayerObject(playerid, bStream[i][bStream_pObjectID][playerid]);
  1426.                                 bStream[i][bStream_pObjectID][playerid] = -1;
  1427.                             }
  1428.                         }
  1429.                     }
  1430.                 }
  1431.                 else
  1432.                 {
  1433.                     if(bStream[i][bStream_pObjectID][playerid] != -1)
  1434.                     {
  1435.                         if(bStreamCallBacks&2?CallLocalFunction("OnBObjectStreamOut", "ddd", playerid, i, bStream[i][bStream_pObjectID][playerid]):1)
  1436.                         {
  1437.                             DestroyPlayerObject(playerid, bStream[i][bStream_pObjectID][playerid]);
  1438.                             bStream[i][bStream_pObjectID][playerid] = -1;
  1439.                         }
  1440.                     }
  1441.                     if(playerid == Iter_Last(Player))
  1442.                     {
  1443.                         new next;
  1444.                         Iter_SafeRemove(Iter_BObject, i, next);
  1445.                         i = next;
  1446.                     }
  1447.                 }
  1448.             }
  1449.         }
  1450.     }
  1451. }
Add Comment
Please, Sign In to add comment