Guest User

optidraw

a guest
Jul 15th, 2021
395
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 8.04 KB | None | 0 0
  1. /*
  2.  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS OR IMPLIED
  3.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  4.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
  5.  * EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  6.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  7.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  8.  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  9.  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  10.  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  11.  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  12.  */
  13.  
  14. /*
  15. Contributors:
  16.     - algorhitmically
  17.  
  18. Thanks to:
  19.     - Incognito - streamer plugin.
  20.     - Abagail and Crayder - modelsizes include.
  21.  
  22. Required plugins:
  23.     - Streamer
  24. */
  25.  
  26. /*
  27.       ______   _______   ________  ______  _______   _______    ______   __       __
  28.      /      \ /       \ /        |/      |/       \ /       \  /      \ /  |  _  /  |
  29.     /$$$$$$  |$$$$$$$  |$$$$$$$$/ $$$$$$/ $$$$$$$  |$$$$$$$  |/$$$$$$  |$$ | / \ $$ |
  30.     $$ |  $$ |$$ |__$$ |   $$ |     $$ |  $$ |  $$ |$$ |__$$ |$$ |__$$ |$$ |/$  \$$ |
  31.     $$ |  $$ |$$    $$/    $$ |     $$ |  $$ |  $$ |$$    $$< $$    $$ |$$ /$$$  $$ |
  32.     $$ |  $$ |$$$$$$$/     $$ |     $$ |  $$ |  $$ |$$$$$$$  |$$$$$$$$ |$$ $$/$$ $$ |
  33.     $$ \__$$ |$$ |         $$ |    _$$ |_ $$ |__$$ |$$ |  $$ |$$ |  $$ |$$$$/  $$$$ |
  34.     $$    $$/ $$ |         $$ |   / $$   |$$    $$/ $$ |  $$ |$$ |  $$ |$$$/    $$$ |
  35.      $$$$$$/  $$/          $$/    $$$$$$/ $$$$$$$/  $$/   $$/ $$/   $$/ $$/      $$/
  36.      
  37. */
  38.  
  39. #if defined _optidraw_included
  40.     #endinput
  41. #endif
  42.  
  43. #define METHOD_BOX (0)
  44. #define METHOD_SPHERE (1)
  45. #define OD_METHOD METHOD_BOX
  46.  
  47. #if !defined OD_METHOD
  48.     #error Optidraw: Please define a method using OD_METHOD! Available methods are: METHOD_BOX, METHOD_SPHERE
  49. #endif
  50.  
  51. #assert OD_METHOD >= 0 && OD_METHOD < 2
  52.  
  53. #include <a_samp>
  54. #tryinclude <modelsizes>
  55.  
  56. #if !defined GetModelColDimensions || !defined GetColSphereRadius
  57.     #error Optidraw: modelsizes doesn't have required functions or it's not loaded.
  58. #endif
  59.  
  60. #if !defined _streamer_included
  61.     #tryinclude <streamer>
  62. #endif
  63.  
  64. #if !defined _streamer_included
  65.     #error Optidraw: Cannot load streamer.
  66. #endif
  67.  
  68. public OnGameModeInit()
  69. {
  70.     #if defined od_OnGameModeInit
  71.         new od_gmi = od_OnGameModeInit();
  72.     #endif
  73.     Streamer_ToggleChunkStream(true);
  74.     Streamer_SetChunkSize(STREAMER_TYPE_OBJECT, 250);
  75.     Streamer_VisibleItems(STREAMER_TYPE_OBJECT, 975);
  76.     Streamer_SetTickRate(25);
  77.     #if defined od_OnGameModeInit
  78.         return od_gmi;
  79.     #else
  80.         return 1;
  81.     #endif
  82. }
  83.  
  84. #if defined _ALS_OnGameModeInit
  85.     #undef OnGameModeInit
  86. #else
  87.     #define _ALS_OnGameModeInit
  88. #endif
  89. #define OnGameModeInit od_OnGameModeInit
  90. #if defined od_OnGameModeInit
  91.     forward od_OnGameModeInit();
  92. #endif
  93.  
  94. #if defined STREAMER_ENABLE_TAGS
  95.     stock STREAMER_TAG_OBJECT:od_CreateDynamicObject(modelid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = 325.0, Float:drawdistance = 365.0, STREAMER_TAG_AREA:areaid = STREAMER_TAG_AREA:-1, priority = 0)
  96.     {
  97.         new STREAMER_TAG_OBJECT:od_objectid = CreateDynamicObject(modelid, x, y, z, rx, ry, rz, worldid, interiorid, playerid, streamdistance, drawdistance, STREAMER_TAG_AREA:areaid, priority)
  98. #else
  99.     stock od_CreateDynamicObject(modelid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = 325.0, Float:drawdistance = 365.0, STREAMER_TAG_AREA:areaid = -1, priority = 0)
  100.     {
  101.         new od_objectid = CreateDynamicObject(modelid, x, y, z, rx, ry, rz, worldid, interiorid, playerid, streamdistance, drawdistance, areaid, priority);
  102. #endif
  103.     OptimizeDynamicObject(od_objectid);
  104.     return od_objectid;
  105. }
  106.  
  107. #if defined _ALS_CreateDynamicObject
  108.     #undef CreateDynamicObject
  109. #else
  110.     #define _ALS_CreateDynamicObject
  111. #endif
  112. #define CreateDynamicObject od_CreateDynamicObject
  113.  
  114. #if defined STREAMER_ENABLE_TAGS
  115.     stock STREAMER_TAG_OBJECT:od_CreateDynamicObjectEx(modelid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz, Float:streamdistance = 325.0, Float:drawdistance = 365.0, const worlds[] = { -1 }, const interiors[] = { -1 }, const players[] = { -1 }, const STREAMER_TAG_AREA:areas[] = { STREAMER_TAG_AREA:-1 }, priority = 0, maxworlds = sizeof worlds, maxinteriors = sizeof interiors, maxplayers = sizeof players, maxareas = sizeof areas)
  116.     {
  117.         new STREAMER_TAG_OBJECT:od_objectid = CreateDynamicObjectEx(modelid, x, y, z, rx, ry, rz, streamdistance, drawdistance, worlds, interiors, players, STREAMER_TAG_AREA:areas, priority, maxworlds, maxinteriors, maxplayers, maxareas);
  118. #else
  119.     stock od_CreateDynamicObjectEx(modelid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz, Float:streamdistance = 325.0, Float:drawdistance = 365.0, const worlds[] = { -1 }, const interiors[] = { -1 }, const players[] = { -1 }, const areas[] = { STREAMER_TAG_AREA:-1 }, priority = 0, maxworlds = sizeof worlds, maxinteriors = sizeof interiors, maxplayers = sizeof players, maxareas = sizeof areas)
  120.     {
  121.         new od_objectid = CreateDynamicObjectEx(modelid, x, y, z, rx, ry, rz, streamdistance, drawdistance, worlds, interiors, players, areas, priority, maxworlds, maxinteriors, maxplayers, maxareas);
  122. #endif
  123.     OptimizeDynamicObject(od_objectid);
  124.     return od_objectid;
  125. }
  126.  
  127. #if defined _ALS_CreateDynamicObjectEx
  128.     #undef CreateDynamicObjectEx
  129. #else
  130.     #define _ALS_CreateDynamicObjectEx
  131. #endif
  132. #define CreateDynamicObjectEx od_CreateDynamicObjectEx
  133.  
  134. stock SetDynamicObjectData(STREAMER_TAG_OBJECT:objectid, Float:stream_distance, Float:draw_distance, priority)
  135. {
  136.     Streamer_SetFloatData(STREAMER_TYPE_OBJECT, objectid, E_STREAMER_DRAW_DISTANCE, stream_distance);
  137.     Streamer_SetFloatData(STREAMER_TYPE_OBJECT, objectid, E_STREAMER_STREAM_DISTANCE, draw_distance);
  138.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, objectid, E_STREAMER_PRIORITY, priority);
  139.     return true;
  140. }
  141.  
  142. stock OptimizeDynamicObject(STREAMER_TAG_OBJECT:objectid)
  143. {
  144.     if(!IsValidDynamicObject(objectid))
  145.         return false;
  146.  
  147.     new
  148.         od_modelid = -1,
  149.         Float:od_DrawDistance;
  150.  
  151.     od_modelid = Streamer_GetIntData(STREAMER_TYPE_OBJECT, objectid, E_STREAMER_MODEL_ID);
  152.     #if OD_METHOD
  153.         new Float:od_spherecol = GetColSphereRadius(od_modelid);
  154.         if(od_spherecol <= 0.0)
  155.             SetDynamicObjectData(objectid, 275.0, 275.0, 0);
  156.         else if(od_spherecol <= 11.25)
  157.         {
  158.             od_DrawDistance = od_spherecol * 75;
  159.             if(od_DrawDistance < 210.0)
  160.                 od_DrawDistance += 100.0;
  161.             SetDynamicObjectData(objectid, od_DrawDistance, od_DrawDistance, floatround((od_spherecol), floatround_round));
  162.         }
  163.         else
  164.             SetDynamicObjectData(objectid, 1000.0, 1000.0, floatround((od_spherecol), floatround_round));
  165.  
  166.     #else
  167.         new
  168.             Float:od_priority,
  169.             Float:od_ModelSize[3];
  170.        
  171.         if(GetModelColDimensions(od_modelid, od_ModelSize[0], od_ModelSize[1], od_ModelSize[2]))
  172.         {
  173.             if(od_ModelSize[0] > 40.0 && od_ModelSize[1] > 40.0 && od_ModelSize[2] < 12.0)
  174.             {
  175.                 #if !defined OD_DISABLE_STATIC_OBJECTS
  176.                     Streamer_ToggleItemStatic(STREAMER_TYPE_OBJECT, objectid, 1);
  177.                 #else
  178.                     SetDynamicObjectData(objectid, 400.0, 400.0, 5000);
  179.                 #endif
  180.             }
  181.             else
  182.             {
  183.                 od_priority = (od_ModelSize[0] * od_ModelSize[1] + od_ModelSize[1] * od_ModelSize[2] + od_ModelSize[2] * od_ModelSize[0]);
  184.                 if(od_priority <= 100.0) od_DrawDistance = 300.0;
  185.                 else if(od_priority <= 550.0) od_DrawDistance = 365.0;
  186.                 else if(od_priority <= 750.0) od_DrawDistance = 435.0;
  187.                 else if(od_priority <= 1000.0) od_DrawDistance = 575.0;
  188.                 else if(od_priority <= 3000.0) od_DrawDistance = 700.0;
  189.                 else if(od_priority <= 5000.0) od_DrawDistance = 850.0;
  190.                 else if(od_priority <= 8000.0) od_DrawDistance = 1000.0;
  191.                 else if(od_priority > 8000.0) od_DrawDistance = 1300.0;
  192.                 SetDynamicObjectData(objectid, od_DrawDistance, od_DrawDistance - 25, floatround((od_priority/450), floatround_round));
  193.             }
  194.         }
  195.         else
  196.             SetDynamicObjectData(objectid, 275.0, 275.0, 0);
  197.     #endif
  198.     return true;
  199. }
Advertisement
Add Comment
Please, Sign In to add comment