Advertisement
Guest User

key_pickupfix.inc

a guest
Jan 2nd, 2019
256
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 10.18 KB | None | 0 0
  1. /*==============================================================================
  2.                         PICKUP BUG FIX BY USING KEY
  3.                         key_pickupfix.inc v1.2.2
  4.                         Author: whale (a.k.a Twixxx / Twixyck)
  5.  
  6. Copyright (c) 2018 Nikita Shtimenko (whale)
  7.  
  8. This software is provided 'as-is', without any express or implied warranty.
  9. In no event will the authors be held liable for any damages arising from the
  10. use of this software.
  11.  
  12. Permission is granted to anyone to use this software for
  13. any purpose, including commercial applications, and to alter it and
  14. redistribute it freely, subject to the following restrictions:
  15.  
  16. 1.  The origin of this software must not be misrepresented; you must not
  17.     claim that you wrote the original software. If you use this software in
  18.     a product, an acknowledgment in the product documentation would be
  19.     appreciated but is not required.
  20.  
  21. 2.  Altered source versions must be plainly marked as such, and must not be
  22.     misrepresented as being the original software.
  23.  
  24. 3.  This notice may not be removed or altered from any source distribution.
  25. ==============================================================================*/
  26. #if defined _key_pickupfix_included
  27.     #endinput
  28. #endif
  29. #define _key_pickupfix_included
  30.  
  31. #if __Pawn >= 0x3A && defined __PawnBuild
  32.     #if __Pawn == 0x3A && __PawnBuild >= 2 || __Pawn > 0x3A
  33.         #define static_enum        static enum
  34.     #endif
  35. #endif
  36. #if !defined static_enum
  37.     #define static_enum        enum
  38. #endif
  39.  
  40. #define KEY_PICKUPFIX_INVALID_PICKUP_ID         (-1)
  41. #define KEY_PICKUPFIX_INVALID_USED_KEY          (-1)
  42.  
  43. #if defined Streamer_IncludeFileVersion
  44.     #define KEY_PICKUPFIX_PICK_TYPE_INVALID     (-1)
  45.     #define KEY_PICKUPFIX_PICK_TYPE_DEFAULT     (0)
  46.     #define KEY_PICKUPFIX_PICK_TYPE_STREAM      (1)
  47. #endif
  48.  
  49. #define key_pickupfix_PRESSED(%0)  \
  50.     (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
  51.  
  52. #if defined Streamer_IncludeFileVersion
  53.  
  54.     static_enum key_pickupfix_e_PlayerPickupDat
  55.     {
  56.         key_pickupfix_pickupID,
  57.         key_pickupfix_pickupType,
  58.         key_pickupfix_pickupTimestamp,
  59.         bool:key_pickupfix_IsPickupUsed
  60.     };
  61.     static
  62.         key_pickupfix_playerPickupData[MAX_PLAYERS][key_pickupfix_e_PlayerPickupDat];
  63.  
  64.     static const
  65.         NULL_PLAYER_PICKUP_DATA[key_pickupfix_e_PlayerPickupDat] = {KEY_PICKUPFIX_INVALID_PICKUP_ID, KEY_PICKUPFIX_PICK_TYPE_INVALID, 0, false};
  66. #else
  67.     static_enum key_pickupfix_e_PlayerPickupDat
  68.     {
  69.         key_pickupfix_pickupID,
  70.         key_pickupfix_pickupTimestamp,
  71.         bool:key_pickupfix_IsPickupUsed
  72.     };
  73.     static
  74.         key_pickupfix_playerPickupData[MAX_PLAYERS][key_pickupfix_e_PlayerPickupDat];
  75.  
  76.     static const
  77.         NULL_PLAYER_PICKUP_DATA[key_pickupfix_e_PlayerPickupDat] = {KEY_PICKUPFIX_INVALID_PICKUP_ID, 0, false};
  78. #endif
  79.  
  80. static
  81.     key_pickupfix_pickupUsedKey[MAX_PICKUPS] = {KEY_PICKUPFIX_INVALID_USED_KEY, ...};
  82.  
  83. public OnPlayerConnect(playerid)
  84. {
  85.     key_pickupfix_playerPickupData[playerid] = NULL_PLAYER_PICKUP_DATA;
  86.  
  87.     #if defined key_pickupfix_OnPlayerConnect
  88.         key_pickupfix_OnPlayerConnect(playerid);
  89.     #endif
  90.     return 1;
  91. }
  92. #if defined _ALS_OnPlayerConnect
  93.     #undef OnPlayerConnect
  94. #else
  95.     #define _ALS_OnPlayerConnect
  96. #endif
  97. #define OnPlayerConnect key_pickupfix_OnPlayerConnect
  98. #if defined key_pickupfix_OnPlayerConnect
  99. forward key_pickupfix_OnPlayerConnect(playerid);
  100. #endif
  101.  
  102. public OnPlayerPickUpPickup(playerid, pickupid)
  103. {
  104.     if(key_pickupfix_pickupUsedKey[pickupid] != KEY_PICKUPFIX_INVALID_USED_KEY)
  105.     {
  106.         key_pickupfix_playerPickupData[playerid][key_pickupfix_pickupID] = pickupid;
  107.  
  108.         #if defined Streamer_IncludeFileVersion
  109.             key_pickupfix_playerPickupData[playerid][key_pickupfix_pickupType] = KEY_PICKUPFIX_PICK_TYPE_DEFAULT;
  110.         #endif
  111.  
  112.         key_pickupfix_playerPickupData[playerid][key_pickupfix_pickupTimestamp] = gettime();
  113.     }
  114.  
  115.     if(false == key_pickupfix_playerPickupData[playerid][key_pickupfix_IsPickupUsed] && key_pickupfix_playerPickupData[playerid][key_pickupfix_pickupID] != KEY_PICKUPFIX_INVALID_PICKUP_ID)
  116.         return 1;
  117.  
  118.     key_pickupfix_playerPickupData[playerid][key_pickupfix_pickupID] = KEY_PICKUPFIX_INVALID_PICKUP_ID;
  119.  
  120.     #if defined Streamer_IncludeFileVersion
  121.         key_pickupfix_playerPickupData[playerid][key_pickupfix_pickupType] = KEY_PICKUPFIX_PICK_TYPE_INVALID;
  122.     #endif
  123.  
  124.     key_pickupfix_playerPickupData[playerid][key_pickupfix_pickupTimestamp] = 0;
  125.     key_pickupfix_playerPickupData[playerid][key_pickupfix_IsPickupUsed] = false;
  126.  
  127.     #if defined key_pickupfix_OnPlayerPickUpPi
  128.         key_pickupfix_OnPlayerPickUpPi(playerid, pickupid);
  129.     #endif
  130.     return 1;
  131. }
  132. #if defined _ALS_OnPlayerPickUpPickup
  133.     #undef OnPlayerPickUpPickup
  134. #else
  135.     #define _ALS_OnPlayerPickUpPickup
  136. #endif
  137. #define OnPlayerPickUpPickup key_pickupfix_OnPlayerPickUpPi
  138. #if defined key_pickupfix_OnPlayerPickUpPi
  139. forward key_pickupfix_OnPlayerPickUpPi(playerid, pickupid);
  140. #endif
  141.  
  142. #if defined Streamer_IncludeFileVersion
  143.     public OnPlayerPickUpDynamicPickup(playerid, pickupid)
  144.     {
  145.         if(key_pickupfix_pickupUsedKey[pickupid] != KEY_PICKUPFIX_INVALID_USED_KEY)
  146.         {
  147.             key_pickupfix_playerPickupData[playerid][key_pickupfix_pickupID] = pickupid;
  148.             key_pickupfix_playerPickupData[playerid][key_pickupfix_pickupType] = KEY_PICKUPFIX_PICK_TYPE_STREAM;
  149.             key_pickupfix_playerPickupData[playerid][key_pickupfix_pickupTimestamp] = gettime();
  150.         }
  151.  
  152.         if(false == key_pickupfix_playerPickupData[playerid][key_pickupfix_IsPickupUsed] && key_pickupfix_playerPickupData[playerid][key_pickupfix_pickupID] != KEY_PICKUPFIX_INVALID_PICKUP_ID)
  153.             return 1;
  154.  
  155.         key_pickupfix_playerPickupData[playerid][key_pickupfix_pickupID] = KEY_PICKUPFIX_INVALID_PICKUP_ID;
  156.         key_pickupfix_playerPickupData[playerid][key_pickupfix_pickupType] = KEY_PICKUPFIX_PICK_TYPE_INVALID;
  157.         key_pickupfix_playerPickupData[playerid][key_pickupfix_pickupTimestamp] = 0;
  158.         key_pickupfix_playerPickupData[playerid][key_pickupfix_IsPickupUsed] = false;
  159.  
  160.         #if defined key_pickupfix_OnPlayerPickUpDy
  161.             key_pickupfix_OnPlayerPickUpDy(playerid, pickupid);
  162.         #endif
  163.         return 1;
  164.     }
  165.     #if defined _ALS_OnPlayerPickUpDynamicPicku
  166.         #undef OnPlayerPickUpDynamicPickup
  167.     #else
  168.         #define _ALS_OnPlayerPickUpDynamicPicku
  169.     #endif
  170.     #define OnPlayerPickUpDynamicPickup key_pickupfix_OnPlayerPickUpDy
  171.     #if defined key_pickupfix_OnPlayerPickUpDy
  172.     forward key_pickupfix_OnPlayerPickUpDy(playerid, pickupid);
  173.     #endif
  174. #endif
  175.  
  176. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  177. {
  178.     if(key_pickupfix_playerPickupData[playerid][key_pickupfix_pickupID] != KEY_PICKUPFIX_INVALID_PICKUP_ID)
  179.     {
  180.         if(key_pickupfix_PRESSED(key_pickupfix_pickupUsedKey[key_pickupfix_playerPickupData[playerid][key_pickupfix_pickupID]]))
  181.         {
  182.             if(false == key_pickupfix_playerPickupData[playerid][key_pickupfix_IsPickupUsed])
  183.             {
  184.                 if(0 <= (gettime() - key_pickupfix_playerPickupData[playerid][key_pickupfix_pickupTimestamp]) <= 1)
  185.                 {
  186.                     key_pickupfix_playerPickupData[playerid][key_pickupfix_IsPickupUsed] = true;
  187.  
  188.                     #if defined Streamer_IncludeFileVersion
  189.                         if(key_pickupfix_playerPickupData[playerid][key_pickupfix_pickupType] == KEY_PICKUPFIX_PICK_TYPE_DEFAULT)
  190.                             CallRemoteFunction("OnPlayerPickUpPickup", "dd", playerid, key_pickupfix_playerPickupData[playerid][key_pickupfix_pickupID]);
  191.                         else
  192.                             CallRemoteFunction("OnPlayerPickUpDynamicPickup", "dd", playerid, key_pickupfix_playerPickupData[playerid][key_pickupfix_pickupID]);
  193.                     #else
  194.                         CallRemoteFunction("OnPlayerPickUpPickup", "dd", playerid, key_pickupfix_playerPickupData[playerid][key_pickupfix_pickupID]);
  195.                     #endif
  196.                 }
  197.                 else
  198.                 {
  199.                     key_pickupfix_playerPickupData[playerid][key_pickupfix_pickupID] = KEY_PICKUPFIX_INVALID_PICKUP_ID;
  200.  
  201.                     #if defined Streamer_IncludeFileVersion
  202.                         key_pickupfix_playerPickupData[playerid][key_pickupfix_pickupType] = KEY_PICKUPFIX_PICK_TYPE_INVALID;
  203.                     #endif
  204.                     key_pickupfix_playerPickupData[playerid][key_pickupfix_pickupTimestamp] = 0;
  205.                     key_pickupfix_playerPickupData[playerid][key_pickupfix_IsPickupUsed] = false;
  206.  
  207.                     return 1;
  208.                 }
  209.             }
  210.         }
  211.     }
  212.     #if defined key_pickupfix_OnPlayerKeyState
  213.         key_pickupfix_OnPlayerKeyState(playerid, newkeys, oldkeys);
  214.     #endif
  215.     return 1;
  216. }
  217. #if defined _ALS_OnPlayerKeyStateChange
  218.     #undef OnPlayerKeyStateChange
  219. #else
  220.     #define _ALS_OnPlayerKeyStateChange
  221. #endif
  222. #define OnPlayerKeyStateChange key_pickupfix_OnPlayerKeyState
  223. #if defined key_pickupfix_OnPlayerKeyState
  224. forward key_pickupfix_OnPlayerKeyState(playerid, newkeys, oldkeys);
  225. #endif
  226.  
  227. stock key_CreatePickup(model, type, Float:X, Float:Y, Float:Z, virtualworld = 0, usedkey = KEY_PICKUPFIX_INVALID_USED_KEY)
  228. {
  229.     #if defined KEY_PICKUPFIX_USED_KEY
  230.         usedkey = KEY_PICKUPFIX_USED_KEY;
  231.     #endif
  232.  
  233.     new
  234.         pickup = CreatePickup(model, type, X, Y, Z, virtualworld);
  235.  
  236.     key_pickupfix_pickupUsedKey[pickup] = usedkey;
  237.     return pickup;
  238. }
  239.  
  240. #if defined Streamer_IncludeFileVersion
  241.     stock key_CreateDynamicPickup(modelid, type, Float:x, Float:y, Float:z, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = STREAMER_PICKUP_SD, areaid = -1, priority = 0, usedkey = KEY_PICKUPFIX_INVALID_USED_KEY)
  242.     {
  243.         #if defined KEY_PICKUPFIX_USED_KEY
  244.             usedkey = KEY_PICKUPFIX_USED_KEY;
  245.         #endif
  246.  
  247.         new
  248.             pickup = CreateDynamicPickup(modelid, type, x, y, z, worldid, interiorid, playerid, streamdistance, areaid, priority);
  249.  
  250.         key_pickupfix_pickupUsedKey[pickup] = usedkey;
  251.         return pickup;
  252.     }
  253. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement