Guest User

Untitled

a guest
Sep 7th, 2017
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 5.68 KB | None | 0 0
  1. /*
  2. Enter/Level Pickups
  3. by Mike
  4.  
  5. Pickups that act like checkpoints. Instead of just detecting when a player
  6. picks up a pickup, this allows you to detect when a player enters a pickup,
  7. and then when they leave it again.
  8.  
  9. There may be problems if two pickups are very close to eachother.
  10.  
  11. ===[FUNCTIONS]===
  12.  
  13. native ELP_GetPlayerPickup(playerid); // Get the ID of the current ELP pickup the player is standing in
  14.  
  15. */
  16.  
  17. // PREFIX: ELP_ (In Out Pickups)
  18.  
  19. #include <YSI_Coding\y_hooks>
  20.  
  21. // Settings
  22. #define MAX_ELP_PICKUPS 256
  23.  
  24. // This is the timer interval to check when a player leaves a pickup.
  25. //It is only running when needed, and only once (using foreach).
  26. //#define ELP_TIMER_INTERVAL 661
  27. // ** using OnPlayerUpdate now **
  28.  
  29. // The distance away from the pickup the player has to be to be detected as leaving it
  30. #define ELP_PICKUP_RANGE (1.7)
  31.  
  32. // FUNCTIONS
  33. /*
  34.  
  35. // CREATE - Create an 'in/out' pickup (note that the following are all the
  36. // same function, they're aliases
  37. native ELP_CreatePickup(model, Float:x, Float:y, Float:z, virtualworld = -1);
  38.  
  39. // DELETE
  40. native ELP_DeletePickup(ELP_id); // ELP_id is returned by CreatePickupEx
  41. native ELP_DestroyPickup(ELP_id); // ELP_id is returned by CreatePickupEx
  42.  
  43. // CHECKS
  44. native IsPlayerInPickup(playerid, ELP_id);
  45. */
  46.  
  47. #define ELP_GetPlayerPickup(%0) ELP_playerCurPickupID[%0]
  48.  
  49. // CALLBACKS
  50.  
  51. forward OnEnterLeavePickup(playerid, pickupid, enterleave);
  52. #define PICKUP_LEAVE 0
  53. #define PICKUP_ENTER 1
  54.  
  55. enum E_INOUT_PICKUP_DATA
  56. {
  57.     ELP_pickupid, // The actual pickup ID created
  58.     Float:ELP_pos[3]
  59.    
  60. }
  61. new ELP_gPickupData[MAX_ELP_PICKUPS][E_INOUT_PICKUP_DATA];
  62.  
  63. new ELP_playerCurPickupID[MAX_PLAYERS];
  64.  
  65. //new Iterator:ELP_Iter<MAX_PICKUPS>;
  66.  
  67. //new ELP_TimerID;
  68.  
  69. // ============================================================================
  70.  
  71. hook OnGameModeInit()
  72. {
  73.     for(new i=0; i<MAX_ELP_PICKUPS; i++)
  74.     {
  75.         ELP_gPickupData[i][ELP_pickupid] = -1;
  76.     }
  77.    
  78.     // END OF CALLBACK.
  79.     #if defined ELP_OnGameModeInit
  80.         ELP_OnGameModeInit();
  81.     #endif
  82.     return 1;
  83. }
  84. #if defined _ALS_OnGameModeInit
  85.     #undef OnGameModeInit
  86. #else
  87.     #define _ALS_OnGameModeInit
  88. #endif
  89. #define OnGameModeInit ELP_OnGameModeInit
  90. #if defined ELP_OnGameModeInit
  91.     forward ELP_OnGameModeInit();
  92. #endif
  93.  
  94. stock ELP_CreatePickup(model, Float:x, Float:y, Float:z, virtualworld = -1)
  95. {
  96.     for(new i=0; i<MAX_ELP_PICKUPS; i++)
  97.     {
  98.         if(ELP_gPickupData[i][ELP_pickupid] == -1)
  99.         {
  100.             ELP_gPickupData[i][ELP_pickupid] = CreatePickup(model, 1, x, y, z, virtualworld);
  101.             ELP_gPickupData[i][ELP_pos][0] = x;
  102.             ELP_gPickupData[i][ELP_pos][1] = y;
  103.             ELP_gPickupData[i][ELP_pos][2] = z;
  104.  
  105.             return i;
  106.         }
  107.     }
  108.  
  109.     print("ERROR: Maximum number of ELP created ("#MAX_ELP_PICKUPS")");
  110.     return -1;
  111. }
  112.  
  113. #define ELP_DestroyPickup ELP_DeletePickup
  114. stock ELP_DeletePickup(ELP_id)
  115. {
  116.     if(ELP_id == -1) return 0;
  117.     if(ELP_gPickupData[ELP_id][ELP_pickupid] == -1) return 0;
  118.  
  119.     DestroyPickup(ELP_gPickupData[ELP_id][ELP_pickupid]);
  120.     ELP_gPickupData[ELP_id][ELP_pickupid] = -1;
  121.  
  122.     foreach(new i : Player)
  123.     {
  124.         if(ELP_playerCurPickupID[i] == ELP_id)
  125.         {
  126.             CallLocalFunction("OnEnterLeavePickup", "iii", i, ELP_id, PICKUP_LEAVE);
  127.             ELP_playerCurPickupID[i] = -1;
  128.         }
  129.     }
  130.     return 1;
  131. }
  132.  
  133. hook OnPlayerConnect(playerid)
  134. {
  135.     ELP_playerCurPickupID[playerid] = -1;
  136.     return 1;
  137. }
  138.  
  139. hook OnPlayerPickUpPickup(playerid, pickupid)
  140. {
  141.     // Check if this is an ELP
  142.     for(new i=0; i<MAX_ELP_PICKUPS; i++)
  143.     {
  144.         if(pickupid == ELP_gPickupData[i][ELP_pickupid])
  145.         {
  146.             if(ELP_playerCurPickupID[playerid] == i) return 1;
  147.  
  148.             // Leave current pickup (if any)
  149.             if(ELP_playerCurPickupID[playerid] != -1)
  150.             {
  151.                 CallLocalFunction("OnEnterLeavePickup", "iii", playerid, ELP_playerCurPickupID[playerid], PICKUP_LEAVE);
  152.             }
  153.  
  154.             ELP_playerCurPickupID[playerid] = i;
  155.             CallLocalFunction("OnEnterLeavePickup", "iii", playerid, i, PICKUP_ENTER);
  156.  
  157.             /*if(Iter_Count(ELP_Iter) == 0) // No players being tracked, start the check timer
  158.             {
  159.                 ELP_TimerID = SetTimer("TMR_ELP_CheckPlayers", ELP_TIMER_INTERVAL, true);
  160.             }
  161.             Iter_Add(ELP_Iter, playerid);*/
  162.             return 1;
  163.         }
  164.     }
  165.     return 1;
  166. }
  167.  
  168. hook OnPlayerDisconnect(playerid, reason)
  169. {
  170.     if(ELP_playerCurPickupID[playerid] != -1)
  171.     {
  172.         //Iter_Remove(ELP_Iter, playerid);
  173.         CallLocalFunction("OnEnterLeavePickup", "iii", playerid, ELP_playerCurPickupID[playerid], PICKUP_LEAVE);
  174.         ELP_playerCurPickupID[playerid] = -1;
  175.         //if(Iter_Count(ELP_Iter) == 0) KillTimer(ELP_TimerID);
  176.     }
  177.     return 1;
  178. }
  179.  
  180. /*forward TMR_ELP_CheckPlayers();
  181. public TMR_ELP_CheckPlayers()
  182. {
  183.     print("TMR_ELP_CheckPlayers");
  184.     foreach(new i : ELP_Iter) // Go through all PLAYERS
  185.     {
  186.         new next;
  187.         if(!IsPlayerInRangeOfPoint(i,
  188.         ELP_PICKUP_RANGE,
  189.         ELP_gPickupData[ELP_playerCurPickupID[i]][ELP_pos][0],
  190.         ELP_gPickupData[ELP_playerCurPickupID[i]][ELP_pos][1],
  191.         ELP_gPickupData[ELP_playerCurPickupID[i]][ELP_pos][2]
  192.         ))
  193.         {
  194.             Iter_SafeRemove(ELP_Iter, i, next);
  195.             CallLocalFunction("OnEnterLeavePickup", "iii", i, ELP_playerCurPickupID[i], PICKUP_LEAVE);
  196.             ELP_playerCurPickupID[i] = -1;
  197.  
  198.             // If there's no more players to watch, kill the timer
  199.             if(Iter_Count(ELP_Iter) == 0) KillTimer(ELP_TimerID);
  200.         }
  201.         i = next;
  202.     }
  203.     return 1;
  204. }*/
  205.  
  206. hook OnPlayerUpdate(playerid)
  207. {
  208.     if(ELP_playerCurPickupID[playerid] != -1)
  209.     {
  210.         if(!IsPlayerInRangeOfPoint(playerid, ELP_PICKUP_RANGE, ELP_gPickupData[ELP_playerCurPickupID[playerid]][ELP_pos][0], ELP_gPickupData[ELP_playerCurPickupID[playerid]][ELP_pos][1], ELP_gPickupData[ELP_playerCurPickupID[playerid]][ELP_pos][2]))
  211.         {
  212.             CallLocalFunction("OnEnterLeavePickup", "iii", playerid, ELP_playerCurPickupID[playerid], PICKUP_LEAVE);
  213.             ELP_playerCurPickupID[playerid] = -1;
  214.         }
  215.     }
  216.     return 1;
  217. }
Advertisement
Add Comment
Please, Sign In to add comment