Guest User

MCF CP [V 1.5.2]

a guest
Feb 26th, 2018
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.37 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. #if !defined MCF_CP_VERSION                    
  66.  
  67. //-----------STREAMER Required-------------
  68. #if !defined Streamer_IncludeFileVersion
  69.     #tryinclude <streamer>
  70.  
  71.     #if !defined Streamer_IncludeFileVersion
  72.         #error [MCF CP] This include requires Streamer Plugin!
  73.     #endif
  74. #endif
  75. //------------------------------------------
  76.  
  77. //-----------Interator Required-------------
  78. #if !defined foreach
  79.     #tryinclude <YSI\y_iterate>
  80.  
  81.     #if !defined foreach
  82.         #tryinclude <foreach>
  83.  
  84.         #if !defined foreach
  85.             #error [MCF CP] This include requires semone interator include!
  86.         #endif
  87.     #endif 
  88. #endif
  89.  
  90.  
  91. #if defined mCP_included
  92.     #endinput
  93. #endif
  94. #define mCP_included
  95.  
  96. #define CP_STREAMER_IDENTIFIER 0xA7     // §
  97.  
  98. #define CPEnter:%0(%1) forward cp1_%0(%1);public cp1_%0(%1)
  99. #define CPExit:%0(%1)  forward cp2_%0(%1);public cp2_%0(%1)
  100.  
  101.  
  102. #if !defined MAX_CPS
  103.     #define MAX_CPS (500)
  104. #endif
  105.  
  106. #if !defined MAX_AREASCP
  107.     #define MAX_AREASCP (1000)
  108. #endif
  109.  
  110. #if !defined CP_Z_FIZ
  111.     #define CP_Z_FIZ 0.5
  112. #endif
  113.  
  114. #define INVALID_CP -1
  115.  
  116. static Iterator:Iter_free<MAX_CPS>;
  117. static Iterator:Iter_CPS<MAX_CPS>;
  118. static i_CountCP;
  119.  
  120. static CPType:CPmodel[MAX_CPS];         //Model do CP, salvado, para alteração de cores!
  121. static CPObject[MAX_CPS];               //CPID -> to -> dynamicObject
  122. static CPArea[MAX_CPS];                 //CPID -> to -> AREAID
  123. static AreaCP[MAX_AREASCP];             //AREAID -> to -> CPID
  124.  
  125. static bool:InCP[MAX_PLAYERS][MAX_CPS];             //Player está no CP
  126.  
  127. enum CPType {
  128.     CP_ARROW,
  129.     CP_CIRCLE_BIG,
  130.     CP_CIRCLE,
  131.     CP_INVISIBLE
  132. };
  133.  
  134.  
  135. #if __Pawn != 0x030A // != Zeex pawn
  136.     enum E_CP_MODEL_DATA {
  137. #else
  138.     #if defined __PawnBuild // Zeex pawn 3.10.1
  139.         static enum E_CP_MODEL_DATA {
  140.     #else
  141.         enum E_CP_MODEL_DATA {
  142.     #endif
  143. #endif
  144.     CP_Model,
  145.     Float:CP_ModelSize
  146. };
  147.  
  148. static CP_MODEL_DATA[CPType][E_CP_MODEL_DATA]=
  149. {
  150.     {19605, 1.0}, // CP_ARROW_RED
  151.     {19945, 8.0}, // CP_CIRCLE_RED_BIG
  152.     {13171.0}, // CP_CIRCLE_RED
  153.     {19300, 1.0}  // CP_INVISIBLE
  154. };
  155.  
  156. #if defined OnPlayerEnterCheckpointEx
  157.     forward OnPlayerEnterCheckpointEx(playerid, checkpoint[], CPID);
  158. #endif
  159.  
  160. #if defined OnPlayerExitCheckpointEx
  161.     forward OnPlayerExitCheckpointEx(playerid, checkpoint[], CPID);
  162. #endif
  163.  
  164. #if defined OnCheckpointStreamIn
  165.     forward OnPlayerExitCheckpointEx(playerid, checkpoint[], CPID);
  166. #endif
  167.  
  168. #if defined OnCheckpointStreamOut
  169.     forward OnCheckpointStreamOut(playerid, checkpoint[], CPID);
  170. #endif
  171.  
  172. #if defined OnCheckpointCreate
  173.     forward OnCheckpointCreate(name[29], CPType:type, color, Float:x, Float:y, Float:z, worldid, interiorid, forplayer);
  174. #endif
  175. stock CreatePlayerCheckPoint(playerid, name[29] = "", CPType:type= CP_CIRCLE, color= 0x99FF0000, Float:x=0.0, Float:y=0.0, Float:z=0.0, worldid = -1, interiorid = -1)
  176. {
  177.     return CreateCheckPoint(name, type, x, y, z, worldid, interiorid, playerid);
  178. }
  179.  
  180. stock CreateCheckPoint(name[29] = "", CPType:type = CP_CIRCLE, color= 0x99FF0000, Float:x=0.0, Float:y=0.0, Float:z=0.0, worldid = -1, interiorid = -1, forplayer= -1)
  181. {
  182.     if(!(CP_ARROW <= type <= CP_INVISIBLE))
  183.         return INVALID_CP;
  184.  
  185.     if(forplayer != -1)
  186.     {
  187.         if(!(0 <= forplayer > MAX_PLAYERS))
  188.             return INVALID_CP;
  189.     }
  190.  
  191.     new id= GetNexCPID();
  192.  
  193.     #if defined OnCheckpointCreate
  194.         if(!OnCheckpointCreate(name[29], CPType:type = CP_CIRCLE, color, Float:x, Float:y, Float:z, worldid, interiorid, forplayer))
  195.             return DestroyCheckPoint(id);//caso retornar 0, o checkpoint não sera criado!
  196.     #endif
  197.  
  198.     if(CP_CIRCLE == type) z -= 0.4;
  199.  
  200.     CPmodel[id]=type;
  201.  
  202.     new object= CPObject[id]=   CreateDynamicObject(CP_MODEL_DATA[type][CP_Model], x, y, z - CP_Z_FIZ, 0.0, 0.0, 0.0, worldid, interiorid, forplayer);
  203.     new area=   CPArea[id]=     CreateDynamicSphere(x, y, z, CP_MODEL_DATA[type][CP_ModelSize], worldid, interiorid, forplayer);
  204.  
  205.     AreaCP[area]= id;
  206.  
  207.     if(CP_CIRCLE ==type)
  208.         SetDynamicObjectMaterial(object, 0, 18646, "matcolours", "white", color);
  209.     else
  210.         SetDynamicObjectMaterialText(object, 0, " ", OBJECT_MATERIAL_SIZE_32x32,"Arial", 8, 1, 0x55555555, color);
  211.    
  212.  
  213.     new arr[32];
  214.  
  215.     Iter_Add(Iter_CPS, id);
  216.  
  217.     format(arr, 32, "%c%s", CP_STREAMER_IDENTIFIER, name);
  218.     Streamer_SetArrayData(STREAMER_TYPE_AREA, area, E_STREAMER_EXTRA_ID, arr);
  219.  
  220.     AttachDynamicAreaToObject(area, object);
  221.     return id;
  222. }
  223. //------------------names---------------------------------
  224. stock GetCPName( CPID)
  225. {
  226.     new arr[32]="";
  227.     Streamer_GetArrayData(STREAMER_TYPE_AREA, AreaCP[CPID], E_STREAMER_EXTRA_ID, arr);
  228.     return arr;
  229. }
  230. stock SetNameCP(CPID, name[])
  231. {
  232.     new arr[32];
  233.     format(arr, 32, "%c%s", CP_STREAMER_IDENTIFIER, name);
  234.     Streamer_SetArrayData(STREAMER_TYPE_AREA, area, E_STREAMER_EXTRA_ID, arr);
  235. }
  236. stock RenameCP(oldname[], newname[])
  237. {
  238.     new arr[32],name[32];
  239.     format(name, 32, "%c%s", CP_STREAMER_IDENTIFIER, name)
  240.  
  241.     for(new STREAMER_TAG_AREA i; i < num; ++i)
  242.     {
  243.         Streamer_GetArrayData(STREAMER_TYPE_AREA, i, E_STREAMER_EXTRA_ID, arr);
  244.         if(arr[0] == CP_STREAMER_IDENTIFIER)
  245.         {
  246.             // isnull
  247.             if((!(arr[1])) || (((arr[1]) == '\1') && (!(arr[2]))))
  248.                 continue;
  249.  
  250.             strdel(arr, 0, 1);
  251.             if(!strcmp(arr, oldname)
  252.                 Streamer_SetArrayData(STREAMER_TYPE_AREA, i, E_STREAMER_EXTRA_ID, name);
  253.         }
  254.     }
  255. }
  256. //-------------------------------------------------------------
  257. stock DestroyCheckPoint( CPID)
  258. {
  259.     DestroyDynamicArea(CPArea[CPID]);
  260.     DestroyDynamicObject(CPObject[CPID]);
  261.     Iter_Add(Iter_free, CPID);
  262.     Iter_Remove(Iter_CPS, CPID);
  263.     return INVALID_CP;
  264. }
  265. stock SetCPtoPos( CPID, Float:x=0.0, Float:y=0.0, Float:z=0.0)
  266. {
  267.     new obj= CPObject[CPID];
  268.     return SetDynamicObjectPos(obj, x, y, z - CP_Z_FIZ);
  269. }
  270. stock MoveCPtoPos( CPID, Float:x=0.0, Float:y=0.0, Float:z=0.0, Float:speed= 2.0)
  271. {
  272.     new obj= CPObject[CPID];
  273.     return MoveDynamicObject(obj, x, y, z, speed);
  274. }
  275. stock AttachCPtoObject( CPID, objectid, Float:x=0.0, Float:y=0.0, Float:z=0.0)
  276. {
  277.     new obj= CPObject[CPID];
  278.     return AttachDynamicObjectToObject(obj, objectid, x, y, z - CP_Z_FIZ, 0.0, 0.0, 0.0);
  279. }
  280. stock AttachCPtoPlayer( CPID, playerid, Float:x=0.0, Float:y=0.0, Float:z=0.0)
  281. {
  282.     new obj= CPObject[CPID];
  283.     return AttachDynamicObjectToPlayer(obj, playerid, x, y, z - CP_Z_FIZ, 0.0, 0.0, 0.0);
  284. }
  285. stock AttachCPtoVehicle( CPID, vehicleid, Float:x=0.0, Float:y=0.0, Float:z=0.0)
  286. {
  287.     new obj= CPObject[CPID];
  288.     return AttachDynamicObjectToVehicle(obj, vehicleid, x, y, z - CP_Z_FIZ, 0.0, 0.0, 0.0);
  289. }
  290. stock AttachCPtoCP( CPID, CPattached, Float:x=0.0, Float:y=0.0, Float:z=0.0)
  291. {
  292.     new obj= CPObject[CPID];
  293.     return AttachDynamicObjectToObject(obj, CPObject[CPattached], x, y, z - CP_Z_FIZ, 0.0, 0.0, 0.0);
  294. }
  295. stock SetCheckPointColor(CPID, color=0x99FF0000)
  296. {
  297.     if(CP_CIRCLE == CPmodel[CPID])
  298.         SetDynamicObjectMaterial(object, 0, 18646, "matcolours", "white", color);
  299.     else
  300.         SetDynamicObjectMaterialText(object, 0, " ", OBJECT_MATERIAL_SIZE_32x32,"Arial", 8, 1, 0x55555555, color);
  301. }
  302. stock bool:IsPlayerInCP(playerid, CPID)
  303. {
  304.     return InCP[playerid][CPID];
  305. }
  306. stock IsPlayerInAnyCheckpointEx(playerid)
  307. {
  308.     static STREAMER_TAG_AREA areas[500];
  309.  
  310.     new
  311.         STREAMER_TAG_AREA num = STREAMER_TAG_AREA GetPlayerDynamicAreas(playerid, areas),
  312.         arr[32]
  313.     ;
  314.  
  315.     for(new STREAMER_TAG_AREA i; i < num; ++i)
  316.     {
  317.         Streamer_GetArrayData(STREAMER_TYPE_AREA, i, E_STREAMER_EXTRA_ID, arr);
  318.         if(arr[0] == CP_STREAMER_IDENTIFIER)
  319.         {
  320.             return true;
  321.         }
  322.     }
  323.     return false;
  324. }
  325.  
  326. stock IsPlayerInCheckpointEx(playerid, name[])
  327. {
  328.     // isnull
  329.     if((!(name[0])) || (((name[0]) == '\1') && (!(name[1]))))
  330.         return false;
  331.  
  332.     static STREAMER_TAG_AREA areas[500];
  333.  
  334.     new
  335.         STREAMER_TAG_AREA num = STREAMER_TAG_AREA GetPlayerDynamicAreas(playerid, areas),
  336.         arr[32]
  337.     ;
  338.  
  339.     for(new STREAMER_TAG_AREA i; i < num; ++i)
  340.     {
  341.         Streamer_GetArrayData(STREAMER_TYPE_AREA, i, E_STREAMER_EXTRA_ID, arr);
  342.         if(arr[0] == CP_STREAMER_IDENTIFIER)
  343.         {
  344.             // isnull
  345.             if((!(arr[1])) || (((arr[1]) == '\1') && (!(arr[2]))))
  346.                 continue;
  347.  
  348.             strdel(arr, 0, 1);
  349.  
  350.             if(!strcmp(arr, name))
  351.                 return true;
  352.         }
  353.     }
  354.     return false;
  355. }
  356. /*--------------------------------------------------------------------------------------------------------------
  357. ## Internal:
  358.  * **Functions:**
  359.  *  - GetNexCPID
  360.  * **Callbacks:**
  361.     - OnPlayerEnterDynamicArea
  362.     - OnPlayerExitDynamicArea
  363. */
  364. stock GetNexCPID()                        //capta o ID, do proximo CP a ser criado!
  365. {
  366.     foreach(new free : Iter_free)        //recupera o ID de um CP deletado
  367.     {
  368.         Iter_Remove(Iter_free, free);
  369.         return free;
  370.     }
  371.     if(i_CountCP + 1 == MAX_CPS)
  372.     {
  373.         printf("[ERROR] max checkpoints loaded %d/%d", i_CountCP + 1, MAX_CPS);
  374.         return INVALID_CP;
  375.     }
  376.     i_CountCP++;                         //Caso não haja CP deletados, ele cria um novo ID
  377.     return  i_CountCP;
  378. }
  379. //-------------------------------------------------------------------------------------------------------------------------
  380. #if defined OnPlayerKeyStateChangeInCP
  381. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  382. {
  383.     foreach(new CPID : Iter_CPS)
  384.     {
  385.         if(InCP[playerid][CPID])
  386.         {
  387.             new arr[32];
  388.             Streamer_GetArrayData(STREAMER_TYPE_AREA, AreaCP[CPID], E_STREAMER_EXTRA_ID, arr);
  389.  
  390.             strdel(arr, 0, 1);
  391.  
  392.             #if defined OnPlayerKeyStateChangeInCP
  393.                 OnPlayerKeyStateChangeInCP(playerid, arr, CPID, newkeys, oldkeys);
  394.             #endif
  395.         }
  396.     }
  397.     #if defined CP_OnPlayerKeyStateChange
  398.         return CP_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
  399.     #else
  400.         return 1;
  401.     #endif
  402. }
  403. #if defined _ALS_OnPlayerKeyStateChange
  404.     #undef OnPlayerKeyStateChange
  405. #else
  406.     #define _ALS_OnPlayerKeyStateChange
  407. #endif
  408.  
  409. #define OnPlayerEnterDynamicArea CP_OnPlayerEnterDynamicArea
  410. #if defined CP_OnPlayerKeyStateChange
  411.     forward CP_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
  412. #endif
  413. #if defined OnPlayerKeyStateChangeInCP
  414.     forward OnPlayerKeyStateChangeInCP(playerid, name[], CPID, newkeys, oldkeys);
  415. #endif
  416.  
  417. #endif
  418. //-------------------------------------------------------------------------------------------------------------------------
  419. #if defined OnPlayerTextInCP
  420. public OnPlayerText(playerid, text[])
  421. {
  422.     foreach(new CPID : Iter_CPS)
  423.     {
  424.         if(InCP[playerid][CPID])
  425.         {
  426.             new arr[32];
  427.             Streamer_GetArrayData(STREAMER_TYPE_AREA, AreaCP[CPID], E_STREAMER_EXTRA_ID, arr);
  428.  
  429.             strdel(arr, 0, 1);
  430.  
  431.             #if defined OnPlayerTextInCP
  432.                 OnPlayerTextInCP(playerid, arr, CPID, text);
  433.             #endif
  434.         }
  435.     }
  436.     #if defined CP_OnPlayerText
  437.         return CP_OnPlayerText(playerid, text);
  438.     #else
  439.         return 1;
  440.     #endif
  441. }
  442. #if defined _ALS_OnPlayerText
  443.     #undef OnPlayerText
  444. #else
  445.     #define _ALS_OnPlayerText
  446. #endif
  447.  
  448. #define OnPlayerText CP_OnPlayerText
  449. #if defined CP_OnPlayerText
  450.     forward CP_OnPlayerText(playerid, text[]));
  451. #endif
  452. #if defined OnPlayerTextInCP
  453.     forward OnPlayerTextInCP(playerid, name[], CPID, text[]);
  454. #endif
  455.  
  456. #endif
  457. //-------------------------------------------------------------------------------------------------------------------------
  458.  
  459.  
  460. public OnPlayerEnterDynamicArea(playerid, STREAMER_TAG_AREA areaid)
  461. {
  462.     OnPlayerEnterDynArea(playerid, areaid);
  463.     new arr[32];
  464.     Streamer_GetArrayData(STREAMER_TYPE_AREA, areaid, E_STREAMER_EXTRA_ID, arr);
  465.     if(arr[0] == CP_STREAMER_IDENTIFIER)
  466.     {
  467.         strdel(arr, 0, 1);
  468.  
  469.         new CPID= AreaCP[areaid];
  470.        
  471.         InCP[playerid][CPID]= true;
  472.  
  473.         #if defined OnPlayerEnterCheckpointEx
  474.             if(!OnPlayerEnterCheckpointEx(playerid, arr, CPID))
  475.                 return 1;//não chamar processador!
  476.         #endif
  477.         // !isnull
  478.         if(!(!(arr[1])) || (((arr[1]) == '\1') && (!(arr[2]))))
  479.         {
  480.             strins(arr, "cp1_", 0);
  481.             CallLocalFunction(arr, "d", playerid, CPID);
  482.         }  
  483.         return true;
  484.     }
  485.     #if defined CP_OnPlayerEnterDynamicArea
  486.         return CP_OnPlayerEnterDynamicArea(playerid, STREAMER_TAG_AREA areaid);
  487.     #else
  488.         return 1;
  489.     #endif
  490. }
  491. #if defined _ALS_OnPlayerEnterDynamicArea
  492.     #undef OnPlayerEnterDynamicArea
  493. #else
  494.     #define _ALS_OnPlayerEnterDynamicArea
  495. #endif
  496.  
  497. #define OnPlayerEnterDynamicArea CP_OnPlayerEnterDynamicArea
  498. #if defined CP_OnPlayerEnterDynamicArea
  499.     forward CP_OnPlayerEnterDynamicArea(playerid, STREAMER_TAG_AREA areaid);
  500. #endif
  501.  
  502. //-------------------------------------------------------------------------------------------------------------------------
  503. public OnPlayerLeaveDynamicArea(playerid, STREAMER_TAG_AREA areaid)
  504. {
  505.     OnPlayerleaveDynArea(playerid, areaid);
  506.     new arr[32];
  507.     Streamer_GetArrayData(STREAMER_TYPE_AREA, areaid, E_STREAMER_EXTRA_ID, arr);
  508.     if(arr[0] == CP_STREAMER_IDENTIFIER)
  509.     {
  510.         strdel(arr, 0, 1);
  511.  
  512.         new CPID= AreaCP[areaid];
  513.        
  514.         InCP[playerid][CPID]= false;
  515.  
  516.         #if defined OnPlayerExitCheckpointEx
  517.             if(!OnPlayerExitCheckpointEx(playerid, arr, CPID))
  518.                 return 1;//não chama processador
  519.         #endif
  520.         // !isnull
  521.         if(!(!(arr[1])) || (((arr[1]) == '\1') && (!(arr[2]))))
  522.         {
  523.             strins(arr, "cp2_", 0);
  524.             CallLocalFunction(arr, "d", playerid);
  525.         }
  526.         return true;
  527.     }
  528.     #if defined CP_OnPlayerLeaveDynamicArea
  529.         return CP_OnPlayerLeaveDynamicArea(playerid, STREAMER_TAG_AREA areaid);
  530.     #else
  531.         return 1;
  532.     #endif
  533. }
  534. #if defined _ALS_OnPlayerLeaveDynamicArea
  535.     #undef OnPlayerLeaveDynamicArea
  536. #else
  537.     #define _ALS_OnPlayerLeaveDynamicArea
  538. #endif
  539.  
  540. #define OnPlayerLeaveDynamicArea CP_OnPlayerLeaveDynamicArea
  541. #if defined CP_OnPlayerLeaveDynamicArea
  542.     forward CP_OnPlayerLeaveDynamicArea(playerid, STREAMER_TAG_AREA areaid);
  543. #endif
  544. //-------------------------------------------------------------------------------------------------------------------------
  545. #endif //Final da include
Add Comment
Please, Sign In to add comment