Guest User

MULTI COLERED FUNCTIONAL CP [V 1.5]

a guest
Jun 7th, 2017
333
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.42 KB | None | 0 0
  1. /*
  2.  
  3. *************************************
  4. **** MULTI COLERED FUNCTIONAL CP ****
  5. *************************************
  6. PT: Include que trazem inumeros checkpoints ao mesmo tempo, que pode ficar lado a lado
  7. alem de podem ter cores diferentes, e ser anexado, entre outras funcionalidades!
  8. --------------------------------
  9. Actor:  Rodrigo Guigo Dornelles
  10. Nick:   RazorGuigo
  11. AGE:    18
  12. --------------------------------
  13.  
  14. Remade: v 1.3
  15.  
  16. Actor: Dayvison
  17. AGE:        19
  18.  
  19. -------------------------------
  20.  
  21. 2 contributors @RodrigoDornelles @Dayvison
  22.  
  23. *
  24.  * MULTI COLERED FUNCTIONAL CP
  25. ## Changelog:
  26. > -
  27. ## API:
  28.  * **Definitions:**
  29.     -
  30.  * **Callbacks:**
  31.     -
  32.  * **Enums:**
  33.     - CPType
  34.  * **Tags:**
  35.     -
  36.  * **Functions:**
  37.     - CreateCheckPoint
  38.     - IsPlayerInAnyCheckpointEx
  39.     - IsPlayerInCheckpointEx
  40.  * **Variables:**
  41.     -
  42.  * **Commands:**
  43.     -
  44.  * **Macros:**
  45.     - CPEnter:
  46.     - CPExit:
  47. ## Internal:
  48.  * **Functions:**
  49.  *  - GetNexCPID
  50.  * **Callbacks:**
  51.     - OnPlayerEnterDynamicArea
  52.     - OnPlayerExitDynamicArea
  53.  * **Enums:**
  54.     - E_CP_MODEL_DATA
  55.  * **Tags:**
  56.     -
  57.  * **Functions:**
  58.     -
  59.  * **Variables:**
  60.     - CP_MODEL_DATA
  61.  * **Macros:**
  62.     -
  63. ## Configuration:
  64.  */
  65.  
  66. #if !defined MCF_CP_VERSION                    
  67.  
  68. //-----------STREAMER Required-------------
  69. #if !defined Streamer_IncludeFileVersion
  70.     #tryinclude <streamer>
  71.  
  72.     #if !defined Streamer_IncludeFileVersion
  73.         #error [MCF CP] This include requires Streamer Plugin!
  74.     #endif
  75. #endif
  76. //------------------------------------------
  77.  
  78. //-----------Interator Required-------------
  79. #if !defined foreach
  80.     #tryinclude <YSI\y_iterate>
  81.  
  82.     #if !defined foreach
  83.         #tryinclude <foreach>
  84.  
  85.         #if !defined foreach
  86.             #error [MCF CP] This include requires semone interator include!
  87.         #endif
  88.     #endif 
  89. #endif
  90.  
  91.  
  92. #if defined mCP_included
  93.     #endinput
  94. #endif
  95. #define mCP_included
  96.  
  97. #define CP_STREAMER_IDENTIFIER 2147483646
  98.  
  99. #define CPEnter:%0(%1) forward cp1_%0(%1);public cp1_%0(%1)
  100. #define CPExit:%0(%1)  forward cp2_%0(%1);public cp2_%0(%1)
  101.  
  102.  
  103. #if !defined MAX_CPS
  104.     #define MAX_CPS (500)
  105. #endif
  106.  
  107. #if !defined MAX_AREAS
  108.     #define MAX_AREAS (1000)
  109. #endif
  110.  
  111. #define INVALID_CP -1
  112.  
  113. static Iterator:Iter_free<MAX_CPS>;
  114. static Iterator:Iter_CPS<MAX_CPS>;
  115. static i_CountCP;
  116.  
  117. static CPType:CPmodel[MAX_CPS];         //Model do CP, salvado, para alteração de cores!
  118. static CPObject[MAX_CPS];               //CPID -> to -> dynamicObject
  119. static CPArea[MAX_CPS];                 //CPID -> to -> AREAID
  120. static AreaCP[MAX_AREAS];               //AREAID -> to -> CPID
  121.  
  122. static bool:InCP[MAX_PLAYERS][MAX_CPS];             //Player está no CP
  123.  
  124. enum CPType {
  125.     CP_ARROW,
  126.     CP_CIRCLE_BIG,
  127.     CP_CIRCLE,
  128.     CP_INVISIBLE
  129. };
  130.  
  131.  
  132. #if __Pawn != 0x030A // != Zeex pawn
  133.     enum E_CP_MODEL_DATA {
  134. #else
  135.     #if defined __PawnBuild // Zeex pawn 3.10.1
  136.         static enum E_CP_MODEL_DATA {
  137.     #else
  138.         enum E_CP_MODEL_DATA {
  139.     #endif
  140. #endif
  141.     CP_Model,
  142.     Float:CP_ModelSize
  143. };
  144.  
  145. static CP_MODEL_DATA[CPType][E_CP_MODEL_DATA]=
  146. {
  147.     {19605, 1.0}, // CP_ARROW_RED
  148.     {19945, 8.0}, // CP_CIRCLE_RED_BIG
  149.     {13171.0}, // CP_CIRCLE_RED
  150.     {19300, 1.0}  // CP_INVISIBLE
  151. };
  152.  
  153. #if defined OnPlayerEnterCheckpointEx
  154.     forward OnPlayerEnterCheckpointEx(playerid, checkpoint[], CPID);
  155. #endif
  156.  
  157. #if defined OnPlayerExitCheckpointEx
  158.     forward OnPlayerExitCheckpointEx(playerid, checkpoint[], CPID);
  159. #endif
  160.  
  161. stock CreatePlayerCheckPoint(playerid, name[29] = "", CPType:type= CP_CIRCLE, color= 0x99FF0000, Float:x, Float:y, Float:z, worldid = -1, interiorid = -1)
  162. {
  163.     return CreateCheckPoint(name, type, x, y, z, worldid, interiorid, playerid);
  164. }
  165.  
  166. stock CreateCheckPoint(name[29] = "", CPType:type = CP_CIRCLE, color= 0x99FF0000, Float:x, Float:y, Float:z, worldid = -1, interiorid = -1, forplayer= -1)
  167. {
  168.     if(!(CP_ARROW <= type <= CP_INVISIBLE))
  169.         return INVALID_CP;
  170.  
  171.     if(forplayer != -1)
  172.     {
  173.         if(!(0 <= forplayer > MAX_PLAYERS))
  174.             return INVALID_CP;
  175.     }
  176.  
  177.     new id= GetNexCPID();
  178.  
  179.     if(CP_CIRCLE == type) z -= 0.4;
  180.  
  181.     CPmodel[id]=type;
  182.  
  183.     new object= CPObject[id]=   CreateDynamicObject(CP_MODEL_DATA[type][CP_Model], x, y, z, 0.0, 0.0, 0.0, worldid, interiorid, forplayer);
  184.     new area=   CPArea[id]=     CreateDynamicSphere(x, y, z, CP_MODEL_DATA[type][CP_ModelSize], worldid, interiorid, forplayer);
  185.  
  186.     AreaCP[area]= id;
  187.  
  188.     if(CP_CIRCLE ==type)
  189.         SetDynamicObjectMaterial(object, 0, 18646, "matcolours", "white", color);
  190.     else
  191.         SetDynamicObjectMaterialText(object, 0, " ", OBJECT_MATERIAL_SIZE_32x32,"Arial", 8, 1, 0x55555555, color);
  192.    
  193.  
  194.     new arr[32];
  195.  
  196.     Iter_Add(Iter_CPS, id);
  197.  
  198.     arr[0] = CP_STREAMER_IDENTIFIER;
  199.     strcat(arr, name);
  200.  
  201.     Streamer_SetArrayData(STREAMER_TYPE_AREA, area, E_STREAMER_EXTRA_ID, arr);
  202.  
  203.     AttachDynamicAreaToObject(area, object);
  204.     return id;
  205. }
  206. stock DestroyCheckPoint( CPID)
  207. {
  208.     DestroyDynamicArea(CPArea[CPID]);
  209.     DestroyDynamicObject(CPObject[CPID]);
  210.     Iter_Add(Iter_free, CPID);
  211.     Iter_Remove(Iter_CPS, CPID);
  212. }
  213. stock SetCPtoPos( CPID, Float:x=0.0, Float:y=0.0, Float:z=0.0)
  214. {
  215.     new obj= CPObject[CPID];
  216.     return SetDynamicObjectPos(obj, x, y, z);
  217. }
  218. stock MoveCPtoPos( CPID, Float:x=0.0, Float:y=0.0, Float:z=0.0, Float:speed= 2.0)
  219. {
  220.     new obj= CPObject[CPID];
  221.     return MoveDynamicObject(obj, x, y, z, speed);
  222. }
  223. stock AttachCPtoObject( CPID, objectid, Float:x=0.0, Float:y=0.0, Float:z=0.0)
  224. {
  225.     new obj= CPObject[CPID];
  226.     return AttachDynamicObjectToObject(obj, objectid, x, y, z, 0.0, 0.0, 0.0);
  227. }
  228. stock AttachCPtoPlayer( CPID, playerid, Float:x=0.0, Float:y=0.0, Float:z=0.0)
  229. {
  230.     new obj= CPObject[CPID];
  231.     return AttachDynamicObjectToPlayer(obj, playerid, x, y, z, 0.0, 0.0, 0.0);
  232. }
  233. stock AttachCPtoVehicle( CPID, vehicleid, Float:x=0.0, Float:y=0.0, Float:z=0.0)
  234. {
  235.     new obj= CPObject[CPID];
  236.     return AttachDynamicObjectToVehicle(obj, vehicleid, x, y, z, 0.0, 0.0, 0.0);
  237. }
  238. stock AttachCPtoCP( CPID, CPattached, Float:x=0.0, Float:y=0.0, Float:z=0.0)
  239. {
  240.     new obj= CPObject[CPID];
  241.     return AttachDynamicObjectToObject(obj, CPObject[CPattached], x, y, z, 0.0, 0.0, 0.0);
  242. }
  243. stock SetCheckPointColor(CPID, color=0x99FF0000)
  244. {
  245.     if(CP_CIRCLE == CPmodel[CPID])
  246.         SetDynamicObjectMaterial(object, 0, 18646, "matcolours", "white", color);
  247.     else
  248.         SetDynamicObjectMaterialText(object, 0, " ", OBJECT_MATERIAL_SIZE_32x32,"Arial", 8, 1, 0x55555555, color);
  249. }
  250. stock bool:IsPlayerInCP(playerid, CPID)
  251. {
  252.     return InCP[playerid][CPID];
  253. }
  254. stock IsPlayerInAnyCheckpointEx(playerid)
  255. {
  256.     static STREAMER_TAG_AREA areas[500];
  257.  
  258.     new
  259.         STREAMER_TAG_AREA num = STREAMER_TAG_AREA GetPlayerDynamicAreas(playerid, areas),
  260.         arr[32]
  261.     ;
  262.  
  263.     for(new STREAMER_TAG_AREA i; i < num; ++i)
  264.     {
  265.         Streamer_GetArrayData(STREAMER_TYPE_AREA, i, E_STREAMER_EXTRA_ID, arr);
  266.         if(arr[0] == CP_STREAMER_IDENTIFIER)
  267.         {
  268.             return true;
  269.         }
  270.     }
  271.     return false;
  272. }
  273.  
  274. stock IsPlayerInCheckpointEx(playerid, name[])
  275. {
  276.     // isnull
  277.     if((!(name[0])) || (((name[0]) == '\1') && (!(name[1]))))
  278.         return false;
  279.  
  280.     static STREAMER_TAG_AREA areas[500];
  281.  
  282.     new
  283.         STREAMER_TAG_AREA num = STREAMER_TAG_AREA GetPlayerDynamicAreas(playerid, areas),
  284.         arr[32]
  285.     ;
  286.  
  287.     for(new STREAMER_TAG_AREA i; i < num; ++i)
  288.     {
  289.         Streamer_GetArrayData(STREAMER_TYPE_AREA, i, E_STREAMER_EXTRA_ID, arr);
  290.         if(arr[0] == CP_STREAMER_IDENTIFIER)
  291.         {
  292.             // isnull
  293.             if((!(arr[1])) || (((arr[1]) == '\1') && (!(arr[2]))))
  294.                 continue;
  295.  
  296.             if(!strcmp(arr[1], name))
  297.                 return true;
  298.         }
  299.     }
  300.     return false;
  301. }
  302. /*--------------------------------------------------------------------------------------------------------------
  303. ## Internal:
  304.  * **Functions:**
  305.  *  - GetNexCPID
  306.  * **Callbacks:**
  307.     - OnPlayerEnterDynamicArea
  308.     - OnPlayerExitDynamicArea
  309. */
  310. stock GetNexCPID()                        //capta o ID, do proximo CP a ser criado!
  311. {
  312.     foreach(new free : Iter_free)        //recupera o ID de um CP deletado
  313.     {
  314.         Iter_Remove(Iter_free, free);
  315.         return free;
  316.     }
  317.     if(i_CountCP + 1 == MAX_CPS)
  318.     {
  319.         printf("[ERROR] max checkpoints loaded %d/%d", i_CountCP + 1, MAX_CPS);
  320.         return INVALID_CP;
  321.     }
  322.     i_CountCP++;                         //Caso não haja CP deletados, ele cria um novo ID
  323.     return  i_CountCP;
  324. }
  325. //-------------------------------------------------------------------------------------------------------------------------
  326. #if defined OnPlayerKeyStateChangeInCP
  327. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  328. {
  329.     foreach(new CPID : Iter_CPS)
  330.     {
  331.         if(InCP[playerid][CPID])
  332.         {
  333.             new arr[32];
  334.             Streamer_GetArrayData(STREAMER_TYPE_AREA, AreaCP[CPID], E_STREAMER_EXTRA_ID, arr);
  335.             #if defined OnPlayerKeyStateChangeInCP
  336.                 OnPlayerKeyStateChangeInCP(playerid, arr, CPID, newkeys, oldkeys);
  337.             #endif
  338.         }
  339.     }
  340.     #if defined CP_OnPlayerKeyStateChange
  341.         return CP_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
  342.     #else
  343.         return 1;
  344.     #endif
  345. }
  346. #if defined _ALS_OnPlayerKeyStateChange
  347.     #undef OnPlayerKeyStateChange
  348. #else
  349.     #define _ALS_OnPlayerKeyStateChange
  350. #endif
  351.  
  352. #define OnPlayerEnterDynamicArea CP_OnPlayerEnterDynamicArea
  353. #if defined CP_OnPlayerKeyStateChange
  354.     forward CP_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
  355. #endif
  356. #if defined OnPlayerKeyStateChangeInCP
  357.     forward OnPlayerKeyStateChangeInCP(playerid, name[], CPID, newkeys, oldkeys);
  358. #endif
  359.  
  360. #endif
  361. //-------------------------------------------------------------------------------------------------------------------------
  362. #if defined OnPlayerTextInCP
  363. public OnPlayerText(playerid, text[])
  364. {
  365.     foreach(new CPID : Iter_CPS)
  366.     {
  367.         if(InCP[playerid][CPID])
  368.         {
  369.             new arr[32];
  370.             Streamer_GetArrayData(STREAMER_TYPE_AREA, AreaCP[CPID], E_STREAMER_EXTRA_ID, arr);
  371.  
  372.             #if defined OnPlayerTextInCP
  373.                 OnPlayerTextInCP(playerid, arr, CPID, text);
  374.             #endif
  375.         }
  376.     }
  377.     #if defined CP_OnPlayerText
  378.         return CP_OnPlayerText(playerid, text);
  379.     #else
  380.         return 1;
  381.     #endif
  382. }
  383. #if defined _ALS_OnPlayerText
  384.     #undef OnPlayerText
  385. #else
  386.     #define _ALS_OnPlayerText
  387. #endif
  388.  
  389. #define OnPlayerText CP_OnPlayerText
  390. #if defined CP_OnPlayerText
  391.     forward CP_OnPlayerText(playerid, text[]));
  392. #endif
  393. #if defined OnPlayerTextInCP
  394.     forward OnPlayerTextInCP(playerid, name[], CPID, text[]);
  395. #endif
  396.  
  397. #endif
  398. //-------------------------------------------------------------------------------------------------------------------------
  399.  
  400.  
  401. public OnPlayerEnterDynamicArea(playerid, STREAMER_TAG_AREA areaid)
  402. {
  403.     new arr[32];
  404.     Streamer_GetArrayData(STREAMER_TYPE_AREA, areaid, E_STREAMER_EXTRA_ID, arr);
  405.     if(arr[0] == CP_STREAMER_IDENTIFIER)
  406.     {
  407.         new CPID= AreaCP[areaid];
  408.         #pragma unused CPID
  409.  
  410.         InCP[playerid][CPID]= true;
  411.  
  412.         #if defined OnPlayerEnterCheckpointEx
  413.             OnPlayerEnterCheckpointEx(playerid, arr[1], CPID);
  414.         #endif
  415.         // !isnull
  416.         if(!(!(arr[1])) || (((arr[1]) == '\1') && (!(arr[2]))))
  417.         {
  418.             arr[0] = 'c';
  419.             strins(arr[1], "p1_", 0);
  420.             CallLocalFunction(arr, "d", playerid);
  421.         }  
  422.         return true;
  423.     }
  424.     #if defined CP_OnPlayerEnterDynamicArea
  425.         return CP_OnPlayerEnterDynamicArea(playerid, STREAMER_TAG_AREA areaid);
  426.     #else
  427.         return 1;
  428.     #endif
  429. }
  430. #if defined _ALS_OnPlayerEnterDynamicArea
  431.     #undef OnPlayerEnterDynamicArea
  432. #else
  433.     #define _ALS_OnPlayerEnterDynamicArea
  434. #endif
  435.  
  436. #define OnPlayerEnterDynamicArea CP_OnPlayerEnterDynamicArea
  437. #if defined CP_OnPlayerEnterDynamicArea
  438.     forward CP_OnPlayerEnterDynamicArea(playerid, STREAMER_TAG_AREA areaid);
  439. #endif
  440.  
  441. //-------------------------------------------------------------------------------------------------------------------------
  442. public OnPlayerLeaveDynamicArea(playerid, STREAMER_TAG_AREA areaid)
  443. {
  444.     new arr[32];
  445.     Streamer_GetArrayData(STREAMER_TYPE_AREA, areaid, E_STREAMER_EXTRA_ID, arr);
  446.     if(arr[0] == CP_STREAMER_IDENTIFIER)
  447.     {
  448.         new CPID= AreaCP[areaid];
  449.         #pragma unused CPID
  450.  
  451.         InCP[playerid][CPID]= false;
  452.  
  453.         #if defined OnPlayerExitCheckpointEx
  454.             OnPlayerExitCheckpointEx(playerid, arr[1], CPID);
  455.         #endif
  456.         // !isnull
  457.         if(!(!(arr[1])) || (((arr[1]) == '\1') && (!(arr[2]))))
  458.         {
  459.             arr[0] = 'c';
  460.             strins(arr[1], "p2_", 0);
  461.             CallLocalFunction(arr, "d", playerid);
  462.         }
  463.         return true;
  464.     }
  465.     #if defined CP_OnPlayerLeaveDynamicArea
  466.         return CP_OnPlayerLeaveDynamicArea(playerid, STREAMER_TAG_AREA areaid);
  467.     #else
  468.         return 1;
  469.     #endif
  470. }
  471. #if defined _ALS_OnPlayerLeaveDynamicArea
  472.     #undef OnPlayerLeaveDynamicArea
  473. #else
  474.     #define _ALS_OnPlayerLeaveDynamicArea
  475. #endif
  476.  
  477. #define OnPlayerLeaveDynamicArea CP_OnPlayerLeaveDynamicArea
  478. #if defined CP_OnPlayerLeaveDynamicArea
  479.     forward CP_OnPlayerLeaveDynamicArea(playerid, STREAMER_TAG_AREA areaid);
  480. #endif
  481. //-------------------------------------------------------------------------------------------------------------------------
  482. #endif //Final da include
Advertisement
Add Comment
Please, Sign In to add comment