Y_Less

fixes2.inc

Apr 15th, 2012
581
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 88.27 KB | None | 0 0
  1. /*
  2.  * ===============
  3.  *  INTRODUCTION:
  4.  * ===============
  5.  *
  6.  * fixes.inc - Community patch for buggy SA:MP functions.
  7.  *
  8.  * ================
  9.  *  LIST OF FIXES:
  10.  * ================
  11.  *
  12.  * FIX:      GetPlayerColor
  13.  * PROBLEM:  Returns "0" if "SetPlayerColor" has never been called.
  14.  * SOLUTION: Call "SetPlayerColor" in "OnPlayerConnect".
  15.  * SEE:      "OnPlayerConnect".
  16.  * AUTHOR:   KoczkaHUN
  17.  * POST:     http://forum.sa-mp.com/showpost.php?p=1486048&postcount=45
  18.  *
  19.  * FIX:      FILTERSCRIPT
  20.  * PROBLEM:  Despite the fact that is in every new script, many people don't
  21.  *           define "FILTERSCRIPT" where appropriate.
  22.  * SOLUTION: Provide an "IS_FILTERSCRIPT" variable (note the naming to match
  23.  *           the original macro).
  24.  * AUTHOR:   Y_Less
  25.  * SEE:      "OnFilterScriptInit" and "OnGameModeInit".
  26.  *
  27.  * FIX:      SpawnPlayer
  28.  * PROBLEM:  Kills the player if they are in a vehicle.
  29.  * SOLUTION: Remove the from the vehicle.
  30.  * SEE:      "FIXES_SpawnPlayer".
  31.  * AUTHOR:   Y_Less
  32.  *
  33.  * FIX:      SetPlayerName
  34.  * PROBLEM:  Using "SetPlayerName" when the new name only differs from the old
  35.  *           name in case does not alter the name at all.
  36.  * SOLUTION: Change their name twice - once to "_FIXES TEMP NAME" and then to
  37.  *           the actual required name.
  38.  * SEE:      "OnPlayerConnect" and "FIXES_SetPlayerName".
  39.  * AUTHOR:   Y_Less
  40.  *
  41.  * FIX:      GetPlayerSkin
  42.  * PROBLEM:  Returns the new skin after "SetSpawnInfo" is called but before the
  43.  *           player actually respawns to get the new skin.
  44.  * SOLUTION: Record the skin in "OnPlayerSpawn" and always return that one.
  45.  * SEE:      "OnPlayerSpawn", "FIXES_GetPlayerSkin" and "FIXES_SetPlayerSkin".
  46.  * AUTHOR:   Y_Less
  47.  *
  48.  * FIX:      GetWeaponName
  49.  * PROBLEM:  Returns nothing for 18, 44, and 45.
  50.  * SOLUTION: Return the correct names ("Molotov Cocktail", "Thermal Goggles",
  51.  *           and "Night vision Goggles").
  52.  * SEE:      "FIXES_GetWeaponName".
  53.  * AUTHOR:   Y_Less
  54.  *
  55.  * FIX:      SetPlayerWorldBounds
  56.  * PROBLEM:  Aiming can bypass the edge.
  57.  * SOLUTION: Check for the player leaving the area and reset them to their last
  58.  *           good position if they leave the area (aiming or not).
  59.  * SEE:      "OnPlayerUpdate" and "FIXES_SetPlayerWorldBounds".
  60.  * AUTHOR:   Y_Less
  61.  *
  62.  * FIX:      TogglePlayerControllable
  63.  * PROBLEM:  Other players see you moving on the spot.
  64.  * SOLUTION: Return 0 in OnPlayerUpdate.
  65.  * SEE:      "FIXES_TogglePlayerControllable" and "OnPlayerUpdate".
  66.  * AUTHOR:   Slice
  67.  * POST:     http://forum.sa-mp.com/showpost.php?p=876854&postcount=1
  68.  *
  69.  * FIX:      HydraSniper
  70.  * PROBLEM:  Entring military aircraft with a sniper rifle messes up vies.
  71.  * SOLUTION: Set their armed weapon to fists.
  72.  * SEE:      "OnPlayerStateChange".
  73.  * AUTHOR:   funky1234
  74.  * POST:     http://forum.sa-mp.com/showpost.php?p=965644&postcount=48
  75.  *
  76.  * FIX:      IsPlayerInCheckpoint
  77.  * PROBLEM:  Function returns an undefined value if it is called before any
  78.  *           other checkpoint functions are called to initialise the value.
  79.  * SOLUTION: Call "DisablePlayerCheckpoint" when they connect.
  80.  * SEE:      "OnPlayerConnect".
  81.  * AUTHOR:   Y_Less
  82.  *
  83.  * FIX:      IsPlayerInRaceCheckpoint
  84.  * PROBLEM:  Function returns an undefined value if it is called before any
  85.  *           other race checkpoint functions are called to initialise the value.
  86.  * SOLUTION: Call "DisablePlayerRaceCheckpoint" when they connect.
  87.  * SEE:      "OnPlayerConnect".
  88.  * AUTHOR:   Y_Less
  89.  *
  90.  * FIX:      GetPlayerWeapon
  91.  * PROBLEM:  Returns the old value after using "SetPlayerArmedWeapon" when they
  92.  *           are in a vehicle.
  93.  * SOLUTION: If "SetPlayerArmedWeapon" is called in a vehicle, store the new
  94.  *           value and return that instead.
  95.  * SEE:      "OnPlayerStateChange", "FIXES_SetPlayerArmedWeapon", and
  96.  *           "FIXES_GetPlayerWeapon".
  97.  * AUTHOR:   Y_Less
  98.  *
  99.  * FIX:      PutPlayerInVehicle
  100.  * PROBLEM:  If this is used on a passenger the driver of their old vehicle
  101.  *           doesn't see them in their new vehicle.
  102.  * SOLUTION: Remove them from the vehicle first.
  103.  * SEE:      "OnPlayerStateChange" and "FIXES_PutPlayerInVehicle".
  104.  * AUTHOR:   leong124/Y_Less
  105.  * POST:     http://forum.sa-mp.com/showpost.php?p=1265965&postcount=148
  106.  *
  107.  * FIX:      KEY_AIM
  108.  * PROBLEM:  "KEY_AIM" isn't defined by default.
  109.  * SOLUTION: Define it.
  110.  * SEE:      N/A.
  111.  * AUTHOR:   Y_Less
  112.  *
  113.  * FIX:      SetPlayerCheckpoint
  114.  * PROBLEM:  If a checkpoint is already set it will use the size of that
  115.  *           checkpoint instead of the new one.
  116.  * SOLUTION: Call "DisablePlayerCheckpoint" before setting the checkpoint.
  117.  * SEE:      "FIXES_SetPlayerCheckpoint".
  118.  * AUTHOR:   KoczkaHUN
  119.  * POST:     http://forum.sa-mp.com/showpost.php?p=1482401&postcount=23
  120.  *
  121.  * FIX:      SetPlayerRaceCheckpoint
  122.  * PROBLEM:  If a checkpoint is already set it will use the size of that
  123.  *           checkpoint instead of the new one.
  124.  * SOLUTION: Call "DisablePlayerRaceCheckpoint" before setting the checkpoint.
  125.  * SEE:      "FIXES_SetPlayerRaceCheckpoint".
  126.  * AUTHOR:   KoczkaHUN
  127.  * POST:     http://forum.sa-mp.com/showpost.php?p=1482401&postcount=23
  128.  *
  129.  * FIX:      TextDrawCreate
  130.  * PROBLEM:  Crashes on a blank string.
  131.  * SOLUTION: Intercept blank strings.
  132.  * SEE:      "FIXES_TextDrawCreate".
  133.  * AUTHOR:   wups
  134.  * POST:     http://forum.sa-mp.com/showpost.php?p=1484008&postcount=30
  135.  *
  136.  * FIX:      TextDrawSetString
  137.  * PROBLEM:  Crashes on a blank string and size greater than 1024.
  138.  * SOLUTION: Intercept blank strings and truncate long strings.
  139.  * SEE:      "FIXES_TextDrawSetString".
  140.  * AUTHOR:   TomTrox
  141.  * POST:     http://forum.sa-mp.com/showpost.php?p=1487870&postcount=56
  142.  *
  143.  * FIX:      AllowInteriorWeapons
  144.  * PROBLEM:  Does nothing.
  145.  * SOLUTION: Set the player's weapon to fists in an interior.
  146.  * SEE:      "FIXES_AllowInteriorWeapons", "OnGameModeInit" and
  147.  *           "OnPlayerUpdate".
  148.  * AUTHOR:   KoczkaHUN
  149.  * POST:     http://forum.sa-mp.com/showpost.php?p=1502696&postcount=82
  150.  *
  151.  * FIX:      OnPlayerEnterVehicle
  152.  * PROBLEM:  Crashes other players when people enter an invalid seat.
  153.  * SOLUTION: Desync the people with invalid seats.
  154.  * SEE:      "OnPlayerStateChange" and "OnPlayerUpdate".
  155.  * AUTHOR:   RyDeR`/Y_Less
  156.  * POST:     http://forum.sa-mp.com/showpost.php?p=1410296&postcount=2440
  157.  *
  158.  * FIX:      AllowTeleport
  159.  * PROBLEM:  0.3dRC9 removed "AllowPlayerTeleport" and "AllowAdminTeleport" in
  160.  *           favour of "OnPlayerClickMap".  Some scripts used the old code and.
  161.  * SOLUTION: Teleport the player in "OnPlayerClickMap".
  162.  * SEE:      "OnPlayerClickMap", "FIXES_AllowPlayerTeleport", and
  163.  *           "FIXES_AllowAdminTeleport".
  164.  * AUTHOR:   Y_Less
  165.  *
  166.  * FIX:      SetPlayerSpecialAction
  167.  * PROBLEM:  Removing jetpacks from players by setting their special action to 0
  168.  *           causes the sound to stay until death.
  169.  * SOLUTION: Call "ClearAnimations" before "SetPlayerSpecialAction".
  170.  * SEE:      "FIXES_SetPlayerSpecialAction".
  171.  * AUTHOR:   MP2
  172.  * POST:     Private message from MP2.
  173.  *
  174.  * FIX:      OnDialogResponse
  175.  * PROBLEM:  Cheaters can spoof the dialogid they are using to respond to ones
  176.  *           they can't actually see.
  177.  * SOLUTION: Store the displayed dialogid and use that instead.
  178.  * SEE:      "FIXES_OnDialogResponse", "FIXES_ShowPlayerDialog".
  179.  * AUTHOR:   Y_Less
  180.  * FIXED IN: 0.3e RC6
  181.  *
  182.  * FIX:      GetPlayerDialog
  183.  * PROBLEM:  This function doesn't exist.
  184.  * SOLUTION: Add it.  DEFAULTS TO FALSE!
  185.  * SEE:      "FIXES_GetPlayerDialog".
  186.  * AUTHOR:   Y_Less
  187.  *
  188.  * FIX:      SetSpawnInfo
  189.  * PROBLEM:  Kicks the player if "SpawnPlayer" is called before "SetSpawnInfo".
  190.  * SOLUTION: Call "SetSpawnInfo" at least once.
  191.  * SEE:      "OnPlayerConnect".
  192.  * AUTHOR:   Y_Less
  193.  *
  194.  * FIX:      SetPlayerSkin
  195.  * PROBLEM:  Breaks sitting on bikes.
  196.  * SOLUTION: Put them back in the vehicle after setting their skin.
  197.  * SEE:      "FIXES_SetPlayerSkin".
  198.  * AUTHOR:   CyNiC
  199.  * POST:     http://forum.sa-mp.com/showpost.php?p=1756094&postcount=3119
  200.  *
  201.  * FIX:      HideMenuForPlayer
  202.  * PROBLEM:  Crashes when passed an invalid menu ID.
  203.  * SOLUTION: Don't hide it when passed an invalid menu.
  204.  * SEE:      "FIXES_HideMenuForPlayer".
  205.  * AUTHOR:   Y_Less
  206.  * POST:     http://forum.sa-mp.com/showpost.php?p=1787297&postcount=1
  207.  *
  208.  * FIX:      valstr
  209.  * PROBLEM:  Crashes on large numbers.
  210.  * SOLUTION: Use "format" instead.
  211.  * SEE:      "FIXES_valstr".
  212.  * AUTHOR:   Slice.
  213.  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300&postcount=142
  214.  *
  215.  * FIX:      fclose
  216.  * PROBLEM:  Crashes on an invalid handle.
  217.  * SOLUTION: Check for an invalid handle.
  218.  * SEE:      "FIXES_fclose".
  219.  * AUTHOR:   Slice.
  220.  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300&postcount=142
  221.  *
  222.  * FIX:      fwrite
  223.  * PROBLEM:  Crashes on an invalid handle.
  224.  * SOLUTION: Check for an invalid handle.
  225.  * SEE:      "FIXES_fwrite".
  226.  * AUTHOR:   Slice.
  227.  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300&postcount=142
  228.  *
  229.  * FIX:      fread
  230.  * PROBLEM:  Crashes on an invalid handle.
  231.  * SOLUTION: Check for an invalid handle.
  232.  * SEE:      "FIXES_fread".
  233.  * AUTHOR:   Slice.
  234.  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300&postcount=142
  235.  *
  236.  * FIX:      fputchar
  237.  * PROBLEM:  Crashes on an invalid handle.
  238.  * SOLUTION: Check for an invalid handle.
  239.  * SEE:      "FIXES_fputchar".
  240.  * AUTHOR:   Slice.
  241.  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300&postcount=142
  242.  *
  243.  * FIX:      fgetchar
  244.  * PROBLEM:  Crashes on an invalid handle.
  245.  * SOLUTION: Check for an invalid handle.
  246.  * SEE:      "FIXES_fgetchar".
  247.  * AUTHOR:   Slice.
  248.  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300&postcount=142
  249.  *
  250.  * FIX:      fblockwrite
  251.  * PROBLEM:  Crashes on an invalid handle.
  252.  * SOLUTION: Check for an invalid handle.
  253.  * SEE:      "FIXES_fblockwrite".
  254.  * AUTHOR:   Slice.
  255.  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300&postcount=142
  256.  *
  257.  * FIX:      fblockread
  258.  * PROBLEM:  Crashes on an invalid handle.
  259.  * SOLUTION: Check for an invalid handle.
  260.  * SEE:      "FIXES_fblockread".
  261.  * AUTHOR:   Slice.
  262.  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300&postcount=142
  263.  *
  264.  * FIX:      fseek
  265.  * PROBLEM:  Crashes on an invalid handle.
  266.  * SOLUTION: Check for an invalid handle.
  267.  * SEE:      "FIXES_fseek".
  268.  * AUTHOR:   Slice.
  269.  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300&postcount=142
  270.  *
  271.  * FIX:      flength
  272.  * PROBLEM:  Crashes on an invalid handle.
  273.  * SOLUTION: Check for an invalid handle.
  274.  * SEE:      "FIXES_flength".
  275.  * AUTHOR:   Slice.
  276.  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300&postcount=142
  277.  *
  278.  * FIX:      file_inc
  279.  * PROBLEM:  All file.inc fixes are included separately for major overhead.
  280.  * SOLUTION: Optionally group them all under one define.
  281.  * SEE:      "FIX_file_inc".
  282.  * AUTHOR:   Y_Less.
  283.  *
  284.  * FIX:      IsPlayerAttachedObjectSlotUsed
  285.  * PROBLEM:  Doesn't work in OnPlayerDisconnect.
  286.  * SOLUTION: Maintain an internal record of slots used.
  287.  * SEE:      "FIXES_SetPlayerAttachedObject",
  288.  *           "FIXES_RemovePlayerAttachedObject",
  289.  *           "FIXES_IsPAttachedObjectSlotUsed", and
  290.  *           "OnPlayerDisconnect".
  291.  *
  292.  * FIX:      SetPlayerAttachedObject
  293.  * PROBLEM:  Doesn't remove objects when the mode ends.
  294.  * SOLUTION: Remove them.
  295.  * SEE:      "FIXES_SetPlayerAttachedObject",
  296.  *           "FIXES_RemovePlayerAttachedObject", and
  297.  *           "OnPlayerDisconnect".
  298.  *
  299.  * FIX:      OnPlayerDeath
  300.  * PROBLEM:  Clients get stuck when they die with an animation applied.
  301.  * SOLUTION: Clear their animations.
  302.  * SEE:      "OnPlayerDeath" and "OnPlayerUpdate".
  303.  * AUTHOR:   h02
  304.  * POST:     http://forum.sa-mp.com/showpost.php?p=1641144&postcount=1
  305.  *
  306.  * ==============
  307.  *  STYLE RULES:
  308.  * ==============
  309.  *
  310.  * All globals should be "static stock" whenever possible (so they can only be
  311.  *     accessed from this one file).
  312.  *
  313.  * Statics must start with "FIXES_gs", and all other globals with "FIXES_g".
  314.  *
  315.  * All functions not overriding existing functions must start with "FIXES_".
  316.  *
  317.  * Macros must be upper case, use underscores, and start "FIXES_":
  318.  *     "FIXES_LIKE_THIS".
  319.  *
  320.  * Functions should be upper camel case (as the original functions are)
  321.  *     "FIXES_LikeThis".
  322.  *
  323.  * Globals (after the prefix) should be upper camel case, and locals lower camel
  324.  *     case "likeThis".
  325.  *
  326.  * ALS should be used to hook functions and callbacks.
  327.  *
  328.  * The ALS prefix for chaining is also "FIXES_"
  329.  *
  330.  * Enums start with "E_" or "e_" depending on type, then follow rules for
  331.  *     macros.
  332.  *
  333.  * Use "FIXES_gsCallbackHooks" and "E_FIXES_CALLBACK_HOOKS" for ALS chaining.
  334.  *
  335.  * NO libraries should be included - not even the default SA:MP ones.  Let the
  336.  *     user do it.
  337.  *
  338.  * Due to the above rule, you cannot assume any third party libraries AT ALL, so
  339.  *     do not use them.
  340.  *
  341.  * Certain terms may be shortened when dealing with long callback names to avoid
  342.  *     compile truncation warnings (max symbol length is 31).  Current list:
  343.  *    
  344.  *     "Checkpoint" -> "CP"
  345.  *     "Update"     -> "Up"
  346.  *     "TextDraw"   -> "TD"
  347.  *     "Object"     -> "Obj"
  348.  *     "Player"     -> "P"
  349.  *
  350.  * Document all fixes at the top of the file, and highlight code.
  351.  *
  352.  * 4 space TABS - do not edit this file in PAWNO unless you know how to correct
  353.  *     the indentation.
  354.  *
  355.  * All rules have exceptions, but they must be justifiable.  For example
  356.  *     "IS_FILTERSCRIPT" is a global variable, but is not called
  357.  *     "FIXES_gIsFilterscript" to better match the "FILTERSCRIPT" macro it
  358.  *     replaces.  Now a macro for "_FIXES_gIsFilterscript".
  359.  *
  360.  * Variables which need to be fully global (i.e. not "static"), but should not
  361.  *     actually be used by other people (e.g. appear inside a macro) should be
  362.  *     prefixed with "_FIXES" instead of "FIXES" to indicate their private use.
  363.  *
  364.  * No comments beyond the end of column 80 (where the line in "PAWNO" is).
  365.  *
  366.  * When redefining a native, add a "BAD_" external name declaration with the
  367.  *     "_ALS_" definition so that others may use the original native if they so
  368.  *     desire (with the caveat that it may break all fixes).  Note the "BAD_"
  369.  *     name is meant to indicate the possibility of breaking the fix, not a
  370.  *     comment on the original native function.
  371.  *
  372.  * If a bug is fixed in some version of the server it can be conditionally
  373.  *     included here.  This is done by checking for the existance of a native
  374.  *     function introduced in the same server version.  For example
  375.  *     "TogglePlayerControllable" was fixed in 0.3eRC6, the same time as the
  376.  *     "SetObjectMaterial" native was introduced, thus the inclusion becomes:
  377.  *    
  378.  *     #if !defined FIX_TogglePlayerControllable
  379.  *         #define FIX_TogglePlayerControllable (!defined SetObjectMaterial)
  380.  *     #endif
  381.  *    
  382.  *     This only includes this fix if that native doesn't exist.
  383.  *
  384.  * Documentation explanation:
  385.  *
  386.  *     FIX:      <Short name>
  387.  *     PROBLEM:  <Description of problem>
  388.  *     SOLUTION: <Description of solution>
  389.  *     SEE:      <List of relevant functions>
  390.  *     AUTHOR:   <Person who wrote the fix>
  391.  *     POST:     <Link to the original post where applicable>
  392.  *     FIXED IN: <Server version of official fix where applicable>
  393.  */
  394.  
  395. // We can add server version compiler code here to only compile fixes that apply
  396. // to the version of the includes for which the user is compiling.
  397. #if !defined FIX_GetPlayerColor
  398.     #if defined FIX_GetPlayerColour
  399.         #define FIX_GetPlayerColor       (FIX_GetPlayerColour)
  400.     #else
  401.         #define FIX_GetPlayerColor       (1)
  402.     #endif
  403. #endif
  404.  
  405. #if !defined FIX_FILTERSCRIPT
  406.     #define FIX_FILTERSCRIPT             (1)
  407. #endif
  408.  
  409. #if !defined FIX_SpawnPlayer
  410.     #define FIX_SpawnPlayer              (1)
  411. #endif
  412.  
  413. #if !defined FIX_SetPlayerName
  414.     #define FIX_SetPlayerName            (1)
  415. #endif
  416.  
  417. #if !defined FIX_GetPlayerSkin
  418.     #define FIX_GetPlayerSkin            (1)
  419. #endif
  420.  
  421. #if !defined FIX_GetWeaponName
  422.     #define FIX_GetWeaponName            (1)
  423. #endif
  424.  
  425. #if !defined FIX_SetPlayerWorldBounds
  426.     #define FIX_SetPlayerWorldBounds     (1)
  427. #endif
  428.  
  429. #if !defined FIX_TogglePlayerControllable
  430.     #define FIX_TogglePlayerControllable (!defined SetObjectMaterial)
  431. #endif
  432.  
  433. #if !defined FIX_HydraSniper
  434.     #define FIX_HydraSniper              (1)
  435. #endif
  436.  
  437. #if !defined FIX_IsPlayerInCheckpoint
  438.     #define FIX_IsPlayerInCheckpoint     (1)
  439. #endif
  440.  
  441. #if !defined FIX_IsPlayerInRaceCheckpoint
  442.     #define FIX_IsPlayerInRaceCheckpoint (1)
  443. #endif
  444.  
  445. #if !defined FIX_GetPlayerWeapon
  446.     #define FIX_GetPlayerWeapon          (1)
  447. #endif
  448.  
  449. #if !defined FIX_PutPlayerInVehicle
  450.     #define FIX_PutPlayerInVehicle       (1)
  451. #endif
  452.  
  453. #if !defined FIX_KEY_AIM
  454.     #define FIX_KEY_AIM                  (!defined KEY_AIM)
  455. #endif
  456.  
  457. #if !defined FIX_SetPlayerCheckpoint
  458.     #define FIX_SetPlayerCheckpoint      (1)
  459. #endif
  460.  
  461. #if !defined FIX_SetPlayerRaceCheckpoint
  462.     #define FIX_SetPlayerRaceCheckpoint  (1)
  463. #endif
  464.  
  465. #if !defined FIX_TextDrawCreate
  466.     #define FIX_TextDrawCreate           (1)
  467. #endif
  468.  
  469. #if !defined FIX_TextDrawSetString
  470.     #define FIX_TextDrawSetString        (1)
  471. #endif
  472.  
  473. #if !defined FIX_AllowInteriorWeapons
  474.     #define FIX_AllowInteriorWeapons     (1)
  475. #endif
  476.  
  477. #if !defined FIX_OnPlayerEnterVehicle
  478.     #define FIX_OnPlayerEnterVehicle     (!defined OnPlayerClickMap)
  479. #endif
  480.  
  481. #if !defined FIX_AllowTeleport
  482.     #define FIX_AllowTeleport            (defined OnPlayerClickMap)
  483. #endif
  484.  
  485. #if !defined FIX_SetPlayerSpecialAction
  486.     #define FIX_SetPlayerSpecialAction   (1)
  487. #endif
  488.  
  489. #if !defined FIX_OnDialogResponse
  490.     #define FIX_OnDialogResponse         (1)
  491. #endif
  492.  
  493. #if !defined FIX_GetPlayerDialog
  494.     #define FIX_GetPlayerDialog          (0)
  495. #endif
  496.  
  497. #if !defined FIX_SetSpawnInfo
  498.     #define FIX_SetSpawnInfo             (!defined GetPlayerVersion)
  499. #endif
  500.  
  501. #if !defined FIX_SetPlayerSkin
  502.     #define FIX_SetPlayerSkin            (1)
  503. #endif
  504.  
  505. #if !defined FIX_HideMenuForPlayer
  506.     #define FIX_HideMenuForPlayer        (1)
  507. #endif
  508.  
  509. #if !defined FIX_valstr
  510.     #define FIX_valstr                   (1)
  511. #endif
  512.  
  513. #if !defined FIX_file_inc
  514.     #define FIX_file_inc                 (1)
  515. #endif
  516.  
  517. #if !defined FIX_fclose
  518.     #define FIX_fclose                   (FIX_file_inc)
  519. #endif
  520.  
  521. #if !defined FIX_fwrite
  522.     #define FIX_fwrite                   (FIX_file_inc)
  523. #endif
  524.  
  525. #if !defined FIX_fread
  526.     #define FIX_fread                    (FIX_file_inc)
  527. #endif
  528.  
  529. #if !defined FIX_fputchar
  530.     #define FIX_fputchar                 (FIX_file_inc)
  531. #endif
  532.  
  533. #if !defined FIX_fgetchar
  534.     #define FIX_fgetchar                 (FIX_file_inc)
  535. #endif
  536.  
  537. #if !defined FIX_fblockwrite
  538.     #define FIX_fblockwrite              (FIX_file_inc)
  539. #endif
  540.  
  541. #if !defined FIX_fblockread
  542.     #define FIX_fblockread               (FIX_file_inc)
  543. #endif
  544.  
  545. #if !defined FIX_fseek
  546.     #define FIX_fseek                    (FIX_file_inc)
  547. #endif
  548.  
  549. #if !defined FIX_flength
  550.     #define FIX_flength                  (FIX_file_inc)
  551. #endif
  552.  
  553. #if !defined FIX_IsPlayerAttachedObjSlotUsed
  554.     #define FIX_IsPlayerAttachedObjSlotUsed (1)
  555. #endif
  556.  
  557. #if !defined FIX_SetPlayerAttachedObject
  558.     #define FIX_SetPlayerAttachedObject  (1)
  559. #endif
  560.  
  561. #if !defined FIX_OnPlayerDeath
  562.     #define FIX_OnPlayerDeath            (1)
  563. #endif
  564.  
  565. /*
  566.  * E_FIXES_CALLBACK_HOOKS_1
  567.  * E_FIXES_CALLBACK_HOOKS_2
  568.  *
  569.  * Two enums to define the bits used to efficiently store wether of not the next
  570.  * callback in the ALS chain exists.  Breaks naming convention for elements from
  571.  * "E_FIXES_ON_GAME_MODE_INIT" to "E_FIXES_OnGameModeInit" for compatibility
  572.  * with existing names.  Note that "Checkpoint" and "Update" have been shortened
  573.  * to "CP" and "Up" in certain symbols to stay below the 31 character limit.
  574.  */
  575. enum E_FIXES_CALLBACK_HOOKS_1 (<<= 1)
  576. {
  577.     E_FIXES_OnGameModeInit = 1,
  578.     E_FIXES_OnGameModeExit,
  579.     E_FIXES_OnFilterScriptInit,
  580.     E_FIXES_OnFilterScriptExit,
  581.     E_FIXES_OnPlayerConnect,
  582.     E_FIXES_OnPlayerDisconnect,
  583.     E_FIXES_OnPlayerSpawn,
  584.     E_FIXES_OnPlayerDeath,
  585.     E_FIXES_OnVehicleSpawn,
  586.     E_FIXES_OnVehicleDeath,
  587.     E_FIXES_OnPlayerText,
  588.     E_FIXES_OnPlayerCommandText,
  589.     E_FIXES_OnPlayerRequestClass,
  590.     E_FIXES_OnPlayerEnterVehicle,
  591.     E_FIXES_OnPlayerExitVehicle,
  592.     E_FIXES_OnPlayerStateChange,
  593.     E_FIXES_OnPlayerEnterCheckpoint,
  594.     E_FIXES_OnPlayerLeaveCheckpoint,
  595.     E_FIXES_OnPlayerEnterRaceCP,
  596.     E_FIXES_OnPlayerLeaveRaceCP,
  597.     E_FIXES_OnRconCommand,
  598.     E_FIXES_OnPlayerRequestSpawn,
  599.     E_FIXES_OnObjectMoved,
  600.     E_FIXES_OnPlayerObjectMoved,
  601.     E_FIXES_OnPlayerPickUpPickup,
  602.     E_FIXES_OnVehicleMod,
  603.     E_FIXES_OnEnterExitModShop,
  604.     E_FIXES_OnVehiclePaintjob,
  605.     E_FIXES_OnVehicleRespray,
  606.     E_FIXES_OnVehicleDamageStatusUp,
  607.     E_FIXES_OnPlayerSelectedMenuRow,
  608.     E_FIXES_OnPlayerExitedMenu
  609. }
  610.  
  611. enum E_FIXES_CALLBACK_HOOKS_2 (<<= 1)
  612. {
  613.     E_FIXES_OnPlayerInteriorChange = 1,
  614.     E_FIXES_OnPlayerKeyStateChange,
  615.     E_FIXES_OnRconLoginAttempt,
  616.     E_FIXES_OnPlayerUpdate,
  617.     E_FIXES_OnPlayerStreamIn,
  618.     E_FIXES_OnPlayerStreamOut,
  619.     E_FIXES_OnVehicleStreamIn,
  620.     E_FIXES_OnVehicleStreamOut,
  621.     E_FIXES_OnDialogResponse,
  622.     E_FIXES_OnPlayerClickPlayer,
  623.     E_FIXES_OnPlayerClickMap,
  624.     E_FIXES_OnPlayerClickTextDraw,
  625.     E_FIXES_OnPlayerClickPlayerTD,
  626.     E_FIXES_OnPlayerEditObject,
  627.     E_FIXES_OnPlayerEditAttachedObj,
  628.     E_FIXES_OnPlayerSelectObject,
  629.     E_FIXES_OnPlayerTakeDamage,
  630.     E_FIXES_OnPlayerGiveDamage
  631. }
  632.  
  633. /*
  634.  * E_FIXES_WORLDBOUND_DATA
  635.  *
  636.  * Store data for each player on their worldbound data.
  637.  */
  638. enum E_FIXES_WORLDBOUND_DATA
  639. {
  640.     // "Previous".
  641.     Float:E_FIXES_WORLDBOUND_DATA_PX,
  642.     Float:E_FIXES_WORLDBOUND_DATA_PY,
  643.     Float:E_FIXES_WORLDBOUND_DATA_PZ,
  644.     // "Lower".
  645.     Float:E_FIXES_WORLDBOUND_DATA_LX,
  646.     Float:E_FIXES_WORLDBOUND_DATA_LY,
  647.     // "Upper".
  648.     Float:E_FIXES_WORLDBOUND_DATA_UX,
  649.     Float:E_FIXES_WORLDBOUND_DATA_UY
  650. }
  651.  
  652. /*
  653.  * e_FIXES_BOOLS
  654.  *
  655.  * Collection of boolean values for players, designed to collect multiple checks
  656.  * in to one variable to reduce memory consumption.
  657.  */
  658. enum e_FIXES_BOOLS (<<= 1)
  659. {
  660.     // Handy definition for nothing set.
  661.     e_FIXES_BOOLS_NONE = 0,
  662.     // Does this player have worldbounds enabled?
  663.     e_FIXES_BOOLS_WORLDBOUNDS = 1,
  664.     e_FIXES_BOOLS_UNCONTROLLABLE,
  665.     e_FIXES_BOOLS_PUT_IN_VEHICLE,
  666.     e_FIXES_BOOLS_BLOCK,
  667.     e_FIXES_BOOLS_TELEPORT,
  668.     e_FIXES_BOOLS_CONNECTED
  669. }
  670.  
  671. /*
  672.  * e_FIXES_SETTINGS
  673.  *
  674.  * Collection of boolean values for the script as a whole.  Stores a variety of
  675.  * settings that are true/false.
  676.  */
  677. enum e_FIXES_SETTINGS (<<= 1)
  678. {
  679.     // Handy definition for nothing set.
  680.     e_FIXES_SETTINGS_NONE = 0,
  681.     e_FIXES_SETTINGS_INTERIOR = 1,
  682.     e_FIXES_SETTINGS_ADMIN_TELEPORT,
  683.     e_FIXES_SETTINGS_IN_CHARGE,
  684.     e_FIXES_SETTINGS_DROP_ALL_DATA
  685. }
  686.  
  687. /*
  688.  * _FIXES_CEILDIV
  689.  *
  690.  * Do a ceiling division of the first number by the second number.
  691.  */
  692. #define _FIXES_CEILDIV(%0,%1) (((%0) + (%1) - 1) / (%1))
  693.  
  694. /*
  695.  * _FIXES_INFINITY
  696.  *
  697.  * Do a ceiling division of the first number by the second number.
  698.  */
  699. #define _FIXES_INFINITY (Float:0x7F800000)
  700.  
  701. /*
  702.  * _FIXES_ATTACHMENTS
  703.  *
  704.  * The number of players whose attachment data (10-bits) can be stored in one
  705.  * cell.
  706.  */
  707. #define _FIXES_ATTACHMENTS (cellbits / MAX_PLAYER_ATTACHED_OBJECTS)
  708.  
  709. // These varaibles are NOT pre-processor dependent as they are stock.  It's just
  710. // simpler than trying to figure out when or if a semi-colon is needed.
  711. #if !FIX_FILTERSCRIPT
  712. static
  713. #endif
  714. stock
  715.     /*
  716.      * bool:_FIXES_gIsFilterscript
  717.      *
  718.      * Runtime equivalent of "FILTERSCRIPT" for when it is not set by the user.
  719.      */
  720.     bool:_FIXES_gIsFilterscript;
  721.  
  722. static stock
  723.     /*
  724.      * E_FIXES_CALLBACK_HOOKS_1:FIXES_gsCallbackHooks1
  725.      * E_FIXES_CALLBACK_HOOKS_1:FIXES_gsCallbackHooks2
  726.      *
  727.      * Bit arrays of callbacks.  You can only have 32 callbacks per variable,
  728.      * and there are more than that many, so we need more than one variable.
  729.      * Add new callback detection to "FIXES_ScriptInit" - only actually used
  730.      * callbacks are currently hooked.
  731.      */
  732.     E_FIXES_CALLBACK_HOOKS_1:FIXES_gsCallbackHooks1,
  733.     E_FIXES_CALLBACK_HOOKS_2:FIXES_gsCallbackHooks2,
  734.     /*
  735.      * FIXES_gsPlayerSkin[MAX_PLAYERS]
  736.      *
  737.      * The skin the player is currently using.
  738.      */
  739.     //FIXES_gsPlayerSkin[MAX_PLAYERS],
  740.     /*
  741.      * e_FIXES_BOOLEAN_DATA:FIXES_gsPlayerBools[MAX_PLAYERS]
  742.      *
  743.      * Collection of boolean values for players.
  744.      */
  745.     e_FIXES_BOOLS:FIXES_gsPlayerBools[MAX_PLAYERS],
  746.     /*
  747.      * FIXES_gsWorldbounds[MAX_PLAYERS][E_FIXES_WORLDBOUND_DATA]
  748.      *
  749.      * All data for players on where their worldbounds are and where they last
  750.      * were before they went through the bounds by crouching.
  751.      */
  752.     FIXES_gsWorldbounds[MAX_PLAYERS][E_FIXES_WORLDBOUND_DATA],
  753.     /*
  754.      * FIXES_gsPlayerWeapon[MAX_PLAYERS]
  755.      *
  756.      * Stores the weapon set by "SetPlayerArmedWeapon" when in a vehicle.
  757.      */
  758.     //FIXES_gsPlayerWeapon[MAX_PLAYERS],
  759.     /*
  760.      * FIXES_gsVehicleSeatData[MAX_PLAYERS]
  761.      *
  762.      * What vehicle the player is due to go in.
  763.      */
  764.     FIXES_gsVehicleSeatData[MAX_PLAYERS],
  765.     /*
  766.      * FIXES_gsVehicleLocked[(MAX_PLAYERS * MAX_VEHICLES + cellbits - 1) / cellbits]
  767.      *
  768.      * Is this vehicle locked for a player.  This is a compressed 2D binary
  769.      * array, made by concatenating many bits together (saves 1kb-3kb)!  Is
  770.      * there a reason this array exists?
  771.      */
  772.     //FIXES_gsVehicleLocked[_FIXES_CEILDIV(MAX_PLAYERS * MAX_VEHICLES, cellbits)],
  773.     /*
  774.      * FIXES_gsDialogID[MAX_PLAYERS]
  775.      *
  776.      * Stores the true ID of the dialog the player is looking at to prevent
  777.      * spoofing.
  778.      */
  779.     //FIXES_gsDialogID[MAX_PLAYERS] = {-1, ...},
  780.     /*
  781.      * e_FIXES_SETTINGS:FIXES_gsSettings
  782.      *
  783.      * A collection of 1-bit options, compressed together to save space.
  784.      */
  785.     e_FIXES_SETTINGS:FIXES_gsSettings,
  786.     /*
  787.      * FIXES_gsObjectSlots[_FIXES_CEILDIV(MAX_PLAYERS, _FIXES_ATTACHMENTS)]
  788.      *
  789.      * A record of which attached object slots a player has used.
  790.      */
  791.     FIXES_gsObjectSlots[_FIXES_CEILDIV(MAX_PLAYERS, _FIXES_ATTACHMENTS)],
  792.     /*
  793.      * FIXES_gsLastAnimation[MAX_PLAYERS]
  794.      *
  795.      * The last animation a player used.
  796.      */
  797.     FIXES_gsLastAnimation[MAX_PLAYERS];
  798.  
  799. static stock const
  800.     /*
  801.      * FIXES_gscPlayerColours[100]
  802.      *
  803.      * There are only 100 colours used by default, with SA:MP looping through
  804.      * them repeatedly.
  805.      */
  806.     FIXES_gscPlayerColours[100] =
  807.         {
  808.             0xFF8C13FF, 0xC715FFFF, 0x20B2AAFF, 0xDC143CFF, 0x6495EDFF,
  809.             0xF0E68CFF, 0x778899FF, 0xFF1493FF, 0xF4A460FF, 0xEE82EEFF,
  810.             0xFFD720FF, 0x8B4513FF, 0x4949A0FF, 0x148B8BFF, 0x14FF7FFF,
  811.             0x556B2FFF, 0x0FD9FAFF, 0x10DC29FF, 0x534081FF, 0x0495CDFF,
  812.             0xEF6CE8FF, 0xBD34DAFF, 0x247C1BFF, 0x0C8E5DFF, 0x635B03FF,
  813.             0xCB7ED3FF, 0x65ADEBFF, 0x5C1ACCFF, 0xF2F853FF, 0x11F891FF,
  814.             0x7B39AAFF, 0x53EB10FF, 0x54137DFF, 0x275222FF, 0xF09F5BFF,
  815.             0x3D0A4FFF, 0x22F767FF, 0xD63034FF, 0x9A6980FF, 0xDFB935FF,
  816.             0x3793FAFF, 0x90239DFF, 0xE9AB2FFF, 0xAF2FF3FF, 0x057F94FF,
  817.             0xB98519FF, 0x388EEAFF, 0x028151FF, 0xA55043FF, 0x0DE018FF,
  818.             0x93AB1CFF, 0x95BAF0FF, 0x369976FF, 0x18F71FFF, 0x4B8987FF,
  819.             0x491B9EFF, 0x829DC7FF, 0xBCE635FF, 0xCEA6DFFF, 0x20D4ADFF,
  820.             0x2D74FDFF, 0x3C1C0DFF, 0x12D6D4FF, 0x48C000FF, 0x2A51E2FF,
  821.             0xE3AC12FF, 0xFC42A8FF, 0x2FC827FF, 0x1A30BFFF, 0xB740C2FF,
  822.             0x42ACF5FF, 0x2FD9DEFF, 0xFAFB71FF, 0x05D1CDFF, 0xC471BDFF,
  823.             0x94436EFF, 0xC1F7ECFF, 0xCE79EEFF, 0xBD1EF2FF, 0x93B7E4FF,
  824.             0x3214AAFF, 0x184D3BFF, 0xAE4B99FF, 0x7E49D7FF, 0x4C436EFF,
  825.             0xFA24CCFF, 0xCE76BEFF, 0xA04E0AFF, 0x9F945CFF, 0xDCDE3DFF,
  826.             0x10C9C5FF, 0x70524DFF, 0x0BE472FF, 0x8A2CD7FF, 0x6152C2FF,
  827.             0xCF72A9FF, 0xE59338FF, 0xEEDC2DFF, 0xD8C762FF, 0xD8C762FF
  828.         },
  829.     /*
  830.      * FIXES_gscMaxPassengers[]
  831.      *
  832.      * This is a compressed (4-bit) list of the maximum number of passengers in
  833.      * any vehicle, confirmed by a number of sources. "F" (15) means invalid
  834.      * vehicle.
  835.      */
  836.     FIXES_gscMaxPassengers[] =
  837.         {
  838.             0x10331113, 0x11311131, 0x11331313, 0x80133301, 0x1381F110, 0x10311103, 0x10001F10, 0x11113311, 0x13113311,
  839.             0x31101100, 0x30001301, 0x11031311, 0x11111331, 0x10013111, 0x01131100, 0x11111110, 0x11100031, 0x11130221,
  840.             0x33113311, 0x11111101, 0x33101133, 0x101001F0, 0x03133111, 0xFF11113F, 0x13330111, 0xFF131111, 0x0000FF3F
  841.         },
  842.     /*
  843.      * FIXES_gscOrderProperty[]
  844.      *
  845.      * The property to check for script ordering.
  846.      */
  847.     FIXES_gscOrderProperty[] = "FIXES_gscOrderProperty",
  848.     /*
  849.      * FIXES_gscNoGMProperty[]
  850.      *
  851.      * Call "_FIXES_DetermineOrder" in the GM or not?
  852.      */
  853.     FIXES_gscNoGMProperty[] = "FIXES_gscNoGMProperty",
  854.     /*
  855.      * FIXES_gscReturnProperty[]
  856.      *
  857.      * The property for accurate returns.
  858.      */
  859.     FIXES_gscReturnProperty[] = "FIXES_gscReturnProperty";
  860.  
  861. static stock
  862.     /*
  863.      * FIXES_pvarNotNewPlayer[]
  864.      *
  865.      * This variable records wether or not this player is brand new to the
  866.      * server, and not just having "OnPlayerConnect" called due to a script
  867.      * load.  There are certain functions that need applying only the very first
  868.      * time they connect, then this gets set.
  869.      */
  870.     FIXES_pvarNotNewPlayer[] = "FIXES_pvarNotNewPlayer",
  871.     /*
  872.      * FIXES_pvarPlayerWeapon[]
  873.      *
  874.      * Name of the pvar in which to store the player's current weapon.
  875.      */
  876.     FIXES_pvarPlayerWeapon[] = "FIXES_pvarPlayerWeapon",
  877.     /*
  878.      * FIXES_pvarPlayerSkin[]
  879.      *
  880.      * Name of the pvar in which to store the player's current skin.
  881.      */
  882.     FIXES_pvarPlayerSkin[] = "FIXES_pvarPlayerSkin",
  883.     /*
  884.      * FIXES_pvarPlayerDialog[]
  885.      *
  886.      * Name of the pvar in which to store the player's current dialogid.
  887.      */
  888.     FIXES_pvarPlayerDialog[] = "FIXES_pvarPlayerDialog";
  889.  
  890. /*
  891.  * _FIXES_KEY_AIM
  892.  * KEY_AIM
  893.  *
  894.  * Because the default SA:MP includes missed this one.
  895.  */
  896. #define _FIXES_KEY_AIM                   (128)
  897. #if FIX_KEY_AIM
  898.     #define KEY_AIM                      _FIXES_KEY_AIM
  899. #endif
  900.  
  901. /*
  902.  * IS_FILTERSCRIPT
  903.  *
  904.  * "FILTERSCRIPT" can't always be relied on to be set.  This is not a pre-
  905.  * processor macro, but may be better than nothing (also used internally).
  906.  */
  907. #if FIX_FILTERSCRIPT
  908.     #define IS_FILTERSCRIPT _FIXES_gIsFilterscript
  909. #endif
  910.  
  911. /*
  912.  * FIXES_DETECT_CALLBACK_1(callback)
  913.  * FIXES_DETECT_CALLBACK_2(callback)
  914.  *
  915.  * Macro to make detecting callbacks simpler.  The number relates to which
  916.  * variable the callback is found it.  This explicity detects the "On" part of
  917.  * the callback because some scripts redefine the callback names and we need to
  918.  * always correctly detect them, and always have "FIXES_On"#%0 work without
  919.  * using the redefined name (e.g. if a prior script uses ALS).
  920.  */
  921. #define FIXES_DETECT_CALLBACK_1(%0On%1) (FIXES_gsCallbackHooks1|=E_FIXES_On%1*E_FIXES_CALLBACK_HOOKS_1:(funcidx("FIXES_On"#%1)!=-1))
  922. #define FIXES_DETECT_CALLBACK_2(%0On%1) (FIXES_gsCallbackHooks2|=E_FIXES_On%1*E_FIXES_CALLBACK_HOOKS_2:(funcidx("FIXES_On"#%1)!=-1))
  923.  
  924. /*
  925.  * FIXES_CALL_CALLBACK_1(callback, default, format[], ...)
  926.  * FIXES_CALL_CALLBACK_2(callback, default, format[], ...)
  927.  *
  928.  * Macro to make calling callbacks simpler.  This takes the name of a callback
  929.  * to chain - if it exists then it is called, if it doesn't exist the default
  930.  * is returned.  Note that this DOES NOT end the current function, use in
  931.  * conjunction with "return", or store the value to call the next element in the
  932.  * chain before some bits of processing.
  933.  */
  934. #define FIXES_CALL_CALLBACK_1(%0On%1,%2,%3) ((FIXES_gsCallbackHooks1&E_FIXES_On%1)?(CallLocalFunction("FIXES_On"#%1,%3)):(%2))
  935. #define FIXES_CALL_CALLBACK_2(%0On%1,%2,%3) ((FIXES_gsCallbackHooks2&E_FIXES_On%1)?(CallLocalFunction("FIXES_On"#%1,%3)):(%2))
  936.  
  937. forward _FIXES_DetermineOrder();
  938.  
  939. /*
  940.  * FIXES_OnScriptInit()
  941.  *
  942.  * Do all initialisation code in here.  Is called once when the script starts,
  943.  * regardless of HOW the script is started (FilterScript or GameMode).  Add
  944.  * detection of new callbacks here.
  945.  *
  946.  * FIXES:
  947.  */
  948. static FIXES_OnScriptInit()
  949. {
  950.     deleteproperty(5, FIXES_gscOrderProperty);
  951.     // Called in the Game Mode first (thus needs correcting).
  952.     setproperty(5, FIXES_gscNoGMProperty, 1);
  953.     CallRemoteFunction("_FIXES_DetermineOrder", "");
  954.     deleteproperty(5, FIXES_gscNoGMProperty);
  955.     CallRemoteFunction("_FIXES_DetermineOrder", "");
  956.     // Called in the Game Mode first.
  957.     FIXES_DETECT_CALLBACK_1(OnGameModeInit);
  958.     FIXES_DETECT_CALLBACK_1(OnGameModeExit);
  959.     FIXES_DETECT_CALLBACK_1(OnFilterScriptInit);
  960.     #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_SetPlayerName || FIX_GetPlayerColor || FIX_GetPlayerSkin || FIX_IsPlayerInCheckpoint || FIX_IsPlayerInRaceCheckpoint || FIX_GetPlayerWeapon || FIX_PutPlayerInVehicle || FIX_OnPlayerEnterVehicle || FIX_AllowTeleport || FIX_OnDialogResponse || FIX_SetSpawnInfo
  961.         // Not called after "loadfs" or "reloadfs" (useful for us).
  962.         FIXES_DETECT_CALLBACK_1(OnPlayerConnect);
  963.     #endif
  964.     #if FIX_SetPlayerAttachedObject || FIX_IsPlayerAttachedObjSlotUsed
  965.         // Called in the Game Mode first when the mode changes, in Filter
  966.         // Scripts when the player leaves.
  967.         FIXES_DETECT_CALLBACK_1(OnPlayerDisconnect);
  968.     #endif
  969.     #if FIX_GetPlayerSkin || FIX_TogglePlayerControllable
  970.         FIXES_DETECT_CALLBACK_1(OnPlayerSpawn);
  971.     #endif
  972.     #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_AllowInteriorWeapons || FIX_OnPlayerEnterVehicle || FIX_OnPlayerDeath
  973.         FIXES_DETECT_CALLBACK_2(OnPlayerUpdate);
  974.     #endif
  975.     #if FIX_HydraSniper || FIX_GetPlayerWeapon || FIX_PutPlayerInVehicle || FIX_OnPlayerEnterVehicle
  976.         FIXES_DETECT_CALLBACK_1(OnPlayerStateChange);
  977.     #endif
  978.     #if FIX_AllowTeleport && !defined FILTERSCRIPT
  979.         // Called in the Game Mode first.
  980.         FIXES_DETECT_CALLBACK_2(OnPlayerClickMap);
  981.     #endif
  982.     #if FIX_OnDialogResponse
  983.         FIXES_DETECT_CALLBACK_2(OnDialogResponse);
  984.     #endif
  985.     #if FIX_OnPlayerDeath
  986.         FIXES_DETECT_CALLBACK_1(OnPlayerDeath);
  987.     #endif
  988.     #if FIX_AllowInteriorWeapons && FIX_GetPlayerWeapon
  989.         FIXES_DETECT_CALLBACK_2(OnPlayerInteriorChange);
  990.     #endif
  991. }
  992.  
  993. /*
  994.  * OnFilterScriptInit()
  995.  *
  996.  * Set "IS_FILTERSCRIPT" to true as this callback is ONLY called if this script
  997.  * is actually a FilterScript.  Then call "FIXES_OnScriptInit".
  998.  *
  999.  * FIXES:
  1000.  *     IS_FILTERSCRIPT
  1001.  */
  1002. public OnFilterScriptInit()
  1003. {
  1004.     _FIXES_gIsFilterscript = true;
  1005.     FIXES_OnScriptInit();
  1006.     FIXES_gsSettings &= e_FIXES_SETTINGS_DROP_ALL_DATA;
  1007.     return FIXES_CALL_CALLBACK_1(OnFilterScriptInit, 1, "");
  1008. }
  1009.  
  1010. #if defined _ALS_OnFilterScriptInit
  1011.     #undef OnFilterScriptInit
  1012. #else
  1013.     #define _ALS_OnFilterScriptInit
  1014. #endif
  1015. #define OnFilterScriptInit FIXES_OnFilterScriptInit
  1016.  
  1017. forward OnFilterScriptInit();
  1018.  
  1019. /*
  1020.  * OnGameModeInit()
  1021.  *
  1022.  * Call "FIXES_OnScriptInit" if this is not a FilterScript.
  1023.  *
  1024.  * FIXES:
  1025.  *     IS_FILTERSCRIPT
  1026.  *     AllowInteriorWeapons
  1027.  *     AllowTeleport
  1028.  */
  1029. public OnGameModeInit()
  1030. {
  1031.     if (!_FIXES_gIsFilterscript)
  1032.     {
  1033.         FIXES_OnScriptInit();
  1034.     }
  1035.     // =============================
  1036.     //  START: AllowInteriorWeapons
  1037.     // =============================
  1038.     #if FIX_AllowInteriorWeapons
  1039.         FIXES_gsSettings &= ~e_FIXES_SETTINGS_INTERIOR;
  1040.     #endif
  1041.     // ===========================
  1042.     //  END: AllowInteriorWeapons
  1043.     // ===========================
  1044.    
  1045.     // ======================
  1046.     //  START: AllowTeleport
  1047.     // ======================
  1048.     #if FIX_AllowTeleport && !defined FILTERSCRIPT
  1049.         FIXES_gsSettings &= ~e_FIXES_SETTINGS_ADMIN_TELEPORT;
  1050.     #endif
  1051.     // ======================
  1052.     //  END:   AllowTeleport
  1053.     // ======================
  1054.    
  1055.     FIXES_gsSettings &= ~e_FIXES_SETTINGS_DROP_ALL_DATA;
  1056.    
  1057.     return FIXES_CALL_CALLBACK_1(OnGameModeInit, 1, "");
  1058. }
  1059.  
  1060. #if defined _ALS_OnGameModeInit
  1061.     #undef OnGameModeInit
  1062. #else
  1063.     #define _ALS_OnGameModeInit
  1064. #endif
  1065. #define OnGameModeInit FIXES_OnGameModeInit
  1066.  
  1067. forward OnGameModeInit();
  1068.  
  1069. /*
  1070.  * OnGameModeExit()
  1071.  *
  1072.  * Fast way of detecting not to retain any data.
  1073.  */
  1074. public OnGameModeExit()
  1075. {
  1076.     FIXES_gsSettings |= e_FIXES_SETTINGS_DROP_ALL_DATA;
  1077.    
  1078.     return FIXES_CALL_CALLBACK_1(OnGameModeExit, 1, "");
  1079. }
  1080.  
  1081. #if defined _ALS_OnGameModeExit
  1082.     #undef OnGameModeExit
  1083. #else
  1084.     #define _ALS_OnGameModeExit
  1085. #endif
  1086. #define OnGameModeExit FIXES_OnGameModeExit
  1087.  
  1088. forward OnGameModeExit();
  1089.  
  1090. /*
  1091.  * OnPlayerConnect(playerid)
  1092.  *
  1093.  * Almost every fix uses this callback for initialisation.  It is only
  1094.  * explicitly referenced for those fixes where this is all the code.
  1095.  *
  1096.  * FIXES:
  1097.  *     TogglePlayerControllable
  1098.  *     SetPlayerWorldBounds
  1099.  *     GetPlayerColor
  1100.  *     SetPlayerName
  1101.  *     GetPlayerSkin
  1102.  *     IsPlayerInCheckpoint
  1103.  *     IsPlayerInRaceCheckpoint
  1104.  *     GetPlayerWeapon
  1105.  */
  1106. #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_SetPlayerName || FIX_GetPlayerColor || FIX_GetPlayerSkin || FIX_IsPlayerInCheckpoint || FIX_IsPlayerInRaceCheckpoint || FIX_GetPlayerWeapon || FIX_PutPlayerInVehicle || FIX_OnPlayerEnterVehicle || FIX_AllowTeleport || FIX_OnDialogResponse || FIX_SetSpawnInfo
  1107.     public OnPlayerConnect(playerid)
  1108.     {
  1109.         #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_PutPlayerInVehicle || FIX_OnPlayerEnterVehicle || FIX_AllowTeleport
  1110.             // This is only reset when the Game Mode changes or when a new
  1111.             // player connects, which is what we want.  The other items are the
  1112.             // same, but must be done only once.  This variable will tend to
  1113.             // hold data relevant only in the master script (the first
  1114.             // filterscript).
  1115.             FIXES_gsPlayerBools[playerid] = e_FIXES_BOOLS_NONE;
  1116.         #endif
  1117.        
  1118.         if (!GetPVarInt(playerid, FIXES_pvarNotNewPlayer))
  1119.         {
  1120.             // ======================
  1121.             //  START: SetPlayerName
  1122.             // ======================
  1123.             #if FIX_SetPlayerName
  1124.                 new
  1125.                     name[MAX_PLAYER_NAME];
  1126.                 GetPlayerName(playerid, name, MAX_PLAYER_NAME);
  1127.                 if (strcmp(name, "FIXES_TEMP_NAME") == 0)
  1128.                 {
  1129.                     Kick(playerid);
  1130.                 }
  1131.             #endif
  1132.             // ======================
  1133.             //  END:   SetPlayerName
  1134.             // ======================
  1135.            
  1136.             // =======================
  1137.             //  START: SetPlayerColor
  1138.             // =======================
  1139.             #if FIX_GetPlayerColor
  1140.                 SetPlayerColor(playerid, FIXES_gscPlayerColours[playerid % 100]);
  1141.             #endif
  1142.             // =======================
  1143.             //  END:   SetPlayerColor
  1144.             // =======================
  1145.            
  1146.             // ======================
  1147.             //  START: GetPlayerSkin
  1148.             // ======================
  1149.             #if FIX_GetPlayerSkin
  1150.                 SetPVarInt(playerid, FIXES_pvarPlayerSkin, 0);
  1151.             #endif
  1152.             // ======================
  1153.             //  END:   GetPlayerSkin
  1154.             // ======================
  1155.            
  1156.             // =============================
  1157.             //  START: IsPlayerInCheckpoint
  1158.             // =============================
  1159.             #if FIX_IsPlayerInCheckpoint
  1160.                 DisablePlayerCheckpoint(playerid);
  1161.             #endif
  1162.             // =============================
  1163.             //  END:   IsPlayerInCheckpoint
  1164.             // =============================
  1165.            
  1166.             // =================================
  1167.             //  START: IsPlayerInRaceCheckpoint
  1168.             // =================================
  1169.             #if FIX_IsPlayerInRaceCheckpoint
  1170.                 DisablePlayerRaceCheckpoint(playerid);
  1171.             #endif
  1172.             // =================================
  1173.             //  END:   IsPlayerInRaceCheckpoint
  1174.             // =================================
  1175.            
  1176.             // ========================
  1177.             //  START: GetPlayerWeapon
  1178.             // ========================
  1179.             #if FIX_GetPlayerWeapon
  1180.                 SetPVarInt(playerid, FIXES_pvarPlayerWeapon, -1);
  1181.             #endif
  1182.             // ========================
  1183.             //  END:   GetPlayerWeapon
  1184.             // ========================
  1185.            
  1186.             // =========================
  1187.             //  START: OnDialogResponse
  1188.             // =========================
  1189.             #if FIX_OnDialogResponse
  1190.                 SetPVarInt(playerid, FIXES_pvarPlayerDialog, -1);
  1191.             #endif
  1192.             // =========================
  1193.             //  END:   OnDialogResponse
  1194.             // =========================
  1195.            
  1196.             // =====================
  1197.             //  START: SetSpawnInfo
  1198.             // =====================
  1199.             #if FIX_SetSpawnInfo
  1200.                 SetSpawnInfo(playerid, NO_TEAM, 0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0);
  1201.             #endif
  1202.             // =====================
  1203.             //  END:   SetSpawnInfo
  1204.             // =====================
  1205.            
  1206.             // No longer their first time.
  1207.             SetPVarInt(playerid, FIXES_pvarNotNewPlayer, 1);
  1208.         }
  1209.         return FIXES_CALL_CALLBACK_1(OnPlayerConnect, 1, "i", playerid);
  1210.     }
  1211.    
  1212.     #if defined _ALS_OnPlayerConnect
  1213.         #undef OnPlayerConnect
  1214.     #else
  1215.         #define _ALS_OnPlayerConnect
  1216.     #endif
  1217.     #define OnPlayerConnect FIXES_OnPlayerConnect
  1218.    
  1219.     forward OnPlayerConnect(playerid);
  1220. #endif
  1221.  
  1222. /*
  1223.  * OnPlayerDisonnect(playerid, reason)
  1224.  *
  1225.  * FIXES:
  1226.  *     SetPlayerAttachedObject
  1227.  *     IsPlayerAttachedObjectSlotUsed
  1228.  */
  1229. #if FIX_SetPlayerAttachedObject || FIX_IsPlayerAttachedObjSlotUsed
  1230.     public OnPlayerDisconnect(playerid, reason)
  1231.     {
  1232.         new
  1233.             ret = FIXES_CALL_CALLBACK_1(OnPlayerDisconnect, 1, "ii", playerid, reason);
  1234.        
  1235.         // ================================
  1236.         //  START: SetPlayerAttachedObject
  1237.         // ================================
  1238.         #if FIX_SetPlayerAttachedObject
  1239.             new
  1240.                 slot = playerid / _FIXES_ATTACHMENTS,
  1241.                 shift = playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS;
  1242.             if (!_FIXES_gIsFilterscript)
  1243.             {
  1244.                 for (new i = 0; i != MAX_PLAYER_ATTACHED_OBJECTS; ++i)
  1245.                 {
  1246.                     if (FIXES_gsObjectSlots[slot] & 1 << shift + i)
  1247.                     {
  1248.                         RemovePlayerAttachedObject(playerid, i);
  1249.                     }
  1250.                 }
  1251.             }
  1252.             FIXES_gsObjectSlots[slot] &= ~((1 << MAX_PLAYER_ATTACHED_OBJECTS) - 1 << shift);
  1253.         #endif
  1254.         // ================================
  1255.         //  END:   SetPlayerAttachedObject
  1256.         // ================================
  1257.        
  1258.         // =======================================
  1259.         //  START: IsPlayerAttachedObjectSlotUsed
  1260.         // =======================================
  1261.         #if FIX_IsPlayerAttachedObjSlotUsed && !FIX_SetPlayerAttachedObject
  1262.             FIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] &= ~((1 << MAX_PLAYER_ATTACHED_OBJECTS) - 1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS);
  1263.         #endif
  1264.         // =======================================
  1265.         //  END:   IsPlayerAttachedObjectSlotUsed
  1266.         // =======================================
  1267.        
  1268.         return ret;
  1269.     }
  1270.    
  1271.     #if defined _ALS_OnPlayerDisconnect
  1272.         #undef OnPlayerDisconnect
  1273.     #else
  1274.         #define _ALS_OnPlayerDisconnect
  1275.     #endif
  1276.     #define OnPlayerDisconnect FIXES_OnPlayerDisconnect
  1277.    
  1278.     forward OnPlayerDisconnect(playerid, reason);
  1279. #endif
  1280.  
  1281. /*
  1282.  * OnPlayerDeath(playerid, killerid, reason)
  1283.  *
  1284.  * FIXES:
  1285.  *     OnPlayerDeath
  1286.  */
  1287. #if FIX_OnPlayerDeath
  1288.     public OnPlayerDeath(playerid, killerid, reason)
  1289.     {
  1290.         if (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)
  1291.         {
  1292.             // ======================
  1293.             //  START: OnPlayerDeath
  1294.             // ======================
  1295.             #if FIX_OnPlayerDeath
  1296.                 static
  1297.                     sAnimlib[32],
  1298.                     sAnimname[32];
  1299.                 GetAnimationName(FIXES_gsLastAnimation[playerid], sAnimlib, sizeof (sAnimlib), sAnimname, sizeof (sAnimname));
  1300.                 if (!strcmp(sAnimlib, "PED", true))
  1301.                 {
  1302.                     ClearAnimations(playerid);
  1303.                 }
  1304.             #endif
  1305.             // ======================
  1306.             //  END:   OnPlayerDeath
  1307.             // ======================
  1308.         }
  1309.         return FIXES_CALL_CALLBACK_1(OnPlayerDeath, 1, "iii", playerid, killerid, reason);
  1310.     }
  1311.    
  1312.     #if defined _ALS_OnPlayerDeath
  1313.         #undef OnPlayerDeath
  1314.     #else
  1315.         #define _ALS_OnPlayerDeath
  1316.     #endif
  1317.     #define OnPlayerDeath FIXES_OnPlayerDeath
  1318.    
  1319.     forward OnPlayerDeath(playerid, killerid, reason);
  1320. #endif
  1321.  
  1322. /*
  1323.  * FIXES_SpawnPlayer(playerid)
  1324.  *
  1325.  * FIXES:
  1326.  *     SpawnPlayer
  1327.  */
  1328. #if FIX_SpawnPlayer
  1329.     stock FIXES_SpawnPlayer(playerid)
  1330.     {
  1331.         // Valid "playerid" check inside "GetPlayerVehicleID".
  1332.         new
  1333.             vid = GetPlayerVehicleID(playerid);
  1334.         if (vid)
  1335.         {
  1336.             new
  1337.                 Float:x,
  1338.                 Float:y,
  1339.                 Float:z;
  1340.             // Remove them without the animation.
  1341.             GetVehiclePos(vid, x, y, z);
  1342.             SetPlayerPos(playerid, x, y, z);
  1343.         }
  1344.         return SpawnPlayer(playerid);
  1345.     }
  1346.    
  1347.     #if defined _ALS_SpawnPlayer
  1348.         #undef SpawnPlayer
  1349.     #else
  1350.        
  1351.         native BAD_SpawnPlayer(playerid) = SpawnPlayer;
  1352.        
  1353.         #define _ALS_SpawnPlayer
  1354.     #endif
  1355.     #define SpawnPlayer FIXES_SpawnPlayer
  1356. #endif
  1357.  
  1358. /*
  1359.  * FIXES_SetPlayerName(playerid, name[])
  1360.  *
  1361.  * FIXES:
  1362.  *     SetPlayerName
  1363.  */
  1364. #if FIX_SetPlayerName
  1365.     stock FIXES_SetPlayerName(playerid, name[])
  1366.     {
  1367.         if (strcmp(name, "FIXES_TEMP_NAME") == 0)
  1368.         {
  1369.             return 0;
  1370.         }
  1371.         SetPlayerName(playerid, "FIXES_TEMP_NAME");
  1372.         return SetPlayerName(playerid, name);
  1373.     }
  1374.     #if defined _ALS_SetPlayerName
  1375.         #undef SetPlayerName
  1376.     #else
  1377.        
  1378.         native BAD_SetPlayerName(playerid, const name[]) = SetPlayerName;
  1379.        
  1380.         #define _ALS_SetPlayerName
  1381.     #endif
  1382.     #define SetPlayerName FIXES_SetPlayerName
  1383. #endif
  1384.  
  1385. /*
  1386.  * OnPlayerSpawn(playerid)
  1387.  *
  1388.  * FIXES:
  1389.  *     GetPlayerSkin
  1390.  *     TogglePlayerControllable
  1391.  */
  1392. #if FIX_GetPlayerSkin || FIX_TogglePlayerControllable
  1393.     public OnPlayerSpawn(playerid)
  1394.     {
  1395.         // ======================
  1396.         //  START: GetPlayerSkin
  1397.         // ======================
  1398.         #if FIX_GetPlayerSkin
  1399.             SetPVarInt(playerid, FIXES_pvarPlayerSkin, GetPlayerSkin(playerid));
  1400.         #endif
  1401.         // ======================
  1402.         //  END:   GetPlayerSkin
  1403.         // ======================
  1404.        
  1405.         // =================================
  1406.         //  START: TogglePlayerControllable
  1407.         // =================================
  1408.         #if FIX_TogglePlayerControllable
  1409.             FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_UNCONTROLLABLE;
  1410.         #endif
  1411.         // =================================
  1412.         //  END:   TogglePlayerControllable
  1413.         // =================================
  1414.        
  1415.         return FIXES_CALL_CALLBACK_1(OnPlayerSpawn, 1, "i", playerid);
  1416.     }
  1417.    
  1418.     #if defined _ALS_OnPlayerSpawn
  1419.         #undef OnPlayerSpawn
  1420.     #else
  1421.         #define _ALS_OnPlayerSpawn
  1422.     #endif
  1423.     #define OnPlayerSpawn FIXES_OnPlayerSpawn
  1424.    
  1425.     forward OnPlayerSpawn(playerid);
  1426. #endif
  1427.  
  1428. /*
  1429.  * FIXES_SetPlayerSkin(playerid, skinid)
  1430.  *
  1431.  * FIXES:
  1432.  *     GetPlayerSkin
  1433.  *     SetPlayerSkin
  1434.  */
  1435. #if FIX_GetPlayerSkin || FIX_SetPlayerSkin
  1436.     stock FIXES_SetPlayerSkin(playerid, skinid)
  1437.     {
  1438.         // ======================
  1439.         //  START: SetPlayerSkin
  1440.         // ======================
  1441.         #if FIX_SetPlayerSkin
  1442.             new
  1443.                 vehicleid = GetPlayerVehicleID(playerid);
  1444.             if (vehicleid)
  1445.             {
  1446.                 new
  1447.                     seat = GetPlayerVehicleSeat(playerid);
  1448.                 ClearAnimations(playerid);
  1449.                 new
  1450.                     ret = SetPlayerSkin(playerid, skinid);
  1451.                 PutPlayerInVehicle(playerid, vehicleid, seat);
  1452.                
  1453.                 // ======================
  1454.                 //  START: GetPlayerSkin
  1455.                 // ======================
  1456.                 #if FIX_GetPlayerSkin
  1457.                     SetPVarInt(playerid, FIXES_pvarPlayerSkin, skinid);
  1458.                 #endif
  1459.                 // ======================
  1460.                 //  END:   GetPlayerSkin
  1461.                 // ======================
  1462.                
  1463.                 return ret;
  1464.             }
  1465.            
  1466.             // ======================
  1467.             //  START: GetPlayerSkin
  1468.             // ======================
  1469.             #if FIX_GetPlayerSkin
  1470.                 else
  1471.             #endif
  1472.             // ======================
  1473.             //  END:   GetPlayerSkin
  1474.             // ======================
  1475.         #endif
  1476.         // ======================
  1477.         //  END:   SetPlayerSkin
  1478.         // ======================
  1479.        
  1480.         // ======================
  1481.         //  START: GetPlayerSkin
  1482.         // ======================
  1483.         #if FIX_GetPlayerSkin
  1484.             SetPVarInt(playerid, FIXES_pvarPlayerSkin, skinid);
  1485.         #endif
  1486.         // ======================
  1487.         //  END:   GetPlayerSkin
  1488.         // ======================
  1489.        
  1490.         return SetPlayerSkin(playerid, skinid);
  1491.     }
  1492.    
  1493.     #if defined _ALS_SetPlayerSkin
  1494.         #undef SetPlayerSkin
  1495.     #else
  1496.        
  1497.         native BAD_SetPlayerSkin(playerid, skinid) = SetPlayerSkin;
  1498.        
  1499.         #define _ALS_SetPlayerSkin
  1500.     #endif
  1501.     #define SetPlayerSkin FIXES_SetPlayerSkin
  1502. #endif
  1503.  
  1504. /*
  1505.  * FIXES_GetPlayerSkin(playerid, skinid)
  1506.  *
  1507.  * FIXES:
  1508.  *     GetPlayerSkin
  1509.  */
  1510. #if FIX_GetPlayerSkin
  1511.     stock FIXES_GetPlayerSkin(playerid)
  1512.     {
  1513.         return GetPVarInt(playerid, FIXES_pvarPlayerSkin);
  1514.     }
  1515.    
  1516.     #if defined _ALS_GetPlayerSkin
  1517.         #undef GetPlayerSkin
  1518.     #else
  1519.        
  1520.         native BAD_GetPlayerSkin(playerid) = GetPlayerSkin;
  1521.        
  1522.         #define _ALS_GetPlayerSkin
  1523.     #endif
  1524.     #define GetPlayerSkin FIXES_GetPlayerSkin
  1525. #endif
  1526.  
  1527. /*
  1528.  * FIXES_GetWeaponName(weaponid, weapon[], len)
  1529.  *
  1530.  * FIXES:
  1531.  *     GetWeaponName
  1532.  */
  1533. #if FIX_GetWeaponName
  1534.     stock FIXES_GetWeaponName(weaponid, weapon[], len)
  1535.     {
  1536.         switch (weaponid)
  1537.         {
  1538.             case 18:
  1539.             {
  1540.                 weapon[0] = 0;
  1541.                 strcat(weapon, "Molotov Cocktail", len);
  1542.                 return 1;
  1543.             }
  1544.             case 44:
  1545.             {
  1546.                 weapon[0] = 0;
  1547.                 strcat(weapon, "Thermal Goggles", len);
  1548.                 return 1;
  1549.             }
  1550.             case 45:
  1551.             {
  1552.                 weapon[0] = 0;
  1553.                 strcat(weapon, "Night vision Goggles", len);
  1554.                 return 1;
  1555.             }
  1556.             default:
  1557.             {
  1558.                 return GetWeaponName(weaponid, weapon, len);
  1559.             }
  1560.         }
  1561.         return 0;
  1562.     }
  1563.    
  1564.     #if defined _ALS_GetWeaponName
  1565.         #undef GetWeaponName
  1566.     #else
  1567.        
  1568.         native BAD_GetWeaponName(weaponid, weapon[], len) = GetWeaponName;
  1569.        
  1570.         #define _ALS_GetWeaponName
  1571.     #endif
  1572.     #define GetWeaponName FIXES_GetWeaponName
  1573. #endif
  1574.  
  1575. /*
  1576.  * OnPlayerUpdate(playerid)
  1577.  *
  1578.  * FIXES:
  1579.  *     SetPlayerWorldBounds
  1580.  *     TogglePlayerControllable
  1581.  *     AllowInteriorWeapons
  1582.  *     OnPlayerDeath
  1583.  */
  1584. #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_AllowInteriorWeapons || FIX_OnPlayerEnterVehicle || FIX_OnPlayerDeath
  1585.     public OnPlayerUpdate(playerid)
  1586.     {
  1587.         if (!(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE))
  1588.         {
  1589.             return FIXES_CALL_CALLBACK_2(OnPlayerUpdate, 1, "i", playerid);
  1590.         }
  1591.        
  1592.         // =============================
  1593.         //  BEGIN: OnPlayerEnterVehicle
  1594.         // =============================
  1595.         #if FIX_OnPlayerEnterVehicle
  1596.             if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_BLOCK)
  1597.             {
  1598.                 return 0;
  1599.             }
  1600.         #endif
  1601.         // =============================
  1602.         //  END:   OnPlayerEnterVehicle
  1603.         // =============================
  1604.        
  1605.         // =============================
  1606.         //  START: AllowInteriorWeapons
  1607.         // =============================
  1608.         #if FIX_AllowInteriorWeapons
  1609.             if (FIXES_gsSettings & e_FIXES_SETTINGS_INTERIOR && GetPlayerInterior(playerid) && GetPlayerWeapon(playerid))
  1610.             {
  1611.                 // DONE: May need integration with "FIX_GetPlayerWeapon".
  1612.                 SetPlayerArmedWeapon(playerid, 0);
  1613.             }
  1614.         #endif
  1615.         // ============================
  1616.         //  END: AllowInteriorWeapons
  1617.         // ============================
  1618.        
  1619.         #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
  1620.             new
  1621.                 ud,
  1622.                 lr,
  1623.                 keys;
  1624.             GetPlayerKeys(playerid, keys, ud, lr);
  1625.         #endif
  1626.        
  1627.         #if FIX_SetPlayerWorldBounds && !FIX_TogglePlayerControllable
  1628.             #pragma unused ud, lr
  1629.         #endif
  1630.        
  1631.         // =============================
  1632.         //  START: SetPlayerWorldBounds
  1633.         // =============================
  1634.         #if FIX_SetPlayerWorldBounds
  1635.             if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_WORLDBOUNDS && keys & _FIXES_KEY_AIM)
  1636.             {
  1637.                 new
  1638.                     Float:x,
  1639.                     Float:y,
  1640.                     Float:z;
  1641.                 GetPlayerPos(playerid, x, y, z);
  1642.                 if (FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] < x < FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] && FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] < y < FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY])
  1643.                 {
  1644.                     FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PX] = x;
  1645.                     FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PY] = y;
  1646.                     FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PZ] = z;
  1647.                 }
  1648.                 else
  1649.                 {
  1650.                     SetPlayerPos(playerid, FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PX], FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PY], FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PZ]);
  1651.                 }
  1652.             }
  1653.         #endif
  1654.         // =============================
  1655.         //  END:   SetPlayerWorldBounds
  1656.         // =============================
  1657.        
  1658.         // ======================
  1659.         //  START: OnPlayerDeath
  1660.         // ======================
  1661.         #if FIX_OnPlayerDeath
  1662.             FIXES_gsLastAnimation[playerid] = GetPlayerAnimationIndex(playerid);
  1663.         #endif
  1664.         // ======================
  1665.         //  END:   OnPlayerDeath
  1666.         // ======================
  1667.        
  1668.         // =================================
  1669.         //  START: TogglePlayerControllable
  1670.         // =================================
  1671.         #if FIX_TogglePlayerControllable
  1672.             // MUST come last.
  1673.             if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_UNCONTROLLABLE)
  1674.             {
  1675.                 // Keys based sync blocking, modified based on a post by Slice:
  1676.                 // http://forum.sa-mp.com/showpost.php?p=876854&postcount=1
  1677.                 // Use "playerid" here as it's a variable that already exists,
  1678.                 // but note that after this point, you CANNOT use "playerid" as
  1679.                 // it has been "clobbered" (and yes, that's the technical term).
  1680.                 // This is just to avoid "statement has no effect" warnings.
  1681.                 // ALWAYS return 0 in this case, regardless of what other
  1682.                 // callbacks return.
  1683.                 playerid = FIXES_CALL_CALLBACK_2(OnPlayerUpdate, 1, "i", playerid);
  1684.                 if (keys || ud || lr)
  1685.                 {
  1686.                     return 0;
  1687.                 }
  1688.                 else
  1689.                 {
  1690.                     return playerid;
  1691.                 }
  1692.             }
  1693.             else
  1694.             {
  1695.                 return FIXES_CALL_CALLBACK_2(OnPlayerUpdate, 1, "i", playerid);
  1696.             }
  1697.         #else
  1698.             return 1;
  1699.         #endif
  1700.         // =================================
  1701.         //  END:   TogglePlayerControllable
  1702.         // =================================
  1703.     }
  1704.    
  1705.     #if defined _ALS_OnPlayerUpdate
  1706.         #undef OnPlayerUpdate
  1707.     #else
  1708.         #define _ALS_OnPlayerUpdate
  1709.     #endif
  1710.     #define OnPlayerUpdate FIXES_OnPlayerUpdate
  1711.    
  1712.     forward OnPlayerUpdate(playerid);
  1713. #endif
  1714.  
  1715. /*
  1716.  * FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min)
  1717.  *
  1718.  * TODO: Modify this to remove aim animations when they get to the boundaries.
  1719.  *
  1720.  * FIXES:
  1721.  *     SetPlayerWorldBounds
  1722.  */
  1723. #if FIX_SetPlayerWorldBounds
  1724.     forward _FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min);
  1725.    
  1726.     stock FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min)
  1727.     {
  1728.         if (0 <= playerid < MAX_PLAYERS)
  1729.         {
  1730.             CallRemoteFunction("_FIXES_SetPlayerWorldBounds", "iffff", playerid, x_max, x_min, y_max, y_min);
  1731.             return getproperty(5, FIXES_gscReturnProperty);
  1732.         }
  1733.         return 0;
  1734.     }
  1735.    
  1736.     public _FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min)
  1737.     {
  1738.         if (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)
  1739.         {
  1740.             //if (x_max == _FIXES_INFINITY && x_min == _FIXES_INFINITY && y_max == _FIXES_INFINITY && y_min == _FIXES_INFINITY)
  1741.             if (x_max == x_min || y_max == y_min)
  1742.             {
  1743.                 // Impossibly small area, disable checks entirely.
  1744.                 FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_WORLDBOUNDS;
  1745.                 setproperty(5, FIXES_gscReturnProperty, -1);
  1746.                 return -1;
  1747.             }
  1748.             // This code could do with a way to mostly remove the checks.  Maybe
  1749.             // when setting everything to FIXES_INFINITY (with default
  1750.             // parameters).
  1751.             FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_WORLDBOUNDS;
  1752.             new
  1753.                 Float:tmp;
  1754.             if (x_max < x_min)
  1755.             {
  1756.                 tmp = x_min;
  1757.                 x_min = x_max;
  1758.                 x_max = tmp;
  1759.             }
  1760.             if (y_max < y_min)
  1761.             {
  1762.                 tmp = y_min;
  1763.                 y_min = y_max;
  1764.                 y_max = tmp;
  1765.             }
  1766.             // Give a little leway so this fix isn't noticed if you're not
  1767.             // trying to break through the world bounds.  Leway removed in
  1768.             // favour of keys.
  1769.             FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] = x_min;
  1770.             FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] = x_max;
  1771.            
  1772.             FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] = y_min;
  1773.             FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY] = y_max;
  1774.            
  1775.             GetPlayerPos(playerid, tmp, tmp, tmp);
  1776.             FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PX] = (x_max - x_min) / 2 + x_min;
  1777.             FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PY] = (y_max - y_min) / 2 + y_min;
  1778.             FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PZ] = tmp;
  1779.            
  1780.             setproperty(5, FIXES_gscReturnProperty, SetPlayerWorldBounds(playerid, x_max, x_min, y_max, y_min));
  1781.         }
  1782.         return 0;
  1783.     }
  1784.    
  1785.     #if defined _ALS_SetPlayerWorldBounds
  1786.         #undef SetPlayerWorldBounds
  1787.     #else
  1788.        
  1789.         native BAD_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min) = SetPlayerWorldBounds;
  1790.        
  1791.         #define _ALS_SetPlayerWorldBounds
  1792.     #endif
  1793.     #define SetPlayerWorldBounds FIXES_SetPlayerWorldBounds
  1794. #endif
  1795.  
  1796. /*
  1797.  * FIXES_TogglePlayerControllable(playerid, toggle)
  1798.  *
  1799.  * FIXES:
  1800.  *     TogglePlayerControllable
  1801.  */
  1802. #if FIX_TogglePlayerControllable
  1803.     forward _FIXES_TogglePlayerControllable(playerid, toggle);
  1804.    
  1805.     stock FIXES_TogglePlayerControllable(playerid, toggle)
  1806.     {
  1807.         if (0 <= playerid < MAX_PLAYERS)
  1808.         {
  1809.             CallRemoteFunction("_FIXES_TogglePlayerControllable", "ii", playerid, toggle);
  1810.             return getproperty(5, FIXES_gscReturnProperty);
  1811.         }
  1812.         return 0;
  1813.     }
  1814.    
  1815.     public _FIXES_TogglePlayerControllable(playerid, toggle)
  1816.     {
  1817.         if (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)
  1818.         {
  1819.             if (toggle)
  1820.             {
  1821.                 FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_UNCONTROLLABLE;
  1822.             }
  1823.             else
  1824.             {
  1825.                 FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_UNCONTROLLABLE;
  1826.             }
  1827.             setproperty(5, FIXES_gscReturnProperty, TogglePlayerControllable(playerid, toggle));
  1828.         }
  1829.     }
  1830.    
  1831.     #if defined _ALS_TogglePlayerControllable
  1832.         #undef TogglePlayerControllable
  1833.     #else
  1834.        
  1835.         native BAD_TogglePlayerControllable(playerid, toggle) = TogglePlayerControllable;
  1836.        
  1837.         #define _ALS_TogglePlayerControllable
  1838.     #endif
  1839.     #define TogglePlayerControllable FIXES_TogglePlayerControllable
  1840. #endif
  1841.  
  1842. #if FIX_AllowInteriorWeapons && FIX_GetPlayerWeapon
  1843.     public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
  1844.     {
  1845.         // ========================
  1846.         //  BEGIN: GetPlayerWeapon
  1847.         // ========================
  1848.         #if FIX_AllowInteriorWeapons && FIX_GetPlayerWeapon
  1849.             if (newinteriorid && FIXES_gsSettings & (e_FIXES_SETTINGS_INTERIOR | e_FIXES_SETTINGS_IN_CHARGE) == (e_FIXES_SETTINGS_INTERIOR | e_FIXES_SETTINGS_IN_CHARGE))
  1850.             {
  1851.                 SetPlayerArmedWeapon(playerid, 0);
  1852.                 if (IsPlayerInAnyVehicle(playerid))
  1853.                 {
  1854.                     SetPVarInt(playerid, FIXES_pvarPlayerWeapon, 0);
  1855.                 }
  1856.             }
  1857.         #endif
  1858.         // ======================
  1859.         //  END: GetPlayerWeapon
  1860.         // ======================
  1861.         return 1;
  1862.     }
  1863.    
  1864.     #if defined _ALS_OnPlayerInteriorChange
  1865.         #undef OnPlayerInteriorChange
  1866.     #else
  1867.         #define _ALS_OnPlayerInteriorChange
  1868.     #endif
  1869.     #define OnPlayerInteriorChange FIXES_OnPlayerInteriorChange
  1870.    
  1871.     forward OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid);
  1872. #endif
  1873.  
  1874. /*
  1875.  * FIXES_BlockUpdate(playerid, bool:block)
  1876.  *
  1877.  * Block a player from using OnPlayerUpdate at all.
  1878.  */
  1879. #if FIX_OnPlayerEnterVehicle
  1880.     static stock FIXES_BlockUpdate(playerid, bool:block)
  1881.     {
  1882.         if (block)
  1883.         {
  1884.             FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_BLOCK;
  1885.             return 0;
  1886.         }
  1887.         else
  1888.         {
  1889.             FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_BLOCK;
  1890.             return 1;
  1891.         }
  1892.     }
  1893. #endif
  1894.  
  1895. /*
  1896.  * OnPlayerStateChange(playerid, newstate, oldstate)
  1897.  *
  1898.  * FIXES:
  1899.  *     HydraSniper
  1900.  *     GetPlayerWeapon
  1901.  *     PutPlayerInVehicle
  1902.  */
  1903. #if FIX_HydraSniper || FIX_GetPlayerWeapon || FIX_PutPlayerInVehicle || FIX_OnPlayerEnterVehicle
  1904.     public OnPlayerStateChange(playerid, newstate, oldstate)
  1905.     {
  1906.         if (!(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE))
  1907.         {
  1908.             return FIXES_CALL_CALLBACK_1(OnPlayerStateChange, 1, "iii", playerid, newstate, oldstate);
  1909.         }
  1910.        
  1911.         // =============================
  1912.         //  BEGIN: OnPlayerEnterVehicle
  1913.         // =============================
  1914.         #if FIX_OnPlayerEnterVehicle
  1915.                 if (newstate == PLAYER_STATE_PASSENGER)
  1916.                 {
  1917.                     new
  1918.                         model = GetVehicleModel(GetPlayerVehicleID(playerid));
  1919.                     if (400 <= model <= 611)
  1920.                     {
  1921.                         model -= 400;
  1922.                         new
  1923.                             seat = GetPlayerVehicleSeat(playerid);
  1924.                         if (seat != 128)
  1925.                         {
  1926.                             model = (FIXES_gscMaxPassengers[model >>> 3] >>> ((model & 7) << 2)) & 0xF;
  1927.                             if (model == 0 || model == 15)
  1928.                             {
  1929.                                 // Shouldn't be in this vehicle at all.
  1930.                                 FIXES_BlockUpdate(playerid, true);
  1931.                                 Kick(playerid);
  1932.                             }
  1933.                             else if (!(0 < seat <= model))
  1934.                             {
  1935.                                 // In an out of range seat.
  1936.                                 FIXES_BlockUpdate(playerid, true);
  1937.                                 Kick(playerid);
  1938.                             }
  1939.                         }
  1940.                     }
  1941.                     else
  1942.                     {
  1943.                         FIXES_BlockUpdate(playerid, true);
  1944.                         Kick(playerid);
  1945.                     }
  1946.                 }
  1947.                 else if (newstate == PLAYER_STATE_DRIVER)
  1948.                 {
  1949.                         new
  1950.                             model = GetPlayerVehicleSeat(playerid);
  1951.                         if (model != 128)
  1952.                         {
  1953.                             if (model == 0)
  1954.                             {
  1955.                                 model = GetVehicleModel(GetPlayerVehicleID(playerid));
  1956.                                 if (!(400 <= model <= 611) || FIXES_gscMaxPassengers[model - 400 >>> 3] >>> ((model - 400 & 7) << 2) & 0xF == 15)
  1957.                                 {
  1958.                                     // In an invalid vehicle (one you can't drive).
  1959.                                     FIXES_BlockUpdate(playerid, true);
  1960.                                     Kick(playerid);
  1961.                                 }
  1962.                             }
  1963.                             else
  1964.                             {
  1965.                                 // They are a driver, but not in the driver's seat.
  1966.                                 FIXES_BlockUpdate(playerid, true);
  1967.                                 Kick(playerid);
  1968.                             }
  1969.                         }
  1970.                     #if FIX_HydraSniper
  1971.                         else
  1972.                         {
  1973.                             model = GetVehicleModel(GetPlayerVehicleID(playerid));
  1974.                         }
  1975.                     #endif
  1976.             #if !FIX_HydraSniper
  1977.                 }
  1978.             #endif
  1979.         #endif
  1980.         // =============================
  1981.         //  END:   OnPlayerEnterVehicle
  1982.         // =============================
  1983.        
  1984.         // ====================
  1985.         //  BEGIN: HydraSniper
  1986.         // ====================
  1987.         #if FIX_HydraSniper
  1988.             #if !FIX_OnPlayerEnterVehicle
  1989.                 // Only called if the same check above isn't called.
  1990.                 if (newstate == PLAYER_STATE_DRIVER)
  1991.                 {
  1992.                     new
  1993.                         model = GetVehicleModel(GetPlayerVehicleID(playerid));
  1994.             #endif
  1995.                     if (model == 520 || model == 425)
  1996.                     {
  1997.                         SetPlayerArmedWeapon(playerid, 0);
  1998.                         #if FIX_GetPlayerWeapon
  1999.                             // This is the first cross-dependednt fix.
  2000.                             SetPVarInt(playerid, FIXES_pvarPlayerWeapon, 0);
  2001.                         #endif
  2002.                     }
  2003.             }
  2004.         #endif
  2005.         // ====================
  2006.         //  END:   HydraSniper
  2007.         // ====================
  2008.        
  2009.         #if FIX_GetPlayerWeapon || FIX_PutPlayerInVehicle
  2010.             #if PLAYER_STATE_PASSENGER != PLAYER_STATE_DRIVER + 1
  2011.                 #error FIX_GetPlayerWeapon/FIX_PutPlayerInVehicle state assertation failed.
  2012.             #endif
  2013.             if (PLAYER_STATE_DRIVER <= oldstate <= PLAYER_STATE_PASSENGER)
  2014.             //if (oldstate == PLAYER_STATE_DRIVER || oldstate == PLAYER_STATE_PASSENGER)
  2015.             {
  2016.                 // ========================
  2017.                 //  BEGIN: GetPlayerWeapon
  2018.                 // ========================
  2019.                 #if FIX_GetPlayerWeapon
  2020.                     SetPVarInt(playerid, FIXES_pvarPlayerWeapon, -1);
  2021.                 #endif
  2022.                 // ========================
  2023.                 //  END:   GetPlayerWeapon
  2024.                 // ========================
  2025.                
  2026.                 // ===========================
  2027.                 //  START: PutPlayerInVehicle
  2028.                 // ===========================
  2029.                 #if FIX_PutPlayerInVehicle
  2030.                     // Update their vehicle once we KNOW the client has done the
  2031.                     // removal from the vehicle.
  2032.                     if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_PUT_IN_VEHICLE)
  2033.                     {
  2034.                         // Limited to "only" 16777216 vehicles and 256 seats.
  2035.                         PutPlayerInVehicle(playerid, FIXES_gsVehicleSeatData[playerid] & 0x00FFFFFF, FIXES_gsVehicleSeatData[playerid] >>> 24);
  2036.                         FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_PUT_IN_VEHICLE;
  2037.                     }
  2038.                 #endif
  2039.                 // ===========================
  2040.                 //  END:   PutPlayerInVehicle
  2041.                 // ===========================
  2042.             }
  2043.         #endif
  2044.        
  2045.         return FIXES_CALL_CALLBACK_1(OnPlayerStateChange, 1, "iii", playerid, newstate, oldstate);
  2046.     }
  2047.    
  2048.     #if defined _ALS_OnPlayerStateChange
  2049.         #undef OnPlayerStateChange
  2050.     #else
  2051.         #define _ALS_OnPlayerStateChange
  2052.     #endif
  2053.     #define OnPlayerStateChange FIXES_OnPlayerStateChange
  2054.    
  2055.     forward OnPlayerStateChange(playerid, newstate, oldstate);
  2056. #endif
  2057.  
  2058. /*
  2059.  * FIXES_SetPlayerArmedWeapon(playerid, weaponid)
  2060.  *
  2061.  * FIXES:
  2062.  *     GetPlayerWeapon
  2063.  */
  2064. #if FIX_GetPlayerWeapon
  2065.     stock FIXES_SetPlayerArmedWeapon(playerid, weaponid)
  2066.     {
  2067.         #if FIX_AllowInteriorWeapons
  2068.             if (FIXES_gsSettings & e_FIXES_SETTINGS_INTERIOR && GetPlayerInterior(playerid))
  2069.             {
  2070.                 // Not allowed weapons.
  2071.                 return 0;
  2072.             }
  2073.         #endif
  2074.         if (IsPlayerInAnyVehicle(playerid))
  2075.         {
  2076.             //FIXES_gsPlayerWeapon[playerid] = weaponid;
  2077.             SetPVarInt(playerid, FIXES_pvarPlayerWeapon, weaponid);
  2078.         }
  2079.         return SetPlayerArmedWeapon(playerid, weaponid);
  2080.     }
  2081.    
  2082.     #if defined _ALS_SetPlayerArmedWeapon
  2083.         #undef SetPlayerArmedWeapon
  2084.     #else
  2085.        
  2086.         native BAD_SetPlayerArmedWeapon(playerid, weaponid) = SetPlayerArmedWeapon;
  2087.        
  2088.         #define _ALS_SetPlayerArmedWeapon
  2089.     #endif
  2090.     #define SetPlayerArmedWeapon FIXES_SetPlayerArmedWeapon
  2091. #endif
  2092.  
  2093. /*
  2094.  * FIXES_GetPlayerWeapon(playerid)
  2095.  *
  2096.  * FIXES:
  2097.  *     GetPlayerWeapon
  2098.  */
  2099. #if FIX_GetPlayerWeapon
  2100.     stock FIXES_GetPlayerWeapon(playerid)
  2101.     {
  2102.         new
  2103.             ret = GetPVarInt(playerid, FIXES_pvarPlayerWeapon);
  2104.         if (ret == -1)
  2105.         {
  2106.             return GetPlayerWeapon(playerid);
  2107.         }
  2108.         return ret;
  2109.     }
  2110.    
  2111.     #if defined _ALS_GetPlayerWeapon
  2112.         #undef GetPlayerWeapon
  2113.     #else
  2114.        
  2115.         native BAD_GetPlayerWeapon(playerid) = GetPlayerWeapon;
  2116.        
  2117.         #define _ALS_GetPlayerWeapon
  2118.     #endif
  2119.     #define GetPlayerWeapon FIXES_GetPlayerWeapon
  2120. #endif
  2121.  
  2122. /*
  2123.  * FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid)
  2124.  *
  2125.  * FIXES:
  2126.  *     PutPlayerInVehicle
  2127.  */
  2128. #if FIX_PutPlayerInVehicle
  2129.     forward _FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid);
  2130.    
  2131.     stock FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid)
  2132.     {
  2133.         new
  2134.             vid = GetPlayerVehicleID(playerid);
  2135.         if (vid)
  2136.         {
  2137.             new
  2138.                 Float:x,
  2139.                 Float:y,
  2140.                 Float:z;
  2141.             // Remove them without the animation.
  2142.             GetVehiclePos(vid, x, y, z);
  2143.             SetPlayerPos(playerid, x, y, z);
  2144.             CallRemoteFunction("_FIXES_PutPlayerInVehicle", "iii", playerid, vehicleid, seatid);
  2145.             return 1;
  2146.         }
  2147.         return PutPlayerInVehicle(playerid, vehicleid, seatid);
  2148.     }
  2149.    
  2150.     public _FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid)
  2151.     {
  2152.         if (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)
  2153.         {
  2154.             FIXES_gsVehicleSeatData[playerid] = seatid << 24 | vehicleid;
  2155.             FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_VEHICLE;
  2156.         }
  2157.         return 1;
  2158.     }
  2159.    
  2160.     #if defined _ALS_PutPlayerInVehicle
  2161.         #undef PutPlayerInVehicle
  2162.     #else
  2163.        
  2164.         native BAD_PutPlayerInVehicle(playerid, vehicleid, seatid) = PutPlayerInVehicle;
  2165.        
  2166.         #define _ALS_PutPlayerInVehicle
  2167.     #endif
  2168.     #define PutPlayerInVehicle FIXES_PutPlayerInVehicle
  2169. #endif
  2170.  
  2171. /*
  2172.  * FIXES_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size)
  2173.  *
  2174.  * FIXES:
  2175.  *     SetPlayerCheckpoint
  2176.  */
  2177. #if FIX_SetPlayerCheckpoint
  2178.     stock FIXES_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size)
  2179.     {
  2180.         DisablePlayerCheckpoint(playerid);
  2181.         return SetPlayerCheckpoint(playerid, x, y, z, size);
  2182.     }
  2183.    
  2184.     #if defined _ALS_SetPlayerCheckpoint
  2185.         #undef SetPlayerCheckpoint
  2186.     #else
  2187.        
  2188.         native BAD_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size) = SetPlayerCheckpoint;
  2189.        
  2190.         #define _ALS_SetPlayerCheckpoint
  2191.     #endif
  2192.     #define SetPlayerCheckpoint FIXES_SetPlayerCheckpoint
  2193. #endif
  2194.  
  2195. /*
  2196.  * FIXES_SetPlayerRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size)
  2197.  *
  2198.  * FIXES:
  2199.  *     SetPlayerRaceCheckpoint
  2200.  */
  2201. #if FIX_SetPlayerRaceCheckpoint
  2202.     stock FIXES_SetPlayerRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size)
  2203.     {
  2204.         DisablePlayerRaceCheckpoint(playerid);
  2205.         return SetPlayerRaceCheckpoint(playerid, type, x, y, z, nextx, nexty, nextz, size);
  2206.     }
  2207.    
  2208.     #if defined _ALS_SetPlayerRaceCheckpoint
  2209.         #undef SetPlayerRaceCheckpoint
  2210.     #else
  2211.        
  2212.         native BAD_SetPlayerRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size) = SetPlayerRaceCheckpoint;
  2213.        
  2214.         #define _ALS_SetPlayerRaceCheckpoint
  2215.     #endif
  2216.     #define SetPlayerRaceCheckpoint FIXES_SetPlayerRaceCheckpoint
  2217. #endif
  2218.  
  2219. /*
  2220.  * Text:FIXES_TextDrawCreate(Float:x, Float:y, text[])
  2221.  *
  2222.  * FIXES:
  2223.  *     TextDrawCreate
  2224.  */
  2225. #if FIX_TextDrawCreate
  2226.     stock Text:FIXES_TextDrawCreate(Float:x, Float:y, text[])
  2227.     {
  2228.         if (text[0] == '\0' || text[0] == '\1' && text[1] == '\0')
  2229.         {
  2230.             return TextDrawCreate(x, y, " ");
  2231.         }
  2232.         else
  2233.         {
  2234.             return TextDrawCreate(x, y, text);
  2235.         }
  2236.     }
  2237.    
  2238.     #if defined _ALS_TextDrawCreate
  2239.         #undef TextDrawCreate
  2240.     #else
  2241.        
  2242.         native Text:BUG_TextDrawCreate(Float:x, Float:y, text[]) = TextDrawCreate;
  2243.        
  2244.         #define _ALS_TextDrawCreate
  2245.     #endif
  2246.     #define TextDrawCreate FIXES_TextDrawCreate
  2247. #endif
  2248.  
  2249. /*
  2250.  * FIXES_TextDrawSetString(Text:text, string[])
  2251.  *
  2252.  * FIXES:
  2253.  *     TextDrawSetString
  2254.  */
  2255. #if FIX_TextDrawSetString
  2256.     stock FIXES_TextDrawSetString(Text:text, string[])
  2257.     {
  2258.         if (string[0] == '\0' || string[0] == '\1' && string[1] == '\0')
  2259.         {
  2260.             return TextDrawSetString(text, " ");
  2261.         }
  2262.         else
  2263.         {
  2264.             return TextDrawSetString(text, string);
  2265.         }
  2266.     }
  2267.    
  2268.     #if defined _ALS_TextDrawSetString
  2269.         #undef TextDrawSetString
  2270.     #else
  2271.        
  2272.         native BAD_TextDrawSetString(Text:text, string[]) = TextDrawSetString;
  2273.        
  2274.         #define _ALS_TextDrawSetString
  2275.     #endif
  2276.     #define TextDrawSetString FIXES_TextDrawSetString
  2277. #endif
  2278.  
  2279. /*
  2280.  * FIXES_AllowInteriorWeapons(allow)
  2281.  *
  2282.  * FIXES:
  2283.  *     AllowInteriorWeapons
  2284.  */
  2285. #if FIX_AllowInteriorWeapons
  2286.     forward _FIXES_AllowInteriorWeapons(allow);
  2287.    
  2288.     stock FIXES_AllowInteriorWeapons(allow)
  2289.     {
  2290.         CallRemoteFunction("_FIXES_AllowInteriorWeapons", "i", allow);
  2291.         return allow;
  2292.     }
  2293.    
  2294.     public _FIXES_AllowInteriorWeapons(allow)
  2295.     {
  2296.         if (allow)
  2297.         {
  2298.             FIXES_gsSettings &= ~e_FIXES_SETTINGS_INTERIOR;
  2299.         }
  2300.         else
  2301.         {
  2302.             FIXES_gsSettings |= e_FIXES_SETTINGS_INTERIOR;
  2303.         }
  2304.         return allow;
  2305.     }
  2306.    
  2307.     #if defined _ALS_AllowInteriorWeapons
  2308.         #undef AllowInteriorWeapons
  2309.     #else
  2310.        
  2311.         native BAD_AllowInteriorWeapons(allow) = AllowInteriorWeapons;
  2312.        
  2313.         #define _ALS_AllowInteriorWeapons
  2314.     #endif
  2315.     #define AllowInteriorWeapons FIXES_AllowInteriorWeapons
  2316. #endif
  2317.  
  2318. /*
  2319.  * OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ)
  2320.  *
  2321.  * FIXES:
  2322.  *     AllowTeleport
  2323.  */
  2324. #if FIX_AllowTeleport && !defined FILTERSCRIPT
  2325.     forward _FIXES_AllowTeleport(playerid, allow);
  2326.    
  2327.     public OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ)
  2328.     {
  2329.         // ======================
  2330.         //  BEGIN: AllowTeleport
  2331.         // ======================
  2332.         #if FIX_AllowTeleport
  2333.             if (!_FIXES_gIsFilterscript)
  2334.             {
  2335.                 // Unusually, the call order here is always Game Mode first -
  2336.                 // most callbacks are Filter Script first.
  2337.                 if ((FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_TELEPORT) || ((FIXES_gsSettings & e_FIXES_SETTINGS_ADMIN_TELEPORT) && (IsPlayerAdmin(playerid))))
  2338.                 {
  2339.                     SetPlayerPosFindZ(playerid, fX, fY, fZ);
  2340.                 }
  2341.             }
  2342.         #endif
  2343.         // ======================
  2344.         //  END:   AllowTeleport
  2345.         // ======================
  2346.         return FIXES_CALL_CALLBACK_2(OnPlayerClickMap, 1, "ifff", playerid, fX, fY, fZ);
  2347.     }
  2348.    
  2349.     #if defined _ALS_OnPlayerClickMap
  2350.         #undef OnPlayerClickMap
  2351.     #else
  2352.         #define _ALS_OnPlayerClickMap
  2353.     #endif
  2354.     #define OnPlayerClickMap FIXES_OnPlayerClickMap
  2355.    
  2356.     forward OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ);
  2357. #endif
  2358.  
  2359. /*
  2360.  * FIXES_AllowPlayerTeleport(playerid, allow)
  2361.  *
  2362.  * FIXES:
  2363.  *     AllowTeleport
  2364.  */
  2365. #if FIX_AllowTeleport
  2366.     stock FIXES_AllowPlayerTeleport(playerid, allow)
  2367.     {
  2368.         if (0 <= playerid < MAX_PLAYERS)
  2369.         {
  2370.             CallRemoteFunction("_FIXES_AllowTeleport", "ii", playerid, allow)
  2371.         }
  2372.         return 0;
  2373.     }
  2374.    
  2375.     #if defined _ALS_AllowPlayerTeleport
  2376.         #undef AllowPlayerTeleport
  2377.     #else
  2378.        
  2379.         native BAD_AllowPlayerTeleport(playerid, allow) = AllowPlayerTeleport;
  2380.        
  2381.         #define _ALS_AllowPlayerTeleport
  2382.     #endif
  2383.     #define AllowPlayerTeleport FIXES_AllowPlayerTeleport
  2384. #endif
  2385.  
  2386. /*
  2387.  * FIXES_AllowAdminTeleport(allow)
  2388.  *
  2389.  * FIXES:
  2390.  *     AllowTeleport
  2391.  */
  2392. #if FIX_AllowTeleport
  2393.     stock FIXES_AllowAdminTeleport(allow)
  2394.     {
  2395.         CallRemoteFunction("_FIXES_AllowTeleport", "ii", INVALID_PLAYER_ID, allow)
  2396.         return allow;
  2397.     }
  2398.    
  2399.     #if defined _ALS_AllowAdminTeleport
  2400.         #undef AllowAdminTeleport
  2401.     #else
  2402.        
  2403.         native BAD_AllowAdminTeleport(allow) = AllowAdminTeleport;
  2404.        
  2405.         #define _ALS_AllowAdminTeleport
  2406.     #endif
  2407.     #define AllowAdminTeleport FIXES_AllowAdminTeleport
  2408. #endif
  2409.  
  2410. /*
  2411.  * FIXES_AllowAdminTeleport(allow)
  2412.  *
  2413.  * FIXES:
  2414.  *     AllowTeleport
  2415.  */
  2416. #if FIX_AllowTeleport && !defined FILTERSCRIPT
  2417.     public _FIXES_AllowTeleport(playerid, allow)
  2418.     {
  2419.         if (!_FIXES_gIsFilterscript)
  2420.         {
  2421.             if (playerid == INVALID_PLAYER_ID)
  2422.             {
  2423.                 if (allow)
  2424.                 {
  2425.                     FIXES_gsSettings |= e_FIXES_SETTINGS_ADMIN_TELEPORT;
  2426.                 }
  2427.                 else
  2428.                 {
  2429.                     FIXES_gsSettings &= ~e_FIXES_SETTINGS_ADMIN_TELEPORT;
  2430.                 }
  2431.             }
  2432.             else
  2433.             {
  2434.                 if (allow)
  2435.                 {
  2436.                     FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_TELEPORT;
  2437.                 }
  2438.                 else
  2439.                 {
  2440.                     FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_TELEPORT;
  2441.                 }
  2442.             }
  2443.         }
  2444.     }
  2445. #endif
  2446.  
  2447. /*
  2448.  * FIXES_SetPlayerSpecialAction(playerid, actionid)
  2449.  *
  2450.  * FIXES:
  2451.  *     SetPlayerSpecialAction
  2452.  */
  2453. #if FIX_SetPlayerSpecialAction
  2454.     stock FIXES_SetPlayerSpecialAction(playerid, actionid)
  2455.     {
  2456.         if (GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_USEJETPACK)
  2457.         {
  2458.             ClearAnimations(playerid);
  2459.         }
  2460.         SetPlayerSpecialAction(playerid, actionid);
  2461.         return 1;
  2462.     }
  2463.    
  2464.     #if defined _ALS_SetPlayerSpecialAction
  2465.         #undef SetPlayerSpecialAction
  2466.     #else
  2467.        
  2468.         native BAD_SetPlayerSpecialAction(playerid, actionid) = SetPlayerSpecialAction;
  2469.        
  2470.         #define _ALS_SetPlayerSpecialAction
  2471.     #endif
  2472.     #define SetPlayerSpecialAction FIXES_SetPlayerSpecialAction
  2473. #endif
  2474.  
  2475. /*
  2476.  * FIXES_ShowPlayerDialog(playerid, dialog, style, title[], caption[], button1[], button2[])
  2477.  *
  2478.  * FIXES:
  2479.  *     OnDialogResponse
  2480.  */
  2481. #if FIX_OnDialogResponse
  2482.     stock FIXES_ShowPlayerDialog(playerid, dialog, style, title[], caption[], button1[], button2[])
  2483.     {
  2484.         if (0 <= playerid < MAX_PLAYERS)
  2485.         {
  2486.             //FIXES_gsDialogID[playerid] = dialog;
  2487.             SetPVarInt(playerid, FIXES_pvarPlayerDialog, dialog);
  2488.             return ShowPlayerDialog(playerid, dialog, style, title, caption, button1, button2);
  2489.         }
  2490.         return 0;
  2491.     }
  2492.    
  2493.     #if defined _ALS_ShowPlayerDialog
  2494.         #undef ShowPlayerDialog
  2495.     #else
  2496.        
  2497.         native BAD_ShowPlayerDialog(playerid, dialog, style, title[], caption[], button1[], button2[]) = ShowPlayerDialog;
  2498.        
  2499.         #define _ALS_ShowPlayerDialog
  2500.     #endif
  2501.     #define ShowPlayerDialog FIXES_ShowPlayerDialog
  2502. #endif
  2503.  
  2504. /*
  2505.  * OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  2506.  *
  2507.  * FIXES:
  2508.  *     OnDialogResponse
  2509.  */
  2510. #if FIX_OnDialogResponse
  2511.     public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  2512.     {
  2513.         // =========================
  2514.         //  BEGIN: OnDialogResponse
  2515.         // =========================
  2516.         #if FIX_OnDialogResponse
  2517.             if (inputtext[0])
  2518.             {
  2519.                 return FIXES_CALL_CALLBACK_2(OnDialogResponse, 1, "iiiis", playerid, GetPVarInt(playerid, FIXES_pvarPlayerDialog), response, listitem, inputtext);
  2520.             }
  2521.             else
  2522.             {
  2523.                 return FIXES_CALL_CALLBACK_2(OnDialogResponse, 1, "iiiis", playerid, GetPVarInt(playerid, FIXES_pvarPlayerDialog), response, listitem, "\1\0");
  2524.             }
  2525.         #endif
  2526.         // =========================
  2527.         //  END:   OnDialogResponse
  2528.         // =========================
  2529.     }
  2530.    
  2531.     #if defined _ALS_OnDialogResponse
  2532.         #undef OnDialogResponse
  2533.     #else
  2534.         #define _ALS_OnDialogResponse
  2535.     #endif
  2536.     #define OnDialogResponse FIXES_OnDialogResponse
  2537.    
  2538.     forward OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]);
  2539. #endif
  2540.  
  2541. /*
  2542.  * FIXES_GetPlayerDialog(playerid)
  2543.  *
  2544.  * FIXES:
  2545.  *     GetPlayerDialog
  2546.  */
  2547. #if FIX_GetPlayerDialog
  2548.     #if FIX_OnDialogResponse
  2549.         stock FIXES_GetPlayerDialog(playerid)
  2550.         {
  2551.             if (0 <= playerid < MAX_PLAYERS)
  2552.             {
  2553.                 return GetPVarInt(playerid, FIXES_pvarPlayerDialog);
  2554.             }
  2555.             return -1;
  2556.         }
  2557.        
  2558.         #if defined _ALS_GetPlayerDialog
  2559.             #undef GetPlayerDialog
  2560.         #else
  2561.             #define _ALS_GetPlayerDialog
  2562.         #endif
  2563.         #define GetPlayerDialog FIXES_GetPlayerDialog
  2564.     #else
  2565.         #error FIX_GetPlayerDialog requires FIX_OnDialogResponse.
  2566.     #endif
  2567. #endif
  2568.  
  2569. /*
  2570.  * FIXES_HideMenuForPlayer(Menu:menuid, playerid
  2571.  *
  2572.  * FIXES:
  2573.  *     HideMenuForPlayer
  2574.  */
  2575. #if FIX_HideMenuForPlayer
  2576.     stock FIXES_HideMenuForPlayer(Menu:menuid, playerid)
  2577.     {
  2578.         if (IsValidMenu(menuid))
  2579.         {
  2580.             return HideMenuForPlayer(menuid, playerid);
  2581.         }
  2582.         return 0;
  2583.     }
  2584.    
  2585.     #if defined _ALS_HideMenuForPlayer
  2586.         #undef HideMenuForPlayer
  2587.     #else
  2588.        
  2589.         native BAD_HideMenuForPlayer(Menu:menuid, playerid) = HideMenuForPlayer;
  2590.        
  2591.         #define _ALS_HideMenuForPlayer
  2592.     #endif
  2593.     #define HideMenuForPlayer FIXES_HideMenuForPlayer
  2594. #endif
  2595.  
  2596. /*
  2597.  * FIXES_valstr(dest[], value, bool:pack = false)
  2598.  *
  2599.  * FIXES:
  2600.  *     valstr
  2601.  */
  2602. #if FIX_valstr
  2603.     stock FIXES_valstr(dest[], value, bool:pack = false)
  2604.     {
  2605.         // "format" can't handle cellmin properly.
  2606.         static const
  2607.             sc_szCellmin[] = !"-2147483648";
  2608.         if (value == cellmin)
  2609.         {
  2610.             pack && strpack(dest, sc_szCellmin, 12) || strunpack(dest, sc_szCellmin, 12);
  2611.         }
  2612.         else
  2613.         {
  2614.             format(dest, 12, "%d", value);
  2615.             pack && strpack(dest, dest, 12);
  2616.         }
  2617.         return 0;
  2618.     }
  2619.    
  2620.     #if defined _ALS_valstr
  2621.         #undef valstr
  2622.     #else
  2623.        
  2624.         native BAD_valstr(dest[], value, bool:pack = false) = valstr;
  2625.        
  2626.         #define _ALS_valstr
  2627.     #endif
  2628.     #define valstr FIXES_valstr
  2629. #endif
  2630.  
  2631. /*
  2632.  * FIXES_fclose(File:handle)
  2633.  *
  2634.  * FIXES:
  2635.  *     fclose
  2636.  */
  2637. #if FIX_fclose
  2638.     stock bool:FIXES_fclose(File:handle)
  2639.     {
  2640.         if (handle)
  2641.         {
  2642.             return fclose(handle);
  2643.         }
  2644.         return false;
  2645.     }
  2646.    
  2647.     #if defined _ALS_fclose
  2648.         #undef fclose
  2649.     #else
  2650.        
  2651.         native BAD_fclose(File:handle) = fclose;
  2652.        
  2653.         #define _ALS_fclose
  2654.     #endif
  2655.     #define fclose FIXES_fclose
  2656. #endif
  2657.  
  2658. /*
  2659.  * FIXES_fwrite(File:handle, const string[])
  2660.  *
  2661.  * FIXES:
  2662.  *     fwrite
  2663.  */
  2664. #if FIX_fwrite
  2665.     stock FIXES_fwrite(File:handle, const string[])
  2666.     {
  2667.         if (handle)
  2668.         {
  2669.             return fwrite(handle, string);
  2670.         }
  2671.         return 0;
  2672.     }
  2673.    
  2674.     #if defined _ALS_fwrite
  2675.         #undef fwrite
  2676.     #else
  2677.        
  2678.         native BAD_fwrite(File:handle, const string[]) = fwrite;
  2679.        
  2680.         #define _ALS_fwrite
  2681.     #endif
  2682.     #define fwrite FIXES_fwrite
  2683. #endif
  2684.  
  2685. /*
  2686.  * FIXES_fread(File:handle, string[], size = sizeof (string), bool:pack = false)
  2687.  *
  2688.  * FIXES:
  2689.  *     fread
  2690.  */
  2691. #if FIX_fread
  2692.     stock FIXES_fread(File:handle, string[], size = sizeof (string), bool:pack = false)
  2693.     {
  2694.         if (handle)
  2695.         {
  2696.             return fread(handle, string, size, pack);
  2697.         }
  2698.         return 0;
  2699.     }
  2700.    
  2701.     #if defined _ALS_fread
  2702.         #undef fread
  2703.     #else
  2704.        
  2705.         native BAD_fread(File:handle, string[], size = sizeof (string), bool:pack = false) = fread;
  2706.        
  2707.         #define _ALS_fread
  2708.     #endif
  2709.     #define fread FIXES_fread
  2710. #endif
  2711.  
  2712. /*
  2713.  * FIXES_fputchar(File:handle, value, bool:utf8 = true)
  2714.  *
  2715.  * FIXES:
  2716.  *     fputchar
  2717.  */
  2718. #if FIX_fputchar
  2719.     stock bool:FIXES_fputchar(File:handle, value, bool:utf8 = true)
  2720.     {
  2721.         if (handle)
  2722.         {
  2723.             return fputchar(handle, value, utf8);
  2724.         }
  2725.        return false;
  2726.     }
  2727.    
  2728.     #if defined _ALS_fputchar
  2729.         #undef fputchar
  2730.     #else
  2731.        
  2732.         native BAD_fputchar(File:handle, value, bool:utf8 = true) = fputchar;
  2733.        
  2734.         #define _ALS_fputchar
  2735.     #endif
  2736.     #define fputchar FIXES_fputchar
  2737. #endif
  2738.  
  2739. /*
  2740.  * FIXES_fgetchar(File:handle, value, bool:utf8 = true)
  2741.  *
  2742.  * FIXES:
  2743.  *     fgetchar
  2744.  */
  2745. #if FIX_fgetchar
  2746.     stock FIXES_fgetchar(File:handle, value, bool:utf8 = true)
  2747.     {
  2748.         if (handle)
  2749.         {
  2750.             return fgetchar(handle, value, utf8);
  2751.         }
  2752.         return 0;
  2753.     }
  2754.    
  2755.     #if defined _ALS_fgetchar
  2756.         #undef fgetchar
  2757.     #else
  2758.        
  2759.         native BAD_fgetchar(File:handle, value, bool:utf8 = true) = fgetchar;
  2760.        
  2761.         #define _ALS_fgetchar
  2762.     #endif
  2763.     #define fgetchar FIXES_fgetchar
  2764. #endif
  2765.  
  2766. /*
  2767.  * FIXES_fblockwrite(File:handle, const buffer[], size = sizeof (buffer))
  2768.  *
  2769.  * FIXES:
  2770.  *     fblockwrite
  2771.  */
  2772. #if FIX_fblockwrite
  2773.     stock FIXES_fblockwrite(File:handle, const buffer[], size = sizeof (buffer))
  2774.     {
  2775.         if (handle)
  2776.         {
  2777.             return fblockwrite(handle, buffer, size);
  2778.         }
  2779.         return 0;
  2780.     }
  2781.    
  2782.     #if defined _ALS_fblockwrite
  2783.         #undef fblockwrite
  2784.     #else
  2785.        
  2786.         native BAD_fblockwrite(File:handle, const buffer[], size = sizeof (buffer)) = fblockwrite;
  2787.        
  2788.         #define _ALS_fblockwrite
  2789.     #endif
  2790.     #define fblockwrite FIXES_fblockwrite
  2791. #endif
  2792.  
  2793. /*
  2794.  * FIXES_fblockread(File:handle, buffer[], size = sizeof (buffer))
  2795.  *
  2796.  * FIXES:
  2797.  *     fblockread
  2798.  */
  2799. #if FIX_fblockread
  2800.     stock FIXES_fblockread(File:handle, buffer[], size = sizeof (buffer))
  2801.     {
  2802.         if (handle)
  2803.         {
  2804.             return fblockread(handle, buffer, size);
  2805.         }
  2806.         return 0;
  2807.     }
  2808.    
  2809.     #if defined _ALS_fblockread
  2810.         #undef fblockread
  2811.     #else
  2812.        
  2813.         native BAD_fblockread(File:handle, buffer[], size = sizeof (buffer)) = fblockread;
  2814.        
  2815.         #define _ALS_fblockread
  2816.     #endif
  2817.     #define fblockread FIXES_fblockread
  2818. #endif
  2819.  
  2820. /*
  2821.  * FIXES_fseek(File:handle, position = 0, seek_whence:whence = seek_start)
  2822.  *
  2823.  * FIXES:
  2824.  *     fseek
  2825.  */
  2826. #if FIX_fseek
  2827.     stock FIXES_fseek(File:handle, position = 0, seek_whence:whence = seek_start)
  2828.     {
  2829.         if (handle)
  2830.         {
  2831.             return fseek(handle, position, whence);
  2832.         }
  2833.         return 0;
  2834.     }
  2835.    
  2836.     #if defined _ALS_fseek
  2837.         #undef fseek
  2838.     #else
  2839.        
  2840.         native BAD_fseek(File:handle, position = 0, seek_whence:whence = seek_start) = fseek;
  2841.        
  2842.         #define _ALS_fseek
  2843.     #endif
  2844.     #define fseek FIXES_fseek
  2845. #endif
  2846.  
  2847. /*
  2848.  * FIXES_flength(File:handle)
  2849.  *
  2850.  * FIXES:
  2851.  *     flength
  2852.  */
  2853. #if FIX_flength
  2854.     stock FIXES_flength(File:handle)
  2855.     {
  2856.         if (handle)
  2857.         {
  2858.             return flength(handle);
  2859.         }
  2860.         return 0;
  2861.     }
  2862.    
  2863.     #if defined _ALS_flength
  2864.         #undef flength
  2865.     #else
  2866.        
  2867.         native BAD_flength(File:handle) = flength;
  2868.        
  2869.         #define _ALS_flength
  2870.     #endif
  2871.     #define flength FIXES_flength
  2872. #endif
  2873.  
  2874. /*
  2875.  * FIXES_IsPAttachedObjectSlotUsed(playerid, index)
  2876.  *
  2877.  * FIXES:
  2878.  *     IsPlayerAttachedObjectSlotUsed
  2879.  */
  2880. #if FIX_IsPlayerAttachedObjSlotUsed
  2881.     stock FIXES_IsPAttachedObjectSlotUsed(playerid, index)
  2882.     {
  2883.         if (IsPlayerConnected(playerid))
  2884.         {
  2885.             return FIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] & 1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index;
  2886.         }
  2887.         return 0;
  2888.     }
  2889.    
  2890.     #if defined _ALS_IsPAttachedObjSlotUsed
  2891.         #undef IsPlayerAttachedObjectSlotUsed
  2892.     #else
  2893.        
  2894.         native BAD_IsPlayerAttachedObjSlotUsed(playerid, index) = IsPlayerAttachedObjectSlotUsed;
  2895.        
  2896.         #define _ALS_IsPAttachedObjSlotUsed
  2897.     #endif
  2898.     #define IsPlayerAttachedObjectSlotUsed FIXES_IsPAttachedObjectSlotUsed
  2899. #endif
  2900.  
  2901. /*
  2902.  * FIXES_SetPlayerAttachedObject(playerid, index, modelid, bone, Float:fOffsetX = 0.0, Float:fOffsetY = 0.0, Float:fOffsetZ = 0.0, Float:fRotX = 0.0, Float:fRotY = 0.0, Float:fRotZ = 0.0, Float:fScaleX = 1.0, Float:fScaleY = 1.0, Float:fScaleZ = 1.0)
  2903.  *
  2904.  * FIXES:
  2905.  *     IsPlayerAttachedObjectSlotUsed
  2906.  *     SetPlayerAttachedObject
  2907.  */
  2908. #if FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject
  2909.     forward _FIXES_SetPlayerAttachedObject(slot, to);
  2910.    
  2911.     stock FIXES_SetPlayerAttachedObject(playerid, index, modelid, bone, Float:fOffsetX = 0.0, Float:fOffsetY = 0.0, Float:fOffsetZ = 0.0, Float:fRotX = 0.0, Float:fRotY = 0.0, Float:fRotZ = 0.0, Float:fScaleX = 1.0, Float:fScaleY = 1.0, Float:fScaleZ = 1.0)
  2912.     {
  2913.         if (SetPlayerAttachedObject(playerid, index, modelid, bone, fOffsetX, fOffsetY, fOffsetZ, fRotX, fRotY, fRotZ, fScaleX, fScaleY, fScaleZ))
  2914.         {
  2915.             new
  2916.                 slot = playerid / _FIXES_ATTACHMENTS;
  2917.             CallRemoteFunction("_FIXES_SetPlayerAttachedObject", "ii", slot, FIXES_gsObjectSlots[slot] | (1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index));
  2918.             return 1;
  2919.         }
  2920.         return 0;
  2921.     }
  2922.    
  2923.     #if defined _ALS_SetPlayerAttachedObject
  2924.         #undef SetPlayerAttachedObject
  2925.     #else
  2926.        
  2927.         native BAD_SetPlayerAttachedObject(playerid, index, modelid, bone, Float:fOffsetX = 0.0, Float:fOffsetY = 0.0, Float:fOffsetZ = 0.0, Float:fRotX = 0.0, Float:fRotY = 0.0, Float:fRotZ = 0.0, Float:fScaleX = 1.0, Float:fScaleY = 1.0, Float:fScaleZ = 1.0) = SetPlayerAttachedObject;
  2928.        
  2929.         #define _ALS_SetPlayerAttachedObject
  2930.     #endif
  2931.     #define SetPlayerAttachedObject FIXES_SetPlayerAttachedObject
  2932. #endif
  2933.  
  2934. /*
  2935.  * FIXES_RemovePlayerAttachedObj(playerid, index)
  2936.  *
  2937.  * FIXES:
  2938.  *     IsPlayerAttachedObjectSlotUsed
  2939.  */
  2940. #if FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject
  2941.     stock FIXES_RemovePlayerAttachedObj(playerid, index)
  2942.     {
  2943.         if (RemovePlayerAttachedObject(playerid, index))
  2944.         {
  2945.             new
  2946.                 slot = playerid / _FIXES_ATTACHMENTS;
  2947.             CallRemoteFunction("_FIXES_SetPlayerAttachedObject", "ii", slot, FIXES_gsObjectSlots[slot] & ~(1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index));
  2948.             return 1;
  2949.         }
  2950.         return 0;
  2951.     }
  2952.    
  2953.     #if defined _ALS_RemovePlayerAttachedObject
  2954.         #undef RemovePlayerAttachedObject
  2955.     #else
  2956.        
  2957.         native BAD_RemovePlayerAttachedObject(playerid, index) = RemovePlayerAttachedObject;
  2958.        
  2959.         #define _ALS_RemovePlayerAttachedObject
  2960.     #endif
  2961.     #define RemovePlayerAttachedObject FIXES_RemovePlayerAttachedObj
  2962. #endif
  2963.    
  2964. /*
  2965.  * _FIXES_SetPlayerAttachedObject(slot, to)
  2966.  *
  2967.  * FIXES:
  2968.  *     IsPlayerAttachedObjectSlotUsed
  2969.  */
  2970. #if FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject
  2971.     public _FIXES_SetPlayerAttachedObject(slot, to)
  2972.     {
  2973.         FIXES_gsObjectSlots[slot] = to;
  2974.     }
  2975. #endif
  2976.  
  2977. /*
  2978.  * FIXES_%%%!!!
  2979.  *
  2980.  * FIXES:
  2981.  *     %%%
  2982.  */
  2983. /*#if FIX_%%%
  2984.     stock FIXES_%%%!!!
  2985.     {
  2986.         return 0;
  2987.     }
  2988.    
  2989.     #if defined _ALS_%%%
  2990.         #undef %%%
  2991.     #else
  2992.        
  2993.         native BAD_%%%!!! = %%%;
  2994.        
  2995.         #define _ALS_%%%
  2996.     #endif
  2997.     #define %%% FIXES_%%%
  2998. #endif
  2999. */
  3000.  
  3001. /*
  3002.  * _FIXES_DetermineOrder()
  3003.  *
  3004.  * Figure out which the first filterscript to be called is so that it can do the
  3005.  * majority of the work.  More detail:  Serveral pieces of code for some fixes
  3006.  * rely on things like blocking "OnPlayerUpdate".  This should be done in the
  3007.  * first script in which "OnPlayerUpdate" is called only, so we need to find out
  3008.  * in advance which script will be called first (at least out of all the fixed
  3009.  * scripts).
  3010.  */
  3011. public _FIXES_DetermineOrder()
  3012. {
  3013.     // TODO: Graceful handoff.  I thought I was past all this rubbish!
  3014.     if (_FIXES_gIsFilterscript)
  3015.     {
  3016.         if (!existproperty(5, FIXES_gscNoGMProperty))
  3017.         {
  3018.             // Either this is a Filter Script (1) and we don't want Game Modes (1)
  3019.             // or this isn't a filterscript (0) and we do want Game Modes (0).  All
  3020.             // other cases return here due to a logic mismatch.  This is to rectify
  3021.             // the difference in call orders between "CallRemoteFunction" and normal
  3022.             // callbacks.
  3023.             return 0;
  3024.         }
  3025.     }
  3026.     else
  3027.     {
  3028.         if (existproperty(5, FIXES_gscNoGMProperty))
  3029.         {
  3030.             // Either this is a Filter Script (1) and we don't want Game Modes (1)
  3031.             // or this isn't a filterscript (0) and we do want Game Modes (0).  All
  3032.             // other cases return here due to a logic mismatch.  This is to rectify
  3033.             // the difference in call orders between "CallRemoteFunction" and normal
  3034.             // callbacks.
  3035.             return 0;
  3036.         }
  3037.         // Make sure certain data is synced with what the GM thinks it is.
  3038.         // =============================
  3039.         //  START: AllowInteriorWeapons
  3040.         // =============================
  3041.         #if FIX_AllowInteriorWeapons
  3042.             CallRemoteFunction("_FIXES_AllowInteriorWeapons", "i", !(FIXES_gsSettings & e_FIXES_SETTINGS_INTERIOR));
  3043.         #endif
  3044.         // =============================
  3045.         //  START: AllowInteriorWeapons
  3046.         // =============================
  3047.        
  3048.         // ================================
  3049.         //  START: SetPlayerAttachedObject
  3050.         // ================================
  3051.         #if FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject
  3052.             for (new i = 0; i != _FIXES_ATTACHMENTS; ++i)
  3053.             {
  3054.                 CallRemoteFunction("_FIXES_SetPlayerAttachedObject", "ii", i, FIXES_gsObjectSlots[i]);
  3055.             }
  3056.         #endif
  3057.         // ==============================
  3058.         //  END: SetPlayerAttachedObject
  3059.         // ==============================
  3060.     }
  3061.     if (existproperty(5, FIXES_gscOrderProperty))
  3062.     {
  3063.         if (FIXES_gsSettings & (e_FIXES_SETTINGS_IN_CHARGE | e_FIXES_SETTINGS_DROP_ALL_DATA) == e_FIXES_SETTINGS_IN_CHARGE)
  3064.         {
  3065.             // This script is currently in charge, but a new script has usurped
  3066.             // it!  Pass all relevant data over to the new script.  Also, this
  3067.             // wasn't triggered by a game mode change (where we just want to
  3068.             // dump and reset all data).  There is no need to reset the admin
  3069.             // teleport data as that is always handled by the Game Mode, so it
  3070.             // will either be correct, or it will be blank.
  3071.             FIXES_gsSettings &= ~e_FIXES_SETTINGS_IN_CHARGE;
  3072.             #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
  3073.                 for (new i = 0; i != MAX_PLAYERS; ++i)
  3074.                 {
  3075.                     if (IsPlayerConnected(i))
  3076.                     {
  3077.                         // =============================
  3078.                         //  START: SetPlayerWorldBounds
  3079.                         // =============================
  3080.                         #if FIX_SetPlayerWorldBounds
  3081.                             if (FIXES_gsPlayerBools[i] & e_FIXES_BOOLS_WORLDBOUNDS)
  3082.                             {
  3083.                                 CallRemoteFunction("_FIXES_SetPlayerWorldBounds", "iffff", i, FIXES_gsWorldbounds[i][E_FIXES_WORLDBOUND_DATA_UX], FIXES_gsWorldbounds[i][E_FIXES_WORLDBOUND_DATA_LX], FIXES_gsWorldbounds[i][E_FIXES_WORLDBOUND_DATA_UY], FIXES_gsWorldbounds[i][E_FIXES_WORLDBOUND_DATA_LY]);
  3084.                             }
  3085.                         #endif
  3086.                         // =============================
  3087.                         //  END:   SetPlayerWorldBounds
  3088.                         // =============================
  3089.                        
  3090.                         // =================================
  3091.                         //  START: TogglePlayerControllable
  3092.                         // =================================
  3093.                         #if FIX_TogglePlayerControllable
  3094.                             CallRemoteFunction("_FIXES_TogglePlayerControllable", "ii", i, !(FIXES_gsPlayerBools[i] & e_FIXES_BOOLS_UNCONTROLLABLE));
  3095.                         #endif
  3096.                         // =================================
  3097.                         //  END:   TogglePlayerControllable
  3098.                         // =================================
  3099.                        
  3100.                         // ===========================
  3101.                         //  START: PutPlayerInVehicle
  3102.                         // ===========================
  3103.                         #if FIX_PutPlayerInVehicle
  3104.                             if (FIXES_gsPlayerBools[i] & e_FIXES_BOOLS_PUT_IN_VEHICLE)
  3105.                             {
  3106.                                 CallRemoteFunction("_FIXES_PutPlayerInVehicle", "iii", i, FIXES_gsVehicleSeatData[i] & 0x00FFFFFF, FIXES_gsVehicleSeatData[i] >>> 24);
  3107.                             }
  3108.                         #endif
  3109.                         // ===========================
  3110.                         //  END:   PutPlayerInVehicle
  3111.                         // ===========================
  3112.                     }
  3113.                 }
  3114.             #endif
  3115.             return 0;
  3116.         }
  3117.         else
  3118.         {
  3119.             FIXES_gsSettings &= ~e_FIXES_SETTINGS_IN_CHARGE;
  3120.             return 0;
  3121.         }
  3122.     }
  3123.     else
  3124.     {
  3125.         setproperty(5, FIXES_gscOrderProperty, 1);
  3126.         FIXES_gsSettings |= e_FIXES_SETTINGS_IN_CHARGE;
  3127.         return 1;
  3128.     }
  3129. }
  3130.  
  3131. #undef _FIXES_CEILDIV
  3132. #undef _FIXES_INFINITY
  3133. #undef _FIXES_ATTACHMENTS
  3134. #undef FIXES_DETECT_CALLBACK_1
  3135. #undef FIXES_DETECT_CALLBACK_2
  3136. #undef FIXES_CALL_CALLBACK_1
  3137. #undef FIXES_CALL_CALLBACK_2
Add Comment
Please, Sign In to add comment