Y_Less

fixes.inc ALS

Mar 15th, 2014
427
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 238.10 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
  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/Slice/xX_Simon_Xx
  40.  * POST:     https://github.com/Y-Less/sa-mp-fixes/issues/3
  41.  *
  42.  * FIX:      GetPlayerSkin
  43.  * PROBLEM:  Returns the new skin after "SetSpawnInfo" is called but before the
  44.  *           player actually respawns to get the new skin.
  45.  * SOLUTION: Record the skin in "OnPlayerSpawn" and always return that one.
  46.  * SEE:      "OnPlayerSpawn", "FIXES_GetPlayerSkin" and "FIXES_SetPlayerSkin".
  47.  * AUTHOR:   Y_Less
  48.  *
  49.  * FIX:      GetWeaponName
  50.  * PROBLEM:  Returns nothing for 18, 44, and 45.
  51.  * SOLUTION: Return the correct names ("Molotov Cocktail", "Thermal Goggles",
  52.  *           and "Night vision Goggles").
  53.  * SEE:      "FIXES_GetWeaponName".
  54.  * AUTHOR:   Y_Less
  55.  *
  56.  * FIX:      SetPlayerWorldBounds
  57.  * PROBLEM:  Aiming can bypass the edge.
  58.  * SOLUTION: Check for the player leaving the area and reset them to their last
  59.  *           good position if they leave the area (aiming or not).
  60.  * SEE:      "OnPlayerUpdate" and "FIXES_SetPlayerWorldBounds".
  61.  * AUTHOR:   Y_Less
  62.  *
  63.  * FIX:      TogglePlayerControllable
  64.  * PROBLEM:  Other players see you moving on the spot.
  65.  * SOLUTION: Return 0 in OnPlayerUpdate.
  66.  * SEE:      "FIXES_TogglePlayerControllable" and "OnPlayerUpdate".
  67.  * AUTHOR:   Slice
  68.  * POST:     http://forum.sa-mp.com/showpost.php?p=876854
  69.  *
  70.  * FIX:      HydraSniper
  71.  * PROBLEM:  Entring military aircraft with a sniper rifle messes up vies.
  72.  * SOLUTION: Set their armed weapon to fists.
  73.  * SEE:      "OnPlayerStateChange", "FIXES_GivePlayerWeapon",
  74.  *           "FIXES_SetPlayerArmedWeapon".
  75.  * AUTHOR:   funky1234
  76.  * POST:     http://forum.sa-mp.com/showpost.php?p=965644
  77.  *
  78.  * FIX:      IsPlayerInCheckpoint
  79.  * PROBLEM:  Function returns an undefined value if it is called before any
  80.  *           other checkpoint functions are called to initialise the value.
  81.  * SOLUTION: Call "DisablePlayerCheckpoint" when they connect.
  82.  * SEE:      "OnPlayerConnect".
  83.  * AUTHOR:   Y_Less
  84.  *
  85.  * FIX:      IsPlayerInRaceCheckpoint
  86.  * PROBLEM:  Function returns an undefined value if it is called before any
  87.  *           other race checkpoint functions are called to initialise the value.
  88.  * SOLUTION: Call "DisablePlayerRaceCheckpoint" when they connect.
  89.  * SEE:      "OnPlayerConnect".
  90.  * AUTHOR:   Y_Less
  91.  *
  92.  * FIX:      GetPlayerWeapon
  93.  * PROBLEM:  Returns the old value after using "SetPlayerArmedWeapon" when they
  94.  *           are in a vehicle.
  95.  * SOLUTION: If "SetPlayerArmedWeapon" is called in a vehicle, store the new
  96.  *           value and return that instead.
  97.  * SEE:      "OnPlayerStateChange", "FIXES_SetPlayerArmedWeapon", and
  98.  *           "FIXES_GetPlayerWeapon".
  99.  * AUTHOR:   Y_Less
  100.  *
  101.  * FIX:      PutPlayerInVehicle
  102.  * PROBLEM:  If this is used on a passenger the driver of their old vehicle
  103.  *           doesn't see them in their new vehicle.
  104.  * SOLUTION: Remove them from the vehicle first.
  105.  * SEE:      "OnPlayerStateChange" and "FIXES_PutPlayerInVehicle".
  106.  * AUTHOR:   leong124/Y_Less
  107.  * POST:     http://forum.sa-mp.com/showpost.php?p=1265965
  108.  *
  109.  * FIX:      KEY_AIM
  110.  * PROBLEM:  "KEY_AIM" isn't defined by default.
  111.  * SOLUTION: Define it.
  112.  * SEE:      N/A.
  113.  * AUTHOR:   Y_Less
  114.  *
  115.  * FIX:      SetPlayerCheckpoint
  116.  * PROBLEM:  If a checkpoint is already set it will use the size of that
  117.  *           checkpoint instead of the new one.
  118.  * SOLUTION: Call "DisablePlayerCheckpoint" before setting the checkpoint.
  119.  * SEE:      "FIXES_SetPlayerCheckpoint".
  120.  * AUTHOR:   KoczkaHUN
  121.  * POST:     http://forum.sa-mp.com/showpost.php?p=1482401
  122.  *
  123.  * FIX:      SetPlayerRaceCheckpoint
  124.  * PROBLEM:  If a checkpoint is already set it will use the size of that
  125.  *           checkpoint instead of the new one.
  126.  * SOLUTION: Call "DisablePlayerRaceCheckpoint" before setting the checkpoint.
  127.  * SEE:      "FIXES_SetPlayerRaceCheckpoint".
  128.  * AUTHOR:   KoczkaHUN
  129.  * POST:     http://forum.sa-mp.com/showpost.php?p=1482401
  130.  *
  131.  * FIX:      TextDrawCreate
  132.  * PROBLEM:  Crashes on a blank string.
  133.  * SOLUTION: Intercept blank strings.
  134.  * SEE:      "FIXES_TextDrawCreate".
  135.  * AUTHOR:   wups
  136.  * POST:     http://forum.sa-mp.com/showpost.php?p=1484008
  137.  *
  138.  * FIX:      TextDrawSetString
  139.  * PROBLEM:  Crashes on a blank string and size greater than 1024.
  140.  * SOLUTION: Intercept blank strings and truncate long strings.
  141.  * SEE:      "FIXES_TextDrawSetString".
  142.  * AUTHOR:   TomTrox
  143.  * POST:     http://forum.sa-mp.com/showpost.php?p=1487870
  144.  *
  145.  * FIX:      CreatePlayerTextDraw
  146.  * PROBLEM:  Crashes on a blank string.
  147.  * SOLUTION: Intercept blank strings.
  148.  * SEE:      "FIXES_CreatePlayerTextDraw".
  149.  * AUTHOR:   wups/Y_Less
  150.  *
  151.  * FIX:      PlayerTextDrawSetString
  152.  * PROBLEM:  Crashes on a blank string and size greater than 1024.
  153.  * SOLUTION: Intercept blank strings and truncate long strings.
  154.  * SEE:      "FIXES_PlayerTextDrawSetString".
  155.  * AUTHOR:   TomTrox/Y_Less
  156.  *
  157.  * FIX:      AllowInteriorWeapons
  158.  * PROBLEM:  Does nothing.
  159.  * SOLUTION: Set the player's weapon to fists in an interior.
  160.  * SEE:      "FIXES_AllowInteriorWeapons", "OnGameModeInit" and
  161.  *           "OnPlayerUpdate".
  162.  * AUTHOR:   KoczkaHUN
  163.  * POST:     http://forum.sa-mp.com/showpost.php?p=1502696
  164.  *
  165.  * FIX:      OnPlayerEnterVehicle
  166.  * PROBLEM:  Crashes other players when people enter an invalid seat.
  167.  * SOLUTION: Desync the people with invalid seats.
  168.  * SEE:      "OnPlayerStateChange" and "OnPlayerUpdate".
  169.  * AUTHOR:   RyDeR`/Y_Less
  170.  * POST:     http://forum.sa-mp.com/showpost.php?p=1410296
  171.  *
  172.  * FIX:      OnPlayerEnterVehicle_2
  173.  * PROBLEM:  Crashes the server when hacks enter an invalid vehicle.
  174.  * SOLUTION: Desync the people with invalid vehicles.
  175.  * SEE:      "OnPlayerEnterVehicle".
  176.  * AUTHOR:   im/Y_Less
  177.  * POST:     http://forum.sa-mp.com/showpost.php?p=2340900
  178.  *
  179.  * FIX:      AllowTeleport
  180.  * PROBLEM:  0.3dRC9 removed "AllowPlayerTeleport" and "AllowAdminTeleport" in
  181.  *           favour of "OnPlayerClickMap".  Some scripts used the old code and.
  182.  * SOLUTION: Teleport the player in "OnPlayerClickMap".
  183.  * SEE:      "OnPlayerClickMap", "FIXES_AllowPlayerTeleport", and
  184.  *           "FIXES_AllowAdminTeleport".
  185.  * AUTHOR:   Y_Less
  186.  *
  187.  * FIX:      SetPlayerSpecialAction
  188.  * PROBLEM:  Removing jetpacks from players by setting their special action to 0
  189.  *           causes the sound to stay until death.
  190.  * SOLUTION: Call "ClearAnimations" before "SetPlayerSpecialAction".
  191.  * SEE:      "FIXES_SetPlayerSpecialAction".
  192.  * AUTHOR:   MP2
  193.  * POST:     Private message from MP2.
  194.  *
  195.  * FIX:      OnDialogResponse
  196.  * PROBLEM:  Cheaters can spoof the dialogid they are using to respond to ones
  197.  *           they can't actually see.
  198.  * SOLUTION: Store the displayed dialogid and use that instead.
  199.  * SEE:      "FIXES_OnDialogResponse", "FIXES_ShowPlayerDialog".
  200.  * AUTHOR:   Y_Less
  201.  * FIXED IN: 0.3e RC6
  202.  *
  203.  * FIX:      GetPlayerDialog
  204.  * PROBLEM:  This function doesn't exist.  Fixed for hidden dialogs.
  205.  * SOLUTION: Add it.  DEFAULTS TO FALSE!
  206.  * SEE:      "FIXES_GetPlayerDialog".
  207.  * AUTHOR:   Y_Less/xX_Simon_Xx
  208.  * POST:     http://forum.sa-mp.com/showpost.php?p=2141254
  209.  *
  210.  * FIX:      PlayerDialogResponse
  211.  * PROBLEM:  A player's dialog doesn't hide when the gamemode restarts, causing
  212.  *           the server to print "Warning: PlayerDialogResponse PlayerId: 0
  213.  *           dialog ID doesn't match last sent dialog ID".
  214.  * SOLUTION: Hide it.
  215.  * SEE:      "OnPlayerConnect", "OnGameModeExit".
  216.  * AUTHOR:   xX_Simon_Xx
  217.  * POST:     https://github.com/Y-Less/sa-mp-fixes/issues/2
  218.  *
  219.  * FIX:      SetSpawnInfo
  220.  * PROBLEM:  Kicks the player if "SpawnPlayer" is called before "SetSpawnInfo".
  221.  * SOLUTION: Call "SetSpawnInfo" at least once.
  222.  * SEE:      "OnPlayerConnect".
  223.  * AUTHOR:   Y_Less
  224.  *
  225.  * FIX:      SetPlayerSkin
  226.  * PROBLEM:  Breaks sitting on bikes.
  227.  * SOLUTION: Put them back in the vehicle after setting their skin.
  228.  * SEE:      "FIXES_SetPlayerSkin".
  229.  * AUTHOR:   CyNiC
  230.  * POST:     http://forum.sa-mp.com/showpost.php?p=1756094
  231.  *
  232.  * FIX:      HideMenuForPlayer
  233.  * PROBLEM:  Crashes when passed an invalid menu ID.
  234.  * SOLUTION: Don't hide it when passed an invalid menu.
  235.  * SEE:      "FIXES_HideMenuForPlayer".
  236.  * AUTHOR:   Y_Less
  237.  * POST:     http://forum.sa-mp.com/showpost.php?p=1787297
  238.  *
  239.  * FIX:      valstr
  240.  * PROBLEM:  Crashes on large numbers.
  241.  * SOLUTION: Use "format" instead.
  242.  * SEE:      "FIXES_valstr".
  243.  * AUTHOR:   Slice
  244.  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300
  245.  *
  246.  * FIX:      fclose
  247.  * PROBLEM:  Crashes on an invalid handle.
  248.  * SOLUTION: Check for an invalid handle.
  249.  * SEE:      "FIXES_fclose".
  250.  * AUTHOR:   Slice
  251.  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300
  252.  *
  253.  * FIX:      fwrite
  254.  * PROBLEM:  Crashes on an invalid handle.
  255.  * SOLUTION: Check for an invalid handle.
  256.  * SEE:      "FIXES_fwrite".
  257.  * AUTHOR:   Slice
  258.  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300
  259.  *
  260.  * FIX:      fread
  261.  * PROBLEM:  Crashes on an invalid handle.
  262.  * SOLUTION: Check for an invalid handle.
  263.  * SEE:      "FIXES_fread".
  264.  * AUTHOR:   Slice
  265.  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300
  266.  *
  267.  * FIX:      fputchar
  268.  * PROBLEM:  Crashes on an invalid handle.
  269.  * SOLUTION: Check for an invalid handle.
  270.  * SEE:      "FIXES_fputchar".
  271.  * AUTHOR:   Slice
  272.  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300
  273.  *
  274.  * FIX:      fgetchar
  275.  * PROBLEM:  Crashes on an invalid handle.
  276.  * SOLUTION: Check for an invalid handle.
  277.  * SEE:      "FIXES_fgetchar".
  278.  * AUTHOR:   Slice
  279.  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300
  280.  *
  281.  * FIX:      fblockwrite
  282.  * PROBLEM:  Crashes on an invalid handle.
  283.  * SOLUTION: Check for an invalid handle.
  284.  * SEE:      "FIXES_fblockwrite".
  285.  * AUTHOR:   Slice
  286.  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300
  287.  *
  288.  * FIX:      fblockread
  289.  * PROBLEM:  Crashes on an invalid handle.
  290.  * SOLUTION: Check for an invalid handle.
  291.  * SEE:      "FIXES_fblockread".
  292.  * AUTHOR:   Slice
  293.  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300
  294.  *
  295.  * FIX:      fseek
  296.  * PROBLEM:  Crashes on an invalid handle.
  297.  * SOLUTION: Check for an invalid handle.
  298.  * SEE:      "FIXES_fseek".
  299.  * AUTHOR:   Slice
  300.  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300
  301.  *
  302.  * FIX:      flength
  303.  * PROBLEM:  Crashes on an invalid handle.
  304.  * SOLUTION: Check for an invalid handle.
  305.  * SEE:      "FIXES_flength".
  306.  * AUTHOR:   Slice
  307.  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300
  308.  *
  309.  * FIX:      file_inc
  310.  * PROBLEM:  Includes or excludes all the file function fixes together (can
  311.  *           cause major overhead).
  312.  * SOLUTION: Optionally group them all under one define.  DEFAULTS TO FALSE!
  313.  * SEE:      "FIX_file_inc".
  314.  * AUTHOR:   Y_Less
  315.  *
  316.  * FIX:      IsPlayerAttachedObjectSlotUsed
  317.  * PROBLEM:  Doesn't work in OnPlayerDisconnect.
  318.  * SOLUTION: Maintain an internal record of slots used.
  319.  * SEE:      "FIXES_SetPlayerAttachedObject",
  320.  *           "FIXES_RemovePlayerAttachedObject",
  321.  *           "FIXES_IsPAttachedObjectSlotUsed", and
  322.  *           "OnPlayerDisconnect".
  323.  * AUTHOR:   Y_Less
  324.  *
  325.  * FIX:      SetPlayerAttachedObject
  326.  * PROBLEM:  Doesn't remove objects when the mode ends.
  327.  * SOLUTION: Remove them.
  328.  * SEE:      "FIXES_SetPlayerAttachedObject",
  329.  *           "FIXES_RemovePlayerAttachedObject", and
  330.  *           "OnPlayerDisconnect".
  331.  * AUTHOR:   Y_Less
  332.  *
  333.  * FIX:      OnPlayerDeath
  334.  * PROBLEM:  Clients get stuck when they die with an animation applied.
  335.  * SOLUTION: Clear their animations.
  336.  * SEE:      "OnPlayerDeath" and "OnPlayerUpdate".
  337.  * AUTHOR:   h02
  338.  * POST:     http://forum.sa-mp.com/showpost.php?p=1641144
  339.  *
  340.  * FIX:      strins
  341.  * PROBLEM:  Ignores the "maxlength" parameter causing possible crashes.
  342.  * SOLUTION: Manually check the length.
  343.  * SEE:      "FIXES_strins".
  344.  * AUTHOR:   Slice/Y_Less
  345.  * POST:     http://forum.sa-mp.com/showpost.php?p=1860495
  346.  * POST:     http://forum.sa-mp.com/showpost.php?p=1864706
  347.  *
  348.  * FIX:      IsPlayerConnected
  349.  * PROBLEM:  Only uses the lower two bytes of a passed ID.
  350.  * SOLUTION: Mask the numbers.
  351.  * SEE:      "FIXES_IsPlayerConnected".
  352.  * AUTHOR:   Slice
  353.  * POST:     http://forum.sa-mp.com/showpost.php?p=1860464
  354.  *
  355.  * FIX:      OnPlayerCommandText
  356.  * PROBLEM:  Can crash ZCMD when passed a null string.
  357.  * SOLUTION: Pass NULL if invalid inputs given.
  358.  * SEE:      "OnPlayerCommandText".
  359.  * AUTHOR:   Y_Less
  360.  * POST:     http://forum.sa-mp.com/showpost.php?p=1909511
  361.  *
  362.  * FIX:      TrainExit
  363.  * PROBLEM:  When getting out of a train entered by "PutPlayerInVehicle", the
  364.  *           camera does not reset properly.
  365.  * SOLUTION: Reset the camera.
  366.  * SEE:      "FIXES_PutPlayerInVehicle", "FIXES_OnPlayerStateChange".
  367.  * AUTHOR:   Terminator3/Y_Less
  368.  * POST:     http://forum.sa-mp.com/showpost.php?p=1980214
  369.  *
  370.  * FIX:      Kick
  371.  * PROBLEM:  Calling "Kick" in "OnPlayerConnect" doesn't work properly.
  372.  * SOLUTION: Defer it.
  373.  * SEE:      "OnPlayerConnect", "FIXES_Kick".
  374.  * AUTHOR:   Y_Less
  375.  * POST:     http://forum.sa-mp.com/showpost.php?p=1989453
  376.  * FIXED IN: 0.3x
  377.  *
  378.  * FIX:      OnVehicleMod
  379.  * PROBLEM:  Crashes other players when invalid mods are applied.
  380.  * SOLUTION: Desync the player.
  381.  * SEE:      "OnVehicleMod".
  382.  * AUTHOR:   JernejL/Y_Less
  383.  * POST:     http://forum.sa-mp.com/showpost.php?p=1671500
  384.  *
  385.  * FIX:      random
  386.  * PROBLEM:  Doesn't work with negative numbers.
  387.  * SOLUTION: Invert then reinvert.  DEFAULTS TO FALSE!
  388.  * SEE:      "FIXES_random".
  389.  * AUTHOR:   xX_Simon_Xx
  390.  * POST:     http://forum.sa-mp.com/showpost.php?p=2141254
  391.  *
  392.  * FIX:      sleep
  393.  * PROBLEM:  Leaks bytes from the stack.
  394.  * SOLUTION: Invoke "SYSREQ.C" and "RETN" first to store the correct values.
  395.  * SEE:      "FIXES_sleep".
  396.  * AUTHOR:   Y_Less
  397.  *
  398.  * FIX:      AddMenuItem
  399.  * PROBLEM:  Crashes when passed an invalid menu ID.
  400.  * SOLUTION: Don't hide it when passed an invalid menu.
  401.  * SEE:      "FIXES_AddMenuItem".
  402.  * AUTHOR:   Y_Less
  403.  *
  404.  * FIX:      SetMenuColumnHeader
  405.  * PROBLEM:  Crashes when passed an invalid menu ID.
  406.  * SOLUTION: Don't hide it when passed an invalid menu.
  407.  * SEE:      "FIXES_SetMenuColumnHeader".
  408.  * AUTHOR:   Y_Less
  409.  *
  410.  * FIX:      ShowMenuForPlayer
  411.  * PROBLEM:  Crashes when passed an invalid menu ID.
  412.  * SOLUTION: Don't hide it when passed an invalid menu.
  413.  * SEE:      "FIXES_ShowMenuForPlayer".
  414.  * AUTHOR:   Y_Less
  415.  *
  416.  * FIX:      HideMenuForPlayer
  417.  * PROBLEM:  Crashes when passed an invalid menu ID.
  418.  * SOLUTION: Don't hide it when passed an invalid menu.
  419.  * SEE:      "FIXES_HideMenuForPlayer".
  420.  * AUTHOR:   Y_Less
  421.  * POST:     http://forum.sa-mp.com/showpost.php?p=1787297
  422.  *
  423.  * FIX:      HideMenuForPlayer_2
  424.  * PROBLEM:  Ignores the "menuid" parameter.
  425.  * SOLUTION: Only hide the correct menu.  DEFAULTS TO FALSE!
  426.  * SEE:      "FIXES_HideMenuForPlayer".
  427.  * AUTHOR:   Y_Less
  428.  *
  429.  * FIX:      DisableMenu
  430.  * PROBLEM:  Crashes when passed an invalid menu ID.
  431.  * SOLUTION: Don't hide it when passed an invalid menu.
  432.  * SEE:      "FIXES_DisableMenu".
  433.  * AUTHOR:   Y_Less
  434.  *
  435.  * FIX:      DisableMenuRow
  436.  * PROBLEM:  Crashes when passed an invalid menu ID.
  437.  * SOLUTION: Don't hide it when passed an invalid menu.
  438.  * SEE:      "FIXES_DisableMenuRow".
  439.  * AUTHOR:   Y_Less
  440.  *
  441.  * FIX:      Menus
  442.  * PROBLEM:  All menu function fixes are included separately for major overhead.
  443.  * SOLUTION: Optionally group them all under one define.
  444.  * SEE:      "FIX_Menus", "_FIX_Menus"
  445.  * AUTHOR:   Y_Less
  446.  *
  447.  * FIX:      GetPlayerMenu
  448.  * PROBLEM:  Returns previous menu when none is displayed.
  449.  * SOLUTION: Return the correct value.
  450.  * SEE:      "FIXES_GetPlayerMenu", "OnPlayerSelectedMenuRow".
  451.  * AUTHOR:   Y_Less
  452.  * POST:     http://forum.sa-mp.com/showpost.php?p=2295867
  453.  *
  454.  * FIX:      GetPlayerInterior
  455.  * PROBLEM:  Always returns 0 for NPCs.
  456.  * SOLUTION: Return the correct value.
  457.  * SEE:      "FIXES_GetPlayerInterior", "FIXES_SetPlayerInterior".
  458.  * AUTHOR:   Y_Less/xX_Simon_Xx
  459.  * POST:     http://forum.sa-mp.com/showpost.php?p=2309246
  460.  *
  461.  * FIX:      ClearAnimations
  462.  * PROBLEM:  Use ClearAnimation while you are in a vehicle cause the player exit
  463.  *           from it.
  464.  * SOLUTION: Apply an animation instead of clear animation.
  465.  * SEE:      "FIXES_ClearAnimations".
  466.  * AUTHOR:   xX_Simon_Xx
  467.  * POST:     https://github.com/Y-Less/sa-mp-fixes/issues/4
  468.  *
  469.  * FIX:      ClearAnimations_2
  470.  * PROBLEM:  ClearAnimations doesn't do anything when the animation ends if we
  471.  *           pass 1 for the freeze parameter in ApplyAnimation.
  472.  * SOLUTION: Apply an idle animation for stop and then use ClearAnimation.
  473.  * SEE:      "FIXES_ClearAnimations".
  474.  * AUTHOR:   xX_Simon_Xx
  475.  * POST:     https://github.com/Y-Less/sa-mp-fixes/issues/4
  476.  *
  477.  * FIX:      DriveBy
  478.  * PROBLEM:  If you press KEY_CROUCH while you're passenger and if you are
  479.  *           armed, the player start to aim; if you repress KEY_CROUCH the
  480.  *           player don't return in vehicle.
  481.  * SOLUTION: Apply the animation to return the player in the vehicle.
  482.  * SEE:      "OnPlayerKeyStateChange".
  483.  * AUTHOR:   xX_Simon_Xx
  484.  * POST:     https://github.com/Y-Less/sa-mp-fixes/issues/13
  485.  *
  486.  * FIX:      GangZoneCreate
  487.  * PROBLEM:  Gang zones bug on the main map for players at certain angles
  488.  *           relative to them.
  489.  * SOLUTION: Set a non floating value for the gang zone co-ordinate.
  490.  * SEE:      "FIXES_GangZoneCreate".
  491.  * AUTHOR:   xX_Simon_Xx/Y_Less
  492.  * POST:     http://forum.sa-mp.com/showpost.php?p=2144109
  493.  *
  494.  * FIX:      SPECIAL_ACTION_PISSING
  495.  * PROBLEM:  "SPECIAL_ACTION_PISSING" isn't defined by default.
  496.  * SOLUTION: Define it.
  497.  * SEE:      N/A.
  498.  * AUTHOR:   xX_Simon_Xx
  499.  * POST:     https://github.com/Y-Less/sa-mp-fixes/issues/6
  500.  *
  501.  * FIX:      IsValidVehicle
  502.  * PROBLEM:  "IsValidVehicle" isn't defined by default.
  503.  * SOLUTION: Define it.
  504.  * SEE:      N/A.
  505.  * AUTHOR:   xX_Simon_Xx
  506.  * POST:     http://forum.sa-mp.com/showpost.php?p=2693650
  507.  *
  508.  * FIX:      ApplyAnimation
  509.  * PROBLEM:  Passing an invalid animation library in ApplyAnimation causes a
  510.  *           client crash for streamed in players.
  511.  * SOLUTION: Block ApplyAnimation when an invalid library is passed.
  512.  * SEE:      "FIXES_ApplyAnimation".
  513.  * AUTHOR:   xX_Simon_Xx
  514.  * POST:     https://github.com/Y-Less/sa-mp-fixes/issues/5
  515.  *
  516.  * FIX:      ApplyAnimation_2
  517.  * PROBLEM:  When ApplyAnimation was called the first time next the player
  518.  *           spawn, it don't work.
  519.  * SOLUTION: Apply a null animation at spawn.
  520.  * SEE:      "OnPlayerSpawn".
  521.  * AUTHOR:   xX_Simon_Xx
  522.  * POST:     https://github.com/Y-Less/sa-mp-fixes/issues/5
  523.  *
  524.  * FIX:      OnPlayerSpawn
  525.  * PROBLEM:  San Andreas deducts $100 from players.
  526.  * SOLUTION: Give them it back.
  527.  * SEE:      "OnPlayerSpawn".
  528.  * AUTHOR:   Y_Less
  529.  *
  530.  * FIX:      GetGravity
  531.  * PROBLEM:  "GetGravity" isn't defined by default.
  532.  * SOLUTION: Define it.
  533.  * SEE:      N/A.
  534.  * AUTHOR:   Whitetiger
  535.  * POST:     http://forum.sa-mp.com/showpost.php?p=1706447
  536.  *
  537.  * FIX:      gpci
  538.  * PROBLEM:  "gpci" isn't defined by default.
  539.  * SOLUTION: Define it.
  540.  * SEE:      N/A.
  541.  * AUTHOR:   xX_Simon_Xx
  542.  * POST:     http://pastebin.com/VQSGpbSm
  543.  *
  544.  * FIX:      Natives
  545.  * PROBLEM:  Several natives are included by default, this enables or disables
  546.  *           them all.  Therefore this is an umbrella fix for several fixes.
  547.  * SOLUTION: Define them.
  548.  * SEE:      "FIX_GetGravity", "FIX_gpci", "FIX_IsValidVehicle".
  549.  * AUTHOR:   Y_Less
  550.  *
  551.  * FIX:      OnPlayerConnect
  552.  * PROBLEM:  This function isn't called for players when a filterscript starts.
  553.  * SOLUTION: Call it for all connected players.
  554.  * SEE:      "FIXES_OnFilterScriptInit".
  555.  * AUTHOR:   Y_Less
  556.  *
  557.  * FIX:      OnPlayerDisconnect
  558.  * PROBLEM:  This function isn't called for players when a filterscript ends.
  559.  * SOLUTION: Call it for all connected players.
  560.  * SEE:      "FIXES_OnFilterScriptExit".
  561.  * AUTHOR:   Y_Less
  562.  *
  563.  * FIX:      GameText
  564.  * PROBLEM:  Several styles do not display for the time specified.
  565.  * SOLUTION: Recreate the styles in Text Draws and use those instead.
  566.  * SEE:      "FIXES_GameTextForAll", "FIXES_GameTextForPlayer".
  567.  * AUTHOR:   Y_Less
  568.  *
  569.  * FIX:      GameTextStyles
  570.  * PROBLEM:  San Andreas has fixed styles for area and vehicle names, but they
  571.  *           are not included in the GameText styles list.
  572.  * SOLUTION: Add them.  DEFAULTS TO FALSE.
  573.  * SEE:      "FIXES_GameTextForAll", "FIXES_GameTextForPlayer".
  574.  * AUTHOR:   Y_Less
  575.  *
  576.  * FIX:      HideGameText
  577.  * PROBLEM:  There is no "HideGameTextForXYZ" function.
  578.  * SOLUTION: Show a single space for a game text.  DEFAULTS TO FALSE.
  579.  * SEE:      "FIXES_HideGameTextForAll", "FIXES_HideGameTextForPlayer".
  580.  * AUTHOR:   Y_Less
  581.  *
  582.  * FIX:      BODYPARTS
  583.  * PROBLEM:  The bodyparts to be used in OnPlayer(Take/Give)Damage are not
  584.  *           defined by default
  585.  * SOLUTION: Define it.
  586.  * SEE:      N/A.
  587.  * AUTHOR:   Whitetiger
  588.  *
  589.  * FIX:      CAMERAMODES
  590.  * PROBLEM:  The camera modes for GetPlayerCameraMode are not defined by
  591.  *           default.
  592.  * SOLUTION: Define it.
  593.  * SEE:      N/A.
  594.  * AUTHOR:   Whitetiger
  595.  * POST:     http://forum.sa-mp.com/showpost.php?p=1309730
  596.  *
  597.  * FIX:      SetPlayerCamera
  598.  * PROBLEM:  Using the camera functions directly after enabling spectator mode
  599.  *           doesn't work.
  600.  * SOLUTION: Defer them.
  601.  * SEE:      "FIXES_SetPlayerCameraPos", "FIXES_SetPlayerCameraLookAt",
  602.  *           "FIXES_TogglePlayerSpectating".
  603.  * AUTHOR:   Emmet_
  604.  *
  605.  * ==============
  606.  *  STYLE RULES:
  607.  * ==============
  608.  *
  609.  * All globals should be "static stock" whenever possible (so they can only be
  610.  *     accessed from this one file).
  611.  *
  612.  * Statics must start with "FIXES_gs", and all other globals with "FIXES_g".
  613.  *
  614.  * All functions not overriding existing functions must start with "FIXES_".
  615.  *
  616.  * Macros must be upper case, use underscores, and start "FIXES_":
  617.  *     "FIXES_LIKE_THIS".
  618.  *
  619.  * Functions should be upper camel case (as the original functions are)
  620.  *     "FIXES_LikeThis".
  621.  *
  622.  * Globals (after the prefix) should be upper camel case "LikeThis", and locals
  623.  *     lower camel case "likeThis".
  624.  *
  625.  * ALS should be used to hook functions and callbacks.  See this topic for more
  626.  *    details:
  627.  *    
  628.  *        http://forum.sa-mp.com/showthread.php?t=441293
  629.  *
  630.  * The ALS prefix for chaining is "FIXES_".
  631.  *
  632.  * When redefining a native, add a "BAD_" external name declaration with the
  633.  *     "_ALS_" definition so that others may use the original native if they so
  634.  *     desire (with the caveat that it may break all fixes).  Note the "BAD_"
  635.  *     name is meant to indicate the possibility of breaking the fix, not a
  636.  *     comment on the original native function.
  637.  *
  638.  * The ALS hook defines used here are a little different to the normal ones as
  639.  *     this file assumes that it is always first.  The pattern is:
  640.  *    
  641.  *         #if defined _ALS_NameOfFixHere
  642.  *             #error _ALS_NameOfFixHere defined
  643.  *         #endif
  644.  *         native BAD_NameOfFixHere(params) = NameOfFixHere;
  645.  *        
  646.  *         #if FIX_NameOfFixHere
  647.  *             stock FIXES_NameOfFixHere(params)
  648.  *             {
  649.  *                 return 0;
  650.  *             }
  651.  *            
  652.  *             #define _ALS_NameOfFixHere
  653.  *             #define NameOfFixHere FIXES_NameOfFixHere
  654.  *         #endif
  655.  *    
  656.  *    A copyable version of this pattern is at the end of the file.
  657.  *
  658.  * Enums start with "E_" or "e_" depending on type, then follow rules for
  659.  *     macros.
  660.  *
  661.  * NO libraries should be included - not even the default SA:MP ones.  Let the
  662.  *     user do it.
  663.  *
  664.  * Due to the above rule, you cannot assume any third party libraries AT ALL, so
  665.  *     do not use them.  This can lead to some code duplication, but also means
  666.  *     that the version of the code used here can be tailored for optimisations.
  667.  *
  668.  * Certain terms may be shortened when dealing with long callback names to avoid
  669.  *     compile truncation warnings (max symbol length is 31).  Current list:
  670.  *    
  671.  *         "Checkpoint" -> "CP"
  672.  *         "Update"     -> "Upd"
  673.  *         "TextDraw"   -> "TD"
  674.  *         "Object"     -> "Obj"
  675.  *         "Player"     -> "P"
  676.  *
  677.  * Document all fixes at the top of the file, and highlight code.
  678.  *
  679.  * 4 space TABS - do not edit this file in PAWNO unless you know how to correct
  680.  *     the indentation.
  681.  *
  682.  * All rules have exceptions, but they must be justifiable.  For example
  683.  *     "IS_FILTERSCRIPT" is a global variable, but is not called
  684.  *     "FIXES_gIsFilterscript" to better match the "FILTERSCRIPT" macro it
  685.  *     replaces.  Now a macro for "_FIXES_gIsFilterscript".
  686.  *
  687.  * Variables which need to be fully global (i.e. not "static"), but should not
  688.  *     actually be used by other people (e.g. appear inside a macro) should be
  689.  *     prefixed with "_FIXES" instead of "FIXES" to indicate their private use.
  690.  *
  691.  * No comments beyond the end of column 80 (where the line in "PAWNO" is).
  692.  *
  693.  * If a bug is fixed in some version of the server it can be conditionally
  694.  *     included here.  This is done by checking for the existance of a native
  695.  *     function introduced in the same server version.  For example
  696.  *     "TogglePlayerControllable" was fixed in 0.3eRC6, the same time as the
  697.  *     "SetObjectMaterial" native was introduced, thus the inclusion becomes:
  698.  *    
  699.  *         #if !defined FIX_TogglePlayerControllable
  700.  *             #if defined SetObjectMaterial
  701.  *                 #define FIX_TogglePlayerControllable (0)
  702.  *             #else
  703.  *                 #define FIX_TogglePlayerControllable (1)
  704.  *             #endif
  705.  *         #elseif _FIXES_IS_UNSET(FIX_TogglePlayerControllable)
  706.  *             #undef FIX_TogglePlayerControllable
  707.  *             #define FIX_TogglePlayerControllable     (2)
  708.  *         #endif
  709.  *    
  710.  *     This only includes this fix if that native doesn't exist.  A copyable
  711.  *     version of this pattern is at the end of the file.
  712.  *
  713.  * To reduce general memory consumption, strings in this include are stored
  714.  *     globally in constant arrays and referenced.  This is EXACTLY as fast as
  715.  *     using the string constants directly, but means that strings are not
  716.  *     stored in the assembly multiple times (unless the string is only used
  717.  *     once, in which case it's more work for no gain).  See this post for more
  718.  *     details:
  719.  *    
  720.  *         http://forum.sa-mp.com/showpost.php?p=1795601
  721.  *
  722.  * Documentation explanation:
  723.  *    
  724.  *         FIX:      <Short name>
  725.  *         PROBLEM:  <Description of problem>
  726.  *         SOLUTION: <Description of solution>
  727.  *         SEE:      <List of relevant functions>
  728.  *         AUTHOR:   <Person who wrote the fix>
  729.  *         POST:     <Optional link to the original post where applicable>
  730.  *         FIXED IN: <Optional server version of official fix where applicable>
  731.  *
  732.  */
  733.  
  734. #if defined _INC_SAMP_Community_fixes
  735.     #endinput
  736. #endif
  737. #define _INC_SAMP_Community_fixes
  738.  
  739. #if !defined _inc_fixes
  740.     #define _inc_fixes
  741. #endif
  742.  
  743. #define _FIXES_IS_UNSET(%0) ((2*%0-1+1)==-1)
  744.  
  745. // We can add server version compiler code here to only compile fixes that apply
  746. // to the version of the includes for which the user is compiling.
  747. #if !defined FIX_GetPlayerColour
  748.     #if defined FIX_GetPlayerColor
  749.         #if _FIXES_IS_UNSET(FIX_GetPlayerColor)
  750.             #define FIX_GetPlayerColour   (2)
  751.         #else
  752.             #define FIX_GetPlayerColour   (FIX_GetPlayerColor)
  753.         #endif
  754.     #else
  755.         #define FIX_GetPlayerColour       (1)
  756.     #endif
  757. #elseif _FIXES_IS_UNSET(FIX_GetPlayerColour)
  758.     #undef FIX_GetPlayerColour
  759.     #define FIX_GetPlayerColour           (2)
  760. #endif
  761.  
  762. #if !defined FIX_FILTERSCRIPT
  763.     #define FIX_FILTERSCRIPT             (1)
  764. #elseif _FIXES_IS_UNSET(FIX_FILTERSCRIPT)
  765.     #undef FIX_FILTERSCRIPT
  766.     #define FIX_FILTERSCRIPT             (2)
  767. #endif
  768.  
  769. #if !defined FIX_SpawnPlayer
  770.     #define FIX_SpawnPlayer              (1)
  771. #elseif _FIXES_IS_UNSET(FIX_SpawnPlayer)
  772.     #undef FIX_SpawnPlayer
  773.     #define FIX_SpawnPlayer              (2)
  774. #endif
  775.  
  776. #if !defined FIX_SetPlayerName
  777.     #define FIX_SetPlayerName            (1)
  778. #elseif _FIXES_IS_UNSET(FIX_SetPlayerName)
  779.     #undef FIX_SetPlayerName
  780.     #define FIX_SetPlayerName            (2)
  781. #endif
  782.  
  783. #if !defined FIX_GetPlayerSkin
  784.     #define FIX_GetPlayerSkin            (1)
  785. #elseif _FIXES_IS_UNSET(FIX_GetPlayerSkin)
  786.     #undef FIX_GetPlayerSkin
  787.     #define FIX_GetPlayerSkin            (2)
  788. #endif
  789.  
  790. #if !defined FIX_GetWeaponName
  791.     #define FIX_GetWeaponName            (1)
  792. #elseif _FIXES_IS_UNSET(FIX_GetWeaponName)
  793.     #undef FIX_GetWeaponName
  794.     #define FIX_GetWeaponName            (2)
  795. #endif
  796.  
  797. #if !defined FIX_SetPlayerWorldBounds
  798.     #define FIX_SetPlayerWorldBounds     (1)
  799. #elseif _FIXES_IS_UNSET(FIX_SetPlayerWorldBounds)
  800.     #undef FIX_SetPlayerWorldBounds
  801.     #define FIX_SetPlayerWorldBounds     (2)
  802. #endif
  803.  
  804. #if !defined FIX_TogglePlayerControllable
  805.     #if defined SetObjectMaterial
  806.         #define FIX_TogglePlayerControllable (0)
  807.     #else
  808.         #define FIX_TogglePlayerControllable (1)
  809.     #endif
  810. #elseif _FIXES_IS_UNSET(FIX_TogglePlayerControllable)
  811.     #undef FIX_TogglePlayerControllable
  812.     #define FIX_TogglePlayerControllable (2)
  813. #endif
  814.  
  815. #if !defined FIX_HydraSniper
  816.     #define FIX_HydraSniper              (1)
  817. #elseif _FIXES_IS_UNSET(FIX_HydraSniper)
  818.     #undef FIX_HydraSniper
  819.     #define FIX_HydraSniper              (2)
  820. #endif
  821.  
  822. #if !defined FIX_IsPlayerInCheckpoint
  823.     #define FIX_IsPlayerInCheckpoint     (1)
  824. #elseif _FIXES_IS_UNSET(FIX_IsPlayerInCheckpoint)
  825.     #undef FIX_IsPlayerInCheckpoint
  826.     #define FIX_IsPlayerInCheckpoint     (2)
  827. #endif
  828.  
  829. #if !defined FIX_IsPlayerInRaceCheckpoint
  830.     #define FIX_IsPlayerInRaceCheckpoint (1)
  831. #elseif _FIXES_IS_UNSET(FIX_IsPlayerInRaceCheckpoint)
  832.     #undef FIX_IsPlayerInRaceCheckpoint
  833.     #define FIX_IsPlayerInRaceCheckpoint (2)
  834. #endif
  835.  
  836. #if !defined FIX_GetPlayerWeapon
  837.     #define FIX_GetPlayerWeapon          (1)
  838. #elseif _FIXES_IS_UNSET(FIX_GetPlayerWeapon)
  839.     #undef FIX_GetPlayerWeapon
  840.     #define FIX_GetPlayerWeapon          (2)
  841. #endif
  842.  
  843. #if !defined FIX_PutPlayerInVehicle
  844.     #define FIX_PutPlayerInVehicle       (1)
  845. #elseif _FIXES_IS_UNSET(FIX_PutPlayerInVehicle)
  846.     #undef FIX_PutPlayerInVehicle
  847.     #define FIX_PutPlayerInVehicle       (2)
  848. #endif
  849.  
  850. #if !defined FIX_KEY_AIM
  851.     #if defined KEY_AIM
  852.         #define FIX_KEY_AIM              (0)
  853.     #else
  854.         #define FIX_KEY_AIM              (1)
  855.     #endif
  856. #elseif _FIXES_IS_UNSET(FIX_KEY_AIM)
  857.     #undef FIX_KEY_AIM
  858.     #define FIX_KEY_AIM                  (2)
  859. #endif
  860.  
  861. #if !defined FIX_SPECIAL_ACTION_PISSING
  862.     #if defined SPECIAL_ACTION_PISSING
  863.         #define FIX_SPECIAL_ACTION_PISSING (0)
  864.     #else
  865.         #define FIX_SPECIAL_ACTION_PISSING (1)
  866.     #endif
  867. #elseif _FIXES_IS_UNSET(FIX_SPECIAL_ACTION_PISSING)
  868.     #undef FIX_SPECIAL_ACTION_PISSING
  869.     #define FIX_SPECIAL_ACTION_PISSING   (2)
  870. #endif
  871.  
  872. #if !defined FIX_Natives
  873.     #define FIX_Natives                  (1)
  874. #elseif _FIXES_IS_UNSET(FIX_Natives)
  875.     #undef FIX_Natives
  876.     #define FIX_Natives                  (2)
  877. #endif
  878.  
  879. #if !defined FIX_IsValidVehicle
  880.     #if defined IsValidVehicle
  881.         #define FIX_IsValidVehicle       (0)
  882.     #else
  883.         #define FIX_IsValidVehicle       (FIX_Natives)
  884.     #endif
  885. #elseif _FIXES_IS_UNSET(FIX_IsValidVehicle)
  886.     #undef FIX_IsValidVehicle
  887.     #define FIX_IsValidVehicle           (2)
  888. #endif
  889.  
  890. #if !defined FIX_GetGravity
  891.     #if defined GetGravity
  892.         #define FIX_GetGravity           (0)
  893.     #else
  894.         #define FIX_GetGravity           (FIX_Natives)
  895.     #endif
  896. #elseif _FIXES_IS_UNSET(FIX_GetGravity)
  897.     #undef FIX_GetGravity
  898.     #define FIX_GetGravity               (2)
  899. #endif
  900.  
  901. #if !defined FIX_gpci
  902.     #if defined gpci
  903.         #define FIX_gpci                 (0)
  904.     #else
  905.         #define FIX_gpci                 (FIX_Natives)
  906.     #endif
  907. #elseif _FIXES_IS_UNSET(FIX_gpci)
  908.     #undef FIX_gpci
  909.     #define FIX_gpci                     (2)
  910. #endif
  911.  
  912. #if !defined FIX_BODYPARTS
  913.     #if defined BODY_PART_TORSO
  914.         #define FIX_BODYPARTS            (0)
  915.     #else
  916.         #define FIX_BODYPARTS            (1)
  917.     #endif
  918. #elseif _FIXES_IS_UNSET(FIX_BODYPARTS)
  919.     #undef FIX_BODYPARTS
  920.     #define FIX_BODYPARTS                (2)
  921. #endif
  922.  
  923. #if !defined FIX_CAMERAMODES
  924.     #if defined CAM_MODE_NONE
  925.         #define FIX_CAMERAMODES          (0)
  926.     #else
  927.         #define FIX_CAMERAMODES          (1)
  928.     #endif
  929. #elseif _FIXES_IS_UNSET(FIX_CAMERAMODES)
  930.     #undef FIX_CAMERAMODES
  931.     #define FIX_CAMERAMODES              (2)
  932. #endif
  933.  
  934. #if !defined FIX_DriveBy
  935.     #define FIX_DriveBy                  (1)
  936. #elseif _FIXES_IS_UNSET(FIX_DriveBy)
  937.     #undef FIX_DriveBy
  938.     #define FIX_DriveBy                  (2)
  939. #endif
  940.  
  941. #if !defined FIX_SetPlayerCheckpoint
  942.     #define FIX_SetPlayerCheckpoint      (1)
  943. #elseif _FIXES_IS_UNSET(FIX_SetPlayerCheckpoint)
  944.     #undef FIX_SetPlayerCheckpoint
  945.     #define FIX_SetPlayerCheckpoint      (2)
  946. #endif
  947.  
  948. #if !defined FIX_SetPlayerRaceCheckpoint
  949.     #define FIX_SetPlayerRaceCheckpoint  (1)
  950. #elseif _FIXES_IS_UNSET(FIX_SetPlayerRaceCheckpoint)
  951.     #undef FIX_SetPlayerRaceCheckpoint
  952.     #define FIX_SetPlayerRaceCheckpoint  (2)
  953. #endif
  954.  
  955. #if !defined FIX_TextDrawCreate
  956.     #define FIX_TextDrawCreate           (1)
  957. #elseif _FIXES_IS_UNSET(FIX_TextDrawCreate)
  958.     #undef FIX_TextDrawCreate
  959.     #define FIX_TextDrawCreate           (2)
  960. #endif
  961.  
  962. #if !defined FIX_TextDrawSetString
  963.     #define FIX_TextDrawSetString        (1)
  964. #elseif _FIXES_IS_UNSET(FIX_TextDrawSetString)
  965.     #undef FIX_TextDrawSetString
  966.     #define FIX_TextDrawSetString        (2)
  967. #endif
  968.  
  969. #if !defined FIX_AllowInteriorWeapons
  970.     #define FIX_AllowInteriorWeapons     (1)
  971. #elseif _FIXES_IS_UNSET(FIX_AllowInteriorWeapons)
  972.     #undef FIX_AllowInteriorWeapons
  973.     #define FIX_AllowInteriorWeapons     (2)
  974. #endif
  975.  
  976. #if !defined FIX_OnPlayerEnterVehicle
  977.     #if defined OnPlayerClickMap
  978.         #define FIX_OnPlayerEnterVehicle (0)
  979.     #else
  980.         #define FIX_OnPlayerEnterVehicle (1)
  981.     #endif
  982. #elseif _FIXES_IS_UNSET(FIX_OnPlayerEnterVehicle)
  983.     #undef FIX_OnPlayerEnterVehicle
  984.     #define FIX_OnPlayerEnterVehicle     (2)
  985. #endif
  986.  
  987. #if !defined FIX_OnPlayerEnterVehicle_2
  988.     #define FIX_OnPlayerEnterVehicle_2   (1)
  989. #elseif _FIXES_IS_UNSET(FIX_OnPlayerEnterVehicle)
  990.     #undef FIX_OnPlayerEnterVehicle_2
  991.     #define FIX_OnPlayerEnterVehicle_2   (2)
  992. #endif
  993.  
  994. #if !defined FIX_AllowTeleport
  995.     #if defined OnPlayerClickMap
  996.         #define FIX_AllowTeleport        (1)
  997.     #else
  998.         #define FIX_AllowTeleport        (0)
  999.     #endif
  1000. #elseif _FIXES_IS_UNSET(FIX_AllowTeleport)
  1001.     #undef FIX_AllowTeleport
  1002.     #define FIX_AllowTeleport            (2)
  1003. #endif
  1004.  
  1005. #if !defined FIX_SetPlayerSpecialAction
  1006.     #define FIX_SetPlayerSpecialAction   (1)
  1007. #elseif _FIXES_IS_UNSET(FIX_SetPlayerSpecialAction)
  1008.     #undef FIX_SetPlayerSpecialAction
  1009.     #define FIX_SetPlayerSpecialAction   (2)
  1010. #endif
  1011.  
  1012. #if !defined FIX_ClearAnimations
  1013.     #define FIX_ClearAnimations          (1)
  1014. #elseif _FIXES_IS_UNSET(FIX_ClearAnimations)
  1015.     #undef FIX_ClearAnimations
  1016.     #define FIX_ClearAnimations          (2)
  1017. #endif
  1018.  
  1019. #if !defined FIX_ClearAnimations_2
  1020.     #define FIX_ClearAnimations_2        (1)
  1021. #elseif _FIXES_IS_UNSET(FIX_ClearAnimations_2)
  1022.     #undef FIX_ClearAnimations_2
  1023.     #define FIX_ClearAnimations_2        (2)
  1024. #endif
  1025.  
  1026. #if !defined FIX_GangZoneCreate
  1027.     #define FIX_GangZoneCreate           (1)
  1028. #elseif _FIXES_IS_UNSET(FIX_GangZoneCreate)
  1029.     #undef FIX_GangZoneCreate
  1030.     #define FIX_GangZoneCreate           (2)
  1031. #endif
  1032.  
  1033. #if !defined FIX_OnDialogResponse
  1034.     #if defined GetVehicleModelInfo
  1035.         #define FIX_OnDialogResponse     (0)
  1036.     #else
  1037.         #define FIX_OnDialogResponse     (1)
  1038.     #endif
  1039. #elseif _FIXES_IS_UNSET(FIX_OnDialogResponse)
  1040.     #undef FIX_OnDialogResponse
  1041.     #define FIX_OnDialogResponse         (2)
  1042. #endif
  1043.  
  1044. #if !defined FIX_GetPlayerDialog
  1045.     #define FIX_GetPlayerDialog          (0)
  1046. #elseif _FIXES_IS_UNSET(FIX_GetPlayerDialog)
  1047.     #undef FIX_GetPlayerDialog
  1048.     #define FIX_GetPlayerDialog          (2)
  1049. #endif
  1050.  
  1051. #if !defined FIX_PlayerDialogResponse
  1052.     #define FIX_PlayerDialogResponse     (1)
  1053. #elseif _FIXES_IS_UNSET(FIX_PlayerDialogResponse)
  1054.     #undef FIX_PlayerDialogResponse
  1055.     #define FIX_PlayerDialogResponse     (2)
  1056. #endif
  1057.  
  1058. #if !defined FIX_SetSpawnInfo
  1059.     #if defined GetPlayerVersion
  1060.         #define FIX_SetSpawnInfo         (0)
  1061.     #else
  1062.         #define FIX_SetSpawnInfo         (1)
  1063.     #endif
  1064. #elseif _FIXES_IS_UNSET(FIX_SetSpawnInfo)
  1065.     #undef FIX_SetSpawnInfo
  1066.     #define FIX_SetSpawnInfo             (2)
  1067. #endif
  1068.  
  1069. #if !defined FIX_SetPlayerSkin
  1070.     #define FIX_SetPlayerSkin            (1)
  1071. #elseif _FIXES_IS_UNSET(FIX_SetPlayerSkin)
  1072.     #undef FIX_SetPlayerSkin
  1073.     #define FIX_SetPlayerSkin            (2)
  1074. #endif
  1075.  
  1076. #if !defined FIX_HideMenuForPlayer
  1077.     #define FIX_HideMenuForPlayer        (1)
  1078. #elseif _FIXES_IS_UNSET(FIX_HideMenuForPlayer)
  1079.     #undef FIX_HideMenuForPlayer
  1080.     #define FIX_HideMenuForPlayer        (2)
  1081. #endif
  1082.  
  1083. #if !defined FIX_valstr
  1084.     #define FIX_valstr                   (1)
  1085. #elseif _FIXES_IS_UNSET(FIX_valstr)
  1086.     #undef FIX_valstr
  1087.     #define FIX_valstr                   (2)
  1088. #endif
  1089.  
  1090. #if !defined FIX_file_inc
  1091.     #define FIX_file_inc                 (0)
  1092. #elseif _FIXES_IS_UNSET(FIX_file_inc)
  1093.     #undef FIX_file_inc
  1094.     #define FIX_file_inc                 (2)
  1095. #endif
  1096.  
  1097. #if !defined FIX_fclose
  1098.     #define FIX_fclose                   (FIX_file_inc)
  1099. #elseif _FIXES_IS_UNSET(FIX_fclose)
  1100.     #undef FIX_fclose
  1101.     #define FIX_fclose                   (2)
  1102. #endif
  1103.  
  1104. #if !defined FIX_fwrite
  1105.     #define FIX_fwrite                   (FIX_file_inc)
  1106. #elseif _FIXES_IS_UNSET(FIX_fwrite)
  1107.     #undef FIX_fwrite
  1108.     #define FIX_fwrite                   (2)
  1109. #endif
  1110.  
  1111. #if !defined FIX_fread
  1112.     #define FIX_fread                    (FIX_file_inc)
  1113. #elseif _FIXES_IS_UNSET(FIX_fread)
  1114.     #undef FIX_fread
  1115.     #define FIX_fread                    (2)
  1116. #endif
  1117.  
  1118. #if !defined FIX_fputchar
  1119.     #define FIX_fputchar                 (FIX_file_inc)
  1120. #elseif _FIXES_IS_UNSET(FIX_fputchar)
  1121.     #undef FIX_fputchar
  1122.     #define FIX_fputchar                 (2)
  1123. #endif
  1124.  
  1125. #if !defined FIX_fgetchar
  1126.     #define FIX_fgetchar                 (FIX_file_inc)
  1127. #elseif _FIXES_IS_UNSET(FIX_fgetchar)
  1128.     #undef FIX_fgetchar
  1129.     #define FIX_fgetchar                 (2)
  1130. #endif
  1131.  
  1132. #if !defined FIX_fblockwrite
  1133.     #define FIX_fblockwrite              (FIX_file_inc)
  1134. #elseif _FIXES_IS_UNSET(FIX_fblockwrite)
  1135.     #undef FIX_fblockwrite
  1136.     #define FIX_fblockwrite              (2)
  1137. #endif
  1138.  
  1139. #if !defined FIX_fblockread
  1140.     #define FIX_fblockread               (FIX_file_inc)
  1141. #elseif _FIXES_IS_UNSET(FIX_fblockread)
  1142.     #undef FIX_fblockread
  1143.     #define FIX_fblockread               (2)
  1144. #endif
  1145.  
  1146. #if !defined FIX_fseek
  1147.     #define FIX_fseek                    (FIX_file_inc)
  1148. #elseif _FIXES_IS_UNSET(FIX_fseek)
  1149.     #undef FIX_fseek
  1150.     #define FIX_fseek                    (2)
  1151. #endif
  1152.  
  1153. #if !defined FIX_flength
  1154.     #define FIX_flength                  (FIX_file_inc)
  1155. #elseif _FIXES_IS_UNSET(FIX_flength)
  1156.     #undef FIX_flength
  1157.     #define FIX_flength                  (2)
  1158. #endif
  1159.  
  1160. #if !defined FIX_IsPlayerAttachedObjSlotUsed
  1161.     #define FIX_IsPlayerAttachedObjSlotUsed (1)
  1162. #elseif _FIXES_IS_UNSET(FIX_IsPlayerAttachedObjSlotUsed)
  1163.     #undef FIX_IsPlayerAttachedObjSlotUsed
  1164.     #define FIX_IsPlayerAttachedObjSlotUsed (2)
  1165. #endif
  1166.  
  1167. #if !defined FIX_SetPlayerAttachedObject
  1168.     #define FIX_SetPlayerAttachedObject  (1)
  1169. #elseif _FIXES_IS_UNSET(FIX_SetPlayerAttachedObject)
  1170.     #undef FIX_SetPlayerAttachedObject
  1171.     #define FIX_SetPlayerAttachedObject  (2)
  1172. #endif
  1173.  
  1174. #if !defined FIX_OnPlayerDeath
  1175.     #define FIX_OnPlayerDeath            (1)
  1176. #elseif _FIXES_IS_UNSET(FIX_OnPlayerDeath)
  1177.     #undef FIX_OnPlayerDeath
  1178.     #define FIX_OnPlayerDeath            (2)
  1179. #endif
  1180.  
  1181. #if !defined FIX_strins
  1182.     #define FIX_strins                   (1)
  1183. #elseif _FIXES_IS_UNSET(FIX_strins)
  1184.     #undef FIX_strins
  1185.     #define FIX_strins                   (2)
  1186. #endif
  1187.  
  1188. #if !defined FIX_IsPlayerConnected
  1189.     #define FIX_IsPlayerConnected        (1)
  1190. #elseif _FIXES_IS_UNSET(FIX_IsPlayerConnected)
  1191.     #undef FIX_IsPlayerConnected
  1192.     #define FIX_IsPlayerConnected        (2)
  1193. #endif
  1194.  
  1195. #if !defined FIX_OnPlayerCommandText
  1196.     #define FIX_OnPlayerCommandText      (1)
  1197. #elseif _FIXES_IS_UNSET(FIX_OnPlayerCommandText)
  1198.     #undef FIX_OnPlayerCommandText
  1199.     #define FIX_OnPlayerCommandText      (2)
  1200. #endif
  1201.  
  1202. #if !defined FIX_TrainExit
  1203.     #define FIX_TrainExit                (1)
  1204. #elseif _FIXES_IS_UNSET(FIX_TrainExit)
  1205.     #undef FIX_TrainExit
  1206.     #define FIX_TrainExit                (2)
  1207. #endif
  1208.  
  1209. #if !defined FIX_Kick
  1210.     #if defined EnableVehicleFriendlyFire
  1211.         #define FIX_Kick                 (0)
  1212.     #else
  1213.         #define FIX_Kick                 (1)
  1214.     #endif
  1215. #elseif _FIXES_IS_UNSET(FIX_Kick)
  1216.     #undef FIX_Kick
  1217.     #define FIX_Kick                     (2)
  1218. #endif
  1219.  
  1220. #if !defined FIX_OnVehicleMod
  1221.     #define FIX_OnVehicleMod             (1)
  1222. #elseif _FIXES_IS_UNSET(FIX_OnVehicleMod)
  1223.     #undef FIX_OnVehicleMod
  1224.     #define FIX_OnVehicleMod             (2)
  1225. #endif
  1226.  
  1227. #if !defined FIX_random
  1228.     #define FIX_random                   (0)
  1229. #elseif _FIXES_IS_UNSET(FIX_random)
  1230.     #undef FIX_random
  1231.     #define FIX_random                   (2)
  1232. #endif
  1233.  
  1234. #if !defined FIX_sleep
  1235.     #define FIX_sleep                    (1)
  1236. #elseif _FIXES_IS_UNSET(FIX_sleep)
  1237.     #undef FIX_sleep
  1238.     #define FIX_sleep                    (2)
  1239. #endif
  1240.  
  1241. #if !defined FIX_Menus
  1242.     #define FIX_Menus                    (1)
  1243. #elseif _FIXES_IS_UNSET(FIX_Menus)
  1244.     #undef FIX_Menus
  1245.     #define FIX_Menus                    (2)
  1246. #endif
  1247.  
  1248. #if !defined FIX_AddMenuItem
  1249.     #define FIX_AddMenuItem              (FIX_Menus)
  1250. #elseif _FIXES_IS_UNSET(FIX_AddMenuItem)
  1251.     #undef FIX_AddMenuItem
  1252.     #define FIX_AddMenuItem              (2)
  1253. #endif
  1254.  
  1255. #if !defined FIX_SetMenuColumnHeader
  1256.     #define FIX_SetMenuColumnHeader      (FIX_Menus)
  1257. #elseif _FIXES_IS_UNSET(FIX_SetMenuColumnHeader)
  1258.     #undef FIX_SetMenuColumnHeader
  1259.     #define FIX_SetMenuColumnHeader      (2)
  1260. #endif
  1261.  
  1262. #if !defined FIX_ShowMenuForPlayer
  1263.     #define FIX_ShowMenuForPlayer        (FIX_Menus)
  1264. #elseif _FIXES_IS_UNSET(FIX_ShowMenuForPlayer)
  1265.     #undef FIX_ShowMenuForPlayer
  1266.     #define FIX_ShowMenuForPlayer        (2)
  1267. #endif
  1268.  
  1269. #if !defined FIX_HideMenuForPlayer
  1270.     #define FIX_HideMenuForPlayer        (FIX_Menus)
  1271. #elseif _FIXES_IS_UNSET(FIX_HideMenuForPlayer)
  1272.     #undef FIX_HideMenuForPlayer
  1273.     #define FIX_HideMenuForPlayer        (2)
  1274. #endif
  1275.  
  1276. #if !defined FIX_GetPlayerMenu
  1277.     #define FIX_GetPlayerMenu            (1)
  1278. #elseif _FIXES_IS_UNSET(FIX_GetPlayerMenu)
  1279.     #undef FIX_GetPlayerMenu
  1280.     #define FIX_GetPlayerMenu            (2)
  1281. #endif
  1282.  
  1283. #if !defined FIX_HideMenuForPlayer_2
  1284.     #define FIX_HideMenuForPlayer_2      (0)
  1285. #elseif _FIXES_IS_UNSET(FIX_HideMenuForPlayer_2)
  1286.     #undef FIX_HideMenuForPlayer_2
  1287.     #define FIX_HideMenuForPlayer_2      (2)
  1288. #elseif FIX_HideMenuForPlayer_2 && !FIX_GetPlayerMenu
  1289.     #error FIX_HideMenuForPlayer_2 requires FIX_GetPlayerMenu
  1290. #endif
  1291.  
  1292. #if !defined FIX_DisableMenu
  1293.     #define FIX_DisableMenu              (FIX_Menus)
  1294. #elseif _FIXES_IS_UNSET(FIX_DisableMenu)
  1295.     #undef FIX_DisableMenu
  1296.     #define FIX_DisableMenu              (2)
  1297. #endif
  1298.  
  1299. #if !defined FIX_DisableMenuRow
  1300.     #define FIX_DisableMenuRow           (FIX_Menus)
  1301. #elseif _FIXES_IS_UNSET(FIX_DisableMenuRow)
  1302.     #undef FIX_DisableMenuRow
  1303.     #define FIX_DisableMenuRow           (2)
  1304. #endif
  1305.  
  1306. #if FIX_Menus || FIX_AddMenuItem || FIX_SetMenuColumnHeader || FIX_ShowMenuForPlayer || FIX_HideMenuForPlayer || FIX_DisableMenu || FIX_DisableMenuRow
  1307.     #define _FIX_Menus                   (1)
  1308. #else
  1309.     #define _FIX_Menus                   (2)
  1310. #endif
  1311.  
  1312. #if !defined FIX_GetPlayerInterior
  1313.     #define FIX_GetPlayerInterior        (1)
  1314. #elseif _FIXES_IS_UNSET(FIX_GetPlayerInterior)
  1315.     #undef FIX_GetPlayerInterior
  1316.     #define FIX_GetPlayerInterior        (2)
  1317. #endif
  1318.  
  1319. #if !defined FIX_ApplyAnimation
  1320.     #define FIX_ApplyAnimation           (1)
  1321. #elseif _FIXES_IS_UNSET(FIX_ApplyAnimation)
  1322.     #undef FIX_ApplyAnimation
  1323.     #define FIX_ApplyAnimation           (2)
  1324. #endif
  1325.  
  1326. #if !defined FIX_ApplyAnimation_2
  1327.     #define FIX_ApplyAnimation_2         (0)
  1328. #elseif _FIXES_IS_UNSET(FIX_ApplyAnimation_2)
  1329.     #undef FIX_ApplyAnimation_2
  1330.     #define FIX_ApplyAnimation_2         (2)
  1331. #endif
  1332.  
  1333. #if !defined FIX_OnPlayerSpawn
  1334.     #define FIX_OnPlayerSpawn            (1)
  1335. #elseif _FIXES_IS_UNSET(FIX_OnPlayerSpawn)
  1336.     #undef FIX_OnPlayerSpawn
  1337.     #define FIX_OnPlayerSpawn            (2)
  1338. #endif
  1339.  
  1340. #if !defined FIX_GameText
  1341.     #define FIX_GameText                 (1)
  1342. #elseif _FIXES_IS_UNSET(FIX_GameText)
  1343.     #undef FIX_GameText
  1344.     #define FIX_GameText                 (2)
  1345. #endif
  1346.  
  1347. #if !defined FIX_HideGameText
  1348.     #define FIX_HideGameText             (0)
  1349. #elseif _FIXES_IS_UNSET(FIX_HideGameText)
  1350.     #undef FIX_HideGameText
  1351.     #define FIX_HideGameText             (2)
  1352. #endif
  1353.  
  1354. #if !defined FIX_GameTextStyles
  1355.     #define FIX_GameTextStyles           (0)
  1356. #elseif _FIXES_IS_UNSET(FIX_GameTextStyles)
  1357.     #undef FIX_GameTextStyles
  1358.     #define FIX_GameTextStyles           (2)
  1359. #elseif FIX_GameTextStyles && !FIX_GameText
  1360.     #error FIX_GameTextStyles requires FIX_GameText
  1361. #endif
  1362.  
  1363. #if !defined FIX_OnPlayerConnect
  1364.     #define FIX_OnPlayerConnect          (1)
  1365. #elseif _FIXES_IS_UNSET(FIX_OnPlayerConnect)
  1366.     #undef FIX_OnPlayerConnect
  1367.     #define FIX_OnPlayerConnect          (2)
  1368. #endif
  1369.  
  1370. #if !defined FIX_OnPlayerDisconnect
  1371.     #define FIX_OnPlayerDisconnect       (1)
  1372. #elseif _FIXES_IS_UNSET(FIX_OnPlayerDisconnect)
  1373.     #undef FIX_OnPlayerDisconnect
  1374.     #define FIX_OnPlayerDisconnect       (2)
  1375. #endif
  1376.  
  1377. #if !defined FIX_CreatePlayerTextDraw
  1378.     #define FIX_CreatePlayerTextDraw     (1)
  1379. #elseif _FIXES_IS_UNSET(FIX_CreatePlayerTextDraw)
  1380.     #undef FIX_CreatePlayerTextDraw
  1381.     #define FIX_CreatePlayerTextDraw     (2)
  1382. #endif
  1383.  
  1384. #if !defined FIX_PlayerTextDrawSetString
  1385.     #define FIX_PlayerTextDrawSetString  (1)
  1386. #elseif _FIXES_IS_UNSET(FIX_PlayerTextDrawSetString)
  1387.     #undef FIX_PlayerTextDrawSetString
  1388.     #define FIX_PlayerTextDrawSetString  (2)
  1389. #endif
  1390.  
  1391. #if !defined FIX_SetPlayerCamera
  1392.     #define FIX_SetPlayerCamera          (1)
  1393. #elseif _FIXES_IS_UNSET(FIX_SetPlayerCamera)
  1394.     #undef FIX_SetPlayerCamera
  1395.     #define FIX_SetPlayerCamera          (2)
  1396. #endif
  1397.  
  1398. /*
  1399.  * FIXES_GT_STYLE_COUNT
  1400.  *
  1401.  * The number of GameText styles recreated using TextDraw functions.  This is 4
  1402.  * by default, but can be extended to 6 if you want location and vehicle styles.
  1403.  */
  1404.  
  1405. #if FIX_GameText
  1406.     #if FIX_GameTextStyles
  1407.         #define FIXES_GT_STYLE_COUNT (14)
  1408.     #else
  1409.         #define FIXES_GT_STYLE_COUNT (7)
  1410.     #endif
  1411. #endif
  1412.  
  1413. /*
  1414.  * FIXES_SilentKick
  1415.  *
  1416.  * If this define is set to 1, then players will not be given a message when
  1417.  * they are kicked for cheats, instead they will just loose connection to the
  1418.  * server.
  1419.  */
  1420.  
  1421. #if !defined FIXES_SilentKick
  1422.     #define FIXES_SilentKick 0
  1423. #elseif _FIXES_IS_UNSET(FIXES_SilentKick)
  1424.     #undef FIXES_SilentKick
  1425.     #define FIXES_SilentKick 2
  1426. #endif
  1427.  
  1428. /*
  1429.  * FIXES_Debug
  1430.  *
  1431.  * If this define is set to 1, then debug printing is turned on for any
  1432.  * functions which may use it.  Otherwise, the compiler entirely removes the
  1433.  * code to print anything, leaving 0 run-time overhead.
  1434.  */
  1435.  
  1436. #if defined FIXES_Debug
  1437.     #if _FIXES_IS_UNSET(FIXES_Debug)
  1438.         #undef FIXES_Debug
  1439.     #elseif FIXES_Debug == 1
  1440.         #define FIXES_PRINTF(%0); print(_FIXES_gIsFilterscript ? ("* FIXES_PRINTF (FS):") : ("* FIXES_PRINTF (GM):")),printf("*** " %0);
  1441.     #else
  1442.         #undef FIXES_Debug
  1443.     #endif
  1444. #endif
  1445.  
  1446. /*
  1447.  * FIXES_UseStateHooks
  1448.  *
  1449.  * A marker to indicate that this version of fixes.inc uses state-based hooks.
  1450.  */
  1451. #define FIXES_UseStateHooks
  1452.  
  1453. /*
  1454.  * FIXES_PRINTF
  1455.  *
  1456.  * A special "printf" function only compiled when "FIXES_Debug" is set.
  1457.  */
  1458.  
  1459. #if !defined FIXES_PRINTF
  1460.     #define FIXES_Debug 0
  1461.     #define FIXES_PRINTF(%0);
  1462. #endif
  1463.  
  1464. /*
  1465.  * INVALID_DIALOG_ID
  1466.  *
  1467.  * Set when a player can't see a dialog.
  1468.  */
  1469.  
  1470. #if !defined INVALID_DIALOG_ID
  1471.     #define INVALID_DIALOG_ID (-1)
  1472. #endif
  1473.  
  1474. /*
  1475.  * FIXES_Single
  1476.  *
  1477.  * If this define is set to 1, then the old style include is used, with no
  1478.  * support for multiple scripts running at the same time on the server (i.e. no
  1479.  * gamemodes and filter scripts at the same time).  You can only have one or the
  1480.  * other or bugs.
  1481.  */
  1482.  
  1483. #if !defined FIXES_Single
  1484.     #define FIXES_Single (1)
  1485. #elseif _FIXES_IS_UNSET(FIXES_Single)
  1486.     #undef FIXES_Single
  1487.     #define FIXES_Single (2)
  1488. #endif
  1489.  
  1490. /*
  1491.  * _FIXES_IS_IN_CHARGE
  1492.  *
  1493.  * Test to see if this script is in command or not (master).
  1494.  */
  1495.  
  1496. #if FIXES_Single
  1497.     #define _FIXES_IS_IN_CHARGE(%0)
  1498. #else
  1499.     #define _FIXES_IS_IN_CHARGE(%0) if (%0(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE))
  1500. #endif
  1501.  
  1502. /*
  1503.  * E_FIXES_WORLDBOUND_DATA
  1504.  *
  1505.  * Store data for each player on their worldbound data.
  1506.  */
  1507. enum E_FIXES_WORLDBOUND_DATA
  1508. {
  1509.     // "Previous".
  1510.     Float:E_FIXES_WORLDBOUND_DATA_PX,
  1511.     Float:E_FIXES_WORLDBOUND_DATA_PY,
  1512.     Float:E_FIXES_WORLDBOUND_DATA_PZ,
  1513.     // "Lower".
  1514.     Float:E_FIXES_WORLDBOUND_DATA_LX,
  1515.     Float:E_FIXES_WORLDBOUND_DATA_LY,
  1516.     // "Upper".
  1517.     Float:E_FIXES_WORLDBOUND_DATA_UX,
  1518.     Float:E_FIXES_WORLDBOUND_DATA_UY
  1519. }
  1520.  
  1521. /*
  1522.  * e_FIXES_BOOLS
  1523.  *
  1524.  * Collection of boolean values for players, designed to collect multiple checks
  1525.  * in to one variable to reduce memory consumption.
  1526.  */
  1527. enum e_FIXES_BOOLS (<<= 1)
  1528. {
  1529.     // Handy definition for nothing set.
  1530.     e_FIXES_BOOLS_NONE = 0,
  1531.     // Does this player have worldbounds enabled?
  1532.     e_FIXES_BOOLS_WORLDBOUNDS = 1,
  1533.     e_FIXES_BOOLS_UNCONTROLLABLE,
  1534.     e_FIXES_BOOLS_PUT_IN_VEHICLE,
  1535.     e_FIXES_BOOLS_BLOCK,
  1536.     e_FIXES_BOOLS_TELEPORT,
  1537.     e_FIXES_BOOLS_CONNECTED,
  1538.     e_FIXES_BOOLS_INTERIOR,
  1539.     e_FIXES_BOOLS_PUT_IN_TRAIN,
  1540.     e_FIXES_BOOLS_KICKED,
  1541.     e_FIXES_BOOLS_ON_PLAYER_CONNECT,
  1542.     e_FIXES_BOOLS_DRIVE_BY,
  1543.     e_FIXES_BOOLS_FIRST_SPAWN,
  1544.     e_FIXES_BOOLS_SPECTATING
  1545. }
  1546.  
  1547. /*
  1548.  * e_FIXES_SETTINGS
  1549.  *
  1550.  * Collection of boolean values for the script as a whole.  Stores a variety of
  1551.  * settings that are true/false.
  1552.  */
  1553. enum e_FIXES_SETTINGS (<<= 1)
  1554. {
  1555.     // Handy definition for nothing set.
  1556.     e_FIXES_SETTINGS_NONE = 0,
  1557.     e_FIXES_SETTINGS_INTERIOR = 1,
  1558.     e_FIXES_SETTINGS_ADMIN_TELEPORT,
  1559.     e_FIXES_SETTINGS_IN_CHARGE,
  1560.     e_FIXES_SETTINGS_DROP_ALL_DATA,
  1561.     e_FIXES_SETTINGS_MENU_SET,
  1562.     e_FIXES_SETTINGS_ENDING,
  1563.     e_FIXES_SETTINGS_ENDED,
  1564.     e_FIXES_SETTINGS_NO_GAME_TEXT,
  1565.     e_FIXES_SETTINGS_SECOND_USE
  1566. }
  1567.  
  1568. /*
  1569.  * _FIXES_CEILDIV
  1570.  *
  1571.  * Do a ceiling division of the first number by the second number.
  1572.  */
  1573. #define _FIXES_CEILDIV(%0,%1) (((%0) + (%1) - 1) / (%1))
  1574.  
  1575. /*
  1576.  * _FIXES_INFINITY
  1577.  *
  1578.  * IEEE 754 definition of infinity.
  1579.  */
  1580. #define _FIXES_INFINITY (Float:0x7F800000)
  1581.  
  1582. /*
  1583.  * _FIXES_N_INFINITY
  1584.  *
  1585.  * IEEE 754 definition of negative infinity.
  1586.  */
  1587. #define _FIXES_N_INFINITY (Float:0xFF800000)
  1588.  
  1589. /*
  1590.  * _FIXES_ATTACHMENTS
  1591.  *
  1592.  * The number of players whose attachment data (10-bits) can be stored in one
  1593.  * cell.
  1594.  */
  1595. #define _FIXES_ATTACHMENTS (cellbits / MAX_PLAYER_ATTACHED_OBJECTS)
  1596.  
  1597. /*
  1598.  * _FIXES_FOREACH
  1599.  *
  1600.  * A new version of "foreach", but just for this library.
  1601.  */
  1602. #define _FIXES_FOREACH(%1,%0) for (new %0 = MAX_PLAYERS; (%0 = %1[%0]) != MAX_PLAYERS; )
  1603.  
  1604. /*
  1605.  * _FIXES_IN_RANGE
  1606.  *
  1607.  * Checks if the first parameter is between the other two: %1 <= %0 < %2 (but
  1608.  * faster).
  1609.  */
  1610. #define _FIXES_IN_RANGE(%0,%1,%2) (((%0) - ((%1) + cellmin)) < ((%2) - ((%1) + cellmin)))
  1611.  
  1612. /*
  1613.  * _FIXES_NO_RANGE
  1614.  *
  1615.  * Checks if the first parameter is not between the other two: !(%1 <= %0 < %2)
  1616.  * (but faster).
  1617.  */
  1618. #define _FIXES_NO_RANGE(%0,%1,%2) (((%0) - ((%1) + cellmin)) >= ((%2) - ((%1) + cellmin)))
  1619.  
  1620. /*
  1621.  * _FIXES_FORWARD
  1622.  *
  1623.  * Forwards a hooked callbacks, and defines the default state implementations.
  1624.  */
  1625. #define _FIXES_FORWARD%0(%1); \
  1626.     forward%0(%1); \
  1627.     public%0(%1) <_fixes_ALS : _fixes_ALS_x0, _fixes_ALS : _fixes_ALS_x1> { return 1; } \
  1628.     public%0(%1) <> { return 1; }
  1629.  
  1630. // These varaibles are NOT pre-processor dependent as they are stock.  It's just
  1631. // simpler than trying to figure out when or if a semi-colon is needed.
  1632. #if !FIX_FILTERSCRIPT
  1633. static
  1634. #endif
  1635. stock
  1636.     /*
  1637.      * bool:_FIXES_gIsFilterscript
  1638.      *
  1639.      * Runtime equivalent of "FILTERSCRIPT" for when it is not set by the user.
  1640.      */
  1641.     bool:_FIXES_gIsFilterscript;
  1642.  
  1643. stock
  1644.     /*
  1645.      * FIXES_gscSpace[]
  1646.      *
  1647.      * A single re-usable space.
  1648.      */
  1649.     FIXES_gscSpace[] = " ";
  1650.  
  1651. #if FIXES_Debug
  1652. new
  1653. #else
  1654. static stock
  1655. #endif
  1656.     /*
  1657.      * FIXES_gsValidMenus[_FIXES_CEILDIV(MAX_MENUS, cellbits)]
  1658.      *
  1659.      * A record of which menus have and haven't been shown yet.  We ensure that
  1660.      * this only exists when required, since it depends on add and remove
  1661.      * functions to be called at the right time.
  1662.      */
  1663.  
  1664. #if _FIX_Menus || FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
  1665.     FIXES_gsPlayersIterator[MAX_PLAYERS + 1] = {0, 1, ...},
  1666. #endif
  1667.     /*
  1668.      * FIXES_gsValidMenus[_FIXES_CEILDIV(MAX_MENUS, cellbits)]
  1669.      *
  1670.      * A record of which menus have and haven't been shown yet.
  1671.      */
  1672.     FIXES_gsValidMenus[_FIXES_CEILDIV(MAX_MENUS, cellbits)],
  1673.     /*
  1674.      * FIXES_gsPlayerIP[MAX_PLAYERS]
  1675.      *
  1676.      * A player's IP as a 32-bit integer.
  1677.      */
  1678.     FIXES_gsPlayerIP[MAX_PLAYERS] = {-1, ...},
  1679.     /*
  1680.      * FIXES_gsPlayerSkin[MAX_PLAYERS]
  1681.      *
  1682.      * The skin the player is currently using.
  1683.      */
  1684.     FIXES_gsPlayerSkin[MAX_PLAYERS],
  1685.     /*
  1686.      * e_FIXES_BOOLEAN_DATA:FIXES_gsPlayerBools[MAX_PLAYERS]
  1687.      *
  1688.      * Collection of boolean values for players.
  1689.      */
  1690.     e_FIXES_BOOLS:FIXES_gsPlayerBools[MAX_PLAYERS],
  1691.     /*
  1692.      * FIXES_gsWorldbounds[MAX_PLAYERS][E_FIXES_WORLDBOUND_DATA]
  1693.      *
  1694.      * All data for players on where their worldbounds are and where they last
  1695.      * were before they went through the bounds by crouching.
  1696.      */
  1697.  
  1698. #if FIX_SetPlayerWorldBounds
  1699.     FIXES_gsWorldbounds[MAX_PLAYERS][E_FIXES_WORLDBOUND_DATA],
  1700. #endif
  1701.     /*
  1702.      * FIXES_gsPlayerWeapon[MAX_PLAYERS]
  1703.      *
  1704.      * Stores the weapon set by "SetPlayerArmedWeapon" when in a vehicle.
  1705.      */
  1706.     FIXES_gsPlayerWeapon[MAX_PLAYERS],
  1707.     /*
  1708.      * FIXES_gsVehicleSeatData[MAX_PLAYERS]
  1709.      *
  1710.      * What vehicle the player is due to go in.
  1711.      */
  1712.     FIXES_gsVehicleSeatData[MAX_PLAYERS],
  1713.     /*
  1714.      * FIXES_gsVehicleLocked[(MAX_PLAYERS * MAX_VEHICLES + cellbits - 1) / cellbits]
  1715.      *
  1716.      * Is this vehicle locked for a player.  This is a compressed 2D binary
  1717.      * array, made by concatenating many bits together (saves 1kb-3kb)!  Is
  1718.      * there a reason this array exists?
  1719.      */
  1720.     //FIXES_gsVehicleLocked[_FIXES_CEILDIV(MAX_PLAYERS * MAX_VEHICLES, cellbits)],
  1721.     /*
  1722.      * FIXES_gsDialogID[MAX_PLAYERS]
  1723.      *
  1724.      * Stores the true ID of the dialog the player is looking at to prevent
  1725.      * spoofing.
  1726.      */
  1727.     FIXES_gsDialogID[MAX_PLAYERS] = {-1, ...},
  1728.     /*
  1729.      * FIXES_gsInterior[MAX_PLAYERS]
  1730.      *
  1731.      * The player's current interior.
  1732.      */
  1733.     FIXES_gsInterior[MAX_PLAYERS],
  1734.     /*
  1735.      * e_FIXES_SETTINGS:FIXES_gsSettings
  1736.      *
  1737.      * A collection of 1-bit options, compressed together to save space.
  1738.      */
  1739.     e_FIXES_SETTINGS:FIXES_gsSettings = e_FIXES_SETTINGS_SECOND_USE,
  1740.     /*
  1741.      * FIXES_gsObjectSlots[_FIXES_CEILDIV(MAX_PLAYERS, _FIXES_ATTACHMENTS)]
  1742.      *
  1743.      * A record of which attached object slots a player has used.
  1744.      */
  1745.     FIXES_gsObjectSlots[_FIXES_CEILDIV(MAX_PLAYERS, _FIXES_ATTACHMENTS)],
  1746.     /*
  1747.      * FIXES_gsLastAnimation[MAX_PLAYERS]
  1748.      *
  1749.      * The last animation a player used.
  1750.      */
  1751.     FIXES_gsLastAnimation[MAX_PLAYERS],
  1752.     /*
  1753.      * FIXES_gsLastCash[MAX_PLAYERS]
  1754.      *
  1755.      * A player's cash before dying.
  1756.      */
  1757.     FIXES_gsLastCash[MAX_PLAYERS],
  1758.     /*
  1759.      * FIXES_gsDriveByWeapon[MAX_PLAYERS]
  1760.      *
  1761.      * The weapon to set after re-enter to vehicle.
  1762.      */
  1763.     FIXES_gsDriveByWeapon[MAX_PLAYERS],
  1764.     /*
  1765.      * FIXES_gsCurrentMenu[MAX_PLAYERS]
  1766.      *
  1767.      * The menu the player can currently see.
  1768.      */
  1769.     Menu:FIXES_gsCurrentMenu[MAX_PLAYERS] = {Menu:INVALID_MENU, ...},
  1770.     /*
  1771.      * Text:FIXES_gsGTStyle[FIXES_GT_STYLE_COUNT]
  1772.      *
  1773.      * The pre-defined TextDraw styles used to recreate the bugged GameText
  1774.      * styles for GameTextForAll.
  1775.      */
  1776.  
  1777. #if FIX_GameText
  1778.     Text:FIXES_gsGTStyle[FIXES_GT_STYLE_COUNT],
  1779. #endif
  1780.     /*
  1781.      * FIXES_gsPlayerPGTShown[FIXES_GT_STYLE_COUNT][MAX_PLAYERS + 1]
  1782.      *
  1783.      * A linked list of which players can see a certain GameText style.
  1784.      */
  1785.  
  1786. #if FIX_GameText
  1787.     FIXES_gsPlayerPGTShown[FIXES_GT_STYLE_COUNT][MAX_PLAYERS + 1],
  1788. #endif
  1789.     /*
  1790.      * PlayerText:FIXES_gsPGTStyle[FIXES_GT_STYLE_COUNT][MAX_PLAYERS]
  1791.      *
  1792.      * The predefined TextDraw styles used to recreate the bugged GameText
  1793.      * styles for GameTextForPlayer.
  1794.      */
  1795.  
  1796. #if FIX_GameText
  1797.     PlayerText:FIXES_gsPGTStyle[MAX_PLAYERS][FIXES_GT_STYLE_COUNT],
  1798. #endif
  1799.     /*
  1800.      * FIXES_gsPGTTimer[FIXES_GT_STYLE_COUNT][MAX_PLAYERS]
  1801.      *
  1802.      * The timers used to hide per-player GameText messages.
  1803.      */
  1804.  
  1805. #if FIX_GameText
  1806.     FIXES_gsGTTimer[FIXES_GT_STYLE_COUNT][MAX_PLAYERS + 1],
  1807. #endif
  1808.     /*
  1809.      * FIXES_pvarNotNewPlayer[]
  1810.      *
  1811.      * This variable records wether or not this player is brand new to the
  1812.      * server, and not just having "OnPlayerConnect" called due to a script
  1813.      * load.  There are certain functions that need applying only the very first
  1814.      * time they connect, then this gets set.
  1815.      */
  1816.     FIXES_pvarNotNewPlayer[] = "FIXES_pvarNotNewPlayer",
  1817.     /*
  1818.      * FIXES_pvarPlayerWeapon[]
  1819.      *
  1820.      * Name of the pvar in which to store the player's current weapon.
  1821.      */
  1822.     FIXES_pvarPlayerWeapon[] = "FIXES_pvarPlayerWeapon",
  1823.     /*
  1824.      * FIXES_pvarPlayerSkin[]
  1825.      *
  1826.      * Name of the pvar in which to store the player's current skin.
  1827.      */
  1828.     FIXES_pvarPlayerSkin[] = "FIXES_pvarPlayerSkin",
  1829.     /*
  1830.      * FIXES_pvarPlayerSpectate[]
  1831.      *
  1832.      * Name of the pvar in which to store the player's spectator mode.
  1833.      */
  1834.     FIXES_pvarPlayerSpectate[] = "FIXES_pvarPlayerSpectate",
  1835.     /*
  1836.      * FIXES_gscKick[]
  1837.      *
  1838.      * Name of the kick timer function.
  1839.      */
  1840.     FIXES_gscKick[] = "_FIXES_Kick",
  1841.     /*
  1842.      * FIXES_pvarKick[]
  1843.      *
  1844.      * Name of the pvar in which to store a player's kick timer.
  1845.      */
  1846.     FIXES_pvarKick[] = "FIXES_pvarKick",
  1847.     /*
  1848.      * FIXES_pvarPlayerDialog[]
  1849.      *
  1850.      * Name of the pvar in which to store the player's current dialogid.
  1851.      */
  1852.     FIXES_pvarPlayerDialog[] = "FIXES_pvarPlayerDialog",
  1853.     /*
  1854.      * FIXES_pvarPlayerInterior[]
  1855.      *
  1856.      * A player's current interior.
  1857.      */
  1858.     FIXES_pvarPlayerInterior[] = "FIXES_pvarPlayerInterior",
  1859.     /*
  1860.      * FIXES_pvarCurrentDialog[]
  1861.      *
  1862.      * Used in OnDialogResponse to be able to get the correct ID in multiple
  1863.      * scripts while still correctly resetting the ID for future use.
  1864.      */
  1865.     FIXES_pvarCurrentDialog[] = "FIXES_pvarCurrentDialog",
  1866.     /*
  1867.      * FIXES_pvarPlayerLastCash[]
  1868.      *
  1869.      * Used in OnPlayerDeath to save a player's cash before death.
  1870.      */
  1871.     FIXES_pvarPlayerLastCash[] = "FIXES_pvarPlayerLastCash",
  1872.     /*
  1873.      * FIXES_gscHideGameTextTimer[]
  1874.      *
  1875.      * Name of the GameText hide timer function.
  1876.      */
  1877.     FIXES_gscHideGameTextTimer[] = "_FIXES_HideGameTextTimer",
  1878.     /*
  1879.      * FIXES_gscDriveBy[]
  1880.      *
  1881.      * Name of the Drive-By timer function.
  1882.      */
  1883.     FIXES_gscDriveBy[] = "_FIXES_DriveBy",
  1884.     /*
  1885.      * FIXES_gscSetCamera[]
  1886.      *
  1887.      * Name of the SetCamera timer function.
  1888.      */
  1889.     FIXES_gscSetCamera[] = "_FIXES_SetCamera",
  1890.     /*
  1891.      * FIXES_gscNULL[]
  1892.      *
  1893.      * NULL.  This is stored as a global string to reduce memory usage.
  1894.      */
  1895.     FIXES_gscNULL[] = "\1";
  1896.  
  1897. static stock const
  1898.     /*
  1899.      * FIXES_gscPlayerColours[100]
  1900.      *
  1901.      * There are only 100 colours used by default, with SA:MP looping through
  1902.      * them repeatedly.
  1903.      */
  1904.  
  1905. #if FIX_GetPlayerColour
  1906.     FIXES_gscPlayerColours[100] =
  1907.         {
  1908.             0xFF8C13FF, 0xC715FFFF, 0x20B2AAFF, 0xDC143CFF, 0x6495EDFF,
  1909.             0xF0E68CFF, 0x778899FF, 0xFF1493FF, 0xF4A460FF, 0xEE82EEFF,
  1910.             0xFFD720FF, 0x8B4513FF, 0x4949A0FF, 0x148B8BFF, 0x14FF7FFF,
  1911.             0x556B2FFF, 0x0FD9FAFF, 0x10DC29FF, 0x534081FF, 0x0495CDFF,
  1912.             0xEF6CE8FF, 0xBD34DAFF, 0x247C1BFF, 0x0C8E5DFF, 0x635B03FF,
  1913.             0xCB7ED3FF, 0x65ADEBFF, 0x5C1ACCFF, 0xF2F853FF, 0x11F891FF,
  1914.             0x7B39AAFF, 0x53EB10FF, 0x54137DFF, 0x275222FF, 0xF09F5BFF,
  1915.             0x3D0A4FFF, 0x22F767FF, 0xD63034FF, 0x9A6980FF, 0xDFB935FF,
  1916.             0x3793FAFF, 0x90239DFF, 0xE9AB2FFF, 0xAF2FF3FF, 0x057F94FF,
  1917.             0xB98519FF, 0x388EEAFF, 0x028151FF, 0xA55043FF, 0x0DE018FF,
  1918.             0x93AB1CFF, 0x95BAF0FF, 0x369976FF, 0x18F71FFF, 0x4B8987FF,
  1919.             0x491B9EFF, 0x829DC7FF, 0xBCE635FF, 0xCEA6DFFF, 0x20D4ADFF,
  1920.             0x2D74FDFF, 0x3C1C0DFF, 0x12D6D4FF, 0x48C000FF, 0x2A51E2FF,
  1921.             0xE3AC12FF, 0xFC42A8FF, 0x2FC827FF, 0x1A30BFFF, 0xB740C2FF,
  1922.             0x42ACF5FF, 0x2FD9DEFF, 0xFAFB71FF, 0x05D1CDFF, 0xC471BDFF,
  1923.             0x94436EFF, 0xC1F7ECFF, 0xCE79EEFF, 0xBD1EF2FF, 0x93B7E4FF,
  1924.             0x3214AAFF, 0x184D3BFF, 0xAE4B99FF, 0x7E49D7FF, 0x4C436EFF,
  1925.             0xFA24CCFF, 0xCE76BEFF, 0xA04E0AFF, 0x9F945CFF, 0xDCDE3DFF,
  1926.             0x10C9C5FF, 0x70524DFF, 0x0BE472FF, 0x8A2CD7FF, 0x6152C2FF,
  1927.             0xCF72A9FF, 0xE59338FF, 0xEEDC2DFF, 0xD8C762FF, 0xD8C762FF
  1928.         },
  1929. #endif
  1930.     /*
  1931.      * FIXES_gscMaxPassengers[]
  1932.      *
  1933.      * This is a compressed (4-bit) list of the maximum number of passengers in
  1934.      * any vehicle, confirmed by a number of sources. "F" (15) means invalid
  1935.      * vehicle.
  1936.      */
  1937.  
  1938. #if FIX_OnPlayerEnterVehicle
  1939.     FIXES_gscMaxPassengers[] =
  1940.         {
  1941.             0x10331113, 0x11311131, 0x11331313, 0x80133301, 0x1381F110, 0x10311103, 0x10001F10, 0x11113311, 0x13113311,
  1942.             0x31101100, 0x30001301, 0x11031311, 0x11111331, 0x10013111, 0x01131100, 0x11111110, 0x11100031, 0x11130221,
  1943.             0x33113311, 0x11111101, 0x33101133, 0x101001F0, 0x03133111, 0xFF11113F, 0x13330111, 0xFF131111, 0x0000FF3F
  1944.         },
  1945. #endif
  1946.     /*
  1947.      * FIXES_gscVehicleMods[]
  1948.      *
  1949.      * This is a bit array of all the valid mods (-1000) for all vehicles (-400)
  1950.      * EXCEPT for vehicle 576 (Tornado), which has just TWO extra mods on it,
  1951.      * that should spill over in to an extra cell of data (requiring an extra
  1952.      * 848 bytes of data total to make the array work).  Instead this (hopefully
  1953.      * rare) case is handled explicitly in "OnVehicleMod".  It seems that most
  1954.      * vehicles are:
  1955.      *  
  1956.      *   0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1957.      *  
  1958.      * I don't know yet if this can be used to our advantage to improve the code
  1959.      * somehow - it seems like that would require more explicit model handling.
  1960.      */
  1961.  
  1962. #if FIX_OnVehicleMod
  1963.     FIXES_gscVehicleMods[] =
  1964.         {
  1965.             0x033C2700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1966.             0x021A27FA, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
  1967.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1968.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1969.             0x023B2785, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1970.             0x02BC4703, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1971.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1972.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1973.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1974.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1975.             0x03BA278A, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1976.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1977.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1978.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1979.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1980.             0x028E078A, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1981.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1982.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1983.             0x02310744, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1984.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1985.             0x0228073A, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1986.             0x02BD4701, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1987.             0x023A2780, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1988.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1989.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1990.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1991.             0x0228077A, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1992.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1993.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1994.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1995.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  1996.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1997.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1998.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  1999.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2000.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2001.             0x027A27CA, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2002.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2003.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2004.             0x0282278A, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
  2005.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2006.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2007.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2008.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2009.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2010.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2011.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2012.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2013.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2014.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2015.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2016.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2017.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2018.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2019.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2020.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2021.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2022.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2023.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2024.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2025.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2026.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2027.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2028.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2029.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2030.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2031.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2032.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2033.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2034.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2035.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2036.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2037.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2038.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2039.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2040.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2041.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2042.             0x023E07C0, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2043.             0x03703730, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2044.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2045.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2046.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2047.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2048.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2049.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2050.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2051.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2052.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2053.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2054.             0x031D2775, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2055.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2056.             0x02BE4788, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
  2057.             0x02010771, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2058.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2059.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2060.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2061.             0x029A0FCE, 0x00000000, 0x00FFFE00, 0x00000007, 0x0000C000, 0x00000000,
  2062.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2063.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2064.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2065.             0x03382700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2066.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2067.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2068.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2069.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2070.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2071.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2072.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2073.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2074.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2075.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2076.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2077.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2078.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2079.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2080.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2081.             0x023F8795, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2082.             0x029F078C, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
  2083.             0x029627EA, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
  2084.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2085.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2086.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2087.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2088.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2089.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2090.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2091.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2092.             0x0236C782, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2093.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2094.             0x029E1FCA, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2095.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2096.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2097.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2098.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2099.             0x02000700, 0x00000000, 0x00FFFE00, 0xFC000437, 0x00000000, 0x021C0000,
  2100.             0x02000700, 0x00000000, 0x00FFFE00, 0x03FE6007, 0x00000000, 0x00000000,
  2101.             0x02000700, 0x00000000, 0x00FFFE00, 0x00001B87, 0x00000001, 0x01E00000,
  2102.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2103.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2104.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2105.             0x039E07D2, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
  2106.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2107.             0x023CC700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00030000, 0x00000000,
  2108.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2109.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2110.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2111.             0x038E07D6, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
  2112.             0x023D0709, 0x00000000, 0x00FFFE00, 0x00000007, 0x0000C000, 0x00000000,
  2113.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2114.             0x029E1F8A, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
  2115.             0x029C077A, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
  2116.             0x02BD076C, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2117.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2118.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2119.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2120.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2121.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2122.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2123.             0x02000700, 0x00000000, 0xFFFFFE00, 0x00000007, 0x00000000, 0x000001F8,
  2124.             0x02000700, 0x00000000, 0x00FFFFFE, 0x00000007, 0xC0000000, 0x00002007,
  2125.             0xFE000700, 0x00000003, 0x00FFFE00, 0x00000007, 0x00003C00, 0x00000600,
  2126.             0xCE000700, 0xFF800000, 0x00FFFE01, 0x00000007, 0x3C000000, 0x00000000,
  2127.             0x02000700, 0x000003FC, 0x00FFFE00, 0x00000007, 0x003C0000, 0x00001800,
  2128.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2129.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2130.             0x02000700, 0x007FE000, 0x00FFFE00, 0x00000007, 0x03C00000, 0x00000000,
  2131.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2132.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000047, 0x0000003E, 0x3C000000,
  2133.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2134.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2135.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2136.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2137.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2138.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2139.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2140.             0x02000700, 0x00001C00, 0x00FFFE00, 0x0000000F, 0x00000000, 0x0003C000,
  2141.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x000003C0, 0xC0000000,
  2142.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2143.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2144.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2145.             0x029607C2, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2146.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2147.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2148.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2149.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2150.             0x03FFE7CD, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
  2151.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2152.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2153.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2154.             0x031727F1, 0x00000000, 0x00FFFE00, 0x00000007, 0x00030000, 0x00000000,
  2155.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2156.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2157.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2158.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2159.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2160.             0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  2161.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2162.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2163.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2164.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2165.             0x025627F0, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2166.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2167.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2168.             0x039E07C2, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
  2169.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2170.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2171.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2172.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2173.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2174.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2175.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
  2176.             0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000
  2177.         },
  2178. #endif
  2179.     /*
  2180.      * FIXES_gscAnimIndexes[]
  2181.      *
  2182.      * Which index each letter starts at.  Sometimes crashes the compiler...
  2183.      */
  2184.  
  2185. #if FIX_ApplyAnimation
  2186.     FIXES_gscAnimIndexes[24] =
  2187.         {
  2188.             0, 2, 21, 35, 42, 42, 53, 62, 64, 67, 68, 71, 75, 81, 82, 84, 94, 96, 104, 121, 126, 127, 130, 134
  2189.         },
  2190. #endif
  2191.     /*
  2192.      * FIXES_gscAnimLib[]
  2193.      *
  2194.      * List of valid animation libraries.
  2195.      */
  2196.  
  2197. #if FIX_ApplyAnimation || FIX_ApplyAnimation_2
  2198.     FIXES_gscAnimLib[134][] =
  2199.         {
  2200.             "AIRPORT",      "ATTRACTORS",   "BAR",          "BASEBALL",     "BD_FIRE",
  2201.             "BEACH",        "BENCHPRESS",   "BF_INJECTION", "BIKE_DBZ",     "BIKED",
  2202.             "BIKEH",        "BIKELEAP",     "BIKES",        "BIKEV",        "BLOWJOBZ",
  2203.             "BMX",          "BOMBER",       "BOX",          "BSKTBALL",     "BUDDY",
  2204.             "BUS",          "CAMERA",       "CAR",          "CAR_CHAT",     "CARRY",
  2205.             "CASINO",       "CHAINSAW",     "CHOPPA",       "CLOTHES",      "COACH",
  2206.             "COLT45",       "COP_AMBIENT",  "COP_DVBYZ",    "CRACK",        "CRIB",
  2207.             "DAM_JUMP",     "DANCING",      "DEALER",       "DILDO",        "DODGE",
  2208.             "DOZER",        "DRIVEBYS",     "FAT",          "FIGHT_B",      "FIGHT_C",
  2209.             "FIGHT_D",      "FIGHT_E",      "FINALE",       "FINALE2",      "FLAME",
  2210.             "FLOWERS",      "FOOD",         "FREEWEIGHTS",  "GANGS",        "GFUNK",
  2211.             "GHANDS",       "GHETTO_DB",    "GOGGLES",      "GRAFFITI",     "GRAVEYARD",
  2212.             "GRENADE",      "GYMNASIUM",    "HAIRCUTS",     "HEIST9",       "INT_HOUSE",
  2213.             "INT_OFFICE",   "INT_SHOP",     "JST_BUISNESS", "KART",         "KISSING",
  2214.             "KNIFE",        "LAPDAN1",      "LAPDAN2",      "LAPDAN3",      "LOWRIDER",
  2215.             "MD_CHASE",     "MD_END",       "MEDIC",        "MISC",         "MTB",
  2216.             "MUSCULAR",     "NEVADA",       "ON_LOOKERS",   "OTB",          "PARACHUTE",
  2217.             "PARK",         "PAULNMAC",     "PED",          "PLAYER_DVBYS", "PLAYIDLES",
  2218.             "POLICE",       "POOL",         "POOR",         "PYTHON",       "QUAD",
  2219.             "QUAD_DBZ",     "RAPPING",      "RIFLE",        "RIOT",         "ROB_BANK",
  2220.             "ROCKET",       "RUNNINGMAN",   "RUSTLER",      "RYDER",        "SCRATCHING",
  2221.             "SEX",          "SHAMAL",       "SHOP",         "SHOTGUN",      "SILENCED",
  2222.             "SKATE",        "SMOKING",      "SNIPER",       "SNM",          "SPRAYCAN",
  2223.             "STRIP",        "SUNBATHE",     "SWAT",         "SWEET",        "SWIM",
  2224.             "SWORD",        "TANK",         "TATTOOS",      "TEC",          "TRAIN",
  2225.             "TRUCK",        "UZI",          "VAN",          "VENDING",      "VORTEX",
  2226.             "WAYFARER",     "WEAPONS",      "WOP",          "WUZI"
  2227.         },
  2228. #endif
  2229.     /*
  2230.      * FIXES_gscDot[]
  2231.      *
  2232.      * ".".
  2233.      */
  2234.     FIXES_gscDot[] = ".",
  2235.     /*
  2236.      * FIXES_gscSpec@[]
  2237.      *
  2238.      * Specifier "".
  2239.      */
  2240.     FIXES_gscSpec@[] = "",
  2241.     /*
  2242.      * FIXES_gscSpec@i[]
  2243.      *
  2244.      * Specifier "i".
  2245.      */
  2246.     FIXES_gscSpec@i[] = "i",
  2247.     /*
  2248.      * FIXES_gscSpec@ii[]
  2249.      *
  2250.      * Specifier "ii".
  2251.      */
  2252.     FIXES_gscSpec@ii[] = "ii",
  2253.     /*
  2254.      * FIXES_gscSpec@ai[]
  2255.      *
  2256.      * Specifier "ai".
  2257.      */
  2258.     FIXES_gscSpec@ai[] = "ai",
  2259.     /*
  2260.      * FIXES_gscSpec@is[]
  2261.      *
  2262.      * Specifier "is".
  2263.      */
  2264.     FIXES_gscSpec@is[] = "is",
  2265.     /*
  2266.      * FIXES_gscSpec@iii[]
  2267.      *
  2268.      * Specifier "iii".
  2269.      */
  2270.     FIXES_gscSpec@iii[] = "iii",
  2271.     /*
  2272.      * FIXES_gscSpec@isii[]
  2273.      *
  2274.      * Specifier "isii".
  2275.      */
  2276.     FIXES_gscSpec@isii[] = "isii",
  2277.     /*
  2278.      * FIXES_gscSpec@ifff[]
  2279.      *
  2280.      * Specifier "ifff".
  2281.      */
  2282.     FIXES_gscSpec@ifff[] = "ifff",
  2283.     /*
  2284.      * FIXES_gscSpec@iifff[]
  2285.      *
  2286.      * Specifier "iifff".
  2287.      */
  2288.     FIXES_gscSpec@iifff[] = "iifff",
  2289.     /*
  2290.      * FIXES_gscSpec@iffff[]
  2291.      *
  2292.      * Specifier "iffff".
  2293.      */
  2294.     FIXES_gscSpec@iffff[] = "iffff",
  2295.     /*
  2296.      * FIXES_gscSpec@iiiis[]
  2297.      *
  2298.      * Specifier "iiiis".
  2299.      */
  2300.     FIXES_gscSpec@iiiis[] = "iiiis",
  2301.     /*
  2302.      * FIXES_gscSpec@iiiii[]
  2303.      *
  2304.      * Specifier "iiiii".
  2305.      */
  2306.     FIXES_gscSpec@iiiii[] = "iiiii",
  2307.     /*
  2308.      * FIXES_gscSpec@iiiiii[]
  2309.      *
  2310.      * Specifier "iiiiii".
  2311.      */
  2312.     FIXES_gscSpec@iiiiii[] = "iiiii",
  2313.     /*
  2314.      * FIXES_gscTempName[]
  2315.      *
  2316.      * The temporary name to give when renaming people.
  2317.      */
  2318.     FIXES_gscTempName[] = "FIXES_TEMP_NAME",
  2319.     /*
  2320.      * FIXES_gscOrderProperty[]
  2321.      *
  2322.      * The property to check for script ordering.
  2323.      */
  2324.     FIXES_gscOrderProperty[] = "FIXES_gscOrderProperty",
  2325.     /*
  2326.      * FIXES_gscNoGMProperty[]
  2327.      *
  2328.      * Call "_FIXES_DetermineOrder" in the GM or not?
  2329.      */
  2330.     FIXES_gscNoGMProperty[] = "FIXES_gscNoGMProperty",
  2331.     /*
  2332.      * FIXES_gscDetermineOrder[]
  2333.      *
  2334.      * Name of the ordering callback.
  2335.      */
  2336.     FIXES_gscDetermineOrder[] = "_FIXES_DetermineOrder",
  2337.     /*
  2338.      * FIXES_gscSetPlayerMenu[]
  2339.      *
  2340.      * Name of the remote set player menu function.
  2341.      */
  2342.     FIXES_gscSetPlayerMenu[] = "_FIXES_SetPlayerMenu",
  2343.     /*
  2344.      * FIXES_gscClearPlayerMenu[]
  2345.      *
  2346.      * Name of the remote function to clear a player's menu set.
  2347.      */
  2348.     FIXES_gscClearPlayerMenu[] = "_FIXES_ClearPlayerMenu",
  2349.     /*
  2350.      * FIXES_gscAllowTeleport[]
  2351.      *
  2352.      * Name of the remote allow teleport function.
  2353.      */
  2354.     FIXES_gscAllowTeleport[] = "_FIXES_AllowTeleport",
  2355.     /*
  2356.      * FIXES_gscPutPlayerInVehicle[]
  2357.      *
  2358.      * Name of the remote vehicle entry function.
  2359.      */
  2360.     FIXES_gscPutPlayerInVehicle[] = "_FIXES_PutPlayerInVehicle",
  2361.     /*
  2362.      * FIXES_gscAllowInteriorWeapons[]
  2363.      *
  2364.      * Name of the remote interior weapons function.
  2365.      */
  2366.     FIXES_gscAllowInteriorWeapons[] = "_FIXES_AllowInteriorWeapons",
  2367.     /*
  2368.      * FIXES_gscSetPlayerAttachedObj[]
  2369.      *
  2370.      * Name of the remote attache object function.
  2371.      */
  2372.     FIXES_gscSetPlayerAttachedObj[] = "_FIXES_SetPlayerAttachedObject",
  2373.     /*
  2374.      * FIXES_gscTogglePlayerControl[]
  2375.      *
  2376.      * Name of the remote player toggle function.
  2377.      */
  2378.     FIXES_gscTogglePlayerControl[] = "_FIXES_TogglePlayerControllable",
  2379.     /*
  2380.      * FIXES_gscSetPlayerWorldBounds[]
  2381.      *
  2382.      * Name of the remote world bounds function.
  2383.      */
  2384.     FIXES_gscSetPlayerWorldBounds[] = "_FIXES_SetPlayerWorldBounds",
  2385.     /*
  2386.      * FIXES_gscGameTextShow[]
  2387.      *
  2388.      * Name of the remote GameText show function.
  2389.      */
  2390.     FIXES_gscGameTextShow[] = "_FIXES_GameTextShow",
  2391.     /*
  2392.      * FIXES_gscReturnProperty[]
  2393.      *
  2394.      * The property for accurate returns.
  2395.      */
  2396.     FIXES_gscReturnProperty[] = "FIXES_gscReturnProperty",
  2397.     /*
  2398.      * FIXES_gscSingleProperty[]
  2399.      *
  2400.      * The property for checking this is the only running script with fixes in.
  2401.      */
  2402.     FIXES_gscSingleProperty[] = "FIXES_gscSingleProperty",
  2403.     /*
  2404.      * FIXES_gscMenuProperty[]
  2405.      *
  2406.      * The property for a player's current menu.
  2407.      */
  2408.     FIXES_gscMenuProperty[] = "FIXES_gscMenuProperty",
  2409.     /*
  2410.      * FIXES_gscFixesError[]
  2411.      *
  2412.      * Error shown when multiple scripts are detected.
  2413.      */
  2414.     FIXES_gscFixesError[] = "\7\7\7\7\7"                                                     "\n"   \
  2415.         "*** fixes.inc error: Running multiple scripts compiled with \"fixes.inc\"..."       "\n"   \
  2416.         "***     Please compile your modes with \"#define FIXES_Single 0\" at the top, as"   "\n"   \
  2417.         "***     this setting is no longer the default (to improve the more common case)."          ;
  2418.  
  2419. /*
  2420.  * _FIXES_KEY_AIM
  2421.  * KEY_AIM
  2422.  *
  2423.  * Because the default SA:MP includes missed this one.
  2424.  */
  2425. #define _FIXES_KEY_AIM                   (128)
  2426. #if FIX_KEY_AIM
  2427.     #define KEY_AIM                      _FIXES_KEY_AIM
  2428. #endif
  2429.  
  2430. /*
  2431.  * _FIXES_SPECIAL_ACTION_PISSING
  2432.  * SPECIAL_ACTION_PISSING
  2433.  *
  2434.  * Because the default SA:MP includes missed this one.
  2435.  */
  2436. #define _FIXES_SPECIAL_ACTION_PISSING    (68)
  2437. #if FIX_SPECIAL_ACTION_PISSING
  2438.     #define SPECIAL_ACTION_PISSING       _FIXES_SPECIAL_ACTION_PISSING
  2439. #endif
  2440.  
  2441. /*
  2442.  * IsValidVehicle
  2443.  *
  2444.  * Because the default SA:MP includes missed this one.
  2445.  */
  2446.  
  2447. #if FIX_IsValidVehicle
  2448.     native IsValidVehicle(vehicleid);
  2449. #endif
  2450.  
  2451. /*
  2452.  * GetGravity
  2453.  *
  2454.  * Because the default SA:MP includes missed this one.
  2455.  */
  2456.  
  2457. #if FIX_GetGravity
  2458.     native Float:GetGravity();
  2459. #endif
  2460.  
  2461. /*
  2462.  * gpci
  2463.  *
  2464.  * Because the default SA:MP includes missed this one.
  2465.  */
  2466.  
  2467. #if FIX_gpci
  2468.     native gpci(playerid, serial[], maxlen);
  2469. #endif
  2470.  
  2471. /*
  2472.  * BODYPARTS
  2473.  *
  2474.  * Because the default SA:MP includes missed these.
  2475.  */
  2476.  
  2477. #if FIX_BODYPARTS
  2478.     #define BODY_PART_TORSO                     (3)
  2479.     #define BODY_PART_GROIN                     (4)
  2480.     #define BODY_PART_LEFT_ARM                  (5)
  2481.     #define BODY_PART_RIGHT_ARM                 (6)
  2482.     #define BODY_PART_LEFT_LEG                  (7)
  2483.     #define BODY_PART_RIGHT_LEG                 (8)
  2484.     #define BODY_PART_HEAD                      (9)
  2485. #endif
  2486.  
  2487. /*
  2488.  * CAMERAMODES
  2489.  *
  2490.  * Because the default SA:MP includes missed these.
  2491.  */
  2492.  
  2493. #if FIX_CAMERAMODES
  2494.     #define CAM_MODE_DISCONNECTED               (-1)
  2495.     #define CAM_MODE_NONE                       (0)
  2496.     #define CAM_MODE_BEHINDCAR                  (3)
  2497.     #define CAM_MODE_FOLLOWPED                  (4)
  2498.     #define CAM_MODE_SNIPER                     (7)
  2499.     #define CAM_MODE_ROCKETLAUNCHER             (8)
  2500.     #define CAM_MODE_FIXED                      (15)
  2501.     #define CAM_MODE_1STPERSON                  (16)
  2502.     #define CAM_MODE_CAM_ON_A_STRING            (18)
  2503.     #define CAM_MODE_BEHINDBOAT                 (22)
  2504.     #define CAM_MODE_CAMERA                     (46)
  2505.     #define CAM_MODE_ROCKETLAUNCHER_HS          (51)
  2506.     #define CAM_MODE_AIMWEAPON                  (53)
  2507.     #define CAM_MODE_AIMWEAPON_FROMCAR          (55)
  2508.     #define CAM_MODE_DW_HELI_CHASE              (56)
  2509. #endif
  2510.  
  2511. /*
  2512.  * IS_FILTERSCRIPT
  2513.  *
  2514.  * "FILTERSCRIPT" can't always be relied on to be set.  This is not a pre-
  2515.  * processor macro, but may be better than nothing (also used internally).
  2516.  */
  2517.  
  2518. #if FIX_FILTERSCRIPT
  2519.     #define IS_FILTERSCRIPT _FIXES_gIsFilterscript
  2520. #endif
  2521.  
  2522. /*
  2523.  * _FIXES_IncludeFuncs()
  2524.  *
  2525.  * Include functions used by "SYSREQ.C".
  2526.  */
  2527.  
  2528. #if FIX_sleep
  2529.     forward _FIXES_IncludeFuncs();
  2530.    
  2531.     public _FIXES_IncludeFuncs()
  2532.     {
  2533.         #if FIX_sleep
  2534.             heapspace();
  2535.         #endif
  2536.     }
  2537. #endif
  2538.  
  2539. /*
  2540.  * _FIXES_IncludeStates()
  2541.  *
  2542.  * Define all the "_fixes_ALS" states.
  2543.  */
  2544.  
  2545. static stock _FIXES_IncludeStates() <
  2546.     _fixes_ALS : _fixes_ALS_x0,
  2547.     _fixes_ALS : _fixes_ALS_x1,
  2548.     _fixes_ALS : _fixes_ALS_x2,
  2549.     _fixes_ALS : _fixes_ALS_x3>
  2550. {
  2551. }
  2552.  
  2553. static stock _FIXES_IncludeStates() <
  2554.     _fixes_ALS : _fixes_ALS_go>
  2555. {
  2556. }
  2557.  
  2558. /*
  2559.  * entry()
  2560.  *
  2561.  * Obscure PAWN feature to detect going somewhere the code shouldn't!
  2562.  */
  2563.  
  2564. entry() <
  2565.     _fixes_ALS : _fixes_ALS_x0,
  2566.     _fixes_ALS : _fixes_ALS_x1,
  2567.     _fixes_ALS : _fixes_ALS_x2,
  2568.     _fixes_ALS : _fixes_ALS_x3>
  2569. {
  2570.     // Not allowed.
  2571.     print("\7\7\7\n*** fixes.inc warning: Entered invalid \"_fixes_ALS\" state.");
  2572.     state _fixes_ALS : _fixes_ALS_go;
  2573. }
  2574.  
  2575. entry() <
  2576.     _fixes_ALS : _fixes_ALS_go>
  2577. {
  2578.     // OK.
  2579. }
  2580.  
  2581. /*
  2582.  * FIXES_DetermineOrder()
  2583.  *
  2584.  * Figure out which script is called first by callbacks.
  2585.  */
  2586.  
  2587. #if !FIXES_Single
  2588.     forward _FIXES_DetermineOrder();
  2589.    
  2590.     static FIXES_DetermineOrder()
  2591.     {
  2592.         deleteproperty(5, FIXES_gscOrderProperty),
  2593.         // Called in the Game Mode first (thus needs correcting).
  2594.         setproperty(5, FIXES_gscNoGMProperty, 1),
  2595.         CallRemoteFunction(FIXES_gscDetermineOrder, FIXES_gscSpec@),
  2596.         deleteproperty(5, FIXES_gscNoGMProperty),
  2597.         CallRemoteFunction(FIXES_gscDetermineOrder, FIXES_gscSpec@);
  2598.     }
  2599. #endif
  2600.  
  2601. /*
  2602.  * FIXES_IsPlayerConnected(playerid)
  2603.  *
  2604.  * FIXES:
  2605.  *     IsPlayerConnected
  2606.  */
  2607.  
  2608. #if defined _ALS_IsPlayerConnected
  2609.     #error _ALS_IsPlayerConnected defined
  2610. #endif
  2611. native BAD_IsPlayerConnected(playerid) = IsPlayerConnected;
  2612.  
  2613. #if FIX_IsPlayerConnected
  2614.     stock FIXES_IsPlayerConnected(playerid)
  2615.     {
  2616.         if (playerid & 0xFFFF0000)
  2617.         {
  2618.             return false;
  2619.         }
  2620.         return IsPlayerConnected(playerid);
  2621.     }
  2622.    
  2623.     #define _ALS_IsPlayerConnected
  2624.     #define IsPlayerConnected FIXES_IsPlayerConnected
  2625. #endif
  2626.  
  2627. /*
  2628.  * _FIXES_CreateGameTextDraws(playerid, test)
  2629.  *
  2630.  * Create the text draws used to replicate game texts.
  2631.  *
  2632.  * FIXES:
  2633.  *     GameText
  2634.  */
  2635.  
  2636. #if FIX_GameText
  2637.     static _FIXES_CreateGameTextDraws(const playerid)
  2638.     {
  2639.         if (playerid == INVALID_PLAYER_ID)
  2640.         {
  2641.                 new
  2642.                     Text:t;
  2643.                
  2644.             #if FIX_GameTextStyles
  2645.                
  2646.                 // Global style 7 (vehicle name).
  2647.                 t = FIXES_gsGTStyle[7] = TextDrawCreate(608.000000, 344.000000, FIXES_gscSpace),
  2648.                 TextDrawLetterSize(t, 1.000000, 3.000000),
  2649.                 TextDrawAlignment(t, 3),
  2650.                 TextDrawColor(t, 0x36682CFF),
  2651.                 TextDrawSetShadow(t, 0),
  2652.                 TextDrawSetOutline(t, 2),
  2653.                 TextDrawBackgroundColor(t, 0x000000AA),
  2654.                 TextDrawFont(t, 2),
  2655.                 TextDrawSetProportional(t, 1),
  2656.                 TextDrawUseBox(t, true),
  2657.                 TextDrawBoxColor(t, 0x00000000),
  2658.                 TextDrawTextSize(t, 10.0, 200.0);
  2659.                
  2660.                 // Global style 8 (location name).
  2661.                 t = FIXES_gsGTStyle[8] = TextDrawCreate(608.000000, 386.500000, FIXES_gscSpace),
  2662.                 TextDrawLetterSize(t, 1.200000, 3.799998),
  2663.                 TextDrawAlignment(t, 3),
  2664.                 TextDrawColor(t, 0xACCBF1FF),
  2665.                 TextDrawSetShadow(t, 0),
  2666.                 TextDrawSetOutline(t, 2),
  2667.                 TextDrawBackgroundColor(t, 0x000000AA),
  2668.                 TextDrawFont(t, 0),
  2669.                 TextDrawSetProportional(t, 1),
  2670.                 TextDrawUseBox(t, true),
  2671.                 TextDrawBoxColor(t, 0x00000000),
  2672.                 TextDrawTextSize(t, 10.0, 200.0);
  2673.                
  2674.                 // Global style 9 (radio name).
  2675.                 t = FIXES_gsGTStyle[9] = TextDrawCreate(320.000000, 22.000000, FIXES_gscSpace),
  2676.                 TextDrawLetterSize(t, 0.600000, 1.899999),
  2677.                 TextDrawAlignment(t, 2),
  2678.                 TextDrawColor(t, 0x906210FF),
  2679.                 TextDrawSetShadow(t, 0),
  2680.                 TextDrawSetOutline(t, 1),
  2681.                 TextDrawBackgroundColor(t, 0x000000AA),
  2682.                 TextDrawFont(t, 2),
  2683.                 TextDrawSetProportional(t, 1),
  2684.                 TextDrawUseBox(t, true),
  2685.                 TextDrawBoxColor(t, 0x00000000),
  2686.                 TextDrawTextSize(t, 200.0, 620.0);
  2687.                
  2688.                 // Global style 10 (radio switch).
  2689.                 t = FIXES_gsGTStyle[10] = TextDrawCreate(320.000000, 22.000000, FIXES_gscSpace),
  2690.                 TextDrawLetterSize(t, 0.600000, 1.899999),
  2691.                 TextDrawAlignment(t, 2),
  2692.                 TextDrawColor(t, 0x969696FF),
  2693.                 TextDrawSetShadow(t, 0),
  2694.                 TextDrawSetOutline(t, 1),
  2695.                 TextDrawBackgroundColor(t, 0x000000AA),
  2696.                 TextDrawFont(t, 2),
  2697.                 TextDrawSetProportional(t, 1),
  2698.                 TextDrawUseBox(t, true),
  2699.                 TextDrawBoxColor(t, 0x00000000),
  2700.                 TextDrawTextSize(t, 200.0, 620.0);
  2701.                
  2702.                 // Global style 11 (positive money).
  2703.                 t = FIXES_gsGTStyle[11] = TextDrawCreate(607.000000, 78.000000, FIXES_gscSpace),
  2704.                 TextDrawLetterSize(t, 0.550000, 2.150000),
  2705.                 TextDrawAlignment(t, 3),
  2706.                 TextDrawColor(t, 0x36682CFF),
  2707.                 TextDrawSetShadow(t, 0),
  2708.                 TextDrawSetOutline(t, 2),
  2709.                 TextDrawBackgroundColor(t, 0x000000FF),
  2710.                 TextDrawFont(t, 3),
  2711.                 TextDrawSetProportional(t, 1),
  2712.                 TextDrawUseBox(t, true),
  2713.                 TextDrawBoxColor(t, 0x00000000),
  2714.                 TextDrawTextSize(t, 10.0, 200.0);
  2715.                
  2716.                 // Global style 12 (negative money).
  2717.                 t = FIXES_gsGTStyle[12] = TextDrawCreate(607.000000, 78.000000, FIXES_gscSpace),
  2718.                 TextDrawLetterSize(t, 0.550000, 2.150000),
  2719.                 TextDrawAlignment(t, 3),
  2720.                 TextDrawColor(t, 0xB4191DFF),
  2721.                 TextDrawSetShadow(t, 0),
  2722.                 TextDrawSetOutline(t, 2),
  2723.                 TextDrawBackgroundColor(t, 0x000000FF),
  2724.                 TextDrawFont(t, 3),
  2725.                 TextDrawSetProportional(t, 1),
  2726.                 TextDrawUseBox(t, true),
  2727.                 TextDrawBoxColor(t, 0x00000000),
  2728.                 TextDrawTextSize(t, 10.0, 200.0);
  2729.                
  2730.                 // Global style 13 (stunt).
  2731.                 t = FIXES_gsGTStyle[13] = TextDrawCreate(380.000000, 341.000000, FIXES_gscSpace),
  2732.                 TextDrawLetterSize(t, 0.579999, 2.400000),
  2733.                 TextDrawTextSize(t, 40.000000, 460.000000),
  2734.                 TextDrawAlignment(t, 2),
  2735.                 TextDrawColor(t, 0xD7D3CCFF),
  2736.                 TextDrawUseBox(t, true),
  2737.                 TextDrawBoxColor(t, 0),
  2738.                 TextDrawSetShadow(t, 2),
  2739.                 TextDrawSetOutline(t, 0),
  2740.                 TextDrawBackgroundColor(t, 0x000000AA),
  2741.                 TextDrawFont(t, 1),
  2742.                 TextDrawSetProportional(t, 1),
  2743.                
  2744.             #endif
  2745.                
  2746.                 // Global style 0.
  2747.                 t = FIXES_gsGTStyle[0] = TextDrawCreate(320.0, 214.0, FIXES_gscSpace),
  2748.                 TextDrawLetterSize(t, 1.3, 3.6),
  2749.                 TextDrawAlignment(t, 2),
  2750.                 TextDrawColor(t, 0x906210FF),
  2751.                 TextDrawSetShadow(t, 0),
  2752.                 TextDrawSetOutline(t, 2),
  2753.                 TextDrawBackgroundColor(t, 0x000000AA),
  2754.                 TextDrawFont(t, 3),
  2755.                 TextDrawSetProportional(t, 1),
  2756.                 TextDrawUseBox(t, true),
  2757.                 TextDrawBoxColor(t, 0x00000000),
  2758.                 TextDrawTextSize(t, 200.0, 620.0);
  2759.                
  2760.                 // Global style 1.
  2761.                 t = FIXES_gsGTStyle[1] = TextDrawCreate(620.0, 310.0, FIXES_gscSpace),
  2762.                 TextDrawLetterSize(t, 1.0, 2.6),
  2763.                 TextDrawAlignment(t, 3),
  2764.                 TextDrawColor(t, 0x906210FF),
  2765.                 TextDrawSetShadow(t, 0),
  2766.                 TextDrawSetOutline(t, 2),
  2767.                 TextDrawBackgroundColor(t, 0x000000AA),
  2768.                 TextDrawFont(t, 3),
  2769.                 TextDrawSetProportional(t, 1),
  2770.                 TextDrawUseBox(t, true),
  2771.                 TextDrawBoxColor(t, 0x00000000),
  2772.                 TextDrawTextSize(t, 10.0, 200.0);
  2773.                
  2774.                 // Global style 2.
  2775.                 t = FIXES_gsGTStyle[2] = TextDrawCreate(320.0, 156.0, FIXES_gscSpace),
  2776.                 TextDrawLetterSize(t, 2.1, 4.2),
  2777.                 TextDrawAlignment(t, 2),
  2778.                 TextDrawColor(t, 0xE1E1E1FF),
  2779.                 TextDrawSetShadow(t, 0),
  2780.                 TextDrawSetOutline(t, 3),
  2781.                 TextDrawBackgroundColor(t, 0x000000AA),
  2782.                 TextDrawFont(t, 0),
  2783.                 TextDrawSetProportional(t, 1),
  2784.                 TextDrawUseBox(t, true),
  2785.                 TextDrawBoxColor(t, 0x00000000),
  2786.                 TextDrawTextSize(t, 200.0, 620.0);
  2787.                
  2788.                 // Global style 3.
  2789.                 t = FIXES_gsGTStyle[3] = TextDrawCreate(320.000000, 154.500000, FIXES_gscSpace),
  2790.                 TextDrawLetterSize(t, 0.600000, 2.750000),
  2791.                 TextDrawAlignment(t, 2),
  2792.                 TextDrawColor(t, 0x906210FF),
  2793.                 TextDrawSetShadow(t, 0),
  2794.                 TextDrawSetOutline(t, 2),
  2795.                 TextDrawBackgroundColor(t, 0x000000AA),
  2796.                 TextDrawFont(t, 2),
  2797.                 TextDrawSetProportional(t, 1),
  2798.                 TextDrawUseBox(t, true),
  2799.                 TextDrawBoxColor(t, 0x00000000),
  2800.                 TextDrawTextSize(t, 200.0, 620.0);
  2801.                
  2802.                 // Global style 4.
  2803.                 t = FIXES_gsGTStyle[4] = TextDrawCreate(320.000000, 115.500000, FIXES_gscSpace),
  2804.                 TextDrawLetterSize(t, 0.600000, 2.750000),
  2805.                 TextDrawAlignment(t, 2),
  2806.                 TextDrawColor(t, 0x906210FF),
  2807.                 TextDrawSetShadow(t, 0),
  2808.                 TextDrawSetOutline(t, 2),
  2809.                 TextDrawBackgroundColor(t, 0x000000AA),
  2810.                 TextDrawFont(t, 2),
  2811.                 TextDrawSetProportional(t, 1),
  2812.                 TextDrawUseBox(t, true),
  2813.                 TextDrawBoxColor(t, 0x00000000),
  2814.                 TextDrawTextSize(t, 200.0, 620.0);
  2815.                
  2816.                 // Global style 5.
  2817.                 t = FIXES_gsGTStyle[5] = TextDrawCreate(320.0, 217.0, FIXES_gscSpace),
  2818.                 TextDrawLetterSize(t, 0.6, 2.75),
  2819.                 TextDrawAlignment(t, 2),
  2820.                 TextDrawColor(t, 0xE1E1E1FF),
  2821.                 TextDrawSetShadow(t, 0),
  2822.                 TextDrawSetOutline(t, 2),
  2823.                 TextDrawBackgroundColor(t, 0x000000AA),
  2824.                 TextDrawFont(t, 2),
  2825.                 TextDrawSetProportional(t, 1),
  2826.                 TextDrawUseBox(t, true),
  2827.                 TextDrawBoxColor(t, 0x00000000),
  2828.                 TextDrawTextSize(t, 200.0, 620.0);
  2829.                
  2830.                 // Global style 6.
  2831.                 t = FIXES_gsGTStyle[6] = TextDrawCreate(320.000000, 60.000000, FIXES_gscSpace),
  2832.                 TextDrawLetterSize(t, 1.000000, 3.599998),
  2833.                 TextDrawAlignment(t, 2),
  2834.                 TextDrawColor(t, 0xACCBF1FF),
  2835.                 TextDrawSetShadow(t, 0),
  2836.                 TextDrawSetOutline(t, 2),
  2837.                 TextDrawBackgroundColor(t, 0x000000AA),
  2838.                 TextDrawFont(t, 3),
  2839.                 TextDrawSetProportional(t, 1),
  2840.                 TextDrawUseBox(t, true),
  2841.                 TextDrawBoxColor(t, 0x00000000),
  2842.                 TextDrawTextSize(t, 200.0, 620.0);
  2843.         }
  2844.         else
  2845.         {
  2846.                 new
  2847.                     PlayerText:t;
  2848.                
  2849.             #if FIX_GameTextStyles
  2850.                
  2851.                 // Global style 7 (playerid, vehicle name).
  2852.                 t = FIXES_gsPGTStyle[playerid][7] = CreatePlayerTextDraw(playerid, 608.000000, 344.000000, FIXES_gscSpace),
  2853.                 PlayerTextDrawLetterSize(playerid, t, 1.000000, 3.000000),
  2854.                 PlayerTextDrawAlignment(playerid, t, 3),
  2855.                 PlayerTextDrawColor(playerid, t, 0x36682CFF),
  2856.                 PlayerTextDrawSetShadow(playerid, t, 0),
  2857.                 PlayerTextDrawSetOutline(playerid, t, 2),
  2858.                 PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
  2859.                 PlayerTextDrawFont(playerid, t, 2),
  2860.                 PlayerTextDrawSetProportional(playerid, t, 1),
  2861.                 PlayerTextDrawUseBox(playerid, t, true),
  2862.                 PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  2863.                 PlayerTextDrawTextSize(playerid, t, 10.0, 200.0);
  2864.                
  2865.                 // Global style 8 (playerid, location name).
  2866.                 t = FIXES_gsPGTStyle[playerid][8] = CreatePlayerTextDraw(playerid, 608.000000, 386.500000, FIXES_gscSpace),
  2867.                 PlayerTextDrawLetterSize(playerid, t, 1.200000, 3.799998),
  2868.                 PlayerTextDrawAlignment(playerid, t, 3),
  2869.                 PlayerTextDrawColor(playerid, t, 0xACCBF1FF),
  2870.                 PlayerTextDrawSetShadow(playerid, t, 0),
  2871.                 PlayerTextDrawSetOutline(playerid, t, 2),
  2872.                 PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
  2873.                 PlayerTextDrawFont(playerid, t, 0),
  2874.                 PlayerTextDrawSetProportional(playerid, t, 1),
  2875.                 PlayerTextDrawUseBox(playerid, t, true),
  2876.                 PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  2877.                 PlayerTextDrawTextSize(playerid, t, 10.0, 200.0);
  2878.                
  2879.                 // Global style 9 (playerid, radio name).
  2880.                 t = FIXES_gsPGTStyle[playerid][9] = CreatePlayerTextDraw(playerid, 320.000000, 22.000000, FIXES_gscSpace),
  2881.                 PlayerTextDrawLetterSize(playerid, t, 0.600000, 1.899999),
  2882.                 PlayerTextDrawAlignment(playerid, t, 2),
  2883.                 PlayerTextDrawColor(playerid, t, 0x906210FF),
  2884.                 PlayerTextDrawSetShadow(playerid, t, 0),
  2885.                 PlayerTextDrawSetOutline(playerid, t, 1),
  2886.                 PlayerTextDrawBackgroundColor(playerid, t, 170),
  2887.                 PlayerTextDrawFont(playerid, t, 2),
  2888.                 PlayerTextDrawSetProportional(playerid, t, 1),
  2889.                 PlayerTextDrawUseBox(playerid, t, true),
  2890.                 PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  2891.                 PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
  2892.                
  2893.                 // Global style 10 (playerid, radio switch).
  2894.                 t = FIXES_gsPGTStyle[playerid][10] = CreatePlayerTextDraw(playerid, 320.000000, 22.000000, FIXES_gscSpace),
  2895.                 PlayerTextDrawLetterSize(playerid, t, 0.600000, 1.899999),
  2896.                 PlayerTextDrawAlignment(playerid, t, 2),
  2897.                 PlayerTextDrawColor(playerid, t, 0x969696FF),
  2898.                 PlayerTextDrawSetShadow(playerid, t, 0),
  2899.                 PlayerTextDrawSetOutline(playerid, t, 1),
  2900.                 PlayerTextDrawBackgroundColor(playerid, t, 170),
  2901.                 PlayerTextDrawFont(playerid, t, 2),
  2902.                 PlayerTextDrawSetProportional(playerid, t, 1),
  2903.                 PlayerTextDrawUseBox(playerid, t, true),
  2904.                 PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  2905.                 PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
  2906.                
  2907.                 // Global style 11 (playerid, positive money).
  2908.                 t = FIXES_gsPGTStyle[playerid][11] = CreatePlayerTextDraw(playerid, 607.000000, 78.000000, FIXES_gscSpace),
  2909.                 PlayerTextDrawLetterSize(playerid, t, 0.550000, 2.150000),
  2910.                 PlayerTextDrawAlignment(playerid, t, 3),
  2911.                 PlayerTextDrawColor(playerid, t, 0x36682CFF),
  2912.                 PlayerTextDrawSetShadow(playerid, t, 0),
  2913.                 PlayerTextDrawSetOutline(playerid, t, 2),
  2914.                 PlayerTextDrawBackgroundColor(playerid, t, 0x000000FF),
  2915.                 PlayerTextDrawFont(playerid, t, 3),
  2916.                 PlayerTextDrawSetProportional(playerid, t, 1),
  2917.                 PlayerTextDrawUseBox(playerid, t, true),
  2918.                 PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  2919.                 PlayerTextDrawTextSize(playerid, t, 10.0, 200.0);
  2920.                
  2921.                 // Global style 12 (playerid, negative money).
  2922.                 t = FIXES_gsPGTStyle[playerid][12] = CreatePlayerTextDraw(playerid, 607.000000, 78.000000, FIXES_gscSpace),
  2923.                 PlayerTextDrawLetterSize(playerid, t, 0.550000, 2.150000),
  2924.                 PlayerTextDrawAlignment(playerid, t, 3),
  2925.                 PlayerTextDrawColor(playerid, t, 0xB4191DFF),
  2926.                 PlayerTextDrawSetShadow(playerid, t, 0),
  2927.                 PlayerTextDrawSetOutline(playerid, t, 2),
  2928.                 PlayerTextDrawBackgroundColor(playerid, t, 0x000000FF),
  2929.                 PlayerTextDrawFont(playerid, t, 3),
  2930.                 PlayerTextDrawSetProportional(playerid, t, 1),
  2931.                 PlayerTextDrawUseBox(playerid, t, true),
  2932.                 PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  2933.                 PlayerTextDrawTextSize(playerid, t, 10.0, 200.0);
  2934.                
  2935.                 // Global style 13 (playerid, stunt).
  2936.                 t = FIXES_gsPGTStyle[playerid][13] = CreatePlayerTextDraw(playerid, 380.000000, 341.000000, FIXES_gscSpace),
  2937.                 PlayerTextDrawLetterSize(playerid, t, 0.579999, 2.400000),
  2938.                 PlayerTextDrawTextSize(playerid, t, 40.000000, 460.000000),
  2939.                 PlayerTextDrawAlignment(playerid, t, 2),
  2940.                 PlayerTextDrawColor(playerid, t, 0xD7D3CCFF),
  2941.                 PlayerTextDrawUseBox(playerid, t, true),
  2942.                 PlayerTextDrawBoxColor(playerid, t, 0),
  2943.                 PlayerTextDrawSetShadow(playerid, t, 2),
  2944.                 PlayerTextDrawSetOutline(playerid, t, 0),
  2945.                 PlayerTextDrawBackgroundColor(playerid, t, 170),
  2946.                 PlayerTextDrawFont(playerid, t, 1),
  2947.                 PlayerTextDrawSetProportional(playerid, t, 1);
  2948.                
  2949.             #endif
  2950.                
  2951.                 // Global style 0.
  2952.                 t = FIXES_gsPGTStyle[playerid][0] = CreatePlayerTextDraw(playerid, 320.0, 214.0, FIXES_gscSpace),
  2953.                 PlayerTextDrawLetterSize(playerid, t, 1.3, 3.6),
  2954.                 PlayerTextDrawAlignment(playerid, t, 2),
  2955.                 PlayerTextDrawColor(playerid, t, 0x906210FF),
  2956.                 PlayerTextDrawSetShadow(playerid, t, 0),
  2957.                 PlayerTextDrawSetOutline(playerid, t, 2),
  2958.                 PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
  2959.                 PlayerTextDrawFont(playerid, t, 3),
  2960.                 PlayerTextDrawSetProportional(playerid, t, 1),
  2961.                 PlayerTextDrawUseBox(playerid, t, true),
  2962.                 PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  2963.                 PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
  2964.                
  2965.                 // Global style 1.
  2966.                 t = FIXES_gsPGTStyle[playerid][1] = CreatePlayerTextDraw(playerid, 620.0, 310.0, FIXES_gscSpace),
  2967.                 PlayerTextDrawLetterSize(playerid, t, 1.0, 2.6),
  2968.                 PlayerTextDrawAlignment(playerid, t, 3),
  2969.                 PlayerTextDrawColor(playerid, t, 0x906210FF),
  2970.                 PlayerTextDrawSetShadow(playerid, t, 0),
  2971.                 PlayerTextDrawSetOutline(playerid, t, 2),
  2972.                 PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
  2973.                 PlayerTextDrawFont(playerid, t, 3),
  2974.                 PlayerTextDrawSetProportional(playerid, t, 1),
  2975.                 PlayerTextDrawUseBox(playerid, t, true),
  2976.                 PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  2977.                 PlayerTextDrawTextSize(playerid, t, 10.0, 200.0);
  2978.                
  2979.                 // Global style 2.
  2980.                 t = FIXES_gsPGTStyle[playerid][2] = CreatePlayerTextDraw(playerid, 320.0, 156.0, FIXES_gscSpace),
  2981.                 PlayerTextDrawLetterSize(playerid, t, 2.1, 4.2),
  2982.                 PlayerTextDrawAlignment(playerid, t, 2),
  2983.                 PlayerTextDrawColor(playerid, t, 0xE1E1E1FF),
  2984.                 PlayerTextDrawSetShadow(playerid, t, 0),
  2985.                 PlayerTextDrawSetOutline(playerid, t, 3),
  2986.                 PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
  2987.                 PlayerTextDrawFont(playerid, t, 0),
  2988.                 PlayerTextDrawSetProportional(playerid, t, 1),
  2989.                 PlayerTextDrawUseBox(playerid, t, true),
  2990.                 PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  2991.                 PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
  2992.                
  2993.                 // Global style 3.
  2994.                 t = FIXES_gsPGTStyle[playerid][3] = CreatePlayerTextDraw(playerid, 320.000000, 154.500000, FIXES_gscSpace),
  2995.                 PlayerTextDrawLetterSize(playerid, t, 0.600000, 2.750000),
  2996.                 PlayerTextDrawAlignment(playerid, t, 2),
  2997.                 PlayerTextDrawColor(playerid, t, 0x906210FF),
  2998.                 PlayerTextDrawSetShadow(playerid, t, 0),
  2999.                 PlayerTextDrawSetOutline(playerid, t, 2),
  3000.                 PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
  3001.                 PlayerTextDrawFont(playerid, t, 2),
  3002.                 PlayerTextDrawSetProportional(playerid, t, 1),
  3003.                 PlayerTextDrawUseBox(playerid, t, true),
  3004.                 PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  3005.                 PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
  3006.                
  3007.                 // Global style 4.
  3008.                 t = FIXES_gsPGTStyle[playerid][4] = CreatePlayerTextDraw(playerid, 320.000000, 115.500000, FIXES_gscSpace),
  3009.                 PlayerTextDrawLetterSize(playerid, t, 0.600000, 2.750000),
  3010.                 PlayerTextDrawAlignment(playerid, t, 2),
  3011.                 PlayerTextDrawColor(playerid, t, 0x906210FF),
  3012.                 PlayerTextDrawSetShadow(playerid, t, 0),
  3013.                 PlayerTextDrawSetOutline(playerid, t, 2),
  3014.                 PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
  3015.                 PlayerTextDrawFont(playerid, t, 2),
  3016.                 PlayerTextDrawSetProportional(playerid, t, 1),
  3017.                 PlayerTextDrawUseBox(playerid, t, true),
  3018.                 PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  3019.                 PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
  3020.                
  3021.                 // Global style 5.
  3022.                 t = FIXES_gsPGTStyle[playerid][5] = CreatePlayerTextDraw(playerid, 320.0, 217.0, FIXES_gscSpace),
  3023.                 PlayerTextDrawLetterSize(playerid, t, 0.6, 2.75),
  3024.                 PlayerTextDrawAlignment(playerid, t, 2),
  3025.                 PlayerTextDrawColor(playerid, t, 0xE1E1E1FF),
  3026.                 PlayerTextDrawSetShadow(playerid, t, 0),
  3027.                 PlayerTextDrawSetOutline(playerid, t, 2),
  3028.                 PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
  3029.                 PlayerTextDrawFont(playerid, t, 2),
  3030.                 PlayerTextDrawSetProportional(playerid, t, 1),
  3031.                 PlayerTextDrawUseBox(playerid, t, true),
  3032.                 PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  3033.                 PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
  3034.                
  3035.                 // Global style 6.
  3036.                 t = FIXES_gsPGTStyle[playerid][6] = CreatePlayerTextDraw(playerid, 320.000000, 60.000000, FIXES_gscSpace),
  3037.                 PlayerTextDrawLetterSize(playerid, t, 1.000000, 3.599998),
  3038.                 PlayerTextDrawAlignment(playerid, t, 2),
  3039.                 PlayerTextDrawColor(playerid, t, 0xACCBF1FF),
  3040.                 PlayerTextDrawSetShadow(playerid, t, 0),
  3041.                 PlayerTextDrawSetOutline(playerid, t, 2),
  3042.                 PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
  3043.                 PlayerTextDrawFont(playerid, t, 3),
  3044.                 PlayerTextDrawSetProportional(playerid, t, 1),
  3045.                 PlayerTextDrawUseBox(playerid, t, true),
  3046.                 PlayerTextDrawBoxColor(playerid, t, 0x00000000),
  3047.                 PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
  3048.         }
  3049.     }
  3050. #endif
  3051.  
  3052. /*
  3053.  * OnFilterScriptInit()
  3054.  *
  3055.  * Set "IS_FILTERSCRIPT" to true as this callback is ONLY called if this script
  3056.  * is actually a FilterScript.  Then call "FIXES_OnScriptInit".
  3057.  *
  3058.  * FIXES:
  3059.  *     IS_FILTERSCRIPT
  3060.  *     OnPlayerConnect
  3061.  *     GameText
  3062.  */
  3063.  
  3064. public OnFilterScriptInit()
  3065. {
  3066.     // It is possible for this to be the only thing done in this function!
  3067.     _FIXES_gIsFilterscript = true;
  3068.    
  3069.     state _fixes_ALS : _fixes_ALS_go;
  3070.    
  3071.     #if FIXES_Single
  3072.         // Check this really IS the only script running.
  3073.         if (existproperty(5, FIXES_gscSingleProperty))
  3074.         {
  3075.             print(FIXES_gscFixesError);
  3076.         }
  3077.         else
  3078.         {
  3079.             FIXES_gsSettings &= ~e_FIXES_SETTINGS_SECOND_USE,
  3080.             setproperty(5, FIXES_gscSingleProperty, 1);
  3081.         }
  3082.     #endif
  3083.    
  3084.     // =================
  3085.     //  BEGIN: GameText
  3086.     // =================
  3087.     #if FIX_GameText
  3088.         for (new i = 0; i != sizeof (FIXES_gsPlayerPGTShown); ++i)
  3089.         {
  3090.             FIXES_gsPlayerPGTShown[i][MAX_PLAYERS] = MAX_PLAYERS;
  3091.         }
  3092.     #endif
  3093.     #if FIXES_Single
  3094.         #if FIX_GameText
  3095.             _FIXES_CreateGameTextDraws(INVALID_PLAYER_ID);
  3096.         #endif
  3097.         // =================
  3098.         //  END:   GameText
  3099.         // =================
  3100.     #else
  3101.         FIXES_DetermineOrder(),
  3102.         FIXES_gsSettings &= ~e_FIXES_SETTINGS_DROP_ALL_DATA;
  3103.     #endif
  3104.    
  3105.     #if !FIXES_Single && FIX_GameText && FIX_OnPlayerConnect
  3106.         FIXES_gsSettings |= e_FIXES_SETTINGS_NO_GAME_TEXT;
  3107.     #endif
  3108.     // These are all the fixes that use "_FIXES_FOREACH".
  3109.     #if FIX_OnPlayerConnect || _FIX_Menus || FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
  3110.         for (new playerid = 0; playerid != MAX_PLAYERS; ++playerid)
  3111.         {
  3112.             if (BAD_IsPlayerConnected(playerid))
  3113.             {
  3114.                 // No "defined" checks - if you don't want this fix because
  3115.                 // you don't have an "OnPlayerConnect", just don't use it!
  3116.                 // Of course, it helps that the copy of "OnPlayerConnect"
  3117.                 // in this include is almost always called!
  3118.                 #if FIX_OnPlayerConnect
  3119.                     // ========================
  3120.                     //  BEGIN: OnPlayerConnect
  3121.                     // ========================
  3122.                     OnPlayerConnect(playerid);
  3123.                     // ========================
  3124.                     //  END:   OnPlayerConnect
  3125.                     // ========================
  3126.                 #else
  3127.                     _FIXES_AddInternal(FIXES_gsPlayersIterator, playerid, MAX_PLAYERS);
  3128.                    
  3129.                     #if FIX_GameText
  3130.                         // =================
  3131.                         //  BEGIN: GameText
  3132.                         // =================
  3133.                         _FIXES_IS_IN_CHARGE()
  3134.                         {
  3135.                             _FIXES_CreateGameTextDraws(playerid);
  3136.                         }
  3137.                         // =================
  3138.                         //  END:   GameText
  3139.                         // =================
  3140.                     #endif
  3141.                 #endif
  3142.             }
  3143.         }
  3144.     #endif
  3145.     #if !FIXES_Single && FIX_GameText && FIX_OnPlayerConnect
  3146.         FIXES_gsSettings &= ~e_FIXES_SETTINGS_NO_GAME_TEXT;
  3147.     #endif
  3148.    
  3149.     return FIXES_OnFilterScriptInit();
  3150. }
  3151.  
  3152. #if defined _ALS_OnFilterScriptInit
  3153.     #error _ALS_OnFilterScriptInit defined
  3154. #endif
  3155. #define _ALS_OnFilterScriptInit
  3156. #define OnFilterScriptInit(%0) FIXES_OnFilterScriptInit(%0) <_fixes_ALS : _fixes_ALS_go>
  3157.  
  3158. _FIXES_FORWARD FIXES_OnFilterScriptInit();
  3159.  
  3160. /*
  3161.  * OnGameModeInit()
  3162.  *
  3163.  * Call "FIXES_OnScriptInit" if this is not a FilterScript.
  3164.  *
  3165.  * FIXES:
  3166.  *     IS_FILTERSCRIPT
  3167.  *     AllowInteriorWeapons
  3168.  *     AllowTeleport
  3169.  */
  3170.  
  3171. public OnGameModeInit()
  3172. {
  3173.     state _fixes_ALS : _fixes_ALS_go;
  3174.    
  3175.     #if FIXES_Single
  3176.         // Check this really IS the only script running.  Properties reset when
  3177.         // a gamemode restarts, so we don't have to worry about filterscipts
  3178.         // detecting themselves.
  3179.         if (FIXES_gsSettings & e_FIXES_SETTINGS_SECOND_USE)
  3180.         {
  3181.             if (existproperty(5, FIXES_gscSingleProperty))
  3182.             {
  3183.                 print(FIXES_gscFixesError);
  3184.             }
  3185.             else
  3186.             {
  3187.                 setproperty(5, FIXES_gscSingleProperty, 1);
  3188.             }
  3189.         }
  3190.         else
  3191.         {
  3192.             // When the server starts, we need to allow an FS to load with a GM
  3193.             // that doesn't use fixes.inc.  This is the only case where a
  3194.             // property can be set while a ganemode isn't running.  This will
  3195.             // mean that the FS won't complain if they are both using fixes, but
  3196.             // the GM still will, so all is good.
  3197.             FIXES_gsSettings |= e_FIXES_SETTINGS_SECOND_USE;
  3198.         }
  3199.     #endif
  3200.    
  3201.     // =============================
  3202.     //  BEGIN: AllowInteriorWeapons
  3203.     // =============================
  3204.     // ======================
  3205.     //  BEGIN: AllowTeleport
  3206.     // ======================
  3207.     #if FIX_AllowInteriorWeapons && FIX_AllowTeleport && !defined FILTERSCRIPT
  3208.         FIXES_gsSettings &= ~(e_FIXES_SETTINGS_INTERIOR | e_FIXES_SETTINGS_ADMIN_TELEPORT);
  3209.     #elseif FIX_AllowInteriorWeapons
  3210.         FIXES_gsSettings &= ~e_FIXES_SETTINGS_INTERIOR;
  3211.     #elseif FIX_AllowTeleport && !defined FILTERSCRIPT
  3212.         FIXES_gsSettings &= ~e_FIXES_SETTINGS_ADMIN_TELEPORT;
  3213.     #endif
  3214.     // ======================
  3215.     //  END:   AllowTeleport
  3216.     // ======================
  3217.     // ===========================
  3218.     //  END: AllowInteriorWeapons
  3219.     // ===========================
  3220.    
  3221.     #if FIX_GameText || !FIXES_Single
  3222.         if (!_FIXES_gIsFilterscript)
  3223.         {
  3224.             // =================
  3225.             //  BEGIN: GameText
  3226.             // =================
  3227.             #if FIX_GameText
  3228.                     for (new i = 0; i != sizeof (FIXES_gsPlayerPGTShown); ++i)
  3229.                     {
  3230.                         FIXES_gsPlayerPGTShown[i][MAX_PLAYERS] = MAX_PLAYERS;
  3231.                     }
  3232.                 #if FIXES_Single
  3233.                     _FIXES_CreateGameTextDraws(INVALID_PLAYER_ID);
  3234.                 #endif
  3235.             #endif
  3236.             // =================
  3237.             //  END:   GameText
  3238.             // =================
  3239.             #if !FIXES_Single
  3240.                 FIXES_DetermineOrder();
  3241.             #endif
  3242.         }
  3243.     #endif
  3244.     #if !FIXES_Single
  3245.         FIXES_gsSettings &= ~e_FIXES_SETTINGS_DROP_ALL_DATA;
  3246.     #endif
  3247.    
  3248.     return FIXES_OnGameModeInit();
  3249. }
  3250.  
  3251. #if defined _ALS_OnGameModeInit
  3252.     #error _ALS_OnGameModeInit defined
  3253. #endif
  3254. #define _ALS_OnGameModeInit
  3255. #define OnGameModeInit(%0) FIXES_OnGameModeInit(%0) <_fixes_ALS : _fixes_ALS_go>
  3256.  
  3257. _FIXES_FORWARD FIXES_OnGameModeInit();
  3258.  
  3259. /*
  3260.  * OnGameModeExit()
  3261.  *
  3262.  * Fast way of detecting not to retain any data.
  3263.  */
  3264.  
  3265. #if !FIXES_Single || FIX_PlayerDialogResponse
  3266.     public OnGameModeExit()
  3267.     {
  3268.         #if !FIXES_Single
  3269.             FIXES_gsSettings |= e_FIXES_SETTINGS_DROP_ALL_DATA;
  3270.             if (!_FIXES_gIsFilterscript && FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)
  3271.             {
  3272.                 FIXES_gsSettings |= e_FIXES_SETTINGS_ENDING,
  3273.                 FIXES_DetermineOrder();
  3274.             }
  3275.         #endif
  3276.        
  3277.         // =============================
  3278.         //  BEGIN: PlayerDialogResponse
  3279.         // =============================
  3280.         #if FIX_PlayerDialogResponse
  3281.             for (new playerid = 0; playerid != MAX_PLAYERS; ++playerid)
  3282.             {
  3283.                 ShowPlayerDialog(playerid, -1, 0, FIXES_gscSpace, FIXES_gscSpace, FIXES_gscSpace, FIXES_gscSpace);
  3284.             }
  3285.         #endif
  3286.         // =============================
  3287.         //  END:   PlayerDialogResponse
  3288.         // =============================
  3289.        
  3290.         return FIXES_OnGameModeExit();
  3291.     }
  3292.    
  3293.     #if defined _ALS_OnGameModeExit
  3294.         #error _ALS_OnGameModeExit defined
  3295.     #endif
  3296.     #define _ALS_OnGameModeExit
  3297.     #define OnGameModeExit(%0) FIXES_OnGameModeExit(%0) <_fixes_ALS : _fixes_ALS_go>
  3298.    
  3299.     _FIXES_FORWARD FIXES_OnGameModeExit();
  3300. #endif
  3301.  
  3302. /*
  3303.  * OnFilterScriptExit()
  3304.  *
  3305.  * Fast way of detecting not to retain any data.
  3306.  */
  3307.  
  3308. #if !FIXES_Single || FIX_GameText || FIX_OnPlayerDisconnect
  3309.     public OnFilterScriptExit()
  3310.     {
  3311.         #if FIX_OnPlayerDisconnect
  3312.             // Removal safe loop.
  3313.             for (new next, playerid = FIXES_gsPlayersIterator[MAX_PLAYERS]; playerid != MAX_PLAYERS; playerid = next)
  3314.             {
  3315.                 next = FIXES_gsPlayersIterator[playerid],
  3316.                 OnPlayerDisconnect(playerid, 4);
  3317.                 #if FIXES_Single
  3318.                     // =================
  3319.                     //  BEGIN: GameText
  3320.                     // =================
  3321.                     #if FIX_GameText
  3322.                         #if FIX_GameTextStyles
  3323.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][13]),
  3324.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][12]),
  3325.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][11]),
  3326.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][10]),
  3327.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][9]),
  3328.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][8]),
  3329.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][7]),
  3330.                         #endif
  3331.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][6]),
  3332.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][5]),
  3333.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][4]),
  3334.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][3]),
  3335.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][2]),
  3336.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][1]),
  3337.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][0]);
  3338.                     #endif
  3339.                 #endif
  3340.             }
  3341.         #endif
  3342.         #if FIXES_Single
  3343.             // =================
  3344.             //  BEGIN: GameText
  3345.             // =================
  3346.             #if FIX_GameText
  3347.                     FIXES_OnFilterScriptExit();
  3348.                 #if !FIX_OnPlayerDisconnect
  3349.                     _FIXES_FOREACH(FIXES_gsPlayersIterator, playerid)
  3350.                     {
  3351.                         #if FIX_GameTextStyles
  3352.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][13]),
  3353.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][12]),
  3354.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][11]),
  3355.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][10]),
  3356.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][9]),
  3357.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][8]),
  3358.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][7]),
  3359.                         #endif
  3360.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][6]),
  3361.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][5]),
  3362.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][4]),
  3363.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][3]),
  3364.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][2]),
  3365.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][1]),
  3366.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][0]);
  3367.                     }
  3368.                 #endif
  3369.                     return
  3370.                         #if FIX_GameTextStyles
  3371.                             TextDrawDestroy(FIXES_gsGTStyle[13]),
  3372.                             TextDrawDestroy(FIXES_gsGTStyle[12]),
  3373.                             TextDrawDestroy(FIXES_gsGTStyle[11]),
  3374.                             TextDrawDestroy(FIXES_gsGTStyle[10]),
  3375.                             TextDrawDestroy(FIXES_gsGTStyle[9]),
  3376.                             TextDrawDestroy(FIXES_gsGTStyle[8]),
  3377.                             TextDrawDestroy(FIXES_gsGTStyle[7]),
  3378.                         #endif
  3379.                             TextDrawDestroy(FIXES_gsGTStyle[6]),
  3380.                             TextDrawDestroy(FIXES_gsGTStyle[5]),
  3381.                             TextDrawDestroy(FIXES_gsGTStyle[4]),
  3382.                             TextDrawDestroy(FIXES_gsGTStyle[3]),
  3383.                             TextDrawDestroy(FIXES_gsGTStyle[2]),
  3384.                             TextDrawDestroy(FIXES_gsGTStyle[1]),
  3385.                             TextDrawDestroy(FIXES_gsGTStyle[0]);
  3386.             #else
  3387.                     return FIXES_OnFilterScriptExit();
  3388.             #endif
  3389.             // =================
  3390.             //  END:   GameText
  3391.             // =================
  3392.         #else
  3393.             if (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)
  3394.             {
  3395.                 FIXES_gsSettings |= e_FIXES_SETTINGS_ENDING,
  3396.                 FIXES_DetermineOrder();
  3397.             }
  3398.             return FIXES_OnFilterScriptExit();
  3399.         #endif
  3400.     }
  3401.    
  3402.     #if defined _ALS_OnFilterScriptExit
  3403.         #error _ALS_OnFilterScriptExit defined
  3404.     #endif
  3405.     #define _ALS_OnFilterScriptExit
  3406.     #define OnFilterScriptExit(%0) FIXES_OnFilterScriptExit(%0) <_fixes_ALS : _fixes_ALS_go>
  3407.    
  3408.     _FIXES_FORWARD FIXES_OnFilterScriptExit();
  3409. #endif
  3410.  
  3411. /*
  3412.  * OnPlayerCommandText(playerid, cmdtext[])
  3413.  *
  3414.  * FIXES:
  3415.  *     OnPlayerCommandText
  3416.  */
  3417.  
  3418. #if FIX_OnPlayerCommandText
  3419.     public OnPlayerCommandText(playerid, cmdtext[])
  3420.     {
  3421.         // ============================
  3422.         //  BEGIN: OnPlayerCommandText
  3423.         // ============================
  3424.         #if FIX_OnPlayerCommandText
  3425.             // If this "#if" is around the whole function, it doesn't always
  3426.             // compile properly.
  3427.             if (cmdtext[0] <= '\1')
  3428.             {
  3429.                 return FIXES_OnPlayerCommandText(playerid, FIXES_gscNULL);
  3430.             }
  3431.             else
  3432.             {
  3433.                 return FIXES_OnPlayerCommandText(playerid, cmdtext);
  3434.             }
  3435.         #endif
  3436.         // ============================
  3437.         //  END: OnPlayerCommandText
  3438.         // ============================
  3439.     }
  3440.    
  3441.     #if defined _ALS_OnPlayerCommandText
  3442.         #error _ALS_OnPlayerCommandText defined
  3443.     #endif
  3444.     #define _ALS_OnPlayerCommandText
  3445.     #define OnPlayerCommandText(%0) FIXES_OnPlayerCommandText(%0) <_fixes_ALS : _fixes_ALS_go>
  3446.    
  3447.     _FIXES_FORWARD FIXES_OnPlayerCommandText(playerid, cmdtext[]);
  3448. #endif
  3449.  
  3450. /*
  3451.  * OnPlayerConnect(playerid)
  3452.  *
  3453.  * Almost every fix uses this callback for initialisation.  It is only
  3454.  * explicitly referenced for those fixes where this is all the code.  The
  3455.  * inclusion code was approaching the 512 line length limit, so I shrank it.
  3456.  *
  3457.  * FIXES:
  3458.  *     TogglePlayerControllable
  3459.  *     SetPlayerWorldBounds
  3460.  *     GetPlayerColor
  3461.  *     SetPlayerName
  3462.  *     GetPlayerSkin
  3463.  *     IsPlayerInCheckpoint
  3464.  *     IsPlayerInRaceCheckpoint
  3465.  *     GetPlayerWeapon
  3466.  *     PutPlayerInVehicle
  3467.  *     OnPlayerEnterVehicle
  3468.  *     AllowTeleport
  3469.  *     OnDialogResponse
  3470.  *     SetSpawnInfo
  3471.  *     AllowInteriorWeapons
  3472.  *     TrainExit
  3473.  *     Kick
  3474.  *     OnPlayerEnterVehicle_2
  3475.  *     PlayerDialogResponse
  3476.  *     OnPlayerSpawn
  3477.  *     ApplyAnimation_2
  3478.  */
  3479.  
  3480. #if     FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_SetPlayerName            || FIX_GetPlayerColour
  3481.     #define _FIXES_ON_PLAYER_CONNECT
  3482. #elseif FIX_GetPlayerSkin        || FIX_IsPlayerInCheckpoint     || FIX_IsPlayerInRaceCheckpoint || FIX_GetPlayerWeapon
  3483.     #define _FIXES_ON_PLAYER_CONNECT
  3484. #elseif FIX_PutPlayerInVehicle   || FIX_OnPlayerEnterVehicle     || FIX_AllowTeleport            || FIX_OnDialogResponse
  3485.     #define _FIXES_ON_PLAYER_CONNECT
  3486. #elseif FIX_GetPlayerDialog      || FIX_SetSpawnInfo             || FIX_AllowInteriorWeapons     || FIX_TrainExit
  3487.     #define _FIXES_ON_PLAYER_CONNECT
  3488. #elseif FIX_Kick                 || FIX_OnPlayerEnterVehicle_2   || FIX_PlayerDialogResponse     || FIX_GetPlayerInterior
  3489.     #define _FIXES_ON_PLAYER_CONNECT
  3490. #elseif FIX_OnPlayerSpawn        || FIX_ApplyAnimation_2         || FIX_GameText                 || _FIX_Menus
  3491.     #define _FIXES_ON_PLAYER_CONNECT
  3492. #elseif FIX_GetPlayerMenu        || FIX_OnPlayerDisconnect       || FIX_OnPlayerConnect
  3493.     #define _FIXES_ON_PLAYER_CONNECT
  3494. #endif
  3495.  
  3496. #if defined _FIXES_ON_PLAYER_CONNECT
  3497.     public OnPlayerConnect(playerid)
  3498.     {
  3499.         #if _FIX_Menus || FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
  3500.             _FIXES_AddInternal(FIXES_gsPlayersIterator, playerid, MAX_PLAYERS);
  3501.         #endif
  3502.        
  3503.         FIXES_PRINTF("FIXES_OnPlayerConnect: %d", playerid);
  3504.         #if FIX_Kick || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_PutPlayerInVehicle || FIX_OnPlayerEnterVehicle || FIX_AllowTeleport || FIX_AllowInteriorWeapons || FIX_TrainExit || FIX_OnPlayerEnterVehicle_2 || FIX_ApplyAnimation_2
  3505.             // This is only reset when the Game Mode changes or when a new
  3506.             // player connects, which is what we want.  The other items are the
  3507.             // same, but must be done only once.  This variable will tend to
  3508.             // hold data relevant only in the master script (the first
  3509.             // filterscript).
  3510.             #if FIX_ApplyAnimation_2 && FIX_Kick
  3511.                 FIXES_gsPlayerBools[playerid] = e_FIXES_BOOLS_FIRST_SPAWN | e_FIXES_BOOLS_ON_PLAYER_CONNECT;
  3512.             #elseif FIX_ApplyAnimation_2
  3513.                 FIXES_gsPlayerBools[playerid] = e_FIXES_BOOLS_FIRST_SPAWN;
  3514.             #elseif FIX_Kick
  3515.                 FIXES_gsPlayerBools[playerid] = e_FIXES_BOOLS_ON_PLAYER_CONNECT;
  3516.             #else
  3517.                 FIXES_gsPlayerBools[playerid] = e_FIXES_BOOLS_NONE;
  3518.             #endif
  3519.         #endif
  3520.        
  3521.         // =================
  3522.         //  BEGIN: GameText
  3523.         // =================
  3524.         #if FIX_GameText
  3525.             #if !FIXES_Single
  3526.                 if (FIXES_gsSettings & (e_FIXES_SETTINGS_NO_GAME_TEXT | e_FIXES_SETTINGS_IN_CHARGE) == e_FIXES_SETTINGS_IN_CHARGE)
  3527.             #endif
  3528.                 {
  3529.                     _FIXES_CreateGameTextDraws(playerid);
  3530.                 }
  3531.         #endif
  3532.         // =================
  3533.         //  END:   GameText
  3534.         // =================
  3535.        
  3536.         #if !FIXES_Single
  3537.             if (!GetPVarInt(playerid, FIXES_pvarNotNewPlayer))
  3538.         #endif
  3539.             {
  3540.                 FIXES_PRINTF("FIXES_OnPlayerConnect: First (%d)", FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE);
  3541.                 // ======================
  3542.                 //  BEGIN: SetPlayerName
  3543.                 // ======================
  3544.                 #if FIX_SetPlayerName
  3545.                     new
  3546.                         name[MAX_PLAYER_NAME];
  3547.                     GetPlayerName(playerid, name, MAX_PLAYER_NAME);
  3548.                     if (strcmp(name, FIXES_gscTempName) == 0)
  3549.                     {
  3550.                         Kick(playerid);
  3551.                     }
  3552.                 #endif
  3553.                 // ======================
  3554.                 //  END:   SetPlayerName
  3555.                 // ======================
  3556.                
  3557.                 // =============================
  3558.                 //  BEGIN: SetPlayerWorldBounds
  3559.                 // =============================
  3560.                 #if FIX_SetPlayerWorldBounds && !FIXES_Single
  3561.                     FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] =
  3562.                         FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] =
  3563.                             FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] =
  3564.                                 FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY] =
  3565.                                     0.0;
  3566.                 #endif
  3567.                 // =============================
  3568.                 //  END:   SetPlayerWorldBounds
  3569.                 // =============================
  3570.                
  3571.                 // =======================
  3572.                 //  BEGIN: SetPlayerColor
  3573.                 // =======================
  3574.                 #if FIX_GetPlayerColour
  3575.                     SetPlayerColor(playerid, FIXES_gscPlayerColours[playerid % 100]);
  3576.                 #endif
  3577.                 // =======================
  3578.                 //  END:   SetPlayerColor
  3579.                 // =======================
  3580.                
  3581.                 // ======================
  3582.                 //  BEGIN: GetPlayerSkin
  3583.                 // ======================
  3584.                 #if FIX_GetPlayerSkin
  3585.                     #if FIXES_Single
  3586.                         FIXES_gsPlayerSkin[playerid] = 0;
  3587.                     #else
  3588.                         SetPVarInt(playerid, FIXES_pvarPlayerSkin, 0);
  3589.                     #endif
  3590.                 #endif
  3591.                 // ======================
  3592.                 //  END:   GetPlayerSkin
  3593.                 // ======================
  3594.                
  3595.                 // =============================
  3596.                 //  BEGIN: IsPlayerInCheckpoint
  3597.                 // =============================
  3598.                 #if FIX_IsPlayerInCheckpoint
  3599.                     DisablePlayerCheckpoint(playerid);
  3600.                 #endif
  3601.                 // =============================
  3602.                 //  END:   IsPlayerInCheckpoint
  3603.                 // =============================
  3604.                
  3605.                 // =================================
  3606.                 //  BEGIN: IsPlayerInRaceCheckpoint
  3607.                 // =================================
  3608.                 #if FIX_IsPlayerInRaceCheckpoint
  3609.                     DisablePlayerRaceCheckpoint(playerid);
  3610.                 #endif
  3611.                 // =================================
  3612.                 //  END:   IsPlayerInRaceCheckpoint
  3613.                 // =================================
  3614.                
  3615.                 // ========================
  3616.                 //  BEGIN: GetPlayerWeapon
  3617.                 // ========================
  3618.                 #if FIX_GetPlayerWeapon
  3619.                     #if FIXES_Single
  3620.                         FIXES_gsPlayerWeapon[playerid] = -1;
  3621.                     #else
  3622.                         SetPVarInt(playerid, FIXES_pvarPlayerWeapon, -1);
  3623.                     #endif
  3624.                 #endif
  3625.                 // ========================
  3626.                 //  END:   GetPlayerWeapon
  3627.                 // ========================
  3628.                
  3629.                 // ==========================
  3630.                 //  BEGIN: GetPlayerInterior
  3631.                 // ==========================
  3632.                 #if FIX_GetPlayerInterior
  3633.                     #if FIXES_Single
  3634.                         FIXES_gsInterior[playerid] = 0;
  3635.                     #else
  3636.                         SetPVarInt(playerid, FIXES_pvarPlayerInterior, 0);
  3637.                     #endif
  3638.                 #endif
  3639.                 // ==========================
  3640.                 //  END:   GetPlayerInterior
  3641.                 // ==========================
  3642.                
  3643.                 // =========================
  3644.                 //  BEGIN: OnDialogResponse
  3645.                 // =========================
  3646.                 #if FIX_OnDialogResponse || FIX_GetPlayerDialog
  3647.                     #if FIXES_Single
  3648.                         FIXES_gsDialogID[playerid] = INVALID_DIALOG_ID;
  3649.                     #else
  3650.                         SetPVarInt(playerid, FIXES_pvarPlayerDialog, INVALID_DIALOG_ID);
  3651.                     #endif
  3652.                 #endif
  3653.                 // =========================
  3654.                 //  END:   OnDialogResponse
  3655.                 // =========================
  3656.                
  3657.                 // =============================
  3658.                 //  BEGIN: PlayerDialogResponse
  3659.                 // =============================
  3660.                 #if FIX_PlayerDialogResponse
  3661.                     ShowPlayerDialog(playerid, -1, 0, FIXES_gscSpace, FIXES_gscSpace, FIXES_gscSpace, FIXES_gscSpace);
  3662.                 #endif
  3663.                 // =============================
  3664.                 //  END:   PlayerDialogResponse
  3665.                 // =============================
  3666.                
  3667.                 // =====================
  3668.                 //  BEGIN: SetSpawnInfo
  3669.                 // =====================
  3670.                 #if FIX_SetSpawnInfo
  3671.                     SetSpawnInfo(playerid, NO_TEAM, 0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0);
  3672.                 #endif
  3673.                 // =====================
  3674.                 //  END:   SetSpawnInfo
  3675.                 // =====================
  3676.                
  3677.                 // ======================
  3678.                 //  BEGIN: OnPlayerSpawn
  3679.                 // ======================
  3680.                 #if FIX_OnPlayerSpawn
  3681.                     #if FIXES_Single
  3682.                         FIXES_gsLastCash[playerid] = 0;
  3683.                     #else
  3684.                         SetPVarInt(playerid, FIXES_pvarPlayerLastCash, 0);
  3685.                     #endif
  3686.                 #endif
  3687.                 // ======================
  3688.                 //  END:   OnPlayerSpawn
  3689.                 // ======================
  3690.                
  3691.                 #if !FIXES_Single
  3692.                     // No longer their first time.
  3693.                     SetPVarInt(playerid, FIXES_pvarNotNewPlayer, 1);
  3694.                 #endif
  3695.             }
  3696.         // =============
  3697.         //  BEGIN: Kick
  3698.         // =============
  3699.         #if FIX_Kick
  3700.             new
  3701.                 ret = FIXES_OnPlayerConnect(playerid);
  3702.             FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_ON_PLAYER_CONNECT;
  3703.             return ret;
  3704.         #else
  3705.             return FIXES_OnPlayerConnect(playerid);
  3706.         #endif
  3707.         // =============
  3708.         //  END:   Kick
  3709.         // =============
  3710.     }
  3711.    
  3712.     #if defined _ALS_OnPlayerConnect
  3713.         #error _ALS_OnPlayerConnect defined
  3714.     #endif
  3715.     #define _ALS_OnPlayerConnect
  3716.     #define OnPlayerConnect(%0) FIXES_OnPlayerConnect(%0) <_fixes_ALS : _fixes_ALS_go>
  3717.    
  3718.     _FIXES_FORWARD FIXES_OnPlayerConnect(playerid);
  3719. #endif
  3720.  
  3721. /*
  3722.  * OnPlayerDisonnect(playerid, reason)
  3723.  *
  3724.  * FIXES:
  3725.  *     SetPlayerAttachedObject
  3726.  *     IsPlayerAttachedObjectSlotUsed
  3727.  *     Kick
  3728.  *     GetPlayerMenu
  3729.  */
  3730.  
  3731. #if FIX_SetPlayerAttachedObject || FIX_IsPlayerAttachedObjSlotUsed || FIX_Kick || (FIXES_SilentKick && (FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2)) || FIX_GetPlayerMenu || _FIX_Menus || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
  3732.     public OnPlayerDisconnect(playerid, reason)
  3733.     {
  3734.         new
  3735.             ret = FIXES_OnPlayerDisconnect(playerid, reason);
  3736.        
  3737.         // ======================
  3738.         //  BEGIN: GetPlayerMenu
  3739.         // ======================
  3740.         #if FIX_GetPlayerMenu
  3741.             FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
  3742.         #endif
  3743.         // ======================
  3744.         //  END:   GetPlayerMenu
  3745.         // ======================
  3746.        
  3747.         // ==========================
  3748.         //  BEGIN: FIXES_SilentKick
  3749.         // ==========================
  3750.         #if FIXES_SilentKick && (FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2)
  3751.             new
  3752.                 shift = FIXES_gsPlayerIP[playerid];
  3753.             if (shift != -1)
  3754.             {
  3755.                 // Unban the IP (timed out).
  3756.                 new
  3757.                     ip[16];
  3758.                 format(ip, sizeof (ip), "unbanip %d.%d.%d.%d", shift >>> 24, (shift >>> 16) & 0xFF, (shift >>> 8) & 0xFF, shift & 0xFF),
  3759.                 FIXES_gsPlayerIP[playerid] = -1;
  3760.             }
  3761.         #endif
  3762.         // ==========================
  3763.         //  END:   FIXES_SilentKick
  3764.         // ==========================
  3765.        
  3766.         // ================================
  3767.         //  BEGIN: SetPlayerAttachedObject
  3768.         // ================================
  3769.         #if FIX_SetPlayerAttachedObject
  3770.             #if !(FIXES_SilentKick && (FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2))
  3771.                 new
  3772.             #endif
  3773.                     shift = playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS;
  3774.             #pragma tabsize 4
  3775.             new
  3776.                 slot = playerid / _FIXES_ATTACHMENTS;
  3777.             #if !FIXES_Single
  3778.                 if (!_FIXES_gIsFilterscript)
  3779.             #endif
  3780.                 {
  3781.                     for (new i = 0; i != MAX_PLAYER_ATTACHED_OBJECTS; ++i)
  3782.                     {
  3783.                         if (FIXES_gsObjectSlots[slot] & 1 << shift + i)
  3784.                         {
  3785.                             RemovePlayerAttachedObject(playerid, i);
  3786.                         }
  3787.                     }
  3788.                 }
  3789.             #pragma tabsize 4
  3790.             FIXES_gsObjectSlots[slot] &= ~((1 << MAX_PLAYER_ATTACHED_OBJECTS) - 1 << shift);
  3791.         #endif
  3792.         // ================================
  3793.         //  END:   SetPlayerAttachedObject
  3794.         // ================================
  3795.        
  3796.         // =======================================
  3797.         //  BEGIN: IsPlayerAttachedObjectSlotUsed
  3798.         // =======================================
  3799.         #if FIX_IsPlayerAttachedObjSlotUsed && !FIX_SetPlayerAttachedObject
  3800.             FIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] &= ~((1 << MAX_PLAYER_ATTACHED_OBJECTS) - 1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS);
  3801.         #endif
  3802.         // =======================================
  3803.         //  END:   IsPlayerAttachedObjectSlotUsed
  3804.         // =======================================
  3805.        
  3806.         // =============
  3807.         //  BEGIN: Kick
  3808.         // =============
  3809.         #if FIX_Kick
  3810.             if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_KICKED)
  3811.             {
  3812.                 // Stop the timer if it is still running.
  3813.                 KillTimer(GetPVarInt(playerid, FIXES_pvarKick));
  3814.             }
  3815.         #endif
  3816.         // =============
  3817.         //  END:   Kick
  3818.         // =============
  3819.        
  3820.         #if _FIX_Menus || FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
  3821.             _FIXES_RemoveInternal(FIXES_gsPlayersIterator, playerid, MAX_PLAYERS);
  3822.         #endif
  3823.        
  3824.         return ret;
  3825.     }
  3826.    
  3827.     #if defined _ALS_OnPlayerDisconnect
  3828.         #error _ALS_OnPlayerDisconnect defined
  3829.     #endif
  3830.     #define _ALS_OnPlayerDisconnect
  3831.     #define OnPlayerDisconnect(%0) FIXES_OnPlayerDisconnect(%0) <_fixes_ALS : _fixes_ALS_go>
  3832.    
  3833.     _FIXES_FORWARD FIXES_OnPlayerDisconnect(playerid, reason);
  3834. #endif
  3835.  
  3836. /*
  3837.  * OnPlayerDeath(playerid, killerid, reason)
  3838.  *
  3839.  * FIXES:
  3840.  *     OnPlayerDeath
  3841.  *     OnPlayerSpawn
  3842.  */
  3843.  
  3844. #if FIX_OnPlayerDeath || FIX_OnPlayerSpawn
  3845.     public OnPlayerDeath(playerid, killerid, reason)
  3846.     {
  3847.         _FIXES_IS_IN_CHARGE()
  3848.         {
  3849.             // ======================
  3850.             //  BEGIN: OnPlayerDeath
  3851.             // ======================
  3852.             #if FIX_OnPlayerDeath
  3853.                 static
  3854.                     sAnimlib[32],
  3855.                     sAnimname[32];
  3856.                 GetAnimationName(FIXES_gsLastAnimation[playerid], sAnimlib, sizeof (sAnimlib), sAnimname, sizeof (sAnimname));
  3857.                 if (strcmp(sAnimlib, "PED", true))
  3858.                 {
  3859.                     ClearAnimations(playerid);
  3860.                 }
  3861.             #endif
  3862.             // ======================
  3863.             //  END:   OnPlayerDeath
  3864.             // ======================
  3865.         }
  3866.        
  3867.         // ======================
  3868.         //  BEGIN: OnPlayerSpawn
  3869.         // ======================
  3870.         #if FIX_OnPlayerSpawn
  3871.             new
  3872.                 ret = FIXES_OnPlayerDeath(playerid, killerid, reason);
  3873.            
  3874.             #if FIXES_Single
  3875.                 FIXES_gsLastCash[playerid] = GetPlayerMoney(playerid);
  3876.             #else
  3877.                 SetPVarInt(playerid, FIXES_pvarPlayerLastCash, GetPlayerMoney(playerid));
  3878.             #endif
  3879.            
  3880.             return ret;
  3881.         #else
  3882.             return FIXES_OnPlayerDeath(playerid, killerid, reason);
  3883.         #endif
  3884.         // ======================
  3885.         //  END:   OnPlayerSpawn
  3886.         // ======================
  3887.     }
  3888.    
  3889.     #if defined _ALS_OnPlayerDeath
  3890.         #error _ALS_OnPlayerDeath defined
  3891.     #endif
  3892.     #define _ALS_OnPlayerDeath
  3893.     #define OnPlayerDeath(%0) FIXES_OnPlayerDeath(%0) <_fixes_ALS : _fixes_ALS_go>
  3894.    
  3895.     _FIXES_FORWARD FIXES_OnPlayerDeath(playerid, killerid, reason);
  3896. #endif
  3897.  
  3898. /*
  3899.  * FIXES_SpawnPlayer(playerid)
  3900.  *
  3901.  * FIXES:
  3902.  *     SpawnPlayer
  3903.  */
  3904.  
  3905. #if defined _ALS_SpawnPlayer
  3906.     #error _ALS_SpawnPlayer defined
  3907. #endif
  3908. native BAD_SpawnPlayer(playerid) = SpawnPlayer;
  3909.  
  3910. #if FIX_SpawnPlayer
  3911.     stock FIXES_SpawnPlayer(playerid)
  3912.     {
  3913.         // Valid "playerid" check inside "GetPlayerVehicleID".
  3914.         new
  3915.             vid = GetPlayerVehicleID(playerid);
  3916.         if (vid)
  3917.         {
  3918.             new
  3919.                 Float:x,
  3920.                 Float:y,
  3921.                 Float:z;
  3922.             // Remove them without the animation.
  3923.             GetVehiclePos(vid, x, y, z),
  3924.             SetPlayerPos(playerid, x, y, z);
  3925.         }
  3926.         return SpawnPlayer(playerid);
  3927.     }
  3928.    
  3929.     #define _ALS_SpawnPlayer
  3930.     #define SpawnPlayer FIXES_SpawnPlayer
  3931. #endif
  3932.  
  3933. /*
  3934.  * FIXES_SetPlayerName(playerid, name[])
  3935.  *
  3936.  * FIXES:
  3937.  *     SetPlayerName
  3938.  */
  3939.  
  3940. #if defined _ALS_SetPlayerName
  3941.     #error _ALS_SetPlayerName defined
  3942. #endif
  3943. native BAD_SetPlayerName(playerid, const name[]) = SetPlayerName;
  3944.  
  3945. #if FIX_SetPlayerName
  3946.     stock FIXES_SetPlayerName(playerid, name[])
  3947.     {
  3948.         static
  3949.             sOldName[MAX_PLAYER_NAME];
  3950.         GetPlayerName(playerid, sOldName, sizeof (sOldName));
  3951.         if (!strcmp(name, sOldName, true))
  3952.         {
  3953.             if(strcmp(name, sOldName, false))
  3954.             {
  3955.                 SetPlayerName(playerid, FIXES_gscTempName);
  3956.                 if(SetPlayerName(playerid, name) == -1)
  3957.                 {
  3958.                     SetPlayerName(playerid, sOldName);
  3959.                     return -1;
  3960.                 }
  3961.                 return 1;
  3962.             }
  3963.             else
  3964.             {
  3965.                 return 0;
  3966.             }
  3967.         }
  3968.         return SetPlayerName(playerid, name);
  3969.     }
  3970.    
  3971.     #define _ALS_SetPlayerName
  3972.     #define SetPlayerName FIXES_SetPlayerName
  3973. #endif
  3974.  
  3975. /*
  3976.  * OnPlayerSpawn(playerid)
  3977.  *
  3978.  * FIXES:
  3979.  *     GetPlayerSkin
  3980.  *     TogglePlayerControllable
  3981.  *     GetPlayerInterior
  3982.  *     OnPlayerSpawn
  3983.  *     ApplyAnimation_2
  3984.  *     GameText
  3985.  */
  3986.  
  3987. #if FIX_GetPlayerSkin || FIX_TogglePlayerControllable || FIX_GetPlayerInterior || FIX_OnPlayerSpawn || FIX_ApplyAnimation_2 || FIX_GameText
  3988.     public OnPlayerSpawn(playerid)
  3989.     {
  3990.         _FIXES_IS_IN_CHARGE()
  3991.         {
  3992.             // ======================
  3993.             //  BEGIN: OnPlayerSpawn
  3994.             // ======================
  3995.             #if FIX_OnPlayerSpawn
  3996.                 ResetPlayerMoney(playerid);
  3997.                 #if FIXES_Single
  3998.                     GivePlayerMoney(playerid, FIXES_gsLastCash[playerid]);
  3999.                     FIXES_gsLastCash[playerid] = 0;
  4000.                 #else
  4001.                     GivePlayerMoney(playerid, GetPVarInt(playerid, FIXES_pvarPlayerLastCash));
  4002.                     SetPVarInt(playerid, FIXES_pvarPlayerLastCash, 0);
  4003.                 #endif
  4004.             #endif
  4005.             // ======================
  4006.             //  END:   OnPlayerSpawn
  4007.             // ======================
  4008.            
  4009.             // ==========================
  4010.             //  BEGIN: GetPlayerInterior
  4011.             // ==========================
  4012.             #if FIX_GetPlayerInterior
  4013.                 #if FIXES_Single
  4014.                     FIXES_gsInterior[playerid] = 0;
  4015.                 #else
  4016.                     SetPVarInt(playerid, FIXES_pvarPlayerInterior, 0);
  4017.                 #endif
  4018.             #endif
  4019.             // ==========================
  4020.             //  END:   GetPlayerInterior
  4021.             // ==========================
  4022.            
  4023.             // =========================
  4024.             //  BEGIN: ApplyAnimation_2
  4025.             // =========================
  4026.             #if FIX_ApplyAnimation_2
  4027.                 if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_FIRST_SPAWN)
  4028.                 {
  4029.                     for (new i = 0; i != sizeof (FIXES_gscAnimLib); ++i)
  4030.                     {
  4031.                         ApplyAnimation(playerid, FIXES_gscAnimLib[i], "null", 1.0, 0, 0, 0, 0, 0);
  4032.                     }
  4033.                     FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_FIRST_SPAWN;
  4034.                 }
  4035.             #endif
  4036.             // =========================
  4037.             //  END:   ApplyAnimation_2
  4038.             // =========================
  4039.            
  4040.             // =================
  4041.             //  BEGIN: GameText
  4042.             // =================
  4043.             #if FIX_GameText
  4044.                 // Per-player GTs.
  4045.                
  4046.                 #define _FIXES_PER_PLAYER_GT(%0) if (FIXES_gsPlayerPGTShown[%0][playerid] > playerid) PlayerTextDrawHide(playerid, FIXES_gsPGTStyle[playerid][%0]), _FIXES_RemoveInternal(FIXES_gsPlayerPGTShown[%0], playerid, MAX_PLAYERS)
  4047.                
  4048.                 #if FIX_GameTextStyles
  4049.                     _FIXES_PER_PLAYER_GT(13);
  4050.                     _FIXES_PER_PLAYER_GT(12);
  4051.                     _FIXES_PER_PLAYER_GT(11);
  4052.                     _FIXES_PER_PLAYER_GT(10);
  4053.                     _FIXES_PER_PLAYER_GT(9);
  4054.                     _FIXES_PER_PLAYER_GT(8);
  4055.                     _FIXES_PER_PLAYER_GT(7);
  4056.                 #endif
  4057.                 _FIXES_PER_PLAYER_GT(6);
  4058.                 _FIXES_PER_PLAYER_GT(5);
  4059.                 _FIXES_PER_PLAYER_GT(4);
  4060.                 _FIXES_PER_PLAYER_GT(3);
  4061.                 _FIXES_PER_PLAYER_GT(2);
  4062.                 _FIXES_PER_PLAYER_GT(1);
  4063.                 _FIXES_PER_PLAYER_GT(0);
  4064.                
  4065.                 #undef _FIXES_PER_PLAYER_GT
  4066.                
  4067.                 // Global GTs.
  4068.                 #if FIX_GameTextStyles
  4069.                     TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[13]),
  4070.                     TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[12]),
  4071.                     TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[11]),
  4072.                     TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[10]),
  4073.                     TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[9]),
  4074.                     TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[8]),
  4075.                     TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[7]);
  4076.                 #endif
  4077.                 TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[6]),
  4078.                 TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[5]),
  4079.                 TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[4]),
  4080.                 TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[3]),
  4081.                 TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[2]),
  4082.                 TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[1]),
  4083.                 TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[0]);
  4084.                
  4085.             #endif
  4086.             // =================
  4087.             //  END:   GameText
  4088.             // =================
  4089.         }
  4090.        
  4091.         // ======================
  4092.         //  BEGIN: GetPlayerSkin
  4093.         // ======================
  4094.         #if FIX_GetPlayerSkin
  4095.             #if FIXES_Single
  4096.                 FIXES_gsPlayerSkin[playerid] = GetPlayerSkin(playerid);
  4097.             #else
  4098.                 SetPVarInt(playerid, FIXES_pvarPlayerSkin, GetPlayerSkin(playerid));
  4099.             #endif
  4100.         #endif
  4101.         // ======================
  4102.         //  END:   GetPlayerSkin
  4103.         // ======================
  4104.        
  4105.         // =================================
  4106.         //  BEGIN: TogglePlayerControllable
  4107.         // =================================
  4108.         #if FIX_TogglePlayerControllable
  4109.             FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_UNCONTROLLABLE;
  4110.         #endif
  4111.         // =================================
  4112.         //  END:   TogglePlayerControllable
  4113.         // =================================
  4114.        
  4115.         return FIXES_OnPlayerSpawn(playerid);
  4116.     }
  4117.    
  4118.     #if defined _ALS_OnPlayerSpawn
  4119.         #error _ALS_OnPlayerSpawn defined
  4120.     #endif
  4121.     #define _ALS_OnPlayerSpawn
  4122.     #define OnPlayerSpawn(%0) FIXES_OnPlayerSpawn(%0) <_fixes_ALS : _fixes_ALS_go>
  4123.    
  4124.     _FIXES_FORWARD FIXES_OnPlayerSpawn(playerid);
  4125. #endif
  4126.  
  4127. /*
  4128.  * OnVehicleMod(playerid, vehicleid, componentid)
  4129.  *
  4130.  * FIXES:
  4131.  *     OnVehicleMod
  4132.  */
  4133.  
  4134. #if FIX_OnVehicleMod
  4135.     public OnVehicleMod(playerid, vehicleid, componentid)
  4136.     {
  4137.         #if !FIXES_Single
  4138.             if (!(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE))
  4139.             {
  4140.                 return FIXES_OnVehicleMod(playerid, vehicleid, componentid);
  4141.             }
  4142.         #endif
  4143.        
  4144.         // =====================
  4145.         //  BEGIN: OnVehicleMod
  4146.         // =====================
  4147.         new
  4148.             modelid = GetVehicleModel(vehicleid);
  4149.         if (_FIXES_IN_RANGE(modelid, 400, 611 + 1))
  4150.         {
  4151.             switch (componentid)
  4152.             {
  4153.                 case 1000 .. 1191:
  4154.                 {
  4155.                     if (FIXES_gscVehicleMods[(modelid - 400) * 6 + (componentid - 1000 >>> 5)] & 1 << (componentid - 1000 & 0b00011111))
  4156.                     {
  4157.                         return FIXES_OnVehicleMod(playerid, vehicleid, componentid);
  4158.                     }
  4159.                 }
  4160.                 case 1192, 1193:
  4161.                 {
  4162.                     if (modelid == 576)
  4163.                     {
  4164.                         // This save a whole cell off EVERY other vehicle!  This
  4165.                         // is the ONLY vehicle with any mods over "6 * 32 + 999"
  4166.                         // (1191), the highest value you can fit in 6 cells of a
  4167.                         // bit array (minus 1000).
  4168.                         return FIXES_OnVehicleMod(playerid, vehicleid, componentid);
  4169.                     }
  4170.                 }
  4171.             }
  4172.         }
  4173.         // Desync the player entirely.
  4174.         FIXES_BlockUpdate(playerid, true);
  4175.         return 0;
  4176.         // =====================
  4177.         //  END:   OnVehicleMod
  4178.         // =====================
  4179.     }
  4180.    
  4181.     #if defined _ALS_OnVehicleMod
  4182.         #error _ALS_OnVehicleMod defined
  4183.     #endif
  4184.     #define _ALS_OnVehicleMod
  4185.     #define OnVehicleMod(%0) FIXES_OnVehicleMod(%0) <_fixes_ALS : _fixes_ALS_go>
  4186.    
  4187.     _FIXES_FORWARD FIXES_OnVehicleMod(playerid, vehicleid, componentid);
  4188. #endif
  4189.  
  4190. /*
  4191.  * FIXES_SetPlayerSkin(playerid, skinid)
  4192.  *
  4193.  * FIXES:
  4194.  *     GetPlayerSkin
  4195.  *     SetPlayerSkin
  4196.  */
  4197.  
  4198. #if defined _ALS_SetPlayerSkin
  4199.     #error _ALS_SetPlayerSkin defined
  4200. #endif
  4201. native BAD_SetPlayerSkin(playerid, skinid) = SetPlayerSkin;
  4202.  
  4203. #if FIX_GetPlayerSkin || FIX_SetPlayerSkin
  4204.     stock FIXES_SetPlayerSkin(playerid, skinid)
  4205.     {
  4206.         // ======================
  4207.         //  BEGIN: SetPlayerSkin
  4208.         // ======================
  4209.         #if FIX_SetPlayerSkin
  4210.             new
  4211.                 vehicleid = GetPlayerVehicleID(playerid);
  4212.             if (vehicleid)
  4213.             {
  4214.                 new
  4215.                     seat = GetPlayerVehicleSeat(playerid);
  4216.                 ClearAnimations(playerid);
  4217.                 new
  4218.                     ret = SetPlayerSkin(playerid, skinid);
  4219.                 PutPlayerInVehicle(playerid, vehicleid, seat);
  4220.                
  4221.                 // ======================
  4222.                 //  BEGIN: GetPlayerSkin
  4223.                 // ======================
  4224.                 #if FIX_GetPlayerSkin
  4225.                     #if FIXES_Single
  4226.                         FIXES_gsPlayerSkin[playerid] = skinid;
  4227.                     #else
  4228.                         SetPVarInt(playerid, FIXES_pvarPlayerSkin, skinid);
  4229.                     #endif
  4230.                 #endif
  4231.                 // ======================
  4232.                 //  END:   GetPlayerSkin
  4233.                 // ======================
  4234.                
  4235.                 return ret;
  4236.             }
  4237.            
  4238.             // ======================
  4239.             //  BEGIN: GetPlayerSkin
  4240.             // ======================
  4241.             #if FIX_GetPlayerSkin
  4242.                 else
  4243.             #endif
  4244.             // ======================
  4245.             //  END:   GetPlayerSkin
  4246.             // ======================
  4247.         #endif
  4248.         // ======================
  4249.         //  END:   SetPlayerSkin
  4250.         // ======================
  4251.        
  4252.         // ======================
  4253.         //  BEGIN: GetPlayerSkin
  4254.         // ======================
  4255.         #if FIX_GetPlayerSkin
  4256.             // Watch fot the "else" above if this code ever changes.
  4257.             #if FIXES_Single
  4258.                 FIXES_gsPlayerSkin[playerid] = skinid;
  4259.             #else
  4260.                 SetPVarInt(playerid, FIXES_pvarPlayerSkin, skinid);
  4261.             #endif
  4262.         #endif
  4263.         // ======================
  4264.         //  END:   GetPlayerSkin
  4265.         // ======================
  4266.        
  4267.         return SetPlayerSkin(playerid, skinid);
  4268.     }
  4269.    
  4270.     #define _ALS_SetPlayerSkin
  4271.     #define SetPlayerSkin FIXES_SetPlayerSkin
  4272. #endif
  4273.  
  4274. /*
  4275.  * FIXES_GetPlayerSkin(playerid, skinid)
  4276.  *
  4277.  * FIXES:
  4278.  *     GetPlayerSkin
  4279.  */
  4280.  
  4281. #if defined _ALS_GetPlayerSkin
  4282.     #error _ALS_GetPlayerSkin defined
  4283. #endif
  4284. native BAD_GetPlayerSkin(playerid) = GetPlayerSkin;
  4285.  
  4286. #if FIX_GetPlayerSkin
  4287.     stock FIXES_GetPlayerSkin(playerid)
  4288.     {
  4289.         #if FIXES_Single
  4290.             return FIXES_gsPlayerSkin[playerid];
  4291.         #else
  4292.             return GetPVarInt(playerid, FIXES_pvarPlayerSkin);
  4293.         #endif
  4294.     }
  4295.    
  4296.     #define _ALS_GetPlayerSkin
  4297.     #define GetPlayerSkin FIXES_GetPlayerSkin
  4298. #endif
  4299.  
  4300. /*
  4301.  * FIXES_GetWeaponName(weaponid, weapon[], len)
  4302.  *
  4303.  * FIXES:
  4304.  *     GetWeaponName
  4305.  */
  4306.  
  4307. #if defined _ALS_GetWeaponName
  4308.     #error _ALS_GetWeaponName defined
  4309. #endif
  4310. native BAD_GetWeaponName(weaponid, weapon[], len) = GetWeaponName;
  4311.  
  4312. #if FIX_GetWeaponName
  4313.     stock FIXES_GetWeaponName(weaponid, weapon[], len)
  4314.     {
  4315.         switch (weaponid)
  4316.         {
  4317.             case 18:
  4318.             {
  4319.                 return
  4320.                     weapon[0] = 0,
  4321.                     strcat(weapon, "Molotov Cocktail", len),
  4322.                     1;
  4323.             }
  4324.             case 44:
  4325.             {
  4326.                 return
  4327.                     weapon[0] = 0,
  4328.                     strcat(weapon, "Thermal Goggles", len),
  4329.                     1;
  4330.             }
  4331.             case 45:
  4332.             {
  4333.                 return
  4334.                     weapon[0] = 0,
  4335.                     strcat(weapon, "Night Vision Goggles", len),
  4336.                     1;
  4337.             }
  4338.             default:
  4339.             {
  4340.                 return GetWeaponName(weaponid, weapon, len);
  4341.             }
  4342.         }
  4343.         return 0;
  4344.     }
  4345.    
  4346.     #define _ALS_GetWeaponName
  4347.     #define GetWeaponName FIXES_GetWeaponName
  4348. #endif
  4349.  
  4350. /*
  4351.  * OnPlayerUpdate(playerid)
  4352.  *
  4353.  * FIXES:
  4354.  *     SetPlayerWorldBounds
  4355.  *     TogglePlayerControllable
  4356.  *     AllowInteriorWeapons
  4357.  *     OnPlayerDeath
  4358.  *     Kick
  4359.  *     OnVehicleMod
  4360.  *     OnPlayerEnterVehicle
  4361.  *     OnPlayerEnterVehicle_2
  4362.  */
  4363.  
  4364. #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_AllowInteriorWeapons || FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2 || FIX_OnPlayerDeath || FIX_Kick || FIX_OnVehicleMod
  4365.     public OnPlayerUpdate(playerid)
  4366.     {
  4367.         // =============================
  4368.         //  BEGIN: OnPlayerEnterVehicle
  4369.         // =============================
  4370.         #if FIX_OnPlayerEnterVehicle || FIX_Kick || FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle_2
  4371.             if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_BLOCK)
  4372.             {
  4373.                 return 0;
  4374.             }
  4375.         #endif
  4376.         // =============================
  4377.         //  END:   OnPlayerEnterVehicle
  4378.         // =============================
  4379.        
  4380.         #if !FIXES_Single
  4381.             if (!(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE))
  4382.             {
  4383.                 return FIXES_OnPlayerUpdate(playerid);
  4384.             }
  4385.         #endif
  4386.        
  4387.         #if FIX_OnPlayerEnterVehicle || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
  4388.             new
  4389.                 e_FIXES_BOOLS:pbools = FIXES_gsPlayerBools[playerid];
  4390.         #endif
  4391.        
  4392.         // =============================
  4393.         //  BEGIN: AllowInteriorWeapons
  4394.         // =============================
  4395.         #if FIX_AllowInteriorWeapons
  4396.             if (pbools & e_FIXES_BOOLS_INTERIOR)
  4397.             {
  4398.                 // DONE: May need integration with "FIX_GetPlayerWeapon".
  4399.                 SetPlayerArmedWeapon(playerid, 0);
  4400.             }
  4401.         #endif
  4402.         // ============================
  4403.         //  END: AllowInteriorWeapons
  4404.         // ============================
  4405.        
  4406.         #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
  4407.             new
  4408.                 ud,
  4409.                 lr,
  4410.                 keys;
  4411.             GetPlayerKeys(playerid, keys, ud, lr);
  4412.         #endif
  4413.        
  4414.         #if FIX_SetPlayerWorldBounds && !FIX_TogglePlayerControllable
  4415.             #pragma unused ud, lr
  4416.         #endif
  4417.        
  4418.         // =============================
  4419.         //  BEGIN: SetPlayerWorldBounds
  4420.         // =============================
  4421.         #if FIX_SetPlayerWorldBounds
  4422.             if (pbools & e_FIXES_BOOLS_WORLDBOUNDS && keys & _FIXES_KEY_AIM)
  4423.             {
  4424.                 new
  4425.                     Float:x,
  4426.                     Float:y,
  4427.                     Float:z;
  4428.                 GetPlayerPos(playerid, x, y, z);
  4429.                 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])
  4430.                 {
  4431.                     FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PX] = x,
  4432.                     FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PY] = y,
  4433.                     FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PZ] = z;
  4434.                 }
  4435.                 else
  4436.                 {
  4437.                     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]);
  4438.                 }
  4439.             }
  4440.         #endif
  4441.         // =============================
  4442.         //  END:   SetPlayerWorldBounds
  4443.         // =============================
  4444.        
  4445.         // ======================
  4446.         //  BEGIN: OnPlayerDeath
  4447.         // ======================
  4448.         #if FIX_OnPlayerDeath
  4449.             FIXES_gsLastAnimation[playerid] = GetPlayerAnimationIndex(playerid);
  4450.         #endif
  4451.         // ======================
  4452.         //  END:   OnPlayerDeath
  4453.         // ======================
  4454.        
  4455.         // =================================
  4456.         //  BEGIN: TogglePlayerControllable
  4457.         // =================================
  4458.         #if FIX_TogglePlayerControllable
  4459.             // MUST come last.
  4460.             if (pbools & e_FIXES_BOOLS_UNCONTROLLABLE)
  4461.             {
  4462.                 // Keys based sync blocking, modified based on a post by Slice:
  4463.                 // http://forum.sa-mp.com/showpost.php?p=876854  Use "playerid"
  4464.                 // here as it's a variable that already exists, but note that
  4465.                 // after this point, you CANNOT use "playerid" as it has been
  4466.                 // "clobbered" (and yes, that's the technical term).  This is
  4467.                 // just to avoid "statement has no effect" warnings.  ALWAYS
  4468.                 // return 0 in this case, regardless of what other callbacks
  4469.                 // return.
  4470.                 playerid = FIXES_OnPlayerUpdate(playerid);
  4471.                 if (keys || ud || lr)
  4472.                 {
  4473.                     return 0;
  4474.                 }
  4475.                 else
  4476.                 {
  4477.                     return playerid;
  4478.                 }
  4479.             }
  4480.         #endif
  4481.         // =================================
  4482.         //  END:   TogglePlayerControllable
  4483.         // =================================
  4484.        
  4485.         return FIXES_OnPlayerUpdate(playerid);
  4486.     }
  4487.    
  4488.     #if defined _ALS_OnPlayerUpdate
  4489.         #error _ALS_OnPlayerUpdate defined
  4490.     #endif
  4491.     #define _ALS_OnPlayerUpdate
  4492.     #define OnPlayerUpdate(%0) FIXES_OnPlayerUpdate(%0) <_fixes_ALS : _fixes_ALS_go>
  4493.    
  4494.     _FIXES_FORWARD FIXES_OnPlayerUpdate(playerid);
  4495. #endif
  4496.  
  4497. /*
  4498.  * FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min)
  4499.  *
  4500.  * TODO: Modify this to remove aim animations when they get to the boundaries.
  4501.  *
  4502.  * FIXES:
  4503.  *     SetPlayerWorldBounds
  4504.  */
  4505.  
  4506. #if defined _ALS_SetPlayerWorldBounds
  4507.     #error _ALS_SetPlayerWorldBounds defined
  4508. #endif
  4509. native BAD_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min) = SetPlayerWorldBounds;
  4510.  
  4511. #if FIX_SetPlayerWorldBounds
  4512.     #if FIXES_Single
  4513.         stock FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min)
  4514.         {
  4515.             if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  4516.             {
  4517.                 FIXES_PRINTF("Call SetPlayerWorldBounds");
  4518.                 if (x_max == x_min || y_max == y_min)
  4519.                 {
  4520.                     // Impossibly small area, disable checks entirely.
  4521.                     return
  4522.                         FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_WORLDBOUNDS,
  4523.                         SetPlayerWorldBounds(playerid, _FIXES_INFINITY, _FIXES_N_INFINITY, _FIXES_INFINITY, _FIXES_N_INFINITY);
  4524.                 }
  4525.                 // This code could do with a way to mostly remove the checks.  Maybe
  4526.                 // when setting everything to FIXES_INFINITY (with default
  4527.                 // parameters).
  4528.                 FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_WORLDBOUNDS;
  4529.                 new
  4530.                     Float:tmp;
  4531.                 if (x_max < x_min)
  4532.                 {
  4533.                     tmp = x_min,
  4534.                     x_min = x_max,
  4535.                     x_max = tmp;
  4536.                 }
  4537.                 if (y_max < y_min)
  4538.                 {
  4539.                     tmp = y_min,
  4540.                     y_min = y_max,
  4541.                     y_max = tmp;
  4542.                 }
  4543.                 // Give a little leway so this fix isn't noticed if you're not
  4544.                 // trying to break through the world bounds.  Leway removed in
  4545.                 // favour of keys.
  4546.                 return
  4547.                     FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] = x_min,
  4548.                     FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] = x_max,
  4549.                    
  4550.                     FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] = y_min,
  4551.                     FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY] = y_max,
  4552.                    
  4553.                     GetPlayerPos(playerid, tmp, tmp, tmp),
  4554.                     FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PX] = (x_max - x_min) / 2 + x_min,
  4555.                     FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PY] = (y_max - y_min) / 2 + y_min,
  4556.                     FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PZ] = tmp,
  4557.                    
  4558.                     SetPlayerWorldBounds(playerid, x_max, x_min, y_max, y_min);
  4559.             }
  4560.             return 0;
  4561.         }
  4562.     #else
  4563.         forward _FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min);
  4564.        
  4565.         stock FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min)
  4566.         {
  4567.             if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  4568.             {
  4569.                 FIXES_PRINTF("Call SetPlayerWorldBounds");
  4570.                 return
  4571.                     CallRemoteFunction(FIXES_gscSetPlayerWorldBounds, FIXES_gscSpec@iffff, playerid, x_max, x_min, y_max, y_min),
  4572.                     getproperty(5, FIXES_gscReturnProperty);
  4573.             }
  4574.             return 0;
  4575.         }
  4576.        
  4577.         public _FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min)
  4578.         {
  4579.             FIXES_PRINTF("_FIXES_SetPlayerWorldBounds: %d %.2f %.2f %.2f %.2f", playerid, x_max, x_min, y_max, y_min);
  4580.             _FIXES_IS_IN_CHARGE()
  4581.             {
  4582.                 FIXES_PRINTF("SetPlayerWorldBounds");
  4583.                 //if (x_max == _FIXES_INFINITY && x_min == _FIXES_INFINITY && y_max == _FIXES_INFINITY && y_min == _FIXES_INFINITY)
  4584.                 if (x_max == x_min || y_max == y_min)
  4585.                 {
  4586.                     // Impossibly small area, disable checks entirely.
  4587.                     return
  4588.                         FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_WORLDBOUNDS,
  4589.                         FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] =
  4590.                             FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] =
  4591.                                 FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] =
  4592.                                     FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY] =
  4593.                                         0.0,
  4594.                         setproperty(5, FIXES_gscReturnProperty, SetPlayerWorldBounds(playerid, _FIXES_INFINITY, _FIXES_N_INFINITY, _FIXES_INFINITY, _FIXES_N_INFINITY)),
  4595.                         -1;
  4596.                 }
  4597.                 // This code could do with a way to mostly remove the checks.  Maybe
  4598.                 // when setting everything to FIXES_INFINITY (with default
  4599.                 // parameters).
  4600.                 FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_WORLDBOUNDS;
  4601.                 new
  4602.                     Float:tmp;
  4603.                 if (x_max < x_min)
  4604.                 {
  4605.                     tmp = x_min,
  4606.                     x_min = x_max,
  4607.                     x_max = tmp;
  4608.                 }
  4609.                 if (y_max < y_min)
  4610.                 {
  4611.                     tmp = y_min,
  4612.                     y_min = y_max,
  4613.                     y_max = tmp;
  4614.                 }
  4615.                 // Give a little leway so this fix isn't noticed if you're not
  4616.                 // trying to break through the world bounds.  Leway removed in
  4617.                 // favour of keys.
  4618.                 FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] = x_min,
  4619.                 FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] = x_max,
  4620.                
  4621.                 FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] = y_min,
  4622.                 FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY] = y_max,
  4623.                
  4624.                 GetPlayerPos(playerid, tmp, tmp, tmp),
  4625.                 FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PX] = (x_max - x_min) / 2 + x_min,
  4626.                 FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PY] = (y_max - y_min) / 2 + y_min,
  4627.                 FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PZ] = tmp,
  4628.                
  4629.                 setproperty(5, FIXES_gscReturnProperty, SetPlayerWorldBounds(playerid, x_max, x_min, y_max, y_min));
  4630.             }
  4631.             return 0;
  4632.         }
  4633.     #endif
  4634.    
  4635.     #define _ALS_SetPlayerWorldBounds
  4636.     #define SetPlayerWorldBounds FIXES_SetPlayerWorldBounds
  4637. #endif
  4638.  
  4639. /*
  4640.  * FIXES_TogglePlayerControllable(playerid, toggle)
  4641.  *
  4642.  * FIXES:
  4643.  *     TogglePlayerControllable
  4644.  */
  4645.  
  4646. #if defined _ALS_TogglePlayerControllable
  4647.     #error _ALS_TogglePlayerControllable defined
  4648. #endif
  4649. native BAD_TogglePlayerControllable(playerid, toggle) = TogglePlayerControllable;
  4650.  
  4651. #if FIX_TogglePlayerControllable
  4652.     #if FIXES_Single
  4653.         stock FIXES_TogglePlayerControllable(playerid, toggle)
  4654.         {
  4655.             if (TogglePlayerControllable(playerid, toggle))
  4656.             {
  4657.                 if (toggle)
  4658.                 {
  4659.                     FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_UNCONTROLLABLE;
  4660.                 }
  4661.                 else
  4662.                 {
  4663.                     FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_UNCONTROLLABLE;
  4664.                 }
  4665.                 return 1;
  4666.             }
  4667.             return 0;
  4668.         }
  4669.     #else
  4670.         forward _FIXES_TogglePlayerControllable(playerid, toggle);
  4671.        
  4672.         stock FIXES_TogglePlayerControllable(playerid, toggle)
  4673.         {
  4674.             if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  4675.             {
  4676.                 return
  4677.                     CallRemoteFunction(FIXES_gscTogglePlayerControl, FIXES_gscSpec@ii, playerid, toggle),
  4678.                     getproperty(5, FIXES_gscReturnProperty);
  4679.             }
  4680.             return 0;
  4681.         }
  4682.        
  4683.         public _FIXES_TogglePlayerControllable(playerid, toggle)
  4684.         {
  4685.             _FIXES_IS_IN_CHARGE()
  4686.             {
  4687.                 if (toggle)
  4688.                 {
  4689.                     FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_UNCONTROLLABLE;
  4690.                 }
  4691.                 else
  4692.                 {
  4693.                     FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_UNCONTROLLABLE;
  4694.                 }
  4695.                 setproperty(5, FIXES_gscReturnProperty, TogglePlayerControllable(playerid, toggle));
  4696.             }
  4697.         }
  4698.     #endif
  4699.    
  4700.     #define _ALS_TogglePlayerControllable
  4701.     #define TogglePlayerControllable FIXES_TogglePlayerControllable
  4702. #endif
  4703.  
  4704. /*
  4705.  * OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
  4706.  *
  4707.  * FIXES:
  4708.  *     AllowInteriorWeapons
  4709.  *     GetPlayerInterior
  4710.  */
  4711.  
  4712. #if FIX_AllowInteriorWeapons || FIX_GetPlayerInterior
  4713.     public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
  4714.     {
  4715.         // ==========================
  4716.         //  BEGIN: GetPlayerInterior
  4717.         // ==========================
  4718.         #if FIX_GetPlayerInterior
  4719.             #if FIXES_Single
  4720.                 FIXES_gsInterior[playerid] = newinteriorid;
  4721.             #else
  4722.                 _FIXES_IS_IN_CHARGE()
  4723.                 {
  4724.                     SetPVarInt(playerid, FIXES_pvarPlayerInterior, newinteriorid);
  4725.                 }
  4726.             #endif
  4727.         #endif
  4728.         // ==========================
  4729.         //  END:   GetPlayerInterior
  4730.         // ==========================
  4731.        
  4732.         // =============================
  4733.         //  BEGIN: AllowInteriorWeapons
  4734.         // =============================
  4735.         #if FIX_AllowInteriorWeapons
  4736.             if (newinteriorid)
  4737.             {
  4738.                 if (FIXES_gsSettings & e_FIXES_SETTINGS_INTERIOR)
  4739.                 {
  4740.                     // This only needs doing here if "GetPlayerWeapon" is set.
  4741.                     // If it isn't, even though "AllowInteriorWeapons" can use
  4742.                     // this code on its own, it doesn't as "OnPlayerUpdate"
  4743.                     // takes care of it all.
  4744.                     // TODO: Rewrite this code to use a single bit to indicate
  4745.                     // if a player can have a weapon or not, and just use the in
  4746.                     // the "OnPlayerUpdate" callback, instead of several checks.
  4747.                     // DONE!
  4748.                     FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_INTERIOR;
  4749.                     _FIXES_IS_IN_CHARGE()
  4750.                     {
  4751.                         SetPlayerArmedWeapon(playerid, 0);
  4752.                         #if FIX_GetPlayerWeapon
  4753.                             if (IsPlayerInAnyVehicle(playerid))
  4754.                             {
  4755.                                 #if FIXES_Single
  4756.                                     FIXES_gsPlayerWeapon[playerid] = 0;
  4757.                                 #else
  4758.                                     SetPVarInt(playerid, FIXES_pvarPlayerWeapon, 0);
  4759.                                 #endif
  4760.                             }
  4761.                         #endif
  4762.                     }
  4763.                 }
  4764.             }
  4765.             else
  4766.             {
  4767.                 FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_INTERIOR;
  4768.             }
  4769.         #endif
  4770.         // ===========================
  4771.         //  END: AllowInteriorWeapons
  4772.         // ===========================
  4773.         return FIXES_OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid);
  4774.     }
  4775.    
  4776.     #if defined _ALS_OnPlayerInteriorChange
  4777.         #error _ALS_OnPlayerInteriorChange defined
  4778.     #endif
  4779.     #define _ALS_OnPlayerInteriorChange
  4780.     #define OnPlayerInteriorChange(%0) FIXES_OnPlayerInteriorChange(%0) <_fixes_ALS : _fixes_ALS_go>
  4781.    
  4782.     _FIXES_FORWARD FIXES_OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid);
  4783. #endif
  4784.  
  4785. /*
  4786.  * _FIXES_DriveBy(playerid)
  4787.  *
  4788.  * FIXES:
  4789.  *     DriveBy
  4790.  */
  4791.  
  4792. #if FIX_DriveBy
  4793.     forward _FIXES_DriveBy(playerid);
  4794.    
  4795.     public  _FIXES_DriveBy(playerid)
  4796.     {
  4797.         if (GetPlayerState(playerid) == PLAYER_STATE_PASSENGER)
  4798.         {
  4799.             SetPlayerArmedWeapon(playerid, FIXES_gsDriveByWeapon[playerid]);
  4800.         }
  4801.         return FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_DRIVE_BY;
  4802.     }
  4803. #endif
  4804.  
  4805. /*
  4806.  * OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  4807.  *
  4808.  * FIXES:
  4809.  *     DriveBy
  4810.  */
  4811.  
  4812. #if FIX_DriveBy
  4813.     public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  4814.     {
  4815.         // ===============================
  4816.         //  BEGIN: DriveBy
  4817.         // ===============================
  4818.         #if FIX_DriveBy
  4819.             #if !FIXES_Single
  4820.                 if (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)
  4821.             #endif
  4822.                 {
  4823.                     if ((newkeys & KEY_CROUCH) && !(oldkeys & KEY_CROUCH) && GetPlayerState(playerid) == PLAYER_STATE_PASSENGER && GetPlayerCameraMode(playerid) == 55 && !(FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_DRIVE_BY))
  4824.                     {
  4825.                         FIXES_gsDriveByWeapon[playerid] = GetPlayerWeapon(playerid),
  4826.                         FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_DRIVE_BY,
  4827.                         SetPlayerArmedWeapon(playerid, 0),
  4828.                         ApplyAnimation(playerid, "PED", "CAR_GETIN_RHS", 4.1, 0, 0, 0, 0, 1, 1),
  4829.                         SetTimerEx(FIXES_gscDriveBy, 500, 0, FIXES_gscSpec@i, playerid);
  4830.                     }
  4831.                 }
  4832.         #endif
  4833.         // =============================
  4834.         //  END: DriveBy
  4835.         // =============================
  4836.        
  4837.         return FIXES_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
  4838.     }
  4839.    
  4840.     #if defined _ALS_OnPlayerKeyStateChange
  4841.         #error _ALS_OnPlayerKeyStateChange defined
  4842.     #endif
  4843.     #define _ALS_OnPlayerKeyStateChange
  4844.     #define OnPlayerKeyStateChange(%0) FIXES_OnPlayerKeyStateChange(%0) <_fixes_ALS : _fixes_ALS_go>
  4845.    
  4846.     _FIXES_FORWARD FIXES_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
  4847. #endif
  4848.  
  4849. /*
  4850.  * OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
  4851.  *
  4852.  * FIXES:
  4853.  *     OnPlayerEnterVehicle_2
  4854.  */
  4855.  
  4856. #if FIX_OnPlayerEnterVehicle_2
  4857.     public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
  4858.     {
  4859.         // ===============================
  4860.         //  BEGIN: OnPlayerEnterVehicle_2
  4861.         // ===============================
  4862.         #if FIX_OnPlayerEnterVehicle_2
  4863.             if (0 < vehicleid < MAX_VEHICLES)
  4864.             {
  4865.                 return FIXES_OnPlayerEnterVehicle(playerid, vehicleid, ispassenger);
  4866.             }
  4867.             FIXES_BlockUpdate(playerid, true);
  4868.             return 0;
  4869.         #endif
  4870.         // =============================
  4871.         //  END: OnPlayerEnterVehicle_2
  4872.         // =============================
  4873.     }
  4874.    
  4875.     #if defined _ALS_OnPlayerEnterVehicle
  4876.         #error _ALS_OnPlayerEnterVehicle defined
  4877.     #endif
  4878.     #define _ALS_OnPlayerEnterVehicle
  4879.     #define OnPlayerEnterVehicle(%0) FIXES_OnPlayerEnterVehicle(%0) <_fixes_ALS : _fixes_ALS_go>
  4880.    
  4881.     _FIXES_FORWARD FIXES_OnPlayerEnterVehicle(playerid, vehicleid, ispassenger);
  4882. #endif
  4883.  
  4884. /*
  4885.  * OnPlayerExitVehicle(playerid, vehicleid)
  4886.  *
  4887.  * FIXES:
  4888.  *     OnPlayerEnterVehicle_2
  4889.  */
  4890.  
  4891. #if FIX_OnPlayerEnterVehicle_2
  4892.     public OnPlayerExitVehicle(playerid, vehicleid)
  4893.     {
  4894.         // ===============================
  4895.         //  BEGIN: OnPlayerEnterVehicle_2
  4896.         // ===============================
  4897.         #if FIX_OnPlayerEnterVehicle_2
  4898.             if (0 < vehicleid < MAX_VEHICLES)
  4899.             {
  4900.                 return FIXES_OnPlayerExitVehicle(playerid, vehicleid);
  4901.             }
  4902.             FIXES_BlockUpdate(playerid, true);
  4903.             return 0;
  4904.         #endif
  4905.         // =============================
  4906.         //  END: OnPlayerEnterVehicle_2
  4907.         // =============================
  4908.     }
  4909.    
  4910.     #if defined _ALS_OnPlayerExitVehicle
  4911.         #error _ALS_OnPlayerExitVehicle defined
  4912.     #endif
  4913.     #define _ALS_OnPlayerExitVehicle
  4914.     #define OnPlayerExitVehicle(%0) FIXES_OnPlayerExitVehicle(%0) <_fixes_ALS : _fixes_ALS_go>
  4915.    
  4916.     _FIXES_FORWARD FIXES_OnPlayerExitVehicle(playerid, vehicleid);
  4917. #endif
  4918.  
  4919. /*
  4920.  * FIXES_BlockUpdate(playerid, bool:block)
  4921.  *
  4922.  * Block a player from using OnPlayerUpdate at all.
  4923.  */
  4924.  
  4925. #if FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2 || FIX_Kick || FIX_OnVehicleMod
  4926.     static stock FIXES_BlockUpdate(playerid, bool:block, kick = 6)
  4927.     {
  4928.         if (kick)
  4929.         {
  4930.             #if FIXES_SilentKick
  4931.                 new
  4932.                     ip[22];
  4933.                 GetPlayerIp(playerid, ip, sizeof (ip)),
  4934.                 format(ip, sizeof (ip), "banip %s", ip),
  4935.                 SendRconCommand(ip),
  4936.                 FIXES_gsPlayerIP[playerid] = strval(ip[kick]) << 24,
  4937.                 kick = strfind(ip, FIXES_gscDot, false, kick) + 1,
  4938.                 FIXES_gsPlayerIP[playerid] |= strval(ip[kick]) << 16,
  4939.                 kick = strfind(ip, FIXES_gscDot, false, kick) + 1,
  4940.                 FIXES_gsPlayerIP[playerid] |= strval(ip[kick]) << 8,
  4941.                 kick = strfind(ip, FIXES_gscDot, false, kick) + 1,
  4942.                 FIXES_gsPlayerIP[playerid] |= strval(ip[kick]);
  4943.             #else
  4944.                 Kick(playerid);
  4945.             #endif
  4946.         }
  4947.         if (block)
  4948.         {
  4949.             FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_BLOCK;
  4950.             return 0;
  4951.         }
  4952.         else
  4953.         {
  4954.             FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_BLOCK;
  4955.             return 1;
  4956.         }
  4957.     }
  4958. #endif
  4959.  
  4960. /*
  4961.  * OnPlayerSelectedMenuRow(playerid, row)
  4962.  *
  4963.  * FIXES:
  4964.  *     GetPlayerMenu
  4965.  */
  4966.  
  4967. #if FIX_GetPlayerMenu
  4968.     public OnPlayerSelectedMenuRow(playerid, row)
  4969.     {
  4970.         // ======================
  4971.         //  BEGIN: GetPlayerMenu
  4972.         // ======================
  4973.         #if FIXES_Single
  4974.             FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
  4975.             new
  4976.                 ret = FIXES_OnPlayerSelectedMenuRow(playerid, row);
  4977.             if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))
  4978.             {
  4979.                 FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
  4980.             }
  4981.             return ret;
  4982.         #else
  4983.             new
  4984.                 Menu:cur = FIXES_gsCurrentMenu[playerid];
  4985.             _FIXES_IS_IN_CHARGE()
  4986.             {
  4987.                 setproperty(5, FIXES_gscMenuProperty, _:cur);
  4988.                 CallRemoteFunction(FIXES_gscClearPlayerMenu, FIXES_gscSpec@i, playerid);
  4989.                 FIXES_gsCurrentMenu[playerid] = cur;
  4990.                 new
  4991.                     ret = FIXES_OnPlayerSelectedMenuRow(playerid, row);
  4992.                 if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))
  4993.                 {
  4994.                     FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
  4995.                 }
  4996.                 return ret;
  4997.             }
  4998.             else   
  4999.             {
  5000.                 FIXES_gsCurrentMenu[playerid] = Menu:getproperty(5, FIXES_gscMenuProperty);
  5001.                 FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
  5002.                 new
  5003.                     ret = FIXES_OnPlayerSelectedMenuRow(playerid, row);
  5004.                 if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))
  5005.                 {
  5006.                     FIXES_gsCurrentMenu[playerid] = cur;
  5007.                 }
  5008.                 return ret;
  5009.             }
  5010.         #endif
  5011.         // ======================
  5012.         //  END:   GetPlayerMenu
  5013.         // ======================
  5014.     }
  5015.    
  5016.     #if defined _ALS_OnPlayerSelectedMenuRow
  5017.         #error _ALS_OnPlayerSelectedMenuRow defined
  5018.     #endif
  5019.     #define _ALS_OnPlayerSelectedMenuRow
  5020.     #define OnPlayerSelectedMenuRow(%0) FIXES_OnPlayerSelectedMenuRow(%0) <_fixes_ALS : _fixes_ALS_go>
  5021.    
  5022.     _FIXES_FORWARD FIXES_OnPlayerSelectedMenuRow(playerid, row);
  5023. #endif
  5024.  
  5025. /*
  5026.  * OnPlayerExitedMenu(playerid)
  5027.  *
  5028.  * FIXES:
  5029.  *     GetPlayerMenu
  5030.  */
  5031.  
  5032. #if FIX_GetPlayerMenu
  5033.     public OnPlayerExitedMenu(playerid)
  5034.     {
  5035.         // ======================
  5036.         //  BEGIN: GetPlayerMenu
  5037.         // ======================
  5038.         #if FIXES_Single
  5039.             FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
  5040.             new
  5041.                 ret = FIXES_OnPlayerExitedMenu(playerid);
  5042.             if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))
  5043.             {
  5044.                 FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
  5045.             }
  5046.             return ret;
  5047.         #else
  5048.             new
  5049.                 Menu:cur = FIXES_gsCurrentMenu[playerid];
  5050.             _FIXES_IS_IN_CHARGE()
  5051.             {
  5052.                 setproperty(5, FIXES_gscMenuProperty, _:cur);
  5053.                 CallRemoteFunction(FIXES_gscClearPlayerMenu, FIXES_gscSpec@i, playerid);
  5054.                 FIXES_gsCurrentMenu[playerid] = cur;
  5055.                 new
  5056.                     ret = FIXES_OnPlayerExitedMenu(playerid);
  5057.                 if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))
  5058.                 {
  5059.                     FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
  5060.                 }
  5061.                 return ret;
  5062.             }
  5063.             else
  5064.             {
  5065.                 FIXES_gsCurrentMenu[playerid] = Menu:getproperty(5, FIXES_gscMenuProperty);
  5066.                 FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
  5067.                 new
  5068.                     ret = FIXES_OnPlayerExitedMenu(playerid);
  5069.                 if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))
  5070.                 {
  5071.                     FIXES_gsCurrentMenu[playerid] = cur;
  5072.                 }
  5073.                 return ret;
  5074.             }
  5075.         #endif
  5076.         // ======================
  5077.         //  END:   GetPlayerMenu
  5078.         // ======================
  5079.     }
  5080.    
  5081.     #if defined _ALS_OnPlayerExitedMenu
  5082.         #error _ALS_OnPlayerExitedMenu defined
  5083.     #endif
  5084.     #define _ALS_OnPlayerExitedMenu
  5085.     #define OnPlayerExitedMenu(%0) FIXES_OnPlayerExitedMenu(%0) <_fixes_ALS : _fixes_ALS_go>
  5086.    
  5087.     _FIXES_FORWARD FIXES_OnPlayerExitedMenu(playerid);
  5088. #endif
  5089.  
  5090. /*
  5091.  * FIXES_IS_VALID_MENU(Menu:menuid)
  5092.  *
  5093.  * FIXES:
  5094.  *     Menus
  5095.  */
  5096.  
  5097. #if _FIX_Menus
  5098.     #define FIXES_IS_VALID_MENU(%0) (_FIXES_IN_RANGE(_:(%0), 0, MAX_MENUS) && (FIXES_gsValidMenus[_:(%0) >>> 5] & (1 << (_:(%0) & 0x1F))))
  5099. #endif
  5100.  
  5101. /*
  5102.  * Menu:FIXES_CreateMenu(const title[], columns, Float:x, Float:y, Float:col1width, Float:col2width = 0.0)
  5103.  *
  5104.  * FIXES:
  5105.  *     Menus
  5106.  */
  5107.  
  5108. #if defined _ALS_CreateMenu
  5109.     #error _ALS_CreateMenu defined
  5110. #endif
  5111. native Menu:BAD_CreateMenu(const title[], columns, Float:x, Float:y, Float:col1width, Float:col2width = 0.0) = CreateMenu;
  5112.  
  5113. #if _FIX_Menus
  5114.     #if !FIXES_Single
  5115.         forward _FIXES_CreateMenu(ret);
  5116.        
  5117.         public _FIXES_CreateMenu(ret)
  5118.         {
  5119.             FIXES_gsValidMenus[ret >>> 5] |= 1 << (ret & 0x1F);
  5120.         }
  5121.     #endif
  5122.    
  5123.     stock Menu:FIXES_CreateMenu(const title[], columns, Float:x, Float:y, Float:col1width, Float:col2width = 0.0)
  5124.     {
  5125.         new
  5126.             Menu:ret = CreateMenu(title, columns, x, y, col1width, col2width);
  5127.         if (_FIXES_IN_RANGE(_:ret, 0, MAX_MENUS))
  5128.         {
  5129.             #if FIXES_Single
  5130.                 FIXES_gsValidMenus[_:ret >>> 5] |= 1 << (_:ret & 0x1F);
  5131.             #else
  5132.                 CallRemoteFunction("_FIXES_CreateMenu", FIXES_gscSpec@i, _:ret);
  5133.             #endif
  5134.         }
  5135.         return ret;
  5136.     }
  5137.    
  5138.     #define _ALS_CreateMenu
  5139.     #define CreateMenu FIXES_CreateMenu
  5140. #endif
  5141.  
  5142. /*
  5143.  * _FIXES_SetPlayerMenu(playerid, Menu:menuid)
  5144.  *
  5145.  * FIXES:
  5146.  *     GetPlayerMenu
  5147.  */
  5148.  
  5149. #if FIX_GetPlayerMenu && !FIXES_Single
  5150.     forward _FIXES_SetPlayerMenu(playerid, Menu:menuid);
  5151.    
  5152.     public _FIXES_SetPlayerMenu(playerid, Menu:menuid)
  5153.     {
  5154.         FIXES_gsSettings |= e_FIXES_SETTINGS_MENU_SET;
  5155.         FIXES_gsCurrentMenu[playerid] = menuid;
  5156.     }
  5157. #endif
  5158.  
  5159. /*
  5160.  * _FIXES_ClearPlayerMenu(playerid)
  5161.  *
  5162.  * FIXES:
  5163.  *     GetPlayerMenu
  5164.  */
  5165.  
  5166. #if FIX_GetPlayerMenu && !FIXES_Single
  5167.     forward _FIXES_ClearPlayerMenu(playerid);
  5168.    
  5169.     public _FIXES_ClearPlayerMenu(playerid)
  5170.     {
  5171.         FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
  5172.         FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
  5173.     }
  5174. #endif
  5175.  
  5176. /*
  5177.  * Menu:FIXES_DestroyMenu(Menu:menuid)
  5178.  *
  5179.  * FIXES:
  5180.  *     GetPlayerMenu
  5181.  */
  5182.  
  5183. #if defined _ALS_DestroyMenu
  5184.     #error _ALS_DestroyMenu defined
  5185. #endif
  5186. native BAD_DestroyMenu(Menu:menuid) = DestroyMenu;
  5187.  
  5188. #if _FIX_Menus || FIX_GetPlayerMenu
  5189.     #if _FIX_Menus && !FIXES_Single
  5190.         forward _FIXES_DestroyMenu(ret);
  5191.        
  5192.         public _FIXES_DestroyMenu(ret)
  5193.         {
  5194.             FIXES_gsValidMenus[ret >>> 5] &= ~(1 << (ret & 0x1F));
  5195.         }
  5196.     #endif
  5197.    
  5198.     stock FIXES_DestroyMenu(Menu:menuid)
  5199.     {
  5200.         #if _FIX_Menus
  5201.             if (FIXES_IS_VALID_MENU(menuid))
  5202.         #endif
  5203.             {
  5204.                 if (DestroyMenu(Menu:menuid))
  5205.                 {
  5206.                     #if _FIX_Menus
  5207.                         #if FIXES_Single
  5208.                             FIXES_gsValidMenus[_:menuid >>> 5] &= ~(1 << (_:menuid & 0x1F));
  5209.                         #else
  5210.                             CallRemoteFunction("_FIXES_DestroyMenu", FIXES_gscSpec@i, _:menuid);
  5211.                         #endif
  5212.                     #endif
  5213.                     _FIXES_FOREACH(FIXES_gsPlayersIterator, playerid)
  5214.                     {
  5215.                         if (FIXES_gsCurrentMenu[playerid] == menuid)
  5216.                         {
  5217.                             if (HideMenuForPlayer(menuid, playerid))
  5218.                             {
  5219.                                 #if FIXES_Single
  5220.                                     FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
  5221.                                     FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
  5222.                                 #else
  5223.                                     CallRemoteFunction(FIXES_gscSetPlayerMenu, FIXES_gscSpec@ii, playerid, INVALID_MENU);
  5224.                                 #endif
  5225.                             }
  5226.                         }
  5227.                     }
  5228.                     return 1;
  5229.                 }
  5230.             }
  5231.             return 0;
  5232.     }
  5233.    
  5234.     #define _ALS_DestroyMenu
  5235.     #define DestroyMenu FIXES_DestroyMenu
  5236. #endif
  5237.  
  5238. /*
  5239.  * FIXES_AddMenuItem(Menu:menuid, column, const menutext[])
  5240.  *
  5241.  * FIXES:
  5242.  *     AddMenuItem
  5243.  */
  5244.  
  5245. #if defined _ALS_AddMenuItem
  5246.     #error _ALS_AddMenuItem defined
  5247. #endif
  5248. native BAD_AddMenuItem(Menu:menuid, column, const menutext[]) = AddMenuItem;
  5249.  
  5250. #if FIX_AddMenuItem
  5251.     stock FIXES_AddMenuItem(Menu:menuid, column, const menutext[])
  5252.     {
  5253.         if (FIXES_IS_VALID_MENU(menuid))
  5254.         {
  5255.             return AddMenuItem(menuid, column, menutext);
  5256.         }
  5257.         return 0;
  5258.     }
  5259.    
  5260.     #define _ALS_AddMenuItem
  5261.     #define AddMenuItem FIXES_AddMenuItem
  5262. #endif
  5263.  
  5264. /*
  5265.  * FIXES_SetMenuColumnHeader(Menu:menuid, column, const columnheader[])
  5266.  *
  5267.  * FIXES:
  5268.  *     SetMenuColumnHeader
  5269.  */
  5270.  
  5271. #if defined _ALS_SetMenuColumnHeader
  5272.     #error _ALS_SetMenuColumnHeader defined
  5273. #endif
  5274. native BAD_SetMenuColumnHeader(Menu:menuid, column, const columnheader[]) = SetMenuColumnHeader;
  5275.  
  5276. #if FIX_SetMenuColumnHeader
  5277.     stock FIXES_SetMenuColumnHeader(Menu:menuid, column, const columnheader[])
  5278.     {
  5279.         if (FIXES_IS_VALID_MENU(menuid))
  5280.         {
  5281.             return SetMenuColumnHeader(menuid, column, columnheader);
  5282.         }
  5283.         return 0;
  5284.     }
  5285.    
  5286.     #define _ALS_SetMenuColumnHeader
  5287.     #define SetMenuColumnHeader FIXES_SetMenuColumnHeader
  5288. #endif
  5289.  
  5290. /*
  5291.  * FIXES_ShowMenuForPlayer(Menu:menuid, playerid)
  5292.  *
  5293.  * FIXES:
  5294.  *     ShowMenuForPlayer
  5295.  *     GetPlayerMenu
  5296.  */
  5297.  
  5298. #if defined _ALS_ShowMenuForPlayer
  5299.     #error _ALS_ShowMenuForPlayer defined
  5300. #endif
  5301. native BAD_ShowMenuForPlayer(Menu:menuid, playerid) = ShowMenuForPlayer;
  5302.  
  5303. #if FIX_ShowMenuForPlayer || FIX_GetPlayerMenu
  5304.     stock FIXES_ShowMenuForPlayer(Menu:menuid, playerid)
  5305.     {
  5306.         #if FIX_ShowMenuForPlayer
  5307.             if (FIXES_IS_VALID_MENU(menuid))
  5308.         #endif
  5309.             {
  5310.                 #if FIX_GetPlayerMenu
  5311.                     if (ShowMenuForPlayer(menuid, playerid))
  5312.                     {
  5313.                         #if FIXES_Single
  5314.                             FIXES_gsSettings |= e_FIXES_SETTINGS_MENU_SET;
  5315.                             FIXES_gsCurrentMenu[playerid] = menuid;
  5316.                         #else
  5317.                             CallRemoteFunction(FIXES_gscSetPlayerMenu, FIXES_gscSpec@ii, playerid, _:menuid);
  5318.                         #endif
  5319.                         return 1;
  5320.                     }
  5321.                 #else
  5322.                     return ShowMenuForPlayer(menuid, playerid);
  5323.                 #endif
  5324.             }
  5325.         return 0;
  5326.     }
  5327.    
  5328.     #define _ALS_ShowMenuForPlayer
  5329.     #define ShowMenuForPlayer FIXES_ShowMenuForPlayer
  5330. #endif
  5331.  
  5332. /*
  5333.  * FIXES_HideMenuForPlayer(Menu:menuid, playerid)
  5334.  *
  5335.  * FIXES:
  5336.  *     HideMenuForPlayer
  5337.  *     HideMenuForPlayer_2
  5338.  *     GetPlayerMenu
  5339.  */
  5340.  
  5341. #if defined _ALS_HideMenuForPlayer
  5342.     #error _ALS_HideMenuForPlayer defined
  5343. #endif
  5344. native BAD_HideMenuForPlayer(Menu:menuid, playerid) = HideMenuForPlayer;
  5345.  
  5346. #if FIX_HideMenuForPlayer || FIX_GetPlayerMenu
  5347.     stock FIXES_HideMenuForPlayer(Menu:menuid, playerid)
  5348.     {
  5349.         #if FIX_HideMenuForPlayer
  5350.             if (FIXES_IS_VALID_MENU(menuid))
  5351.         #endif
  5352.             {
  5353.                 #if FIX_GetPlayerMenu
  5354.                     #if FIX_HideMenuForPlayer_2
  5355.                         if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS) && FIXES_gsCurrentMenu[playerid] == menuid)
  5356.                     #else
  5357.                         if (FIXES_gsCurrentMenu[playerid] == menuid && HideMenuForPlayer(menuid, playerid))
  5358.                     #endif
  5359.                         {
  5360.                             #if FIXES_Single
  5361.                                 FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
  5362.                                 FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
  5363.                             #else
  5364.                                 CallRemoteFunction(FIXES_gscSetPlayerMenu, FIXES_gscSpec@ii, playerid, INVALID_MENU);
  5365.                             #endif
  5366.                             #if FIX_HideMenuForPlayer_2
  5367.                                 return HideMenuForPlayer(menuid, playerid);
  5368.                             #else
  5369.                                 return 1;
  5370.                             #endif
  5371.                         }
  5372.                 #else
  5373.                     return HideMenuForPlayer(menuid, playerid);
  5374.                 #endif
  5375.             }
  5376.         return 0;
  5377.     }
  5378.    
  5379.     #define _ALS_HideMenuForPlayer
  5380.     #define HideMenuForPlayer FIXES_HideMenuForPlayer
  5381. #endif
  5382.  
  5383. /*
  5384.  * FIXES_DisableMenu(Menu:menuid)
  5385.  *
  5386.  * FIXES:
  5387.  *     DisableMenu
  5388.  */
  5389.  
  5390. #if defined _ALS_DisableMenu
  5391.     #error _ALS_DisableMenu defined
  5392. #endif
  5393. native BAD_DisableMenu(Menu:menuid) = DisableMenu;
  5394.  
  5395. #if FIX_DisableMenu
  5396.     stock FIXES_DisableMenu(Menu:menuid)
  5397.     {
  5398.         if (FIXES_IS_VALID_MENU(menuid))
  5399.         {
  5400.             return DisableMenu(menuid);
  5401.         }
  5402.         return 0;
  5403.     }
  5404.    
  5405.     #define _ALS_DisableMenu
  5406.     #define DisableMenu FIXES_DisableMenu
  5407. #endif
  5408.  
  5409. /*
  5410.  * FIXES_DisableMenuRow(Menu:menuid, row)
  5411.  *
  5412.  * FIXES:
  5413.  *     DisableMenuRow
  5414.  */
  5415.  
  5416. #if defined _ALS_DisableMenuRow
  5417.     #error _ALS_DisableMenuRow defined
  5418. #endif
  5419. native BAD_DisableMenuRow(Menu:menuid, row) = DisableMenuRow;
  5420.  
  5421. #if FIX_DisableMenuRow
  5422.     stock FIXES_DisableMenuRow(Menu:menuid, row)
  5423.     {
  5424.         if (FIXES_IS_VALID_MENU(menuid))
  5425.         {
  5426.             return DisableMenuRow(menuid, row);
  5427.         }
  5428.         return 0;
  5429.     }
  5430.    
  5431.     #define _ALS_DisableMenuRow
  5432.     #define DisableMenuRow FIXES_DisableMenuRow
  5433. #endif
  5434.  
  5435. /*
  5436.  * Menu:FIXES_GetPlayerMenu(playerid)
  5437.  *
  5438.  * FIXES:
  5439.  *     GetPlayerMenu
  5440.  */
  5441.  
  5442. #if defined _ALS_GetPlayerMenu
  5443.     #error _ALS_GetPlayerMenu defined
  5444. #endif
  5445. native BAD_GetPlayerMenu(playerid) = GetPlayerMenu;
  5446.  
  5447. #if FIX_GetPlayerMenu
  5448.     stock Menu:FIXES_GetPlayerMenu(playerid)
  5449.     {
  5450.         if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  5451.         {
  5452.             return FIXES_gsCurrentMenu[playerid];
  5453.         }
  5454.         return Menu:INVALID_MENU;
  5455.     }
  5456.    
  5457.     #define _ALS_GetPlayerMenu
  5458.     #define GetPlayerMenu FIXES_GetPlayerMenu
  5459. #endif
  5460.  
  5461. /*
  5462.  * OnPlayerStateChange(playerid, newstate, oldstate)
  5463.  *
  5464.  * FIXES:
  5465.  *     HydraSniper
  5466.  *     GetPlayerWeapon
  5467.  *     PutPlayerInVehicle
  5468.  *     TrainExit
  5469.  */
  5470.  
  5471. #if FIX_HydraSniper || FIX_GetPlayerWeapon || FIX_PutPlayerInVehicle || FIX_OnPlayerEnterVehicle || FIX_TrainExit
  5472.     public OnPlayerStateChange(playerid, newstate, oldstate)
  5473.     {
  5474.         #if !FIXES_Single
  5475.             if (!(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE))
  5476.             {
  5477.                 return FIXES_OnPlayerStateChange(playerid, newstate, oldstate);
  5478.             }
  5479.         #endif
  5480.        
  5481.         // =============================
  5482.         //  BEGIN: OnPlayerEnterVehicle
  5483.         // =============================
  5484.         #if FIX_OnPlayerEnterVehicle
  5485.                 if (newstate == PLAYER_STATE_PASSENGER)
  5486.                 {
  5487.                     new
  5488.                         model = GetVehicleModel(GetPlayerVehicleID(playerid)) - 400;
  5489.                     if (_FIXES_IN_RANGE(model, 0, 211 + 1))
  5490.                     {
  5491.                         new
  5492.                             seat = GetPlayerVehicleSeat(playerid);
  5493.                         if (seat != 128)
  5494.                         {
  5495.                             model = (FIXES_gscMaxPassengers[model >>> 3] >>> ((model & 7) << 2)) & 0xF;
  5496.                             if (model == 0 || model == 15)
  5497.                             {
  5498.                                 // Shouldn't be in this vehicle at all.
  5499.                                 FIXES_BlockUpdate(playerid, true);
  5500.                             }
  5501.                             else if (!(0 < seat <= model)) // Slower with "_FIXES_NO_RANGE".
  5502.                             {
  5503.                                 // In an out of range seat.
  5504.                                 FIXES_BlockUpdate(playerid, true);
  5505.                             }
  5506.                         }
  5507.                     }
  5508.                     else
  5509.                     {
  5510.                         FIXES_BlockUpdate(playerid, true);
  5511.                     }
  5512.                 }
  5513.                 else if (newstate == PLAYER_STATE_DRIVER)
  5514.                 {
  5515.                         new
  5516.                             model = GetPlayerVehicleSeat(playerid);
  5517.                         if (model != 128)
  5518.                         {
  5519.                             if (model == 0)
  5520.                             {
  5521.                                 model = GetVehicleModel(GetPlayerVehicleID(playerid)) - 400;
  5522.                                 if (_FIXES_NO_RANGE(model, 0, 211 + 1) || FIXES_gscMaxPassengers[model >>> 3] >>> ((model & 7) << 2) & 0xF == 15)
  5523.                                 {
  5524.                                     // In an invalid vehicle (one you can't drive).
  5525.                                     FIXES_BlockUpdate(playerid, true);
  5526.                                 }
  5527.                             }
  5528.                             else
  5529.                             {
  5530.                                 // They are a driver, but not in the driver's seat.
  5531.                                 FIXES_BlockUpdate(playerid, true);
  5532.                             }
  5533.                         }
  5534.                     #if FIX_HydraSniper
  5535.                         else
  5536.                         {
  5537.                             model = GetVehicleModel(GetPlayerVehicleID(playerid));
  5538.                         }
  5539.                     #endif
  5540.             #if !FIX_HydraSniper
  5541.                 }
  5542.             #endif
  5543.         #endif
  5544.         // =============================
  5545.         //  END:   OnPlayerEnterVehicle
  5546.         // =============================
  5547.        
  5548.         // ====================
  5549.         //  BEGIN: HydraSniper
  5550.         // ====================
  5551.         #if FIX_HydraSniper
  5552.             #if !FIX_OnPlayerEnterVehicle
  5553.                 // Only called if the same check above isn't called.
  5554.                 if (newstate == PLAYER_STATE_DRIVER)
  5555.                 {
  5556.                     new
  5557.                         model = GetVehicleModel(GetPlayerVehicleID(playerid));
  5558.             #endif
  5559.                     if (GetPlayerWeapon(playerid) == 34 && (model == 520 || model == 425))
  5560.                     {
  5561.                         SetPlayerArmedWeapon(playerid, 0);
  5562.                         #if FIX_GetPlayerWeapon
  5563.                             // This is the first cross-dependednt fix.
  5564.                             #if FIXES_Single
  5565.                                 FIXES_gsPlayerWeapon[playerid] = 0;
  5566.                             #else
  5567.                                 SetPVarInt(playerid, FIXES_pvarPlayerWeapon, 0);
  5568.                             #endif
  5569.                         #endif
  5570.                     }
  5571.                 }
  5572.         #endif
  5573.         // ====================
  5574.         //  END:   HydraSniper
  5575.         // ====================
  5576.        
  5577.         #if FIX_GetPlayerWeapon || FIX_PutPlayerInVehicle || FIX_TrainExit
  5578.             #if PLAYER_STATE_PASSENGER != PLAYER_STATE_DRIVER + 1
  5579.                 #error FIX_GetPlayerWeapon/FIX_PutPlayerInVehicle state assertation failed.
  5580.             #endif
  5581.             if (_FIXES_IN_RANGE(oldstate, PLAYER_STATE_DRIVER, PLAYER_STATE_PASSENGER + 1))
  5582.             {
  5583.                 #if FIX_PutPlayerInVehicle || FIX_TrainExit
  5584.                     new
  5585.                         e_FIXES_BOOLS:bools = FIXES_gsPlayerBools[playerid];
  5586.                 #endif
  5587.                
  5588.                 // ========================
  5589.                 //  BEGIN: GetPlayerWeapon
  5590.                 // ========================
  5591.                 #if FIX_GetPlayerWeapon
  5592.                     #if FIXES_Single
  5593.                         FIXES_gsPlayerWeapon[playerid] = -1;
  5594.                     #else
  5595.                         SetPVarInt(playerid, FIXES_pvarPlayerWeapon, -1);
  5596.                     #endif
  5597.                 #endif
  5598.                 // ========================
  5599.                 //  END:   GetPlayerWeapon
  5600.                 // ========================
  5601.                
  5602.                 // ==================
  5603.                 //  BEGIN: TrainExit
  5604.                 // ==================
  5605.                 #if FIX_TrainExit
  5606.                     FIXES_PRINTF("train exit");
  5607.                     if (bools & e_FIXES_BOOLS_PUT_IN_TRAIN)
  5608.                     {
  5609.                         FIXES_PRINTF("OK");
  5610.                         SetCameraBehindPlayer(playerid),
  5611.                         bools &= ~e_FIXES_BOOLS_PUT_IN_TRAIN;
  5612.                     }
  5613.                 #endif
  5614.                 // ==================
  5615.                 //  END:   TrainExit
  5616.                 // ==================
  5617.                
  5618.                 // ===========================
  5619.                 //  BEGIN: PutPlayerInVehicle
  5620.                 // ===========================
  5621.                 #if FIX_PutPlayerInVehicle
  5622.                     // Update their vehicle once we KNOW the client has done the
  5623.                     // removal from the vehicle.
  5624.                     if (bools & e_FIXES_BOOLS_PUT_IN_VEHICLE)
  5625.                     {
  5626.                         new
  5627.                             vid = FIXES_gsVehicleSeatData[playerid] & 0x00FFFFFF;
  5628.                         // Limited to "only" 16777216 vehicles and 256 seats.
  5629.                         PutPlayerInVehicle(playerid, vid, FIXES_gsVehicleSeatData[playerid] >>> 24),
  5630.                         bools &= ~e_FIXES_BOOLS_PUT_IN_VEHICLE;
  5631.                         #if FIX_TrainExit
  5632.                             switch (GetVehicleModel(vid))
  5633.                             {
  5634.                                 case 449, 537, 538:
  5635.                                 {
  5636.                                     bools |= e_FIXES_BOOLS_PUT_IN_TRAIN;
  5637.                                 }
  5638.                             }
  5639.                         #endif
  5640.                     }
  5641.                 #endif
  5642.                 // ===========================
  5643.                 //  END:   PutPlayerInVehicle
  5644.                 // ===========================
  5645.                
  5646.                 #if FIX_PutPlayerInVehicle || FIX_TrainExit
  5647.                     FIXES_gsPlayerBools[playerid] = bools;
  5648.                 #endif
  5649.             }
  5650.         #endif
  5651.        
  5652.         return FIXES_OnPlayerStateChange(playerid, newstate, oldstate);
  5653.     }
  5654.    
  5655.     #if defined _ALS_OnPlayerStateChange
  5656.         #error _ALS_OnPlayerStateChange defined
  5657.     #endif
  5658.     #define _ALS_OnPlayerStateChange
  5659.     #define OnPlayerStateChange(%0) FIXES_OnPlayerStateChange(%0) <_fixes_ALS : _fixes_ALS_go>
  5660.    
  5661.     _FIXES_FORWARD FIXES_OnPlayerStateChange(playerid, newstate, oldstate);
  5662. #endif
  5663.  
  5664. /*
  5665.  * FIXES_GivePlayerWeapon(playerid, weaponid, ammo)
  5666.  *
  5667.  * FIXES:
  5668.  *     HydraSniper
  5669.  */
  5670.  
  5671. #if defined _ALS_GivePlayerWeapon
  5672.     #error _ALS_GivePlayerWeapon defined
  5673. #endif
  5674. native BAD_GivePlayerWeapon(playerid, weaponid, ammo) = GivePlayerWeapon;
  5675.  
  5676. #if FIX_HydraSniper
  5677.     stock FIXES_GivePlayerWeapon(playerid, weaponid, ammo)
  5678.     {
  5679.         new
  5680.             vid = GetPlayerVehicleID(playerid);
  5681.         if (vid)
  5682.         {
  5683.             vid = GetVehicleModel(vid);
  5684.             if (weaponid == 34 && (vid == 520 || vid == 425))
  5685.             {
  5686.                 vid = GivePlayerWeapon(playerid, weaponid, ammo),
  5687.                 SetPlayerArmedWeapon(playerid, 0);
  5688.                 #if FIX_GetPlayerWeapon
  5689.                     #if FIXES_Single
  5690.                         FIXES_gsPlayerWeapon[playerid] = 0;
  5691.                     #else
  5692.                         SetPVarInt(playerid, FIXES_pvarPlayerWeapon, 0);
  5693.                     #endif
  5694.                 #endif
  5695.                 return vid;
  5696.             }
  5697.         }
  5698.         return GivePlayerWeapon(playerid, weaponid, ammo);
  5699.     }
  5700.    
  5701.     #define _ALS_GivePlayerWeapon
  5702.     #define GivePlayerWeapon FIXES_GivePlayerWeapon
  5703. #endif
  5704.  
  5705. /*
  5706.  * FIXES_SetPlayerArmedWeapon(playerid, weaponid)
  5707.  *
  5708.  * FIXES:
  5709.  *     GetPlayerWeapon
  5710.  */
  5711.  
  5712. #if defined _ALS_SetPlayerArmedWeapon
  5713.     #error _ALS_SetPlayerArmedWeapon defined
  5714. #endif
  5715. native BAD_SetPlayerArmedWeapon(playerid, weaponid) = SetPlayerArmedWeapon;
  5716.  
  5717. #if FIX_GetPlayerWeapon
  5718.     stock FIXES_SetPlayerArmedWeapon(playerid, weaponid)
  5719.     {
  5720.         #if FIX_AllowInteriorWeapons
  5721.             if (FIXES_gsSettings & e_FIXES_SETTINGS_INTERIOR && GetPlayerInterior(playerid))
  5722.             {
  5723.                 // Not allowed weapons.
  5724.                 return 0;
  5725.             }
  5726.         #endif
  5727.         new
  5728.             vid = GetPlayerVehicleID(playerid);
  5729.         if (vid)
  5730.         {
  5731.             #if FIX_HydraSniper
  5732.                 vid = GetVehicleModel(vid);
  5733.                 if (weaponid == 34 && (vid == 520 || vid == 425))
  5734.                 {
  5735.                     return 0;
  5736.                 }
  5737.             #endif
  5738.             //FIXES_gsPlayerWeapon[playerid] = weaponid;
  5739.             #if FIXES_Single
  5740.                 FIXES_gsPlayerWeapon[playerid] = weaponid;
  5741.             #else
  5742.                 SetPVarInt(playerid, FIXES_pvarPlayerWeapon, weaponid);
  5743.             #endif
  5744.         }
  5745.         return SetPlayerArmedWeapon(playerid, weaponid);
  5746.     }
  5747.    
  5748.     #define _ALS_SetPlayerArmedWeapon
  5749.     #define SetPlayerArmedWeapon FIXES_SetPlayerArmedWeapon
  5750. #endif
  5751.  
  5752. /*
  5753.  * FIXES_GetPlayerWeapon(playerid)
  5754.  *
  5755.  * FIXES:
  5756.  *     GetPlayerWeapon
  5757.  */
  5758.  
  5759. #if defined _ALS_GetPlayerWeapon
  5760.     #error _ALS_GetPlayerWeapon defined
  5761. #endif
  5762. native BAD_GetPlayerWeapon(playerid) = GetPlayerWeapon;
  5763.  
  5764. #if FIX_GetPlayerWeapon
  5765.     stock FIXES_GetPlayerWeapon(playerid)
  5766.     {
  5767.         #if FIXES_Single
  5768.             new
  5769.                 ret = FIXES_gsPlayerWeapon[playerid];
  5770.         #else
  5771.             new
  5772.                 ret = GetPVarInt(playerid, FIXES_pvarPlayerWeapon);
  5773.         #endif
  5774.         if (ret == -1)
  5775.         {
  5776.             return GetPlayerWeapon(playerid);
  5777.         }
  5778.         return ret;
  5779.     }
  5780.    
  5781.     #define _ALS_GetPlayerWeapon
  5782.     #define GetPlayerWeapon FIXES_GetPlayerWeapon
  5783. #endif
  5784.  
  5785. /*
  5786.  * FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid)
  5787.  *
  5788.  * FIXES:
  5789.  *     PutPlayerInVehicle
  5790.  */
  5791.  
  5792. #if defined _ALS_PutPlayerInVehicle
  5793.     #error _ALS_PutPlayerInVehicle defined
  5794. #endif
  5795. native BAD_PutPlayerInVehicle(playerid, vehicleid, seatid) = PutPlayerInVehicle;
  5796.  
  5797. #if FIX_PutPlayerInVehicle || FIX_TrainExit
  5798.     #if FIXES_Single
  5799.         stock FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid)
  5800.         {
  5801.             // ==================
  5802.             //  BEGIN: TrainExit
  5803.             // ==================
  5804.             #if FIX_TrainExit
  5805.                 FIXES_PRINTF("TrainExit %d", GetVehicleModel(vehicleid));
  5806.                 switch (GetVehicleModel(vehicleid))
  5807.                 {
  5808.                     case 449, 537, 538:
  5809.                     {
  5810.                         FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_TRAIN;
  5811.                     }
  5812.                 }
  5813.             #endif
  5814.             // ==================
  5815.             //  END:   TrainExit
  5816.             // ==================
  5817.            
  5818.             // ===========================
  5819.             //  BEGIN: PutPlayerInVehicle
  5820.             // ===========================
  5821.             #if FIX_PutPlayerInVehicle
  5822.                 new
  5823.                     vid = GetPlayerVehicleID(playerid);
  5824.                 if (vid)
  5825.                 {
  5826.                     new
  5827.                         Float:x,
  5828.                         Float:y,
  5829.                         Float:z;
  5830.                     // Remove them without the animation.
  5831.                     return
  5832.                         GetVehiclePos(vid, x, y, z),
  5833.                         SetPlayerPos(playerid, x, y, z),
  5834.                         FIXES_gsVehicleSeatData[playerid] = seatid << 24 | vehicleid,
  5835.                         FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_VEHICLE,
  5836.                         1;
  5837.                 }
  5838.             #endif
  5839.             // ===========================
  5840.             //  END:   PutPlayerInVehicle
  5841.             // ===========================
  5842.             return PutPlayerInVehicle(playerid, vehicleid, seatid);
  5843.         }
  5844.     #else
  5845.         forward _FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid, from, data);
  5846.        
  5847.         stock FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid)
  5848.         {
  5849.             FIXES_PRINTF("NOT SINGLE");
  5850.             // ===========================
  5851.             //  BEGIN: PutPlayerInVehicle
  5852.             // ===========================
  5853.             #if FIX_PutPlayerInVehicle
  5854.                 new
  5855.                     vid = GetPlayerVehicleID(playerid);
  5856.                 if (vid)
  5857.                 {
  5858.                     new
  5859.                         Float:x,
  5860.                         Float:y,
  5861.                         Float:z;
  5862.                     // Remove them without the animation.
  5863.                     return
  5864.                         GetVehiclePos(vid, x, y, z),
  5865.                         SetPlayerPos(playerid, x, y, z),
  5866.                         CallRemoteFunction(FIXES_gscPutPlayerInVehicle, FIXES_gscSpec@iiiii, playerid, vehicleid, seatid, 1, vid),
  5867.                         1;
  5868.                 }
  5869.             #endif
  5870.             // ===========================
  5871.             //  END:   PutPlayerInVehicle
  5872.             // ===========================
  5873.            
  5874.             // ==================
  5875.             //  BEGIN: TrainExit
  5876.             // ==================
  5877.             #if FIX_TrainExit
  5878.                 new
  5879.                     model = GetVehicleModel(vehicleid);
  5880.                 switch (model)
  5881.                 {
  5882.                     case 449, 537, 538:
  5883.                     {
  5884.                         CallRemoteFunction(FIXES_gscPutPlayerInVehicle, FIXES_gscSpec@iiiii, playerid, vehicleid, seatid, 0, model);
  5885.                         //FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_TRAIN;
  5886.                     }
  5887.                 }
  5888.             #endif
  5889.             // ==================
  5890.             //  END:   TrainExit
  5891.             // ==================
  5892.             return PutPlayerInVehicle(playerid, vehicleid, seatid);
  5893.         }
  5894.        
  5895.         public _FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid, from, data)
  5896.         {
  5897.             FIXES_PRINTF("IN CHARGE: %d", (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE));
  5898.             _FIXES_IS_IN_CHARGE()
  5899.             {
  5900.                 // ===========================
  5901.                 //  BEGIN: PutPlayerInVehicle
  5902.                 // ===========================
  5903.                 #if FIX_PutPlayerInVehicle
  5904.                     if (from)
  5905.                     {
  5906.                         FIXES_gsVehicleSeatData[playerid] = seatid << 24 | vehicleid,
  5907.                         FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_VEHICLE;
  5908.                     }
  5909.                 #endif
  5910.                 // ===========================
  5911.                 //  END:   PutPlayerInVehicle
  5912.                 // ===========================
  5913.                
  5914.                 // ==================
  5915.                 //  BEGIN: TrainExit
  5916.                 // ==================
  5917.                 #if FIX_TrainExit
  5918.                     #if FIX_PutPlayerInVehicle
  5919.                         else
  5920.                     #else
  5921.                         if (!from)
  5922.                     #endif
  5923.                         {
  5924.                             switch (data)
  5925.                             {
  5926.                                 case 449, 537, 538:
  5927.                                 {
  5928.                                     FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_TRAIN;
  5929.                                 }
  5930.                             }
  5931.                         }
  5932.                 #endif
  5933.                 // ==================
  5934.                 //  END:   TrainExit
  5935.                 // ==================
  5936.             }
  5937.             return 1;
  5938.         }
  5939.     #endif
  5940.    
  5941.     #define _ALS_PutPlayerInVehicle
  5942.     #define PutPlayerInVehicle FIXES_PutPlayerInVehicle
  5943. #endif
  5944.  
  5945. /*
  5946.  * FIXES_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size)
  5947.  *
  5948.  * FIXES:
  5949.  *     SetPlayerCheckpoint
  5950.  */
  5951.  
  5952. #if defined _ALS_SetPlayerCheckpoint
  5953.     #error _ALS_SetPlayerCheckpoint defined
  5954. #endif
  5955. native BAD_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size) = SetPlayerCheckpoint;
  5956.  
  5957. #if FIX_SetPlayerCheckpoint
  5958.     stock FIXES_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size)
  5959.     {
  5960.         return
  5961.             DisablePlayerCheckpoint(playerid),
  5962.             SetPlayerCheckpoint(playerid, x, y, z, size);
  5963.     }
  5964.    
  5965.     #define _ALS_SetPlayerCheckpoint
  5966.     #define SetPlayerCheckpoint FIXES_SetPlayerCheckpoint
  5967. #endif
  5968.  
  5969. /*
  5970.  * FIXES_SetPlayerRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size)
  5971.  *
  5972.  * FIXES:
  5973.  *     SetPlayerRaceCheckpoint
  5974.  */
  5975.  
  5976. #if defined _ALS_SetPlayerRaceCheckpoint
  5977.     #error _ALS_SetPlayerRaceCheckpoint defined
  5978. #endif
  5979. native BAD_SetPlayerRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size) = SetPlayerRaceCheckpoint;
  5980.  
  5981. #if FIX_SetPlayerRaceCheckpoint
  5982.     stock FIXES_SetPlayerRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size)
  5983.     {
  5984.         return
  5985.             DisablePlayerRaceCheckpoint(playerid),
  5986.             SetPlayerRaceCheckpoint(playerid, type, x, y, z, nextx, nexty, nextz, size);
  5987.     }
  5988.    
  5989.     #define _ALS_SetPlayerRaceCheckpoint
  5990.     #define SetPlayerRaceCheckpoint FIXES_SetPlayerRaceCheckpoint
  5991. #endif
  5992.  
  5993. /*
  5994.  * _FIXES_HideGameTextForPlayer(playerid, style, parr[])
  5995.  *
  5996.  * Hides a GameText style for one or more players, and accounts for the fact
  5997.  * that they may have different messages being shown.
  5998.  *
  5999.  * FIXES:
  6000.  *     GameText
  6001.  */
  6002.  
  6003. #if FIX_GameText
  6004.     static stock _FIXES_HideGameTextForPlayer(playerid, style, parr[])
  6005.     {
  6006.         switch (playerid)
  6007.         {
  6008.             case MAX_PLAYERS:
  6009.             {
  6010.                 // Remove the global GameText for everyone that can see it.
  6011.                 TextDrawHideForAll(FIXES_gsGTStyle[style]);
  6012.             }
  6013.             case INVALID_PLAYER_ID:
  6014.             {
  6015.                 // Hide any player-local ones.  This is similar to "foreach".
  6016.                 playerid = parr[MAX_PLAYERS],
  6017.                 parr[MAX_PLAYERS] = MAX_PLAYERS;
  6018.                 for (new next; playerid != MAX_PLAYERS; playerid = next)
  6019.                 {
  6020.                     PlayerTextDrawHide(playerid, FIXES_gsPGTStyle[playerid][style]),
  6021.                     next = parr[playerid],
  6022.                     parr[playerid] = 0;
  6023.                 }
  6024.             }
  6025.             default:
  6026.             {
  6027.                 // Remove
  6028.                 PlayerTextDrawHide(playerid, FIXES_gsPGTStyle[playerid][style]),
  6029.                 _FIXES_RemoveInternal(parr, playerid, MAX_PLAYERS);
  6030.             }
  6031.         }
  6032.     }
  6033. #endif
  6034.  
  6035. /*
  6036.  * _FIXES_HideGameTextTimer(playerid, style)
  6037.  *
  6038.  * FIXES:
  6039.  *     GameText
  6040.  */
  6041.  
  6042. #if FIX_GameText
  6043.     forward _FIXES_HideGameTextTimer(playerid, style);
  6044.    
  6045.     public _FIXES_HideGameTextTimer(playerid, style)
  6046.     {
  6047.         if (GetTickCount() >= FIXES_gsGTTimer[style][playerid])
  6048.         {
  6049.             // Only hide it if it hasn't been re-shown in the interim.
  6050.             _FIXES_HideGameTextForPlayer(playerid, style, FIXES_gsPlayerPGTShown[style]);
  6051.         }
  6052.     }
  6053. #endif
  6054.  
  6055. /*
  6056.  * _FIXES_GameTextShow(playerid, string[], time, style)
  6057.  *
  6058.  * FIXES:
  6059.  *     GameText
  6060.  */
  6061.  
  6062. #if FIX_GameText
  6063.     forward _FIXES_GameTextShow(playerid, string[], time, style);
  6064.    
  6065.     public _FIXES_GameTextShow(playerid, string[], time, style)
  6066.     {
  6067.         _FIXES_IS_IN_CHARGE()
  6068.         {
  6069.             if (playerid == MAX_PLAYERS)
  6070.             {
  6071.                 _FIXES_HideGameTextForPlayer(INVALID_PLAYER_ID, style, FIXES_gsPlayerPGTShown[style]),
  6072.                 TextDrawSetString(FIXES_gsGTStyle[style], string),
  6073.                 TextDrawShowForAll(FIXES_gsGTStyle[style]);
  6074.             }
  6075.             else
  6076.             {
  6077.                 TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[style]),
  6078.                 PlayerTextDrawSetString(playerid, FIXES_gsPGTStyle[playerid][style], string),
  6079.                 PlayerTextDrawShow(playerid, FIXES_gsPGTStyle[playerid][style]),
  6080.                 _FIXES_AddInternal(FIXES_gsPlayerPGTShown[style], playerid, MAX_PLAYERS);
  6081.             }
  6082.             if (time)
  6083.             {
  6084.                 // Tiny offset because timers are inaccurate.
  6085.                 FIXES_gsGTTimer[style][playerid] = GetTickCount() + time - 10,
  6086.                 // Don't need to save the timer's ID.
  6087.                 SetTimerEx(FIXES_gscHideGameTextTimer, time, false, FIXES_gscSpec@ii, playerid, style);
  6088.             }
  6089.         }
  6090.         return 1;
  6091.     }
  6092. #endif
  6093.  
  6094. /*
  6095.  * FIXES_GameTextForAll(string[], time, style)
  6096.  *
  6097.  * FIXES:
  6098.  *     GameText
  6099.  */
  6100.  
  6101. #if defined _ALS_GameTextForAll
  6102.     #error _ALS_GameTextForAll defined
  6103. #endif
  6104. native BAD_GameTextForAll(const string[], time, style) = GameTextForAll;
  6105.  
  6106. #if FIX_GameText
  6107.     stock FIXES_GameTextForAll(string[], time, style)
  6108.     {
  6109.         if (_FIXES_IN_RANGE(style, 0, FIXES_GT_STYLE_COUNT))
  6110.         {
  6111.             if ((string[0] == '\0') || (string[0] == '\1' && string[1] == '\0'))
  6112.             {
  6113.                 #if FIXES_Single
  6114.                     return _FIXES_GameTextShow(MAX_PLAYERS, FIXES_gscSpace, time, style);
  6115.                 #else
  6116.                     return CallRemoteFunction(FIXES_gscGameTextShow, FIXES_gscSpec@isii, MAX_PLAYERS, FIXES_gscSpace, time, style);
  6117.                 #endif
  6118.             }
  6119.             else
  6120.             {
  6121.                 #if FIXES_Single
  6122.                     return _FIXES_GameTextShow(MAX_PLAYERS, string, time, style);
  6123.                 #else
  6124.                     return CallRemoteFunction(FIXES_gscGameTextShow, FIXES_gscSpec@isii, MAX_PLAYERS, string, time, style);
  6125.                 #endif
  6126.             }
  6127.         }
  6128.         return 0;
  6129.     }
  6130.    
  6131.     #define _ALS_GameTextForAll
  6132.    
  6133.     #define GameTextForAll FIXES_GameTextForAll
  6134. #endif
  6135.  
  6136. /*
  6137.  * FIXES_GameTextForPlayer(playerid, string[], time, style)
  6138.  *
  6139.  * FIXES:
  6140.  *     GameText
  6141.  */
  6142.  
  6143. #if defined _ALS_GameTextForPlayer
  6144.     #error _ALS_GameTextForPlayer defined
  6145. #endif
  6146. native BAD_GameTextForPlayer(playerid, const string[], time, style) = GameTextForPlayer;
  6147.  
  6148. #if FIX_GameText
  6149.     stock FIXES_GameTextForPlayer(playerid, string[], time, style)
  6150.     {
  6151.         if (_FIXES_IN_RANGE(style, 0, FIXES_GT_STYLE_COUNT) && IsPlayerConnected(playerid))
  6152.         {
  6153.             if ((string[0] <= '\0') || (string[0] == '\1' && string[1] == '\0'))
  6154.             {
  6155.                 #if FIXES_Single
  6156.                     return _FIXES_GameTextShow(playerid, FIXES_gscSpace, time, style);
  6157.                 #else
  6158.                     return CallRemoteFunction(FIXES_gscGameTextShow, FIXES_gscSpec@isii, playerid, FIXES_gscSpace, time, style);
  6159.                 #endif
  6160.             }
  6161.             else
  6162.             {
  6163.                 #if FIXES_Single
  6164.                     return _FIXES_GameTextShow(playerid, string, time, style);
  6165.                 #else
  6166.                     return CallRemoteFunction(FIXES_gscGameTextShow, FIXES_gscSpec@isii, playerid, string, time, style);
  6167.                 #endif
  6168.             }
  6169.         }
  6170.         return 0;
  6171.     }
  6172.    
  6173.     #define _ALS_GameTextForPlayer
  6174.    
  6175.     #define GameTextForPlayer FIXES_GameTextForPlayer
  6176. #endif
  6177.  
  6178. /*
  6179.  * HideGameTextForAll(style)
  6180.  *
  6181.  * FIXES:
  6182.  *     HideGameText
  6183.  */
  6184.  
  6185. #if defined _ALS_HideGameTextForAll
  6186.     #error _ALS_HideGameTextForAll defined
  6187. #endif
  6188. native BAD_HideGameTextForAll(style) = HideGameTextForAll;
  6189.  
  6190. #if FIX_HideGameText
  6191.     #define _ALS_HideGameTextForAll
  6192.    
  6193.     #define HideGameTextForAll(%0) GameTextForAll(FIXES_gscSpace, 0, (%0))
  6194. #endif
  6195.  
  6196. /*
  6197.  * HideGameTextForPlayer(playerid, style)
  6198.  *
  6199.  * FIXES:
  6200.  *     HideGameText
  6201.  */
  6202.  
  6203. #if defined _ALS_HideGameTextForPlayer
  6204.     #error _ALS_HideGameTextForPlayer defined
  6205. #endif
  6206. native BAD_HideGameTextForPlayer(playerid, style) = HideGameTextForPlayer;
  6207.  
  6208. #if FIX_HideGameText
  6209.     #define _ALS_HideGameTextForPlayer
  6210.    
  6211.     #define HideGameTextForPlayer(%1,%0) GameTextForPlayer((%1), FIXES_gscSpace, 0, (%0))
  6212. #endif
  6213.  
  6214. /*
  6215.  * PlayerText:FIXES_CreatePlayerTextDraw(playerid, Float:x, Float:y, text[])
  6216.  *
  6217.  * FIXES:
  6218.  *     CreatePlayerTextDraw
  6219.  */
  6220.  
  6221. #if defined _ALS_CreatePlayerTextDraw
  6222.     #error _ALS_CreatePlayerTextDraw defined
  6223. #endif
  6224. native Text:BAD_CreatePlayerTextDraw(playerid, Float:x, Float:y, text[]) = CreatePlayerTextDraw;
  6225.  
  6226. #if FIX_CreatePlayerTextDraw
  6227.     stock PlayerText:FIXES_CreatePlayerTextDraw(playerid, Float:x, Float:y, text[])
  6228.     {
  6229.         if ((text[0] == '\0') || (text[0] == '\1' && text[1] == '\0'))
  6230.         {
  6231.             return CreatePlayerTextDraw(playerid, x, y, FIXES_gscSpace);
  6232.         }
  6233.         else
  6234.         {
  6235.             return CreatePlayerTextDraw(playerid, x, y, text);
  6236.         }
  6237.     }
  6238.    
  6239.     #define _ALS_CreatePlayerTextDraw
  6240.     #define CreatePlayerTextDraw FIXES_CreatePlayerTextDraw
  6241. #endif
  6242.  
  6243. /*
  6244.  * FIXES_PlayerTextDrawSetString(playerid, PlayerText:text, string[])
  6245.  *
  6246.  * FIXES:
  6247.  *     PlayerTextDrawSetString
  6248.  */
  6249.  
  6250. #if defined _ALS_PlayerTextDrawSetString
  6251.     #error _ALS_PlayerTextDrawSetString defined
  6252. #endif
  6253. native BAD_PlayerTextDrawSetString(playerid, PlayerText:text, string[]) = PlayerTextDrawSetString;
  6254.  
  6255. #if FIX_PlayerTextDrawSetString
  6256.     stock FIXES_PlayerTextDrawSetString(playerid, PlayerText:text, string[])
  6257.     {
  6258.         if ((string[0] == '\0') || (string[0] == '\1' && string[1] == '\0'))
  6259.         {
  6260.             return PlayerTextDrawSetString(playerid, text, FIXES_gscSpace);
  6261.         }
  6262.         else
  6263.         {
  6264.             return PlayerTextDrawSetString(playerid, text, string);
  6265.         }
  6266.     }
  6267.    
  6268.     #define _ALS_PlayerTextDrawSetString
  6269.     #define PlayerTextDrawSetString FIXES_PlayerTextDrawSetString
  6270. #endif
  6271.  
  6272. /*
  6273.  * Text:FIXES_TextDrawCreate(Float:x, Float:y, text[])
  6274.  *
  6275.  * FIXES:
  6276.  *     TextDrawCreate
  6277.  */
  6278.  
  6279.     #if defined _ALS_TextDrawCreate
  6280.         #error _ALS_TextDrawCreate defined
  6281. native Text:BAD_TextDrawCreate(Float:x, Float:y, text[]) = TextDrawCreate;
  6282.  
  6283. #if FIX_TextDrawCreate
  6284.     stock Text:FIXES_TextDrawCreate(Float:x, Float:y, text[])
  6285.     {
  6286.         if ((text[0] == '\0') || (text[0] == '\1' && text[1] == '\0'))
  6287.         {
  6288.             return TextDrawCreate(x, y, FIXES_gscSpace);
  6289.         }
  6290.         else
  6291.         {
  6292.             return TextDrawCreate(x, y, text);
  6293.         }
  6294.     }
  6295.    
  6296.     #endif
  6297.     #define _ALS_TextDrawCreate
  6298.     #define TextDrawCreate FIXES_TextDrawCreate
  6299. #endif
  6300.  
  6301. /*
  6302.  * FIXES_TextDrawSetString(Text:text, string[])
  6303.  *
  6304.  * FIXES:
  6305.  *     TextDrawSetString
  6306.  */
  6307.  
  6308. #if defined _ALS_TextDrawSetString
  6309.     #error _ALS_TextDrawSetString defined
  6310. #endif
  6311. native BAD_TextDrawSetString(Text:text, string[]) = TextDrawSetString;
  6312.  
  6313. #if FIX_TextDrawSetString
  6314.     stock FIXES_TextDrawSetString(Text:text, string[])
  6315.     {
  6316.         if ((string[0] == '\0') || (string[0] == '\1' && string[1] == '\0'))
  6317.         {
  6318.             return TextDrawSetString(text, FIXES_gscSpace);
  6319.         }
  6320.         else
  6321.         {
  6322.             return TextDrawSetString(text, string);
  6323.         }
  6324.     }
  6325.    
  6326.     #define _ALS_TextDrawSetString
  6327.     #define TextDrawSetString FIXES_TextDrawSetString
  6328. #endif
  6329.  
  6330. /*
  6331.  * FIXES_AllowInteriorWeapons(allow)
  6332.  *
  6333.  * FIXES:
  6334.  *     AllowInteriorWeapons
  6335.  */
  6336.  
  6337. #if defined _ALS_AllowInteriorWeapons
  6338.     #error _ALS_AllowInteriorWeapons defined
  6339. #endif
  6340. native BAD_AllowInteriorWeapons(allow) = AllowInteriorWeapons;
  6341.  
  6342. #if FIX_AllowInteriorWeapons
  6343.     #if FIXES_Single
  6344.         stock FIXES_AllowInteriorWeapons(allow)
  6345.         {
  6346.             if (allow)
  6347.             {
  6348.                 FIXES_gsSettings &= ~e_FIXES_SETTINGS_INTERIOR;
  6349.                 _FIXES_FOREACH(FIXES_gsPlayersIterator, i)
  6350.                 {
  6351.                     FIXES_gsPlayerBools[i] &= ~e_FIXES_BOOLS_INTERIOR;
  6352.                 }
  6353.             }
  6354.             else
  6355.             {
  6356.                 FIXES_gsSettings |= e_FIXES_SETTINGS_INTERIOR;
  6357.                 _FIXES_FOREACH(FIXES_gsPlayersIterator, i)
  6358.                 {
  6359.                     if (GetPlayerInterior(i))
  6360.                     {
  6361.                         FIXES_gsPlayerBools[i] |= e_FIXES_BOOLS_INTERIOR;
  6362.                     }
  6363.                 }
  6364.             }
  6365.             return allow;
  6366.         }
  6367.     #else
  6368.         forward _FIXES_AllowInteriorWeapons(allow);
  6369.        
  6370.         stock FIXES_AllowInteriorWeapons(allow)
  6371.         {
  6372.             CallRemoteFunction(FIXES_gscAllowInteriorWeapons, FIXES_gscSpec@i, allow);
  6373.             return allow;
  6374.         }
  6375.        
  6376.         public _FIXES_AllowInteriorWeapons(allow)
  6377.         {
  6378.             if (allow)
  6379.             {
  6380.                 FIXES_gsSettings &= ~e_FIXES_SETTINGS_INTERIOR;
  6381.                 _FIXES_FOREACH(FIXES_gsPlayersIterator, i)
  6382.                 {
  6383.                     FIXES_gsPlayerBools[i] &= ~e_FIXES_BOOLS_INTERIOR;
  6384.                 }
  6385.             }
  6386.             else
  6387.             {
  6388.                 FIXES_gsSettings |= e_FIXES_SETTINGS_INTERIOR;
  6389.                 _FIXES_FOREACH(FIXES_gsPlayersIterator, i)
  6390.                 {
  6391.                     if (GetPlayerInterior(i))
  6392.                     {
  6393.                         FIXES_gsPlayerBools[i] |= e_FIXES_BOOLS_INTERIOR;
  6394.                     }
  6395.                 }
  6396.             }
  6397.             return allow;
  6398.         }
  6399.     #endif
  6400.    
  6401.     #define _ALS_AllowInteriorWeapons
  6402.     #define AllowInteriorWeapons FIXES_AllowInteriorWeapons
  6403. #endif
  6404.  
  6405. /*
  6406.  * FIXES_GetPlayerInterior(playerid)
  6407.  *
  6408.  * FIXES:
  6409.  *     GetPlayerInterior
  6410.  */
  6411.  
  6412. #if defined _ALS_GetPlayerInterior
  6413.     #error _ALS_GetPlayerInterior defined
  6414. #endif
  6415. native BAD_GetPlayerInterior(playerid) = GetPlayerInterior;
  6416.  
  6417. #if FIX_GetPlayerInterior
  6418.     stock FIXES_GetPlayerInterior(playerid)
  6419.     {
  6420.         if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  6421.         {
  6422.             #if FIXES_Single
  6423.                 return FIXES_gsInterior[playerid];
  6424.             #else
  6425.                 return GetPVarInt(playerid, FIXES_pvarPlayerInterior);
  6426.             #endif
  6427.         }
  6428.         return 0;
  6429.     }
  6430.    
  6431.     #define _ALS_GetPlayerInterior
  6432.     #define GetPlayerInterior FIXES_GetPlayerInterior
  6433. #endif
  6434.  
  6435. /*
  6436.  * FIXES_SetPlayerInterior(playerid, interiorid)
  6437.  *
  6438.  * FIXES:
  6439.  *     GetPlayerInterior
  6440.  */
  6441.  
  6442. #if defined _ALS_SetPlayerInterior
  6443.     #error _ALS_SetPlayerInterior defined
  6444. #endif
  6445. native BAD_SetPlayerInterior(playerid, interiorid) = SetPlayerInterior;
  6446.  
  6447. #if FIX_GetPlayerInterior
  6448.     stock FIXES_SetPlayerInterior(playerid, interiorid)
  6449.     {
  6450.         if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  6451.         {
  6452.             #if FIXES_Single
  6453.                 FIXES_gsInterior[playerid] = interiorid;
  6454.             #else
  6455.                 SetPVarInt(playerid, FIXES_pvarPlayerInterior, interiorid);
  6456.             #endif
  6457.             return SetPlayerInterior(playerid, interiorid);
  6458.         }
  6459.         return 0;
  6460.     }
  6461.    
  6462.     #define _ALS_SetPlayerInterior
  6463.     #define SetPlayerInterior FIXES_SetPlayerInterior
  6464. #endif
  6465.  
  6466. /*
  6467.  * OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ)
  6468.  *
  6469.  * FIXES:
  6470.  *     AllowTeleport
  6471.  */
  6472.  
  6473. #if FIX_AllowTeleport && !defined FILTERSCRIPT
  6474.     forward _FIXES_AllowTeleport(playerid, allow);
  6475.    
  6476.     public OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ)
  6477.     {
  6478.         // ======================
  6479.         //  BEGIN: AllowTeleport
  6480.         // ======================
  6481.         #if FIX_AllowTeleport
  6482.             if (!_FIXES_gIsFilterscript)
  6483.             {
  6484.                 // Unusually, the call order here is always Game Mode first -
  6485.                 // most callbacks are Filter Script first.
  6486.                 if ((FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_TELEPORT) || ((FIXES_gsSettings & e_FIXES_SETTINGS_ADMIN_TELEPORT) && (IsPlayerAdmin(playerid))))
  6487.                 {
  6488.                     SetPlayerPosFindZ(playerid, fX, fY, fZ);
  6489.                 }
  6490.             }
  6491.         #endif
  6492.         // ======================
  6493.         //  END:   AllowTeleport
  6494.         // ======================
  6495.         return FIXES_OnPlayerClickMap(playerid, fX, fY, fZ);
  6496.     }
  6497.    
  6498.     #if defined _ALS_OnPlayerClickMap
  6499.         #error _ALS_OnPlayerClickMap defined
  6500.     #endif
  6501.     #define _ALS_OnPlayerClickMap
  6502.     #define OnPlayerClickMap(%0) FIXES_OnPlayerClickMap(%0) <_fixes_ALS : _fixes_ALS_go>
  6503.    
  6504.     _FIXES_FORWARD FIXES_OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ);
  6505. #endif
  6506.  
  6507. /*
  6508.  * FIXES_AllowPlayerTeleport(playerid, allow)
  6509.  *
  6510.  * FIXES:
  6511.  *     AllowTeleport
  6512.  */
  6513.  
  6514. #if defined _ALS_AllowPlayerTeleport
  6515.     #error _ALS_AllowPlayerTeleport defined
  6516. #endif
  6517. native BAD_AllowPlayerTeleport(playerid, allow) = AllowPlayerTeleport;
  6518.  
  6519. #if FIX_AllowTeleport
  6520.     #if FIXES_Single
  6521.         stock FIXES_AllowPlayerTeleport(playerid, allow)
  6522.         {
  6523.             if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  6524.             {
  6525.                 if (allow)
  6526.                 {
  6527.                     FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_TELEPORT;
  6528.                 }
  6529.                 else
  6530.                 {
  6531.                     FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_TELEPORT;
  6532.                 }
  6533.             }
  6534.             return 0;
  6535.         }
  6536.     #else
  6537.         stock FIXES_AllowPlayerTeleport(playerid, allow)
  6538.         {
  6539.             if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  6540.             {
  6541.                 CallRemoteFunction(FIXES_gscAllowTeleport, FIXES_gscSpec@ii, playerid, allow);
  6542.             }
  6543.             return 0;
  6544.         }
  6545.     #endif
  6546.    
  6547.     #define _ALS_AllowPlayerTeleport
  6548.     #define AllowPlayerTeleport FIXES_AllowPlayerTeleport
  6549. #endif
  6550.  
  6551. /*
  6552.  * FIXES_AllowAdminTeleport(allow)
  6553.  *
  6554.  * FIXES:
  6555.  *     AllowTeleport
  6556.  */
  6557.  
  6558. #if defined _ALS_AllowAdminTeleport
  6559.     #error _ALS_AllowAdminTeleport defined
  6560. #endif
  6561. native BAD_AllowAdminTeleport(allow) = AllowAdminTeleport;
  6562.  
  6563. #if FIX_AllowTeleport
  6564.     #if FIXES_Single
  6565.         stock FIXES_AllowAdminTeleport(allow)
  6566.         {
  6567.             if (allow)
  6568.             {
  6569.                 FIXES_gsSettings |= e_FIXES_SETTINGS_ADMIN_TELEPORT;
  6570.             }
  6571.             else
  6572.             {
  6573.                 FIXES_gsSettings &= ~e_FIXES_SETTINGS_ADMIN_TELEPORT;
  6574.             }
  6575.             return allow;
  6576.         }
  6577.     #else
  6578.         stock FIXES_AllowAdminTeleport(allow)
  6579.         {
  6580.             return
  6581.                 CallRemoteFunction(FIXES_gscAllowTeleport, FIXES_gscSpec@ii, INVALID_PLAYER_ID, allow),
  6582.                 allow;
  6583.         }
  6584.     #endif
  6585.    
  6586.     #define _ALS_AllowAdminTeleport
  6587.     #define AllowAdminTeleport FIXES_AllowAdminTeleport
  6588. #endif
  6589.  
  6590. /*
  6591.  * FIXES_AllowAdminTeleport(allow)
  6592.  *
  6593.  * FIXES:
  6594.  *     AllowTeleport
  6595.  */
  6596.  
  6597. #if FIX_AllowTeleport && !defined FILTERSCRIPT && !FIXES_Single
  6598.     public _FIXES_AllowTeleport(playerid, allow)
  6599.     {
  6600.         if (!_FIXES_gIsFilterscript)
  6601.         {
  6602.             if (playerid == INVALID_PLAYER_ID)
  6603.             {
  6604.                 if (allow)
  6605.                 {
  6606.                     FIXES_gsSettings |= e_FIXES_SETTINGS_ADMIN_TELEPORT;
  6607.                 }
  6608.                 else
  6609.                 {
  6610.                     FIXES_gsSettings &= ~e_FIXES_SETTINGS_ADMIN_TELEPORT;
  6611.                 }
  6612.             }
  6613.             else
  6614.             {
  6615.                 if (allow)
  6616.                 {
  6617.                     FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_TELEPORT;
  6618.                 }
  6619.                 else
  6620.                 {
  6621.                     FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_TELEPORT;
  6622.                 }
  6623.             }
  6624.         }
  6625.     }
  6626. #endif
  6627.  
  6628. /*
  6629.  * FIXES_SetPlayerSpecialAction(playerid, actionid)
  6630.  *
  6631.  * FIXES:
  6632.  *     SetPlayerSpecialAction
  6633.  */
  6634.  
  6635. #if defined _ALS_SetPlayerSpecialAction
  6636.     #error _ALS_SetPlayerSpecialAction defined
  6637. #endif
  6638. native BAD_SetPlayerSpecialAction(playerid, actionid) = SetPlayerSpecialAction;
  6639.  
  6640. #if FIX_SetPlayerSpecialAction
  6641.     stock FIXES_SetPlayerSpecialAction(playerid, actionid)
  6642.     {
  6643.         if (GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_USEJETPACK)
  6644.         {
  6645.             ClearAnimations(playerid);
  6646.         }
  6647.         SetPlayerSpecialAction(playerid, actionid);
  6648.         return 1;
  6649.     }
  6650.    
  6651.     #define _ALS_SetPlayerSpecialAction
  6652.     #define SetPlayerSpecialAction FIXES_SetPlayerSpecialAction
  6653. #endif
  6654.  
  6655. /*
  6656.  * FIXES_ClearAnimations(playerid, forcesync = 0)
  6657.  *
  6658.  * FIXES:
  6659.  *     ClearAnimations
  6660.  */
  6661.  
  6662. #if defined _ALS_ClearAnimations
  6663.     #error _ALS_ClearAnimations defined
  6664. #endif
  6665. native BAD_ClearAnimations(playerid, forcesync = 0) = ClearAnimations;
  6666.  
  6667. #if FIX_ClearAnimations || FIX_ClearAnimations_2
  6668.     stock FIXES_ClearAnimations(playerid, forcesync = 0)
  6669.     {
  6670.         #if FIX_ClearAnimations || FIX_ClearAnimations_2
  6671.             if (IsPlayerInAnyVehicle(playerid))
  6672.         #endif
  6673.         #if FIX_ClearAnimations
  6674.             {
  6675.                 return ApplyAnimation(playerid, "PED", "CAR_SIT", 4.0, 0, 0, 0, 0, 1, forcesync);
  6676.             }
  6677.         #endif
  6678.         #if FIX_ClearAnimations + FIX_ClearAnimations_2 == 1 // XOR
  6679.             {
  6680.                 return ClearAnimations(playerid, forcesync);
  6681.             }
  6682.         #endif
  6683.         #if FIX_ClearAnimations_2
  6684.             new
  6685.                 ret = ClearAnimations(playerid, forcesync);
  6686.             ApplyAnimation(playerid, "PED", "IDLE_STANCE", 4.0, 0, 0, 0, 0, 1, forcesync);
  6687.             ApplyAnimation(playerid, "PED", "IDLE_CHAT", 4.0, 0, 0, 0, 0, 1, forcesync);
  6688.             ApplyAnimation(playerid, "PED", "WALK_PLAYER", 4.0, 0, 0, 0, 0, 1, forcesync);
  6689.             return ret;
  6690.         #endif
  6691.     }
  6692.    
  6693.     #define _ALS_ClearAnimations
  6694.     #define ClearAnimations FIXES_ClearAnimations
  6695. #endif
  6696.  
  6697. /*
  6698.  * FIXES_GangZoneCreate(Float:minx, Float:miny, Float:maxx, Float:maxy)
  6699.  *
  6700.  * FIXES:
  6701.  *     GangZoneCreate
  6702.  */
  6703.  
  6704. #if defined _ALS_GangZoneCreate
  6705.     #error _ALS_GangZoneCreate defined
  6706. #endif
  6707. native BAD_GangZoneCreate(Float:minx, Float:miny, Float:maxx, Float:maxy) = GangZoneCreate;
  6708.  
  6709. #if FIX_GangZoneCreate
  6710.     stock FIXES_GangZoneCreate(Float:minx, Float:miny, Float:maxx, Float:maxy)
  6711.     {
  6712.         return GangZoneCreate(floatsub(minx, floatfract(minx)), floatsub(miny, floatfract(miny)), floatsub(maxx, floatfract(maxx)), floatsub(maxy, floatfract(maxy)));
  6713.     }
  6714.    
  6715.     #define _ALS_GangZoneCreate
  6716.     #define GangZoneCreate FIXES_GangZoneCreate
  6717. #endif
  6718.  
  6719. /*
  6720.  * FIXES_ShowPlayerDialog(playerid, dialog, style, title[], caption[], button1[], button2[])
  6721.  *
  6722.  * FIXES:
  6723.  *     OnDialogResponse
  6724.  *     GetPlayerDialog
  6725.  */
  6726.  
  6727. #if defined _ALS_ShowPlayerDialog
  6728.     #error _ALS_ShowPlayerDialog defined
  6729. #endif
  6730. native BAD_ShowPlayerDialog(playerid, dialog, style, title[], caption[], button1[], button2[]) = ShowPlayerDialog;
  6731.  
  6732. #if FIX_OnDialogResponse || FIX_GetPlayerDialog
  6733.     stock FIXES_ShowPlayerDialog(playerid, dialog, style, title[], caption[], button1[], button2[])
  6734.     {
  6735.         if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  6736.         {
  6737.             #if FIXES_Single
  6738.                 FIXES_gsDialogID[playerid] = dialog;
  6739.             #else
  6740.                 SetPVarInt(playerid, FIXES_pvarPlayerDialog, dialog);
  6741.             #endif
  6742.             return ShowPlayerDialog(playerid, dialog, style, title, caption, button1, button2);
  6743.         }
  6744.         return 0;
  6745.     }
  6746.    
  6747.     #define _ALS_ShowPlayerDialog
  6748.     #define ShowPlayerDialog FIXES_ShowPlayerDialog
  6749. #endif
  6750.  
  6751. /*
  6752.  * OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  6753.  *
  6754.  * FIXES:
  6755.  *     OnDialogResponse
  6756.  *     GetPlayerDialog
  6757.  */
  6758.  
  6759. #if FIX_OnDialogResponse || FIX_GetPlayerDialog
  6760.     public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  6761.     {
  6762.         // =========================
  6763.         //  BEGIN: OnDialogResponse
  6764.         // =========================
  6765.         #if FIX_OnDialogResponse || FIX_GetPlayerDialog
  6766.             #if FIXES_Single
  6767.                 #if FIX_OnDialogResponse
  6768.                     dialogid = FIXES_gsDialogID[playerid];
  6769.                 #endif
  6770.                 FIXES_gsDialogID[playerid] = INVALID_DIALOG_ID;
  6771.             #elseif FIX_OnDialogResponse
  6772.                 _FIXES_IS_IN_CHARGE()
  6773.                 {
  6774.                     // If there are multiple scripts, we can't just wipe the
  6775.                     // current dialog data or subsequent scripts will display
  6776.                     // the wrong value.
  6777.                     dialogid = GetPVarInt(playerid, FIXES_pvarPlayerDialog),
  6778.                     SetPVarInt(playerid, FIXES_pvarCurrentDialog, dialogid),
  6779.                     SetPVarInt(playerid, FIXES_pvarPlayerDialog, INVALID_DIALOG_ID);
  6780.                 }
  6781.                 else
  6782.                 {
  6783.                     dialogid = GetPVarInt(playerid, FIXES_pvarCurrentDialog);
  6784.                 }
  6785.             #else
  6786.                 SetPVarInt(playerid, FIXES_pvarPlayerDialog, INVALID_DIALOG_ID);
  6787.             #endif
  6788.             if (inputtext[0])
  6789.             {
  6790.                 return FIXES_OnDialogResponse(playerid, dialogid, response, listitem, inputtext);
  6791.             }
  6792.             else
  6793.             {
  6794.                 return FIXES_OnDialogResponse(playerid, dialogid, response, listitem, FIXES_gscNULL);
  6795.             }
  6796.         #endif
  6797.         // =========================
  6798.         //  END:   OnDialogResponse
  6799.         // =========================
  6800.     }
  6801.    
  6802.     #if defined _ALS_OnDialogResponse
  6803.         #error _ALS_OnDialogResponse defined
  6804.     #endif
  6805.     #define _ALS_OnDialogResponse
  6806.     #define OnDialogResponse(%0) FIXES_OnDialogResponse(%0) <_fixes_ALS : _fixes_ALS_go>
  6807.    
  6808.     _FIXES_FORWARD FIXES_OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]);
  6809. #endif
  6810.  
  6811. /*
  6812.  * FIXES_GetPlayerDialog(playerid)
  6813.  *
  6814.  * FIXES:
  6815.  *     GetPlayerDialog
  6816.  */
  6817.  
  6818. #if defined _ALS_GetPlayerDialog
  6819.     #error _ALS_GetPlayerDialog defined
  6820. #endif
  6821. native BAD_GetPlayerDialog(playerid) = GetPlayerDialog;
  6822.  
  6823. #if FIX_GetPlayerDialog
  6824.     stock FIXES_GetPlayerDialog(playerid)
  6825.     {
  6826.         if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  6827.         {
  6828.             #if FIXES_Single
  6829.                 return FIXES_gsDialogID[playerid];
  6830.             #else
  6831.                 return GetPVarInt(playerid, FIXES_pvarPlayerDialog);
  6832.             #endif
  6833.         }
  6834.         return -1;
  6835.     }
  6836.    
  6837.     #define _ALS_GetPlayerDialog
  6838.     #define GetPlayerDialog FIXES_GetPlayerDialog
  6839. #endif
  6840.  
  6841. /*
  6842.  * FIXES_valstr(dest[], value, bool:pack = false)
  6843.  *
  6844.  * FIXES:
  6845.  *     valstr
  6846.  */
  6847.  
  6848. #if defined _ALS_valstr
  6849.     #error _ALS_valstr defined
  6850. #endif
  6851. native BAD_valstr(dest[], value, bool:pack = false) = valstr;
  6852.  
  6853. #if FIX_valstr
  6854.     stock FIXES_valstr(dest[], value, bool:pack = false)
  6855.     {
  6856.         // "format" can't handle cellmin properly.
  6857.         static const
  6858.             sc_szCellmin[] = !"-2147483648";
  6859.         if (value == cellmin)
  6860.         {
  6861.             pack && strpack(dest, sc_szCellmin, 12) || strunpack(dest, sc_szCellmin, 12);
  6862.         }
  6863.         else
  6864.         {
  6865.             format(dest, 12, "%d", value),
  6866.             pack && strpack(dest, dest, 12);
  6867.         }
  6868.         return 0;
  6869.     }
  6870.    
  6871.     #define _ALS_valstr
  6872.     #define valstr FIXES_valstr
  6873. #endif
  6874.  
  6875. /*
  6876.  * FIXES_fclose(File:handle)
  6877.  *
  6878.  * FIXES:
  6879.  *     fclose
  6880.  */
  6881.  
  6882. #if defined _ALS_fclose
  6883.     #error _ALS_fclose defined
  6884. #endif
  6885. native BAD_fclose(File:handle) = fclose;
  6886.  
  6887. #if FIX_fclose
  6888.     stock bool:FIXES_fclose(File:handle)
  6889.     {
  6890.         return handle && fclose(handle);
  6891.     }
  6892.    
  6893.     #define _ALS_fclose
  6894.     #define fclose FIXES_fclose
  6895. #endif
  6896.  
  6897. /*
  6898.  * FIXES_fwrite(File:handle, const string[])
  6899.  *
  6900.  * FIXES:
  6901.  *     fwrite
  6902.  */
  6903.  
  6904. #if defined _ALS_fwrite
  6905.     #error _ALS_fwrite defined
  6906. #endif
  6907. native BAD_fwrite(File:handle, const string[]) = fwrite;
  6908.  
  6909. #if FIX_fwrite
  6910.     stock FIXES_fwrite(File:handle, const string[])
  6911.     {
  6912.         return handle && fwrite(handle, string);
  6913.     }
  6914.    
  6915.     #define _ALS_fwrite
  6916.     #define fwrite FIXES_fwrite
  6917. #endif
  6918.  
  6919. /*
  6920.  * FIXES_fread(File:handle, string[], size = sizeof (string), bool:pack = false)
  6921.  *
  6922.  * FIXES:
  6923.  *     fread
  6924.  */
  6925.  
  6926. #if defined _ALS_fread
  6927.     #error _ALS_fread defined
  6928. #endif
  6929. native BAD_fread(File:handle, string[], size = sizeof (string), bool:pack = false) = fread;
  6930.  
  6931. #if FIX_fread
  6932.     stock FIXES_fread(File:handle, string[], size = sizeof (string), bool:pack = false)
  6933.     {
  6934.         return handle && fread(handle, string, size, pack);
  6935.     }
  6936.    
  6937.     #define _ALS_fread
  6938.     #define fread FIXES_fread
  6939. #endif
  6940.  
  6941. /*
  6942.  * FIXES_fputchar(File:handle, value, bool:utf8 = true)
  6943.  *
  6944.  * FIXES:
  6945.  *     fputchar
  6946.  */
  6947.  
  6948. #if defined _ALS_fputchar
  6949.     #error _ALS_fputchar defined
  6950. #endif
  6951. native BAD_fputchar(File:handle, value, bool:utf8 = true) = fputchar;
  6952.  
  6953. #if FIX_fputchar
  6954.     stock bool:FIXES_fputchar(File:handle, value, bool:utf8 = true)
  6955.     {
  6956.         return handle && fputchar(handle, value, utf8);
  6957.     }
  6958.    
  6959.     #define _ALS_fputchar
  6960.     #define fputchar FIXES_fputchar
  6961. #endif
  6962.  
  6963. /*
  6964.  * FIXES_fgetchar(File:handle, value, bool:utf8 = true)
  6965.  *
  6966.  * FIXES:
  6967.  *     fgetchar
  6968.  */
  6969.  
  6970. #if defined _ALS_fgetchar
  6971.     #error _ALS_fgetchar defined
  6972. #endif
  6973. native BAD_fgetchar(File:handle, value, bool:utf8 = true) = fgetchar;
  6974.  
  6975. #if FIX_fgetchar
  6976.     stock FIXES_fgetchar(File:handle, value, bool:utf8 = true)
  6977.     {
  6978.         return handle && fgetchar(handle, value, utf8);
  6979.     }
  6980.    
  6981.     #define _ALS_fgetchar
  6982.     #define fgetchar FIXES_fgetchar
  6983. #endif
  6984.  
  6985. /*
  6986.  * FIXES_fblockwrite(File:handle, const buffer[], size = sizeof (buffer))
  6987.  *
  6988.  * FIXES:
  6989.  *     fblockwrite
  6990.  */
  6991.  
  6992. #if defined _ALS_fblockwrite
  6993.     #error _ALS_fblockwrite defined
  6994. #endif
  6995. native BAD_fblockwrite(File:handle, const buffer[], size = sizeof (buffer)) = fblockwrite;
  6996.  
  6997. #if FIX_fblockwrite
  6998.     stock FIXES_fblockwrite(File:handle, const buffer[], size = sizeof (buffer))
  6999.     {
  7000.         return handle && fblockwrite(handle, buffer, size);
  7001.     }
  7002.    
  7003.     #define _ALS_fblockwrite
  7004.     #define fblockwrite FIXES_fblockwrite
  7005. #endif
  7006.  
  7007. /*
  7008.  * FIXES_fblockread(File:handle, buffer[], size = sizeof (buffer))
  7009.  *
  7010.  * FIXES:
  7011.  *     fblockread
  7012.  */
  7013.  
  7014. #if defined _ALS_fblockread
  7015.     #error _ALS_fblockread defined
  7016. #endif
  7017. native BAD_fblockread(File:handle, buffer[], size = sizeof (buffer)) = fblockread;
  7018.  
  7019. #if FIX_fblockread
  7020.     stock FIXES_fblockread(File:handle, buffer[], size = sizeof (buffer))
  7021.     {
  7022.         return handle && fblockread(handle, buffer, size);
  7023.     }
  7024.    
  7025.     #define _ALS_fblockread
  7026.     #define fblockread FIXES_fblockread
  7027. #endif
  7028.  
  7029. /*
  7030.  * FIXES_fseek(File:handle, position = 0, seek_whence:whence = seek_start)
  7031.  *
  7032.  * FIXES:
  7033.  *     fseek
  7034.  */
  7035.  
  7036. #if defined _ALS_fseek
  7037.     #error _ALS_fseek defined
  7038. #endif
  7039. native BAD_fseek(File:handle, position = 0, seek_whence:whence = seek_start) = fseek;
  7040.  
  7041. #if FIX_fseek
  7042.     stock FIXES_fseek(File:handle, position = 0, seek_whence:whence = seek_start)
  7043.     {
  7044.         return handle && fseek(handle, position, whence);
  7045.     }
  7046.    
  7047.     #define _ALS_fseek
  7048.     #define fseek FIXES_fseek
  7049. #endif
  7050.  
  7051. /*
  7052.  * FIXES_flength(File:handle)
  7053.  *
  7054.  * FIXES:
  7055.  *     flength
  7056.  */
  7057.  
  7058. #if defined _ALS_flength
  7059.     #error _ALS_flength defined
  7060. #endif
  7061. native BAD_flength(File:handle) = flength;
  7062.  
  7063. #if FIX_flength
  7064.     stock FIXES_flength(File:handle)
  7065.     {
  7066.         return handle && flength(handle);
  7067.     }
  7068.    
  7069.     #define _ALS_flength
  7070.     #define flength FIXES_flength
  7071. #endif
  7072.  
  7073. /*
  7074.  * FIXES_Kick(playerid)
  7075.  *
  7076.  * FIXES:
  7077.  *     Kick
  7078.  */
  7079.  
  7080. #if defined _ALS_Kick
  7081.     #error _ALS_Kick defined
  7082. #endif
  7083. native BAD_Kick(playerid) = Kick;
  7084.  
  7085. #if FIX_Kick
  7086.     forward _FIXES_Kick(playerid);
  7087.    
  7088.     public _FIXES_Kick(playerid)
  7089.     {
  7090.         FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_KICKED,
  7091.         Kick(playerid);
  7092.     }
  7093.    
  7094.     #if !FIXES_Single
  7095.         forward @FIXES_Kick(playerid);
  7096.        
  7097.         public @FIXES_Kick(playerid)
  7098.         {
  7099.             FIXES_BlockUpdate(playerid, true, 0);
  7100.         }
  7101.     #endif
  7102.    
  7103.     stock FIXES_Kick(playerid)
  7104.     {
  7105.         if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_ON_PLAYER_CONNECT)
  7106.         {
  7107.             // Disable as much of the server as possible quickly.
  7108.             return
  7109.                 #if FIXES_Single
  7110.                     FIXES_BlockUpdate(playerid, true, 0),
  7111.                 #else
  7112.                     CallRemoteFunction("@FIXES_Kick", "i", playerid),
  7113.                 #endif
  7114.                     TogglePlayerSpectating(playerid, true),
  7115.                     TogglePlayerControllable(playerid, false),
  7116.                     SetPVarInt(playerid, FIXES_pvarKick, SetTimerEx(FIXES_gscKick, 1000, 0, FIXES_gscSpec@i, playerid)),
  7117.                     FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_KICKED,
  7118.                     1;
  7119.         }
  7120.         else
  7121.         {
  7122.             return Kick(playerid);
  7123.         }
  7124.     }
  7125.    
  7126.     #define _ALS_Kick
  7127.     #define Kick FIXES_Kick
  7128. #endif
  7129.  
  7130. /*
  7131.  * FIXES_IsPAttachedObjectSlotUsed(playerid, index)
  7132.  *
  7133.  * FIXES:
  7134.  *     IsPlayerAttachedObjectSlotUsed
  7135.  */
  7136.  
  7137. #if defined _ALS_IsPAttachedObjSlotUsed
  7138.     #error _ALS_IsPAttachedObjSlotUsed defined
  7139. #endif
  7140. native BAD_IsPlayerAttachedObjSlotUsed(playerid, index) = IsPlayerAttachedObjectSlotUsed;
  7141.  
  7142. #if FIX_IsPlayerAttachedObjSlotUsed
  7143.     stock FIXES_IsPAttachedObjectSlotUsed(playerid, index)
  7144.     {
  7145.         if (IsPlayerConnected(playerid))
  7146.         {
  7147.             return FIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] & 1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index;
  7148.         }
  7149.         return 0;
  7150.     }
  7151.    
  7152.     #define _ALS_IsPAttachedObjSlotUsed
  7153.     #define IsPlayerAttachedObjectSlotUsed FIXES_IsPAttachedObjectSlotUsed
  7154. #endif
  7155.  
  7156. /*
  7157.  * _FIXES_SetPlayerAttachedObject(slot, to)
  7158.  *
  7159.  * FIXES:
  7160.  *     IsPlayerAttachedObjectSlotUsed
  7161.  */
  7162.  
  7163. #if (FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject) && !FIXES_Single
  7164.     forward _FIXES_SetPlayerAttachedObject(slot, to);
  7165.    
  7166.     public _FIXES_SetPlayerAttachedObject(slot, to)
  7167.     {
  7168.         FIXES_gsObjectSlots[slot] = to;
  7169.     }
  7170. #endif
  7171.  
  7172. /*
  7173.  * 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)
  7174.  *
  7175.  * FIXES:
  7176.  *     IsPlayerAttachedObjectSlotUsed
  7177.  *     SetPlayerAttachedObject
  7178.  */
  7179.  
  7180. #if defined _ALS_SetPlayerAttachedObject
  7181.     #error _ALS_SetPlayerAttachedObject defined
  7182. #endif
  7183. 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, materialcolor1 = 0, materialcolor2 = 0) = SetPlayerAttachedObject;
  7184.  
  7185. #if FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject
  7186.     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, materialcolor1 = 0, materialcolor2 = 0)
  7187.     {
  7188.         if (SetPlayerAttachedObject(playerid, index, modelid, bone, fOffsetX, fOffsetY, fOffsetZ, fRotX, fRotY, fRotZ, fScaleX, fScaleY, fScaleZ, materialcolor1, materialcolor2))
  7189.         {
  7190.             #if FIXES_Single
  7191.                 FIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] |= (1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index);
  7192.             #else
  7193.                 new
  7194.                     slot = playerid / _FIXES_ATTACHMENTS;
  7195.                 CallRemoteFunction(FIXES_gscSetPlayerAttachedObj, FIXES_gscSpec@ii, slot, FIXES_gsObjectSlots[slot] | (1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index));
  7196.             #endif
  7197.             return 1;
  7198.         }
  7199.         return 0;
  7200.     }
  7201.    
  7202.     #define _ALS_SetPlayerAttachedObject
  7203.     #define SetPlayerAttachedObject FIXES_SetPlayerAttachedObject
  7204. #endif
  7205.  
  7206. /*
  7207.  * FIXES_RemovePlayerAttachedObj(playerid, index)
  7208.  *
  7209.  * FIXES:
  7210.  *     IsPlayerAttachedObjectSlotUsed
  7211.  */
  7212.  
  7213. #if defined _ALS_RemovePlayerAttachedObject
  7214.     #error _ALS_RemovePlayerAttachedObject defined
  7215. #endif
  7216. native BAD_RemovePlayerAttachedObject(playerid, index) = RemovePlayerAttachedObject;
  7217.  
  7218. #if FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject
  7219.     stock FIXES_RemovePlayerAttachedObj(playerid, index)
  7220.     {
  7221.         if (RemovePlayerAttachedObject(playerid, index))
  7222.         {
  7223.             #if FIXES_Single
  7224.                 FIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] &= ~(1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index);
  7225.             #else
  7226.                 new
  7227.                     slot = playerid / _FIXES_ATTACHMENTS;
  7228.                 CallRemoteFunction(FIXES_gscSetPlayerAttachedObj, FIXES_gscSpec@ii, slot, FIXES_gsObjectSlots[slot] & ~(1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index));
  7229.             #endif
  7230.             return 1;
  7231.         }
  7232.         return 0;
  7233.     }
  7234.    
  7235.     #define _ALS_RemovePlayerAttachedObject
  7236.     #define RemovePlayerAttachedObject FIXES_RemovePlayerAttachedObj
  7237. #endif
  7238.  
  7239. /*
  7240.  * _FIXES_DetermineOrder()
  7241.  *
  7242.  * Figure out which the first filterscript to be called is so that it can do the
  7243.  * majority of the work.  More detail:  Several pieces of code for some fixes
  7244.  * rely on things like blocking "OnPlayerUpdate".  This should be done in the
  7245.  * first script in which "OnPlayerUpdate" is called only, so we need to find out
  7246.  * in advance which script will be called first (at least out of all the fixed
  7247.  * scripts).
  7248.  */
  7249.  
  7250. #if !FIXES_Single
  7251.     public _FIXES_DetermineOrder()
  7252.     {
  7253.         // TODO: Graceful handoff.  I thought I was past all this rubbish!
  7254.         if (!_FIXES_gIsFilterscript)
  7255.         {
  7256.             if (existproperty(5, FIXES_gscNoGMProperty))
  7257.             {
  7258.                 return 0;
  7259.             }
  7260.             // Make sure certain data is synced with what the GM thinks it is.
  7261.             // =============================
  7262.             //  BEGIN: AllowInteriorWeapons
  7263.             // =============================
  7264.             #if FIX_AllowInteriorWeapons
  7265.                 CallRemoteFunction(FIXES_gscAllowInteriorWeapons, FIXES_gscSpec@i, !(FIXES_gsSettings & e_FIXES_SETTINGS_INTERIOR));
  7266.             #endif
  7267.             // =============================
  7268.             //  END: AllowInteriorWeapons
  7269.             // =============================
  7270.            
  7271.             // ================================
  7272.             //  BEGIN: SetPlayerAttachedObject
  7273.             // ================================
  7274.             #if FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject
  7275.                 for (new i = 0; i != _FIXES_ATTACHMENTS; ++i)
  7276.                 {
  7277.                     CallRemoteFunction(FIXES_gscSetPlayerAttachedObj, FIXES_gscSpec@ii, i, FIXES_gsObjectSlots[i]);
  7278.                 }
  7279.             #endif
  7280.             // ==============================
  7281.             //  END: SetPlayerAttachedObject
  7282.             // ==============================
  7283.         }
  7284.         if (existproperty(5, FIXES_gscOrderProperty))
  7285.         {
  7286.             // Either this is a Filter Script (1) and we don't want gamemodes
  7287.             // (1) or this isn't a filterscript (0) and we do want gamemodes
  7288.             // (0).  All other cases return here due to a logic mismatch.  This
  7289.             // is to rectify the difference in call orders between
  7290.             // "CallRemoteFunction" and normal callbacks.  Now DOESN'T end on
  7291.             // the second time round for filterscripts to correctly pass on the
  7292.             // data to GameModes.
  7293.             if (!existproperty(5, FIXES_gscNoGMProperty) && _FIXES_gIsFilterscript == bool:getproperty(5, FIXES_gscOrderProperty))
  7294.             {
  7295.                 // The game mode is not in charge, which means we are checking
  7296.                 // the filterscripts a second time and shouldn't be.
  7297.                 return 0;
  7298.             }
  7299.             // If this script was previously the owner, and we are not ending
  7300.             // the game mode (in which case discard all data), and if we are
  7301.             // only dealing with filterscripts or the gamemode is now the
  7302.             // master.
  7303.             if (FIXES_gsSettings & (e_FIXES_SETTINGS_IN_CHARGE | e_FIXES_SETTINGS_DROP_ALL_DATA) == e_FIXES_SETTINGS_IN_CHARGE)
  7304.             {
  7305.                 FIXES_PRINTF("_FIXES_DetermineOrder: Was in charge");
  7306.                 // This script is currently in charge, but a new script has
  7307.                 // usurped it!  Pass all relevant data over to the new script.
  7308.                 // Also, this wasn't triggered by a game mode change (where we
  7309.                 // just want to dump and reset all data).  There is no need to
  7310.                 // reset the admin teleport data as that is always handled by
  7311.                 // the Game Mode, so it will either be correct, or it will be
  7312.                 // blank.
  7313.                 FIXES_gsSettings &= ~e_FIXES_SETTINGS_IN_CHARGE;
  7314.                 #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
  7315.                     _FIXES_FOREACH(FIXES_gsPlayersIterator, i)
  7316.                     {
  7317.                         // =================
  7318.                         //  BEGIN: GameText
  7319.                         // =================
  7320.                         #if FIX_GameText
  7321.                             for (new j = 0; j != FIXES_GT_STYLE_COUNT; ++j)
  7322.                             {
  7323.                                 PlayerTextDrawDestroy(i, FIXES_gsPGTStyle[i][j]);
  7324.                             }
  7325.                         #endif
  7326.                         // =================
  7327.                         //  END:   GameText
  7328.                         // =================
  7329.                        
  7330.                         // =============================
  7331.                         //  BEGIN: SetPlayerWorldBounds
  7332.                         // =============================
  7333.                         #if FIX_SetPlayerWorldBounds
  7334.                             // I realised that you could have the GM in charge,
  7335.                             // set their bounds, load an FS, remove their bounds
  7336.                             // then unload the FS again and it would result in
  7337.                             // the old GM setting of them HAVING bounds being
  7338.                             // re-applied, so the check is removed.
  7339.                             CallRemoteFunction(FIXES_gscSetPlayerWorldBounds, FIXES_gscSpec@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]);
  7340.                         #endif
  7341.                         // =============================
  7342.                         //  END:   SetPlayerWorldBounds
  7343.                         // =============================
  7344.                        
  7345.                         // =================================
  7346.                         //  BEGIN: TogglePlayerControllable
  7347.                         // =================================
  7348.                         #if FIX_TogglePlayerControllable
  7349.                             CallRemoteFunction(FIXES_gscTogglePlayerControl, FIXES_gscSpec@ii, i, !(FIXES_gsPlayerBools[i] & e_FIXES_BOOLS_UNCONTROLLABLE));
  7350.                         #endif
  7351.                         // =================================
  7352.                         //  END:   TogglePlayerControllable
  7353.                         // =================================
  7354.                        
  7355.                         // ===========================
  7356.                         //  BEGIN: PutPlayerInVehicle
  7357.                         // ===========================
  7358.                         #if FIX_PutPlayerInVehicle
  7359.                             if (FIXES_gsPlayerBools[i] & e_FIXES_BOOLS_PUT_IN_VEHICLE)
  7360.                             {
  7361.                                 CallRemoteFunction(FIXES_gscPutPlayerInVehicle, FIXES_gscSpec@iii, i, FIXES_gsVehicleSeatData[i] & 0x00FFFFFF, FIXES_gsVehicleSeatData[i] >>> 24);
  7362.                             }
  7363.                         #endif
  7364.                         // ===========================
  7365.                         //  END:   PutPlayerInVehicle
  7366.                         // ===========================
  7367.                     }
  7368.                 #endif
  7369.                
  7370.                 // =================
  7371.                 //  BEGIN: GameText
  7372.                 // =================
  7373.                 #if FIX_GameText
  7374.                     #if FIX_GameTextStyles
  7375.                         TextDrawDestroy(FIXES_gsGTStyle[13]),
  7376.                         TextDrawDestroy(FIXES_gsGTStyle[12]),
  7377.                         TextDrawDestroy(FIXES_gsGTStyle[11]),
  7378.                         TextDrawDestroy(FIXES_gsGTStyle[10]),
  7379.                         TextDrawDestroy(FIXES_gsGTStyle[9]),
  7380.                         TextDrawDestroy(FIXES_gsGTStyle[8]),
  7381.                         TextDrawDestroy(FIXES_gsGTStyle[7]),
  7382.                     #endif
  7383.                         TextDrawDestroy(FIXES_gsGTStyle[6]),
  7384.                         TextDrawDestroy(FIXES_gsGTStyle[5]),
  7385.                         TextDrawDestroy(FIXES_gsGTStyle[4]),
  7386.                         TextDrawDestroy(FIXES_gsGTStyle[3]),
  7387.                         TextDrawDestroy(FIXES_gsGTStyle[2]),
  7388.                         TextDrawDestroy(FIXES_gsGTStyle[1]),
  7389.                         TextDrawDestroy(FIXES_gsGTStyle[0]);
  7390.                 #endif
  7391.                 // =================
  7392.                 //  END:   GameText
  7393.                 // =================
  7394.                
  7395.                 FIXES_PRINTF("_FIXES_DetermineOrder: Not in charge");
  7396.                 return 0;
  7397.             }
  7398.             else
  7399.             {
  7400.                 FIXES_gsSettings &= ~e_FIXES_SETTINGS_IN_CHARGE;
  7401.                 FIXES_PRINTF("_FIXES_DetermineOrder: Not in charge");
  7402.                 return 0;
  7403.             }
  7404.         }
  7405.         else if (!(FIXES_gsSettings & e_FIXES_SETTINGS_ENDING))
  7406.         {
  7407.             setproperty(5, FIXES_gscOrderProperty, _FIXES_gIsFilterscript);
  7408.             #if FIXES_Debug
  7409.                 if (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)
  7410.                 {
  7411.                     FIXES_PRINTF("_FIXES_DetermineOrder: Already in charge");
  7412.                 }
  7413.             #endif
  7414.             FIXES_gsSettings |= e_FIXES_SETTINGS_IN_CHARGE;
  7415.             FIXES_PRINTF("_FIXES_DetermineOrder: Now in charge");
  7416.            
  7417.             // =================
  7418.             //  BEGIN: GameText
  7419.             // =================
  7420.             #if FIX_GameText
  7421.                 // Create all the relevant TextDraws.
  7422.                 _FIXES_FOREACH(FIXES_gsPlayersIterator, playerid)
  7423.                 {
  7424.                     _FIXES_CreateGameTextDraws(playerid);
  7425.                 }
  7426.                 _FIXES_CreateGameTextDraws(INVALID_PLAYER_ID);
  7427.             #endif
  7428.             // =================
  7429.             //  END:   GameText
  7430.             // =================
  7431.             return 1;
  7432.         }
  7433.         else if (!(FIXES_gsSettings & e_FIXES_SETTINGS_ENDED))
  7434.         {
  7435.             // Only called when a filterscript that is currently master (and
  7436.             // thus called first by "CallRemoteFunction") ends.  This doesn't
  7437.             // get triggered when a gamemode is master, but that doesn't matter
  7438.             // because in that case all the textdraws are destroyed anyway.
  7439.            
  7440.             // =================
  7441.             //  BEGIN: GameText
  7442.             // =================
  7443.             #if FIX_GameText
  7444.                     // Destroy all the relevant TextDraws.
  7445.                     _FIXES_FOREACH(FIXES_gsPlayersIterator, playerid)
  7446.                     {
  7447.                         #if FIX_GameTextStyles
  7448.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][13]),
  7449.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][12]),
  7450.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][11]),
  7451.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][10]),
  7452.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][9]),
  7453.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][8]),
  7454.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][7]),
  7455.                         #endif
  7456.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][6]),
  7457.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][5]),
  7458.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][4]),
  7459.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][3]),
  7460.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][2]),
  7461.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][1]),
  7462.                             PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][0]);
  7463.                     }
  7464.                 #if FIX_GameTextStyles
  7465.                     TextDrawDestroy(FIXES_gsGTStyle[13]),
  7466.                     TextDrawDestroy(FIXES_gsGTStyle[12]),
  7467.                     TextDrawDestroy(FIXES_gsGTStyle[11]),
  7468.                     TextDrawDestroy(FIXES_gsGTStyle[10]),
  7469.                     TextDrawDestroy(FIXES_gsGTStyle[9]),
  7470.                     TextDrawDestroy(FIXES_gsGTStyle[8]),
  7471.                     TextDrawDestroy(FIXES_gsGTStyle[7]),
  7472.                 #endif
  7473.                     TextDrawDestroy(FIXES_gsGTStyle[6]),
  7474.                     TextDrawDestroy(FIXES_gsGTStyle[5]),
  7475.                     TextDrawDestroy(FIXES_gsGTStyle[4]),
  7476.                     TextDrawDestroy(FIXES_gsGTStyle[3]),
  7477.                     TextDrawDestroy(FIXES_gsGTStyle[2]),
  7478.                     TextDrawDestroy(FIXES_gsGTStyle[1]),
  7479.                     TextDrawDestroy(FIXES_gsGTStyle[0]);
  7480.             #endif
  7481.             // =================
  7482.             //  END:   GameText
  7483.             // =================
  7484.            
  7485.             #if FIXES_Debug
  7486.                 FIXES_PRINTF("_FIXES_DetermineOrder: Ending");
  7487.             #endif
  7488.            
  7489.             FIXES_gsSettings |= e_FIXES_SETTINGS_ENDED;
  7490.         }
  7491.         return 0;
  7492.     }
  7493. #endif
  7494.  
  7495. /*
  7496.  * FIXES_strins(string[], const substr[], pos, maxlength = sizeof string)
  7497.  *
  7498.  * FIXES:
  7499.  *     strins
  7500.  */
  7501.  
  7502. #if defined _ALS_strins
  7503.     #error _ALS_strins defined
  7504. #endif
  7505. native BAD_strins(string[], const substr[], pos, maxlength = sizeof string) = strins;
  7506.  
  7507. #if FIX_strins
  7508.     stock FIXES_strins(string[], const substr[], pos, maxlength = sizeof string)
  7509.     {
  7510.         if (string[0] > 255)
  7511.         {
  7512.             new
  7513.                 strlength = strlen(string),
  7514.                 sublength = strlen(substr),
  7515.                 m4 = maxlength * 4;
  7516.             // Packed - format doesn't like these strings.
  7517.             if (strlength + sublength >= m4)
  7518.             {
  7519.                 if (pos + sublength >= m4)
  7520.                 {
  7521.                     return
  7522.                         string{pos} = '\0',
  7523.                         // Hopefully this doesn't ignore maxlength and does packed.
  7524.                         strcat(string, substr, maxlength);
  7525.                 }
  7526.                 else
  7527.                 {
  7528.                     // pos + sublength is less than maxlength, so this sum MUST
  7529.                     // be positive and gte than "pos", so there's no need for
  7530.                     // additional checks.
  7531.                     string{maxlength - sublength - 1} = '\0';
  7532.                 }
  7533.             }
  7534.             return strins(string, substr, pos, maxlength);
  7535.         }
  7536.         else if (substr[0] > 255)
  7537.         {
  7538.             new
  7539.                 strlength = strlen(string),
  7540.                 sublength = strlen(substr);
  7541.             // Packed - format doesn't like these strings.
  7542.             if (strlength + sublength >= maxlength)
  7543.             {
  7544.                 if (pos + sublength >= maxlength)
  7545.                 {
  7546.                     return
  7547.                         string[pos] = '\0',
  7548.                         // Hopefully this doesn't ignore maxlength and does packed.
  7549.                         strcat(string, substr, maxlength);
  7550.                 }
  7551.                 else
  7552.                 {
  7553.                     // pos + sublength is less than maxlength, so this sum MUST
  7554.                     // be positive and gte than "pos", so there's no need for
  7555.                     // additional checks.
  7556.                     string[maxlength - sublength - 1] = '\0';
  7557.                 }
  7558.             }
  7559.             return strins(string, substr, pos, maxlength);
  7560.         }
  7561.         else
  7562.         {
  7563.             return format(string, maxlength, "%.*s%s%s", pos, string, substr, string[pos]);
  7564.         }
  7565.     }
  7566.    
  7567.     #define _ALS_strins
  7568.     #define strins FIXES_strins
  7569. #endif
  7570.  
  7571. /*
  7572.  * FIXES_ApplyAnimation(playerid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time, forcesync = 0)
  7573.  *
  7574.  * FIXES:
  7575.  *     ApplyAnimation
  7576.  */
  7577.  
  7578. #if defined _ALS_ApplyAnimation
  7579.     #error _ALS_ApplyAnimation defined
  7580. #endif
  7581. native BAD_ApplyAnimation(playerid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time, forcesync = 0) = ApplyAnimation;
  7582.  
  7583. #if FIX_ApplyAnimation
  7584.     stock FIXES_ApplyAnimation(playerid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time, forcesync = 0)
  7585.     {
  7586.         new
  7587.             diff,
  7588.             idx = animlib[0] & ~0x20;
  7589.         // Uses a sort of optimised binary search.  The code first identifies the area in the array
  7590.         // in which libraries with this first letter are, then does a binary search using only that
  7591.         // subset of the array.  This used to use an N-ary search that just went linearly through
  7592.         // the identified subset of the array, and that was 5x faster than a simple linear loop over
  7593.         // the whole array.  This new version is 50% faster than even that was.  "E" has no
  7594.         // libraries, but we don't check for that explicitly as it would slow down the more common
  7595.         // code path - and it ends fairly quickly anyway as "upper == lower".
  7596.         if (_FIXES_IN_RANGE(idx, 'A', 'W' + 1))
  7597.         {
  7598.             new
  7599.                 upper = FIXES_gscAnimIndexes[idx - ('A' - 1)],
  7600.                 lower = FIXES_gscAnimIndexes[idx - 'A'];
  7601.             while (upper != lower)
  7602.             {
  7603.                 idx = (upper - lower) / 2 + lower;
  7604.                 if ((diff = strcmp(FIXES_gscAnimLib[idx], animlib, true)))
  7605.                 {
  7606.                     if (diff > 0) upper = idx;
  7607.                     else lower = idx + 1;
  7608.                 }
  7609.                 else
  7610.                 {
  7611.                     return ApplyAnimation(playerid, animlib, animname, fDelta, loop, lockx, locky, freeze, time, forcesync);
  7612.                 }
  7613.             }
  7614.         }
  7615.         return 0;
  7616.     }
  7617.    
  7618.     #define _ALS_ApplyAnimation
  7619.     #define ApplyAnimation FIXES_ApplyAnimation
  7620. #endif
  7621.  
  7622. /*
  7623.  * FIXES_random(max)
  7624.  *
  7625.  * FIXES:
  7626.  *     random
  7627.  */
  7628.  
  7629. #if defined _ALS_random
  7630.     #error _ALS_random defined
  7631. #endif
  7632. native BAD_random(max) = random;
  7633.  
  7634. #if FIX_random
  7635.     stock FIXES_random(max)
  7636.     {
  7637.         if (max < 0)
  7638.         {
  7639.             return -random(-max);
  7640.         }
  7641.         else
  7642.         {
  7643.             return random(max);
  7644.         }
  7645.     }
  7646.    
  7647.     #define _ALS_random
  7648.     #define random FIXES_random
  7649. #endif
  7650.  
  7651. /*
  7652.  * FIXES_SetCamera
  7653.  *
  7654.  * FIXES:
  7655.  *     SetPlayerCamera
  7656.  */
  7657.  
  7658. #if FIX_SetPlayerCamera
  7659.     forward _FIXES_SetCamera(playerid, type, Float:x, Float:y, Float:z);
  7660.    
  7661.     public _FIXES_SetCamera(playerid, type, Float:x, Float:y, Float:z)
  7662.     {
  7663.         if (type)
  7664.         {
  7665.             SetPlayerCameraPos(playerid, x, y, z);
  7666.         }
  7667.         else
  7668.         {
  7669.             SetPlayerCameraLookAt(playerid, x, y, z);
  7670.         }
  7671.         return 0;
  7672.     }
  7673. #endif
  7674.  
  7675. /*
  7676.  * FIXES_SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z)
  7677.  *
  7678.  * FIXES:
  7679.  *     SetPlayerCamera
  7680.  */
  7681.  
  7682. #if defined _ALS_SetPlayerCameraPos
  7683.     #error _ALS_SetPlayerCameraPos defined
  7684. #endif
  7685. native BAD_SetPlayerCameraPos(playerid, Float:x, Float:y, Float:z) = SetPlayerCameraPos;
  7686.  
  7687. #if FIX_SetPlayerCamera
  7688.     stock FIXES_SetPlayerCameraPos(playerid, Float:x, Float:y, Float:z)
  7689.     {
  7690.         if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  7691.         {
  7692.             #if FIXES_Single
  7693.                 if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_SPECTATING || GetPlayerState(playerid) == PLAYER_STATE_SPECTATING)
  7694.             #else
  7695.                 if (GetPVarInt(playerid, pvarPlayerSpectate) || GetPlayerState(playerid) == PLAYER_STATE_SPECTATING)
  7696.             #endif
  7697.                 {
  7698.                     SetTimerEx(FIXES_gscSetCamera, 300, 0, FIXES_gscSpec@iifff, playerid, 1, x, y, z);
  7699.                 }
  7700.                 else
  7701.                 {
  7702.                     SetPlayerCameraPos(playerid, x, y, z);
  7703.                 }
  7704.         }
  7705.         return 0;
  7706.     }
  7707.    
  7708.     #define _ALS_SetPlayerCameraPos
  7709.     #define SetPlayerCameraPos FIXES_SetPlayerCameraPos
  7710. #endif
  7711.  
  7712. /*
  7713.  * FIXES_SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z)
  7714.  *
  7715.  * FIXES:
  7716.  *     SetPlayerCamera
  7717.  */
  7718.  
  7719. #if defined _ALS_SetPlayerCameraLookAt
  7720.     #error _ALS_SetPlayerCameraLookAt defined
  7721. #endif
  7722. native BAD_SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z) = SetPlayerCameraLookAt;
  7723.  
  7724. #if FIX_SetPlayerCamera
  7725.     stock FIXES_SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z)
  7726.     {
  7727.         if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  7728.         {
  7729.             #if FIXES_Single
  7730.                 if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_SPECTATING || GetPlayerState(playerid) == PLAYER_STATE_SPECTATING)
  7731.             #else
  7732.                 if (GetPVarInt(playerid, pvarPlayerSpectate) || GetPlayerState(playerid) == PLAYER_STATE_SPECTATING)
  7733.             #endif
  7734.                 {
  7735.                     SetTimerEx(FIXES_gscSetCamera, 300, 0, FIXES_gscSpec@iifff, playerid, 2, x, y, z);
  7736.                 }
  7737.                 else
  7738.                 {
  7739.                     SetPlayerCameraLookAt(playerid, x, y, z);
  7740.                 }
  7741.         }
  7742.         return 0;
  7743.     }
  7744.    
  7745.     #define _ALS_SetPlayerCameraLookAt
  7746.     #define SetPlayerCameraLookAt FIXES_SetPlayerCameraLookAt
  7747. #endif
  7748.  
  7749. /*
  7750.  * FIXES_TogglePlayerSpectating(playerid, toggle)
  7751.  *
  7752.  * FIXES:
  7753.  *     SetPlayerCamera
  7754.  */
  7755.  
  7756. #if defined _ALS_TogglePlayerSpectating
  7757.     #error _ALS_TogglePlayerSpectating defined
  7758. #endif
  7759. native BAD_TogglePlayerSpectating(playerid, toggle) = TogglePlayerSpectating;
  7760.  
  7761. #if FIX_SetPlayerCamera
  7762.     stock FIXES_TogglePlayerSpectating(playerid, toggle)
  7763.     {
  7764.         if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
  7765.         {
  7766.             if (toggle)
  7767.             {
  7768.                 #if FIXES_Single
  7769.                     FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_SPECTATING;
  7770.                 #else
  7771.                     DeletePVar(playerid, FIXES_pvarPlayerSpectate);
  7772.                 #endif
  7773.             }
  7774.             else
  7775.             {
  7776.                 #if FIXES_Single
  7777.                     FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_SPECTATING;
  7778.                 #else
  7779.                     SetPVarInt(playerid, FIXES_pvarPlayerSpectate, 1);
  7780.                 #endif
  7781.             }
  7782.             return TogglePlayerSpectating(playerid, toggle);
  7783.         }
  7784.         return 0;
  7785.     }
  7786.    
  7787.     #define _ALS_TogglePlayerSpectating
  7788.     #define TogglePlayerSpectating FIXES_TogglePlayerSpectating
  7789. #endif
  7790.  
  7791. /*
  7792.  * FIXES_sleep(const time)
  7793.  *
  7794.  * FIXES:
  7795.  *     sleep
  7796.  */
  7797.  
  7798. // Uses a little trick to consume part of the line and thus not match
  7799. // our hooked version.
  7800. #if defined _ALS_sleep
  7801.     #error _ALS_sleep defined
  7802. #endif
  7803. #define BAD_sleep%0\n%9 sleep%0
  7804.  
  7805. #if FIX_sleep
  7806.     stock FIXES_sleep(ms)
  7807.     {
  7808.         // Call a native function that does very little, but saves the current
  7809.         // heap pointer.  Then return to save the accurate stack pointer.
  7810.         return heapspace(), ms;
  7811.     }
  7812.    
  7813.     #define _ALS_sleep
  7814.    
  7815.     #define sleep%0\n%9 sleep FIXES_sleep(%0)
  7816.     // This fixes another BIZZARE bug.  Just doing:
  7817.     //  
  7818.     //  #define FIXES_sleep(%0;) FIXES_sleep(%0)
  7819.     //  
  7820.     // Results in:
  7821.     //  
  7822.     //  FIXES_sleep(n));
  7823.     //  
  7824.     // Which clearly it shouldn't.  I've stepped through the compilation and that
  7825.     // extra bracket comes from nowhere!
  7826.     #define FIXES_sleep(%0;) FIXES_sleep _FIXES_SLEEP_BRACKET %0);
  7827.     #define _FIXES_SLEEP_BRACKET (
  7828. #endif
  7829.  
  7830. /*
  7831.  * _FIXES_AddInternal(array[], value, size)
  7832.  *
  7833.  * Add something to an internal l   inked list.
  7834.  */
  7835.  
  7836. static stock _FIXES_AddInternal(array[], value, size)
  7837. {
  7838.     if (array[value] <= value)
  7839.     {
  7840.         new
  7841.             last = size,
  7842.             next = array[last];
  7843.         while (next < value)
  7844.         {
  7845.             last = next,
  7846.             next = array[last];
  7847.         }
  7848.         array[next - 1] = value + 1,
  7849.         array[(value - 1) % (size + 1)] = (last + 1) % (size + 1),
  7850.         array[last] = value,
  7851.         array[value] = next;
  7852.     }
  7853. }
  7854.  
  7855. /*
  7856.  * _FIXES_RemoveInternal(array[], value, size)
  7857.  *
  7858.  * Remove something from an internal linked list.
  7859.  */
  7860.  
  7861. static stock _FIXES_RemoveInternal(array[], value, size)
  7862. {
  7863.     if (array[value] > value)
  7864.     {
  7865.         static
  7866.             last;
  7867.         // Adjustment for easier "mod"ing.
  7868.         ++size,
  7869.         last = (array[(value - 1) % size] - 1) % size,
  7870.         // Store the reverse value here as well as in the previous slot.
  7871.         array[value] =
  7872.             // Copy the next value to the last value.
  7873.             array[(array[last] = array[value]) - 1] =
  7874.                 // Set the reverse iterator value.
  7875.                 (last + 1) % size;
  7876.     }
  7877. }
  7878.  
  7879. #undef _FIXES_CEILDIV
  7880. #undef _FIXES_INFINITY
  7881. #undef _FIXES_N_INFINITY
  7882. #undef _FIXES_ATTACHMENTS
  7883. #undef _FIXES_FOREACH
  7884. #undef _FIXES_IS_UNSET
  7885. #undef _FIXES_IS_IN_CHARGE
  7886. #undef _FIXES_IN_RANGE
  7887. #undef _FIXES_NO_RANGE
  7888. #undef _FIXES_FORWARD
  7889. #undef FIXES_PRINTF
  7890.  
  7891. #endinput
  7892.  
  7893. // Fix inclusion template.
  7894.  
  7895. #if !defined FIX_NameOfFixHere
  7896.     #define FIX_NameOfFixHere            (1)
  7897. #elseif _FIXES_IS_UNSET(FIX_NameOfFixHere)
  7898.     #undef FIX_NameOfFixHere
  7899.     #define FIX_NameOfFixHere            (2)
  7900. #endif
  7901.  
  7902. // Fix function template.
  7903.  
  7904. /*
  7905.  * FIXES_NameOfFixHere
  7906.  *
  7907.  * FIXES:
  7908.  *     NameOfFixHere
  7909.  */
  7910.  
  7911. #if defined _ALS_NameOfFixHere
  7912.     #error _ALS_NameOfFixHere defined
  7913. #endif
  7914. native BAD_NameOfFixHere(params) = NameOfFixHere;
  7915.  
  7916. #if FIX_NameOfFixHere
  7917.     stock FIXES_NameOfFixHere(params)
  7918.     {
  7919.         return 0;
  7920.     }
  7921.    
  7922.     #define _ALS_NameOfFixHere
  7923.     #define NameOfFixHere FIXES_NameOfFixHere
  7924. #endif
Add Comment
Please, Sign In to add comment