Guest User

Untitled

a guest
Jul 24th, 2017
256
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 27.10 KB | None | 0 0
  1. /**
  2.     * This file is part of RoundAbout Creator
  3.     *
  4.     * @desc        
  5.     *
  6.     * @author       KUBAK01
  7.     * @link         http://mrucznik-rp.pl
  8. */
  9.  
  10.  
  11. //------------------<< Includes >>------------------//
  12.  
  13. /**
  14. *               a_samp
  15. * @author       samp team
  16. */
  17. #include <a_samp>
  18.  
  19. /**
  20. *               dini2
  21. * @author       gammix
  22. */
  23. #include "dini2"
  24.  
  25. /**
  26. *               streamer
  27. * @author       incognito
  28. */
  29. #include <streamer>
  30.  
  31. /**
  32. *               a_samp
  33. * @author       zeex
  34. */
  35. #include <zcmd>
  36.  
  37. /**
  38. *               sscanf2
  39. * @author       emmet
  40. */
  41. #include <sscanf2>
  42.  
  43. /**
  44. *               foreach
  45. * @author       y_less, kar
  46. */
  47. #include <foreach>
  48.  
  49.  
  50. /*===============================================
  51. =            Variables / Definitions            =
  52. ===============================================*/
  53.  
  54.  
  55. #define RoundAbout::    RoundAbout_ // i kinda like it
  56.  
  57.  
  58. #define MAX_ROUNDABOUTS 20 // to be expanded, honestly i dont think we're gonna use more cuz it's just for the lolz
  59.  
  60.  
  61. #define RA_TYPE_SMALL   1 // about 6.0 ingame size
  62. #define RA_TYPE_MEDIUM  2 // 12.0 ingame size
  63. #define RA_TYPE_BIG     3 // 24.0 ingame size this shit is pretty big, to be used nowhere but a on a big desert?
  64.  
  65.  
  66. /*
  67.     raLabel         label's id
  68.     raCreatedBy     nickname of the author
  69.     raType          type of the roundabout, see RA_TYPE_*
  70.     raCorePos       the center of roundabout, used to make the whole thingy
  71.     raCoreAngle     the angle of roundabout, used to make the whole thingy
  72. */
  73.  
  74. enum eRoundAbout
  75. {
  76.     Text3D:raLabel,
  77.     raCreatedBy[MAX_PLAYER_NAME+1],
  78.     raType,
  79.     Float:raCorePos[3],
  80.     Float:raCoreAngle[3],
  81.     raCoreObject
  82. }
  83.  
  84. new roundAboutCache[MAX_ROUNDABOUTS][eRoundAbout];
  85.  
  86. // iterator
  87. new Iterator:roundAbouts<MAX_ROUNDABOUTS>;
  88.  
  89. new editingRoundAboutID[MAX_PLAYERS];
  90.  
  91.  
  92. /*=====  End of Variables / Definitions  ======*/
  93.  
  94.  
  95.  
  96. /*================================
  97. =            Commands            =
  98. ================================*/
  99.  
  100. COMMAND:ar(playerid, params[]) return cmd_aroundabout(playerid, params);
  101. COMMAND:aroundabout(playerid, params[])
  102. {
  103.     if( isnull(params) )
  104.         return SendClientMessage(playerid, -1, "(ROUNDABOUT) Params: create delete edit");
  105.  
  106.     new subcmd[7], rest[40];
  107.  
  108.     sscanf(params, "s[7]S()[40]", subcmd, rest);
  109.  
  110.     if( !strcmp(subcmd, "create" ) )
  111.     {
  112.         new type[7];
  113.  
  114.         if( sscanf(rest, "s[7]", type) )
  115.             return SendClientMessage(playerid, -1, "(ROUNDABOUT CREATE) Params: small medium big");
  116.  
  117.         if( !strcmp(type, "small") )
  118.             RoundAbout::CreateAtPPos(playerid, RA_TYPE_SMALL);
  119.         else if( !strcmp(type, "medium") )
  120.             RoundAbout::CreateAtPPos(playerid, RA_TYPE_MEDIUM);
  121.         else if( !strcmp(type, "big") )
  122.             RoundAbout::CreateAtPPos(playerid, RA_TYPE_BIG);
  123.         else
  124.             return SendClientMessage(playerid, -1, "(ROUNDABOUT CREATE) Params: small medium big");
  125.  
  126.     }
  127.  
  128.     if( !strcmp(subcmd, "delete") )
  129.     {
  130.         new id;
  131.  
  132.         if( sscanf(rest, "d", id) )
  133.             return SendClientMessage(playerid, -1, "(ROUNDABOUT DELETE) Params: roundabout's id");
  134.  
  135.         if(Iter_Contains(roundAbouts, id))
  136.         {
  137.  
  138.             RoundAbout::Remove(playerid, id);
  139.  
  140.         }
  141.         else
  142.             return SendClientMessage(playerid, -1, "(ROUNDABOUT DELETE) Roundabout of this id doesnt exsit");
  143.     }
  144.  
  145.     if( !strcmp(subcmd, "edit") )
  146.     {
  147.         new id;
  148.  
  149.         if( sscanf(rest, "d", id) )
  150.             return SendClientMessage(playerid, -1, "(ROUNDABOUT EDIT) Params: roundabout's id");
  151.  
  152.         if( editingRoundAboutID[playerid] != -1 )
  153.             return SendClientMessage(playerid, -1, "(ROUNDABOUT EDIT) You are editing an other roundabout");
  154.  
  155.         if(Iter_Contains(roundAbouts, id))
  156.         {
  157.  
  158.             new master = roundAboutCache[id][raCoreObject];
  159.  
  160.             EditDynamicObject(playerid, master);
  161.  
  162.             editingRoundAboutID[playerid] = id;
  163.  
  164.             return SendClientMessage(playerid, -1, "(ROUNDABOUT EDIT) Move the center of your roundabout");        
  165.         }
  166.         else
  167.             return SendClientMessage(playerid, -1, "(ROUNDABOUT EDIT) Roundabout of this id doesnt exsit");
  168.     }
  169.  
  170.     return 1;
  171. }
  172.  
  173. /*=====  End of Commands  ======*/
  174.  
  175.  
  176. /*=================================
  177. =            Callbacks            =
  178. =================================*/
  179.  
  180. public OnPlayerEditDynamicObject(playerid, STREAMER_TAG_OBJECT objectid, response, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz)
  181. {
  182.  
  183.     if(editingRoundAboutID[playerid] != -1)
  184.     {
  185.         switch(response)
  186.         {
  187.             case EDIT_RESPONSE_FINAL:
  188.             {
  189.                 new id = editingRoundAboutID[playerid];
  190.                 new tmpType = RoundAbout::GetType(id);
  191.  
  192.                 if(!Iter_Contains(roundAbouts, id))
  193.                     return SendClientMessage(playerid, -1, "(ROUNDABOUT EDIT) Roundabout was deleted when you were editing it");
  194.  
  195.                 new pName[MAX_PLAYER_NAME+1];
  196.                 GetPlayerName(playerid, pName, MAX_PLAYER_NAME+1);
  197.  
  198.                 RoundAbout::Remove(INVALID_PLAYER_ID, id);
  199.  
  200.                 if(tmpType == RA_TYPE_SMALL)
  201.                 {
  202.                     RoundAbout::CreateSmallRA(pName, x, y, z, rx, ry, rz);
  203.                 }
  204.                 else if(tmpType == RA_TYPE_MEDIUM)
  205.                 {
  206.                     RoundAbout::CreateMediumRA(pName, x, y, z, rx, ry, rz);
  207.                 }
  208.                 else if(tmpType == RA_TYPE_BIG)
  209.                 {
  210.                     RoundAbout::CreateBigRA(pName, x, y, z, rx, ry, rz);       
  211.                 }
  212.  
  213.                 roundAboutCache[id][raCorePos][0] = x;
  214.                 roundAboutCache[id][raCorePos][1] = y;
  215.                 roundAboutCache[id][raCorePos][2] = z;
  216.  
  217.                 roundAboutCache[id][raCoreAngle][0] = rx;
  218.                 roundAboutCache[id][raCoreAngle][1] = ry;
  219.                 roundAboutCache[id][raCoreAngle][2] = rz;
  220.  
  221.                 editingRoundAboutID[playerid] = -1;
  222.  
  223.                 RoundAbout::Save(id);
  224.             }
  225.  
  226.             case EDIT_RESPONSE_CANCEL:
  227.             {
  228.  
  229.                 editingRoundAboutID[playerid] = -1;
  230.  
  231.             }
  232.         }
  233.     }
  234.  
  235.     return 1;
  236. }
  237.  
  238. /*=====  End of Callbacks  ======*/
  239.  
  240.  
  241.  
  242. /*=================================
  243. =            Functions            =
  244. =================================*/
  245.  
  246. RoundAbout::CreateAtPPos(playerid, type=RA_TYPE_SMALL)
  247. {
  248.  
  249.     new id = Iter_Free(roundAbouts);
  250.  
  251.     if(id == ITER_NONE)
  252.     {
  253.         SendClientMessage(playerid, -1, "(ROUNDABOUT CREATE) No free roundabout slots");
  254.         SendClientMessage(playerid, -1, "(ROUNDABOUT CREATE) Increase #MAX_ROUNDABOUTS or delete one of existing roundabouts");
  255.         return 1;
  256.     }
  257.  
  258.     new Float:pPos[3], Float:null;
  259.     GetPlayerPos(playerid, null, null, pPos[2]);
  260.     GetXYInFrontOfPlayer(playerid, pPos[0], pPos[1], 2.0);
  261.  
  262.     new pName[MAX_PLAYER_NAME+1];
  263.     GetPlayerName(playerid, pName, MAX_PLAYER_NAME+1);
  264.  
  265.     new result = -1;
  266.  
  267.     if(type == RA_TYPE_SMALL)
  268.     {
  269.  
  270.         SendClientMessage(playerid, -1, "(SMALL ROUNDABOUT) Trying to create a roundabout at your current position");
  271.  
  272.         result = RoundAbout::CreateSmallRA(pName, pPos[0]+5.0, pPos[1], pPos[2]+0.25, 0.0, 0.0, 0.0);
  273.  
  274.         if(result == -1)
  275.             return SendClientMessage(playerid, -1, "(SMALL ROUNDABOUT) There was an error trying to create your roundabout");
  276.  
  277.     }
  278.     else if(type == RA_TYPE_MEDIUM)
  279.     {
  280.  
  281.         SendClientMessage(playerid, -1, "(MEDIUM ROUNDABOUT) Trying to create a roundabout at your current position");
  282.  
  283.         result = RoundAbout::CreateMediumRA(pName, pPos[0]+5.0, pPos[1], pPos[2]+0.25, 0.0, 0.0, 0.0);
  284.  
  285.         if(result == -1)
  286.             return SendClientMessage(playerid, -1, "(MEDIUM ROUNDABOUT) There was an error trying to create your roundabout");
  287.     }
  288.     else if(type == RA_TYPE_BIG)
  289.     {
  290.  
  291.         SendClientMessage(playerid, -1, "(BIG ROUNDABOUT) Trying to create a roundabout at your current position");
  292.  
  293.         result = RoundAbout::CreateBigRA(pName, pPos[0]+5.0, pPos[1], pPos[2]+0.25, 0.0, 0.0, 0.0);
  294.  
  295.         if(result == -1)
  296.             return SendClientMessage(playerid, -1, "(BIG ROUNDABOUT) There was an error trying to create your roundabout");
  297.  
  298.     }
  299.     else
  300.     {
  301.         return SendClientMessage(playerid, -1, "(ROUNDABOUT CREATE) Invalid type specified");
  302.     }
  303.  
  304.     roundAboutCache[result][raCorePos][0] = pPos[0]+5.0;
  305.     roundAboutCache[result][raCorePos][1] = pPos[1];
  306.     roundAboutCache[result][raCorePos][2] = pPos[2]+0.25;
  307.  
  308.     roundAboutCache[result][raCoreAngle][0] = 0.0;
  309.     roundAboutCache[result][raCoreAngle][1] = 0.0;
  310.     roundAboutCache[result][raCoreAngle][2] = 0.0;
  311.    
  312.     RoundAbout::Save(result);
  313.  
  314.     return 1;
  315. }
  316.  
  317. RoundAbout::Remove(playerid = INVALID_PLAYER_ID, id)
  318. {
  319.     new master = roundAboutCache[id][raCoreObject];
  320.     new bool:deleted=false;
  321.  
  322.     new objectscount = CountDynamicObjects();
  323.     new i = 0;
  324.     while(objectscount > 0)
  325.     {
  326.         if(IsValidDynamicObject(i))
  327.         {
  328.             if(Streamer_GetIntData(STREAMER_TYPE_OBJECT, i, E_STREAMER_EXTRA_ID) == master)
  329.             {
  330.                 DestroyDynamicObject(i);
  331.                 deleted = true;
  332.             }
  333.  
  334.             objectscount--;
  335.         }
  336.         i++;
  337.     }
  338.     if(deleted)
  339.     {
  340.         DestroyDynamicObject(master);
  341.         DestroyDynamic3DTextLabel(roundAboutCache[id][raLabel]);
  342.  
  343.         Iter_Remove(roundAbouts, id);
  344.  
  345.         SendClientMessage(playerid, -1, "(ROUNDABOUT DELETE) Successfully deleted this roundabout");
  346.  
  347.         new fileName[22];
  348.         format(fileName, sizeof fileName, "roundabouts/%i.ini", id);
  349.         if(dini_Exists(fileName))
  350.         {
  351.             dini_Remove(fileName);
  352.         }
  353.     }
  354.  
  355.     return 1;
  356. }
  357.  
  358. RoundAbout::GetType(id)
  359. {
  360.     return roundAboutCache[id][raType];
  361. }
  362.  
  363. RoundAbout::Save(id)
  364. {
  365.     new fileName[22];
  366.     format(fileName, sizeof fileName, "roundabouts/%i.ini", id);
  367.    
  368.     if(dini_Exists(fileName))
  369.     {
  370.         dini_Create(fileName);
  371.     }
  372.    
  373.     dini_IntSet(fileName, "id", id);
  374.     dini_IntSet(fileName, "type", roundAboutCache[id][raType]);
  375.  
  376.     new compress[64];
  377.  
  378.     format(compress, sizeof compress, "%f|%f|%f", roundAboutCache[id][raCorePos][0], roundAboutCache[id][raCorePos][1], roundAboutCache[id][raCorePos][2]);
  379.     dini_Set(fileName, "corePos", compress);
  380.  
  381.     format(compress, sizeof compress, "%f|%f|%f", roundAboutCache[id][raCoreAngle][0], roundAboutCache[id][raCoreAngle][1], roundAboutCache[id][raCoreAngle][2]);
  382.     dini_Set(fileName, "coreAngle", compress);
  383.  
  384.     dini_Set(fileName, "author", roundAboutCache[id][raCreatedBy]);
  385.  
  386.     return 1;
  387. }
  388.  
  389. RoundAbout::CreateSmallRA(author[], Float:coreX, Float:coreY, Float:coreZ, Float:coreRX, Float:coreRY, Float:coreRZ)
  390. {
  391.     new id = -1;
  392.  
  393.  
  394.     /**
  395.      *
  396.      * This is where things get little tricky xD
  397.      * See object ID 14467? That is our CORE object for this roundabout
  398.      *
  399.      * So every other object position
  400.      * will be set corresponding to this object
  401.      *
  402.      * aye advanced maths 'n stuff
  403.      *
  404.      */
  405.  
  406.     id = Iter_Free(roundAbouts);
  407.  
  408.     if(id == -1) return -1;
  409.  
  410.     new obj;
  411.    
  412.     roundAboutCache[id][raCoreObject] = CreateDynamicObject(14467, coreX, coreY, coreZ, coreRX, coreRY, coreRZ); // Core
  413.  
  414.     obj = CreateDynamicObject(970, coreX+2.839970, coreY+0.300050, coreZ-2.202200, coreRX+0.000000, coreRX+0.000000, coreRX+90.000000);
  415.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  416.     obj = CreateDynamicObject(970, coreX+0.279910, coreY+2.859980, coreZ-2.202200, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  417.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  418.     obj = CreateDynamicObject(970, coreX-2.333980, coreY+0.300050, coreZ-2.202200, coreRX+0.000000, coreRX+0.000000, coreRX+90.000000);
  419.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  420.     obj = CreateDynamicObject(970, coreX+0.279910, coreY-2.279910, coreZ-2.202200, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  421.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  422.     obj = CreateDynamicObject(14467, coreX+0.000000, coreY+0.000000, coreZ+0.000000, coreRX+0.000000, coreRX+0.000000, coreRX-90.000000);
  423.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  424.     obj = CreateDynamicObject(19121, coreX-2.072750, coreY+2.622190, coreZ-2.182200, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  425.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  426.     obj = CreateDynamicObject(19121, coreX+2.587040, coreY+2.622190, coreZ-2.182200, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  427.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  428.     obj = CreateDynamicObject(19121, coreX+2.587040, coreY-2.054810, coreZ-2.182200, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  429.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  430.     obj = CreateDynamicObject(19121, coreX-2.072750, coreY-2.054810, coreZ-2.182200, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  431.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  432.  
  433.     roundAboutCache[id][raCreatedBy][0] = EOS;
  434.     strcat(roundAboutCache[id][raCreatedBy], author);
  435.  
  436.     new label[128];
  437.     format(label, sizeof label, "{FFFFFF}Roundabout of an id {DAFC10}%d\n{FFFFFF}Created by {DAFC10}%s", id, author);
  438.     roundAboutCache[id][raLabel] = CreateDynamic3DTextLabel(label, 0xFFFFFFFF, coreX, coreY, coreZ, 200.0);
  439.  
  440.     roundAboutCache[id][raType] = RA_TYPE_SMALL;
  441.  
  442.     Iter_Add(roundAbouts, id);
  443.  
  444.     return id;
  445. }
  446.  
  447. RoundAbout::CreateMediumRA(author[], Float:coreX, Float:coreY, Float:coreZ, Float:coreRX, Float:coreRY, Float:coreRZ)
  448. {
  449.     new id = -1;
  450.  
  451.     /**
  452.      *
  453.      * This is where things get little tricky xD
  454.      * See object ID 3515? That is our CORE object for this roundabout
  455.      *
  456.      * So every other object position
  457.      * will be set corresponding to this object
  458.      *
  459.      * aye advanced maths 'n stuff
  460.      *
  461.      */
  462.  
  463.     id = Iter_Free(roundAbouts);
  464.  
  465.     if(id == -1) return -1;
  466.  
  467.     new obj;
  468.  
  469.     roundAboutCache[id][raCoreObject] = CreateDynamicObject(3515, coreX,coreY,coreZ,coreRX, coreRY, coreRZ); // CORE
  470.  
  471.     obj = CreateDynamicObject(7933, coreX-0.219970, coreY-4.804450, coreZ+0.551200, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  472.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  473.     obj = CreateDynamicObject(19869, coreX-5.559940, coreY+0.000000, coreZ-1.208800, coreRX+0.000000, coreRX+0.000000, coreRX+90.000000);
  474.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  475.     obj = CreateDynamicObject(7933, coreX-0.219970, coreY+4.851560, coreZ+0.551200, coreRX+0.000000, coreRX+0.000000, coreRX+180.000000);
  476.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  477.     obj = CreateDynamicObject(737, coreX+3.074830, coreY-3.594730, coreZ+0.551200, coreRX+0.000000, coreRX+0.000000, coreRX+55.000000);
  478.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  479.     obj = CreateDynamicObject(737, coreX-2.845220, coreY-3.594730, coreZ+0.551200, coreRX+0.000000, coreRX+0.000000, coreRX+55.000000);
  480.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  481.     obj = CreateDynamicObject(737, coreX-2.845220, coreY+3.705320, coreZ+0.551200, coreRX+0.000000, coreRX+0.000000, coreRX+55.000000);
  482.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  483.     obj = CreateDynamicObject(737, coreX+3.074830, coreY+3.705320, coreZ+0.551200, coreRX+0.000000, coreRX+0.000000, coreRX+55.000000);
  484.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  485.     obj = CreateDynamicObject(19122, coreX-5.549320, coreY-2.854860, coreZ+0.551200, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  486.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  487.     obj = CreateDynamicObject(19869, coreX+5.199340, coreY+0.000000, coreZ-1.208800, coreRX+0.000000, coreRX+0.000000, coreRX+90.000000);
  488.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  489.     obj = CreateDynamicObject(19122, coreX+5.172610, coreY+2.847040, coreZ+0.551200, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  490.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  491.     obj = CreateDynamicObject(19122, coreX+5.172610, coreY-2.814940, coreZ+0.551200, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  492.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  493.     obj = CreateDynamicObject(19122, coreX-5.549320, coreY+2.847040, coreZ+0.551200, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  494.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  495.  
  496.     roundAboutCache[id][raCreatedBy][0] = EOS;
  497.     strcat(roundAboutCache[id][raCreatedBy], author);
  498.  
  499.     new label[128];
  500.     format(label, sizeof label, "{FFFFFF}Roundabout of an id {DAFC10}%d\n{FFFFFF}Created by {DAFC10}%s", id, author);
  501.     roundAboutCache[id][raLabel] = CreateDynamic3DTextLabel(label, 0xFFFFFFFF, coreX, coreY, coreZ, 200.0);
  502.  
  503.     roundAboutCache[id][raType] = RA_TYPE_MEDIUM;
  504.  
  505.     Iter_Add(roundAbouts, id);
  506.  
  507.     return id;
  508. }
  509.  
  510. RoundAbout::CreateBigRA(author[], Float:coreX, Float:coreY, Float:coreZ, Float:coreRX, Float:coreRY, Float:coreRZ)
  511. {
  512.     new id = -1;
  513.  
  514.     /**
  515.      *
  516.      * This is where things get little tricky xD
  517.      * See object ID 6965? That is our CORE for this roundabout
  518.      *
  519.      * So every other object position
  520.      * will be set corresponding to this object
  521.      *
  522.      * aye advanced maths 'n stuff
  523.      *
  524.      */
  525.  
  526.     id = Iter_Free(roundAbouts);
  527.  
  528.     if(id == -1) return -1;
  529.  
  530.     new obj;
  531.  
  532.     roundAboutCache[id][raCoreObject] = CreateDynamicObject(6965, coreX,coreY,coreZ,coreRX, coreRY, coreRZ); // Core
  533.  
  534.     obj = CreateDynamicObject(970, coreX-0.113280, coreY+6.196170, coreZ-0.869700, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  535.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  536.     obj = CreateDynamicObject(970, coreX+4.046750, coreY+6.196170, coreZ-0.869700, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  537.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  538.     obj = CreateDynamicObject(970, coreX-4.273250, coreY+6.196170, coreZ-0.869700, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  539.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  540.     obj = CreateDynamicObject(970, coreX-6.359860, coreY+4.160040, coreZ-0.869700, coreRX+0.000000, coreRX+0.000000, coreRX+90.000000);
  541.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  542.     obj = CreateDynamicObject(970, coreX-6.359860, coreY+0.000000, coreZ-0.869700, coreRX+0.000000, coreRX+0.000000, coreRX+90.000000);
  543.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  544.     obj = CreateDynamicObject(970, coreX-6.359860, coreY-4.160030, coreZ-0.869700, coreRX+0.000000, coreRX+0.000000, coreRX+90.000000);
  545.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  546.     obj = CreateDynamicObject(970, coreX-4.273250, coreY-6.231200, coreZ-0.869700, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  547.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  548.     obj = CreateDynamicObject(970, coreX-0.113280, coreY-6.231200, coreZ-0.869700, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  549.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  550.     obj = CreateDynamicObject(970, coreX+4.046750, coreY-6.231200, coreZ-0.869700, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  551.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  552.     obj = CreateDynamicObject(970, coreX+6.117310, coreY-4.160030, coreZ-0.869700, coreRX+0.000000, coreRX+0.000000, coreRX+90.000000);
  553.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  554.     obj = CreateDynamicObject(970, coreX+6.117310, coreY+0.000000, coreZ-0.869700, coreRX+0.000000, coreRX+0.000000, coreRX+90.000000);
  555.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  556.     obj = CreateDynamicObject(970, coreX+6.117310, coreY+4.160040, coreZ-0.869700, coreRX+0.000000, coreRX+0.000000, coreRX+90.000000);
  557.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  558.     obj = CreateDynamicObject(6324, coreX-1.082400, coreY-44.745360, coreZ-0.058800, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  559.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  560.     obj = CreateDynamicObject(2011, coreX+1.435850, coreY-0.321530, coreZ-1.380200, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  561.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  562.     obj = CreateDynamicObject(2011, coreX-0.006280, coreY-1.367060, coreZ-1.380200, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  563.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  564.     obj = CreateDynamicObject(2011, coreX-1.304200, coreY-0.161620, coreZ-1.380200, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  565.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  566.     obj = CreateDynamicObject(2011, coreX-0.006280, coreY+1.372930, coreZ-1.380200, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  567.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  568.     obj = CreateDynamicObject(1361, coreX-0.923220, coreY-1.114620, coreZ-0.734500, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  569.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  570.     obj = CreateDynamicObject(1361, coreX-1.302850, coreY+0.964360, coreZ-0.734500, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  571.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  572.     obj = CreateDynamicObject(1361, coreX+1.253600, coreY+0.757940, coreZ-0.734500, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  573.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  574.     obj = CreateDynamicObject(1361, coreX+0.755620, coreY-1.427240, coreZ-0.734500, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  575.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  576.     obj = CreateDynamicObject(14400, coreX-0.134640, coreY-0.253660, coreZ-1.439830, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  577.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  578.     obj = CreateDynamicObject(14400, coreX+0.437930, coreY-0.098380, coreZ-1.439800, coreRX+0.000000, coreRX+0.000000, coreRX+90.000000);
  579.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  580.     obj = CreateDynamicObject(14400, coreX+0.437930, coreY-0.098380, coreZ-1.439800, coreRX+0.000000, coreRX+0.000000, coreRX+45.000000);
  581.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  582.     obj = CreateDynamicObject(14400, coreX+0.437930, coreY-0.098380, coreZ-1.439800, coreRX+0.000000, coreRX+0.000000, coreRX-45.000000);
  583.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  584.     obj = CreateDynamicObject(1215, coreX-6.356200, coreY-6.240720, coreZ-1.059800, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  585.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  586.     obj = CreateDynamicObject(1215, coreX-6.356200, coreY+6.179330, coreZ-1.059800, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  587.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  588.     obj = CreateDynamicObject(1215, coreX+6.083800, coreY+6.179330, coreZ-1.059800, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  589.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  590.     obj = CreateDynamicObject(1215, coreX+6.083800, coreY-6.220700, coreZ-1.059800, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  591.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  592.     obj = CreateDynamicObject(737, coreX+5.487920, coreY-5.560300, coreZ-0.914500, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  593.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  594.     obj = CreateDynamicObject(737, coreX+5.487920, coreY+5.559330, coreZ-0.914500, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  595.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  596.     obj = CreateDynamicObject(737, coreX-5.716180, coreY+5.539310, coreZ-0.914500, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  597.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  598.     obj = CreateDynamicObject(737, coreX-5.715940, coreY-5.560300, coreZ-0.914500, coreRX+0.000000, coreRX+0.000000, coreRX+0.000000);
  599.     Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, roundAboutCache[id][raCoreObject]);
  600.  
  601.     roundAboutCache[id][raCreatedBy][0] = EOS;
  602.     strcat(roundAboutCache[id][raCreatedBy], author);
  603.  
  604.     new label[128];
  605.     format(label, sizeof label, "{FFFFFF}Roundabout of an id {DAFC10}%d\n{FFFFFF}Created by {DAFC10}%s", id, author);
  606.     roundAboutCache[id][raLabel] = CreateDynamic3DTextLabel(label, 0xFFFFFFFF, coreX, coreY, coreZ, 200.0);
  607.  
  608.     roundAboutCache[id][raType] = RA_TYPE_BIG;
  609.  
  610.     Iter_Add(roundAbouts, id);
  611.  
  612.     return id;
  613. }
  614.  
  615. RoundAbout::OnInit()
  616. {
  617.     new count = 0, fileName[22], Float:pos[3], Float:angle[3], compressed[64];
  618.  
  619.     for(new i; i<MAX_ROUNDABOUTS; i++)
  620.     {
  621.         format(fileName, sizeof fileName, "roundabouts/%i.ini", i);
  622.  
  623.         if(dini_Exists(fileName))
  624.         {
  625.             new type = dini_Int(fileName, "type");
  626.  
  627.             compressed[0] = EOS;
  628.             strcat(compressed, dini_Get(fileName, "corePos"));
  629.             sscanf(compressed, "p<|>fff", pos[0], pos[1], pos[2]);
  630.  
  631.             compressed[0] = EOS;
  632.             strcat(compressed, dini_Get(fileName, "coreAngle"));
  633.             sscanf(compressed, "p<|>fff", angle[0], angle[1], angle[2]);
  634.  
  635.  
  636.             if(type == RA_TYPE_SMALL)
  637.             {
  638.                 RoundAbout::CreateSmallRA(dini_Get(fileName, "author"), pos[0], pos[1], pos[2], angle[0], angle[1], angle[2]);
  639.             }
  640.             else if(type == RA_TYPE_MEDIUM)
  641.             {
  642.                 RoundAbout::CreateMediumRA(dini_Get(fileName, "author"), pos[0], pos[1], pos[2], angle[0], angle[1], angle[2]);
  643.             }
  644.             else if(type == RA_TYPE_BIG)
  645.             {
  646.                 RoundAbout::CreateBigRA(dini_Get(fileName, "author"), pos[0], pos[1], pos[2], angle[0], angle[1], angle[2]);
  647.             }
  648.  
  649.             count++;
  650.         }
  651.     }
  652.  
  653.     printf("Loaded %d roundabout(s)", count);
  654. }
  655.  
  656. stock GetXYInFrontOfPlayer(playerid, &Float:x, &Float:y, Float:distance)
  657. {
  658.     // Created by Y_Less
  659.  
  660.     new Float:a;
  661.  
  662.     GetPlayerPos(playerid, x, y, a);
  663.     GetPlayerFacingAngle(playerid, a);
  664.  
  665.     if (GetPlayerVehicleID(playerid)) {
  666.         GetVehicleZAngle(GetPlayerVehicleID(playerid), a);
  667.     }
  668.  
  669.     x += (distance * floatsin(-a, degrees));
  670.     y += (distance * floatcos(-a, degrees));
  671. }
  672.  
  673. /*=====  End of Functions  ======*/
  674.  
  675.  
  676.  
  677. public OnFilterScriptInit()
  678. {
  679.     print("\n--------------------------------------");
  680.     print(" ROUNDABOUT CREATOR R1 BY KUBAK01 @ SA-MP.COM ");
  681.     print("--------------------------------------\n");
  682.  
  683.     RoundAbout::OnInit();
  684.  
  685.     foreach(Player, i)
  686.     {
  687.         OnPlayerConnect(i);
  688.     }  
  689.  
  690.     return 1;
  691. }
  692.  
  693. public OnFilterScriptExit()
  694. {
  695.     Iter_Clear(roundAbouts);
  696.     return 1;
  697. }
  698.  
  699. public OnPlayerConnect(playerid)
  700. {
  701.     editingRoundAboutID[playerid] = -1;
  702. }
Advertisement
Add Comment
Please, Sign In to add comment