mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			8400 lines
		
	
	
		
			252 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			8400 lines
		
	
	
		
			252 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| /* 
 | |
|  * ===============
 | |
|  *  INTRODUCTION: 
 | |
|  * ===============
 | |
|  * 
 | |
|  * fixes.inc - Community patch for buggy SA:MP functions.
 | |
|  * 
 | |
|  * ================
 | |
|  *  LIST OF FIXES: 
 | |
|  * ================
 | |
|  * 
 | |
|  * FIX:      GetPlayerColor
 | |
|  * PROBLEM:  Returns "0" if "SetPlayerColor" has never been called.
 | |
|  * SOLUTION: Call "SetPlayerColor" in "OnPlayerConnect".
 | |
|  * SEE:      "OnPlayerConnect".
 | |
|  * AUTHOR:   KoczkaHUN
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1486048
 | |
|  * 
 | |
|  * FIX:      FILTERSCRIPT
 | |
|  * PROBLEM:  Despite the fact that is in every new script, many people don't
 | |
|  *           define "FILTERSCRIPT" where appropriate.
 | |
|  * SOLUTION: Provide an "IS_FILTERSCRIPT" variable (note the naming to match
 | |
|  *           the original macro).
 | |
|  * AUTHOR:   Y_Less
 | |
|  * SEE:      "OnFilterScriptInit" and "OnGameModeInit".
 | |
|  * 
 | |
|  * FIX:      SpawnPlayer
 | |
|  * PROBLEM:  Kills the player if they are in a vehicle.
 | |
|  * SOLUTION: Remove the from the vehicle.
 | |
|  * SEE:      "FIXES_SpawnPlayer".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      SetPlayerName
 | |
|  * PROBLEM:  Using "SetPlayerName" when the new name only differs from the old
 | |
|  *           name in case does not alter the name at all.
 | |
|  * SOLUTION: Change their name twice - once to "_FIXES TEMP NAME" and then to
 | |
|  *           the actual required name.
 | |
|  * SEE:      "OnPlayerConnect" and "FIXES_SetPlayerName".
 | |
|  * AUTHOR:   Y_Less/Slice/xX_Simon_Xx
 | |
|  * POST:     https://github.com/Y-Less/sa-mp-fixes/issues/3
 | |
|  * 
 | |
|  * FIX:      GetPlayerSkin
 | |
|  * PROBLEM:  Returns the new skin after "SetSpawnInfo" is called but before the
 | |
|  *           player actually respawns to get the new skin.
 | |
|  * SOLUTION: Record the skin in "OnPlayerSpawn" and always return that one.
 | |
|  * SEE:      "OnPlayerSpawn", "FIXES_GetPlayerSkin" and "FIXES_SetPlayerSkin".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      GetWeaponName
 | |
|  * PROBLEM:  Returns nothing for 18, 44, and 45.
 | |
|  * SOLUTION: Return the correct names ("Molotov Cocktail", "Thermal Goggles",
 | |
|  *           and "Night vision Goggles").
 | |
|  * SEE:      "FIXES_GetWeaponName".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      SetPlayerWorldBounds
 | |
|  * PROBLEM:  Aiming can bypass the edge.
 | |
|  * SOLUTION: Check for the player leaving the area and reset them to their last
 | |
|  *           good position if they leave the area (aiming or not).
 | |
|  * SEE:      "OnPlayerUpdate" and "FIXES_SetPlayerWorldBounds".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      TogglePlayerControllable
 | |
|  * PROBLEM:  Other players see you moving on the spot.
 | |
|  * SOLUTION: Return 0 in OnPlayerUpdate.
 | |
|  * SEE:      "FIXES_TogglePlayerControllable" and "OnPlayerUpdate".
 | |
|  * AUTHOR:   Slice
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=876854
 | |
|  * 
 | |
|  * FIX:      HydraSniper
 | |
|  * PROBLEM:  Entering military aircraft with a sniper rifle messes up views.
 | |
|  * SOLUTION: Set their armed weapon to fists.
 | |
|  * SEE:      "OnPlayerStateChange", "FIXES_GivePlayerWeapon",
 | |
|  *           "FIXES_SetPlayerArmedWeapon".
 | |
|  * AUTHOR:   funky1234
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=965644
 | |
|  * 
 | |
|  * FIX:      IsPlayerInCheckpoint
 | |
|  * PROBLEM:  Function returns an undefined value if it is called before any
 | |
|  *           other checkpoint functions are called to initialise the value.
 | |
|  * SOLUTION: Call "DisablePlayerCheckpoint" when they connect.
 | |
|  * SEE:      "OnPlayerConnect".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      IsPlayerInRaceCheckpoint
 | |
|  * PROBLEM:  Function returns an undefined value if it is called before any
 | |
|  *           other race checkpoint functions are called to initialise the value.
 | |
|  * SOLUTION: Call "DisablePlayerRaceCheckpoint" when they connect.
 | |
|  * SEE:      "OnPlayerConnect".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      GetPlayerWeapon
 | |
|  * PROBLEM:  Returns the old value after using "SetPlayerArmedWeapon" when they
 | |
|  *           are in a vehicle.
 | |
|  * SOLUTION: If "SetPlayerArmedWeapon" is called in a vehicle, store the new
 | |
|  *           value and return that instead.
 | |
|  * SEE:      "OnPlayerStateChange", "FIXES_SetPlayerArmedWeapon", and
 | |
|  *           "FIXES_GetPlayerWeapon".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      PutPlayerInVehicle
 | |
|  * PROBLEM:  If this is used on a passenger the driver of their old vehicle
 | |
|  *           doesn't see them in their new vehicle.
 | |
|  * SOLUTION: Remove them from the vehicle first.
 | |
|  * SEE:      "OnPlayerStateChange" and "FIXES_PutPlayerInVehicle".
 | |
|  * AUTHOR:   leong124/Y_Less
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1265965
 | |
|  * 
 | |
|  * FIX:      KEY_AIM
 | |
|  * PROBLEM:  "KEY_AIM" isn't defined by default.
 | |
|  * SOLUTION: Define it.
 | |
|  * SEE:      N/A.
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      SetPlayerCheckpoint
 | |
|  * PROBLEM:  If a checkpoint is already set it will use the size of that
 | |
|  *           checkpoint instead of the new one.
 | |
|  * SOLUTION: Call "DisablePlayerCheckpoint" before setting the checkpoint.
 | |
|  * SEE:      "FIXES_SetPlayerCheckpoint".
 | |
|  * AUTHOR:   KoczkaHUN
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1482401
 | |
|  * 
 | |
|  * FIX:      SetPlayerRaceCheckpoint
 | |
|  * PROBLEM:  If a checkpoint is already set it will use the size of that
 | |
|  *           checkpoint instead of the new one.
 | |
|  * SOLUTION: Call "DisablePlayerRaceCheckpoint" before setting the checkpoint.
 | |
|  * SEE:      "FIXES_SetPlayerRaceCheckpoint".
 | |
|  * AUTHOR:   KoczkaHUN
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1482401
 | |
|  * 
 | |
|  * FIX:      TextDrawCreate
 | |
|  * PROBLEM:  Crashes on a blank string.
 | |
|  * SOLUTION: Intercept blank strings.
 | |
|  * SEE:      "FIXES_TextDrawCreate".
 | |
|  * AUTHOR:   wups
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1484008
 | |
|  * 
 | |
|  * FIX:      TextDrawSetString
 | |
|  * PROBLEM:  Crashes on a blank string and size greater than 1024.
 | |
|  * SOLUTION: Intercept blank strings and truncate long strings.
 | |
|  * SEE:      "FIXES_TextDrawSetString".
 | |
|  * AUTHOR:   TomTrox
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1487870
 | |
|  * 
 | |
|  * FIX:      CreatePlayerTextDraw
 | |
|  * PROBLEM:  Crashes on a blank string.
 | |
|  * SOLUTION: Intercept blank strings.
 | |
|  * SEE:      "FIXES_CreatePlayerTextDraw".
 | |
|  * AUTHOR:   wups/Y_Less
 | |
|  * 
 | |
|  * FIX:      PlayerTextDrawSetString
 | |
|  * PROBLEM:  Crashes on a blank string and size greater than 1024.
 | |
|  * SOLUTION: Intercept blank strings and truncate long strings.
 | |
|  * SEE:      "FIXES_PlayerTextDrawSetString".
 | |
|  * AUTHOR:   TomTrox/Y_Less
 | |
|  * 
 | |
|  * FIX:      AllowInteriorWeapons
 | |
|  * PROBLEM:  Does nothing.
 | |
|  * SOLUTION: Set the player's weapon to fists in an interior.
 | |
|  * SEE:      "FIXES_AllowInteriorWeapons", "OnGameModeInit" and
 | |
|  *           "OnPlayerUpdate".
 | |
|  * AUTHOR:   KoczkaHUN
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1502696
 | |
|  * 
 | |
|  * FIX:      OnPlayerEnterVehicle
 | |
|  * PROBLEM:  Crashes other players when people enter an invalid seat.
 | |
|  * SOLUTION: Desync the people with invalid seats.
 | |
|  * SEE:      "OnPlayerStateChange" and "OnPlayerUpdate".
 | |
|  * AUTHOR:   RyDeR`/Y_Less
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1410296
 | |
|  * 
 | |
|  * FIX:      OnPlayerEnterVehicle_2
 | |
|  * PROBLEM:  Crashes the server when hacks enter an invalid vehicle.
 | |
|  * SOLUTION: Desync the people with invalid vehicles.
 | |
|  * SEE:      "OnPlayerEnterVehicle".
 | |
|  * AUTHOR:   im/Y_Less
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=2340900
 | |
|  * 
 | |
|  * FIX:      AllowTeleport
 | |
|  * PROBLEM:  0.3dRC9 removed "AllowPlayerTeleport" and "AllowAdminTeleport" in
 | |
|  *           favour of "OnPlayerClickMap".  Some scripts used the old code and.
 | |
|  * SOLUTION: Teleport the player in "OnPlayerClickMap".
 | |
|  * SEE:      "OnPlayerClickMap", "FIXES_AllowPlayerTeleport", and
 | |
|  *           "FIXES_AllowAdminTeleport".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      SetPlayerSpecialAction
 | |
|  * PROBLEM:  Removing jetpacks from players by setting their special action to 0
 | |
|  *           causes the sound to stay until death.
 | |
|  * SOLUTION: Call "ClearAnimations" before "SetPlayerSpecialAction".
 | |
|  * SEE:      "FIXES_SetPlayerSpecialAction".
 | |
|  * AUTHOR:   MP2
 | |
|  * POST:     Private message from MP2.
 | |
|  * 
 | |
|  * FIX:      OnDialogResponse
 | |
|  * PROBLEM:  Cheaters can spoof the dialogid they are using to respond to ones
 | |
|  *           they can't actually see.
 | |
|  * SOLUTION: Store the displayed dialogid and use that instead.
 | |
|  * SEE:      "FIXES_OnDialogResponse", "FIXES_ShowPlayerDialog".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * FIXED IN: 0.3e RC6
 | |
|  * 
 | |
|  * FIX:      GetPlayerDialog
 | |
|  * PROBLEM:  This function doesn't exist.  Fixed for hidden dialogs.
 | |
|  * SOLUTION: Add it.  DEFAULTS TO FALSE!
 | |
|  * SEE:      "FIXES_GetPlayerDialog".
 | |
|  * AUTHOR:   Y_Less/xX_Simon_Xx
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=2141254
 | |
|  * 
 | |
|  * FIX:      PlayerDialogResponse
 | |
|  * PROBLEM:  A player's dialog doesn't hide when the gamemode restarts, causing
 | |
|  *           the server to print "Warning: PlayerDialogResponse PlayerId: 0
 | |
|  *           dialog ID doesn't match last sent dialog ID".
 | |
|  * SOLUTION: Hide it.
 | |
|  * SEE:      "OnPlayerConnect", "OnGameModeExit".
 | |
|  * AUTHOR:   xX_Simon_Xx
 | |
|  * POST:     https://github.com/Y-Less/sa-mp-fixes/issues/2
 | |
|  * 
 | |
|  * FIX:      SetSpawnInfo
 | |
|  * PROBLEM:  Kicks the player if "SpawnPlayer" is called before "SetSpawnInfo".
 | |
|  * SOLUTION: Call "SetSpawnInfo" at least once.
 | |
|  * SEE:      "OnPlayerConnect".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      SetPlayerSkin
 | |
|  * PROBLEM:  Breaks sitting on bikes.
 | |
|  * SOLUTION: Put them back in the vehicle after setting their skin.
 | |
|  * SEE:      "FIXES_SetPlayerSkin".
 | |
|  * AUTHOR:   CyNiC
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1756094
 | |
|  * 
 | |
|  * FIX:      HideMenuForPlayer
 | |
|  * PROBLEM:  Crashes when passed an invalid menu ID.
 | |
|  * SOLUTION: Don't hide it when passed an invalid menu.
 | |
|  * SEE:      "FIXES_HideMenuForPlayer".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1787297
 | |
|  * 
 | |
|  * FIX:      valstr
 | |
|  * PROBLEM:  Crashes on large numbers.
 | |
|  * SOLUTION: Use "format" instead.
 | |
|  * SEE:      "FIXES_valstr".
 | |
|  * AUTHOR:   Slice
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300
 | |
|  * 
 | |
|  * FIX:      fclose
 | |
|  * PROBLEM:  Crashes on an invalid handle.
 | |
|  * SOLUTION: Check for an invalid handle.
 | |
|  * SEE:      "FIXES_fclose".
 | |
|  * AUTHOR:   Slice
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300
 | |
|  * 
 | |
|  * FIX:      fwrite
 | |
|  * PROBLEM:  Crashes on an invalid handle.
 | |
|  * SOLUTION: Check for an invalid handle.
 | |
|  * SEE:      "FIXES_fwrite".
 | |
|  * AUTHOR:   Slice
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300
 | |
|  * 
 | |
|  * FIX:      fread
 | |
|  * PROBLEM:  Crashes on an invalid handle.
 | |
|  * SOLUTION: Check for an invalid handle.
 | |
|  * SEE:      "FIXES_fread".
 | |
|  * AUTHOR:   Slice
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300
 | |
|  * 
 | |
|  * FIX:      fputchar
 | |
|  * PROBLEM:  Crashes on an invalid handle.
 | |
|  * SOLUTION: Check for an invalid handle.
 | |
|  * SEE:      "FIXES_fputchar".
 | |
|  * AUTHOR:   Slice
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300
 | |
|  * 
 | |
|  * FIX:      fgetchar
 | |
|  * PROBLEM:  Crashes on an invalid handle.
 | |
|  * SOLUTION: Check for an invalid handle.
 | |
|  * SEE:      "FIXES_fgetchar".
 | |
|  * AUTHOR:   Slice
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300
 | |
|  * 
 | |
|  * FIX:      fblockwrite
 | |
|  * PROBLEM:  Crashes on an invalid handle.
 | |
|  * SOLUTION: Check for an invalid handle.
 | |
|  * SEE:      "FIXES_fblockwrite".
 | |
|  * AUTHOR:   Slice
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300
 | |
|  * 
 | |
|  * FIX:      fblockread
 | |
|  * PROBLEM:  Crashes on an invalid handle.
 | |
|  * SOLUTION: Check for an invalid handle.
 | |
|  * SEE:      "FIXES_fblockread".
 | |
|  * AUTHOR:   Slice
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300
 | |
|  * 
 | |
|  * FIX:      fseek
 | |
|  * PROBLEM:  Crashes on an invalid handle.
 | |
|  * SOLUTION: Check for an invalid handle.
 | |
|  * SEE:      "FIXES_fseek".
 | |
|  * AUTHOR:   Slice
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300
 | |
|  * 
 | |
|  * FIX:      flength
 | |
|  * PROBLEM:  Crashes on an invalid handle.
 | |
|  * SOLUTION: Check for an invalid handle.
 | |
|  * SEE:      "FIXES_flength".
 | |
|  * AUTHOR:   Slice
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1790300
 | |
|  * 
 | |
|  * FIX:      file_inc
 | |
|  * PROBLEM:  Includes or excludes all the file function fixes together (can
 | |
|  *           cause major overhead).
 | |
|  * SOLUTION: Optionally group them all under one define.  DEFAULTS TO FALSE!
 | |
|  * SEE:      "FIX_file_inc".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      IsPlayerAttachedObjectSlotUsed
 | |
|  * PROBLEM:  Doesn't work in OnPlayerDisconnect.
 | |
|  * SOLUTION: Maintain an internal record of slots used.
 | |
|  * SEE:      "FIXES_SetPlayerAttachedObject",
 | |
|  *           "FIXES_RemovePlayerAttachedObject",
 | |
|  *           "FIXES_IsPAttachedObjectSlotUsed", and
 | |
|  *           "OnPlayerDisconnect".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      SetPlayerAttachedObject
 | |
|  * PROBLEM:  Doesn't remove objects when the mode ends.
 | |
|  * SOLUTION: Remove them.
 | |
|  * SEE:      "FIXES_SetPlayerAttachedObject",
 | |
|  *           "FIXES_RemovePlayerAttachedObject", and
 | |
|  *           "OnPlayerDisconnect".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      OnPlayerDeath
 | |
|  * PROBLEM:  Clients get stuck when they die with an animation applied.
 | |
|  * SOLUTION: Clear their animations.
 | |
|  * SEE:      "OnPlayerDeath" and "OnPlayerUpdate".
 | |
|  * AUTHOR:   h02
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1641144
 | |
|  * 
 | |
|  * FIX:      strins
 | |
|  * PROBLEM:  Ignores the "maxlength" parameter causing possible crashes.
 | |
|  * SOLUTION: Manually check the length.
 | |
|  * SEE:      "FIXES_strins".
 | |
|  * AUTHOR:   Slice/Y_Less
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1860495
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1864706
 | |
|  * 
 | |
|  * FIX:      IsPlayerConnected
 | |
|  * PROBLEM:  Only uses the lower two bytes of a passed ID.
 | |
|  * SOLUTION: Mask the numbers.
 | |
|  * SEE:      "FIXES_IsPlayerConnected".
 | |
|  * AUTHOR:   Slice
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1860464
 | |
|  * 
 | |
|  * FIX:      OnPlayerCommandText
 | |
|  * PROBLEM:  Can crash ZCMD when passed a null string.
 | |
|  * SOLUTION: Pass NULL if invalid inputs given.
 | |
|  * SEE:      "OnPlayerCommandText".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1909511
 | |
|  * 
 | |
|  * FIX:      TrainExit
 | |
|  * PROBLEM:  When getting out of a train entered by "PutPlayerInVehicle", the
 | |
|  *           camera does not reset properly.
 | |
|  * SOLUTION: Reset the camera.
 | |
|  * SEE:      "FIXES_PutPlayerInVehicle", "FIXES_OnPlayerStateChange".
 | |
|  * AUTHOR:   Terminator3/Y_Less
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1980214
 | |
|  * 
 | |
|  * FIX:      Kick
 | |
|  * PROBLEM:  Calling "Kick" in "OnPlayerConnect" doesn't work properly.
 | |
|  * SOLUTION: Defer it.
 | |
|  * SEE:      "OnPlayerConnect", "FIXES_Kick".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1989453
 | |
|  * FIXED IN: 0.3x
 | |
|  * 
 | |
|  * FIX:      OnVehicleMod
 | |
|  * PROBLEM:  Crashes other players when invalid mods are applied.
 | |
|  * SOLUTION: Desync the player.
 | |
|  * SEE:      "OnVehicleMod".
 | |
|  * AUTHOR:   JernejL/Y_Less
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1671500
 | |
|  * 
 | |
|  * FIX:      random
 | |
|  * PROBLEM:  Doesn't work with negative numbers.
 | |
|  * SOLUTION: Invert then reinvert.  DEFAULTS TO FALSE!
 | |
|  * SEE:      "FIXES_random".
 | |
|  * AUTHOR:   xX_Simon_Xx
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=2141254
 | |
|  * 
 | |
|  * FIX:      sleep
 | |
|  * PROBLEM:  Leaks bytes from the stack.
 | |
|  * SOLUTION: Call a function to store the correct value.
 | |
|  * SEE:      "FIXES_sleep".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      AddMenuItem
 | |
|  * PROBLEM:  Crashes when passed an invalid menu ID.
 | |
|  * SOLUTION: Don't hide it when passed an invalid menu.
 | |
|  * SEE:      "FIXES_AddMenuItem".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      SetMenuColumnHeader
 | |
|  * PROBLEM:  Crashes when passed an invalid menu ID.
 | |
|  * SOLUTION: Don't hide it when passed an invalid menu.
 | |
|  * SEE:      "FIXES_SetMenuColumnHeader".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      ShowMenuForPlayer
 | |
|  * PROBLEM:  Crashes when passed an invalid menu ID.
 | |
|  * SOLUTION: Don't hide it when passed an invalid menu.
 | |
|  * SEE:      "FIXES_ShowMenuForPlayer".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      HideMenuForPlayer
 | |
|  * PROBLEM:  Crashes when passed an invalid menu ID.
 | |
|  * SOLUTION: Don't hide it when passed an invalid menu.
 | |
|  * SEE:      "FIXES_HideMenuForPlayer".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1787297
 | |
|  * 
 | |
|  * FIX:      HideMenuForPlayer_2
 | |
|  * PROBLEM:  Ignores the "menuid" parameter.
 | |
|  * SOLUTION: Only hide the correct menu.  DEFAULTS TO FALSE!
 | |
|  * SEE:      "FIXES_HideMenuForPlayer".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      DisableMenu
 | |
|  * PROBLEM:  Crashes when passed an invalid menu ID.
 | |
|  * SOLUTION: Don't hide it when passed an invalid menu.
 | |
|  * SEE:      "FIXES_DisableMenu".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      DisableMenuRow
 | |
|  * PROBLEM:  Crashes when passed an invalid menu ID.
 | |
|  * SOLUTION: Don't hide it when passed an invalid menu.
 | |
|  * SEE:      "FIXES_DisableMenuRow".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      Menus
 | |
|  * PROBLEM:  All menu function fixes are included separately for major overhead.
 | |
|  * SOLUTION: Optionally group them all under one define.
 | |
|  * SEE:      "FIX_Menus", "_FIX_Menus"
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      GetPlayerMenu
 | |
|  * PROBLEM:  Returns previous menu when none is displayed.
 | |
|  * SOLUTION: Return the correct value.
 | |
|  * SEE:      "FIXES_GetPlayerMenu", "OnPlayerSelectedMenuRow".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=2295867
 | |
|  * 
 | |
|  * FIX:      GetPlayerInterior
 | |
|  * PROBLEM:  Always returns 0 for NPCs.
 | |
|  * SOLUTION: Return the correct value.
 | |
|  * SEE:      "FIXES_GetPlayerInterior", "FIXES_SetPlayerInterior".
 | |
|  * AUTHOR:   Y_Less/xX_Simon_Xx
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=2309246
 | |
|  * 
 | |
|  * FIX:      ClearAnimations
 | |
|  * PROBLEM:  Use ClearAnimation while you are in a vehicle cause the player exit
 | |
|  *           from it.
 | |
|  * SOLUTION: Apply an animation instead of clear animation.
 | |
|  * SEE:      "FIXES_ClearAnimations".
 | |
|  * AUTHOR:   xX_Simon_Xx
 | |
|  * POST:     https://github.com/Y-Less/sa-mp-fixes/issues/4
 | |
|  * 
 | |
|  * FIX:      ClearAnimations_2
 | |
|  * PROBLEM:  ClearAnimations doesn't do anything when the animation ends if we
 | |
|  *           pass 1 for the freeze parameter in ApplyAnimation.
 | |
|  * SOLUTION: Apply an idle animation for stop and then use ClearAnimation.
 | |
|  * SEE:      "FIXES_ClearAnimations".
 | |
|  * AUTHOR:   xX_Simon_Xx
 | |
|  * POST:     https://github.com/Y-Less/sa-mp-fixes/issues/4
 | |
|  * 
 | |
|  * FIX:      DriveBy
 | |
|  * PROBLEM:  If you press KEY_CROUCH while you're passenger and if you are
 | |
|  *           armed, the player start to aim; if you repress KEY_CROUCH the
 | |
|  *           player don't return in vehicle.
 | |
|  * SOLUTION: Apply the animation to return the player in the vehicle.
 | |
|  * SEE:      "OnPlayerKeyStateChange".
 | |
|  * AUTHOR:   xX_Simon_Xx
 | |
|  * POST:     https://github.com/Y-Less/sa-mp-fixes/issues/13
 | |
|  * 
 | |
|  * FIX:      GangZoneCreate
 | |
|  * PROBLEM:  Gang zones bug on the main map for players at certain angles
 | |
|  *           relative to them.
 | |
|  * SOLUTION: Set a non floating value for the gang zone co-ordinate.
 | |
|  * SEE:      "FIXES_GangZoneCreate".
 | |
|  * AUTHOR:   xX_Simon_Xx/Y_Less
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=2144109
 | |
|  * 
 | |
|  * FIX:      SPECIAL_ACTION_PISSING
 | |
|  * PROBLEM:  "SPECIAL_ACTION_PISSING" isn't defined by default.
 | |
|  * SOLUTION: Define it.
 | |
|  * SEE:      N/A.
 | |
|  * AUTHOR:   xX_Simon_Xx
 | |
|  * POST:     https://github.com/Y-Less/sa-mp-fixes/issues/6
 | |
|  * 
 | |
|  * FIX:      IsValidVehicle
 | |
|  * PROBLEM:  "IsValidVehicle" isn't defined by default.
 | |
|  * SOLUTION: Define it.
 | |
|  * SEE:      N/A.
 | |
|  * AUTHOR:   xX_Simon_Xx
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=2693650
 | |
|  * 
 | |
|  * FIX:      ApplyAnimation
 | |
|  * PROBLEM:  Passing an invalid animation library in ApplyAnimation causes a
 | |
|  *           client crash for streamed in players.
 | |
|  * SOLUTION: Block ApplyAnimation when an invalid library is passed.
 | |
|  * SEE:      "FIXES_ApplyAnimation".
 | |
|  * AUTHOR:   xX_Simon_Xx
 | |
|  * POST:     https://github.com/Y-Less/sa-mp-fixes/issues/5
 | |
|  * 
 | |
|  * FIX:      ApplyAnimation_2
 | |
|  * PROBLEM:  First time a library is used, it does nothing.
 | |
|  * SOLUTION: Apply animations twice when first using a library.
 | |
|  * SEE:      "FIXES_ApplyAnimation".
 | |
|  * AUTHOR:   xX_Simon_Xx/Lordzy/Y_Less
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=3052627
 | |
|  * 
 | |
|  * FIX:      OnPlayerSpawn
 | |
|  * PROBLEM:  San Andreas deducts $100 from players.
 | |
|  * SOLUTION: Give them it back.
 | |
|  * SEE:      "OnPlayerSpawn".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      GetGravity
 | |
|  * PROBLEM:  "GetGravity" isn't defined by default.
 | |
|  * SOLUTION: Define it.
 | |
|  * SEE:      N/A.
 | |
|  * AUTHOR:   Whitetiger
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1706447
 | |
|  * 
 | |
|  * FIX:      gpci
 | |
|  * PROBLEM:  "gpci" isn't defined by default.
 | |
|  * SOLUTION: Define it.
 | |
|  * SEE:      N/A.
 | |
|  * AUTHOR:   xX_Simon_Xx
 | |
|  * POST:     http://pastebin.com/VQSGpbSm
 | |
|  * 
 | |
|  * FIX:      Natives
 | |
|  * PROBLEM:  Several natives are included by default, this enables or disables
 | |
|  *           them all.  Therefore this is an umbrella fix for several fixes.
 | |
|  * SOLUTION: Define them.
 | |
|  * SEE:      "FIX_GetGravity", "FIX_gpci", "FIX_IsValidVehicle".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      OnPlayerConnect
 | |
|  * PROBLEM:  This function isn't called for players when a filterscript starts.
 | |
|  * SOLUTION: Call it for all connected players.
 | |
|  * SEE:      "FIXES_OnFilterScriptInit".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      OnPlayerDisconnect
 | |
|  * PROBLEM:  This function isn't called for players when a filterscript ends.
 | |
|  * SOLUTION: Call it for all connected players.
 | |
|  * SEE:      "FIXES_OnFilterScriptExit".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      GameText
 | |
|  * PROBLEM:  Several styles do not display for the time specified.
 | |
|  * SOLUTION: Recreate the styles in Text Draws and use those instead.
 | |
|  * SEE:      "FIXES_GameTextForAll", "FIXES_GameTextForPlayer".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      GameTextStyles
 | |
|  * PROBLEM:  San Andreas has fixed styles for area and vehicle names, but they
 | |
|  *           are not included in the GameText styles list.
 | |
|  * SOLUTION: Add them.  DEFAULTS TO FALSE.
 | |
|  * SEE:      "FIXES_GameTextForAll", "FIXES_GameTextForPlayer".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      HideGameText
 | |
|  * PROBLEM:  There is no "HideGameTextForXYZ" function.
 | |
|  * SOLUTION: Show a single space for a game text.  DEFAULTS TO FALSE.
 | |
|  * SEE:      "FIXES_HideGameTextForAll", "FIXES_HideGameTextForPlayer".
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      BODYPARTS
 | |
|  * PROBLEM:  The bodyparts to be used in OnPlayer(Take/Give)Damage are not
 | |
|  *           defined by default
 | |
|  * SOLUTION: Define it.
 | |
|  * SEE:      N/A.
 | |
|  * AUTHOR:   Whitetiger
 | |
|  * 
 | |
|  * FIX:      CAMERAMODES
 | |
|  * PROBLEM:  The camera modes for GetPlayerCameraMode are not defined by
 | |
|  *           default.
 | |
|  * SOLUTION: Define it.
 | |
|  * SEE:      N/A.
 | |
|  * AUTHOR:   Whitetiger
 | |
|  * POST:     http://forum.sa-mp.com/showpost.php?p=1309730
 | |
|  * 
 | |
|  * FIX:      SetPlayerCamera
 | |
|  * PROBLEM:  Using the camera functions directly after enabling spectator mode
 | |
|  *           doesn't work.
 | |
|  * SOLUTION: Defer them.
 | |
|  * SEE:      "FIXES_SetPlayerCameraPos", "FIXES_SetPlayerCameraLookAt",
 | |
|  *           "FIXES_TogglePlayerSpectating".
 | |
|  * AUTHOR:   Emmet_
 | |
|  * 
 | |
|  * FIX:      SetPlayerTime
 | |
|  * PROBLEM:  Using this function under "OnPlayerConnect" doesn't work.
 | |
|  * SOLUTION: Defer it.
 | |
|  * SEE:      "FIXES_SetPlayerTime"
 | |
|  * AUTHOR:   Emmet_
 | |
|  * 
 | |
|  * FIX:      OnPlayerRequestClass
 | |
|  * PROBLEM:  Random blunts and bottles sometimes appear in class selection.
 | |
|  * SOLUTION: Call "RemoveBuildingForPlayer".
 | |
|  * SEE:      "OnPlayerRequestClass"
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      SetPlayerColor
 | |
|  * PROBLEM:  If used under OnPlayerConnect, the affecting player will not
 | |
|  *           see the color in the TAB menu.
 | |
|  * SOLUTION: Defer it.
 | |
|  * SEE:      "FIXES_SetPlayerColor"
 | |
|  * AUTHOR:   Emmet_
 | |
|  * POST:     http://forum.sa-mp.com/showthread.php?t=452407  
 | |
|  * 
 | |
|  * FIX:      FileMaths
 | |
|  * PROBLEM:  You can write gibberish like "File:a; ++a;".
 | |
|  * SOLUTION: Remove the operators.
 | |
|  * SEE:      "File:operator"
 | |
|  * AUTHOR:   Y_Less
 | |
|  * 
 | |
|  * FIX:      GetPlayerWeaponData
 | |
|  * PROBLEM:  Old weapons with no ammo left are still returned.
 | |
|  * SOLUTION: Set "weapons" to 0.  DEFAULTS TO FALSE!
 | |
|  * SEE:      "FIXES_GetPlayerWeaponData"
 | |
|  * AUTHOR:   Y_Less
 | |
|  * POST:     http://forum.sa-mp.com/showthread.php?t=567400
 | |
|  * 
 | |
|  * ==============
 | |
|  *  STYLE RULES: 
 | |
|  * ==============
 | |
|  * 
 | |
|  * All globals should be "static stock" whenever possible (so they can only be
 | |
|  *     accessed from this one file).
 | |
|  * 
 | |
|  * Statics must start with "FIXES_gs", and all other globals with "FIXES_g".
 | |
|  * 
 | |
|  * All functions not overriding existing functions must start with "FIXES_".
 | |
|  * 
 | |
|  * Macros must be upper case, use underscores, and start "FIXES_":
 | |
|  *     "FIXES_LIKE_THIS".
 | |
|  * 
 | |
|  * Functions should be upper camel case (as the original functions are)
 | |
|  *     "FIXES_LikeThis".
 | |
|  * 
 | |
|  * Globals (after the prefix) should be upper camel case "LikeThis", and locals
 | |
|  *     lower camel case "likeThis".
 | |
|  * 
 | |
|  * ALS should be used to hook functions and callbacks.  See this topic for more
 | |
|  *    details:
 | |
|  *    
 | |
|  *        http://forum.sa-mp.com/showthread.php?t=441293
 | |
|  * 
 | |
|  * The ALS prefix for chaining is "FIXES_".
 | |
|  * 
 | |
|  * When redefining a native, add a "BAD_" external name declaration with the
 | |
|  *     "_ALS_" definition so that others may use the original native if they so
 | |
|  *     desire (with the caveat that it may break all fixes).  Note the "BAD_"
 | |
|  *     name is meant to indicate the possibility of breaking the fix, not a
 | |
|  *     comment on the original native function.
 | |
|  * 
 | |
|  * The ALS hook defines used here are a little different to the normal ones as
 | |
|  *     this file assumes that it is always first.  The pattern is:
 | |
|  *     
 | |
|  *         #if defined _ALS_NameOfFixHere
 | |
|  *             #error _ALS_NameOfFixHere defined
 | |
|  *         #endif
 | |
|  *         native BAD_NameOfFixHere(params) = NameOfFixHere;
 | |
|  *         
 | |
|  *         #if FIX_NameOfFixHere
 | |
|  *             stock FIXES_NameOfFixHere(params)
 | |
|  *             {
 | |
|  *                 return 0;
 | |
|  *             }
 | |
|  *             
 | |
|  *             #define _ALS_NameOfFixHere
 | |
|  *             #define NameOfFixHere FIXES_NameOfFixHere
 | |
|  *         #endif
 | |
|  *    
 | |
|  *    A copyable version of this pattern is at the end of the file.
 | |
|  * 
 | |
|  * Enums start with "E_" or "e_" depending on type, then follow rules for
 | |
|  *     macros.
 | |
|  * 
 | |
|  * NO libraries should be included - not even the default SA:MP ones.  Let the
 | |
|  *     user do it.
 | |
|  * 
 | |
|  * Due to the above rule, you cannot assume any third party libraries AT ALL, so
 | |
|  *     do not use them.  This can lead to some code duplication, but also means
 | |
|  *     that the version of the code used here can be tailored for optimisations.
 | |
|  * 
 | |
|  * Certain terms may be shortened when dealing with long callback names to avoid
 | |
|  *     compile truncation warnings (max symbol length is 31).  Current list:
 | |
|  *     
 | |
|  *         "Checkpoint" -> "CP"
 | |
|  *         "Update"     -> "Upd"
 | |
|  *         "TextDraw"   -> "TD"
 | |
|  *         "Object"     -> "Obj"
 | |
|  *         "Player"     -> "P"
 | |
|  * 
 | |
|  * Document all fixes at the top of the file, and highlight code.
 | |
|  * 
 | |
|  * 4 space TABS - do not edit this file in PAWNO unless you know how to correct
 | |
|  *     the indentation.
 | |
|  * 
 | |
|  * All rules have exceptions, but they must be justifiable.  For example
 | |
|  *     "IS_FILTERSCRIPT" is a global variable, but is not called
 | |
|  *     "FIXES_gIsFilterscript" to better match the "FILTERSCRIPT" macro it
 | |
|  *     replaces.  Now a macro for "_FIXES_gIsFilterscript".
 | |
|  * 
 | |
|  * Variables which need to be fully global (i.e. not "static"), but should not
 | |
|  *     actually be used by other people (e.g. appear inside a macro) should be
 | |
|  *     prefixed with "_FIXES" instead of "FIXES" to indicate their private use.
 | |
|  * 
 | |
|  * No comments beyond the end of column 80 (where the line in "PAWNO" is).
 | |
|  * 
 | |
|  * If a bug is fixed in some version of the server it can be conditionally
 | |
|  *     included here.  This is done by checking for the existance of a native
 | |
|  *     function introduced in the same server version.  For example
 | |
|  *     "TogglePlayerControllable" was fixed in 0.3eRC6, the same time as the
 | |
|  *     "SetObjectMaterial" native was introduced, thus the inclusion becomes:
 | |
|  *     
 | |
|  *         #if !defined FIX_TogglePlayerControllable
 | |
|  *             #if defined SetObjectMaterial
 | |
|  *                 #define FIX_TogglePlayerControllable (0)
 | |
|  *             #else
 | |
|  *                 #define FIX_TogglePlayerControllable (1)
 | |
|  *             #endif
 | |
|  *         #elseif _FIXES_IS_UNSET(FIX_TogglePlayerControllable)
 | |
|  *             #undef FIX_TogglePlayerControllable
 | |
|  *             #define FIX_TogglePlayerControllable     (2)
 | |
|  *         #endif
 | |
|  *     
 | |
|  *     This only includes this fix if that native doesn't exist.  A copyable
 | |
|  *     version of this pattern is at the end of the file.
 | |
|  * 
 | |
|  * To reduce general memory consumption, strings in this include are stored
 | |
|  *     globally in constant arrays and referenced.  This is EXACTLY as fast as
 | |
|  *     using the string constants directly, but means that strings are not
 | |
|  *     stored in the assembly multiple times (unless the string is only used
 | |
|  *     once, in which case it's more work for no gain).  See this post for more
 | |
|  *     details:
 | |
|  *     
 | |
|  *         http://forum.sa-mp.com/showpost.php?p=1795601
 | |
|  * 
 | |
|  * DO NOT EDIT THIS FILE IN PAWNO OR ON GITHUB.  Both mess up the spacing -
 | |
|  *     GitHub in an almost irreversible way (except for the fact that nothing is
 | |
|  *     irreversible in source control.  Pawno spacing is less tricky to solve,
 | |
|  *     and can be worked around if you know when it uses spaces and tabs - in
 | |
|  *     short, always write code first THEN indent and you won't have a problem
 | |
|  *     (in that editor at least, that is normally a bad way to write code).
 | |
|  * 
 | |
|  * Documentation explanation:
 | |
|  *     
 | |
|  *         FIX:      <Short name>
 | |
|  *         PROBLEM:  <Description of problem>
 | |
|  *         SOLUTION: <Description of solution>
 | |
|  *         SEE:      <List of relevant functions>
 | |
|  *         AUTHOR:   <Person who wrote the fix>
 | |
|  *         POST:     <Optional link to the original post where applicable>
 | |
|  *         FIXED IN: <Optional server version of official fix where applicable>
 | |
|  * 
 | |
|  */
 | |
| 
 | |
| #if defined _INC_SAMP_Community_fixes
 | |
| 	#endinput
 | |
| #endif
 | |
| #define _INC_SAMP_Community_fixes
 | |
| 
 | |
| #if !defined _inc_fixes
 | |
| 	#define _inc_fixes
 | |
| #endif
 | |
| 
 | |
| #define _FIXES_IS_UNSET(%0) ((2*%0-1+1)==-1)
 | |
| 
 | |
| // We can add server version compiler code here to only compile fixes that apply
 | |
| // to the version of the includes for which the user is compiling.
 | |
| #if !defined FIX_GetPlayerColour
 | |
| 	#if defined FIX_GetPlayerColor
 | |
| 		#if _FIXES_IS_UNSET(FIX_GetPlayerColor)
 | |
| 			#define FIX_GetPlayerColour   (2)
 | |
| 		#else
 | |
| 			#define FIX_GetPlayerColour   (FIX_GetPlayerColor)
 | |
| 		#endif
 | |
| 	#else
 | |
| 		#define FIX_GetPlayerColour       (1)
 | |
| 	#endif
 | |
| #elseif _FIXES_IS_UNSET(FIX_GetPlayerColour)
 | |
| 	#undef FIX_GetPlayerColour
 | |
| 	#define FIX_GetPlayerColour           (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_FILTERSCRIPT
 | |
| 	#define FIX_FILTERSCRIPT             (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_FILTERSCRIPT)
 | |
| 	#undef FIX_FILTERSCRIPT
 | |
| 	#define FIX_FILTERSCRIPT             (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_SpawnPlayer
 | |
| 	#define FIX_SpawnPlayer              (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_SpawnPlayer)
 | |
| 	#undef FIX_SpawnPlayer
 | |
| 	#define FIX_SpawnPlayer              (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_SetPlayerName
 | |
| 	#define FIX_SetPlayerName            (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_SetPlayerName)
 | |
| 	#undef FIX_SetPlayerName
 | |
| 	#define FIX_SetPlayerName            (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_GetPlayerSkin
 | |
| 	#define FIX_GetPlayerSkin            (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_GetPlayerSkin)
 | |
| 	#undef FIX_GetPlayerSkin
 | |
| 	#define FIX_GetPlayerSkin            (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_GetWeaponName
 | |
| 	#define FIX_GetWeaponName            (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_GetWeaponName)
 | |
| 	#undef FIX_GetWeaponName
 | |
| 	#define FIX_GetWeaponName            (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_SetPlayerWorldBounds
 | |
| 	#define FIX_SetPlayerWorldBounds     (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_SetPlayerWorldBounds)
 | |
| 	#undef FIX_SetPlayerWorldBounds
 | |
| 	#define FIX_SetPlayerWorldBounds     (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_TogglePlayerControllable
 | |
| 	#if defined SetObjectMaterial
 | |
| 		#define FIX_TogglePlayerControllable (0)
 | |
| 	#else
 | |
| 		#define FIX_TogglePlayerControllable (1)
 | |
| 	#endif
 | |
| #elseif _FIXES_IS_UNSET(FIX_TogglePlayerControllable)
 | |
| 	#undef FIX_TogglePlayerControllable
 | |
| 	#define FIX_TogglePlayerControllable (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_HydraSniper
 | |
| 	#define FIX_HydraSniper              (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_HydraSniper)
 | |
| 	#undef FIX_HydraSniper
 | |
| 	#define FIX_HydraSniper              (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_IsPlayerInCheckpoint
 | |
| 	#define FIX_IsPlayerInCheckpoint     (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_IsPlayerInCheckpoint)
 | |
| 	#undef FIX_IsPlayerInCheckpoint
 | |
| 	#define FIX_IsPlayerInCheckpoint     (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_IsPlayerInRaceCheckpoint
 | |
| 	#define FIX_IsPlayerInRaceCheckpoint (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_IsPlayerInRaceCheckpoint)
 | |
| 	#undef FIX_IsPlayerInRaceCheckpoint
 | |
| 	#define FIX_IsPlayerInRaceCheckpoint (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_GetPlayerWeapon
 | |
| 	#define FIX_GetPlayerWeapon          (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_GetPlayerWeapon)
 | |
| 	#undef FIX_GetPlayerWeapon
 | |
| 	#define FIX_GetPlayerWeapon          (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_PutPlayerInVehicle
 | |
| 	#define FIX_PutPlayerInVehicle       (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_PutPlayerInVehicle)
 | |
| 	#undef FIX_PutPlayerInVehicle
 | |
| 	#define FIX_PutPlayerInVehicle       (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_KEY_AIM
 | |
| 	#if defined KEY_AIM
 | |
| 		#define FIX_KEY_AIM              (0)
 | |
| 	#else
 | |
| 		#define FIX_KEY_AIM              (1)
 | |
| 	#endif
 | |
| #elseif _FIXES_IS_UNSET(FIX_KEY_AIM)
 | |
| 	#undef FIX_KEY_AIM
 | |
| 	#define FIX_KEY_AIM                  (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_SPECIAL_ACTION_PISSING
 | |
| 	#if defined SPECIAL_ACTION_PISSING
 | |
| 		#define FIX_SPECIAL_ACTION_PISSING (0)
 | |
| 	#else
 | |
| 		#define FIX_SPECIAL_ACTION_PISSING (1)
 | |
| 	#endif
 | |
| #elseif _FIXES_IS_UNSET(FIX_SPECIAL_ACTION_PISSING)
 | |
| 	#undef FIX_SPECIAL_ACTION_PISSING
 | |
| 	#define FIX_SPECIAL_ACTION_PISSING   (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_Natives
 | |
| 	#define FIX_Natives                  (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_Natives)
 | |
| 	#undef FIX_Natives
 | |
| 	#define FIX_Natives                  (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_IsValidVehicle
 | |
| 	#if defined IsValidVehicle
 | |
| 		#define FIX_IsValidVehicle       (0)
 | |
| 	#else
 | |
| 		#define FIX_IsValidVehicle       (FIX_Natives)
 | |
| 	#endif
 | |
| #elseif _FIXES_IS_UNSET(FIX_IsValidVehicle)
 | |
| 	#undef FIX_IsValidVehicle
 | |
| 	#define FIX_IsValidVehicle           (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_GetGravity
 | |
| 	#if defined GetGravity
 | |
| 		#define FIX_GetGravity           (0)
 | |
| 	#else
 | |
| 		#define FIX_GetGravity           (FIX_Natives)
 | |
| 	#endif
 | |
| #elseif _FIXES_IS_UNSET(FIX_GetGravity)
 | |
| 	#undef FIX_GetGravity
 | |
| 	#define FIX_GetGravity               (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_gpci
 | |
| 	#if defined gpci
 | |
| 		#define FIX_gpci                 (0)
 | |
| 	#else
 | |
| 		#define FIX_gpci                 (FIX_Natives)
 | |
| 	#endif
 | |
| #elseif _FIXES_IS_UNSET(FIX_gpci)
 | |
| 	#undef FIX_gpci
 | |
| 	#define FIX_gpci                     (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_BODYPARTS
 | |
| 	#if defined BODY_PART_TORSO
 | |
| 		#define FIX_BODYPARTS            (0)
 | |
| 	#else
 | |
| 		#define FIX_BODYPARTS            (1)
 | |
| 	#endif
 | |
| #elseif _FIXES_IS_UNSET(FIX_BODYPARTS)
 | |
| 	#undef FIX_BODYPARTS
 | |
| 	#define FIX_BODYPARTS                (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_CAMERAMODES
 | |
| 	#if defined CAM_MODE_NONE
 | |
| 		#define FIX_CAMERAMODES          (0)
 | |
| 	#else
 | |
| 		#define FIX_CAMERAMODES          (1)
 | |
| 	#endif
 | |
| #elseif _FIXES_IS_UNSET(FIX_CAMERAMODES)
 | |
| 	#undef FIX_CAMERAMODES
 | |
| 	#define FIX_CAMERAMODES              (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_DriveBy
 | |
| 	#define FIX_DriveBy                  (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_DriveBy)
 | |
| 	#undef FIX_DriveBy
 | |
| 	#define FIX_DriveBy                  (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_SetPlayerCheckpoint
 | |
| 	#define FIX_SetPlayerCheckpoint      (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_SetPlayerCheckpoint)
 | |
| 	#undef FIX_SetPlayerCheckpoint
 | |
| 	#define FIX_SetPlayerCheckpoint      (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_SetPlayerRaceCheckpoint
 | |
| 	#define FIX_SetPlayerRaceCheckpoint  (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_SetPlayerRaceCheckpoint)
 | |
| 	#undef FIX_SetPlayerRaceCheckpoint
 | |
| 	#define FIX_SetPlayerRaceCheckpoint  (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_TextDrawCreate
 | |
| 	#define FIX_TextDrawCreate           (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_TextDrawCreate)
 | |
| 	#undef FIX_TextDrawCreate
 | |
| 	#define FIX_TextDrawCreate           (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_TextDrawSetString
 | |
| 	#define FIX_TextDrawSetString        (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_TextDrawSetString)
 | |
| 	#undef FIX_TextDrawSetString
 | |
| 	#define FIX_TextDrawSetString        (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_AllowInteriorWeapons
 | |
| 	#define FIX_AllowInteriorWeapons     (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_AllowInteriorWeapons)
 | |
| 	#undef FIX_AllowInteriorWeapons
 | |
| 	#define FIX_AllowInteriorWeapons     (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_OnPlayerEnterVehicle
 | |
| 	#if defined OnPlayerClickMap
 | |
| 		#define FIX_OnPlayerEnterVehicle (0)
 | |
| 	#else
 | |
| 		#define FIX_OnPlayerEnterVehicle (1)
 | |
| 	#endif
 | |
| #elseif _FIXES_IS_UNSET(FIX_OnPlayerEnterVehicle)
 | |
| 	#undef FIX_OnPlayerEnterVehicle
 | |
| 	#define FIX_OnPlayerEnterVehicle     (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_OnPlayerEnterVehicle_2
 | |
| 	#define FIX_OnPlayerEnterVehicle_2   (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_OnPlayerEnterVehicle)
 | |
| 	#undef FIX_OnPlayerEnterVehicle_2
 | |
| 	#define FIX_OnPlayerEnterVehicle_2   (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_AllowTeleport
 | |
| 	#if defined OnPlayerClickMap
 | |
| 		#define FIX_AllowTeleport        (1)
 | |
| 	#else
 | |
| 		#define FIX_AllowTeleport        (0)
 | |
| 	#endif
 | |
| #elseif _FIXES_IS_UNSET(FIX_AllowTeleport)
 | |
| 	#undef FIX_AllowTeleport
 | |
| 	#define FIX_AllowTeleport            (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_SetPlayerSpecialAction
 | |
| 	#define FIX_SetPlayerSpecialAction   (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_SetPlayerSpecialAction)
 | |
| 	#undef FIX_SetPlayerSpecialAction
 | |
| 	#define FIX_SetPlayerSpecialAction   (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_ClearAnimations
 | |
| 	#define FIX_ClearAnimations          (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_ClearAnimations)
 | |
| 	#undef FIX_ClearAnimations
 | |
| 	#define FIX_ClearAnimations          (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_ClearAnimations_2
 | |
| 	#define FIX_ClearAnimations_2        (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_ClearAnimations_2)
 | |
| 	#undef FIX_ClearAnimations_2
 | |
| 	#define FIX_ClearAnimations_2        (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_GangZoneCreate
 | |
| 	#define FIX_GangZoneCreate           (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_GangZoneCreate)
 | |
| 	#undef FIX_GangZoneCreate
 | |
| 	#define FIX_GangZoneCreate           (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_OnDialogResponse
 | |
| 	#if defined GetVehicleModelInfo
 | |
| 		#define FIX_OnDialogResponse     (0)
 | |
| 	#else
 | |
| 		#define FIX_OnDialogResponse     (1)
 | |
| 	#endif
 | |
| #elseif _FIXES_IS_UNSET(FIX_OnDialogResponse)
 | |
| 	#undef FIX_OnDialogResponse
 | |
| 	#define FIX_OnDialogResponse         (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_GetPlayerDialog
 | |
| 	#define FIX_GetPlayerDialog          (0)
 | |
| #elseif _FIXES_IS_UNSET(FIX_GetPlayerDialog)
 | |
| 	#undef FIX_GetPlayerDialog
 | |
| 	#define FIX_GetPlayerDialog          (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_PlayerDialogResponse
 | |
| 	#define FIX_PlayerDialogResponse     (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_PlayerDialogResponse)
 | |
| 	#undef FIX_PlayerDialogResponse
 | |
| 	#define FIX_PlayerDialogResponse     (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_SetSpawnInfo
 | |
| 	#if defined GetPlayerVersion
 | |
| 		#define FIX_SetSpawnInfo         (0)
 | |
| 	#else
 | |
| 		#define FIX_SetSpawnInfo         (1)
 | |
| 	#endif
 | |
| #elseif _FIXES_IS_UNSET(FIX_SetSpawnInfo)
 | |
| 	#undef FIX_SetSpawnInfo
 | |
| 	#define FIX_SetSpawnInfo             (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_SetPlayerSkin
 | |
| 	#define FIX_SetPlayerSkin            (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_SetPlayerSkin)
 | |
| 	#undef FIX_SetPlayerSkin
 | |
| 	#define FIX_SetPlayerSkin            (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_HideMenuForPlayer
 | |
| 	#define FIX_HideMenuForPlayer        (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_HideMenuForPlayer)
 | |
| 	#undef FIX_HideMenuForPlayer
 | |
| 	#define FIX_HideMenuForPlayer        (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_valstr
 | |
| 	#define FIX_valstr                   (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_valstr)
 | |
| 	#undef FIX_valstr
 | |
| 	#define FIX_valstr                   (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_file_inc
 | |
| 	#define FIX_file_inc                 (0)
 | |
| #elseif _FIXES_IS_UNSET(FIX_file_inc)
 | |
| 	#undef FIX_file_inc
 | |
| 	#define FIX_file_inc                 (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_fclose
 | |
| 	#define FIX_fclose                   (FIX_file_inc)
 | |
| #elseif _FIXES_IS_UNSET(FIX_fclose)
 | |
| 	#undef FIX_fclose
 | |
| 	#define FIX_fclose                   (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_fwrite
 | |
| 	#define FIX_fwrite                   (FIX_file_inc)
 | |
| #elseif _FIXES_IS_UNSET(FIX_fwrite)
 | |
| 	#undef FIX_fwrite
 | |
| 	#define FIX_fwrite                   (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_fread
 | |
| 	#define FIX_fread                    (FIX_file_inc)
 | |
| #elseif _FIXES_IS_UNSET(FIX_fread)
 | |
| 	#undef FIX_fread
 | |
| 	#define FIX_fread                    (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_fputchar
 | |
| 	#define FIX_fputchar                 (FIX_file_inc)
 | |
| #elseif _FIXES_IS_UNSET(FIX_fputchar)
 | |
| 	#undef FIX_fputchar
 | |
| 	#define FIX_fputchar                 (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_fgetchar
 | |
| 	#define FIX_fgetchar                 (FIX_file_inc)
 | |
| #elseif _FIXES_IS_UNSET(FIX_fgetchar)
 | |
| 	#undef FIX_fgetchar
 | |
| 	#define FIX_fgetchar                 (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_fblockwrite
 | |
| 	#define FIX_fblockwrite              (FIX_file_inc)
 | |
| #elseif _FIXES_IS_UNSET(FIX_fblockwrite)
 | |
| 	#undef FIX_fblockwrite
 | |
| 	#define FIX_fblockwrite              (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_fblockread
 | |
| 	#define FIX_fblockread               (FIX_file_inc)
 | |
| #elseif _FIXES_IS_UNSET(FIX_fblockread)
 | |
| 	#undef FIX_fblockread
 | |
| 	#define FIX_fblockread               (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_fseek
 | |
| 	#define FIX_fseek                    (FIX_file_inc)
 | |
| #elseif _FIXES_IS_UNSET(FIX_fseek)
 | |
| 	#undef FIX_fseek
 | |
| 	#define FIX_fseek                    (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_flength
 | |
| 	#define FIX_flength                  (FIX_file_inc)
 | |
| #elseif _FIXES_IS_UNSET(FIX_flength)
 | |
| 	#undef FIX_flength
 | |
| 	#define FIX_flength                  (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_IsPlayerAttachedObjSlotUsed
 | |
| 	#define FIX_IsPlayerAttachedObjSlotUsed (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_IsPlayerAttachedObjSlotUsed)
 | |
| 	#undef FIX_IsPlayerAttachedObjSlotUsed
 | |
| 	#define FIX_IsPlayerAttachedObjSlotUsed (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_SetPlayerAttachedObject
 | |
| 	#define FIX_SetPlayerAttachedObject  (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_SetPlayerAttachedObject)
 | |
| 	#undef FIX_SetPlayerAttachedObject
 | |
| 	#define FIX_SetPlayerAttachedObject  (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_OnPlayerDeath
 | |
| 	#define FIX_OnPlayerDeath            (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_OnPlayerDeath)
 | |
| 	#undef FIX_OnPlayerDeath
 | |
| 	#define FIX_OnPlayerDeath            (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_strins
 | |
| 	#define FIX_strins                   (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_strins)
 | |
| 	#undef FIX_strins
 | |
| 	#define FIX_strins                   (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_IsPlayerConnected
 | |
| 	#define FIX_IsPlayerConnected        (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_IsPlayerConnected)
 | |
| 	#undef FIX_IsPlayerConnected
 | |
| 	#define FIX_IsPlayerConnected        (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_OnPlayerCommandText
 | |
| 	#define FIX_OnPlayerCommandText      (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_OnPlayerCommandText)
 | |
| 	#undef FIX_OnPlayerCommandText
 | |
| 	#define FIX_OnPlayerCommandText      (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_TrainExit
 | |
| 	#define FIX_TrainExit                (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_TrainExit)
 | |
| 	#undef FIX_TrainExit
 | |
| 	#define FIX_TrainExit                (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_Kick
 | |
| 	#if defined EnableVehicleFriendlyFire
 | |
| 		#define FIX_Kick                 (0)
 | |
| 	#else
 | |
| 		#define FIX_Kick                 (1)
 | |
| 	#endif
 | |
| #elseif _FIXES_IS_UNSET(FIX_Kick)
 | |
| 	#undef FIX_Kick
 | |
| 	#define FIX_Kick                     (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_OnVehicleMod
 | |
| 	#define FIX_OnVehicleMod             (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_OnVehicleMod)
 | |
| 	#undef FIX_OnVehicleMod
 | |
| 	#define FIX_OnVehicleMod             (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_random
 | |
| 	#define FIX_random                   (0)
 | |
| #elseif _FIXES_IS_UNSET(FIX_random)
 | |
| 	#undef FIX_random
 | |
| 	#define FIX_random                   (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_sleep
 | |
| 	#define FIX_sleep                    (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_sleep)
 | |
| 	#undef FIX_sleep
 | |
| 	#define FIX_sleep                    (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_Menus
 | |
| 	#define FIX_Menus                    (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_Menus)
 | |
| 	#undef FIX_Menus
 | |
| 	#define FIX_Menus                    (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_AddMenuItem
 | |
| 	#define FIX_AddMenuItem              (FIX_Menus)
 | |
| #elseif _FIXES_IS_UNSET(FIX_AddMenuItem)
 | |
| 	#undef FIX_AddMenuItem
 | |
| 	#define FIX_AddMenuItem              (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_SetMenuColumnHeader
 | |
| 	#define FIX_SetMenuColumnHeader      (FIX_Menus)
 | |
| #elseif _FIXES_IS_UNSET(FIX_SetMenuColumnHeader)
 | |
| 	#undef FIX_SetMenuColumnHeader
 | |
| 	#define FIX_SetMenuColumnHeader      (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_ShowMenuForPlayer
 | |
| 	#define FIX_ShowMenuForPlayer        (FIX_Menus)
 | |
| #elseif _FIXES_IS_UNSET(FIX_ShowMenuForPlayer)
 | |
| 	#undef FIX_ShowMenuForPlayer
 | |
| 	#define FIX_ShowMenuForPlayer        (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_HideMenuForPlayer
 | |
| 	#define FIX_HideMenuForPlayer        (FIX_Menus)
 | |
| #elseif _FIXES_IS_UNSET(FIX_HideMenuForPlayer)
 | |
| 	#undef FIX_HideMenuForPlayer
 | |
| 	#define FIX_HideMenuForPlayer        (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_GetPlayerMenu
 | |
| 	#define FIX_GetPlayerMenu            (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_GetPlayerMenu)
 | |
| 	#undef FIX_GetPlayerMenu
 | |
| 	#define FIX_GetPlayerMenu            (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_HideMenuForPlayer_2
 | |
| 	#define FIX_HideMenuForPlayer_2      (0)
 | |
| #elseif _FIXES_IS_UNSET(FIX_HideMenuForPlayer_2)
 | |
| 	#undef FIX_HideMenuForPlayer_2
 | |
| 	#define FIX_HideMenuForPlayer_2      (2)
 | |
| #elseif FIX_HideMenuForPlayer_2 && !FIX_GetPlayerMenu
 | |
| 	#error FIX_HideMenuForPlayer_2 requires FIX_GetPlayerMenu
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_DisableMenu
 | |
| 	#define FIX_DisableMenu              (FIX_Menus)
 | |
| #elseif _FIXES_IS_UNSET(FIX_DisableMenu)
 | |
| 	#undef FIX_DisableMenu
 | |
| 	#define FIX_DisableMenu              (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_DisableMenuRow
 | |
| 	#define FIX_DisableMenuRow           (FIX_Menus)
 | |
| #elseif _FIXES_IS_UNSET(FIX_DisableMenuRow)
 | |
| 	#undef FIX_DisableMenuRow
 | |
| 	#define FIX_DisableMenuRow           (2)
 | |
| #endif
 | |
| 
 | |
| #if FIX_Menus || FIX_AddMenuItem || FIX_SetMenuColumnHeader || FIX_ShowMenuForPlayer || FIX_HideMenuForPlayer || FIX_DisableMenu || FIX_DisableMenuRow
 | |
| 	#define _FIX_Menus                   (1)
 | |
| #else
 | |
| 	#define _FIX_Menus                   (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_GetPlayerInterior
 | |
| 	#define FIX_GetPlayerInterior        (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_GetPlayerInterior)
 | |
| 	#undef FIX_GetPlayerInterior
 | |
| 	#define FIX_GetPlayerInterior        (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_ApplyAnimation
 | |
| 	#define FIX_ApplyAnimation           (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_ApplyAnimation)
 | |
| 	#undef FIX_ApplyAnimation
 | |
| 	#define FIX_ApplyAnimation           (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_ApplyAnimation_2
 | |
| 	#define FIX_ApplyAnimation_2         (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_ApplyAnimation_2)
 | |
| 	#undef FIX_ApplyAnimation_2
 | |
| 	#define FIX_ApplyAnimation_2         (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_OnPlayerSpawn
 | |
| 	#define FIX_OnPlayerSpawn            (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_OnPlayerSpawn)
 | |
| 	#undef FIX_OnPlayerSpawn
 | |
| 	#define FIX_OnPlayerSpawn            (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_GameText
 | |
| 	#define FIX_GameText                 (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_GameText)
 | |
| 	#undef FIX_GameText
 | |
| 	#define FIX_GameText                 (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_HideGameText
 | |
| 	#define FIX_HideGameText             (0)
 | |
| #elseif _FIXES_IS_UNSET(FIX_HideGameText)
 | |
| 	#undef FIX_HideGameText
 | |
| 	#define FIX_HideGameText             (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_GameTextStyles
 | |
| 	#define FIX_GameTextStyles           (0)
 | |
| #elseif _FIXES_IS_UNSET(FIX_GameTextStyles)
 | |
| 	#undef FIX_GameTextStyles
 | |
| 	#define FIX_GameTextStyles           (2)
 | |
| #elseif FIX_GameTextStyles && !FIX_GameText
 | |
| 	#error FIX_GameTextStyles requires FIX_GameText
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_OnPlayerConnect
 | |
| 	#define FIX_OnPlayerConnect          (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_OnPlayerConnect)
 | |
| 	#undef FIX_OnPlayerConnect
 | |
| 	#define FIX_OnPlayerConnect          (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_OnPlayerDisconnect
 | |
| 	#define FIX_OnPlayerDisconnect       (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_OnPlayerDisconnect)
 | |
| 	#undef FIX_OnPlayerDisconnect
 | |
| 	#define FIX_OnPlayerDisconnect       (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_CreatePlayerTextDraw
 | |
| 	#define FIX_CreatePlayerTextDraw     (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_CreatePlayerTextDraw)
 | |
| 	#undef FIX_CreatePlayerTextDraw
 | |
| 	#define FIX_CreatePlayerTextDraw     (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_PlayerTextDrawSetString
 | |
| 	#define FIX_PlayerTextDrawSetString  (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_PlayerTextDrawSetString)
 | |
| 	#undef FIX_PlayerTextDrawSetString
 | |
| 	#define FIX_PlayerTextDrawSetString  (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_SetPlayerCamera
 | |
| 	#define FIX_SetPlayerCamera          (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_SetPlayerCamera)
 | |
| 	#undef FIX_SetPlayerCamera
 | |
| 	#define FIX_SetPlayerCamera          (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_SetPlayerTime
 | |
| 	#define FIX_SetPlayerTime            (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_SetPlayerTime)
 | |
| 	#undef FIX_SetPlayerTime
 | |
| 	#define FIX_SetPlayerTime            (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_OnPlayerRequestClass
 | |
| 	#define FIX_OnPlayerRequestClass     (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_OnPlayerRequestClass)
 | |
| 	#undef FIX_OnPlayerRequestClass
 | |
| 	#define FIX_OnPlayerRequestClass     (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_SetPlayerColour
 | |
| 	#if defined FIX_SetPlayerColor
 | |
| 		#if _FIXES_IS_UNSET(FIX_SetPlayerColor)
 | |
| 			#define FIX_SetPlayerColour  (2)
 | |
| 		#else
 | |
| 			#define FIX_SetPlayerColour   (FIX_SetPlayerColor)
 | |
| 		#endif
 | |
| 	#else
 | |
| 		#define FIX_SetPlayerColour      (1)
 | |
| 	#endif
 | |
| #elseif _FIXES_IS_UNSET(FIX_SetPlayerColour)
 | |
| 	#undef FIX_SetPlayerColour
 | |
| 	#define FIX_SetPlayerColour          (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_FileMaths
 | |
| 	#define FIX_FileMaths                (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_FileMaths)
 | |
| 	#undef FIX_FileMaths
 | |
| 	#define FIX_FileMaths                (2)
 | |
| #endif
 | |
| 
 | |
| #if !defined FIX_GetPlayerWeaponData
 | |
| 	#define FIX_GetPlayerWeaponData      (0)
 | |
| #elseif _FIXES_IS_UNSET(FIX_GetPlayerWeaponData)
 | |
| 	#undef FIX_GetPlayerWeaponData
 | |
| 	#define FIX_GetPlayerWeaponData      (2)
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * CHAIN_ORDER
 | |
|  * 
 | |
|  * Allows y_hooks to call things in the correct order when it exists.
 | |
|  */
 | |
| 
 | |
| #if !defined CHAIN_ORDER
 | |
| 	#define CHAIN_ORDER() 0
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * PRE_HOOK
 | |
|  * 
 | |
|  * A method of pre-hooking callbacks to still have them called before any ones
 | |
|  * re-written by y_hooks.
 | |
|  */
 | |
| 
 | |
| #define PRE_HOOK(%0) forward @CO_%0();public @CO_%0(){return CHAIN_ORDER()+1;}
 | |
| 
 | |
| PRE_HOOK(FIXES)
 | |
| #undef CHAIN_ORDER
 | |
| #define CHAIN_ORDER @CO_FIXES
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_IncludeStates
 | |
|  * 
 | |
|  * Define the "_ALS" states used by hooks.
 | |
|  */
 | |
| 
 | |
| static stock _FIXES_IncludeStates() <_ALS : _ALS_x0, _ALS : _ALS_x1, _ALS : _ALS_x2, _ALS : _ALS_x3>
 | |
| {
 | |
| }
 | |
| 
 | |
| static stock _FIXES_IncludeStates() <_ALS : _ALS_go>
 | |
| {
 | |
| }
 | |
| 
 | |
| /* 
 | |
|  * FIXES_GT_STYLE_COUNT
 | |
|  * 
 | |
|  * The number of GameText styles recreated using TextDraw functions.  This is 4
 | |
|  * by default, but can be extended to 6 if you want location and vehicle styles.
 | |
|  */
 | |
| 
 | |
| #if FIX_GameText
 | |
| 	#if FIX_GameTextStyles
 | |
| 		#define FIXES_GT_STYLE_COUNT (14)
 | |
| 	#else
 | |
| 		#define FIXES_GT_STYLE_COUNT (7)
 | |
| 	#endif
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_SilentKick
 | |
|  * 
 | |
|  * If this define is set to 1, then players will not be given a message when
 | |
|  * they are kicked for cheats, instead they will just loose connection to the
 | |
|  * server.
 | |
|  */
 | |
| 
 | |
| #if !defined FIXES_SilentKick
 | |
| 	#define FIXES_SilentKick 0
 | |
| #elseif _FIXES_IS_UNSET(FIXES_SilentKick)
 | |
| 	#undef FIXES_SilentKick
 | |
| 	#define FIXES_SilentKick 2
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_Debug
 | |
|  * 
 | |
|  * If this define is set to 1, then debug printing is turned on for any
 | |
|  * functions which may use it.  Otherwise, the compiler entirely removes the
 | |
|  * code to print anything, leaving 0 run-time overhead.
 | |
|  */
 | |
| 
 | |
| #if defined FIXES_Debug
 | |
| 	#if _FIXES_IS_UNSET(FIXES_Debug)
 | |
| 		#undef FIXES_Debug
 | |
| 	#elseif FIXES_Debug == 1
 | |
| 		#define FIXES_PRINTF(%0); print(_FIXES_gIsFilterscript ? ("* FIXES_PRINTF (FS):") : ("* FIXES_PRINTF (GM):")),printf("*** " %0);
 | |
| 	#else
 | |
| 		#undef FIXES_Debug
 | |
| 	#endif
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_UseStateHooks
 | |
|  * 
 | |
|  * A marker to indicate that this version of fixes.inc uses state-based hooks.
 | |
|  */
 | |
| #define FIXES_UseStateHooks
 | |
| 
 | |
| /* 
 | |
|  * FIXES_PRINTF
 | |
|  * 
 | |
|  * A special "printf" function only compiled when "FIXES_Debug" is set.
 | |
|  */
 | |
| 
 | |
| #if !defined FIXES_PRINTF
 | |
| 	#define FIXES_Debug 0
 | |
| 	#define FIXES_PRINTF(%0);
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * INVALID_DIALOG_ID
 | |
|  * 
 | |
|  * Set when a player can't see a dialog.
 | |
|  */
 | |
| 
 | |
| #if !defined INVALID_DIALOG_ID
 | |
| 	#define INVALID_DIALOG_ID (-1)
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_Single
 | |
|  * 
 | |
|  * If this define is set to 1, then the old style include is used, with no
 | |
|  * support for multiple scripts running at the same time on the server (i.e. no
 | |
|  * gamemodes and filter scripts at the same time).  You can only have one or the
 | |
|  * other or bugs.
 | |
|  */
 | |
| 
 | |
| #if !defined FIXES_Single
 | |
| 	#define FIXES_Single (1)
 | |
| #elseif _FIXES_IS_UNSET(FIXES_Single)
 | |
| 	#undef FIXES_Single
 | |
| 	#define FIXES_Single (2)
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_IS_IN_CHARGE
 | |
|  * 
 | |
|  * Test to see if this script is in command or not (master).
 | |
|  */
 | |
| 
 | |
| #if FIXES_Single
 | |
| 	#define _FIXES_IS_IN_CHARGE(%0)
 | |
| #else
 | |
| 	#define _FIXES_IS_IN_CHARGE(%0) if (%0(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE))
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * E_FIXES_WORLDBOUND_DATA
 | |
|  * 
 | |
|  * Store data for each player on their worldbound data.
 | |
|  */
 | |
| enum E_FIXES_WORLDBOUND_DATA
 | |
| {
 | |
| 	// "Previous".
 | |
| 	Float:E_FIXES_WORLDBOUND_DATA_PX,
 | |
| 	Float:E_FIXES_WORLDBOUND_DATA_PY,
 | |
| 	Float:E_FIXES_WORLDBOUND_DATA_PZ,
 | |
| 	// "Lower".
 | |
| 	Float:E_FIXES_WORLDBOUND_DATA_LX,
 | |
| 	Float:E_FIXES_WORLDBOUND_DATA_LY,
 | |
| 	// "Upper".
 | |
| 	Float:E_FIXES_WORLDBOUND_DATA_UX,
 | |
| 	Float:E_FIXES_WORLDBOUND_DATA_UY
 | |
| }
 | |
| 
 | |
| /* 
 | |
|  * e_FIXES_BOOLS
 | |
|  * 
 | |
|  * Collection of boolean values for players, designed to collect multiple checks
 | |
|  * in to one variable to reduce memory consumption.
 | |
|  */
 | |
| enum e_FIXES_BOOLS (<<= 1)
 | |
| {
 | |
| 	// Handy definition for nothing set.
 | |
| 	e_FIXES_BOOLS_NONE = 0,
 | |
| 	// Does this player have worldbounds enabled?
 | |
| 	e_FIXES_BOOLS_WORLDBOUNDS = 1,
 | |
| 	e_FIXES_BOOLS_UNCONTROLLABLE,
 | |
| 	e_FIXES_BOOLS_PUT_IN_VEHICLE,
 | |
| 	e_FIXES_BOOLS_BLOCK,
 | |
| 	e_FIXES_BOOLS_TELEPORT,
 | |
| 	e_FIXES_BOOLS_CONNECTED,
 | |
| 	e_FIXES_BOOLS_INTERIOR,
 | |
| 	e_FIXES_BOOLS_PUT_IN_TRAIN,
 | |
| 	e_FIXES_BOOLS_KICKED,
 | |
| 	e_FIXES_BOOLS_ON_PLAYER_CONNECT,
 | |
| 	e_FIXES_BOOLS_DRIVE_BY,
 | |
| 	e_FIXES_BOOLS_FIRST_SPAWN,
 | |
| 	e_FIXES_BOOLS_FIRST_CLASS,
 | |
| 	e_FIXES_BOOLS_SPECTATING,
 | |
| 	e_FIXES_BOOLS_CP_DELAYED,
 | |
| 	e_FIXES_BOOLS_RACE_CP_DELAYED
 | |
| }
 | |
| 
 | |
| /* 
 | |
|  * e_FIXES_SETTINGS
 | |
|  * 
 | |
|  * Collection of boolean values for the script as a whole.  Stores a variety of
 | |
|  * settings that are true/false.
 | |
|  */
 | |
| enum e_FIXES_SETTINGS (<<= 1)
 | |
| {
 | |
| 	// Handy definition for nothing set.
 | |
| 	e_FIXES_SETTINGS_NONE = 0,
 | |
| 	e_FIXES_SETTINGS_INTERIOR = 1,
 | |
| 	e_FIXES_SETTINGS_ADMIN_TELEPORT,
 | |
| 	e_FIXES_SETTINGS_IN_CHARGE,
 | |
| 	e_FIXES_SETTINGS_DROP_ALL_DATA,
 | |
| 	e_FIXES_SETTINGS_MENU_SET,
 | |
| 	e_FIXES_SETTINGS_ENDING,
 | |
| 	e_FIXES_SETTINGS_ENDED,
 | |
| 	e_FIXES_SETTINGS_NO_GAME_TEXT,
 | |
| 	e_FIXES_SETTINGS_SECOND_USE
 | |
| }
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_CEILDIV
 | |
|  * 
 | |
|  * Do a ceiling division of the first number by the second number.
 | |
|  */
 | |
| #define _FIXES_CEILDIV(%0,%1) (((%0) + (%1) - 1) / (%1))
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_INFINITY
 | |
|  * 
 | |
|  * IEEE 754 definition of infinity.
 | |
|  */
 | |
| #define _FIXES_INFINITY (Float:0x7F800000)
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_N_INFINITY
 | |
|  * 
 | |
|  * IEEE 754 definition of negative infinity.
 | |
|  */
 | |
| #define _FIXES_N_INFINITY (Float:0xFF800000)
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_ATTACHMENTS
 | |
|  * 
 | |
|  * The number of players whose attachment data (10-bits) can be stored in one
 | |
|  * cell.
 | |
|  */
 | |
| #define _FIXES_ATTACHMENTS (cellbits / MAX_PLAYER_ATTACHED_OBJECTS)
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_FOREACH
 | |
|  * 
 | |
|  * A new version of "foreach", but just for this library.
 | |
|  */
 | |
| #define _FIXES_FOREACH(%1,%0) for (new %0 = MAX_PLAYERS; (%0 = %1[%0]) != MAX_PLAYERS; )
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_IN_RANGE
 | |
|  * 
 | |
|  * Checks if the first parameter is between the other two: %1 <= %0 < %2 (but
 | |
|  * faster).
 | |
|  */
 | |
| #define _FIXES_IN_RANGE(%0,%1,%2) (((%0) - ((%1) + cellmin)) < ((%2) - ((%1) + cellmin)))
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_NO_RANGE
 | |
|  * 
 | |
|  * Checks if the first parameter is not between the other two: !(%1 <= %0 < %2)
 | |
|  * (but faster).
 | |
|  */
 | |
| #define _FIXES_NO_RANGE(%0,%1,%2) (((%0) - ((%1) + cellmin)) >= ((%2) - ((%1) + cellmin)))
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_FORWARD
 | |
|  * 
 | |
|  * Forwards a hooked callbacks, and defines the default state implementations.
 | |
|  */
 | |
| #define _FIXES_FORWARD%0(%1); \
 | |
| 	forward%0(%1); \
 | |
| 	public%0(%1) <_ALS : _ALS_x0, _ALS : _ALS_x1> { return 1; } \
 | |
| 	public%0(%1) <> { return 1; }
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_IS_PLAYER_CONNECTED
 | |
|  * 
 | |
|  * Always valid "IsPlayerConnected" check.
 | |
|  */
 | |
| #define _FIXES_IS_PLAYER_CONNECTED(%0) (_FIXES_IN_RANGE((%0), 0, MAX_PLAYERS) && IsPlayerConnected((%0)))
 | |
| 
 | |
| // These varaibles are NOT pre-processor dependent as they are stock.  It's just
 | |
| // simpler than trying to figure out when or if a semi-colon is needed.
 | |
| #if !FIX_FILTERSCRIPT
 | |
| static
 | |
| #endif
 | |
| stock
 | |
| 	/* 
 | |
| 	 * bool:_FIXES_gIsFilterscript
 | |
| 	 * 
 | |
| 	 * Runtime equivalent of "FILTERSCRIPT" for when it is not set by the user.
 | |
| 	 */
 | |
| 	bool:_FIXES_gIsFilterscript;
 | |
| 
 | |
| stock
 | |
| 	/* 
 | |
| 	 * FIXES_gscSpace[]
 | |
| 	 * 
 | |
| 	 * A single re-usable space.
 | |
| 	 */
 | |
| 	FIXES_gscSpace[] = " ";
 | |
| 
 | |
| #if FIXES_Debug
 | |
| new
 | |
| #else
 | |
| static stock
 | |
| #endif
 | |
| 	/* 
 | |
| 	 * FIXES_gsValidMenus[_FIXES_CEILDIV(MAX_MENUS, cellbits)]
 | |
| 	 * 
 | |
| 	 * A record of which menus have and haven't been shown yet.  We ensure that
 | |
| 	 * this only exists when required, since it depends on add and remove
 | |
| 	 * functions to be called at the right time.
 | |
| 	 */
 | |
| #if _FIX_Menus || FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
 | |
| 	FIXES_gsPlayersIterator[MAX_PLAYERS + 1] = {0, 1, ...},
 | |
| #endif
 | |
| 	/* 
 | |
| 	 * FIXES_gsValidMenus[_FIXES_CEILDIV(MAX_MENUS, cellbits)]
 | |
| 	 * 
 | |
| 	 * A record of which menus have and haven't been shown yet.
 | |
| 	 */
 | |
| 	FIXES_gsValidMenus[_FIXES_CEILDIV(MAX_MENUS, cellbits)],
 | |
| 	/* 
 | |
| 	 * FIXES_gsPlayerIP[MAX_PLAYERS]
 | |
| 	 * 
 | |
| 	 * A player's IP as a 32-bit integer.
 | |
| 	 */
 | |
| 	FIXES_gsPlayerIP[MAX_PLAYERS] = {-1, ...},
 | |
| 	/* 
 | |
| 	 * FIXES_gsPlayerSkin[MAX_PLAYERS]
 | |
| 	 * 
 | |
| 	 * The skin the player is currently using.
 | |
| 	 */
 | |
| 	FIXES_gsPlayerSkin[MAX_PLAYERS],
 | |
| 	/* 
 | |
| 	 * e_FIXES_BOOLEAN_DATA:FIXES_gsPlayerBools[MAX_PLAYERS]
 | |
| 	 * 
 | |
| 	 * Collection of boolean values for players.
 | |
| 	 */
 | |
| 	e_FIXES_BOOLS:FIXES_gsPlayerBools[MAX_PLAYERS],
 | |
| 	/* 
 | |
| 	 * FIXES_gsWorldbounds[MAX_PLAYERS][E_FIXES_WORLDBOUND_DATA]
 | |
| 	 * 
 | |
| 	 * All data for players on where their worldbounds are and where they last
 | |
| 	 * were before they went through the bounds by crouching.
 | |
| 	 */
 | |
| #if FIX_SetPlayerWorldBounds
 | |
| 	FIXES_gsWorldbounds[MAX_PLAYERS][E_FIXES_WORLDBOUND_DATA],
 | |
| #endif
 | |
| 	/* 
 | |
| 	 * FIXES_gsPlayerWeapon[MAX_PLAYERS]
 | |
| 	 * 
 | |
| 	 * Stores the weapon set by "SetPlayerArmedWeapon" when in a vehicle.
 | |
| 	 */
 | |
| 	FIXES_gsPlayerWeapon[MAX_PLAYERS],
 | |
| 	/* 
 | |
| 	 * FIXES_gsVehicleSeatData[MAX_PLAYERS]
 | |
| 	 * 
 | |
| 	 * What vehicle the player is due to go in.
 | |
| 	 */
 | |
| 	FIXES_gsVehicleSeatData[MAX_PLAYERS],
 | |
| 	/* 
 | |
| 	 * FIXES_gsVehicleLocked[(MAX_PLAYERS * MAX_VEHICLES + cellbits - 1) / cellbits]
 | |
| 	 * 
 | |
| 	 * Is this vehicle locked for a player.  This is a compressed 2D binary
 | |
| 	 * array, made by concatenating many bits together (saves 1kb-3kb)!  Is
 | |
| 	 * there a reason this array exists?
 | |
| 	 */
 | |
| 	//FIXES_gsVehicleLocked[_FIXES_CEILDIV(MAX_PLAYERS * MAX_VEHICLES, cellbits)],
 | |
| 	/* 
 | |
| 	 * FIXES_gsDialogID[MAX_PLAYERS]
 | |
| 	 * 
 | |
| 	 * Stores the true ID of the dialog the player is looking at to prevent
 | |
| 	 * spoofing.
 | |
| 	 */
 | |
| 	FIXES_gsDialogID[MAX_PLAYERS] = {-1, ...},
 | |
| 	/* 
 | |
| 	 * FIXES_gsInterior[MAX_PLAYERS]
 | |
| 	 * 
 | |
| 	 * The player's current interior.
 | |
| 	 */
 | |
| 	FIXES_gsInterior[MAX_PLAYERS],
 | |
| 	/* 
 | |
| 	 * e_FIXES_SETTINGS:FIXES_gsSettings
 | |
| 	 * 
 | |
| 	 * A collection of 1-bit options, compressed together to save space.
 | |
| 	 */
 | |
| 	e_FIXES_SETTINGS:FIXES_gsSettings = e_FIXES_SETTINGS_SECOND_USE,
 | |
| 	/* 
 | |
| 	 * FIXES_gsObjectSlots[_FIXES_CEILDIV(MAX_PLAYERS, _FIXES_ATTACHMENTS)]
 | |
| 	 * 
 | |
| 	 * A record of which attached object slots a player has used.
 | |
| 	 */
 | |
| 	FIXES_gsObjectSlots[_FIXES_CEILDIV(MAX_PLAYERS, _FIXES_ATTACHMENTS)],
 | |
| 	/* 
 | |
| 	 * FIXES_gsLastAnimation[MAX_PLAYERS]
 | |
| 	 * 
 | |
| 	 * The last animation a player used.
 | |
| 	 */
 | |
| 	FIXES_gsLastAnimation[MAX_PLAYERS],
 | |
| 	/* 
 | |
| 	 * FIXES_gsLastCash[MAX_PLAYERS]
 | |
| 	 * 
 | |
| 	 * A player's cash before dying.
 | |
| 	 */
 | |
| 	FIXES_gsLastCash[MAX_PLAYERS],
 | |
| 	/* 
 | |
| 	 * FIXES_gsDriveByWeapon[MAX_PLAYERS]
 | |
| 	 * 
 | |
| 	 * The weapon to set after re-enter to vehicle.
 | |
| 	 */
 | |
| 	FIXES_gsDriveByWeapon[MAX_PLAYERS],
 | |
| 	/* 
 | |
| 	 * FIXES_gsCurrentMenu[MAX_PLAYERS]
 | |
| 	 * 
 | |
| 	 * The menu the player can currently see.
 | |
| 	 */
 | |
| 	Menu:FIXES_gsCurrentMenu[MAX_PLAYERS] = {Menu:INVALID_MENU, ...},
 | |
| 	/* 
 | |
| 	 * Text:FIXES_gsGTStyle[FIXES_GT_STYLE_COUNT]
 | |
| 	 * 
 | |
| 	 * The pre-defined TextDraw styles used to recreate the bugged GameText
 | |
| 	 * styles for GameTextForAll.
 | |
| 	 */
 | |
| #if FIX_GameText
 | |
| 	Text:FIXES_gsGTStyle[FIXES_GT_STYLE_COUNT],
 | |
| #endif
 | |
| 	/* 
 | |
| 	 * FIXES_gsPlayerPGTShown[FIXES_GT_STYLE_COUNT][MAX_PLAYERS + 1]
 | |
| 	 * 
 | |
| 	 * A linked list of which players can see a certain GameText style.
 | |
| 	 */
 | |
| #if FIX_GameText
 | |
| 	FIXES_gsPlayerPGTShown[FIXES_GT_STYLE_COUNT][MAX_PLAYERS + 1],
 | |
| #endif
 | |
| 	/* 
 | |
| 	 * PlayerText:FIXES_gsPGTStyle[FIXES_GT_STYLE_COUNT][MAX_PLAYERS]
 | |
| 	 * 
 | |
| 	 * The predefined TextDraw styles used to recreate the bugged GameText
 | |
| 	 * styles for GameTextForPlayer.
 | |
| 	 */
 | |
| #if FIX_GameText
 | |
| 	PlayerText:FIXES_gsPGTStyle[MAX_PLAYERS][FIXES_GT_STYLE_COUNT],
 | |
| #endif
 | |
| 	/* 
 | |
| 	 * FIXES_gsPGTTimer[FIXES_GT_STYLE_COUNT][MAX_PLAYERS]
 | |
| 	 * 
 | |
| 	 * The timers used to hide per-player GameText messages.
 | |
| 	 */
 | |
| #if FIX_GameText
 | |
| 	FIXES_gsGTTimer[FIXES_GT_STYLE_COUNT][MAX_PLAYERS + 1],
 | |
| #endif
 | |
| 	/* 
 | |
| 	 * FIXES_gsClassAnimTimer[MAX_PLAYERS],
 | |
| 	 * 
 | |
| 	 * Used for storing the timer ID for deferring class selection animation
 | |
| 	 * application.
 | |
| 	 */
 | |
| 	FIXES_gsAnimTimer[MAX_PLAYERS],
 | |
| 	/* 
 | |
| 	 * FIXES_gsClassAnimName[MAX_PLAYERS][60],
 | |
| 	 * 
 | |
| 	 * Used for storing the animation name.
 | |
| 	 */
 | |
| #if FIX_ApplyAnimation_2
 | |
| 	FIXES_gsClassAnimName[MAX_PLAYERS][60],
 | |
| #endif
 | |
| 	/* 
 | |
| 	 * FIXES_gsPlayerAnimLibs[MAX_PLAYERS][_FIXES_CEILDIV(135, cellbits)],
 | |
| 	 * 
 | |
| 	 * Which animation libraries the player has synced.
 | |
| 	 */
 | |
| #if FIX_ApplyAnimation_2
 | |
| 	FIXES_gsPlayerAnimLibs[MAX_PLAYERS][_FIXES_CEILDIV(135, cellbits)],
 | |
| #endif
 | |
| 	/* 
 | |
| 	 * FIXES_pvarNotNewPlayer[]
 | |
| 	 * 
 | |
| 	 * This variable records wether or not this player is brand new to the
 | |
| 	 * server, and not just having "OnPlayerConnect" called due to a script
 | |
| 	 * load.  There are certain functions that need applying only the very first
 | |
| 	 * time they connect, then this gets set.
 | |
| 	 */
 | |
| 	FIXES_pvarNotNewPlayer[] = "FIXES_pvarNotNewPlayer",
 | |
| 	/* 
 | |
| 	 * FIXES_pvarPlayerWeapon[]
 | |
| 	 * 
 | |
| 	 * Name of the pvar in which to store the player's current weapon.
 | |
| 	 */
 | |
| 	FIXES_pvarPlayerWeapon[] = "FIXES_pvarPlayerWeapon",
 | |
| 	/* 
 | |
| 	 * FIXES_pvarPlayerSkin[]
 | |
| 	 * 
 | |
| 	 * Name of the pvar in which to store the player's current skin.
 | |
| 	 */
 | |
| 	FIXES_pvarPlayerSkin[] = "FIXES_pvarPlayerSkin",
 | |
| 	/* 
 | |
| 	 * FIXES_pvarPlayerSpectate[]
 | |
| 	 * 
 | |
| 	 * Name of the pvar in which to store the player's spectator mode.
 | |
| 	 */
 | |
| 	FIXES_pvarPlayerSpectate[] = "FIXES_pvarPlayerSpectate",
 | |
| 	/* 
 | |
| 	 * FIXES_gscKick[]
 | |
| 	 * 
 | |
| 	 * Name of the kick timer function.
 | |
| 	 */
 | |
| 	FIXES_gscKick[] = "_FIXES_Kick",
 | |
| 	/* 
 | |
| 	 * FIXES_pvarKick[]
 | |
| 	 * 
 | |
| 	 * Name of the pvar in which to store a player's kick timer.
 | |
| 	 */
 | |
| 	FIXES_pvarKick[] = "FIXES_pvarKick",
 | |
| 	/* 
 | |
| 	 * FIXES_pvarPlayerDialog[]
 | |
| 	 * 
 | |
| 	 * Name of the pvar in which to store the player's current dialogid.
 | |
| 	 */
 | |
| 	FIXES_pvarPlayerDialog[] = "FIXES_pvarPlayerDialog",
 | |
| 	/* 
 | |
| 	 * FIXES_pvarPlayerInterior[]
 | |
| 	 * 
 | |
| 	 * A player's current interior.
 | |
| 	 */
 | |
| 	FIXES_pvarPlayerInterior[] = "FIXES_pvarPlayerInterior",
 | |
| 	/* 
 | |
| 	 * FIXES_pvarCurrentDialog[]
 | |
| 	 * 
 | |
| 	 * Used in OnDialogResponse to be able to get the correct ID in multiple
 | |
| 	 * scripts while still correctly resetting the ID for future use.
 | |
| 	 */
 | |
| 	FIXES_pvarCurrentDialog[] = "FIXES_pvarCurrentDialog",
 | |
| 	/* 
 | |
| 	 * FIXES_pvarPlayerLastCash[]
 | |
| 	 * 
 | |
| 	 * Used in OnPlayerDeath to save a player's cash before death.
 | |
| 	 */
 | |
| 	FIXES_pvarPlayerLastCash[] = "FIXES_pvarPlayerLastCash",
 | |
| 	/* 
 | |
| 	 * FIXES_gscHideGameTextTimer[]
 | |
| 	 * 
 | |
| 	 * Name of the GameText hide timer function.
 | |
| 	 */
 | |
| 	FIXES_gscHideGameTextTimer[] = "_FIXES_HideGameTextTimer",
 | |
| 	/* 
 | |
| 	 * FIXES_gscDriveBy[]
 | |
| 	 * 
 | |
| 	 * Name of the Drive-By timer function.
 | |
| 	 */
 | |
| 	FIXES_gscDriveBy[] = "_FIXES_DriveBy",
 | |
| 	/* 
 | |
| 	 * FIXES_gscSetCamera[]
 | |
| 	 * 
 | |
| 	 * Name of the SetCamera timer function.
 | |
| 	 */
 | |
| 	FIXES_gscSetCamera[] = "_FIXES_SetCamera",
 | |
| 	/* 
 | |
| 	 * FIXES_gscSetTime[]
 | |
| 	 * 
 | |
| 	 * Name of the SetTime timer function.
 | |
| 	 */
 | |
| 	FIXES_gscSetTime[] = "_FIXES_SetTime",
 | |
| 	/* 
 | |
| 	 * FIXES_gscSetColor[]
 | |
| 	 * 
 | |
| 	 * Name of the SetColor timer function.
 | |
| 	 */
 | |
| 	FIXES_gscSetColor[] = "_FIXES_SetColor",
 | |
| 	/* 
 | |
| 	 * FIXES_gscSetCheckpoint[]
 | |
| 	 * 
 | |
| 	 * Name of the SetCheckpoint timer function.
 | |
| 	 */
 | |
| 	FIXES_gscSetCheckpoint[] = "_FIXES_SetCheckpoint",
 | |
| 	/* 
 | |
| 	 * FIXES_pvarPlayerCheckpoint[]
 | |
| 	 * 
 | |
| 	 * Name of the pvar in which to store the player's checkpoint state.
 | |
| 	 */
 | |
| 	FIXES_pvarPlayerCheckpoint[] = "FIXES_pvarPlayerCheckpoint",
 | |
| 	/* 
 | |
| 	 * FIXES_gscSetRaceCheckpoint[]
 | |
| 	 * 
 | |
| 	 * Name of the SetRaceCheckpoint timer function.
 | |
| 	 */
 | |
| 	FIXES_gscSetRaceCheckpoint[] = "_FIXES_SetRaceCheckpoint",
 | |
| 	/* 
 | |
| 	 * FIXES_pvarPlayerRaceCheckpoint[]
 | |
| 	 * 
 | |
| 	 * Name of the pvar in which to store the player's race checkpoint state.
 | |
| 	 */
 | |
| 	FIXES_pvarPlayerRaceCheckpoint[] = "FIXES_pvarPlayerRaceCheckpoint",
 | |
| 	/* 
 | |
| 	 * FIXES_gscNULL[]
 | |
| 	 * 
 | |
| 	 * NULL.  This is stored as a global string to reduce memory usage.
 | |
| 	 */
 | |
| 	FIXES_gscNULL[] = "\1";
 | |
| 
 | |
| static stock const
 | |
| 	/* 
 | |
| 	 * FIXES_gscPlayerColours[100]
 | |
| 	 * 
 | |
| 	 * There are only 100 colours used by default, with SA:MP looping through
 | |
| 	 * them repeatedly.
 | |
| 	 */
 | |
| #if FIX_GetPlayerColour
 | |
| 	FIXES_gscPlayerColours[100] =
 | |
| 		{
 | |
| 			0xFF8C13FF, 0xC715FFFF, 0x20B2AAFF, 0xDC143CFF, 0x6495EDFF,
 | |
| 			0xF0E68CFF, 0x778899FF, 0xFF1493FF, 0xF4A460FF, 0xEE82EEFF,
 | |
| 			0xFFD720FF, 0x8B4513FF, 0x4949A0FF, 0x148B8BFF, 0x14FF7FFF,
 | |
| 			0x556B2FFF, 0x0FD9FAFF, 0x10DC29FF, 0x534081FF, 0x0495CDFF,
 | |
| 			0xEF6CE8FF, 0xBD34DAFF, 0x247C1BFF, 0x0C8E5DFF, 0x635B03FF,
 | |
| 			0xCB7ED3FF, 0x65ADEBFF, 0x5C1ACCFF, 0xF2F853FF, 0x11F891FF,
 | |
| 			0x7B39AAFF, 0x53EB10FF, 0x54137DFF, 0x275222FF, 0xF09F5BFF,
 | |
| 			0x3D0A4FFF, 0x22F767FF, 0xD63034FF, 0x9A6980FF, 0xDFB935FF,
 | |
| 			0x3793FAFF, 0x90239DFF, 0xE9AB2FFF, 0xAF2FF3FF, 0x057F94FF,
 | |
| 			0xB98519FF, 0x388EEAFF, 0x028151FF, 0xA55043FF, 0x0DE018FF,
 | |
| 			0x93AB1CFF, 0x95BAF0FF, 0x369976FF, 0x18F71FFF, 0x4B8987FF,
 | |
| 			0x491B9EFF, 0x829DC7FF, 0xBCE635FF, 0xCEA6DFFF, 0x20D4ADFF,
 | |
| 			0x2D74FDFF, 0x3C1C0DFF, 0x12D6D4FF, 0x48C000FF, 0x2A51E2FF,
 | |
| 			0xE3AC12FF, 0xFC42A8FF, 0x2FC827FF, 0x1A30BFFF, 0xB740C2FF,
 | |
| 			0x42ACF5FF, 0x2FD9DEFF, 0xFAFB71FF, 0x05D1CDFF, 0xC471BDFF,
 | |
| 			0x94436EFF, 0xC1F7ECFF, 0xCE79EEFF, 0xBD1EF2FF, 0x93B7E4FF,
 | |
| 			0x3214AAFF, 0x184D3BFF, 0xAE4B99FF, 0x7E49D7FF, 0x4C436EFF,
 | |
| 			0xFA24CCFF, 0xCE76BEFF, 0xA04E0AFF, 0x9F945CFF, 0xDCDE3DFF,
 | |
| 			0x10C9C5FF, 0x70524DFF, 0x0BE472FF, 0x8A2CD7FF, 0x6152C2FF,
 | |
| 			0xCF72A9FF, 0xE59338FF, 0xEEDC2DFF, 0xD8C762FF, 0xD8C762FF
 | |
| 		},
 | |
| #endif
 | |
| 	/* 
 | |
| 	 * FIXES_gscMaxPassengers[]
 | |
| 	 * 
 | |
| 	 * This is a compressed (4-bit) list of the maximum number of passengers in
 | |
| 	 * any vehicle, confirmed by a number of sources. "F" (15) means invalid
 | |
| 	 * vehicle.
 | |
| 	 */
 | |
| #if FIX_OnPlayerEnterVehicle
 | |
| 	FIXES_gscMaxPassengers[] =
 | |
| 		{
 | |
| 			0x10331113, 0x11311131, 0x11331313, 0x80133301, 0x1381F110, 0x10311103, 0x10001F10, 0x11113311, 0x13113311,
 | |
| 			0x31101100, 0x30001301, 0x11031311, 0x11111331, 0x10013111, 0x01131100, 0x11111110, 0x11100031, 0x11130221,
 | |
| 			0x33113311, 0x11111101, 0x33101133, 0x101001F0, 0x03133111, 0xFF11113F, 0x13330111, 0xFF131111, 0x0000FF3F
 | |
| 		},
 | |
| #endif
 | |
| 	/* 
 | |
| 	 * FIXES_gscVehicleMods[]
 | |
| 	 * 
 | |
| 	 * This is a bit array of all the valid mods (-1000) for all vehicles (-400)
 | |
| 	 * EXCEPT for vehicle 576 (Tornado), which has just TWO extra mods on it,
 | |
| 	 * that should spill over in to an extra cell of data (requiring an extra
 | |
| 	 * 848 bytes of data total to make the array work).  Instead this (hopefully
 | |
| 	 * rare) case is handled explicitly in "OnVehicleMod".  It seems that most
 | |
| 	 * vehicles are:
 | |
| 	 * 
 | |
| 	 *   0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 	 * 
 | |
| 	 * I don't know yet if this can be used to our advantage to improve the code
 | |
| 	 * somehow - it seems like that would require more explicit model handling.
 | |
| 	 */
 | |
| #if FIX_OnVehicleMod
 | |
| 	FIXES_gscVehicleMods[] =
 | |
| 		{
 | |
| 			0x033C2700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x021A27FA, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x023B2785, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02BC4703, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x03BA278A, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x028E078A, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02310744, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x0228073A, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02BD4701, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x023A2780, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x0228077A, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x027A27CA, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x0282278A, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x023E07C0, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x03703730, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x031D2775, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02BE4788, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
 | |
| 			0x02010771, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x029A0FCE, 0x00000000, 0x00FFFE00, 0x00000007, 0x0000C000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x03382700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x023F8795, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x029F078C, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
 | |
| 			0x029627EA, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x0236C782, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x029E1FCA, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0xFC000437, 0x00000000, 0x021C0000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x03FE6007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00001B87, 0x00000001, 0x01E00000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x039E07D2, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x023CC700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00030000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x038E07D6, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
 | |
| 			0x023D0709, 0x00000000, 0x00FFFE00, 0x00000007, 0x0000C000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x029E1F8A, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
 | |
| 			0x029C077A, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
 | |
| 			0x02BD076C, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0xFFFFFE00, 0x00000007, 0x00000000, 0x000001F8,
 | |
| 			0x02000700, 0x00000000, 0x00FFFFFE, 0x00000007, 0xC0000000, 0x00002007,
 | |
| 			0xFE000700, 0x00000003, 0x00FFFE00, 0x00000007, 0x00003C00, 0x00000600,
 | |
| 			0xCE000700, 0xFF800000, 0x00FFFE01, 0x00000007, 0x3C000000, 0x00000000,
 | |
| 			0x02000700, 0x000003FC, 0x00FFFE00, 0x00000007, 0x003C0000, 0x00001800,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x007FE000, 0x00FFFE00, 0x00000007, 0x03C00000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000047, 0x0000003E, 0x3C000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00001C00, 0x00FFFE00, 0x0000000F, 0x00000000, 0x0003C000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x000003C0, 0xC0000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x029607C2, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x03FFE7CD, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x031727F1, 0x00000000, 0x00FFFE00, 0x00000007, 0x00030000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x025627F0, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x039E07C2, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000,
 | |
| 			0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000
 | |
| 		},
 | |
| #endif
 | |
| 	/* 
 | |
| 	 * FIXES_gscAnimIndexes[]
 | |
| 	 * 
 | |
| 	 * Which index each letter starts at.  Sometimes crashes the compiler...
 | |
| 	 */
 | |
| #if FIX_ApplyAnimation || FIX_ApplyAnimation_2
 | |
| 	FIXES_gscAnimIndexes[24] =
 | |
| 		{
 | |
| 			0, 2, 21, 35, 42, 42, 53, 62, 64, 67, 68, 71, 75, 81, 82, 84, 94, 96, 104, 122, 127, 128, 131, 135
 | |
| 		},
 | |
| #endif
 | |
| 	/* 
 | |
| 	 * FIXES_gscAnimLib[]
 | |
| 	 * 
 | |
| 	 * List of valid animation libraries.
 | |
| 	 */
 | |
| #if FIX_ApplyAnimation || FIX_ApplyAnimation_2
 | |
| 	FIXES_gscAnimLib[135][] =
 | |
| 		{
 | |
| 			"AIRPORT",      "ATTRACTORS",   "BAR",          "BASEBALL",     "BD_FIRE",
 | |
| 			"BEACH",        "BENCHPRESS",   "BF_INJECTION", "BIKE_DBZ",     "BIKED",
 | |
| 			"BIKEH",        "BIKELEAP",     "BIKES",        "BIKEV",        "BLOWJOBZ",
 | |
| 			"BMX",          "BOMBER",       "BOX",          "BSKTBALL",     "BUDDY",
 | |
| 			"BUS",          "CAMERA",       "CAR",          "CAR_CHAT",     "CARRY",
 | |
| 			"CASINO",       "CHAINSAW",     "CHOPPA",       "CLOTHES",      "COACH",
 | |
| 			"COLT45",       "COP_AMBIENT",  "COP_DVBYZ",    "CRACK",        "CRIB",
 | |
| 			"DAM_JUMP",     "DANCING",      "DEALER",       "DILDO",        "DODGE",
 | |
| 			"DOZER",        "DRIVEBYS",     "FAT",          "FIGHT_B",      "FIGHT_C",
 | |
| 			"FIGHT_D",      "FIGHT_E",      "FINALE",       "FINALE2",      "FLAME",
 | |
| 			"FLOWERS",      "FOOD",         "FREEWEIGHTS",  "GANGS",        "GFUNK",
 | |
| 			"GHANDS",       "GHETTO_DB",    "GOGGLES",      "GRAFFITI",     "GRAVEYARD",
 | |
| 			"GRENADE",      "GYMNASIUM",    "HAIRCUTS",     "HEIST9",       "INT_HOUSE",
 | |
| 			"INT_OFFICE",   "INT_SHOP",     "JST_BUISNESS", "KART",         "KISSING",
 | |
| 			"KNIFE",        "LAPDAN1",      "LAPDAN2",      "LAPDAN3",      "LOWRIDER",
 | |
| 			"MD_CHASE",     "MD_END",       "MEDIC",        "MISC",         "MTB",
 | |
| 			"MUSCULAR",     "NEVADA",       "ON_LOOKERS",   "OTB",          "PARACHUTE",
 | |
| 			"PARK",         "PAULNMAC",     "PED",          "PLAYER_DVBYS", "PLAYIDLES",
 | |
| 			"POLICE",       "POOL",         "POOR",         "PYTHON",       "QUAD",
 | |
| 			"QUAD_DBZ",     "RAPPING",      "RIFLE",        "RIOT",         "ROB_BANK",
 | |
| 			"ROCKET",       "RUNNINGMAN",   "RUSTLER",      "RYDER",        "SAMP",
 | |
| 			"SCRATCHING",   "SEX",          "SHAMAL",       "SHOP",         "SHOTGUN",
 | |
| 			"SILENCED",     "SKATE",        "SMOKING",      "SNIPER",       "SNM",
 | |
| 			"SPRAYCAN",     "STRIP",        "SUNBATHE",     "SWAT",         "SWEET",
 | |
| 			"SWIM",         "SWORD",        "TANK",         "TATTOOS",      "TEC",
 | |
| 			"TRAIN",        "TRUCK",        "UZI",          "VAN",          "VENDING",
 | |
| 			"VORTEX",       "WAYFARER",     "WEAPONS",      "WOP",          "WUZI"
 | |
| 		},
 | |
| #endif
 | |
| 	/* 
 | |
| 	 * FIXES_gscDot[]
 | |
| 	 * 
 | |
| 	 * ".".
 | |
| 	 */
 | |
| 	FIXES_gscDot[] = ".",
 | |
| 	/* 
 | |
| 	 * FIXES_gscSpec@[]
 | |
| 	 * 
 | |
| 	 * Specifier "".
 | |
| 	 */
 | |
| 	FIXES_gscSpec@[] = "",
 | |
| 	/* 
 | |
| 	 * FIXES_gscSpec@i[]
 | |
| 	 * 
 | |
| 	 * Specifier "i".
 | |
| 	 */
 | |
| 	FIXES_gscSpec@i[] = "i",
 | |
| 	/* 
 | |
| 	 * FIXES_gscSpec@ii[]
 | |
| 	 * 
 | |
| 	 * Specifier "ii".
 | |
| 	 */
 | |
| 	FIXES_gscSpec@ii[] = "ii",
 | |
| 	/* 
 | |
| 	 * FIXES_gscSpec@ai[]
 | |
| 	 * 
 | |
| 	 * Specifier "ai".
 | |
| 	 */
 | |
| 	FIXES_gscSpec@ai[] = "ai",
 | |
| 	/* 
 | |
| 	 * FIXES_gscSpec@is[]
 | |
| 	 * 
 | |
| 	 * Specifier "is".
 | |
| 	 */
 | |
| 	FIXES_gscSpec@is[] = "is",
 | |
| 	/* 
 | |
| 	 * FIXES_gscSpec@iii[]
 | |
| 	 * 
 | |
| 	 * Specifier "iii".
 | |
| 	 */
 | |
| 	FIXES_gscSpec@iii[] = "iii",
 | |
| 	/* 
 | |
| 	 * FIXES_gscSpec@isii[]
 | |
| 	 * 
 | |
| 	 * Specifier "isii".
 | |
| 	 */
 | |
| 	FIXES_gscSpec@isii[] = "isii",
 | |
| 	/* 
 | |
| 	 * FIXES_gscSpec@ifff[]
 | |
| 	 * 
 | |
| 	 * Specifier "ifff".
 | |
| 	 */
 | |
| 	FIXES_gscSpec@ifff[] = "ifff",
 | |
| 	/* 
 | |
| 	 * FIXES_gscSpec@iifff[]
 | |
| 	 * 
 | |
| 	 * Specifier "iifff".
 | |
| 	 */
 | |
| 	FIXES_gscSpec@iifff[] = "iifff",
 | |
| 	/* 
 | |
| 	 * FIXES_gscSpec@iifffffff[]
 | |
| 	 * 
 | |
| 	 * Specifier "iifffffff".
 | |
| 	 */
 | |
| 	FIXES_gscSpec@iifffffff[] = "iifffffff",
 | |
| 	/* 
 | |
| 	 * FIXES_gscSpec@iffff[]
 | |
| 	 * 
 | |
| 	 * Specifier "iffff".
 | |
| 	 */
 | |
| 	FIXES_gscSpec@iffff[] = "iffff",
 | |
| 	/* 
 | |
| 	 * FIXES_gscSpec@iiiis[]
 | |
| 	 * 
 | |
| 	 * Specifier "iiiis".
 | |
| 	 */
 | |
| 	FIXES_gscSpec@iiiis[] = "iiiis",
 | |
| 	/* 
 | |
| 	 * FIXES_gscSpec@iiiii[]
 | |
| 	 * 
 | |
| 	 * Specifier "iiiii".
 | |
| 	 */
 | |
| 	FIXES_gscSpec@iiiii[] = "iiiii",
 | |
| 	/* 
 | |
| 	 * FIXES_gscSpec@iiiiii[]
 | |
| 	 * 
 | |
| 	 * Specifier "iiiiii".
 | |
| 	 */
 | |
| 	FIXES_gscSpec@iiiiii[] = "iiiiii",
 | |
| 	/* 
 | |
| 	 * FIXES_gscTempName[]
 | |
| 	 * 
 | |
| 	 * The temporary name to give when renaming people.
 | |
| 	 */
 | |
| 	FIXES_gscTempName[] = "FIXES_TEMP_NAME",
 | |
| 	/* 
 | |
| 	 * FIXES_gscOrderProperty[]
 | |
| 	 * 
 | |
| 	 * The property to check for script ordering.
 | |
| 	 */
 | |
| 	FIXES_gscOrderProperty[] = "FIXES_gscOrderProperty",
 | |
| 	/* 
 | |
| 	 * FIXES_gscNoGMProperty[]
 | |
| 	 * 
 | |
| 	 * Call "_FIXES_DetermineOrder" in the GM or not?
 | |
| 	 */
 | |
| 	FIXES_gscNoGMProperty[] = "FIXES_gscNoGMProperty",
 | |
| 	/* 
 | |
| 	 * FIXES_gscDetermineOrder[]
 | |
| 	 * 
 | |
| 	 * Name of the ordering callback.
 | |
| 	 */
 | |
| 	FIXES_gscDetermineOrder[] = "_FIXES_DetermineOrder",
 | |
| 	/* 
 | |
| 	 * FIXES_gscSetPlayerMenu[]
 | |
| 	 * 
 | |
| 	 * Name of the remote set player menu function.
 | |
| 	 */
 | |
| 	FIXES_gscSetPlayerMenu[] = "_FIXES_SetPlayerMenu",
 | |
| 	/* 
 | |
| 	 * FIXES_gscClearPlayerMenu[]
 | |
| 	 * 
 | |
| 	 * Name of the remote function to clear a player's menu set.
 | |
| 	 */
 | |
| 	FIXES_gscClearPlayerMenu[] = "_FIXES_ClearPlayerMenu",
 | |
| 	/* 
 | |
| 	 * FIXES_gscAllowTeleport[]
 | |
| 	 * 
 | |
| 	 * Name of the remote allow teleport function.
 | |
| 	 */
 | |
| 	FIXES_gscAllowTeleport[] = "_FIXES_AllowTeleport",
 | |
| 	/* 
 | |
| 	 * FIXES_gscPutPlayerInVehicle[]
 | |
| 	 * 
 | |
| 	 * Name of the remote vehicle entry function.
 | |
| 	 */
 | |
| 	FIXES_gscPutPlayerInVehicle[] = "_FIXES_PutPlayerInVehicle",
 | |
| 	/* 
 | |
| 	 * FIXES_gscAllowInteriorWeapons[]
 | |
| 	 * 
 | |
| 	 * Name of the remote interior weapons function.
 | |
| 	 */
 | |
| 	FIXES_gscAllowInteriorWeapons[] = "_FIXES_AllowInteriorWeapons",
 | |
| 	/* 
 | |
| 	 * FIXES_gscSetPlayerAttachedObj[]
 | |
| 	 * 
 | |
| 	 * Name of the remote attache object function.
 | |
| 	 */
 | |
| 	FIXES_gscSetPlayerAttachedObj[] = "_FIXES_SetPlayerAttachedObject",
 | |
| 	/* 
 | |
| 	 * FIXES_gscTogglePlayerControl[]
 | |
| 	 * 
 | |
| 	 * Name of the remote player toggle function.
 | |
| 	 */
 | |
| 	FIXES_gscTogglePlayerControl[] = "_FIXES_TogglePlayerControllable",
 | |
| 	/* 
 | |
| 	 * FIXES_gscSetPlayerWorldBounds[]
 | |
| 	 * 
 | |
| 	 * Name of the remote world bounds function.
 | |
| 	 */
 | |
| 	FIXES_gscSetPlayerWorldBounds[] = "_FIXES_SetPlayerWorldBounds",
 | |
| 	/* 
 | |
| 	 * FIXES_gscGameTextShow[]
 | |
| 	 * 
 | |
| 	 * Name of the remote GameText show function.
 | |
| 	 */
 | |
| 	FIXES_gscGameTextShow[] = "_FIXES_GameTextShow",
 | |
| 	/* 
 | |
| 	 * FIXES_gscReturnProperty[]
 | |
| 	 * 
 | |
| 	 * The property for accurate returns.
 | |
| 	 */
 | |
| 	FIXES_gscReturnProperty[] = "FIXES_gscReturnProperty",
 | |
| 	/* 
 | |
| 	 * FIXES_gscSingleProperty[]
 | |
| 	 * 
 | |
| 	 * The property for checking this is the only running script with fixes in.
 | |
| 	 */
 | |
| 	FIXES_gscSingleProperty[] = "FIXES_gscSingleProperty",
 | |
| 	/* 
 | |
| 	 * FIXES_gscMenuProperty[]
 | |
| 	 * 
 | |
| 	 * The property for a player's current menu.
 | |
| 	 */
 | |
| 	FIXES_gscMenuProperty[] = "FIXES_gscMenuProperty",
 | |
| 	/* 
 | |
| 	 * FIXES_gscFixesError[]
 | |
| 	 * 
 | |
| 	 * Error shown when multiple scripts are detected.
 | |
| 	 */
 | |
| 	FIXES_gscFixesError[] = "\7\7\7\7\7"                                                     "\n"   \
 | |
| 		"*** fixes.inc error: Running multiple scripts compiled with \"fixes.inc\"..."       "\n"   \
 | |
| 		"***     Please compile your modes with \"#define FIXES_Single 0\" at the top, as"   "\n"   \
 | |
| 		"***     this setting is no longer the default (to improve the more common case)."          ;
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_KEY_AIM
 | |
|  * KEY_AIM
 | |
|  * 
 | |
|  * Because the default SA:MP includes missed this one.
 | |
|  */
 | |
| 
 | |
| #define _FIXES_KEY_AIM                   (128)
 | |
| #if FIX_KEY_AIM
 | |
| 	#define KEY_AIM                      _FIXES_KEY_AIM
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_SPECIAL_ACTION_PISSING
 | |
|  * SPECIAL_ACTION_PISSING
 | |
|  * 
 | |
|  * Because the default SA:MP includes missed this one.
 | |
|  */
 | |
| 
 | |
| #define _FIXES_SPECIAL_ACTION_PISSING    (68)
 | |
| #if FIX_SPECIAL_ACTION_PISSING
 | |
| 	#define SPECIAL_ACTION_PISSING       _FIXES_SPECIAL_ACTION_PISSING
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * IsValidVehicle
 | |
|  * 
 | |
|  * Because the default SA:MP includes missed this one.
 | |
|  */
 | |
| 
 | |
| #if FIX_IsValidVehicle
 | |
| 	native IsValidVehicle(vehicleid);
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * GetGravity
 | |
|  * 
 | |
|  * Because the default SA:MP includes missed this one.
 | |
|  */
 | |
| 
 | |
| #if FIX_GetGravity
 | |
| 	native Float:GetGravity();
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * gpci
 | |
|  * 
 | |
|  * Because the default SA:MP includes missed this one.
 | |
|  */
 | |
| 
 | |
| #if FIX_gpci
 | |
| 	native gpci(playerid, serial[], maxlen);
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * BODYPARTS
 | |
|  * 
 | |
|  * Because the default SA:MP includes missed these.
 | |
|  */
 | |
| 
 | |
| #if FIX_BODYPARTS
 | |
| 	#define BODY_PART_TORSO                     (3)
 | |
| 	#define BODY_PART_GROIN                     (4)
 | |
| 	#define BODY_PART_LEFT_ARM                  (5)
 | |
| 	#define BODY_PART_RIGHT_ARM                 (6)
 | |
| 	#define BODY_PART_LEFT_LEG                  (7)
 | |
| 	#define BODY_PART_RIGHT_LEG                 (8)
 | |
| 	#define BODY_PART_HEAD                      (9)
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * CAMERAMODES
 | |
|  * 
 | |
|  * Because the default SA:MP includes missed these.
 | |
|  */
 | |
| 
 | |
| #if FIX_CAMERAMODES
 | |
| 	#define CAM_MODE_DISCONNECTED               (-1)
 | |
| 	#define CAM_MODE_NONE                       (0)
 | |
| 	#define CAM_MODE_BEHINDCAR                  (3)
 | |
| 	#define CAM_MODE_FOLLOWPED                  (4)
 | |
| 	#define CAM_MODE_SNIPER                     (7)
 | |
| 	#define CAM_MODE_ROCKETLAUNCHER             (8)
 | |
| 	#define CAM_MODE_FIXED                      (15)
 | |
| 	#define CAM_MODE_1STPERSON                  (16)
 | |
| 	#define CAM_MODE_CAM_ON_A_STRING            (18)
 | |
| 	#define CAM_MODE_BEHINDBOAT                 (22)
 | |
| 	#define CAM_MODE_CAMERA                     (46)
 | |
| 	#define CAM_MODE_ROCKETLAUNCHER_HS          (51)
 | |
| 	#define CAM_MODE_AIMWEAPON                  (53)
 | |
| 	#define CAM_MODE_AIMWEAPON_FROMCAR          (55)
 | |
| 	#define CAM_MODE_DW_HELI_CHASE              (56)
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * IS_FILTERSCRIPT
 | |
|  * 
 | |
|  * "FILTERSCRIPT" can't always be relied on to be set.  This is not a pre-
 | |
|  * processor macro, but may be better than nothing (also used internally).
 | |
|  */
 | |
| 
 | |
| #if FIX_FILTERSCRIPT
 | |
| 	#define IS_FILTERSCRIPT _FIXES_gIsFilterscript
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * File operators
 | |
|  * 
 | |
|  * Forwards for operators that shouldn't exist, so they won't exist.
 | |
|  */
 | |
| 
 | |
| #if FIX_FileMaths
 | |
| 	forward File:operator++(File:a);
 | |
| 	forward File:operator--(File:a);
 | |
| 	forward File:operator-(File:a);
 | |
| 	forward File:operator+(File:a, File:b);
 | |
| 	forward File:operator+(File:a, _:b);
 | |
| 	forward File:operator-(File:a, File:b);
 | |
| 	forward File:operator-(_:a, File:b);
 | |
| 	forward File:operator-(File:a, _:b);
 | |
| 	forward File:operator*(File:a, File:b);
 | |
| 	forward File:operator*(File:a, _:b);
 | |
| 	forward File:operator/(File:a, File:b);
 | |
| 	forward File:operator/(_:a, File:b);
 | |
| 	forward File:operator/(File:a, _:b);
 | |
| 	forward File:operator%(File:a, File:b);
 | |
| 	forward File:operator%(_:a, File:b);
 | |
| 	forward File:operator%(File:a, _:b);
 | |
| 	forward bool:operator<(File:a, File:b);
 | |
| 	forward bool:operator<(_:a, File:b);
 | |
| 	forward bool:operator<(File:a, _:b);
 | |
| 	forward bool:operator<=(File:a, File:b);
 | |
| 	forward bool:operator<=(_:a, File:b);
 | |
| 	forward bool:operator<=(File:a, _:b);
 | |
| 	forward bool:operator>(File:a, File:b);
 | |
| 	forward bool:operator>(_:a, File:b);
 | |
| 	forward bool:operator>(File:a, _:b);
 | |
| 	forward bool:operator>=(File:a, File:b);
 | |
| 	forward bool:operator>=(_:a, File:b);
 | |
| 	forward bool:operator>=(File:a, _:b);
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_DetermineOrder()
 | |
|  * 
 | |
|  * Figure out which script is called first by callbacks.
 | |
|  */
 | |
| 
 | |
| #if !FIXES_Single
 | |
| 	forward _FIXES_DetermineOrder();
 | |
| 	
 | |
| 	static FIXES_DetermineOrder()
 | |
| 	{
 | |
| 		deleteproperty(5, FIXES_gscOrderProperty),
 | |
| 		// Called in the Game Mode first (thus needs correcting).
 | |
| 		setproperty(5, FIXES_gscNoGMProperty, 1),
 | |
| 		CallRemoteFunction(FIXES_gscDetermineOrder, FIXES_gscSpec@),
 | |
| 		deleteproperty(5, FIXES_gscNoGMProperty),
 | |
| 		CallRemoteFunction(FIXES_gscDetermineOrder, FIXES_gscSpec@);
 | |
| 	}
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_IsPlayerConnected(playerid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     IsPlayerConnected
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_IsPlayerConnected
 | |
| 	#error _ALS_IsPlayerConnected defined
 | |
| #endif
 | |
| native BAD_IsPlayerConnected(playerid) = IsPlayerConnected;
 | |
| 
 | |
| #if FIX_IsPlayerConnected
 | |
| 	stock FIXES_IsPlayerConnected(playerid)
 | |
| 	{
 | |
| 		return _FIXES_IS_PLAYER_CONNECTED(playerid);
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_IsPlayerConnected
 | |
| 	#define IsPlayerConnected FIXES_IsPlayerConnected
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_CreateGameTextDraws(playerid, test)
 | |
|  * 
 | |
|  * Create the text draws used to replicate game texts.
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     GameText
 | |
|  */
 | |
| 
 | |
| #if FIX_GameText
 | |
| 	static _FIXES_CreateGameTextDraws(const playerid)
 | |
| 	{
 | |
| 		if (playerid == INVALID_PLAYER_ID)
 | |
| 		{
 | |
| 				new
 | |
| 					Text:t;
 | |
| 				
 | |
| 			#if FIX_GameTextStyles
 | |
| 				
 | |
| 				// Global style 7 (vehicle name).
 | |
| 				t = FIXES_gsGTStyle[7] = TextDrawCreate(608.000000, 344.000000, FIXES_gscSpace),
 | |
| 				TextDrawLetterSize(t, 1.000000, 3.000000),
 | |
| 				TextDrawAlignment(t, 3),
 | |
| 				TextDrawColor(t, 0x36682CFF),
 | |
| 				TextDrawSetShadow(t, 0),
 | |
| 				TextDrawSetOutline(t, 2),
 | |
| 				TextDrawBackgroundColor(t, 0x000000AA),
 | |
| 				TextDrawFont(t, 2),
 | |
| 				TextDrawSetProportional(t, 1),
 | |
| 				TextDrawUseBox(t, true),
 | |
| 				TextDrawBoxColor(t, 0x00000000),
 | |
| 				TextDrawTextSize(t, 10.0, 200.0);
 | |
| 				
 | |
| 				// Global style 8 (location name).
 | |
| 				t = FIXES_gsGTStyle[8] = TextDrawCreate(608.000000, 386.500000, FIXES_gscSpace),
 | |
| 				TextDrawLetterSize(t, 1.200000, 3.799998),
 | |
| 				TextDrawAlignment(t, 3),
 | |
| 				TextDrawColor(t, 0xACCBF1FF),
 | |
| 				TextDrawSetShadow(t, 0),
 | |
| 				TextDrawSetOutline(t, 2),
 | |
| 				TextDrawBackgroundColor(t, 0x000000AA),
 | |
| 				TextDrawFont(t, 0),
 | |
| 				TextDrawSetProportional(t, 1),
 | |
| 				TextDrawUseBox(t, true),
 | |
| 				TextDrawBoxColor(t, 0x00000000),
 | |
| 				TextDrawTextSize(t, 10.0, 200.0);
 | |
| 				
 | |
| 				// Global style 9 (radio name).
 | |
| 				t = FIXES_gsGTStyle[9] = TextDrawCreate(320.000000, 22.000000, FIXES_gscSpace),
 | |
| 				TextDrawLetterSize(t, 0.600000, 1.899999),
 | |
| 				TextDrawAlignment(t, 2),
 | |
| 				TextDrawColor(t, 0x906210FF),
 | |
| 				TextDrawSetShadow(t, 0),
 | |
| 				TextDrawSetOutline(t, 1),
 | |
| 				TextDrawBackgroundColor(t, 0x000000AA),
 | |
| 				TextDrawFont(t, 2),
 | |
| 				TextDrawSetProportional(t, 1),
 | |
| 				TextDrawUseBox(t, true),
 | |
| 				TextDrawBoxColor(t, 0x00000000),
 | |
| 				TextDrawTextSize(t, 200.0, 620.0);
 | |
| 				
 | |
| 				// Global style 10 (radio switch).
 | |
| 				t = FIXES_gsGTStyle[10] = TextDrawCreate(320.000000, 22.000000, FIXES_gscSpace),
 | |
| 				TextDrawLetterSize(t, 0.600000, 1.899999),
 | |
| 				TextDrawAlignment(t, 2),
 | |
| 				TextDrawColor(t, 0x969696FF),
 | |
| 				TextDrawSetShadow(t, 0),
 | |
| 				TextDrawSetOutline(t, 1),
 | |
| 				TextDrawBackgroundColor(t, 0x000000AA),
 | |
| 				TextDrawFont(t, 2),
 | |
| 				TextDrawSetProportional(t, 1),
 | |
| 				TextDrawUseBox(t, true),
 | |
| 				TextDrawBoxColor(t, 0x00000000),
 | |
| 				TextDrawTextSize(t, 200.0, 620.0);
 | |
| 				
 | |
| 				// Global style 11 (positive money).
 | |
| 				t = FIXES_gsGTStyle[11] = TextDrawCreate(607.000000, 78.000000, FIXES_gscSpace),
 | |
| 				TextDrawLetterSize(t, 0.550000, 2.150000),
 | |
| 				TextDrawAlignment(t, 3),
 | |
| 				TextDrawColor(t, 0x36682CFF),
 | |
| 				TextDrawSetShadow(t, 0),
 | |
| 				TextDrawSetOutline(t, 2),
 | |
| 				TextDrawBackgroundColor(t, 0x000000FF),
 | |
| 				TextDrawFont(t, 3),
 | |
| 				TextDrawSetProportional(t, 1),
 | |
| 				TextDrawUseBox(t, true),
 | |
| 				TextDrawBoxColor(t, 0x00000000),
 | |
| 				TextDrawTextSize(t, 10.0, 200.0);
 | |
| 				
 | |
| 				// Global style 12 (negative money).
 | |
| 				t = FIXES_gsGTStyle[12] = TextDrawCreate(607.000000, 78.000000, FIXES_gscSpace),
 | |
| 				TextDrawLetterSize(t, 0.550000, 2.150000),
 | |
| 				TextDrawAlignment(t, 3),
 | |
| 				TextDrawColor(t, 0xB4191DFF),
 | |
| 				TextDrawSetShadow(t, 0),
 | |
| 				TextDrawSetOutline(t, 2),
 | |
| 				TextDrawBackgroundColor(t, 0x000000FF),
 | |
| 				TextDrawFont(t, 3),
 | |
| 				TextDrawSetProportional(t, 1),
 | |
| 				TextDrawUseBox(t, true),
 | |
| 				TextDrawBoxColor(t, 0x00000000),
 | |
| 				TextDrawTextSize(t, 10.0, 200.0);
 | |
| 				
 | |
| 				// Global style 13 (stunt).
 | |
| 				t = FIXES_gsGTStyle[13] = TextDrawCreate(380.000000, 341.000000, FIXES_gscSpace),
 | |
| 				TextDrawLetterSize(t, 0.579999, 2.400000),
 | |
| 				TextDrawTextSize(t, 40.000000, 460.000000),
 | |
| 				TextDrawAlignment(t, 2),
 | |
| 				TextDrawColor(t, 0xD7D3CCFF),
 | |
| 				TextDrawUseBox(t, true),
 | |
| 				TextDrawBoxColor(t, 0),
 | |
| 				TextDrawSetShadow(t, 2),
 | |
| 				TextDrawSetOutline(t, 0),
 | |
| 				TextDrawBackgroundColor(t, 0x000000AA),
 | |
| 				TextDrawFont(t, 1),
 | |
| 				TextDrawSetProportional(t, 1),
 | |
| 				
 | |
| 			#endif
 | |
| 				
 | |
| 				// Global style 0.
 | |
| 				t = FIXES_gsGTStyle[0] = TextDrawCreate(320.0, 214.0, FIXES_gscSpace),
 | |
| 				TextDrawLetterSize(t, 1.3, 3.6),
 | |
| 				TextDrawAlignment(t, 2),
 | |
| 				TextDrawColor(t, 0x906210FF),
 | |
| 				TextDrawSetShadow(t, 0),
 | |
| 				TextDrawSetOutline(t, 2),
 | |
| 				TextDrawBackgroundColor(t, 0x000000AA),
 | |
| 				TextDrawFont(t, 3),
 | |
| 				TextDrawSetProportional(t, 1),
 | |
| 				TextDrawUseBox(t, true),
 | |
| 				TextDrawBoxColor(t, 0x00000000),
 | |
| 				TextDrawTextSize(t, 200.0, 620.0);
 | |
| 				
 | |
| 				// Global style 1.
 | |
| 				t = FIXES_gsGTStyle[1] = TextDrawCreate(620.0, 310.0, FIXES_gscSpace),
 | |
| 				TextDrawLetterSize(t, 1.0, 2.6),
 | |
| 				TextDrawAlignment(t, 3),
 | |
| 				TextDrawColor(t, 0x906210FF),
 | |
| 				TextDrawSetShadow(t, 0),
 | |
| 				TextDrawSetOutline(t, 2),
 | |
| 				TextDrawBackgroundColor(t, 0x000000AA),
 | |
| 				TextDrawFont(t, 3),
 | |
| 				TextDrawSetProportional(t, 1),
 | |
| 				TextDrawUseBox(t, true),
 | |
| 				TextDrawBoxColor(t, 0x00000000),
 | |
| 				TextDrawTextSize(t, 10.0, 200.0);
 | |
| 				
 | |
| 				// Global style 2.
 | |
| 				t = FIXES_gsGTStyle[2] = TextDrawCreate(320.0, 156.0, FIXES_gscSpace),
 | |
| 				TextDrawLetterSize(t, 2.1, 4.2),
 | |
| 				TextDrawAlignment(t, 2),
 | |
| 				TextDrawColor(t, 0xE1E1E1FF),
 | |
| 				TextDrawSetShadow(t, 0),
 | |
| 				TextDrawSetOutline(t, 3),
 | |
| 				TextDrawBackgroundColor(t, 0x000000AA),
 | |
| 				TextDrawFont(t, 0),
 | |
| 				TextDrawSetProportional(t, 1),
 | |
| 				TextDrawUseBox(t, true),
 | |
| 				TextDrawBoxColor(t, 0x00000000),
 | |
| 				TextDrawTextSize(t, 200.0, 620.0);
 | |
| 				
 | |
| 				// Global style 3.
 | |
| 				t = FIXES_gsGTStyle[3] = TextDrawCreate(320.000000, 154.500000, FIXES_gscSpace),
 | |
| 				TextDrawLetterSize(t, 0.600000, 2.750000),
 | |
| 				TextDrawAlignment(t, 2),
 | |
| 				TextDrawColor(t, 0x906210FF),
 | |
| 				TextDrawSetShadow(t, 0),
 | |
| 				TextDrawSetOutline(t, 2),
 | |
| 				TextDrawBackgroundColor(t, 0x000000AA),
 | |
| 				TextDrawFont(t, 2),
 | |
| 				TextDrawSetProportional(t, 1),
 | |
| 				TextDrawUseBox(t, true),
 | |
| 				TextDrawBoxColor(t, 0x00000000),
 | |
| 				TextDrawTextSize(t, 200.0, 620.0);
 | |
| 				
 | |
| 				// Global style 4.
 | |
| 				t = FIXES_gsGTStyle[4] = TextDrawCreate(320.000000, 115.500000, FIXES_gscSpace),
 | |
| 				TextDrawLetterSize(t, 0.600000, 2.750000),
 | |
| 				TextDrawAlignment(t, 2),
 | |
| 				TextDrawColor(t, 0x906210FF),
 | |
| 				TextDrawSetShadow(t, 0),
 | |
| 				TextDrawSetOutline(t, 2),
 | |
| 				TextDrawBackgroundColor(t, 0x000000AA),
 | |
| 				TextDrawFont(t, 2),
 | |
| 				TextDrawSetProportional(t, 1),
 | |
| 				TextDrawUseBox(t, true),
 | |
| 				TextDrawBoxColor(t, 0x00000000),
 | |
| 				TextDrawTextSize(t, 200.0, 620.0);
 | |
| 				
 | |
| 				// Global style 5.
 | |
| 				t = FIXES_gsGTStyle[5] = TextDrawCreate(320.0, 217.0, FIXES_gscSpace),
 | |
| 				TextDrawLetterSize(t, 0.6, 2.75),
 | |
| 				TextDrawAlignment(t, 2),
 | |
| 				TextDrawColor(t, 0xE1E1E1FF),
 | |
| 				TextDrawSetShadow(t, 0),
 | |
| 				TextDrawSetOutline(t, 2),
 | |
| 				TextDrawBackgroundColor(t, 0x000000AA),
 | |
| 				TextDrawFont(t, 2),
 | |
| 				TextDrawSetProportional(t, 1),
 | |
| 				TextDrawUseBox(t, true),
 | |
| 				TextDrawBoxColor(t, 0x00000000),
 | |
| 				TextDrawTextSize(t, 200.0, 620.0);
 | |
| 				
 | |
| 				// Global style 6.
 | |
| 				t = FIXES_gsGTStyle[6] = TextDrawCreate(320.000000, 60.000000, FIXES_gscSpace),
 | |
| 				TextDrawLetterSize(t, 1.000000, 3.599998),
 | |
| 				TextDrawAlignment(t, 2),
 | |
| 				TextDrawColor(t, 0xACCBF1FF),
 | |
| 				TextDrawSetShadow(t, 0),
 | |
| 				TextDrawSetOutline(t, 2),
 | |
| 				TextDrawBackgroundColor(t, 0x000000AA),
 | |
| 				TextDrawFont(t, 3),
 | |
| 				TextDrawSetProportional(t, 1),
 | |
| 				TextDrawUseBox(t, true),
 | |
| 				TextDrawBoxColor(t, 0x00000000),
 | |
| 				TextDrawTextSize(t, 200.0, 620.0);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 				new
 | |
| 					PlayerText:t;
 | |
| 				
 | |
| 			#if FIX_GameTextStyles
 | |
| 				
 | |
| 				// Global style 7 (playerid, vehicle name).
 | |
| 				t = FIXES_gsPGTStyle[playerid][7] = CreatePlayerTextDraw(playerid, 608.000000, 344.000000, FIXES_gscSpace),
 | |
| 				PlayerTextDrawLetterSize(playerid, t, 1.000000, 3.000000),
 | |
| 				PlayerTextDrawAlignment(playerid, t, 3),
 | |
| 				PlayerTextDrawColor(playerid, t, 0x36682CFF),
 | |
| 				PlayerTextDrawSetShadow(playerid, t, 0),
 | |
| 				PlayerTextDrawSetOutline(playerid, t, 2),
 | |
| 				PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
 | |
| 				PlayerTextDrawFont(playerid, t, 2),
 | |
| 				PlayerTextDrawSetProportional(playerid, t, 1),
 | |
| 				PlayerTextDrawUseBox(playerid, t, true),
 | |
| 				PlayerTextDrawBoxColor(playerid, t, 0x00000000),
 | |
| 				PlayerTextDrawTextSize(playerid, t, 10.0, 200.0);
 | |
| 				
 | |
| 				// Global style 8 (playerid, location name).
 | |
| 				t = FIXES_gsPGTStyle[playerid][8] = CreatePlayerTextDraw(playerid, 608.000000, 386.500000, FIXES_gscSpace),
 | |
| 				PlayerTextDrawLetterSize(playerid, t, 1.200000, 3.799998),
 | |
| 				PlayerTextDrawAlignment(playerid, t, 3),
 | |
| 				PlayerTextDrawColor(playerid, t, 0xACCBF1FF),
 | |
| 				PlayerTextDrawSetShadow(playerid, t, 0),
 | |
| 				PlayerTextDrawSetOutline(playerid, t, 2),
 | |
| 				PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
 | |
| 				PlayerTextDrawFont(playerid, t, 0),
 | |
| 				PlayerTextDrawSetProportional(playerid, t, 1),
 | |
| 				PlayerTextDrawUseBox(playerid, t, true),
 | |
| 				PlayerTextDrawBoxColor(playerid, t, 0x00000000),
 | |
| 				PlayerTextDrawTextSize(playerid, t, 10.0, 200.0);
 | |
| 				
 | |
| 				// Global style 9 (playerid, radio name).
 | |
| 				t = FIXES_gsPGTStyle[playerid][9] = CreatePlayerTextDraw(playerid, 320.000000, 22.000000, FIXES_gscSpace),
 | |
| 				PlayerTextDrawLetterSize(playerid, t, 0.600000, 1.899999),
 | |
| 				PlayerTextDrawAlignment(playerid, t, 2),
 | |
| 				PlayerTextDrawColor(playerid, t, 0x906210FF),
 | |
| 				PlayerTextDrawSetShadow(playerid, t, 0),
 | |
| 				PlayerTextDrawSetOutline(playerid, t, 1),
 | |
| 				PlayerTextDrawBackgroundColor(playerid, t, 170),
 | |
| 				PlayerTextDrawFont(playerid, t, 2),
 | |
| 				PlayerTextDrawSetProportional(playerid, t, 1),
 | |
| 				PlayerTextDrawUseBox(playerid, t, true),
 | |
| 				PlayerTextDrawBoxColor(playerid, t, 0x00000000),
 | |
| 				PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
 | |
| 				
 | |
| 				// Global style 10 (playerid, radio switch).
 | |
| 				t = FIXES_gsPGTStyle[playerid][10] = CreatePlayerTextDraw(playerid, 320.000000, 22.000000, FIXES_gscSpace),
 | |
| 				PlayerTextDrawLetterSize(playerid, t, 0.600000, 1.899999),
 | |
| 				PlayerTextDrawAlignment(playerid, t, 2),
 | |
| 				PlayerTextDrawColor(playerid, t, 0x969696FF),
 | |
| 				PlayerTextDrawSetShadow(playerid, t, 0),
 | |
| 				PlayerTextDrawSetOutline(playerid, t, 1),
 | |
| 				PlayerTextDrawBackgroundColor(playerid, t, 170),
 | |
| 				PlayerTextDrawFont(playerid, t, 2),
 | |
| 				PlayerTextDrawSetProportional(playerid, t, 1),
 | |
| 				PlayerTextDrawUseBox(playerid, t, true),
 | |
| 				PlayerTextDrawBoxColor(playerid, t, 0x00000000),
 | |
| 				PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
 | |
| 				
 | |
| 				// Global style 11 (playerid, positive money).
 | |
| 				t = FIXES_gsPGTStyle[playerid][11] = CreatePlayerTextDraw(playerid, 607.000000, 78.000000, FIXES_gscSpace),
 | |
| 				PlayerTextDrawLetterSize(playerid, t, 0.550000, 2.150000),
 | |
| 				PlayerTextDrawAlignment(playerid, t, 3),
 | |
| 				PlayerTextDrawColor(playerid, t, 0x36682CFF),
 | |
| 				PlayerTextDrawSetShadow(playerid, t, 0),
 | |
| 				PlayerTextDrawSetOutline(playerid, t, 2),
 | |
| 				PlayerTextDrawBackgroundColor(playerid, t, 0x000000FF),
 | |
| 				PlayerTextDrawFont(playerid, t, 3),
 | |
| 				PlayerTextDrawSetProportional(playerid, t, 1),
 | |
| 				PlayerTextDrawUseBox(playerid, t, true),
 | |
| 				PlayerTextDrawBoxColor(playerid, t, 0x00000000),
 | |
| 				PlayerTextDrawTextSize(playerid, t, 10.0, 200.0);
 | |
| 				
 | |
| 				// Global style 12 (playerid, negative money).
 | |
| 				t = FIXES_gsPGTStyle[playerid][12] = CreatePlayerTextDraw(playerid, 607.000000, 78.000000, FIXES_gscSpace),
 | |
| 				PlayerTextDrawLetterSize(playerid, t, 0.550000, 2.150000),
 | |
| 				PlayerTextDrawAlignment(playerid, t, 3),
 | |
| 				PlayerTextDrawColor(playerid, t, 0xB4191DFF),
 | |
| 				PlayerTextDrawSetShadow(playerid, t, 0),
 | |
| 				PlayerTextDrawSetOutline(playerid, t, 2),
 | |
| 				PlayerTextDrawBackgroundColor(playerid, t, 0x000000FF),
 | |
| 				PlayerTextDrawFont(playerid, t, 3),
 | |
| 				PlayerTextDrawSetProportional(playerid, t, 1),
 | |
| 				PlayerTextDrawUseBox(playerid, t, true),
 | |
| 				PlayerTextDrawBoxColor(playerid, t, 0x00000000),
 | |
| 				PlayerTextDrawTextSize(playerid, t, 10.0, 200.0);
 | |
| 				
 | |
| 				// Global style 13 (playerid, stunt).
 | |
| 				t = FIXES_gsPGTStyle[playerid][13] = CreatePlayerTextDraw(playerid, 380.000000, 341.000000, FIXES_gscSpace),
 | |
| 				PlayerTextDrawLetterSize(playerid, t, 0.579999, 2.400000),
 | |
| 				PlayerTextDrawTextSize(playerid, t, 40.000000, 460.000000),
 | |
| 				PlayerTextDrawAlignment(playerid, t, 2),
 | |
| 				PlayerTextDrawColor(playerid, t, 0xD7D3CCFF),
 | |
| 				PlayerTextDrawUseBox(playerid, t, true),
 | |
| 				PlayerTextDrawBoxColor(playerid, t, 0),
 | |
| 				PlayerTextDrawSetShadow(playerid, t, 2),
 | |
| 				PlayerTextDrawSetOutline(playerid, t, 0),
 | |
| 				PlayerTextDrawBackgroundColor(playerid, t, 170),
 | |
| 				PlayerTextDrawFont(playerid, t, 1),
 | |
| 				PlayerTextDrawSetProportional(playerid, t, 1);
 | |
| 				
 | |
| 			#endif
 | |
| 				
 | |
| 				// Global style 0.
 | |
| 				t = FIXES_gsPGTStyle[playerid][0] = CreatePlayerTextDraw(playerid, 320.0, 214.0, FIXES_gscSpace),
 | |
| 				PlayerTextDrawLetterSize(playerid, t, 1.3, 3.6),
 | |
| 				PlayerTextDrawAlignment(playerid, t, 2),
 | |
| 				PlayerTextDrawColor(playerid, t, 0x906210FF),
 | |
| 				PlayerTextDrawSetShadow(playerid, t, 0),
 | |
| 				PlayerTextDrawSetOutline(playerid, t, 2),
 | |
| 				PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
 | |
| 				PlayerTextDrawFont(playerid, t, 3),
 | |
| 				PlayerTextDrawSetProportional(playerid, t, 1),
 | |
| 				PlayerTextDrawUseBox(playerid, t, true),
 | |
| 				PlayerTextDrawBoxColor(playerid, t, 0x00000000),
 | |
| 				PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
 | |
| 				
 | |
| 				// Global style 1.
 | |
| 				t = FIXES_gsPGTStyle[playerid][1] = CreatePlayerTextDraw(playerid, 620.0, 310.0, FIXES_gscSpace),
 | |
| 				PlayerTextDrawLetterSize(playerid, t, 1.0, 2.6),
 | |
| 				PlayerTextDrawAlignment(playerid, t, 3),
 | |
| 				PlayerTextDrawColor(playerid, t, 0x906210FF),
 | |
| 				PlayerTextDrawSetShadow(playerid, t, 0),
 | |
| 				PlayerTextDrawSetOutline(playerid, t, 2),
 | |
| 				PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
 | |
| 				PlayerTextDrawFont(playerid, t, 3),
 | |
| 				PlayerTextDrawSetProportional(playerid, t, 1),
 | |
| 				PlayerTextDrawUseBox(playerid, t, true),
 | |
| 				PlayerTextDrawBoxColor(playerid, t, 0x00000000),
 | |
| 				PlayerTextDrawTextSize(playerid, t, 10.0, 200.0);
 | |
| 				
 | |
| 				// Global style 2.
 | |
| 				t = FIXES_gsPGTStyle[playerid][2] = CreatePlayerTextDraw(playerid, 320.0, 156.0, FIXES_gscSpace),
 | |
| 				PlayerTextDrawLetterSize(playerid, t, 2.1, 4.2),
 | |
| 				PlayerTextDrawAlignment(playerid, t, 2),
 | |
| 				PlayerTextDrawColor(playerid, t, 0xE1E1E1FF),
 | |
| 				PlayerTextDrawSetShadow(playerid, t, 0),
 | |
| 				PlayerTextDrawSetOutline(playerid, t, 3),
 | |
| 				PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
 | |
| 				PlayerTextDrawFont(playerid, t, 0),
 | |
| 				PlayerTextDrawSetProportional(playerid, t, 1),
 | |
| 				PlayerTextDrawUseBox(playerid, t, true),
 | |
| 				PlayerTextDrawBoxColor(playerid, t, 0x00000000),
 | |
| 				PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
 | |
| 				
 | |
| 				// Global style 3.
 | |
| 				t = FIXES_gsPGTStyle[playerid][3] = CreatePlayerTextDraw(playerid, 320.000000, 154.500000, FIXES_gscSpace),
 | |
| 				PlayerTextDrawLetterSize(playerid, t, 0.600000, 2.750000),
 | |
| 				PlayerTextDrawAlignment(playerid, t, 2),
 | |
| 				PlayerTextDrawColor(playerid, t, 0x906210FF),
 | |
| 				PlayerTextDrawSetShadow(playerid, t, 0),
 | |
| 				PlayerTextDrawSetOutline(playerid, t, 2),
 | |
| 				PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
 | |
| 				PlayerTextDrawFont(playerid, t, 2),
 | |
| 				PlayerTextDrawSetProportional(playerid, t, 1),
 | |
| 				PlayerTextDrawUseBox(playerid, t, true),
 | |
| 				PlayerTextDrawBoxColor(playerid, t, 0x00000000),
 | |
| 				PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
 | |
| 				
 | |
| 				// Global style 4.
 | |
| 				t = FIXES_gsPGTStyle[playerid][4] = CreatePlayerTextDraw(playerid, 320.000000, 115.500000, FIXES_gscSpace),
 | |
| 				PlayerTextDrawLetterSize(playerid, t, 0.600000, 2.750000),
 | |
| 				PlayerTextDrawAlignment(playerid, t, 2),
 | |
| 				PlayerTextDrawColor(playerid, t, 0x906210FF),
 | |
| 				PlayerTextDrawSetShadow(playerid, t, 0),
 | |
| 				PlayerTextDrawSetOutline(playerid, t, 2),
 | |
| 				PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
 | |
| 				PlayerTextDrawFont(playerid, t, 2),
 | |
| 				PlayerTextDrawSetProportional(playerid, t, 1),
 | |
| 				PlayerTextDrawUseBox(playerid, t, true),
 | |
| 				PlayerTextDrawBoxColor(playerid, t, 0x00000000),
 | |
| 				PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
 | |
| 				
 | |
| 				// Global style 5.
 | |
| 				t = FIXES_gsPGTStyle[playerid][5] = CreatePlayerTextDraw(playerid, 320.0, 217.0, FIXES_gscSpace),
 | |
| 				PlayerTextDrawLetterSize(playerid, t, 0.6, 2.75),
 | |
| 				PlayerTextDrawAlignment(playerid, t, 2),
 | |
| 				PlayerTextDrawColor(playerid, t, 0xE1E1E1FF),
 | |
| 				PlayerTextDrawSetShadow(playerid, t, 0),
 | |
| 				PlayerTextDrawSetOutline(playerid, t, 2),
 | |
| 				PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
 | |
| 				PlayerTextDrawFont(playerid, t, 2),
 | |
| 				PlayerTextDrawSetProportional(playerid, t, 1),
 | |
| 				PlayerTextDrawUseBox(playerid, t, true),
 | |
| 				PlayerTextDrawBoxColor(playerid, t, 0x00000000),
 | |
| 				PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
 | |
| 				
 | |
| 				// Global style 6.
 | |
| 				t = FIXES_gsPGTStyle[playerid][6] = CreatePlayerTextDraw(playerid, 320.000000, 60.000000, FIXES_gscSpace),
 | |
| 				PlayerTextDrawLetterSize(playerid, t, 1.000000, 3.599998),
 | |
| 				PlayerTextDrawAlignment(playerid, t, 2),
 | |
| 				PlayerTextDrawColor(playerid, t, 0xACCBF1FF),
 | |
| 				PlayerTextDrawSetShadow(playerid, t, 0),
 | |
| 				PlayerTextDrawSetOutline(playerid, t, 2),
 | |
| 				PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA),
 | |
| 				PlayerTextDrawFont(playerid, t, 3),
 | |
| 				PlayerTextDrawSetProportional(playerid, t, 1),
 | |
| 				PlayerTextDrawUseBox(playerid, t, true),
 | |
| 				PlayerTextDrawBoxColor(playerid, t, 0x00000000),
 | |
| 				PlayerTextDrawTextSize(playerid, t, 200.0, 620.0);
 | |
| 		}
 | |
| 	}
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * OnFilterScriptInit()
 | |
|  * 
 | |
|  * Set "IS_FILTERSCRIPT" to true as this callback is ONLY called if this script
 | |
|  * is actually a FilterScript.  Then call "FIXES_OnScriptInit".
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     IS_FILTERSCRIPT
 | |
|  *     OnPlayerConnect
 | |
|  *     GameText
 | |
|  */
 | |
| 
 | |
| public OnFilterScriptInit()
 | |
| {
 | |
| 	// It is possible for this to be the only thing done in this function!
 | |
| 	_FIXES_gIsFilterscript = true;
 | |
| 	
 | |
| 	state _ALS : _ALS_go;
 | |
| 	
 | |
| 	#if FIXES_Single
 | |
| 		// Check this really IS the only script running.
 | |
| 		if (existproperty(5, FIXES_gscSingleProperty))
 | |
| 		{
 | |
| 			print(FIXES_gscFixesError);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			FIXES_gsSettings &= ~e_FIXES_SETTINGS_SECOND_USE,
 | |
| 			setproperty(5, FIXES_gscSingleProperty, 1);
 | |
| 		}
 | |
| 	#endif
 | |
| 	
 | |
| 	// =================
 | |
| 	//  BEGIN: GameText 
 | |
| 	// =================
 | |
| 	#if FIX_GameText
 | |
| 		for (new i = 0; i != sizeof (FIXES_gsPlayerPGTShown); ++i)
 | |
| 		{
 | |
| 			FIXES_gsPlayerPGTShown[i][MAX_PLAYERS] = MAX_PLAYERS;
 | |
| 		}
 | |
| 	#endif
 | |
| 	#if FIXES_Single
 | |
| 		#if FIX_GameText
 | |
| 			_FIXES_CreateGameTextDraws(INVALID_PLAYER_ID);
 | |
| 		#endif
 | |
| 		// =================
 | |
| 		//  END:   GameText 
 | |
| 		// =================
 | |
| 	#else
 | |
| 		FIXES_DetermineOrder(),
 | |
| 		FIXES_gsSettings &= ~e_FIXES_SETTINGS_DROP_ALL_DATA;
 | |
| 	#endif
 | |
| 	
 | |
| 	#if !FIXES_Single && FIX_GameText && FIX_OnPlayerConnect
 | |
| 		FIXES_gsSettings |= e_FIXES_SETTINGS_NO_GAME_TEXT;
 | |
| 	#endif
 | |
| 	// These are all the fixes that use "_FIXES_FOREACH".
 | |
| 	#if FIX_OnPlayerConnect || _FIX_Menus || FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
 | |
| 		for (new playerid = 0; playerid != MAX_PLAYERS; ++playerid)
 | |
| 		{
 | |
| 			if (BAD_IsPlayerConnected(playerid))
 | |
| 			{
 | |
| 				// No "defined" checks - if you don't want this fix because
 | |
| 				// you don't have an "OnPlayerConnect", just don't use it!
 | |
| 				// Of course, it helps that the copy of "OnPlayerConnect"
 | |
| 				// in this include is almost always called!
 | |
| 				#if FIX_OnPlayerConnect
 | |
| 					// ========================
 | |
| 					//  BEGIN: OnPlayerConnect 
 | |
| 					// ========================
 | |
| 					OnPlayerConnect(playerid);
 | |
| 					// ========================
 | |
| 					//  END:   OnPlayerConnect 
 | |
| 					// ========================
 | |
| 				#else
 | |
| 					_FIXES_AddInternal(FIXES_gsPlayersIterator, playerid, MAX_PLAYERS);
 | |
| 					
 | |
| 					#if FIX_GameText
 | |
| 						// =================
 | |
| 						//  BEGIN: GameText 
 | |
| 						// =================
 | |
| 						_FIXES_IS_IN_CHARGE()
 | |
| 						{
 | |
| 							_FIXES_CreateGameTextDraws(playerid);
 | |
| 						}
 | |
| 						// =================
 | |
| 						//  END:   GameText 
 | |
| 						// =================
 | |
| 					#endif
 | |
| 				#endif
 | |
| 			}
 | |
| 		}
 | |
| 	#endif
 | |
| 	#if !FIXES_Single && FIX_GameText && FIX_OnPlayerConnect
 | |
| 		FIXES_gsSettings &= ~e_FIXES_SETTINGS_NO_GAME_TEXT;
 | |
| 	#endif
 | |
| 	
 | |
| 	return FIXES_OnFilterScriptInit();
 | |
| }
 | |
| 
 | |
| #if defined _ALS_OnFilterScriptInit
 | |
| 	#error _ALS_OnFilterScriptInit defined
 | |
| #endif
 | |
| #define _ALS_OnFilterScriptInit
 | |
| #define OnFilterScriptInit(%0) FIXES_OnFilterScriptInit(%0) <_ALS : _ALS_go>
 | |
| 
 | |
| _FIXES_FORWARD FIXES_OnFilterScriptInit();
 | |
| 
 | |
| /* 
 | |
|  * OnGameModeInit()
 | |
|  * 
 | |
|  * Call "FIXES_OnScriptInit" if this is not a FilterScript.
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     IS_FILTERSCRIPT
 | |
|  *     AllowInteriorWeapons
 | |
|  *     AllowTeleport
 | |
|  */
 | |
| 
 | |
| public OnGameModeInit()
 | |
| {
 | |
| 	state _ALS : _ALS_go;
 | |
| 	
 | |
| 	#if FIXES_Single
 | |
| 		// Check this really IS the only script running.  Properties reset when
 | |
| 		// a gamemode restarts, so we don't have to worry about filterscipts
 | |
| 		// detecting themselves.
 | |
| 		if (FIXES_gsSettings & e_FIXES_SETTINGS_SECOND_USE)
 | |
| 		{
 | |
| 			if (existproperty(5, FIXES_gscSingleProperty))
 | |
| 			{
 | |
| 				print(FIXES_gscFixesError);
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				setproperty(5, FIXES_gscSingleProperty, 1);
 | |
| 			}
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			// When the server starts, we need to allow an FS to load with a GM
 | |
| 			// that doesn't use fixes.inc.  This is the only case where a
 | |
| 			// property can be set while a ganemode isn't running.  This will
 | |
| 			// mean that the FS won't complain if they are both using fixes, but
 | |
| 			// the GM still will, so all is good.
 | |
| 			FIXES_gsSettings |= e_FIXES_SETTINGS_SECOND_USE;
 | |
| 		}
 | |
| 	#endif
 | |
| 	
 | |
| 	// =============================
 | |
| 	//  BEGIN: AllowInteriorWeapons 
 | |
| 	// =============================
 | |
| 	// ======================
 | |
| 	//  BEGIN: AllowTeleport 
 | |
| 	// ======================
 | |
| 	#if FIX_AllowInteriorWeapons && FIX_AllowTeleport && !defined FILTERSCRIPT
 | |
| 		FIXES_gsSettings &= ~(e_FIXES_SETTINGS_INTERIOR | e_FIXES_SETTINGS_ADMIN_TELEPORT);
 | |
| 	#elseif FIX_AllowInteriorWeapons
 | |
| 		FIXES_gsSettings &= ~e_FIXES_SETTINGS_INTERIOR;
 | |
| 	#elseif FIX_AllowTeleport && !defined FILTERSCRIPT
 | |
| 		FIXES_gsSettings &= ~e_FIXES_SETTINGS_ADMIN_TELEPORT;
 | |
| 	#endif
 | |
| 	// ======================
 | |
| 	//  END:   AllowTeleport 
 | |
| 	// ======================
 | |
| 	// ===========================
 | |
| 	//  END: AllowInteriorWeapons 
 | |
| 	// ===========================
 | |
| 	
 | |
| 	#if FIX_GameText || !FIXES_Single
 | |
| 		if (!_FIXES_gIsFilterscript)
 | |
| 		{
 | |
| 			// =================
 | |
| 			//  BEGIN: GameText 
 | |
| 			// =================
 | |
| 			#if FIX_GameText
 | |
| 					for (new i = 0; i != sizeof (FIXES_gsPlayerPGTShown); ++i)
 | |
| 					{
 | |
| 						FIXES_gsPlayerPGTShown[i][MAX_PLAYERS] = MAX_PLAYERS;
 | |
| 					}
 | |
| 				#if FIXES_Single
 | |
| 					_FIXES_CreateGameTextDraws(INVALID_PLAYER_ID);
 | |
| 				#endif
 | |
| 			#endif
 | |
| 			// =================
 | |
| 			//  END:   GameText 
 | |
| 			// =================
 | |
| 			#if !FIXES_Single
 | |
| 				FIXES_DetermineOrder();
 | |
| 			#endif
 | |
| 		}
 | |
| 	#endif
 | |
| 	#if !FIXES_Single
 | |
| 		FIXES_gsSettings &= ~e_FIXES_SETTINGS_DROP_ALL_DATA;
 | |
| 	#endif
 | |
| 	
 | |
| 	return FIXES_OnGameModeInit();
 | |
| }
 | |
| 
 | |
| #if defined _ALS_OnGameModeInit
 | |
| 	#error _ALS_OnGameModeInit defined
 | |
| #endif
 | |
| #define _ALS_OnGameModeInit
 | |
| #define OnGameModeInit(%0) FIXES_OnGameModeInit(%0) <_ALS : _ALS_go>
 | |
| 
 | |
| _FIXES_FORWARD FIXES_OnGameModeInit();
 | |
| 
 | |
| /* 
 | |
|  * OnGameModeExit()
 | |
|  * 
 | |
|  * Fast way of detecting not to retain any data.
 | |
|  */
 | |
| 
 | |
| #if !FIXES_Single || FIX_PlayerDialogResponse
 | |
| 	public OnGameModeExit()
 | |
| 	{
 | |
| 		#if !FIXES_Single
 | |
| 			FIXES_gsSettings |= e_FIXES_SETTINGS_DROP_ALL_DATA;
 | |
| 			if (!_FIXES_gIsFilterscript && FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)
 | |
| 			{
 | |
| 				FIXES_gsSettings |= e_FIXES_SETTINGS_ENDING,
 | |
| 				FIXES_DetermineOrder();
 | |
| 			}
 | |
| 		#endif
 | |
| 		
 | |
| 		// =============================
 | |
| 		//  BEGIN: PlayerDialogResponse 
 | |
| 		// =============================
 | |
| 		#if FIX_PlayerDialogResponse
 | |
| 			for (new playerid = 0; playerid != MAX_PLAYERS; ++playerid)
 | |
| 			{
 | |
| 				ShowPlayerDialog(playerid, -1, 0, FIXES_gscSpace, FIXES_gscSpace, FIXES_gscSpace, FIXES_gscSpace);
 | |
| 			}
 | |
| 		#endif
 | |
| 		// =============================
 | |
| 		//  END:   PlayerDialogResponse 
 | |
| 		// =============================
 | |
| 		
 | |
| 		return FIXES_OnGameModeExit();
 | |
| 	}
 | |
| 	
 | |
| 	#if defined _ALS_OnGameModeExit
 | |
| 		#error _ALS_OnGameModeExit defined
 | |
| 	#endif
 | |
| 	#define _ALS_OnGameModeExit
 | |
| 	#define OnGameModeExit(%0) FIXES_OnGameModeExit(%0) <_ALS : _ALS_go>
 | |
| 	
 | |
| 	_FIXES_FORWARD FIXES_OnGameModeExit();
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * OnFilterScriptExit()
 | |
|  * 
 | |
|  * Fast way of detecting not to retain any data.
 | |
|  */
 | |
| 
 | |
| #if !FIXES_Single || FIX_GameText || FIX_OnPlayerDisconnect
 | |
| 	public OnFilterScriptExit()
 | |
| 	{
 | |
| 		#if FIX_OnPlayerDisconnect
 | |
| 			// Removal safe loop.
 | |
| 			for (new next, playerid = FIXES_gsPlayersIterator[MAX_PLAYERS]; playerid != MAX_PLAYERS; playerid = next)
 | |
| 			{
 | |
| 				next = FIXES_gsPlayersIterator[playerid],
 | |
| 				OnPlayerDisconnect(playerid, 4);
 | |
| 				#if FIXES_Single
 | |
| 					// =================
 | |
| 					//  BEGIN: GameText 
 | |
| 					// =================
 | |
| 					#if FIX_GameText
 | |
| 						#if FIX_GameTextStyles
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][13]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][12]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][11]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][10]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][9]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][8]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][7]),
 | |
| 						#endif
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][6]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][5]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][4]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][3]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][2]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][1]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][0]);
 | |
| 					#endif
 | |
| 				#endif
 | |
| 			}
 | |
| 		#endif
 | |
| 		#if FIXES_Single
 | |
| 			// =================
 | |
| 			//  BEGIN: GameText 
 | |
| 			// =================
 | |
| 			#if FIX_GameText
 | |
| 				#if defined FIXES_OnFilterScriptExit
 | |
| 					FIXES_OnFilterScriptExit();
 | |
| 				#endif
 | |
| 				#if !FIX_OnPlayerDisconnect
 | |
| 					_FIXES_FOREACH(FIXES_gsPlayersIterator, playerid)
 | |
| 					{
 | |
| 						#if FIX_GameTextStyles
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][13]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][12]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][11]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][10]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][9]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][8]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][7]),
 | |
| 						#endif
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][6]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][5]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][4]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][3]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][2]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][1]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][0]);
 | |
| 					}
 | |
| 				#endif
 | |
| 					return
 | |
| 						#if FIX_GameTextStyles
 | |
| 							TextDrawDestroy(FIXES_gsGTStyle[13]),
 | |
| 							TextDrawDestroy(FIXES_gsGTStyle[12]),
 | |
| 							TextDrawDestroy(FIXES_gsGTStyle[11]),
 | |
| 							TextDrawDestroy(FIXES_gsGTStyle[10]),
 | |
| 							TextDrawDestroy(FIXES_gsGTStyle[9]),
 | |
| 							TextDrawDestroy(FIXES_gsGTStyle[8]),
 | |
| 							TextDrawDestroy(FIXES_gsGTStyle[7]),
 | |
| 						#endif
 | |
| 							TextDrawDestroy(FIXES_gsGTStyle[6]),
 | |
| 							TextDrawDestroy(FIXES_gsGTStyle[5]),
 | |
| 							TextDrawDestroy(FIXES_gsGTStyle[4]),
 | |
| 							TextDrawDestroy(FIXES_gsGTStyle[3]),
 | |
| 							TextDrawDestroy(FIXES_gsGTStyle[2]),
 | |
| 							TextDrawDestroy(FIXES_gsGTStyle[1]),
 | |
| 							TextDrawDestroy(FIXES_gsGTStyle[0]);
 | |
| 			#else
 | |
| 					return FIXES_OnFilterScriptExit();
 | |
| 			#endif
 | |
| 			// =================
 | |
| 			//  END:   GameText 
 | |
| 			// =================
 | |
| 		#else
 | |
| 			if (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)
 | |
| 			{
 | |
| 				FIXES_gsSettings |= e_FIXES_SETTINGS_ENDING,
 | |
| 				FIXES_DetermineOrder();
 | |
| 			}
 | |
| 			return FIXES_OnFilterScriptExit();
 | |
| 		#endif
 | |
| 	}
 | |
| 	
 | |
| 	#if defined _ALS_OnFilterScriptExit
 | |
| 		#error _ALS_OnFilterScriptExit defined
 | |
| 	#endif
 | |
| 	#define _ALS_OnFilterScriptExit
 | |
| 	#define OnFilterScriptExit(%0) FIXES_OnFilterScriptExit(%0) <_ALS : _ALS_go>
 | |
| 	
 | |
| 	_FIXES_FORWARD FIXES_OnFilterScriptExit();
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * OnPlayerCommandText(playerid, cmdtext[])
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     OnPlayerCommandText
 | |
|  */
 | |
| 
 | |
| #if FIX_OnPlayerCommandText
 | |
| 	public OnPlayerCommandText(playerid, cmdtext[])
 | |
| 	{
 | |
| 		// ============================
 | |
| 		//  BEGIN: OnPlayerCommandText 
 | |
| 		// ============================
 | |
| 		#if FIX_OnPlayerCommandText
 | |
| 			// If this "#if" is around the whole function, it doesn't always
 | |
| 			// compile properly.
 | |
| 			return FIXES_OnPlayerCommandText(playerid, (cmdtext[0] <= '\1') ? FIXES_gscNULL : cmdtext);
 | |
| 		#endif
 | |
| 		// ============================
 | |
| 		//  END: OnPlayerCommandText 
 | |
| 		// ============================
 | |
| 	}
 | |
| 	
 | |
| 	#if defined _ALS_OnPlayerCommandText
 | |
| 		#error _ALS_OnPlayerCommandText defined
 | |
| 	#endif
 | |
| 	#define _ALS_OnPlayerCommandText
 | |
| 	#define OnPlayerCommandText(%0) FIXES_OnPlayerCommandText(%0) <_ALS : _ALS_go>
 | |
| 	
 | |
| 	forward FIXES_OnPlayerCommandText(playerid, cmdtext[]);
 | |
| 	public FIXES_OnPlayerCommandText(playerid, cmdtext[]) <_ALS : _ALS_x0, _ALS : _ALS_x1> { return 0; }
 | |
| 	public FIXES_OnPlayerCommandText(playerid, cmdtext[]) <> { return 0; }
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * OnPlayerConnect(playerid)
 | |
|  * 
 | |
|  * Almost every fix uses this callback for initialisation.  It is only
 | |
|  * explicitly referenced for those fixes where this is all the code.  The
 | |
|  * inclusion code was approaching the 512 line length limit, so I shrank it.
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     TogglePlayerControllable
 | |
|  *     SetPlayerWorldBounds
 | |
|  *     GetPlayerColor
 | |
|  *     SetPlayerName
 | |
|  *     GetPlayerSkin
 | |
|  *     IsPlayerInCheckpoint
 | |
|  *     IsPlayerInRaceCheckpoint
 | |
|  *     GetPlayerWeapon
 | |
|  *     PutPlayerInVehicle
 | |
|  *     OnPlayerEnterVehicle
 | |
|  *     AllowTeleport
 | |
|  *     OnDialogResponse
 | |
|  *     SetSpawnInfo
 | |
|  *     AllowInteriorWeapons
 | |
|  *     TrainExit
 | |
|  *     Kick
 | |
|  *     OnPlayerEnterVehicle_2
 | |
|  *     PlayerDialogResponse
 | |
|  *     OnPlayerSpawn
 | |
|  *     ApplyAnimation_2
 | |
|  */
 | |
| 
 | |
| #if     FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_SetPlayerName            || FIX_GetPlayerColour
 | |
| 	#define _FIXES_ON_PLAYER_CONNECT
 | |
| #elseif FIX_GetPlayerSkin        || FIX_IsPlayerInCheckpoint     || FIX_IsPlayerInRaceCheckpoint || FIX_GetPlayerWeapon
 | |
| 	#define _FIXES_ON_PLAYER_CONNECT
 | |
| #elseif FIX_PutPlayerInVehicle   || FIX_OnPlayerEnterVehicle     || FIX_AllowTeleport            || FIX_OnDialogResponse
 | |
| 	#define _FIXES_ON_PLAYER_CONNECT
 | |
| #elseif FIX_GetPlayerDialog      || FIX_SetSpawnInfo             || FIX_AllowInteriorWeapons     || FIX_TrainExit
 | |
| 	#define _FIXES_ON_PLAYER_CONNECT
 | |
| #elseif FIX_Kick                 || FIX_OnPlayerEnterVehicle_2   || FIX_PlayerDialogResponse     || FIX_GetPlayerInterior
 | |
| 	#define _FIXES_ON_PLAYER_CONNECT
 | |
| #elseif FIX_OnPlayerSpawn        || FIX_ApplyAnimation_2         || FIX_GameText                 || _FIX_Menus
 | |
| 	#define _FIXES_ON_PLAYER_CONNECT
 | |
| #elseif FIX_GetPlayerMenu        || FIX_OnPlayerDisconnect       || FIX_OnPlayerConnect          || FIX_SetPlayerTime
 | |
| 	#define _FIXES_ON_PLAYER_CONNECT
 | |
| #elseif FIX_SetPlayerColour
 | |
| 	#define _FIXES_ON_PLAYER_CONNECT
 | |
| #endif
 | |
| 
 | |
| #if defined _FIXES_ON_PLAYER_CONNECT
 | |
| 	public OnPlayerConnect(playerid)
 | |
| 	{
 | |
| 		// =========================
 | |
| 		//  BEGIN: ApplyAnimation_2 
 | |
| 		// =========================
 | |
| 		#if FIX_ApplyAnimation_2
 | |
| 			FIXES_gsPlayerAnimLibs[playerid][0] =
 | |
| 				FIXES_gsPlayerAnimLibs[playerid][1] =
 | |
| 					FIXES_gsPlayerAnimLibs[playerid][2] =
 | |
| 						FIXES_gsPlayerAnimLibs[playerid][3] =
 | |
| 							FIXES_gsPlayerAnimLibs[playerid][4] = -1;
 | |
| 		#endif
 | |
| 		// =======================
 | |
| 		//  END: ApplyAnimation_2 
 | |
| 		// =======================
 | |
| 		
 | |
| 		#if _FIX_Menus || FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
 | |
| 			_FIXES_AddInternal(FIXES_gsPlayersIterator, playerid, MAX_PLAYERS);
 | |
| 		#endif
 | |
| 		
 | |
| 		FIXES_PRINTF("FIXES_OnPlayerConnect: %d", playerid);
 | |
| 			// This is only reset when the Game Mode changes or when a new
 | |
| 		#if FIX_Kick || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_PutPlayerInVehicle || FIX_OnPlayerEnterVehicle || FIX_AllowTeleport || FIX_AllowInteriorWeapons || FIX_TrainExit || FIX_OnPlayerEnterVehicle_2 || FIX_SetPlayerColour
 | |
| 			// player connects, which is what we want.  The other items are the
 | |
| 			// same, but must be done only once.  This variable will tend to
 | |
| 			// hold data relevant only in the master script (the first
 | |
| 			// filterscript).
 | |
| 			#if FIX_Kick || FIX_SetPlayerTime || FIX_SetPlayerColour
 | |
| 				FIXES_gsPlayerBools[playerid] = e_FIXES_BOOLS_ON_PLAYER_CONNECT;
 | |
| 			#else
 | |
| 				FIXES_gsPlayerBools[playerid] = e_FIXES_BOOLS_NONE;
 | |
| 			#endif
 | |
| 		#endif
 | |
| 		
 | |
| 		// =================
 | |
| 		//  BEGIN: GameText 
 | |
| 		// =================
 | |
| 		#if FIX_GameText
 | |
| 			#if !FIXES_Single
 | |
| 				if (FIXES_gsSettings & (e_FIXES_SETTINGS_NO_GAME_TEXT | e_FIXES_SETTINGS_IN_CHARGE) == e_FIXES_SETTINGS_IN_CHARGE)
 | |
| 			#endif
 | |
| 				{
 | |
| 					_FIXES_CreateGameTextDraws(playerid);
 | |
| 				}
 | |
| 		#endif
 | |
| 		// =================
 | |
| 		//  END:   GameText 
 | |
| 		// =================
 | |
| 		
 | |
| 		#if !FIXES_Single
 | |
| 			if (!GetPVarInt(playerid, FIXES_pvarNotNewPlayer))
 | |
| 		#endif
 | |
| 			{
 | |
| 				FIXES_PRINTF("FIXES_OnPlayerConnect: First (%d)", FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE);
 | |
| 				// ======================
 | |
| 				//  BEGIN: SetPlayerName 
 | |
| 				// ======================
 | |
| 				#if FIX_SetPlayerName
 | |
| 					new
 | |
| 						name[MAX_PLAYER_NAME];
 | |
| 					GetPlayerName(playerid, name, MAX_PLAYER_NAME);
 | |
| 					if (strcmp(name, FIXES_gscTempName) == 0)
 | |
| 					{
 | |
| 						Kick(playerid);
 | |
| 					}
 | |
| 				#endif
 | |
| 				// ======================
 | |
| 				//  END:   SetPlayerName 
 | |
| 				// ======================
 | |
| 				
 | |
| 				// =============================
 | |
| 				//  BEGIN: SetPlayerWorldBounds 
 | |
| 				// =============================
 | |
| 				#if FIX_SetPlayerWorldBounds && !FIXES_Single
 | |
| 					FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] =
 | |
| 						FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] =
 | |
| 							FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] =
 | |
| 								FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY] =
 | |
| 									0.0;
 | |
| 				#endif
 | |
| 				// =============================
 | |
| 				//  END:   SetPlayerWorldBounds 
 | |
| 				// =============================
 | |
| 				
 | |
| 				// =======================
 | |
| 				//  BEGIN: GetPlayerColor 
 | |
| 				// =======================
 | |
| 				#if FIX_GetPlayerColour
 | |
| 					SetPlayerColor(playerid, FIXES_gscPlayerColours[playerid % 100]);
 | |
| 				#endif
 | |
| 				// =======================
 | |
| 				//  END:   GetPlayerColor 
 | |
| 				// =======================
 | |
| 				
 | |
| 				// ======================
 | |
| 				//  BEGIN: GetPlayerSkin 
 | |
| 				// ======================
 | |
| 				#if FIX_GetPlayerSkin
 | |
| 					#if FIXES_Single
 | |
| 						FIXES_gsPlayerSkin[playerid] = 0;
 | |
| 					#else
 | |
| 						SetPVarInt(playerid, FIXES_pvarPlayerSkin, 0);
 | |
| 					#endif
 | |
| 				#endif
 | |
| 				// ======================
 | |
| 				//  END:   GetPlayerSkin 
 | |
| 				// ======================
 | |
| 				
 | |
| 				// =============================
 | |
| 				//  BEGIN: IsPlayerInCheckpoint 
 | |
| 				// =============================
 | |
| 				#if FIX_IsPlayerInCheckpoint
 | |
| 					DisablePlayerCheckpoint(playerid);
 | |
| 				#endif
 | |
| 				// =============================
 | |
| 				//  END:   IsPlayerInCheckpoint 
 | |
| 				// =============================
 | |
| 				
 | |
| 				// =================================
 | |
| 				//  BEGIN: IsPlayerInRaceCheckpoint 
 | |
| 				// =================================
 | |
| 				#if FIX_IsPlayerInRaceCheckpoint
 | |
| 					DisablePlayerRaceCheckpoint(playerid);
 | |
| 				#endif
 | |
| 				// =================================
 | |
| 				//  END:   IsPlayerInRaceCheckpoint 
 | |
| 				// =================================
 | |
| 				
 | |
| 				// ========================
 | |
| 				//  BEGIN: GetPlayerWeapon 
 | |
| 				// ========================
 | |
| 				#if FIX_GetPlayerWeapon
 | |
| 					#if FIXES_Single
 | |
| 						FIXES_gsPlayerWeapon[playerid] = -1;
 | |
| 					#else
 | |
| 						SetPVarInt(playerid, FIXES_pvarPlayerWeapon, -1);
 | |
| 					#endif
 | |
| 				#endif
 | |
| 				// ========================
 | |
| 				//  END:   GetPlayerWeapon 
 | |
| 				// ========================
 | |
| 				
 | |
| 				// ==========================
 | |
| 				//  BEGIN: GetPlayerInterior 
 | |
| 				// ==========================
 | |
| 				#if FIX_GetPlayerInterior
 | |
| 					#if FIXES_Single
 | |
| 						FIXES_gsInterior[playerid] = 0;
 | |
| 					#else
 | |
| 						SetPVarInt(playerid, FIXES_pvarPlayerInterior, 0);
 | |
| 					#endif
 | |
| 				#endif
 | |
| 				// ==========================
 | |
| 				//  END:   GetPlayerInterior 
 | |
| 				// ==========================
 | |
| 				
 | |
| 				// =========================
 | |
| 				//  BEGIN: OnDialogResponse 
 | |
| 				// =========================
 | |
| 				#if FIX_OnDialogResponse || FIX_GetPlayerDialog
 | |
| 					#if FIXES_Single
 | |
| 						FIXES_gsDialogID[playerid] = INVALID_DIALOG_ID;
 | |
| 					#else
 | |
| 						SetPVarInt(playerid, FIXES_pvarPlayerDialog, INVALID_DIALOG_ID);
 | |
| 					#endif
 | |
| 				#endif
 | |
| 				// =========================
 | |
| 				//  END:   OnDialogResponse 
 | |
| 				// =========================
 | |
| 				
 | |
| 				// =============================
 | |
| 				//  BEGIN: PlayerDialogResponse 
 | |
| 				// =============================
 | |
| 				#if FIX_PlayerDialogResponse
 | |
| 					ShowPlayerDialog(playerid, -1, 0, FIXES_gscSpace, FIXES_gscSpace, FIXES_gscSpace, FIXES_gscSpace);
 | |
| 				#endif
 | |
| 				// =============================
 | |
| 				//  END:   PlayerDialogResponse 
 | |
| 				// =============================
 | |
| 				
 | |
| 				// =====================
 | |
| 				//  BEGIN: SetSpawnInfo 
 | |
| 				// =====================
 | |
| 				#if FIX_SetSpawnInfo
 | |
| 					SetSpawnInfo(playerid, NO_TEAM, 0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0);
 | |
| 				#endif
 | |
| 				// =====================
 | |
| 				//  END:   SetSpawnInfo 
 | |
| 				// =====================
 | |
| 				
 | |
| 				// ======================
 | |
| 				//  BEGIN: OnPlayerSpawn 
 | |
| 				// ======================
 | |
| 				#if FIX_OnPlayerSpawn
 | |
| 					#if FIXES_Single
 | |
| 						FIXES_gsLastCash[playerid] = 0;
 | |
| 					#else
 | |
| 						SetPVarInt(playerid, FIXES_pvarPlayerLastCash, 0);
 | |
| 					#endif
 | |
| 				#endif
 | |
| 				// ======================
 | |
| 				//  END:   OnPlayerSpawn 
 | |
| 				// ======================
 | |
| 				
 | |
| 				#if !FIXES_Single
 | |
| 					// No longer their first time.
 | |
| 					SetPVarInt(playerid, FIXES_pvarNotNewPlayer, 1);
 | |
| 				#endif
 | |
| 			}
 | |
| 		// =============
 | |
| 		//  BEGIN: Kick 
 | |
| 		// =============
 | |
| 		#if FIX_Kick || FIX_SetPlayerTime || FIX_SetPlayerColour
 | |
| 			new
 | |
| 				ret = FIXES_OnPlayerConnect(playerid);
 | |
| 			FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_ON_PLAYER_CONNECT;
 | |
| 			return ret;
 | |
| 		#else
 | |
| 			return FIXES_OnPlayerConnect(playerid);
 | |
| 		#endif
 | |
| 		// =============
 | |
| 		//  END:   Kick 
 | |
| 		// =============
 | |
| 	}
 | |
| 	
 | |
| 	#if defined _ALS_OnPlayerConnect
 | |
| 		#error _ALS_OnPlayerConnect defined
 | |
| 	#endif
 | |
| 	#define _ALS_OnPlayerConnect
 | |
| 	#define OnPlayerConnect(%0) FIXES_OnPlayerConnect(%0) <_ALS : _ALS_go>
 | |
| 	
 | |
| 	_FIXES_FORWARD FIXES_OnPlayerConnect(playerid);
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * OnPlayerDisconnect(playerid, reason)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     SetPlayerAttachedObject
 | |
|  *     IsPlayerAttachedObjectSlotUsed
 | |
|  *     Kick
 | |
|  *     GetPlayerMenu
 | |
|  */
 | |
| 
 | |
| #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 || FIX_ApplyAnimation_2
 | |
| 	public OnPlayerDisconnect(playerid, reason)
 | |
| 	{
 | |
| 		new
 | |
| 			ret = FIXES_OnPlayerDisconnect(playerid, reason);
 | |
| 		
 | |
| 		// =========================
 | |
| 		//  BEGIN: ApplyAnimation_2 
 | |
| 		// =========================
 | |
| 		#if FIX_ApplyAnimation_2
 | |
| 			if (FIXES_gsAnimTimer[playerid])
 | |
| 			{
 | |
| 				KillTimer(FIXES_gsAnimTimer[playerid]),
 | |
| 				FIXES_gsAnimTimer[playerid] = 0;
 | |
| 			}
 | |
| 		#endif
 | |
| 		// =======================
 | |
| 		//  END: ApplyAnimation_2 
 | |
| 		// =======================
 | |
| 		
 | |
| 		// ======================
 | |
| 		//  BEGIN: GetPlayerMenu 
 | |
| 		// ======================
 | |
| 		#if FIX_GetPlayerMenu
 | |
| 			FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
 | |
| 		#endif
 | |
| 		// ======================
 | |
| 		//  END:   GetPlayerMenu 
 | |
| 		// ======================
 | |
| 		
 | |
| 		// ==========================
 | |
| 		//  BEGIN: FIXES_SilentKick 
 | |
| 		// ==========================
 | |
| 		#if FIXES_SilentKick && (FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2)
 | |
| 			new
 | |
| 				shift = FIXES_gsPlayerIP[playerid];
 | |
| 			if (shift != -1)
 | |
| 			{
 | |
| 				// Unban the IP (timed out).
 | |
| 				new
 | |
| 					ip[16];
 | |
| 				format(ip, sizeof (ip), "unbanip %d.%d.%d.%d", shift >>> 24, (shift >>> 16) & 0xFF, (shift >>> 8) & 0xFF, shift & 0xFF),
 | |
| 				FIXES_gsPlayerIP[playerid] = -1;
 | |
| 			}
 | |
| 		#endif
 | |
| 		// ==========================
 | |
| 		//  END:   FIXES_SilentKick 
 | |
| 		// ==========================
 | |
| 		
 | |
| 		// ================================
 | |
| 		//  BEGIN: SetPlayerAttachedObject 
 | |
| 		// ================================
 | |
| 		#if FIX_SetPlayerAttachedObject
 | |
| 			#if !(FIXES_SilentKick && (FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2))
 | |
| 				new
 | |
| 			#endif
 | |
| 					shift = playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS;
 | |
| 			#pragma tabsize 4
 | |
| 			new
 | |
| 				slot = playerid / _FIXES_ATTACHMENTS;
 | |
| 			#if !FIXES_Single
 | |
| 				if (!_FIXES_gIsFilterscript)
 | |
| 			#endif
 | |
| 				{
 | |
| 					for (new i = 0; i != MAX_PLAYER_ATTACHED_OBJECTS; ++i)
 | |
| 					{
 | |
| 						if (FIXES_gsObjectSlots[slot] & 1 << shift + i)
 | |
| 						{
 | |
| 							RemovePlayerAttachedObject(playerid, i);
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 			#pragma tabsize 4
 | |
| 			FIXES_gsObjectSlots[slot] &= ~((1 << MAX_PLAYER_ATTACHED_OBJECTS) - 1 << shift);
 | |
| 		#endif
 | |
| 		// ================================
 | |
| 		//  END:   SetPlayerAttachedObject 
 | |
| 		// ================================
 | |
| 		
 | |
| 		// =======================================
 | |
| 		//  BEGIN: IsPlayerAttachedObjectSlotUsed 
 | |
| 		// =======================================
 | |
| 		#if FIX_IsPlayerAttachedObjSlotUsed && !FIX_SetPlayerAttachedObject
 | |
| 			FIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] &= ~((1 << MAX_PLAYER_ATTACHED_OBJECTS) - 1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS);
 | |
| 		#endif
 | |
| 		// =======================================
 | |
| 		//  END:   IsPlayerAttachedObjectSlotUsed 
 | |
| 		// =======================================
 | |
| 		
 | |
| 		// =============
 | |
| 		//  BEGIN: Kick 
 | |
| 		// =============
 | |
| 		#if FIX_Kick
 | |
| 			if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_KICKED)
 | |
| 			{
 | |
| 				// Stop the timer if it is still running.
 | |
| 				KillTimer(GetPVarInt(playerid, FIXES_pvarKick));
 | |
| 			}
 | |
| 		#endif
 | |
| 		// =============
 | |
| 		//  END:   Kick 
 | |
| 		// =============
 | |
| 		
 | |
| 		#if _FIX_Menus || FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
 | |
| 			_FIXES_RemoveInternal(FIXES_gsPlayersIterator, playerid, MAX_PLAYERS);
 | |
| 		#endif
 | |
| 		
 | |
| 		return ret;
 | |
| 	}
 | |
| 	
 | |
| 	#if defined _ALS_OnPlayerDisconnect
 | |
| 		#error _ALS_OnPlayerDisconnect defined
 | |
| 	#endif
 | |
| 	#define _ALS_OnPlayerDisconnect
 | |
| 	#define OnPlayerDisconnect(%0) FIXES_OnPlayerDisconnect(%0) <_ALS : _ALS_go>
 | |
| 	
 | |
| 	_FIXES_FORWARD FIXES_OnPlayerDisconnect(playerid, reason);
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * OnPlayerDeath(playerid, killerid, reason)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     OnPlayerDeath
 | |
|  *     OnPlayerSpawn
 | |
|  */
 | |
| 
 | |
| #if FIX_OnPlayerDeath || FIX_OnPlayerSpawn
 | |
| 	public OnPlayerDeath(playerid, killerid, reason)
 | |
| 	{
 | |
| 		_FIXES_IS_IN_CHARGE()
 | |
| 		{
 | |
| 			// ======================
 | |
| 			//  BEGIN: OnPlayerDeath 
 | |
| 			// ======================
 | |
| 			#if FIX_OnPlayerDeath
 | |
| 				static
 | |
| 					sAnimlib[32],
 | |
| 					sAnimname[32];
 | |
| 				GetAnimationName(FIXES_gsLastAnimation[playerid], sAnimlib, sizeof (sAnimlib), sAnimname, sizeof (sAnimname));
 | |
| 				if (strcmp(sAnimlib, "PED", true))
 | |
| 				{
 | |
| 					ClearAnimations(playerid);
 | |
| 				}
 | |
| 			#endif
 | |
| 			// ======================
 | |
| 			//  END:   OnPlayerDeath 
 | |
| 			// ======================
 | |
| 		}
 | |
| 		
 | |
| 		// ======================
 | |
| 		//  BEGIN: OnPlayerSpawn 
 | |
| 		// ======================
 | |
| 		#if FIX_OnPlayerSpawn
 | |
| 			new
 | |
| 				ret = FIXES_OnPlayerDeath(playerid, killerid, reason);
 | |
| 			
 | |
| 			#if FIXES_Single
 | |
| 				FIXES_gsLastCash[playerid] = GetPlayerMoney(playerid);
 | |
| 			#else
 | |
| 				SetPVarInt(playerid, FIXES_pvarPlayerLastCash, GetPlayerMoney(playerid));
 | |
| 			#endif
 | |
| 			
 | |
| 			return ret;
 | |
| 		#else
 | |
| 			return FIXES_OnPlayerDeath(playerid, killerid, reason);
 | |
| 		#endif
 | |
| 		// ======================
 | |
| 		//  END:   OnPlayerSpawn 
 | |
| 		// ======================
 | |
| 	}
 | |
| 	
 | |
| 	#if defined _ALS_OnPlayerDeath
 | |
| 		#error _ALS_OnPlayerDeath defined
 | |
| 	#endif
 | |
| 	#define _ALS_OnPlayerDeath
 | |
| 	#define OnPlayerDeath(%0) FIXES_OnPlayerDeath(%0) <_ALS : _ALS_go>
 | |
| 	
 | |
| 	_FIXES_FORWARD FIXES_OnPlayerDeath(playerid, killerid, reason);
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_SpawnPlayer(playerid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     SpawnPlayer
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_SpawnPlayer
 | |
| 	#error _ALS_SpawnPlayer defined
 | |
| #endif
 | |
| native BAD_SpawnPlayer(playerid) = SpawnPlayer;
 | |
| 
 | |
| #if FIX_SpawnPlayer
 | |
| 	stock FIXES_SpawnPlayer(playerid)
 | |
| 	{
 | |
| 		// Valid "playerid" check inside "GetPlayerVehicleID".
 | |
| 		new
 | |
| 			vid = GetPlayerVehicleID(playerid);
 | |
| 		if (vid)
 | |
| 		{
 | |
| 			new
 | |
| 				Float:x,
 | |
| 				Float:y,
 | |
| 				Float:z;
 | |
| 			// Remove them without the animation.
 | |
| 			GetVehiclePos(vid, x, y, z),
 | |
| 			SetPlayerPos(playerid, x, y, z);
 | |
| 		}
 | |
| 		return SpawnPlayer(playerid);
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_SpawnPlayer
 | |
| 	#define SpawnPlayer FIXES_SpawnPlayer
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_SetPlayerName(playerid, name[])
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     SetPlayerName
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_SetPlayerName
 | |
| 	#error _ALS_SetPlayerName defined
 | |
| #endif
 | |
| native BAD_SetPlayerName(playerid, const name[]) = SetPlayerName;
 | |
| 
 | |
| #if FIX_SetPlayerName
 | |
| 	stock FIXES_SetPlayerName(playerid, name[])
 | |
| 	{
 | |
| 		static
 | |
| 			sOldName[MAX_PLAYER_NAME];
 | |
| 		GetPlayerName(playerid, sOldName, sizeof (sOldName));
 | |
| 		if (!strcmp(name, sOldName, true))
 | |
| 		{
 | |
| 			if(strcmp(name, sOldName, false))
 | |
| 			{
 | |
| 				SetPlayerName(playerid, FIXES_gscTempName);
 | |
| 				if(SetPlayerName(playerid, name) == -1)
 | |
| 				{
 | |
| 					SetPlayerName(playerid, sOldName);
 | |
| 					return -1;
 | |
| 				}
 | |
| 				return 1;
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				return 0;
 | |
| 			}
 | |
| 		}
 | |
| 		return SetPlayerName(playerid, name);
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_SetPlayerName
 | |
| 	#define SetPlayerName FIXES_SetPlayerName
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * OnPlayerRequestClass(playerid, classid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *      OnPlayerRequestClass
 | |
|  */
 | |
| 
 | |
| #if FIX_OnPlayerRequestClass
 | |
| 	public OnPlayerRequestClass(playerid, classid)
 | |
| 	{
 | |
| 		// =============================
 | |
| 		//  BEGIN: OnPlayerRequestClass 
 | |
| 		// =============================
 | |
| 		#if FIX_OnPlayerRequestClass
 | |
| 			new
 | |
| 				Float:x,
 | |
| 				Float:y,
 | |
| 				Float:z;
 | |
| 			GetPlayerPos(playerid, x, y, z),
 | |
| 			RemoveBuildingForPlayer(playerid, 1484, x, y, z, 10.0),
 | |
| 			RemoveBuildingForPlayer(playerid, 1485, x, y, z, 10.0),
 | |
| 			RemoveBuildingForPlayer(playerid, 1486, x, y, z, 10.0);
 | |
| 		#endif
 | |
| 		// ===========================
 | |
| 		//  END: OnPlayerRequestClass 
 | |
| 		// ===========================
 | |
| 		return FIXES_OnPlayerRequestClass(playerid, classid);
 | |
| 	}
 | |
| 	
 | |
| 	#if defined _ALS_OnPlayerRequestClass
 | |
| 		#error _ALS_OnPlayerRequestClass defined
 | |
| 	#endif
 | |
| 	#define _ALS_OnPlayerRequestClass
 | |
| 	#define OnPlayerRequestClass(%0) FIXES_OnPlayerRequestClass(%0) <_ALS : _ALS_go>
 | |
| 	
 | |
| 	_FIXES_FORWARD FIXES_OnPlayerRequestClass(playerid, classid);
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * OnPlayerSpawn(playerid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     GetPlayerSkin
 | |
|  *     TogglePlayerControllable
 | |
|  *     GetPlayerInterior
 | |
|  *     OnPlayerSpawn
 | |
|  *     GameText
 | |
|  */
 | |
| 
 | |
| #if FIX_GetPlayerSkin || FIX_TogglePlayerControllable || FIX_GetPlayerInterior || FIX_OnPlayerSpawn || FIX_GameText
 | |
| 	public OnPlayerSpawn(playerid)
 | |
| 	{
 | |
| 		_FIXES_IS_IN_CHARGE()
 | |
| 		{
 | |
| 			// ======================
 | |
| 			//  BEGIN: OnPlayerSpawn 
 | |
| 			// ======================
 | |
| 			#if FIX_OnPlayerSpawn
 | |
| 				ResetPlayerMoney(playerid);
 | |
| 				#if FIXES_Single
 | |
| 					GivePlayerMoney(playerid, FIXES_gsLastCash[playerid]);
 | |
| 					FIXES_gsLastCash[playerid] = 0;
 | |
| 				#else
 | |
| 					GivePlayerMoney(playerid, GetPVarInt(playerid, FIXES_pvarPlayerLastCash));
 | |
| 					SetPVarInt(playerid, FIXES_pvarPlayerLastCash, 0);
 | |
| 				#endif
 | |
| 			#endif
 | |
| 			// ======================
 | |
| 			//  END:   OnPlayerSpawn 
 | |
| 			// ======================
 | |
| 			
 | |
| 			// ==========================
 | |
| 			//  BEGIN: GetPlayerInterior 
 | |
| 			// ==========================
 | |
| 			#if FIX_GetPlayerInterior
 | |
| 				#if FIXES_Single
 | |
| 					FIXES_gsInterior[playerid] = 0;
 | |
| 				#else
 | |
| 					SetPVarInt(playerid, FIXES_pvarPlayerInterior, 0);
 | |
| 				#endif
 | |
| 			#endif
 | |
| 			// ==========================
 | |
| 			//  END:   GetPlayerInterior 
 | |
| 			// ==========================
 | |
| 			
 | |
| 			// =================
 | |
| 			//  BEGIN: GameText 
 | |
| 			// =================
 | |
| 			#if FIX_GameText
 | |
| 				// Per-player GTs.
 | |
| 				
 | |
| 				#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)
 | |
| 				
 | |
| 				#if FIX_GameTextStyles
 | |
| 					_FIXES_PER_PLAYER_GT(13);
 | |
| 					_FIXES_PER_PLAYER_GT(12);
 | |
| 					_FIXES_PER_PLAYER_GT(11);
 | |
| 					_FIXES_PER_PLAYER_GT(10);
 | |
| 					_FIXES_PER_PLAYER_GT(9);
 | |
| 					_FIXES_PER_PLAYER_GT(8);
 | |
| 					_FIXES_PER_PLAYER_GT(7);
 | |
| 				#endif
 | |
| 				_FIXES_PER_PLAYER_GT(6);
 | |
| 				_FIXES_PER_PLAYER_GT(5);
 | |
| 				_FIXES_PER_PLAYER_GT(4);
 | |
| 				_FIXES_PER_PLAYER_GT(3);
 | |
| 				_FIXES_PER_PLAYER_GT(2);
 | |
| 				_FIXES_PER_PLAYER_GT(1);
 | |
| 				_FIXES_PER_PLAYER_GT(0);
 | |
| 				
 | |
| 				#undef _FIXES_PER_PLAYER_GT
 | |
| 				
 | |
| 				// Global GTs.
 | |
| 				#if FIX_GameTextStyles
 | |
| 					TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[13]),
 | |
| 					TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[12]),
 | |
| 					TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[11]),
 | |
| 					TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[10]),
 | |
| 					TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[9]),
 | |
| 					TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[8]),
 | |
| 					TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[7]);
 | |
| 				#endif
 | |
| 				TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[6]),
 | |
| 				TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[5]),
 | |
| 				TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[4]),
 | |
| 				TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[3]),
 | |
| 				TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[2]),
 | |
| 				TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[1]),
 | |
| 				TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[0]);
 | |
| 				
 | |
| 			#endif
 | |
| 			// =================
 | |
| 			//  END:   GameText 
 | |
| 			// =================
 | |
| 		}
 | |
| 		
 | |
| 		// ======================
 | |
| 		//  BEGIN: GetPlayerSkin 
 | |
| 		// ======================
 | |
| 		#if FIX_GetPlayerSkin
 | |
| 			#if FIXES_Single
 | |
| 				FIXES_gsPlayerSkin[playerid] = GetPlayerSkin(playerid);
 | |
| 			#else
 | |
| 				SetPVarInt(playerid, FIXES_pvarPlayerSkin, GetPlayerSkin(playerid));
 | |
| 			#endif
 | |
| 		#endif
 | |
| 		// ======================
 | |
| 		//  END:   GetPlayerSkin 
 | |
| 		// ======================
 | |
| 		
 | |
| 		// =================================
 | |
| 		//  BEGIN: TogglePlayerControllable 
 | |
| 		// =================================
 | |
| 		#if FIX_TogglePlayerControllable
 | |
| 			FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_UNCONTROLLABLE;
 | |
| 		#endif
 | |
| 		// =================================
 | |
| 		//  END:   TogglePlayerControllable 
 | |
| 		// =================================
 | |
| 		
 | |
| 		return FIXES_OnPlayerSpawn(playerid);
 | |
| 	}
 | |
| 	
 | |
| 	#if defined _ALS_OnPlayerSpawn
 | |
| 		#error _ALS_OnPlayerSpawn defined
 | |
| 	#endif
 | |
| 	#define _ALS_OnPlayerSpawn
 | |
| 	#define OnPlayerSpawn(%0) FIXES_OnPlayerSpawn(%0) <_ALS : _ALS_go>
 | |
| 	
 | |
| 	_FIXES_FORWARD FIXES_OnPlayerSpawn(playerid);
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * OnVehicleMod(playerid, vehicleid, componentid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     OnVehicleMod
 | |
|  */
 | |
| 
 | |
| #if FIX_OnVehicleMod
 | |
| 	public OnVehicleMod(playerid, vehicleid, componentid)
 | |
| 	{
 | |
| 		#if !FIXES_Single
 | |
| 			if (!(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE))
 | |
| 			{
 | |
| 				return FIXES_OnVehicleMod(playerid, vehicleid, componentid);
 | |
| 			}
 | |
| 		#endif
 | |
| 		
 | |
| 		// =====================
 | |
| 		//  BEGIN: OnVehicleMod 
 | |
| 		// =====================
 | |
| 		new
 | |
| 			modelid = GetVehicleModel(vehicleid);
 | |
| 		if (_FIXES_IN_RANGE(modelid, 400, 611 + 1))
 | |
| 		{
 | |
| 			switch (componentid)
 | |
| 			{
 | |
| 				case 1000 .. 1191:
 | |
| 				{
 | |
| 					if (FIXES_gscVehicleMods[(modelid - 400) * 6 + (componentid - 1000 >>> 5)] & 1 << (componentid - 1000 & 0b00011111))
 | |
| 					{
 | |
| 						return FIXES_OnVehicleMod(playerid, vehicleid, componentid);
 | |
| 					}
 | |
| 				}
 | |
| 				case 1192, 1193:
 | |
| 				{
 | |
| 					if (modelid == 576)
 | |
| 					{
 | |
| 						// This save a whole cell off EVERY other vehicle!  This
 | |
| 						// is the ONLY vehicle with any mods over "6 * 32 + 999"
 | |
| 						// (1191), the highest value you can fit in 6 cells of a
 | |
| 						// bit array (minus 1000).
 | |
| 						return FIXES_OnVehicleMod(playerid, vehicleid, componentid);
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		// Desync the player entirely.
 | |
| 		FIXES_BlockUpdate(playerid, true);
 | |
| 		return 0;
 | |
| 		// =====================
 | |
| 		//  END:   OnVehicleMod 
 | |
| 		// =====================
 | |
| 	}
 | |
| 	
 | |
| 	#if defined _ALS_OnVehicleMod
 | |
| 		#error _ALS_OnVehicleMod defined
 | |
| 	#endif
 | |
| 	#define _ALS_OnVehicleMod
 | |
| 	#define OnVehicleMod(%0) FIXES_OnVehicleMod(%0) <_ALS : _ALS_go>
 | |
| 	
 | |
| 	_FIXES_FORWARD FIXES_OnVehicleMod(playerid, vehicleid, componentid);
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_SetPlayerSkin(playerid, skinid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     GetPlayerSkin
 | |
|  *     SetPlayerSkin
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_SetPlayerSkin
 | |
| 	#error _ALS_SetPlayerSkin defined
 | |
| #endif
 | |
| native BAD_SetPlayerSkin(playerid, skinid) = SetPlayerSkin;
 | |
| 
 | |
| #if FIX_GetPlayerSkin || FIX_SetPlayerSkin
 | |
| 	stock FIXES_SetPlayerSkin(playerid, skinid)
 | |
| 	{
 | |
| 		// ======================
 | |
| 		//  BEGIN: SetPlayerSkin 
 | |
| 		// ======================
 | |
| 		#if FIX_SetPlayerSkin
 | |
| 			new
 | |
| 				vehicleid = GetPlayerVehicleID(playerid);
 | |
| 			if (vehicleid)
 | |
| 			{
 | |
| 				new
 | |
| 					seat = GetPlayerVehicleSeat(playerid);
 | |
| 				ClearAnimations(playerid);
 | |
| 				new
 | |
| 					ret = SetPlayerSkin(playerid, skinid);
 | |
| 				PutPlayerInVehicle(playerid, vehicleid, seat);
 | |
| 				
 | |
| 				// ======================
 | |
| 				//  BEGIN: GetPlayerSkin 
 | |
| 				// ======================
 | |
| 				#if FIX_GetPlayerSkin
 | |
| 					#if FIXES_Single
 | |
| 						FIXES_gsPlayerSkin[playerid] = skinid;
 | |
| 					#else
 | |
| 						SetPVarInt(playerid, FIXES_pvarPlayerSkin, skinid);
 | |
| 					#endif
 | |
| 				#endif
 | |
| 				// ======================
 | |
| 				//  END:   GetPlayerSkin 
 | |
| 				// ======================
 | |
| 				
 | |
| 				return ret;
 | |
| 			}
 | |
| 			
 | |
| 			// ======================
 | |
| 			//  BEGIN: GetPlayerSkin 
 | |
| 			// ======================
 | |
| 			#if FIX_GetPlayerSkin
 | |
| 				else
 | |
| 			#endif
 | |
| 			// ======================
 | |
| 			//  END:   GetPlayerSkin 
 | |
| 			// ======================
 | |
| 		#endif
 | |
| 		// ======================
 | |
| 		//  END:   SetPlayerSkin 
 | |
| 		// ======================
 | |
| 		
 | |
| 		// ======================
 | |
| 		//  BEGIN: GetPlayerSkin 
 | |
| 		// ======================
 | |
| 		#if FIX_GetPlayerSkin
 | |
| 			// Watch fot the "else" above if this code ever changes.
 | |
| 			#if FIXES_Single
 | |
| 				FIXES_gsPlayerSkin[playerid] = skinid;
 | |
| 			#else
 | |
| 				SetPVarInt(playerid, FIXES_pvarPlayerSkin, skinid);
 | |
| 			#endif
 | |
| 		#endif
 | |
| 		// ======================
 | |
| 		//  END:   GetPlayerSkin 
 | |
| 		// ======================
 | |
| 		
 | |
| 		return SetPlayerSkin(playerid, skinid);
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_SetPlayerSkin
 | |
| 	#define SetPlayerSkin FIXES_SetPlayerSkin
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_GetPlayerSkin(playerid, skinid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     GetPlayerSkin
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_GetPlayerSkin
 | |
| 	#error _ALS_GetPlayerSkin defined
 | |
| #endif
 | |
| native BAD_GetPlayerSkin(playerid) = GetPlayerSkin;
 | |
| 
 | |
| #if FIX_GetPlayerSkin
 | |
| 	stock FIXES_GetPlayerSkin(playerid)
 | |
| 	{
 | |
| 		#if FIXES_Single
 | |
| 			return FIXES_gsPlayerSkin[playerid];
 | |
| 		#else
 | |
| 			return GetPVarInt(playerid, FIXES_pvarPlayerSkin);
 | |
| 		#endif
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_GetPlayerSkin
 | |
| 	#define GetPlayerSkin FIXES_GetPlayerSkin
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_GetWeaponName(weaponid, weapon[], len)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     GetWeaponName
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_GetWeaponName
 | |
| 	#error _ALS_GetWeaponName defined
 | |
| #endif
 | |
| native BAD_GetWeaponName(weaponid, weapon[], len) = GetWeaponName;
 | |
| 
 | |
| #if FIX_GetWeaponName
 | |
| 	stock FIXES_GetWeaponName(weaponid, weapon[], len)
 | |
| 	{
 | |
| 		switch (weaponid)
 | |
| 		{
 | |
| 			case 18:
 | |
| 			{
 | |
| 				return
 | |
| 					weapon[0] = 0,
 | |
| 					strcat(weapon, "Molotov Cocktail", len),
 | |
| 					1;
 | |
| 			}
 | |
| 			case 44:
 | |
| 			{
 | |
| 				return
 | |
| 					weapon[0] = 0,
 | |
| 					strcat(weapon, "Night Vision Goggles", len),
 | |
| 					1;
 | |
| 			}
 | |
| 			case 45:
 | |
| 			{
 | |
| 				return
 | |
| 					weapon[0] = 0,
 | |
| 					strcat(weapon, "Thermal Goggles", len),
 | |
| 					1;
 | |
| 			}
 | |
| 			default:
 | |
| 			{
 | |
| 				return GetWeaponName(weaponid, weapon, len);
 | |
| 			}
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_GetWeaponName
 | |
| 	#define GetWeaponName FIXES_GetWeaponName
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * OnPlayerUpdate(playerid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     SetPlayerWorldBounds
 | |
|  *     TogglePlayerControllable
 | |
|  *     AllowInteriorWeapons
 | |
|  *     OnPlayerDeath
 | |
|  *     Kick
 | |
|  *     OnVehicleMod
 | |
|  *     OnPlayerEnterVehicle
 | |
|  *     OnPlayerEnterVehicle_2
 | |
|  */
 | |
| 
 | |
| #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_AllowInteriorWeapons || FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2 || FIX_OnPlayerDeath || FIX_Kick || FIX_OnVehicleMod
 | |
| 	public OnPlayerUpdate(playerid)
 | |
| 	{
 | |
| 		// =============================
 | |
| 		//  BEGIN: OnPlayerEnterVehicle 
 | |
| 		// =============================
 | |
| 		#if FIX_OnPlayerEnterVehicle || FIX_Kick || FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle_2
 | |
| 			if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_BLOCK)
 | |
| 			{
 | |
| 				return 0;
 | |
| 			}
 | |
| 		#endif
 | |
| 		// =============================
 | |
| 		//  END:   OnPlayerEnterVehicle 
 | |
| 		// =============================
 | |
| 		
 | |
| 		#if !FIXES_Single
 | |
| 			if (!(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE))
 | |
| 			{
 | |
| 				return FIXES_OnPlayerUpdate(playerid);
 | |
| 			}
 | |
| 		#endif
 | |
| 		
 | |
| 		#if FIX_OnPlayerEnterVehicle || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
 | |
| 			new
 | |
| 				e_FIXES_BOOLS:pbools = FIXES_gsPlayerBools[playerid];
 | |
| 		#endif
 | |
| 		
 | |
| 		// =============================
 | |
| 		//  BEGIN: AllowInteriorWeapons 
 | |
| 		// =============================
 | |
| 		#if FIX_AllowInteriorWeapons
 | |
| 			if (pbools & e_FIXES_BOOLS_INTERIOR)
 | |
| 			{
 | |
| 				// DONE: May need integration with "FIX_GetPlayerWeapon".
 | |
| 				SetPlayerArmedWeapon(playerid, 0);
 | |
| 			}
 | |
| 		#endif
 | |
| 		// ============================
 | |
| 		//  END: AllowInteriorWeapons 
 | |
| 		// ============================
 | |
| 		
 | |
| 		#if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
 | |
| 			new
 | |
| 				ud,
 | |
| 				lr,
 | |
| 				keys;
 | |
| 			GetPlayerKeys(playerid, keys, ud, lr);
 | |
| 		#endif
 | |
| 		
 | |
| 		#if FIX_SetPlayerWorldBounds && !FIX_TogglePlayerControllable
 | |
| 			#pragma unused ud, lr
 | |
| 		#endif
 | |
| 		
 | |
| 		// =============================
 | |
| 		//  BEGIN: SetPlayerWorldBounds 
 | |
| 		// =============================
 | |
| 		#if FIX_SetPlayerWorldBounds
 | |
| 			if (pbools & e_FIXES_BOOLS_WORLDBOUNDS && keys & _FIXES_KEY_AIM)
 | |
| 			{
 | |
| 				new
 | |
| 					Float:x,
 | |
| 					Float:y,
 | |
| 					Float:z;
 | |
| 				GetPlayerPos(playerid, x, y, z);
 | |
| 				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])
 | |
| 				{
 | |
| 					FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PX] = x,
 | |
| 					FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PY] = y,
 | |
| 					FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PZ] = z;
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					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]);
 | |
| 				}
 | |
| 			}
 | |
| 		#endif
 | |
| 		// =============================
 | |
| 		//  END:   SetPlayerWorldBounds 
 | |
| 		// =============================
 | |
| 		
 | |
| 		// ======================
 | |
| 		//  BEGIN: OnPlayerDeath 
 | |
| 		// ======================
 | |
| 		#if FIX_OnPlayerDeath
 | |
| 			FIXES_gsLastAnimation[playerid] = GetPlayerAnimationIndex(playerid);
 | |
| 		#endif
 | |
| 		// ======================
 | |
| 		//  END:   OnPlayerDeath 
 | |
| 		// ======================
 | |
| 		
 | |
| 		// =================================
 | |
| 		//  BEGIN: TogglePlayerControllable 
 | |
| 		// =================================
 | |
| 		#if FIX_TogglePlayerControllable
 | |
| 			// MUST come last.
 | |
| 			if (pbools & e_FIXES_BOOLS_UNCONTROLLABLE)
 | |
| 			{
 | |
| 				// Keys based sync blocking, modified based on a post by Slice:
 | |
| 				// http://forum.sa-mp.com/showpost.php?p=876854  Use "playerid"
 | |
| 				// here as it's a variable that already exists, but note that
 | |
| 				// after this point, you CANNOT use "playerid" as it has been
 | |
| 				// "clobbered" (and yes, that's the technical term).  This is
 | |
| 				// just to avoid "statement has no effect" warnings.  ALWAYS
 | |
| 				// return 0 in this case, regardless of what other callbacks
 | |
| 				// return.
 | |
| 				playerid = FIXES_OnPlayerUpdate(playerid);
 | |
| 				if (keys || ud || lr)
 | |
| 				{
 | |
| 					return 0;
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					return playerid;
 | |
| 				}
 | |
| 			}
 | |
| 		#endif
 | |
| 		// =================================
 | |
| 		//  END:   TogglePlayerControllable 
 | |
| 		// =================================
 | |
| 		
 | |
| 		return FIXES_OnPlayerUpdate(playerid);
 | |
| 	}
 | |
| 	
 | |
| 	#if defined _ALS_OnPlayerUpdate
 | |
| 		#error _ALS_OnPlayerUpdate defined
 | |
| 	#endif
 | |
| 	#define _ALS_OnPlayerUpdate
 | |
| 	#define OnPlayerUpdate(%0) FIXES_OnPlayerUpdate(%0) <_ALS : _ALS_go>
 | |
| 	
 | |
| 	_FIXES_FORWARD FIXES_OnPlayerUpdate(playerid);
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min)
 | |
|  * 
 | |
|  * TODO: Modify this to remove aim animations when they get to the boundaries.
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     SetPlayerWorldBounds
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_SetPlayerWorldBounds
 | |
| 	#error _ALS_SetPlayerWorldBounds defined
 | |
| #endif
 | |
| native BAD_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min) = SetPlayerWorldBounds;
 | |
| 
 | |
| #if FIX_SetPlayerWorldBounds
 | |
| 	#if FIXES_Single
 | |
| 		stock FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min)
 | |
| 		{
 | |
| 			if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
 | |
| 			{
 | |
| 				FIXES_PRINTF("Call SetPlayerWorldBounds");
 | |
| 				if (x_max == x_min || y_max == y_min)
 | |
| 				{
 | |
| 					// Impossibly small area, disable checks entirely.
 | |
| 					return
 | |
| 						FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_WORLDBOUNDS,
 | |
| 						SetPlayerWorldBounds(playerid, _FIXES_INFINITY, _FIXES_N_INFINITY, _FIXES_INFINITY, _FIXES_N_INFINITY);
 | |
| 				}
 | |
| 				// This code could do with a way to mostly remove the checks.  Maybe
 | |
| 				// when setting everything to FIXES_INFINITY (with default
 | |
| 				// parameters).
 | |
| 				FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_WORLDBOUNDS;
 | |
| 				new
 | |
| 					Float:tmp;
 | |
| 				if (x_max < x_min)
 | |
| 				{
 | |
| 					tmp = x_min,
 | |
| 					x_min = x_max,
 | |
| 					x_max = tmp;
 | |
| 				}
 | |
| 				if (y_max < y_min)
 | |
| 				{
 | |
| 					tmp = y_min,
 | |
| 					y_min = y_max,
 | |
| 					y_max = tmp;
 | |
| 				}
 | |
| 				// Give a little leway so this fix isn't noticed if you're not
 | |
| 				// trying to break through the world bounds.  Leway removed in
 | |
| 				// favour of keys.
 | |
| 				return
 | |
| 					FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] = x_min,
 | |
| 					FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] = x_max,
 | |
| 					
 | |
| 					FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] = y_min,
 | |
| 					FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY] = y_max,
 | |
| 					
 | |
| 					GetPlayerPos(playerid, tmp, tmp, tmp),
 | |
| 					FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PX] = (x_max - x_min) / 2 + x_min,
 | |
| 					FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PY] = (y_max - y_min) / 2 + y_min,
 | |
| 					FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PZ] = tmp,
 | |
| 					
 | |
| 					SetPlayerWorldBounds(playerid, x_max, x_min, y_max, y_min);
 | |
| 			}
 | |
| 			return 0;
 | |
| 		}
 | |
| 	#else
 | |
| 		forward _FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min);
 | |
| 		
 | |
| 		stock FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min)
 | |
| 		{
 | |
| 			if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
 | |
| 			{
 | |
| 				FIXES_PRINTF("Call SetPlayerWorldBounds");
 | |
| 				return
 | |
| 					CallRemoteFunction(FIXES_gscSetPlayerWorldBounds, FIXES_gscSpec@iffff, playerid, x_max, x_min, y_max, y_min),
 | |
| 					getproperty(5, FIXES_gscReturnProperty);
 | |
| 			}
 | |
| 			return 0;
 | |
| 		}
 | |
| 		
 | |
| 		public _FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min)
 | |
| 		{
 | |
| 			FIXES_PRINTF("_FIXES_SetPlayerWorldBounds: %d %.2f %.2f %.2f %.2f", playerid, x_max, x_min, y_max, y_min);
 | |
| 			_FIXES_IS_IN_CHARGE()
 | |
| 			{
 | |
| 				FIXES_PRINTF("SetPlayerWorldBounds");
 | |
| 				//if (x_max == _FIXES_INFINITY && x_min == _FIXES_INFINITY && y_max == _FIXES_INFINITY && y_min == _FIXES_INFINITY)
 | |
| 				if (x_max == x_min || y_max == y_min)
 | |
| 				{
 | |
| 					// Impossibly small area, disable checks entirely.
 | |
| 					return
 | |
| 						FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_WORLDBOUNDS,
 | |
| 						FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] =
 | |
| 							FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] =
 | |
| 								FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] =
 | |
| 									FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY] =
 | |
| 										0.0,
 | |
| 						setproperty(5, FIXES_gscReturnProperty, SetPlayerWorldBounds(playerid, _FIXES_INFINITY, _FIXES_N_INFINITY, _FIXES_INFINITY, _FIXES_N_INFINITY)),
 | |
| 						-1;
 | |
| 				}
 | |
| 				// This code could do with a way to mostly remove the checks.  Maybe
 | |
| 				// when setting everything to FIXES_INFINITY (with default
 | |
| 				// parameters).
 | |
| 				FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_WORLDBOUNDS;
 | |
| 				new
 | |
| 					Float:tmp;
 | |
| 				if (x_max < x_min)
 | |
| 				{
 | |
| 					tmp = x_min,
 | |
| 					x_min = x_max,
 | |
| 					x_max = tmp;
 | |
| 				}
 | |
| 				if (y_max < y_min)
 | |
| 				{
 | |
| 					tmp = y_min,
 | |
| 					y_min = y_max,
 | |
| 					y_max = tmp;
 | |
| 				}
 | |
| 				// Give a little leway so this fix isn't noticed if you're not
 | |
| 				// trying to break through the world bounds.  Leway removed in
 | |
| 				// favour of keys.
 | |
| 				FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] = x_min,
 | |
| 				FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] = x_max,
 | |
| 				
 | |
| 				FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] = y_min,
 | |
| 				FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY] = y_max,
 | |
| 				
 | |
| 				GetPlayerPos(playerid, tmp, tmp, tmp),
 | |
| 				FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PX] = (x_max - x_min) / 2 + x_min,
 | |
| 				FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PY] = (y_max - y_min) / 2 + y_min,
 | |
| 				FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PZ] = tmp,
 | |
| 				
 | |
| 				setproperty(5, FIXES_gscReturnProperty, SetPlayerWorldBounds(playerid, x_max, x_min, y_max, y_min));
 | |
| 			}
 | |
| 			return 0;
 | |
| 		}
 | |
| 	#endif
 | |
| 	
 | |
| 	#define _ALS_SetPlayerWorldBounds
 | |
| 	#define SetPlayerWorldBounds FIXES_SetPlayerWorldBounds
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_TogglePlayerControllable(playerid, toggle)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     TogglePlayerControllable
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_TogglePlayerControllable
 | |
| 	#error _ALS_TogglePlayerControllable defined
 | |
| #endif
 | |
| native BAD_TogglePlayerControllable(playerid, toggle) = TogglePlayerControllable;
 | |
| 
 | |
| #if FIX_TogglePlayerControllable
 | |
| 	#if FIXES_Single
 | |
| 		stock FIXES_TogglePlayerControllable(playerid, toggle)
 | |
| 		{
 | |
| 			if (TogglePlayerControllable(playerid, toggle))
 | |
| 			{
 | |
| 				if (toggle)
 | |
| 				{
 | |
| 					FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_UNCONTROLLABLE;
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_UNCONTROLLABLE;
 | |
| 				}
 | |
| 				return 1;
 | |
| 			}
 | |
| 			return 0;
 | |
| 		}
 | |
| 	#else
 | |
| 		forward _FIXES_TogglePlayerControllable(playerid, toggle);
 | |
| 		
 | |
| 		stock FIXES_TogglePlayerControllable(playerid, toggle)
 | |
| 		{
 | |
| 			if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
 | |
| 			{
 | |
| 				return
 | |
| 					CallRemoteFunction(FIXES_gscTogglePlayerControl, FIXES_gscSpec@ii, playerid, toggle),
 | |
| 					getproperty(5, FIXES_gscReturnProperty);
 | |
| 			}
 | |
| 			return 0;
 | |
| 		}
 | |
| 		
 | |
| 		public _FIXES_TogglePlayerControllable(playerid, toggle)
 | |
| 		{
 | |
| 			_FIXES_IS_IN_CHARGE()
 | |
| 			{
 | |
| 				if (toggle)
 | |
| 				{
 | |
| 					FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_UNCONTROLLABLE;
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_UNCONTROLLABLE;
 | |
| 				}
 | |
| 				setproperty(5, FIXES_gscReturnProperty, TogglePlayerControllable(playerid, toggle));
 | |
| 			}
 | |
| 		}
 | |
| 	#endif
 | |
| 	
 | |
| 	#define _ALS_TogglePlayerControllable
 | |
| 	#define TogglePlayerControllable FIXES_TogglePlayerControllable
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     AllowInteriorWeapons
 | |
|  *     GetPlayerInterior
 | |
|  */
 | |
| 
 | |
| #if FIX_AllowInteriorWeapons || FIX_GetPlayerInterior
 | |
| 	public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
 | |
| 	{
 | |
| 		// ==========================
 | |
| 		//  BEGIN: GetPlayerInterior 
 | |
| 		// ==========================
 | |
| 		#if FIX_GetPlayerInterior
 | |
| 			#if FIXES_Single
 | |
| 				FIXES_gsInterior[playerid] = newinteriorid;
 | |
| 			#else
 | |
| 				_FIXES_IS_IN_CHARGE()
 | |
| 				{
 | |
| 					SetPVarInt(playerid, FIXES_pvarPlayerInterior, newinteriorid);
 | |
| 				}
 | |
| 			#endif
 | |
| 		#endif
 | |
| 		// ==========================
 | |
| 		//  END:   GetPlayerInterior 
 | |
| 		// ==========================
 | |
| 		
 | |
| 		// =============================
 | |
| 		//  BEGIN: AllowInteriorWeapons 
 | |
| 		// =============================
 | |
| 		#if FIX_AllowInteriorWeapons
 | |
| 			if (newinteriorid)
 | |
| 			{
 | |
| 				if (FIXES_gsSettings & e_FIXES_SETTINGS_INTERIOR)
 | |
| 				{
 | |
| 					// This only needs doing here if "GetPlayerWeapon" is set.
 | |
| 					// If it isn't, even though "AllowInteriorWeapons" can use
 | |
| 					// this code on its own, it doesn't as "OnPlayerUpdate"
 | |
| 					// takes care of it all.
 | |
| 					// TODO: Rewrite this code to use a single bit to indicate
 | |
| 					// if a player can have a weapon or not, and just use the in
 | |
| 					// the "OnPlayerUpdate" callback, instead of several checks.
 | |
| 					// DONE!
 | |
| 					FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_INTERIOR;
 | |
| 					_FIXES_IS_IN_CHARGE()
 | |
| 					{
 | |
| 						SetPlayerArmedWeapon(playerid, 0);
 | |
| 						#if FIX_GetPlayerWeapon
 | |
| 							if (IsPlayerInAnyVehicle(playerid))
 | |
| 							{
 | |
| 								#if FIXES_Single
 | |
| 									FIXES_gsPlayerWeapon[playerid] = 0;
 | |
| 								#else
 | |
| 									SetPVarInt(playerid, FIXES_pvarPlayerWeapon, 0);
 | |
| 								#endif
 | |
| 							}
 | |
| 						#endif
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_INTERIOR;
 | |
| 			}
 | |
| 		#endif
 | |
| 		// ===========================
 | |
| 		//  END: AllowInteriorWeapons 
 | |
| 		// ===========================
 | |
| 		return FIXES_OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid);
 | |
| 	}
 | |
| 	
 | |
| 	#if defined _ALS_OnPlayerInteriorChange
 | |
| 		#error _ALS_OnPlayerInteriorChange defined
 | |
| 	#endif
 | |
| 	#define _ALS_OnPlayerInteriorChange
 | |
| 	#define OnPlayerInteriorChange(%0) FIXES_OnPlayerInteriorChange(%0) <_ALS : _ALS_go>
 | |
| 	
 | |
| 	_FIXES_FORWARD FIXES_OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid);
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_DriveBy(playerid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     DriveBy
 | |
|  */
 | |
| 
 | |
| #if FIX_DriveBy
 | |
| 	forward _FIXES_DriveBy(playerid);
 | |
| 	
 | |
| 	public  _FIXES_DriveBy(playerid)
 | |
| 	{
 | |
| 		if (GetPlayerState(playerid) == PLAYER_STATE_PASSENGER)
 | |
| 		{
 | |
| 			SetPlayerArmedWeapon(playerid, FIXES_gsDriveByWeapon[playerid]);
 | |
| 		}
 | |
| 		return FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_DRIVE_BY;
 | |
| 	}
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     DriveBy
 | |
|  */
 | |
| 
 | |
| #if FIX_DriveBy
 | |
| 	public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
 | |
| 	{
 | |
| 		// ===============================
 | |
| 		//  BEGIN: DriveBy 
 | |
| 		// ===============================
 | |
| 		#if FIX_DriveBy
 | |
| 			#if !FIXES_Single
 | |
| 				if (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)
 | |
| 			#endif
 | |
| 				{
 | |
| 					if ((newkeys & KEY_CROUCH) && !(oldkeys & KEY_CROUCH) && GetPlayerState(playerid) == PLAYER_STATE_PASSENGER && GetPlayerCameraMode(playerid) == 55 && !(FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_DRIVE_BY))
 | |
| 					{
 | |
| 						FIXES_gsDriveByWeapon[playerid] = GetPlayerWeapon(playerid),
 | |
| 						FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_DRIVE_BY,
 | |
| 						SetPlayerArmedWeapon(playerid, 0),
 | |
| 						ApplyAnimation(playerid, "PED", "CAR_GETIN_RHS", 4.1, 0, 0, 0, 0, 1, 1),
 | |
| 						SetTimerEx(FIXES_gscDriveBy, 500, 0, FIXES_gscSpec@i, playerid);
 | |
| 					}
 | |
| 				}
 | |
| 		#endif
 | |
| 		// =============================
 | |
| 		//  END: DriveBy 
 | |
| 		// =============================
 | |
| 		
 | |
| 		return FIXES_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
 | |
| 	}
 | |
| 	
 | |
| 	#if defined _ALS_OnPlayerKeyStateChange
 | |
| 		#error _ALS_OnPlayerKeyStateChange defined
 | |
| 	#endif
 | |
| 	#define _ALS_OnPlayerKeyStateChange
 | |
| 	#define OnPlayerKeyStateChange(%0) FIXES_OnPlayerKeyStateChange(%0) <_ALS : _ALS_go>
 | |
| 	
 | |
| 	_FIXES_FORWARD FIXES_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     OnPlayerEnterVehicle_2
 | |
|  */
 | |
| 
 | |
| #if FIX_OnPlayerEnterVehicle_2
 | |
| 	public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
 | |
| 	{
 | |
| 		// ===============================
 | |
| 		//  BEGIN: OnPlayerEnterVehicle_2 
 | |
| 		// ===============================
 | |
| 		#if FIX_OnPlayerEnterVehicle_2
 | |
| 			if (0 < vehicleid < MAX_VEHICLES)
 | |
| 			{
 | |
| 				return FIXES_OnPlayerEnterVehicle(playerid, vehicleid, ispassenger);
 | |
| 			}
 | |
| 			FIXES_BlockUpdate(playerid, true);
 | |
| 			return 0;
 | |
| 		#endif
 | |
| 		// =============================
 | |
| 		//  END: OnPlayerEnterVehicle_2 
 | |
| 		// =============================
 | |
| 	}
 | |
| 	
 | |
| 	#if defined _ALS_OnPlayerEnterVehicle
 | |
| 		#error _ALS_OnPlayerEnterVehicle defined
 | |
| 	#endif
 | |
| 	#define _ALS_OnPlayerEnterVehicle
 | |
| 	#define OnPlayerEnterVehicle(%0) FIXES_OnPlayerEnterVehicle(%0) <_ALS : _ALS_go>
 | |
| 	
 | |
| 	_FIXES_FORWARD FIXES_OnPlayerEnterVehicle(playerid, vehicleid, ispassenger);
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * OnPlayerExitVehicle(playerid, vehicleid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     OnPlayerEnterVehicle_2
 | |
|  */
 | |
| 
 | |
| #if FIX_OnPlayerEnterVehicle_2
 | |
| 	public OnPlayerExitVehicle(playerid, vehicleid)
 | |
| 	{
 | |
| 		// ===============================
 | |
| 		//  BEGIN: OnPlayerEnterVehicle_2 
 | |
| 		// ===============================
 | |
| 		#if FIX_OnPlayerEnterVehicle_2
 | |
| 			if (0 < vehicleid < MAX_VEHICLES)
 | |
| 			{
 | |
| 				return FIXES_OnPlayerExitVehicle(playerid, vehicleid);
 | |
| 			}
 | |
| 			FIXES_BlockUpdate(playerid, true);
 | |
| 			return 0;
 | |
| 		#endif
 | |
| 		// =============================
 | |
| 		//  END: OnPlayerEnterVehicle_2 
 | |
| 		// =============================
 | |
| 	}
 | |
| 	
 | |
| 	#if defined _ALS_OnPlayerExitVehicle
 | |
| 		#error _ALS_OnPlayerExitVehicle defined
 | |
| 	#endif
 | |
| 	#define _ALS_OnPlayerExitVehicle
 | |
| 	#define OnPlayerExitVehicle(%0) FIXES_OnPlayerExitVehicle(%0) <_ALS : _ALS_go>
 | |
| 	
 | |
| 	_FIXES_FORWARD FIXES_OnPlayerExitVehicle(playerid, vehicleid);
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_BlockUpdate(playerid, bool:block)
 | |
|  * 
 | |
|  * Block a player from using OnPlayerUpdate at all.
 | |
|  */
 | |
| 
 | |
| #if FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2 || FIX_Kick || FIX_OnVehicleMod
 | |
| 	static stock FIXES_BlockUpdate(playerid, bool:block, kick = 6)
 | |
| 	{
 | |
| 		if (kick)
 | |
| 		{
 | |
| 			#if FIXES_SilentKick
 | |
| 				new
 | |
| 					ip[22];
 | |
| 				GetPlayerIp(playerid, ip, sizeof (ip)),
 | |
| 				format(ip, sizeof (ip), "banip %s", ip),
 | |
| 				SendRconCommand(ip),
 | |
| 				FIXES_gsPlayerIP[playerid] = strval(ip[kick]) << 24,
 | |
| 				kick = strfind(ip, FIXES_gscDot, false, kick) + 1,
 | |
| 				FIXES_gsPlayerIP[playerid] |= strval(ip[kick]) << 16,
 | |
| 				kick = strfind(ip, FIXES_gscDot, false, kick) + 1,
 | |
| 				FIXES_gsPlayerIP[playerid] |= strval(ip[kick]) << 8,
 | |
| 				kick = strfind(ip, FIXES_gscDot, false, kick) + 1,
 | |
| 				FIXES_gsPlayerIP[playerid] |= strval(ip[kick]);
 | |
| 			#else
 | |
| 				Kick(playerid);
 | |
| 			#endif
 | |
| 		}
 | |
| 		if (block)
 | |
| 		{
 | |
| 			FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_BLOCK;
 | |
| 			return 0;
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_BLOCK;
 | |
| 			return 1;
 | |
| 		}
 | |
| 	}
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * OnPlayerSelectedMenuRow(playerid, row)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     GetPlayerMenu
 | |
|  */
 | |
| 
 | |
| #if FIX_GetPlayerMenu
 | |
| 	public OnPlayerSelectedMenuRow(playerid, row)
 | |
| 	{
 | |
| 		// ======================
 | |
| 		//  BEGIN: GetPlayerMenu 
 | |
| 		// ======================
 | |
| 		#if FIXES_Single
 | |
| 			FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
 | |
| 			new
 | |
| 				ret = FIXES_OnPlayerSelectedMenuRow(playerid, row);
 | |
| 			if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))
 | |
| 			{
 | |
| 				FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
 | |
| 			}
 | |
| 			return ret;
 | |
| 		#else
 | |
| 			new
 | |
| 				Menu:cur = FIXES_gsCurrentMenu[playerid];
 | |
| 			_FIXES_IS_IN_CHARGE()
 | |
| 			{
 | |
| 				setproperty(5, FIXES_gscMenuProperty, _:cur);
 | |
| 				CallRemoteFunction(FIXES_gscClearPlayerMenu, FIXES_gscSpec@i, playerid);
 | |
| 				FIXES_gsCurrentMenu[playerid] = cur;
 | |
| 				new
 | |
| 					ret = FIXES_OnPlayerSelectedMenuRow(playerid, row);
 | |
| 				if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))
 | |
| 				{
 | |
| 					FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
 | |
| 				}
 | |
| 				return ret;
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				FIXES_gsCurrentMenu[playerid] = Menu:getproperty(5, FIXES_gscMenuProperty);
 | |
| 				FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
 | |
| 				new
 | |
| 					ret = FIXES_OnPlayerSelectedMenuRow(playerid, row);
 | |
| 				if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))
 | |
| 				{
 | |
| 					FIXES_gsCurrentMenu[playerid] = cur;
 | |
| 				}
 | |
| 				return ret;
 | |
| 			}
 | |
| 		#endif
 | |
| 		// ======================
 | |
| 		//  END:   GetPlayerMenu 
 | |
| 		// ======================
 | |
| 	}
 | |
| 	
 | |
| 	#if defined _ALS_OnPlayerSelectedMenuRow
 | |
| 		#error _ALS_OnPlayerSelectedMenuRow defined
 | |
| 	#endif
 | |
| 	#define _ALS_OnPlayerSelectedMenuRow
 | |
| 	#define OnPlayerSelectedMenuRow(%0) FIXES_OnPlayerSelectedMenuRow(%0) <_ALS : _ALS_go>
 | |
| 	
 | |
| 	_FIXES_FORWARD FIXES_OnPlayerSelectedMenuRow(playerid, row);
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * OnPlayerExitedMenu(playerid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     GetPlayerMenu
 | |
|  */
 | |
| 
 | |
| #if FIX_GetPlayerMenu
 | |
| 	public OnPlayerExitedMenu(playerid)
 | |
| 	{
 | |
| 		// ======================
 | |
| 		//  BEGIN: GetPlayerMenu 
 | |
| 		// ======================
 | |
| 		#if FIXES_Single
 | |
| 			FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
 | |
| 			new
 | |
| 				ret = FIXES_OnPlayerExitedMenu(playerid);
 | |
| 			if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))
 | |
| 			{
 | |
| 				FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
 | |
| 			}
 | |
| 			return ret;
 | |
| 		#else
 | |
| 			new
 | |
| 				Menu:cur = FIXES_gsCurrentMenu[playerid];
 | |
| 			_FIXES_IS_IN_CHARGE()
 | |
| 			{
 | |
| 				setproperty(5, FIXES_gscMenuProperty, _:cur);
 | |
| 				CallRemoteFunction(FIXES_gscClearPlayerMenu, FIXES_gscSpec@i, playerid);
 | |
| 				FIXES_gsCurrentMenu[playerid] = cur;
 | |
| 				new
 | |
| 					ret = FIXES_OnPlayerExitedMenu(playerid);
 | |
| 				if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))
 | |
| 				{
 | |
| 					FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
 | |
| 				}
 | |
| 				return ret;
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				FIXES_gsCurrentMenu[playerid] = Menu:getproperty(5, FIXES_gscMenuProperty);
 | |
| 				FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
 | |
| 				new
 | |
| 					ret = FIXES_OnPlayerExitedMenu(playerid);
 | |
| 				if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET))
 | |
| 				{
 | |
| 					FIXES_gsCurrentMenu[playerid] = cur;
 | |
| 				}
 | |
| 				return ret;
 | |
| 			}
 | |
| 		#endif
 | |
| 		// ======================
 | |
| 		//  END:   GetPlayerMenu 
 | |
| 		// ======================
 | |
| 	}
 | |
| 	
 | |
| 	#if defined _ALS_OnPlayerExitedMenu
 | |
| 		#error _ALS_OnPlayerExitedMenu defined
 | |
| 	#endif
 | |
| 	#define _ALS_OnPlayerExitedMenu
 | |
| 	#define OnPlayerExitedMenu(%0) FIXES_OnPlayerExitedMenu(%0) <_ALS : _ALS_go>
 | |
| 	
 | |
| 	_FIXES_FORWARD FIXES_OnPlayerExitedMenu(playerid);
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_IS_VALID_MENU(Menu:menuid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     Menus
 | |
|  */
 | |
| 
 | |
| #if _FIX_Menus
 | |
| 	#define FIXES_IS_VALID_MENU(%0) (_FIXES_IN_RANGE(_:(%0), 0, MAX_MENUS) && (FIXES_gsValidMenus[_:(%0) >>> 5] & (1 << (_:(%0) & 0x1F))))
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * Menu:FIXES_CreateMenu(const title[], columns, Float:x, Float:y, Float:col1width, Float:col2width = 0.0)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     Menus
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_CreateMenu
 | |
| 	#error _ALS_CreateMenu defined
 | |
| #endif
 | |
| native Menu:BAD_CreateMenu(const title[], columns, Float:x, Float:y, Float:col1width, Float:col2width = 0.0) = CreateMenu;
 | |
| 
 | |
| #if _FIX_Menus
 | |
| 	#if !FIXES_Single
 | |
| 		forward _FIXES_CreateMenu(ret);
 | |
| 		
 | |
| 		public _FIXES_CreateMenu(ret)
 | |
| 		{
 | |
| 			FIXES_gsValidMenus[ret >>> 5] |= 1 << (ret & 0x1F);
 | |
| 		}
 | |
| 	#endif
 | |
| 	
 | |
| 	stock Menu:FIXES_CreateMenu(const title[], columns, Float:x, Float:y, Float:col1width, Float:col2width = 0.0)
 | |
| 	{
 | |
| 		new
 | |
| 			Menu:ret = CreateMenu(title, columns, x, y, col1width, col2width);
 | |
| 		if (_FIXES_IN_RANGE(_:ret, 0, MAX_MENUS))
 | |
| 		{
 | |
| 			#if FIXES_Single
 | |
| 				FIXES_gsValidMenus[_:ret >>> 5] |= 1 << (_:ret & 0x1F);
 | |
| 			#else
 | |
| 				CallRemoteFunction("_FIXES_CreateMenu", FIXES_gscSpec@i, _:ret);
 | |
| 			#endif
 | |
| 		}
 | |
| 		return ret;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_CreateMenu
 | |
| 	#define CreateMenu FIXES_CreateMenu
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_SetPlayerMenu(playerid, Menu:menuid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     GetPlayerMenu
 | |
|  */
 | |
| 
 | |
| #if FIX_GetPlayerMenu && !FIXES_Single
 | |
| 	forward _FIXES_SetPlayerMenu(playerid, Menu:menuid);
 | |
| 	
 | |
| 	public _FIXES_SetPlayerMenu(playerid, Menu:menuid)
 | |
| 	{
 | |
| 		FIXES_gsSettings |= e_FIXES_SETTINGS_MENU_SET;
 | |
| 		FIXES_gsCurrentMenu[playerid] = menuid;
 | |
| 	}
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_ClearPlayerMenu(playerid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     GetPlayerMenu
 | |
|  */
 | |
| 
 | |
| #if FIX_GetPlayerMenu && !FIXES_Single
 | |
| 	forward _FIXES_ClearPlayerMenu(playerid);
 | |
| 	
 | |
| 	public _FIXES_ClearPlayerMenu(playerid)
 | |
| 	{
 | |
| 		FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
 | |
| 		FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
 | |
| 	}
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * Menu:FIXES_DestroyMenu(Menu:menuid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     GetPlayerMenu
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_DestroyMenu
 | |
| 	#error _ALS_DestroyMenu defined
 | |
| #endif
 | |
| native BAD_DestroyMenu(Menu:menuid) = DestroyMenu;
 | |
| 
 | |
| #if _FIX_Menus || FIX_GetPlayerMenu
 | |
| 	#if _FIX_Menus && !FIXES_Single
 | |
| 		forward _FIXES_DestroyMenu(ret);
 | |
| 		
 | |
| 		public _FIXES_DestroyMenu(ret)
 | |
| 		{
 | |
| 			FIXES_gsValidMenus[ret >>> 5] &= ~(1 << (ret & 0x1F));
 | |
| 		}
 | |
| 	#endif
 | |
| 	
 | |
| 	stock FIXES_DestroyMenu(Menu:menuid)
 | |
| 	{
 | |
| 		#if _FIX_Menus
 | |
| 			if (FIXES_IS_VALID_MENU(menuid))
 | |
| 		#endif
 | |
| 			{
 | |
| 				if (DestroyMenu(Menu:menuid))
 | |
| 				{
 | |
| 					#if _FIX_Menus
 | |
| 						#if FIXES_Single
 | |
| 							FIXES_gsValidMenus[_:menuid >>> 5] &= ~(1 << (_:menuid & 0x1F));
 | |
| 						#else
 | |
| 							CallRemoteFunction("_FIXES_DestroyMenu", FIXES_gscSpec@i, _:menuid);
 | |
| 						#endif
 | |
| 					#endif
 | |
| 					_FIXES_FOREACH(FIXES_gsPlayersIterator, playerid)
 | |
| 					{
 | |
| 						if (FIXES_gsCurrentMenu[playerid] == menuid)
 | |
| 						{
 | |
| 							if (HideMenuForPlayer(menuid, playerid))
 | |
| 							{
 | |
| 								#if FIXES_Single
 | |
| 									FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
 | |
| 									FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
 | |
| 								#else
 | |
| 									CallRemoteFunction(FIXES_gscSetPlayerMenu, FIXES_gscSpec@ii, playerid, INVALID_MENU);
 | |
| 								#endif
 | |
| 							}
 | |
| 						}
 | |
| 					}
 | |
| 					return 1;
 | |
| 				}
 | |
| 			}
 | |
| 			return 0;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_DestroyMenu
 | |
| 	#define DestroyMenu FIXES_DestroyMenu
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_AddMenuItem(Menu:menuid, column, const menutext[])
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     AddMenuItem
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_AddMenuItem
 | |
| 	#error _ALS_AddMenuItem defined
 | |
| #endif
 | |
| native BAD_AddMenuItem(Menu:menuid, column, const menutext[]) = AddMenuItem;
 | |
| 
 | |
| #if FIX_AddMenuItem
 | |
| 	stock FIXES_AddMenuItem(Menu:menuid, column, const menutext[])
 | |
| 	{
 | |
| 		if (FIXES_IS_VALID_MENU(menuid))
 | |
| 		{
 | |
| 			return AddMenuItem(menuid, column, menutext);
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_AddMenuItem
 | |
| 	#define AddMenuItem FIXES_AddMenuItem
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_SetMenuColumnHeader(Menu:menuid, column, const columnheader[])
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     SetMenuColumnHeader
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_SetMenuColumnHeader
 | |
| 	#error _ALS_SetMenuColumnHeader defined
 | |
| #endif
 | |
| native BAD_SetMenuColumnHeader(Menu:menuid, column, const columnheader[]) = SetMenuColumnHeader;
 | |
| 
 | |
| #if FIX_SetMenuColumnHeader
 | |
| 	stock FIXES_SetMenuColumnHeader(Menu:menuid, column, const columnheader[])
 | |
| 	{
 | |
| 		if (FIXES_IS_VALID_MENU(menuid))
 | |
| 		{
 | |
| 			return SetMenuColumnHeader(menuid, column, columnheader);
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_SetMenuColumnHeader
 | |
| 	#define SetMenuColumnHeader FIXES_SetMenuColumnHeader
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_ShowMenuForPlayer(Menu:menuid, playerid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     ShowMenuForPlayer
 | |
|  *     GetPlayerMenu
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_ShowMenuForPlayer
 | |
| 	#error _ALS_ShowMenuForPlayer defined
 | |
| #endif
 | |
| native BAD_ShowMenuForPlayer(Menu:menuid, playerid) = ShowMenuForPlayer;
 | |
| 
 | |
| #if FIX_ShowMenuForPlayer || FIX_GetPlayerMenu
 | |
| 	stock FIXES_ShowMenuForPlayer(Menu:menuid, playerid)
 | |
| 	{
 | |
| 		#if FIX_ShowMenuForPlayer
 | |
| 			if (FIXES_IS_VALID_MENU(menuid))
 | |
| 		#endif
 | |
| 			{
 | |
| 				#if FIX_GetPlayerMenu
 | |
| 					if (ShowMenuForPlayer(menuid, playerid))
 | |
| 					{
 | |
| 						#if FIXES_Single
 | |
| 							FIXES_gsSettings |= e_FIXES_SETTINGS_MENU_SET;
 | |
| 							FIXES_gsCurrentMenu[playerid] = menuid;
 | |
| 						#else
 | |
| 							CallRemoteFunction(FIXES_gscSetPlayerMenu, FIXES_gscSpec@ii, playerid, _:menuid);
 | |
| 						#endif
 | |
| 						return 1;
 | |
| 					}
 | |
| 				#else
 | |
| 					return ShowMenuForPlayer(menuid, playerid);
 | |
| 				#endif
 | |
| 			}
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_ShowMenuForPlayer
 | |
| 	#define ShowMenuForPlayer FIXES_ShowMenuForPlayer
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_HideMenuForPlayer(Menu:menuid, playerid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     HideMenuForPlayer
 | |
|  *     HideMenuForPlayer_2
 | |
|  *     GetPlayerMenu
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_HideMenuForPlayer
 | |
| 	#error _ALS_HideMenuForPlayer defined
 | |
| #endif
 | |
| native BAD_HideMenuForPlayer(Menu:menuid, playerid) = HideMenuForPlayer;
 | |
| 
 | |
| #if FIX_HideMenuForPlayer || FIX_GetPlayerMenu
 | |
| 	stock FIXES_HideMenuForPlayer(Menu:menuid, playerid)
 | |
| 	{
 | |
| 		#if FIX_HideMenuForPlayer
 | |
| 			if (FIXES_IS_VALID_MENU(menuid))
 | |
| 		#endif
 | |
| 			{
 | |
| 				#if FIX_GetPlayerMenu
 | |
| 					#if FIX_HideMenuForPlayer_2
 | |
| 						if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS) && FIXES_gsCurrentMenu[playerid] == menuid)
 | |
| 					#else
 | |
| 						if (FIXES_gsCurrentMenu[playerid] == menuid && HideMenuForPlayer(menuid, playerid))
 | |
| 					#endif
 | |
| 						{
 | |
| 							#if FIXES_Single
 | |
| 								FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET;
 | |
| 								FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU;
 | |
| 							#else
 | |
| 								CallRemoteFunction(FIXES_gscSetPlayerMenu, FIXES_gscSpec@ii, playerid, INVALID_MENU);
 | |
| 							#endif
 | |
| 							#if FIX_HideMenuForPlayer_2
 | |
| 								return HideMenuForPlayer(menuid, playerid);
 | |
| 							#else
 | |
| 								return 1;
 | |
| 							#endif
 | |
| 						}
 | |
| 				#else
 | |
| 					return HideMenuForPlayer(menuid, playerid);
 | |
| 				#endif
 | |
| 			}
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_HideMenuForPlayer
 | |
| 	#define HideMenuForPlayer FIXES_HideMenuForPlayer
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_DisableMenu(Menu:menuid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     DisableMenu
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_DisableMenu
 | |
| 	#error _ALS_DisableMenu defined
 | |
| #endif
 | |
| native BAD_DisableMenu(Menu:menuid) = DisableMenu;
 | |
| 
 | |
| #if FIX_DisableMenu
 | |
| 	stock FIXES_DisableMenu(Menu:menuid)
 | |
| 	{
 | |
| 		if (FIXES_IS_VALID_MENU(menuid))
 | |
| 		{
 | |
| 			return DisableMenu(menuid);
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_DisableMenu
 | |
| 	#define DisableMenu FIXES_DisableMenu
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_DisableMenuRow(Menu:menuid, row)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     DisableMenuRow
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_DisableMenuRow
 | |
| 	#error _ALS_DisableMenuRow defined
 | |
| #endif
 | |
| native BAD_DisableMenuRow(Menu:menuid, row) = DisableMenuRow;
 | |
| 
 | |
| #if FIX_DisableMenuRow
 | |
| 	stock FIXES_DisableMenuRow(Menu:menuid, row)
 | |
| 	{
 | |
| 		if (FIXES_IS_VALID_MENU(menuid))
 | |
| 		{
 | |
| 			return DisableMenuRow(menuid, row);
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_DisableMenuRow
 | |
| 	#define DisableMenuRow FIXES_DisableMenuRow
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * Menu:FIXES_GetPlayerMenu(playerid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     GetPlayerMenu
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_GetPlayerMenu
 | |
| 	#error _ALS_GetPlayerMenu defined
 | |
| #endif
 | |
| native BAD_GetPlayerMenu(playerid) = GetPlayerMenu;
 | |
| 
 | |
| #if FIX_GetPlayerMenu
 | |
| 	stock Menu:FIXES_GetPlayerMenu(playerid)
 | |
| 	{
 | |
| 		if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
 | |
| 		{
 | |
| 			return FIXES_gsCurrentMenu[playerid];
 | |
| 		}
 | |
| 		return Menu:INVALID_MENU;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_GetPlayerMenu
 | |
| 	#define GetPlayerMenu FIXES_GetPlayerMenu
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * OnPlayerStateChange(playerid, newstate, oldstate)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     HydraSniper
 | |
|  *     GetPlayerWeapon
 | |
|  *     PutPlayerInVehicle
 | |
|  *     TrainExit
 | |
|  */
 | |
| 
 | |
| #if FIX_HydraSniper || FIX_GetPlayerWeapon || FIX_PutPlayerInVehicle || FIX_OnPlayerEnterVehicle || FIX_TrainExit
 | |
| 	public OnPlayerStateChange(playerid, newstate, oldstate)
 | |
| 	{
 | |
| 		#if !FIXES_Single
 | |
| 			if (!(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE))
 | |
| 			{
 | |
| 				return FIXES_OnPlayerStateChange(playerid, newstate, oldstate);
 | |
| 			}
 | |
| 		#endif
 | |
| 		
 | |
| 		// =============================
 | |
| 		//  BEGIN: OnPlayerEnterVehicle 
 | |
| 		// =============================
 | |
| 		#if FIX_OnPlayerEnterVehicle
 | |
| 				if (newstate == PLAYER_STATE_PASSENGER)
 | |
| 				{
 | |
| 					new
 | |
| 						model = GetVehicleModel(GetPlayerVehicleID(playerid)) - 400;
 | |
| 					if (_FIXES_IN_RANGE(model, 0, 211 + 1))
 | |
| 					{
 | |
| 						new
 | |
| 							seat = GetPlayerVehicleSeat(playerid);
 | |
| 						if (seat != 128)
 | |
| 						{
 | |
| 							model = (FIXES_gscMaxPassengers[model >>> 3] >>> ((model & 7) << 2)) & 0xF;
 | |
| 							if (model == 0 || model == 15)
 | |
| 							{
 | |
| 								// Shouldn't be in this vehicle at all.
 | |
| 								FIXES_BlockUpdate(playerid, true);
 | |
| 							}
 | |
| 							else if (!(0 < seat <= model)) // Slower with "_FIXES_NO_RANGE".
 | |
| 							{
 | |
| 								// In an out of range seat.
 | |
| 								FIXES_BlockUpdate(playerid, true);
 | |
| 							}
 | |
| 						}
 | |
| 					}
 | |
| 					else
 | |
| 					{
 | |
| 						FIXES_BlockUpdate(playerid, true);
 | |
| 					}
 | |
| 				}
 | |
| 				else if (newstate == PLAYER_STATE_DRIVER)
 | |
| 				{
 | |
| 						new
 | |
| 							model = GetPlayerVehicleSeat(playerid);
 | |
| 						if (model != 128)
 | |
| 						{
 | |
| 							if (model == 0)
 | |
| 							{
 | |
| 								model = GetVehicleModel(GetPlayerVehicleID(playerid)) - 400;
 | |
| 								if (_FIXES_NO_RANGE(model, 0, 211 + 1) || FIXES_gscMaxPassengers[model >>> 3] >>> ((model & 7) << 2) & 0xF == 15)
 | |
| 								{
 | |
| 									// In an invalid vehicle (one you can't drive).
 | |
| 									FIXES_BlockUpdate(playerid, true);
 | |
| 								}
 | |
| 							}
 | |
| 							else
 | |
| 							{
 | |
| 								// They are a driver, but not in the driver's seat.
 | |
| 								FIXES_BlockUpdate(playerid, true);
 | |
| 							}
 | |
| 						}
 | |
| 					#if FIX_HydraSniper
 | |
| 						else
 | |
| 						{
 | |
| 							model = GetVehicleModel(GetPlayerVehicleID(playerid));
 | |
| 						}
 | |
| 					#endif
 | |
| 			#if !FIX_HydraSniper
 | |
| 				}
 | |
| 			#endif
 | |
| 		#endif
 | |
| 		// =============================
 | |
| 		//  END:   OnPlayerEnterVehicle 
 | |
| 		// =============================
 | |
| 		
 | |
| 		// ====================
 | |
| 		//  BEGIN: HydraSniper 
 | |
| 		// ====================
 | |
| 		#if FIX_HydraSniper
 | |
| 			#if !FIX_OnPlayerEnterVehicle
 | |
| 				// Only called if the same check above isn't called.
 | |
| 				if (newstate == PLAYER_STATE_DRIVER)
 | |
| 				{
 | |
| 					new
 | |
| 						model = GetVehicleModel(GetPlayerVehicleID(playerid));
 | |
| 			#endif
 | |
| 					if (GetPlayerWeapon(playerid) == 34 && (model == 520 || model == 425))
 | |
| 					{
 | |
| 						SetPlayerArmedWeapon(playerid, 0);
 | |
| 						#if FIX_GetPlayerWeapon
 | |
| 							// This is the first cross-dependednt fix.
 | |
| 							#if FIXES_Single
 | |
| 								FIXES_gsPlayerWeapon[playerid] = 0;
 | |
| 							#else
 | |
| 								SetPVarInt(playerid, FIXES_pvarPlayerWeapon, 0);
 | |
| 							#endif
 | |
| 						#endif
 | |
| 					}
 | |
| 				}
 | |
| 		#endif
 | |
| 		// ====================
 | |
| 		//  END:   HydraSniper 
 | |
| 		// ====================
 | |
| 		
 | |
| 		#if FIX_GetPlayerWeapon || FIX_PutPlayerInVehicle || FIX_TrainExit
 | |
| 			#if PLAYER_STATE_PASSENGER != PLAYER_STATE_DRIVER + 1
 | |
| 				#error FIX_GetPlayerWeapon/FIX_PutPlayerInVehicle state assertation failed.
 | |
| 			#endif
 | |
| 			if (_FIXES_IN_RANGE(oldstate, PLAYER_STATE_DRIVER, PLAYER_STATE_PASSENGER + 1))
 | |
| 			{
 | |
| 				#if FIX_PutPlayerInVehicle || FIX_TrainExit
 | |
| 					new
 | |
| 						e_FIXES_BOOLS:bools = FIXES_gsPlayerBools[playerid];
 | |
| 				#endif
 | |
| 				
 | |
| 				// ========================
 | |
| 				//  BEGIN: GetPlayerWeapon 
 | |
| 				// ========================
 | |
| 				#if FIX_GetPlayerWeapon
 | |
| 					#if FIXES_Single
 | |
| 						FIXES_gsPlayerWeapon[playerid] = -1;
 | |
| 					#else
 | |
| 						SetPVarInt(playerid, FIXES_pvarPlayerWeapon, -1);
 | |
| 					#endif
 | |
| 				#endif
 | |
| 				// ========================
 | |
| 				//  END:   GetPlayerWeapon 
 | |
| 				// ========================
 | |
| 				
 | |
| 				// ==================
 | |
| 				//  BEGIN: TrainExit
 | |
| 				// ==================
 | |
| 				#if FIX_TrainExit
 | |
| 					FIXES_PRINTF("train exit");
 | |
| 					if (bools & e_FIXES_BOOLS_PUT_IN_TRAIN)
 | |
| 					{
 | |
| 						FIXES_PRINTF("OK");
 | |
| 						SetCameraBehindPlayer(playerid),
 | |
| 						bools &= ~e_FIXES_BOOLS_PUT_IN_TRAIN;
 | |
| 					}
 | |
| 				#endif
 | |
| 				// ==================
 | |
| 				//  END:   TrainExit
 | |
| 				// ==================
 | |
| 				
 | |
| 				// ===========================
 | |
| 				//  BEGIN: PutPlayerInVehicle 
 | |
| 				// ===========================
 | |
| 				#if FIX_PutPlayerInVehicle
 | |
| 					// Update their vehicle once we KNOW the client has done the
 | |
| 					// removal from the vehicle.
 | |
| 					if (bools & e_FIXES_BOOLS_PUT_IN_VEHICLE)
 | |
| 					{
 | |
| 						new
 | |
| 							vid = FIXES_gsVehicleSeatData[playerid] & 0x00FFFFFF;
 | |
| 						// Limited to "only" 16777216 vehicles and 256 seats.
 | |
| 						PutPlayerInVehicle(playerid, vid, FIXES_gsVehicleSeatData[playerid] >>> 24),
 | |
| 						bools &= ~e_FIXES_BOOLS_PUT_IN_VEHICLE;
 | |
| 						#if FIX_TrainExit
 | |
| 							switch (GetVehicleModel(vid))
 | |
| 							{
 | |
| 								case 449, 537, 538:
 | |
| 								{
 | |
| 									bools |= e_FIXES_BOOLS_PUT_IN_TRAIN;
 | |
| 								}
 | |
| 							}
 | |
| 						#endif
 | |
| 					}
 | |
| 				#endif
 | |
| 				// ===========================
 | |
| 				//  END:   PutPlayerInVehicle 
 | |
| 				// ===========================
 | |
| 				
 | |
| 				#if FIX_PutPlayerInVehicle || FIX_TrainExit
 | |
| 					FIXES_gsPlayerBools[playerid] = bools;
 | |
| 				#endif
 | |
| 			}
 | |
| 		#endif
 | |
| 		
 | |
| 		return FIXES_OnPlayerStateChange(playerid, newstate, oldstate);
 | |
| 	}
 | |
| 	
 | |
| 	#if defined _ALS_OnPlayerStateChange
 | |
| 		#error _ALS_OnPlayerStateChange defined
 | |
| 	#endif
 | |
| 	#define _ALS_OnPlayerStateChange
 | |
| 	#define OnPlayerStateChange(%0) FIXES_OnPlayerStateChange(%0) <_ALS : _ALS_go>
 | |
| 	
 | |
| 	_FIXES_FORWARD FIXES_OnPlayerStateChange(playerid, newstate, oldstate);
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_GivePlayerWeapon(playerid, weaponid, ammo)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     HydraSniper
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_GivePlayerWeapon
 | |
| 	#error _ALS_GivePlayerWeapon defined
 | |
| #endif
 | |
| native BAD_GivePlayerWeapon(playerid, weaponid, ammo) = GivePlayerWeapon;
 | |
| 
 | |
| #if FIX_HydraSniper
 | |
| 	stock FIXES_GivePlayerWeapon(playerid, weaponid, ammo)
 | |
| 	{
 | |
| 		new
 | |
| 			vid = GetPlayerVehicleID(playerid);
 | |
| 		if (vid)
 | |
| 		{
 | |
| 			vid = GetVehicleModel(vid);
 | |
| 			if (weaponid == 34 && (vid == 520 || vid == 425))
 | |
| 			{
 | |
| 				vid = GivePlayerWeapon(playerid, weaponid, ammo),
 | |
| 				SetPlayerArmedWeapon(playerid, 0);
 | |
| 				#if FIX_GetPlayerWeapon
 | |
| 					#if FIXES_Single
 | |
| 						FIXES_gsPlayerWeapon[playerid] = 0;
 | |
| 					#else
 | |
| 						SetPVarInt(playerid, FIXES_pvarPlayerWeapon, 0);
 | |
| 					#endif
 | |
| 				#endif
 | |
| 				return vid;
 | |
| 			}
 | |
| 		}
 | |
| 		return GivePlayerWeapon(playerid, weaponid, ammo);
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_GivePlayerWeapon
 | |
| 	#define GivePlayerWeapon FIXES_GivePlayerWeapon
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_SetPlayerArmedWeapon(playerid, weaponid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     GetPlayerWeapon
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_SetPlayerArmedWeapon
 | |
| 	#error _ALS_SetPlayerArmedWeapon defined
 | |
| #endif
 | |
| native BAD_SetPlayerArmedWeapon(playerid, weaponid) = SetPlayerArmedWeapon;
 | |
| 
 | |
| #if FIX_GetPlayerWeapon
 | |
| 	stock FIXES_SetPlayerArmedWeapon(playerid, weaponid)
 | |
| 	{
 | |
| 		#if FIX_AllowInteriorWeapons
 | |
| 			if (FIXES_gsSettings & e_FIXES_SETTINGS_INTERIOR && GetPlayerInterior(playerid))
 | |
| 			{
 | |
| 				// Not allowed weapons.
 | |
| 				return 0;
 | |
| 			}
 | |
| 		#endif
 | |
| 		new
 | |
| 			vid = GetPlayerVehicleID(playerid);
 | |
| 		if (vid)
 | |
| 		{
 | |
| 			#if FIX_HydraSniper
 | |
| 				vid = GetVehicleModel(vid);
 | |
| 				if (weaponid == 34 && (vid == 520 || vid == 425))
 | |
| 				{
 | |
| 					return 0;
 | |
| 				}
 | |
| 			#endif
 | |
| 			//FIXES_gsPlayerWeapon[playerid] = weaponid;
 | |
| 			#if FIXES_Single
 | |
| 				FIXES_gsPlayerWeapon[playerid] = weaponid;
 | |
| 			#else
 | |
| 				SetPVarInt(playerid, FIXES_pvarPlayerWeapon, weaponid);
 | |
| 			#endif
 | |
| 		}
 | |
| 		return SetPlayerArmedWeapon(playerid, weaponid);
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_SetPlayerArmedWeapon
 | |
| 	#define SetPlayerArmedWeapon FIXES_SetPlayerArmedWeapon
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_GetPlayerWeapon(playerid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     GetPlayerWeapon
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_GetPlayerWeapon
 | |
| 	#error _ALS_GetPlayerWeapon defined
 | |
| #endif
 | |
| native BAD_GetPlayerWeapon(playerid) = GetPlayerWeapon;
 | |
| 
 | |
| #if FIX_GetPlayerWeapon
 | |
| 	stock FIXES_GetPlayerWeapon(playerid)
 | |
| 	{
 | |
| 		#if FIXES_Single
 | |
| 			new
 | |
| 				ret = FIXES_gsPlayerWeapon[playerid];
 | |
| 		#else
 | |
| 			new
 | |
| 				ret = GetPVarInt(playerid, FIXES_pvarPlayerWeapon);
 | |
| 		#endif
 | |
| 		if (ret == -1)
 | |
| 		{
 | |
| 			return GetPlayerWeapon(playerid);
 | |
| 		}
 | |
| 		return ret;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_GetPlayerWeapon
 | |
| 	#define GetPlayerWeapon FIXES_GetPlayerWeapon
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     PutPlayerInVehicle
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_PutPlayerInVehicle
 | |
| 	#error _ALS_PutPlayerInVehicle defined
 | |
| #endif
 | |
| native BAD_PutPlayerInVehicle(playerid, vehicleid, seatid) = PutPlayerInVehicle;
 | |
| 
 | |
| #if FIX_PutPlayerInVehicle || FIX_TrainExit
 | |
| 	#if FIXES_Single
 | |
| 		stock FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid)
 | |
| 		{
 | |
| 			// ==================
 | |
| 			//  BEGIN: TrainExit
 | |
| 			// ==================
 | |
| 			#if FIX_TrainExit
 | |
| 				FIXES_PRINTF("TrainExit %d", GetVehicleModel(vehicleid));
 | |
| 				switch (GetVehicleModel(vehicleid))
 | |
| 				{
 | |
| 					case 449, 537, 538:
 | |
| 					{
 | |
| 						FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_TRAIN;
 | |
| 					}
 | |
| 				}
 | |
| 			#endif
 | |
| 			// ==================
 | |
| 			//  END:   TrainExit
 | |
| 			// ==================
 | |
| 			
 | |
| 			// ===========================
 | |
| 			//  BEGIN: PutPlayerInVehicle 
 | |
| 			// ===========================
 | |
| 			#if FIX_PutPlayerInVehicle
 | |
| 				new
 | |
| 					vid = GetPlayerVehicleID(playerid);
 | |
| 				if (vid)
 | |
| 				{
 | |
| 					new
 | |
| 						Float:x,
 | |
| 						Float:y,
 | |
| 						Float:z;
 | |
| 					// Remove them without the animation.
 | |
| 					return
 | |
| 						GetVehiclePos(vid, x, y, z),
 | |
| 						SetPlayerPos(playerid, x, y, z),
 | |
| 						FIXES_gsVehicleSeatData[playerid] = seatid << 24 | vehicleid,
 | |
| 						FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_VEHICLE,
 | |
| 						1;
 | |
| 				}
 | |
| 			#endif
 | |
| 			// ===========================
 | |
| 			//  END:   PutPlayerInVehicle 
 | |
| 			// ===========================
 | |
| 			return PutPlayerInVehicle(playerid, vehicleid, seatid);
 | |
| 		}
 | |
| 	#else
 | |
| 		forward _FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid, from, data);
 | |
| 		
 | |
| 		stock FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid)
 | |
| 		{
 | |
| 			FIXES_PRINTF("NOT SINGLE");
 | |
| 			// ===========================
 | |
| 			//  BEGIN: PutPlayerInVehicle 
 | |
| 			// ===========================
 | |
| 			#if FIX_PutPlayerInVehicle
 | |
| 				new
 | |
| 					vid = GetPlayerVehicleID(playerid);
 | |
| 				if (vid)
 | |
| 				{
 | |
| 					new
 | |
| 						Float:x,
 | |
| 						Float:y,
 | |
| 						Float:z;
 | |
| 					// Remove them without the animation.
 | |
| 					return
 | |
| 						GetVehiclePos(vid, x, y, z),
 | |
| 						SetPlayerPos(playerid, x, y, z),
 | |
| 						CallRemoteFunction(FIXES_gscPutPlayerInVehicle, FIXES_gscSpec@iiiii, playerid, vehicleid, seatid, 1, vid),
 | |
| 						1;
 | |
| 				}
 | |
| 			#endif
 | |
| 			// ===========================
 | |
| 			//  END:   PutPlayerInVehicle 
 | |
| 			// ===========================
 | |
| 			
 | |
| 			// ==================
 | |
| 			//  BEGIN: TrainExit
 | |
| 			// ==================
 | |
| 			#if FIX_TrainExit
 | |
| 				new
 | |
| 					model = GetVehicleModel(vehicleid);
 | |
| 				switch (model)
 | |
| 				{
 | |
| 					case 449, 537, 538:
 | |
| 					{
 | |
| 						CallRemoteFunction(FIXES_gscPutPlayerInVehicle, FIXES_gscSpec@iiiii, playerid, vehicleid, seatid, 0, model);
 | |
| 						//FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_TRAIN;
 | |
| 					}
 | |
| 				}
 | |
| 			#endif
 | |
| 			// ==================
 | |
| 			//  END:   TrainExit
 | |
| 			// ==================
 | |
| 			return PutPlayerInVehicle(playerid, vehicleid, seatid);
 | |
| 		}
 | |
| 		
 | |
| 		public _FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid, from, data)
 | |
| 		{
 | |
| 			FIXES_PRINTF("IN CHARGE: %d", (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE));
 | |
| 			_FIXES_IS_IN_CHARGE()
 | |
| 			{
 | |
| 				// ===========================
 | |
| 				//  BEGIN: PutPlayerInVehicle 
 | |
| 				// ===========================
 | |
| 				#if FIX_PutPlayerInVehicle
 | |
| 					if (from)
 | |
| 					{
 | |
| 						FIXES_gsVehicleSeatData[playerid] = seatid << 24 | vehicleid,
 | |
| 						FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_VEHICLE;
 | |
| 					}
 | |
| 				#endif
 | |
| 				// ===========================
 | |
| 				//  END:   PutPlayerInVehicle 
 | |
| 				// ===========================
 | |
| 				
 | |
| 				// ==================
 | |
| 				//  BEGIN: TrainExit
 | |
| 				// ==================
 | |
| 				#if FIX_TrainExit
 | |
| 					#if FIX_PutPlayerInVehicle
 | |
| 						else
 | |
| 					#else
 | |
| 						if (!from)
 | |
| 					#endif
 | |
| 						{
 | |
| 							switch (data)
 | |
| 							{
 | |
| 								case 449, 537, 538:
 | |
| 								{
 | |
| 									FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_TRAIN;
 | |
| 								}
 | |
| 							}
 | |
| 						}
 | |
| 				#endif
 | |
| 				// ==================
 | |
| 				//  END:   TrainExit
 | |
| 				// ==================
 | |
| 			}
 | |
| 			return 1;
 | |
| 		}
 | |
| 	#endif
 | |
| 	
 | |
| 	#define _ALS_PutPlayerInVehicle
 | |
| 	#define PutPlayerInVehicle FIXES_PutPlayerInVehicle
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_SetCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     SetPlayerCheckpoint
 | |
|  */
 | |
| 
 | |
| #if FIX_SetPlayerCheckpoint
 | |
| 	forward _FIXES_SetCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size);
 | |
| 	
 | |
| 	public _FIXES_SetCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size)
 | |
| 	{
 | |
| 		#if FIXES_Single
 | |
| 			if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_CP_DELAYED)
 | |
| 		#else
 | |
| 			if (GetPVarInt(playerid, FIXES_pvarPlayerCheckpoint))
 | |
| 		#endif
 | |
| 			{
 | |
| 				return
 | |
| 					#if FIXES_Single
 | |
| 						FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_CP_DELAYED,
 | |
| 					#else
 | |
| 						DeletePVar(playerid, FIXES_pvarPlayerCheckpoint),
 | |
| 					#endif
 | |
| 						SetPlayerCheckpoint(playerid, x, y, z, size);
 | |
| 			}
 | |
| 			return 0;
 | |
| 	}
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     SetPlayerCheckpoint
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_SetPlayerCheckpoint
 | |
| 	#error _ALS_SetPlayerCheckpoint defined
 | |
| #endif
 | |
| native BAD_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size) = SetPlayerCheckpoint;
 | |
| 
 | |
| #if FIX_SetPlayerCheckpoint
 | |
| 	stock FIXES_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size)
 | |
| 	{
 | |
| 		return
 | |
| 			#if FIXES_Single
 | |
| 				FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_CP_DELAYED,
 | |
| 			#else
 | |
| 				SetPVarInt(playerid, FIXES_pvarPlayerCheckpoint, 1),
 | |
| 			#endif
 | |
| 				DisablePlayerCheckpoint(playerid),
 | |
| 				SetTimerEx(FIXES_gscSetCheckpoint, 50, 0, FIXES_gscSpec@iffff, playerid, x, y, z, size),
 | |
| 				1;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_SetPlayerCheckpoint
 | |
| 	#define SetPlayerCheckpoint FIXES_SetPlayerCheckpoint
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_DisablePlayerCheckpoint(playerid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     SetPlayerCheckpoint
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_DisablePlayerCheckpoint
 | |
| 	#error _ALS_DisablePlayerCheckpoint defined
 | |
| #endif
 | |
| native BAD_DisablePlayerCheckpoint(playerid) = DisablePlayerCheckpoint;
 | |
| 
 | |
| #if FIX_SetPlayerCheckpoint
 | |
| 	stock FIXES_DisablePlayerCheckpoint(playerid)
 | |
| 	{
 | |
| 		return
 | |
| 			#if FIXES_Single
 | |
| 				FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_CP_DELAYED,
 | |
| 			#else
 | |
| 				DeletePVar(playerid, FIXES_pvarPlayerCheckpoint),
 | |
| 			#endif
 | |
| 				DisablePlayerCheckpoint(playerid);
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_DisablePlayerCheckpoint
 | |
| 	#define DisablePlayerCheckpoint FIXES_DisablePlayerCheckpoint
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_SetRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     SetPlayerRaceCheckpoint
 | |
|  */
 | |
| 
 | |
| #if FIX_SetPlayerRaceCheckpoint
 | |
| 	forward _FIXES_SetRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size);
 | |
| 	
 | |
| 	public _FIXES_SetRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size)
 | |
| 	{
 | |
| 		#if FIXES_Single
 | |
| 			if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_RACE_CP_DELAYED)
 | |
| 		#else
 | |
| 			if (GetPVarInt(playerid, FIXES_pvarPlayerRaceCheckpoint))
 | |
| 		#endif
 | |
| 			{
 | |
| 				return
 | |
| 					#if FIXES_Single
 | |
| 						FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_RACE_CP_DELAYED,
 | |
| 					#else
 | |
| 						DeletePVar(playerid, FIXES_pvarPlayerRaceCheckpoint),
 | |
| 					#endif
 | |
| 						SetPlayerRaceCheckpoint(playerid, type, x, y, z, nextx, nexty, nextz, size);
 | |
| 			}
 | |
| 			return 0;
 | |
| 	}
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_SetPlayerRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     SetPlayerRaceCheckpoint
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_SetPlayerRaceCheckpoint
 | |
| 	#error _ALS_SetPlayerRaceCheckpoint defined
 | |
| #endif
 | |
| native BAD_SetPlayerRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size) = SetPlayerRaceCheckpoint;
 | |
| 
 | |
| #if FIX_SetPlayerRaceCheckpoint
 | |
| 	stock FIXES_SetPlayerRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size)
 | |
| 	{
 | |
| 		return
 | |
| 			#if FIXES_Single
 | |
| 				FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_RACE_CP_DELAYED,
 | |
| 			#else
 | |
| 				SetPVarInt(playerid, FIXES_pvarPlayerRaceCheckpoint, 1),
 | |
| 			#endif
 | |
| 				DisablePlayerRaceCheckpoint(playerid),
 | |
| 				SetTimerEx(FIXES_gscSetRaceCheckpoint, 50, 0, FIXES_gscSpec@iifffffff, playerid, type, x, y, z, nextx, nexty, nextz, size),
 | |
| 				1;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_SetPlayerRaceCheckpoint
 | |
| 	#define SetPlayerRaceCheckpoint FIXES_SetPlayerRaceCheckpoint
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_DisablePlayerRaceCheckpoint(playerid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     SetPlayerRaceCheckpoint
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_DisablePlayerRaceCP
 | |
| 	#error _ALS_DisablePlayerRaceCP defined
 | |
| #endif
 | |
| native BAD_DisablePlayerRaceCheckpoint(playerid) = DisablePlayerRaceCheckpoint;
 | |
| 
 | |
| #if FIX_SetPlayerRaceCheckpoint
 | |
| 	stock FIXES_DisablePlayerRaceCP(playerid)
 | |
| 	{
 | |
| 		return
 | |
| 			#if FIXES_Single
 | |
| 				FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_RACE_CP_DELAYED,
 | |
| 			#else
 | |
| 				DeletePVar(playerid, FIXES_pvarPlayerRaceCheckpoint),
 | |
| 			#endif
 | |
| 				DisablePlayerRaceCheckpoint(playerid);
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_DisablePlayerRaceCP
 | |
| 	#define DisablePlayerRaceCheckpoint FIXES_DisablePlayerRaceCP
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_HideGameTextForPlayer(playerid, style, parr[])
 | |
|  * 
 | |
|  * Hides a GameText style for one or more players, and accounts for the fact
 | |
|  * that they may have different messages being shown.
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     GameText
 | |
|  */
 | |
| 
 | |
| #if FIX_GameText
 | |
| 	static stock _FIXES_HideGameTextForPlayer(playerid, style, parr[])
 | |
| 	{
 | |
| 		switch (playerid)
 | |
| 		{
 | |
| 			case MAX_PLAYERS:
 | |
| 			{
 | |
| 				// Remove the global GameText for everyone that can see it.
 | |
| 				TextDrawHideForAll(FIXES_gsGTStyle[style]);
 | |
| 			}
 | |
| 			case INVALID_PLAYER_ID:
 | |
| 			{
 | |
| 				// Hide any player-local ones.  This is similar to "foreach".
 | |
| 				playerid = parr[MAX_PLAYERS],
 | |
| 				parr[MAX_PLAYERS] = MAX_PLAYERS;
 | |
| 				for (new next; playerid != MAX_PLAYERS; playerid = next)
 | |
| 				{
 | |
| 					PlayerTextDrawHide(playerid, FIXES_gsPGTStyle[playerid][style]),
 | |
| 					next = parr[playerid],
 | |
| 					parr[playerid] = 0;
 | |
| 				}
 | |
| 			}
 | |
| 			default:
 | |
| 			{
 | |
| 				// Remove.
 | |
| 				PlayerTextDrawHide(playerid, FIXES_gsPGTStyle[playerid][style]),
 | |
| 				_FIXES_RemoveInternal(parr, playerid, MAX_PLAYERS);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_HideGameTextTimer(playerid, style)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     GameText
 | |
|  */
 | |
| 
 | |
| #if FIX_GameText
 | |
| 	forward _FIXES_HideGameTextTimer(playerid, style);
 | |
| 	
 | |
| 	public _FIXES_HideGameTextTimer(playerid, style)
 | |
| 	{
 | |
| 		if (GetTickCount() >= FIXES_gsGTTimer[style][playerid])
 | |
| 		{
 | |
| 			// Only hide it if it hasn't been re-shown in the interim.
 | |
| 			_FIXES_HideGameTextForPlayer(playerid, style, FIXES_gsPlayerPGTShown[style]);
 | |
| 		}
 | |
| 	}
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_GameTextShow(playerid, string[], time, style)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     GameText
 | |
|  */
 | |
| 
 | |
| #if FIX_GameText
 | |
| 	forward _FIXES_GameTextShow(playerid, string[], time, style);
 | |
| 	
 | |
| 	public _FIXES_GameTextShow(playerid, string[], time, style)
 | |
| 	{
 | |
| 		_FIXES_IS_IN_CHARGE()
 | |
| 		{
 | |
| 			if (playerid == MAX_PLAYERS)
 | |
| 			{
 | |
| 				_FIXES_HideGameTextForPlayer(INVALID_PLAYER_ID, style, FIXES_gsPlayerPGTShown[style]),
 | |
| 				TextDrawSetString(FIXES_gsGTStyle[style], string),
 | |
| 				TextDrawShowForAll(FIXES_gsGTStyle[style]);
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[style]),
 | |
| 				PlayerTextDrawSetString(playerid, FIXES_gsPGTStyle[playerid][style], string),
 | |
| 				PlayerTextDrawShow(playerid, FIXES_gsPGTStyle[playerid][style]),
 | |
| 				_FIXES_AddInternal(FIXES_gsPlayerPGTShown[style], playerid, MAX_PLAYERS);
 | |
| 			}
 | |
| 			if (time)
 | |
| 			{
 | |
| 				// Tiny offset because timers are inaccurate.
 | |
| 				FIXES_gsGTTimer[style][playerid] = GetTickCount() + time - 10,
 | |
| 				// Don't need to save the timer's ID.
 | |
| 				SetTimerEx(FIXES_gscHideGameTextTimer, time, false, FIXES_gscSpec@ii, playerid, style);
 | |
| 			}
 | |
| 		}
 | |
| 		return 1;
 | |
| 	}
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_GameTextForAll(string[], time, style)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     GameText
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_GameTextForAll
 | |
| 	#error _ALS_GameTextForAll defined
 | |
| #endif
 | |
| native BAD_GameTextForAll(const string[], time, style) = GameTextForAll;
 | |
| 
 | |
| #if FIX_GameText
 | |
| 	stock FIXES_GameTextForAll(string[], time, style)
 | |
| 	{
 | |
| 		if (_FIXES_IN_RANGE(style, 0, FIXES_GT_STYLE_COUNT))
 | |
| 		{
 | |
| 			if ((string[0] == '\0') || (string[0] == '\1' && string[1] == '\0'))
 | |
| 			{
 | |
| 				#if FIXES_Single
 | |
| 					return _FIXES_GameTextShow(MAX_PLAYERS, FIXES_gscSpace, time, style);
 | |
| 				#else
 | |
| 					return CallRemoteFunction(FIXES_gscGameTextShow, FIXES_gscSpec@isii, MAX_PLAYERS, FIXES_gscSpace, time, style);
 | |
| 				#endif
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				#if FIXES_Single
 | |
| 					return _FIXES_GameTextShow(MAX_PLAYERS, string, time, style);
 | |
| 				#else
 | |
| 					return CallRemoteFunction(FIXES_gscGameTextShow, FIXES_gscSpec@isii, MAX_PLAYERS, string, time, style);
 | |
| 				#endif
 | |
| 			}
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_GameTextForAll
 | |
| 	
 | |
| 	#define GameTextForAll FIXES_GameTextForAll
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_GameTextForPlayer(playerid, string[], time, style)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     GameText
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_GameTextForPlayer
 | |
| 	#error _ALS_GameTextForPlayer defined
 | |
| #endif
 | |
| native BAD_GameTextForPlayer(playerid, const string[], time, style) = GameTextForPlayer;
 | |
| 
 | |
| #if FIX_GameText
 | |
| 	stock FIXES_GameTextForPlayer(playerid, string[], time, style)
 | |
| 	{
 | |
| 		if (_FIXES_IN_RANGE(style, 0, FIXES_GT_STYLE_COUNT) && _FIXES_IS_PLAYER_CONNECTED(playerid))
 | |
| 		{
 | |
| 			if ((string[0] <= '\0') || (string[0] == '\1' && string[1] == '\0'))
 | |
| 			{
 | |
| 				#if FIXES_Single
 | |
| 					return _FIXES_GameTextShow(playerid, FIXES_gscSpace, time, style);
 | |
| 				#else
 | |
| 					return CallRemoteFunction(FIXES_gscGameTextShow, FIXES_gscSpec@isii, playerid, FIXES_gscSpace, time, style);
 | |
| 				#endif
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				#if FIXES_Single
 | |
| 					return _FIXES_GameTextShow(playerid, string, time, style);
 | |
| 				#else
 | |
| 					return CallRemoteFunction(FIXES_gscGameTextShow, FIXES_gscSpec@isii, playerid, string, time, style);
 | |
| 				#endif
 | |
| 			}
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_GameTextForPlayer
 | |
| 	
 | |
| 	#define GameTextForPlayer FIXES_GameTextForPlayer
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * HideGameTextForAll(style)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     HideGameText
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_HideGameTextForAll
 | |
| 	#error _ALS_HideGameTextForAll defined
 | |
| #endif
 | |
| native BAD_HideGameTextForAll(style) = HideGameTextForAll;
 | |
| 
 | |
| #if FIX_HideGameText
 | |
| 	#define _ALS_HideGameTextForAll
 | |
| 	
 | |
| 	#define HideGameTextForAll(%0) GameTextForAll(FIXES_gscSpace, 0, (%0))
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * HideGameTextForPlayer(playerid, style)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     HideGameText
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_HideGameTextForPlayer
 | |
| 	#error _ALS_HideGameTextForPlayer defined
 | |
| #endif
 | |
| native BAD_HideGameTextForPlayer(playerid, style) = HideGameTextForPlayer;
 | |
| 
 | |
| #if FIX_HideGameText
 | |
| 	#define _ALS_HideGameTextForPlayer
 | |
| 	
 | |
| 	#define HideGameTextForPlayer(%1,%0) GameTextForPlayer((%1), FIXES_gscSpace, 0, (%0))
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * PlayerText:FIXES_CreatePlayerTextDraw(playerid, Float:x, Float:y, text[])
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     CreatePlayerTextDraw
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_CreatePlayerTextDraw
 | |
| 	#error _ALS_CreatePlayerTextDraw defined
 | |
| #endif
 | |
| native Text:BAD_CreatePlayerTextDraw(playerid, Float:x, Float:y, text[]) = CreatePlayerTextDraw;
 | |
| 
 | |
| #if FIX_CreatePlayerTextDraw
 | |
| 	stock PlayerText:FIXES_CreatePlayerTextDraw(playerid, Float:x, Float:y, text[])
 | |
| 	{
 | |
| 		if ((text[0] == '\0') || (text[0] == '\1' && text[1] == '\0'))
 | |
| 		{
 | |
| 			return CreatePlayerTextDraw(playerid, x, y, FIXES_gscSpace);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			return CreatePlayerTextDraw(playerid, x, y, text);
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_CreatePlayerTextDraw
 | |
| 	#define CreatePlayerTextDraw FIXES_CreatePlayerTextDraw
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_PlayerTextDrawSetString(playerid, PlayerText:text, string[])
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     PlayerTextDrawSetString
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_PlayerTextDrawSetString
 | |
| 	#error _ALS_PlayerTextDrawSetString defined
 | |
| #endif
 | |
| native BAD_PlayerTextDrawSetString(playerid, PlayerText:text, string[]) = PlayerTextDrawSetString;
 | |
| 
 | |
| #if FIX_PlayerTextDrawSetString
 | |
| 	stock FIXES_PlayerTextDrawSetString(playerid, PlayerText:text, string[])
 | |
| 	{
 | |
| 		if ((string[0] == '\0') || (string[0] == '\1' && string[1] == '\0'))
 | |
| 		{
 | |
| 			return PlayerTextDrawSetString(playerid, text, FIXES_gscSpace);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			return PlayerTextDrawSetString(playerid, text, string);
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_PlayerTextDrawSetString
 | |
| 	#define PlayerTextDrawSetString FIXES_PlayerTextDrawSetString
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * Text:FIXES_TextDrawCreate(Float:x, Float:y, text[])
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     TextDrawCreate
 | |
|  */
 | |
| 
 | |
| 	#if defined _ALS_TextDrawCreate
 | |
| 		#error _ALS_TextDrawCreate defined
 | |
| native Text:BAD_TextDrawCreate(Float:x, Float:y, text[]) = TextDrawCreate;
 | |
| 
 | |
| #if FIX_TextDrawCreate
 | |
| 	stock Text:FIXES_TextDrawCreate(Float:x, Float:y, text[])
 | |
| 	{
 | |
| 		if ((text[0] == '\0') || (text[0] == '\1' && text[1] == '\0'))
 | |
| 		{
 | |
| 			return TextDrawCreate(x, y, FIXES_gscSpace);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			return TextDrawCreate(x, y, text);
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	#endif
 | |
| 	#define _ALS_TextDrawCreate
 | |
| 	#define TextDrawCreate FIXES_TextDrawCreate
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_TextDrawSetString(Text:text, string[])
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     TextDrawSetString
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_TextDrawSetString
 | |
| 	#error _ALS_TextDrawSetString defined
 | |
| #endif
 | |
| native BAD_TextDrawSetString(Text:text, string[]) = TextDrawSetString;
 | |
| 
 | |
| #if FIX_TextDrawSetString
 | |
| 	stock FIXES_TextDrawSetString(Text:text, string[])
 | |
| 	{
 | |
| 		if ((string[0] == '\0') || (string[0] == '\1' && string[1] == '\0'))
 | |
| 		{
 | |
| 			return TextDrawSetString(text, FIXES_gscSpace);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			return TextDrawSetString(text, string);
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_TextDrawSetString
 | |
| 	#define TextDrawSetString FIXES_TextDrawSetString
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_AllowInteriorWeapons(allow)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     AllowInteriorWeapons
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_AllowInteriorWeapons
 | |
| 	#error _ALS_AllowInteriorWeapons defined
 | |
| #endif
 | |
| native BAD_AllowInteriorWeapons(allow) = AllowInteriorWeapons;
 | |
| 
 | |
| #if FIX_AllowInteriorWeapons
 | |
| 	#if FIXES_Single
 | |
| 		stock FIXES_AllowInteriorWeapons(allow)
 | |
| 		{
 | |
| 			if (allow)
 | |
| 			{
 | |
| 				FIXES_gsSettings &= ~e_FIXES_SETTINGS_INTERIOR;
 | |
| 				_FIXES_FOREACH(FIXES_gsPlayersIterator, i)
 | |
| 				{
 | |
| 					FIXES_gsPlayerBools[i] &= ~e_FIXES_BOOLS_INTERIOR;
 | |
| 				}
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				FIXES_gsSettings |= e_FIXES_SETTINGS_INTERIOR;
 | |
| 				_FIXES_FOREACH(FIXES_gsPlayersIterator, i)
 | |
| 				{
 | |
| 					if (GetPlayerInterior(i))
 | |
| 					{
 | |
| 						FIXES_gsPlayerBools[i] |= e_FIXES_BOOLS_INTERIOR;
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 			return allow;
 | |
| 		}
 | |
| 	#else
 | |
| 		forward _FIXES_AllowInteriorWeapons(allow);
 | |
| 		
 | |
| 		stock FIXES_AllowInteriorWeapons(allow)
 | |
| 		{
 | |
| 			CallRemoteFunction(FIXES_gscAllowInteriorWeapons, FIXES_gscSpec@i, allow);
 | |
| 			return allow;
 | |
| 		}
 | |
| 		
 | |
| 		public _FIXES_AllowInteriorWeapons(allow)
 | |
| 		{
 | |
| 			if (allow)
 | |
| 			{
 | |
| 				FIXES_gsSettings &= ~e_FIXES_SETTINGS_INTERIOR;
 | |
| 				_FIXES_FOREACH(FIXES_gsPlayersIterator, i)
 | |
| 				{
 | |
| 					FIXES_gsPlayerBools[i] &= ~e_FIXES_BOOLS_INTERIOR;
 | |
| 				}
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				FIXES_gsSettings |= e_FIXES_SETTINGS_INTERIOR;
 | |
| 				_FIXES_FOREACH(FIXES_gsPlayersIterator, i)
 | |
| 				{
 | |
| 					if (GetPlayerInterior(i))
 | |
| 					{
 | |
| 						FIXES_gsPlayerBools[i] |= e_FIXES_BOOLS_INTERIOR;
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 			return allow;
 | |
| 		}
 | |
| 	#endif
 | |
| 	
 | |
| 	#define _ALS_AllowInteriorWeapons
 | |
| 	#define AllowInteriorWeapons FIXES_AllowInteriorWeapons
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_GetPlayerInterior(playerid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     GetPlayerInterior
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_GetPlayerInterior
 | |
| 	#error _ALS_GetPlayerInterior defined
 | |
| #endif
 | |
| native BAD_GetPlayerInterior(playerid) = GetPlayerInterior;
 | |
| 
 | |
| #if FIX_GetPlayerInterior
 | |
| 	stock FIXES_GetPlayerInterior(playerid)
 | |
| 	{
 | |
| 		if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
 | |
| 		{
 | |
| 			#if FIXES_Single
 | |
| 				return FIXES_gsInterior[playerid];
 | |
| 			#else
 | |
| 				return GetPVarInt(playerid, FIXES_pvarPlayerInterior);
 | |
| 			#endif
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_GetPlayerInterior
 | |
| 	#define GetPlayerInterior FIXES_GetPlayerInterior
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_SetPlayerInterior(playerid, interiorid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     GetPlayerInterior
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_SetPlayerInterior
 | |
| 	#error _ALS_SetPlayerInterior defined
 | |
| #endif
 | |
| native BAD_SetPlayerInterior(playerid, interiorid) = SetPlayerInterior;
 | |
| 
 | |
| #if FIX_GetPlayerInterior
 | |
| 	stock FIXES_SetPlayerInterior(playerid, interiorid)
 | |
| 	{
 | |
| 		if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
 | |
| 		{
 | |
| 			#if FIXES_Single
 | |
| 				FIXES_gsInterior[playerid] = interiorid;
 | |
| 			#else
 | |
| 				SetPVarInt(playerid, FIXES_pvarPlayerInterior, interiorid);
 | |
| 			#endif
 | |
| 			return SetPlayerInterior(playerid, interiorid);
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_SetPlayerInterior
 | |
| 	#define SetPlayerInterior FIXES_SetPlayerInterior
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     AllowTeleport
 | |
|  */
 | |
| 
 | |
| #if FIX_AllowTeleport && !defined FILTERSCRIPT
 | |
| 	forward _FIXES_AllowTeleport(playerid, allow);
 | |
| 	
 | |
| 	public OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ)
 | |
| 	{
 | |
| 		// ======================
 | |
| 		//  BEGIN: AllowTeleport 
 | |
| 		// ======================
 | |
| 		#if FIX_AllowTeleport
 | |
| 			if (!_FIXES_gIsFilterscript)
 | |
| 			{
 | |
| 				// Unusually, the call order here is always Game Mode first -
 | |
| 				// most callbacks are Filter Script first.
 | |
| 				if ((FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_TELEPORT) || ((FIXES_gsSettings & e_FIXES_SETTINGS_ADMIN_TELEPORT) && (IsPlayerAdmin(playerid))))
 | |
| 				{
 | |
| 					SetPlayerPosFindZ(playerid, fX, fY, fZ);
 | |
| 				}
 | |
| 			}
 | |
| 		#endif
 | |
| 		// ======================
 | |
| 		//  END:   AllowTeleport 
 | |
| 		// ======================
 | |
| 		return FIXES_OnPlayerClickMap(playerid, fX, fY, fZ);
 | |
| 	}
 | |
| 	
 | |
| 	#if defined _ALS_OnPlayerClickMap
 | |
| 		#error _ALS_OnPlayerClickMap defined
 | |
| 	#endif
 | |
| 	#define _ALS_OnPlayerClickMap
 | |
| 	#define OnPlayerClickMap(%0) FIXES_OnPlayerClickMap(%0) <_ALS : _ALS_go>
 | |
| 	
 | |
| 	_FIXES_FORWARD FIXES_OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ);
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_AllowPlayerTeleport(playerid, allow)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     AllowTeleport
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_AllowPlayerTeleport
 | |
| 	#error _ALS_AllowPlayerTeleport defined
 | |
| #endif
 | |
| native BAD_AllowPlayerTeleport(playerid, allow) = AllowPlayerTeleport;
 | |
| 
 | |
| #if FIX_AllowTeleport
 | |
| 	#if FIXES_Single
 | |
| 		stock FIXES_AllowPlayerTeleport(playerid, allow)
 | |
| 		{
 | |
| 			if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
 | |
| 			{
 | |
| 				if (allow)
 | |
| 				{
 | |
| 					FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_TELEPORT;
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_TELEPORT;
 | |
| 				}
 | |
| 			}
 | |
| 			return 0;
 | |
| 		}
 | |
| 	#else
 | |
| 		stock FIXES_AllowPlayerTeleport(playerid, allow)
 | |
| 		{
 | |
| 			if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
 | |
| 			{
 | |
| 				CallRemoteFunction(FIXES_gscAllowTeleport, FIXES_gscSpec@ii, playerid, allow);
 | |
| 			}
 | |
| 			return 0;
 | |
| 		}
 | |
| 	#endif
 | |
| 	
 | |
| 	#define _ALS_AllowPlayerTeleport
 | |
| 	#define AllowPlayerTeleport FIXES_AllowPlayerTeleport
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_AllowAdminTeleport(allow)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     AllowTeleport
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_AllowAdminTeleport
 | |
| 	#error _ALS_AllowAdminTeleport defined
 | |
| #endif
 | |
| native BAD_AllowAdminTeleport(allow) = AllowAdminTeleport;
 | |
| 
 | |
| #if FIX_AllowTeleport
 | |
| 	#if FIXES_Single
 | |
| 		stock FIXES_AllowAdminTeleport(allow)
 | |
| 		{
 | |
| 			if (allow)
 | |
| 			{
 | |
| 				FIXES_gsSettings |= e_FIXES_SETTINGS_ADMIN_TELEPORT;
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				FIXES_gsSettings &= ~e_FIXES_SETTINGS_ADMIN_TELEPORT;
 | |
| 			}
 | |
| 			return allow;
 | |
| 		}
 | |
| 	#else
 | |
| 		stock FIXES_AllowAdminTeleport(allow)
 | |
| 		{
 | |
| 			return
 | |
| 				CallRemoteFunction(FIXES_gscAllowTeleport, FIXES_gscSpec@ii, INVALID_PLAYER_ID, allow),
 | |
| 				allow;
 | |
| 		}
 | |
| 	#endif
 | |
| 	
 | |
| 	#define _ALS_AllowAdminTeleport
 | |
| 	#define AllowAdminTeleport FIXES_AllowAdminTeleport
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_AllowAdminTeleport(allow)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     AllowTeleport
 | |
|  */
 | |
| 
 | |
| #if FIX_AllowTeleport && !defined FILTERSCRIPT && !FIXES_Single
 | |
| 	public _FIXES_AllowTeleport(playerid, allow)
 | |
| 	{
 | |
| 		if (!_FIXES_gIsFilterscript)
 | |
| 		{
 | |
| 			if (playerid == INVALID_PLAYER_ID)
 | |
| 			{
 | |
| 				if (allow)
 | |
| 				{
 | |
| 					FIXES_gsSettings |= e_FIXES_SETTINGS_ADMIN_TELEPORT;
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					FIXES_gsSettings &= ~e_FIXES_SETTINGS_ADMIN_TELEPORT;
 | |
| 				}
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				if (allow)
 | |
| 				{
 | |
| 					FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_TELEPORT;
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_TELEPORT;
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_SetPlayerSpecialAction(playerid, actionid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     SetPlayerSpecialAction
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_SetPlayerSpecialAction
 | |
| 	#error _ALS_SetPlayerSpecialAction defined
 | |
| #endif
 | |
| native BAD_SetPlayerSpecialAction(playerid, actionid) = SetPlayerSpecialAction;
 | |
| 
 | |
| #if FIX_SetPlayerSpecialAction
 | |
| 	stock FIXES_SetPlayerSpecialAction(playerid, actionid)
 | |
| 	{
 | |
| 		if (GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_USEJETPACK)
 | |
| 		{
 | |
| 			ClearAnimations(playerid);
 | |
| 		}
 | |
| 		SetPlayerSpecialAction(playerid, actionid);
 | |
| 		return 1;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_SetPlayerSpecialAction
 | |
| 	#define SetPlayerSpecialAction FIXES_SetPlayerSpecialAction
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_ClearAnimations(playerid, forcesync = 0)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     ClearAnimations
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_ClearAnimations
 | |
| 	#error _ALS_ClearAnimations defined
 | |
| #endif
 | |
| native BAD_ClearAnimations(playerid, forcesync = 0) = ClearAnimations;
 | |
| 
 | |
| #if FIX_ClearAnimations || FIX_ClearAnimations_2
 | |
| 	stock FIXES_ClearAnimations(playerid, forcesync = 0)
 | |
| 	{
 | |
| 		#if FIX_ClearAnimations || FIX_ClearAnimations_2
 | |
| 			if (IsPlayerInAnyVehicle(playerid))
 | |
| 		#endif
 | |
| 		#if FIX_ClearAnimations
 | |
| 			{
 | |
| 				return ApplyAnimation(playerid, "PED", "CAR_SIT", 4.0, 0, 0, 0, 0, 1, forcesync);
 | |
| 			}
 | |
| 		#endif
 | |
| 		#if FIX_ClearAnimations + FIX_ClearAnimations_2 == 1 // XOR
 | |
| 			{
 | |
| 				return ClearAnimations(playerid, forcesync);
 | |
| 			}
 | |
| 		#endif
 | |
| 		#if FIX_ClearAnimations_2
 | |
| 			new
 | |
| 				ret = ClearAnimations(playerid, forcesync);
 | |
| 			ApplyAnimation(playerid, "PED", "IDLE_STANCE", 4.0, 0, 0, 0, 0, 1, forcesync);
 | |
| 			ApplyAnimation(playerid, "PED", "IDLE_CHAT", 4.0, 0, 0, 0, 0, 1, forcesync);
 | |
| 			ApplyAnimation(playerid, "PED", "WALK_PLAYER", 4.0, 0, 0, 0, 0, 1, forcesync);
 | |
| 			return ret;
 | |
| 		#endif
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_ClearAnimations
 | |
| 	#define ClearAnimations FIXES_ClearAnimations
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_GangZoneCreate(Float:minx, Float:miny, Float:maxx, Float:maxy)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     GangZoneCreate
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_GangZoneCreate
 | |
| 	#error _ALS_GangZoneCreate defined
 | |
| #endif
 | |
| native BAD_GangZoneCreate(Float:minx, Float:miny, Float:maxx, Float:maxy) = GangZoneCreate;
 | |
| 
 | |
| #if FIX_GangZoneCreate
 | |
| 	stock FIXES_GangZoneCreate(Float:minx, Float:miny, Float:maxx, Float:maxy)
 | |
| 	{
 | |
| 		return GangZoneCreate(floatsub(minx, floatfract(minx)), floatsub(miny, floatfract(miny)), floatsub(maxx, floatfract(maxx)), floatsub(maxy, floatfract(maxy)));
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_GangZoneCreate
 | |
| 	#define GangZoneCreate FIXES_GangZoneCreate
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_ShowPlayerDialog(playerid, dialog, style, title[], caption[], button1[], button2[])
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     OnDialogResponse
 | |
|  *     GetPlayerDialog
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_ShowPlayerDialog
 | |
| 	#error _ALS_ShowPlayerDialog defined
 | |
| #endif
 | |
| native BAD_ShowPlayerDialog(playerid, dialog, style, title[], caption[], button1[], button2[]) = ShowPlayerDialog;
 | |
| 
 | |
| #if FIX_OnDialogResponse || FIX_GetPlayerDialog
 | |
| 	stock FIXES_ShowPlayerDialog(playerid, dialog, style, title[], caption[], button1[], button2[])
 | |
| 	{
 | |
| 		if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
 | |
| 		{
 | |
| 			#if FIXES_Single
 | |
| 				FIXES_gsDialogID[playerid] = dialog;
 | |
| 			#else
 | |
| 				SetPVarInt(playerid, FIXES_pvarPlayerDialog, dialog);
 | |
| 			#endif
 | |
| 			return ShowPlayerDialog(playerid, dialog, style, title, caption, button1, button2);
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_ShowPlayerDialog
 | |
| 	#define ShowPlayerDialog FIXES_ShowPlayerDialog
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     OnDialogResponse
 | |
|  *     GetPlayerDialog
 | |
|  */
 | |
| 
 | |
| #if FIX_OnDialogResponse || FIX_GetPlayerDialog
 | |
| 	public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
 | |
| 	{
 | |
| 		// =========================
 | |
| 		//  BEGIN: OnDialogResponse 
 | |
| 		// =========================
 | |
| 		#if FIX_OnDialogResponse || FIX_GetPlayerDialog
 | |
| 			#if FIXES_Single
 | |
| 				#if FIX_OnDialogResponse
 | |
| 					dialogid = FIXES_gsDialogID[playerid];
 | |
| 				#endif
 | |
| 				FIXES_gsDialogID[playerid] = INVALID_DIALOG_ID;
 | |
| 			#elseif FIX_OnDialogResponse
 | |
| 				_FIXES_IS_IN_CHARGE()
 | |
| 				{
 | |
| 					// If there are multiple scripts, we can't just wipe the
 | |
| 					// current dialog data or subsequent scripts will display
 | |
| 					// the wrong value.
 | |
| 					dialogid = GetPVarInt(playerid, FIXES_pvarPlayerDialog),
 | |
| 					SetPVarInt(playerid, FIXES_pvarCurrentDialog, dialogid),
 | |
| 					SetPVarInt(playerid, FIXES_pvarPlayerDialog, INVALID_DIALOG_ID);
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					dialogid = GetPVarInt(playerid, FIXES_pvarCurrentDialog);
 | |
| 				}
 | |
| 			#else
 | |
| 				SetPVarInt(playerid, FIXES_pvarPlayerDialog, INVALID_DIALOG_ID);
 | |
| 			#endif
 | |
| 			if (inputtext[0])
 | |
| 			{
 | |
| 				return FIXES_OnDialogResponse(playerid, dialogid, response, listitem, inputtext);
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				return FIXES_OnDialogResponse(playerid, dialogid, response, listitem, FIXES_gscNULL);
 | |
| 			}
 | |
| 		#endif
 | |
| 		// =========================
 | |
| 		//  END:   OnDialogResponse 
 | |
| 		// =========================
 | |
| 	}
 | |
| 	
 | |
| 	#if defined _ALS_OnDialogResponse
 | |
| 		#error _ALS_OnDialogResponse defined
 | |
| 	#endif
 | |
| 	#define _ALS_OnDialogResponse
 | |
| 	#define OnDialogResponse(%0) FIXES_OnDialogResponse(%0) <_ALS : _ALS_go>
 | |
| 	
 | |
| 	_FIXES_FORWARD FIXES_OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]);
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_GetPlayerDialog(playerid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     GetPlayerDialog
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_GetPlayerDialog
 | |
| 	#error _ALS_GetPlayerDialog defined
 | |
| #endif
 | |
| native BAD_GetPlayerDialog(playerid) = GetPlayerDialog;
 | |
| 
 | |
| #if FIX_GetPlayerDialog
 | |
| 	stock FIXES_GetPlayerDialog(playerid)
 | |
| 	{
 | |
| 		if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
 | |
| 		{
 | |
| 			#if FIXES_Single
 | |
| 				return FIXES_gsDialogID[playerid];
 | |
| 			#else
 | |
| 				return GetPVarInt(playerid, FIXES_pvarPlayerDialog);
 | |
| 			#endif
 | |
| 		}
 | |
| 		return -1;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_GetPlayerDialog
 | |
| 	#define GetPlayerDialog FIXES_GetPlayerDialog
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_valstr(dest[], value, bool:pack = false)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     valstr
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_valstr
 | |
| 	#error _ALS_valstr defined
 | |
| #endif
 | |
| native BAD_valstr(dest[], value, bool:pack = false) = valstr;
 | |
| 
 | |
| #if FIX_valstr
 | |
| 	stock FIXES_valstr(dest[], value, bool:pack = false)
 | |
| 	{
 | |
| 		// "format" can't handle cellmin properly.
 | |
| 		static const
 | |
| 			sc_szCellmin[] = !"-2147483648";
 | |
| 		if (value == cellmin)
 | |
| 		{
 | |
| 			pack && strpack(dest, sc_szCellmin, 12) || strunpack(dest, sc_szCellmin, 12);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			format(dest, 12, "%d", value),
 | |
| 			pack && strpack(dest, dest, 12);
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_valstr
 | |
| 	#define valstr FIXES_valstr
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_fclose(File:handle)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     fclose
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_fclose
 | |
| 	#error _ALS_fclose defined
 | |
| #endif
 | |
| native BAD_fclose(File:handle) = fclose;
 | |
| 
 | |
| #if FIX_fclose
 | |
| 	stock bool:FIXES_fclose(File:handle)
 | |
| 	{
 | |
| 		return handle && fclose(handle);
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_fclose
 | |
| 	#define fclose FIXES_fclose
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_fwrite(File:handle, const string[])
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     fwrite
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_fwrite
 | |
| 	#error _ALS_fwrite defined
 | |
| #endif
 | |
| native BAD_fwrite(File:handle, const string[]) = fwrite;
 | |
| 
 | |
| #if FIX_fwrite
 | |
| 	stock FIXES_fwrite(File:handle, const string[])
 | |
| 	{
 | |
| 		return handle && fwrite(handle, string);
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_fwrite
 | |
| 	#define fwrite FIXES_fwrite
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_fread(File:handle, string[], size = sizeof (string), bool:pack = false)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     fread
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_fread
 | |
| 	#error _ALS_fread defined
 | |
| #endif
 | |
| native BAD_fread(File:handle, string[], size = sizeof (string), bool:pack = false) = fread;
 | |
| 
 | |
| #if FIX_fread
 | |
| 	stock FIXES_fread(File:handle, string[], size = sizeof (string), bool:pack = false)
 | |
| 	{
 | |
| 		return handle && fread(handle, string, size, pack);
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_fread
 | |
| 	#define fread FIXES_fread
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_fputchar(File:handle, value, bool:utf8 = true)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     fputchar
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_fputchar
 | |
| 	#error _ALS_fputchar defined
 | |
| #endif
 | |
| native BAD_fputchar(File:handle, value, bool:utf8 = true) = fputchar;
 | |
| 
 | |
| #if FIX_fputchar
 | |
| 	stock bool:FIXES_fputchar(File:handle, value, bool:utf8 = true)
 | |
| 	{
 | |
| 		return handle && fputchar(handle, value, utf8);
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_fputchar
 | |
| 	#define fputchar FIXES_fputchar
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_fgetchar(File:handle, value, bool:utf8 = true)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     fgetchar
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_fgetchar
 | |
| 	#error _ALS_fgetchar defined
 | |
| #endif
 | |
| native BAD_fgetchar(File:handle, value, bool:utf8 = true) = fgetchar;
 | |
| 
 | |
| #if FIX_fgetchar
 | |
| 	stock FIXES_fgetchar(File:handle, value, bool:utf8 = true)
 | |
| 	{
 | |
| 		return handle && fgetchar(handle, value, utf8);
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_fgetchar
 | |
| 	#define fgetchar FIXES_fgetchar
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_fblockwrite(File:handle, const buffer[], size = sizeof (buffer))
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     fblockwrite
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_fblockwrite
 | |
| 	#error _ALS_fblockwrite defined
 | |
| #endif
 | |
| native BAD_fblockwrite(File:handle, const buffer[], size = sizeof (buffer)) = fblockwrite;
 | |
| 
 | |
| #if FIX_fblockwrite
 | |
| 	stock FIXES_fblockwrite(File:handle, const buffer[], size = sizeof (buffer))
 | |
| 	{
 | |
| 		return handle && fblockwrite(handle, buffer, size);
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_fblockwrite
 | |
| 	#define fblockwrite FIXES_fblockwrite
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_fblockread(File:handle, buffer[], size = sizeof (buffer))
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     fblockread
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_fblockread
 | |
| 	#error _ALS_fblockread defined
 | |
| #endif
 | |
| native BAD_fblockread(File:handle, buffer[], size = sizeof (buffer)) = fblockread;
 | |
| 
 | |
| #if FIX_fblockread
 | |
| 	stock FIXES_fblockread(File:handle, buffer[], size = sizeof (buffer))
 | |
| 	{
 | |
| 		return handle && fblockread(handle, buffer, size);
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_fblockread
 | |
| 	#define fblockread FIXES_fblockread
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_fseek(File:handle, position = 0, seek_whence:whence = seek_start)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     fseek
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_fseek
 | |
| 	#error _ALS_fseek defined
 | |
| #endif
 | |
| native BAD_fseek(File:handle, position = 0, seek_whence:whence = seek_start) = fseek;
 | |
| 
 | |
| #if FIX_fseek
 | |
| 	stock FIXES_fseek(File:handle, position = 0, seek_whence:whence = seek_start)
 | |
| 	{
 | |
| 		return handle && fseek(handle, position, whence);
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_fseek
 | |
| 	#define fseek FIXES_fseek
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_flength(File:handle)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     flength
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_flength
 | |
| 	#error _ALS_flength defined
 | |
| #endif
 | |
| native BAD_flength(File:handle) = flength;
 | |
| 
 | |
| #if FIX_flength
 | |
| 	stock FIXES_flength(File:handle)
 | |
| 	{
 | |
| 		return handle && flength(handle);
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_flength
 | |
| 	#define flength FIXES_flength
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_Kick(playerid)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     Kick
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_Kick
 | |
| 	#error _ALS_Kick defined
 | |
| #endif
 | |
| native BAD_Kick(playerid) = Kick;
 | |
| 
 | |
| #if FIX_Kick
 | |
| 	forward _FIXES_Kick(playerid);
 | |
| 	
 | |
| 	public _FIXES_Kick(playerid)
 | |
| 	{
 | |
| 		FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_KICKED,
 | |
| 		Kick(playerid);
 | |
| 	}
 | |
| 	
 | |
| 	#if !FIXES_Single
 | |
| 		forward @FIXES_Kick(playerid);
 | |
| 		
 | |
| 		public @FIXES_Kick(playerid)
 | |
| 		{
 | |
| 			FIXES_BlockUpdate(playerid, true, 0);
 | |
| 		}
 | |
| 	#endif
 | |
| 	
 | |
| 	stock FIXES_Kick(playerid)
 | |
| 	{
 | |
| 		if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_ON_PLAYER_CONNECT)
 | |
| 		{
 | |
| 			// Disable as much of the server as possible quickly.
 | |
| 			return
 | |
| 				#if FIXES_Single
 | |
| 					FIXES_BlockUpdate(playerid, true, 0),
 | |
| 				#else
 | |
| 					CallRemoteFunction("@FIXES_Kick", "i", playerid),
 | |
| 				#endif
 | |
| 					TogglePlayerSpectating(playerid, true),
 | |
| 					TogglePlayerControllable(playerid, false),
 | |
| 					SetPVarInt(playerid, FIXES_pvarKick, SetTimerEx(FIXES_gscKick, 1000, 0, FIXES_gscSpec@i, playerid)),
 | |
| 					FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_KICKED,
 | |
| 					1;
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			return Kick(playerid);
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_Kick
 | |
| 	#define Kick FIXES_Kick
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_IsPAttachedObjectSlotUsed(playerid, index)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     IsPlayerAttachedObjectSlotUsed
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_IsPAttachedObjSlotUsed
 | |
| 	#error _ALS_IsPAttachedObjSlotUsed defined
 | |
| #endif
 | |
| native BAD_IsPlayerAttachedObjSlotUsed(playerid, index) = IsPlayerAttachedObjectSlotUsed;
 | |
| 
 | |
| #if FIX_IsPlayerAttachedObjSlotUsed
 | |
| 	stock FIXES_IsPAttachedObjectSlotUsed(playerid, index)
 | |
| 	{
 | |
| 		if (_FIXES_IS_PLAYER_CONNECTED(playerid))
 | |
| 		{
 | |
| 			return FIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] & 1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index;
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_IsPAttachedObjSlotUsed
 | |
| 	#define IsPlayerAttachedObjectSlotUsed FIXES_IsPAttachedObjectSlotUsed
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_SetPlayerAttachedObject(slot, to)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     IsPlayerAttachedObjectSlotUsed
 | |
|  */
 | |
| 
 | |
| #if (FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject) && !FIXES_Single
 | |
| 	forward _FIXES_SetPlayerAttachedObject(slot, to);
 | |
| 	
 | |
| 	public _FIXES_SetPlayerAttachedObject(slot, to)
 | |
| 	{
 | |
| 		FIXES_gsObjectSlots[slot] = to;
 | |
| 	}
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * 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)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     IsPlayerAttachedObjectSlotUsed
 | |
|  *     SetPlayerAttachedObject
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_SetPlayerAttachedObject
 | |
| 	#error _ALS_SetPlayerAttachedObject defined
 | |
| #endif
 | |
| 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;
 | |
| 
 | |
| #if FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject
 | |
| 	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)
 | |
| 	{
 | |
| 		if (SetPlayerAttachedObject(playerid, index, modelid, bone, fOffsetX, fOffsetY, fOffsetZ, fRotX, fRotY, fRotZ, fScaleX, fScaleY, fScaleZ, materialcolor1, materialcolor2))
 | |
| 		{
 | |
| 			#if FIXES_Single
 | |
| 				FIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] |= (1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index);
 | |
| 			#else
 | |
| 				new
 | |
| 					slot = playerid / _FIXES_ATTACHMENTS;
 | |
| 				CallRemoteFunction(FIXES_gscSetPlayerAttachedObj, FIXES_gscSpec@ii, slot, FIXES_gsObjectSlots[slot] | (1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index));
 | |
| 			#endif
 | |
| 			return 1;
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_SetPlayerAttachedObject
 | |
| 	#define SetPlayerAttachedObject FIXES_SetPlayerAttachedObject
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_RemovePlayerAttachedObj(playerid, index)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     IsPlayerAttachedObjectSlotUsed
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_RemovePlayerAttachedObject
 | |
| 	#error _ALS_RemovePlayerAttachedObject defined
 | |
| #endif
 | |
| native BAD_RemovePlayerAttachedObject(playerid, index) = RemovePlayerAttachedObject;
 | |
| 
 | |
| #if FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject
 | |
| 	stock FIXES_RemovePlayerAttachedObj(playerid, index)
 | |
| 	{
 | |
| 		if (RemovePlayerAttachedObject(playerid, index))
 | |
| 		{
 | |
| 			#if FIXES_Single
 | |
| 				FIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] &= ~(1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index);
 | |
| 			#else
 | |
| 				new
 | |
| 					slot = playerid / _FIXES_ATTACHMENTS;
 | |
| 				CallRemoteFunction(FIXES_gscSetPlayerAttachedObj, FIXES_gscSpec@ii, slot, FIXES_gsObjectSlots[slot] & ~(1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index));
 | |
| 			#endif
 | |
| 			return 1;
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_RemovePlayerAttachedObject
 | |
| 	#define RemovePlayerAttachedObject FIXES_RemovePlayerAttachedObj
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_DetermineOrder()
 | |
|  * 
 | |
|  * Figure out which the first filterscript to be called is so that it can do the
 | |
|  * majority of the work.  More detail:  Several pieces of code for some fixes
 | |
|  * rely on things like blocking "OnPlayerUpdate".  This should be done in the
 | |
|  * first script in which "OnPlayerUpdate" is called only, so we need to find out
 | |
|  * in advance which script will be called first (at least out of all the fixed
 | |
|  * scripts).
 | |
|  */
 | |
| 
 | |
| #if !FIXES_Single
 | |
| 	public _FIXES_DetermineOrder()
 | |
| 	{
 | |
| 		// TODO: Graceful handoff.  I thought I was past all this rubbish!
 | |
| 		if (!_FIXES_gIsFilterscript)
 | |
| 		{
 | |
| 			if (existproperty(5, FIXES_gscNoGMProperty))
 | |
| 			{
 | |
| 				return 0;
 | |
| 			}
 | |
| 			// Make sure certain data is synced with what the GM thinks it is.
 | |
| 			// =============================
 | |
| 			//  BEGIN: AllowInteriorWeapons 
 | |
| 			// =============================
 | |
| 			#if FIX_AllowInteriorWeapons
 | |
| 				CallRemoteFunction(FIXES_gscAllowInteriorWeapons, FIXES_gscSpec@i, !(FIXES_gsSettings & e_FIXES_SETTINGS_INTERIOR));
 | |
| 			#endif
 | |
| 			// =============================
 | |
| 			//  END: AllowInteriorWeapons 
 | |
| 			// =============================
 | |
| 			
 | |
| 			// ================================
 | |
| 			//  BEGIN: SetPlayerAttachedObject 
 | |
| 			// ================================
 | |
| 			#if FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject
 | |
| 				for (new i = 0; i != _FIXES_ATTACHMENTS; ++i)
 | |
| 				{
 | |
| 					CallRemoteFunction(FIXES_gscSetPlayerAttachedObj, FIXES_gscSpec@ii, i, FIXES_gsObjectSlots[i]);
 | |
| 				}
 | |
| 			#endif
 | |
| 			// ==============================
 | |
| 			//  END: SetPlayerAttachedObject 
 | |
| 			// ==============================
 | |
| 		}
 | |
| 		if (existproperty(5, FIXES_gscOrderProperty))
 | |
| 		{
 | |
| 			// Either this is a Filter Script (1) and we don't want gamemodes
 | |
| 			// (1) or this isn't a filterscript (0) and we do want gamemodes
 | |
| 			// (0).  All other cases return here due to a logic mismatch.  This
 | |
| 			// is to rectify the difference in call orders between
 | |
| 			// "CallRemoteFunction" and normal callbacks.  Now DOESN'T end on
 | |
| 			// the second time round for filterscripts to correctly pass on the
 | |
| 			// data to GameModes.
 | |
| 			if (!existproperty(5, FIXES_gscNoGMProperty) && _FIXES_gIsFilterscript == bool:getproperty(5, FIXES_gscOrderProperty))
 | |
| 			{
 | |
| 				// The game mode is not in charge, which means we are checking
 | |
| 				// the filterscripts a second time and shouldn't be.
 | |
| 				return 0;
 | |
| 			}
 | |
| 			// If this script was previously the owner, and we are not ending
 | |
| 			// the game mode (in which case discard all data), and if we are
 | |
| 			// only dealing with filterscripts or the gamemode is now the
 | |
| 			// master.
 | |
| 			if (FIXES_gsSettings & (e_FIXES_SETTINGS_IN_CHARGE | e_FIXES_SETTINGS_DROP_ALL_DATA) == e_FIXES_SETTINGS_IN_CHARGE)
 | |
| 			{
 | |
| 				FIXES_PRINTF("_FIXES_DetermineOrder: Was in charge");
 | |
| 				// This script is currently in charge, but a new script has
 | |
| 				// usurped it!  Pass all relevant data over to the new script.
 | |
| 				// Also, this wasn't triggered by a game mode change (where we
 | |
| 				// just want to dump and reset all data).  There is no need to
 | |
| 				// reset the admin teleport data as that is always handled by
 | |
| 				// the Game Mode, so it will either be correct, or it will be
 | |
| 				// blank.
 | |
| 				FIXES_gsSettings &= ~e_FIXES_SETTINGS_IN_CHARGE;
 | |
| 				#if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable
 | |
| 					_FIXES_FOREACH(FIXES_gsPlayersIterator, i)
 | |
| 					{
 | |
| 						// =================
 | |
| 						//  BEGIN: GameText 
 | |
| 						// =================
 | |
| 						#if FIX_GameText
 | |
| 							for (new j = 0; j != FIXES_GT_STYLE_COUNT; ++j)
 | |
| 							{
 | |
| 								PlayerTextDrawDestroy(i, FIXES_gsPGTStyle[i][j]);
 | |
| 							}
 | |
| 						#endif
 | |
| 						// =================
 | |
| 						//  END:   GameText 
 | |
| 						// =================
 | |
| 						
 | |
| 						// =============================
 | |
| 						//  BEGIN: SetPlayerWorldBounds 
 | |
| 						// =============================
 | |
| 						#if FIX_SetPlayerWorldBounds
 | |
| 							// I realised that you could have the GM in charge,
 | |
| 							// set their bounds, load an FS, remove their bounds
 | |
| 							// then unload the FS again and it would result in
 | |
| 							// the old GM setting of them HAVING bounds being
 | |
| 							// re-applied, so the check is removed.
 | |
| 							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]);
 | |
| 						#endif
 | |
| 						// =============================
 | |
| 						//  END:   SetPlayerWorldBounds 
 | |
| 						// =============================
 | |
| 						
 | |
| 						// =================================
 | |
| 						//  BEGIN: TogglePlayerControllable 
 | |
| 						// =================================
 | |
| 						#if FIX_TogglePlayerControllable
 | |
| 							CallRemoteFunction(FIXES_gscTogglePlayerControl, FIXES_gscSpec@ii, i, !(FIXES_gsPlayerBools[i] & e_FIXES_BOOLS_UNCONTROLLABLE));
 | |
| 						#endif
 | |
| 						// =================================
 | |
| 						//  END:   TogglePlayerControllable 
 | |
| 						// =================================
 | |
| 						
 | |
| 						// ===========================
 | |
| 						//  BEGIN: PutPlayerInVehicle 
 | |
| 						// ===========================
 | |
| 						#if FIX_PutPlayerInVehicle
 | |
| 							if (FIXES_gsPlayerBools[i] & e_FIXES_BOOLS_PUT_IN_VEHICLE)
 | |
| 							{
 | |
| 								CallRemoteFunction(FIXES_gscPutPlayerInVehicle, FIXES_gscSpec@iii, i, FIXES_gsVehicleSeatData[i] & 0x00FFFFFF, FIXES_gsVehicleSeatData[i] >>> 24);
 | |
| 							}
 | |
| 						#endif
 | |
| 						// ===========================
 | |
| 						//  END:   PutPlayerInVehicle 
 | |
| 						// ===========================
 | |
| 					}
 | |
| 				#endif
 | |
| 				
 | |
| 				// =================
 | |
| 				//  BEGIN: GameText 
 | |
| 				// =================
 | |
| 				#if FIX_GameText
 | |
| 					#if FIX_GameTextStyles
 | |
| 						TextDrawDestroy(FIXES_gsGTStyle[13]),
 | |
| 						TextDrawDestroy(FIXES_gsGTStyle[12]),
 | |
| 						TextDrawDestroy(FIXES_gsGTStyle[11]),
 | |
| 						TextDrawDestroy(FIXES_gsGTStyle[10]),
 | |
| 						TextDrawDestroy(FIXES_gsGTStyle[9]),
 | |
| 						TextDrawDestroy(FIXES_gsGTStyle[8]),
 | |
| 						TextDrawDestroy(FIXES_gsGTStyle[7]),
 | |
| 					#endif
 | |
| 						TextDrawDestroy(FIXES_gsGTStyle[6]),
 | |
| 						TextDrawDestroy(FIXES_gsGTStyle[5]),
 | |
| 						TextDrawDestroy(FIXES_gsGTStyle[4]),
 | |
| 						TextDrawDestroy(FIXES_gsGTStyle[3]),
 | |
| 						TextDrawDestroy(FIXES_gsGTStyle[2]),
 | |
| 						TextDrawDestroy(FIXES_gsGTStyle[1]),
 | |
| 						TextDrawDestroy(FIXES_gsGTStyle[0]);
 | |
| 				#endif
 | |
| 				// =================
 | |
| 				//  END:   GameText 
 | |
| 				// =================
 | |
| 				
 | |
| 				FIXES_PRINTF("_FIXES_DetermineOrder: Not in charge");
 | |
| 				return 0;
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				FIXES_gsSettings &= ~e_FIXES_SETTINGS_IN_CHARGE;
 | |
| 				FIXES_PRINTF("_FIXES_DetermineOrder: Not in charge");
 | |
| 				return 0;
 | |
| 			}
 | |
| 		}
 | |
| 		else if (!(FIXES_gsSettings & e_FIXES_SETTINGS_ENDING))
 | |
| 		{
 | |
| 			setproperty(5, FIXES_gscOrderProperty, _FIXES_gIsFilterscript);
 | |
| 			#if FIXES_Debug
 | |
| 				if (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)
 | |
| 				{
 | |
| 					FIXES_PRINTF("_FIXES_DetermineOrder: Already in charge");
 | |
| 				}
 | |
| 			#endif
 | |
| 			FIXES_gsSettings |= e_FIXES_SETTINGS_IN_CHARGE;
 | |
| 			FIXES_PRINTF("_FIXES_DetermineOrder: Now in charge");
 | |
| 			
 | |
| 			// =================
 | |
| 			//  BEGIN: GameText 
 | |
| 			// =================
 | |
| 			#if FIX_GameText
 | |
| 				// Create all the relevant TextDraws.
 | |
| 				_FIXES_FOREACH(FIXES_gsPlayersIterator, playerid)
 | |
| 				{
 | |
| 					_FIXES_CreateGameTextDraws(playerid);
 | |
| 				}
 | |
| 				_FIXES_CreateGameTextDraws(INVALID_PLAYER_ID);
 | |
| 			#endif
 | |
| 			// =================
 | |
| 			//  END:   GameText 
 | |
| 			// =================
 | |
| 			return 1;
 | |
| 		}
 | |
| 		else if (!(FIXES_gsSettings & e_FIXES_SETTINGS_ENDED))
 | |
| 		{
 | |
| 			// Only called when a filterscript that is currently master (and
 | |
| 			// thus called first by "CallRemoteFunction") ends.  This doesn't
 | |
| 			// get triggered when a gamemode is master, but that doesn't matter
 | |
| 			// because in that case all the textdraws are destroyed anyway.
 | |
| 			
 | |
| 			// =================
 | |
| 			//  BEGIN: GameText 
 | |
| 			// =================
 | |
| 			#if FIX_GameText
 | |
| 					// Destroy all the relevant TextDraws.
 | |
| 					_FIXES_FOREACH(FIXES_gsPlayersIterator, playerid)
 | |
| 					{
 | |
| 						#if FIX_GameTextStyles
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][13]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][12]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][11]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][10]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][9]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][8]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][7]),
 | |
| 						#endif
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][6]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][5]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][4]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][3]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][2]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][1]),
 | |
| 							PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][0]);
 | |
| 					}
 | |
| 				#if FIX_GameTextStyles
 | |
| 					TextDrawDestroy(FIXES_gsGTStyle[13]),
 | |
| 					TextDrawDestroy(FIXES_gsGTStyle[12]),
 | |
| 					TextDrawDestroy(FIXES_gsGTStyle[11]),
 | |
| 					TextDrawDestroy(FIXES_gsGTStyle[10]),
 | |
| 					TextDrawDestroy(FIXES_gsGTStyle[9]),
 | |
| 					TextDrawDestroy(FIXES_gsGTStyle[8]),
 | |
| 					TextDrawDestroy(FIXES_gsGTStyle[7]),
 | |
| 				#endif
 | |
| 					TextDrawDestroy(FIXES_gsGTStyle[6]),
 | |
| 					TextDrawDestroy(FIXES_gsGTStyle[5]),
 | |
| 					TextDrawDestroy(FIXES_gsGTStyle[4]),
 | |
| 					TextDrawDestroy(FIXES_gsGTStyle[3]),
 | |
| 					TextDrawDestroy(FIXES_gsGTStyle[2]),
 | |
| 					TextDrawDestroy(FIXES_gsGTStyle[1]),
 | |
| 					TextDrawDestroy(FIXES_gsGTStyle[0]);
 | |
| 			#endif
 | |
| 			// =================
 | |
| 			//  END:   GameText 
 | |
| 			// =================
 | |
| 			
 | |
| 			#if FIXES_Debug
 | |
| 				FIXES_PRINTF("_FIXES_DetermineOrder: Ending");
 | |
| 			#endif
 | |
| 			
 | |
| 			FIXES_gsSettings |= e_FIXES_SETTINGS_ENDED;
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_strins(string[], const substr[], pos, maxlength = sizeof string)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     strins
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_strins
 | |
| 	#error _ALS_strins defined
 | |
| #endif
 | |
| native BAD_strins(string[], const substr[], pos, maxlength = sizeof string) = strins;
 | |
| 
 | |
| #if FIX_strins
 | |
| 	stock FIXES_strins(string[], const substr[], pos, maxlength = sizeof string)
 | |
| 	{
 | |
| 		if (string[0] > 255)
 | |
| 		{
 | |
| 			new
 | |
| 				strlength = strlen(string),
 | |
| 				sublength = strlen(substr),
 | |
| 				m4 = maxlength * 4;
 | |
| 			// Packed - format doesn't like these strings.
 | |
| 			if (strlength + sublength >= m4)
 | |
| 			{
 | |
| 				if (pos + sublength >= m4)
 | |
| 				{
 | |
| 					return
 | |
| 						string{pos} = '\0',
 | |
| 						// Hopefully this doesn't ignore maxlength and does packed.
 | |
| 						strcat(string, substr, maxlength);
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					// pos + sublength is less than maxlength, so this sum MUST
 | |
| 					// be positive and gte than "pos", so there's no need for
 | |
| 					// additional checks.
 | |
| 					string{maxlength - sublength - 1} = '\0';
 | |
| 				}
 | |
| 			}
 | |
| 			return strins(string, substr, pos, maxlength);
 | |
| 		}
 | |
| 		else if (substr[0] > 255)
 | |
| 		{
 | |
| 			new
 | |
| 				strlength = strlen(string),
 | |
| 				sublength = strlen(substr);
 | |
| 			// Packed - format doesn't like these strings.
 | |
| 			if (strlength + sublength >= maxlength)
 | |
| 			{
 | |
| 				if (pos + sublength >= maxlength)
 | |
| 				{
 | |
| 					return
 | |
| 						string[pos] = '\0',
 | |
| 						// Hopefully this doesn't ignore maxlength and does packed.
 | |
| 						strcat(string, substr, maxlength);
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					// pos + sublength is less than maxlength, so this sum MUST
 | |
| 					// be positive and gte than "pos", so there's no need for
 | |
| 					// additional checks.
 | |
| 					string[maxlength - sublength - 1] = '\0';
 | |
| 				}
 | |
| 			}
 | |
| 			return strins(string, substr, pos, maxlength);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			return format(string, maxlength, "%.*s%s%s", pos, string, substr, string[pos]);
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_strins
 | |
| 	#define strins FIXES_strins
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_ApplyAnimation(playerid, animlib, Float:fDelta, loop, lockx, locky, freeze, time, forcesync)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     ApplyAnimation_2
 | |
|  */
 | |
| 
 | |
| #if FIX_ApplyAnimation_2
 | |
| 	forward _FIXES_ApplyAnimation(playerid, animlib, Float:fDelta, loop, lockx, locky, freeze, time, forcesync);
 | |
| 	
 | |
| 	public _FIXES_ApplyAnimation(playerid, animlib, Float:fDelta, loop, lockx, locky, freeze, time, forcesync)
 | |
| 	{
 | |
| 		ApplyAnimation(playerid, FIXES_gscAnimLib[animlib], FIXES_gsClassAnimName[playerid], fDelta, loop, lockx, locky, freeze, time, forcesync),
 | |
| 		FIXES_gsAnimTimer[playerid] = 0;
 | |
| 	}
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_ApplyAnimation(playerid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time, forcesync = 0)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     ApplyAnimation
 | |
|  *     ApplyAnimation_2
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_ApplyAnimation
 | |
| 	#error _ALS_ApplyAnimation defined
 | |
| #endif
 | |
| native BAD_ApplyAnimation(playerid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time, forcesync = 0) = ApplyAnimation;
 | |
| 
 | |
| #if FIX_ApplyAnimation || FIX_ApplyAnimation_2
 | |
| 	stock FIXES_ApplyAnimation(playerid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time, forcesync = 0)
 | |
| 	{
 | |
| 		new
 | |
| 			diff,
 | |
| 			idx = animlib[0] & ~0x20;
 | |
| 		// Uses a sort of optimised binary search.  The code first identifies the area in the array
 | |
| 		// in which libraries with this first letter are, then does a binary search using only that
 | |
| 		// subset of the array.  This used to use an N-ary search that just went linearly through
 | |
| 		// the identified subset of the array, and that was 5x faster than a simple linear loop over
 | |
| 		// the whole array.  This new version is 50% faster than even that was.  "E" has no
 | |
| 		// libraries, but we don't check for that explicitly as it would slow down the more common
 | |
| 		// code path - and it ends fairly quickly anyway as "upper == lower".
 | |
| 		if (_FIXES_IN_RANGE(idx, 'A', 'W' + 1))
 | |
| 		{
 | |
| 			new
 | |
| 				upper = FIXES_gscAnimIndexes[idx - ('A' - 1)],
 | |
| 				lower = FIXES_gscAnimIndexes[idx - 'A'];
 | |
| 			while (upper != lower)
 | |
| 			{
 | |
| 				idx = (upper - lower) / 2 + lower;
 | |
| 				if ((diff = strcmp(FIXES_gscAnimLib[idx], animlib, true)))
 | |
| 				{
 | |
| 					if (diff > 0) upper = idx;
 | |
| 					else lower = idx + 1;
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					// If we hit the "else" branch, we have found the correct
 | |
| 					// animation library from the n-ary search.
 | |
| 					#if FIX_ApplyAnimation_2
 | |
| 						if (FIXES_gsAnimTimer[playerid])
 | |
| 						{
 | |
| 							KillTimer(FIXES_gsAnimTimer[playerid]),
 | |
| 							FIXES_gsAnimTimer[playerid] = 0;
 | |
| 						}
 | |
| 						if (FIXES_gsPlayerAnimLibs[playerid][idx >>> 5] & (1 << (idx & 0x1F)))
 | |
| 						{
 | |
| 							FIXES_gsPlayerAnimLibs[playerid][idx >>> 5] &= ~(1 << (idx & 0x1F)),
 | |
| 							FIXES_gsClassAnimName[playerid][0] = '\0',
 | |
| 							strcat(FIXES_gsClassAnimName[playerid], animname),
 | |
| 							FIXES_gsAnimTimer[playerid] = SetTimerEx("_FIXES_ApplyAnimation", 350, false, "ddfdddddd", playerid, idx, fDelta, loop, lockx, locky, freeze, time, forcesync);
 | |
| 						}
 | |
| 					#endif
 | |
| 						return ApplyAnimation(playerid, animlib, animname, fDelta, loop, lockx, locky, freeze, time, forcesync);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_ApplyAnimation
 | |
| 	#define ApplyAnimation FIXES_ApplyAnimation
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_random(max)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     random
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_random
 | |
| 	#error _ALS_random defined
 | |
| #endif
 | |
| native BAD_random(max) = random;
 | |
| 
 | |
| #if FIX_random
 | |
| 	stock FIXES_random(max)
 | |
| 	{
 | |
| 		if (max < 0)
 | |
| 		{
 | |
| 			return -random(-max);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			return random(max);
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_random
 | |
| 	#define random FIXES_random
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_SetCamera
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     SetPlayerCamera
 | |
|  */
 | |
| 
 | |
| #if FIX_SetPlayerCamera
 | |
| 	forward _FIXES_SetCamera(playerid, type, Float:x, Float:y, Float:z);
 | |
| 
 | |
| 	public _FIXES_SetCamera(playerid, type, Float:x, Float:y, Float:z)
 | |
| 	{
 | |
| 		if (type)
 | |
| 		{
 | |
| 			SetPlayerCameraPos(playerid, x, y, z);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			SetPlayerCameraLookAt(playerid, x, y, z);
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     SetPlayerCamera
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_SetPlayerCameraPos
 | |
| 	#error _ALS_SetPlayerCameraPos defined
 | |
| #endif
 | |
| native BAD_SetPlayerCameraPos(playerid, Float:x, Float:y, Float:z) = SetPlayerCameraPos;
 | |
| 
 | |
| #if FIX_SetPlayerCamera
 | |
| 	stock FIXES_SetPlayerCameraPos(playerid, Float:x, Float:y, Float:z)
 | |
| 	{
 | |
| 		if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
 | |
| 		{
 | |
| 			#if FIXES_Single
 | |
| 				if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_SPECTATING || GetPlayerState(playerid) == PLAYER_STATE_SPECTATING)
 | |
| 			#else
 | |
| 				if (GetPVarInt(playerid, FIXES_pvarPlayerSpectate) || GetPlayerState(playerid) == PLAYER_STATE_SPECTATING)
 | |
| 			#endif
 | |
| 				{
 | |
| 					SetTimerEx(FIXES_gscSetCamera, 300, 0, FIXES_gscSpec@iifff, playerid, 1, x, y, z);
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					SetPlayerCameraPos(playerid, x, y, z);
 | |
| 				}
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_SetPlayerCameraPos
 | |
| 	#define SetPlayerCameraPos FIXES_SetPlayerCameraPos
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     SetPlayerCamera
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_SetPlayerCameraLookAt
 | |
| 	#error _ALS_SetPlayerCameraLookAt defined
 | |
| #endif
 | |
| native BAD_SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z) = SetPlayerCameraLookAt;
 | |
| 
 | |
| #if FIX_SetPlayerCamera
 | |
| 	stock FIXES_SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z)
 | |
| 	{
 | |
| 		if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
 | |
| 		{
 | |
| 			#if FIXES_Single
 | |
| 				if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_SPECTATING || GetPlayerState(playerid) == PLAYER_STATE_SPECTATING)
 | |
| 			#else
 | |
| 				if (GetPVarInt(playerid, FIXES_pvarPlayerSpectate) || GetPlayerState(playerid) == PLAYER_STATE_SPECTATING)
 | |
| 			#endif
 | |
| 				{
 | |
| 					SetTimerEx(FIXES_gscSetCamera, 300, 0, FIXES_gscSpec@iifff, playerid, 0, x, y, z);
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					SetPlayerCameraLookAt(playerid, x, y, z);
 | |
| 				}
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_SetPlayerCameraLookAt
 | |
| 	#define SetPlayerCameraLookAt FIXES_SetPlayerCameraLookAt
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_TogglePlayerSpectating(playerid, toggle)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     SetPlayerCamera
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_TogglePlayerSpectating
 | |
| 	#error _ALS_TogglePlayerSpectating defined
 | |
| #endif
 | |
| native BAD_TogglePlayerSpectating(playerid, toggle) = TogglePlayerSpectating;
 | |
| 
 | |
| #if FIX_SetPlayerCamera
 | |
| 	stock FIXES_TogglePlayerSpectating(playerid, toggle)
 | |
| 	{
 | |
| 		if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
 | |
| 		{
 | |
| 			if (toggle)
 | |
| 			{
 | |
| 				#if FIXES_Single
 | |
| 					FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_SPECTATING;
 | |
| 				#else
 | |
| 					SetPVarInt(playerid, FIXES_pvarPlayerSpectate, 1);
 | |
| 				#endif
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				#if FIXES_Single
 | |
| 					FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_SPECTATING;
 | |
| 				#else
 | |
| 					DeletePVar(playerid, FIXES_pvarPlayerSpectate);
 | |
| 				#endif
 | |
| 			}
 | |
| 			return TogglePlayerSpectating(playerid, toggle);
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_TogglePlayerSpectating
 | |
| 	#define TogglePlayerSpectating FIXES_TogglePlayerSpectating
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_SetPlayerTime(playerid, hour, minute)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     SetPlayerTime
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_SetPlayerTime
 | |
| 	#error _ALS_SetPlayerTime defined
 | |
| #endif
 | |
| native BAD_SetPlayerTime(playerid, hour, minute) = SetPlayerTime;
 | |
| 
 | |
| #if FIX_SetPlayerTime
 | |
| 	forward _FIXES_SetTime(playerid, hour, minute);
 | |
| 	
 | |
| 	public _FIXES_SetTime(playerid, hour, minute)
 | |
| 	{
 | |
| 		if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_ON_PLAYER_CONNECT)
 | |
| 		{
 | |
| 			return SetPlayerTime(playerid, hour, minute);
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	stock FIXES_SetPlayerTime(playerid, hour, minute)
 | |
| 	{
 | |
| 		if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
 | |
| 		{
 | |
| 			if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_ON_PLAYER_CONNECT)
 | |
| 			{
 | |
| 				return SetTimerEx(FIXES_gscSetTime, 250, 0, FIXES_gscSpec@iii, playerid, hour, minute);
 | |
| 			}
 | |
| 			return SetPlayerTime(playerid, hour, minute);
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_SetPlayerTime
 | |
| 	#define SetPlayerTime FIXES_SetPlayerTime
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_SetPlayerColor(playerid, color)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     SetPlayerColor
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_SetPlayerColor
 | |
| 	#error _ALS_SetPlayerColor defined
 | |
| #endif
 | |
| native BAD_SetPlayerColor(playerid, color) = SetPlayerColor;
 | |
| 
 | |
| #if FIX_SetPlayerColour
 | |
| 	forward _FIXES_SetColor(playerid, color);
 | |
| 	
 | |
| 	public _FIXES_SetColor(playerid, color)
 | |
| 	{
 | |
| 		if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_ON_PLAYER_CONNECT)
 | |
| 		{
 | |
| 			return SetPlayerColor(playerid, color);
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	stock FIXES_SetPlayerColor(playerid, color)
 | |
| 	{
 | |
| 		if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS))
 | |
| 		{
 | |
| 			if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_ON_PLAYER_CONNECT)
 | |
| 			{
 | |
| 				return SetTimerEx(FIXES_gscSetColor, 300, 0, FIXES_gscSpec@ii, playerid, color);
 | |
| 			}
 | |
| 			return SetPlayerColor(playerid, color);
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_SetPlayerColor
 | |
| 	#define SetPlayerColor FIXES_SetPlayerColor
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_GetPlayerWeaponData(playerid, slot, &weapons, &ammo)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     GetPlayerWeaponData
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_GetPlayerWeaponData
 | |
| 	#error _ALS_GetPlayerWeaponData defined
 | |
| #endif
 | |
| native BAD_GetPlayerWeaponData(playerid, slot, &weapons, &ammo) = GetPlayerWeaponData;
 | |
| 
 | |
| #if FIX_GetPlayerWeaponData
 | |
| 	stock FIXES_GetPlayerWeaponData(playerid, slot, &weapons, &ammo)
 | |
| 	{
 | |
| 		// This reuses the "slot" variable so we don't have to declare a new one
 | |
| 		// and can put all the code in a single statement.
 | |
| 		return
 | |
| 			slot = GetPlayerWeaponData(playerid, slot, weapons, ammo),
 | |
| 			weapons = ammo ? weapons : 0,
 | |
| 			slot;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_GetPlayerWeaponData
 | |
| 	#define GetPlayerWeaponData FIXES_GetPlayerWeaponData
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * FIXES_sleep(const time)
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     sleep
 | |
|  */
 | |
| 
 | |
| // Uses a little trick to consume part of the line and thus not match
 | |
| // our hooked version.
 | |
| #if defined _ALS_sleep
 | |
| 	#error _ALS_sleep defined
 | |
| #endif
 | |
| #define BAD_sleep%0\n%9 sleep%0
 | |
| 
 | |
| #if FIX_sleep
 | |
| 	stock FIXES_sleep(ms)
 | |
| 	{
 | |
| 		// Call a native function that does very little, but saves the current
 | |
| 		// heap pointer.  Then return to save the accurate stack pointer.
 | |
| 		return heapspace(), ms;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_sleep
 | |
| 	
 | |
| 	#define sleep%0\n%9 sleep FIXES_sleep(%0)
 | |
| 	// This fixes another BIZZARE bug.  Just doing:
 | |
| 	//
 | |
| 	//  #define FIXES_sleep(%0;) FIXES_sleep(%0)
 | |
| 	//
 | |
| 	// Results in:
 | |
| 	//
 | |
| 	//  FIXES_sleep(n));
 | |
| 	//
 | |
| 	// Which clearly it shouldn't.  I've stepped through the compilation and that
 | |
| 	// extra bracket comes from nowhere!
 | |
| 	#define FIXES_sleep(%0;) FIXES_sleep _FIXES_SLEEP_BRACKET %0);
 | |
| 	#define _FIXES_SLEEP_BRACKET (
 | |
| #endif
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_AddInternal(array[], value, size)
 | |
|  * 
 | |
|  * Add something to an internal linked list.
 | |
|  */
 | |
| 
 | |
| static stock _FIXES_AddInternal(array[], value, size)
 | |
| {
 | |
| 	if (array[value] <= value)
 | |
| 	{
 | |
| 		new
 | |
| 			last = size,
 | |
| 			next = array[last];
 | |
| 		while (next < value)
 | |
| 		{
 | |
| 			last = next,
 | |
| 			next = array[last];
 | |
| 		}
 | |
| 		array[next - 1] = value + 1,
 | |
| 		array[(value - 1) % (size + 1)] = (last + 1) % (size + 1),
 | |
| 		array[last] = value,
 | |
| 		array[value] = next;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /* 
 | |
|  * _FIXES_RemoveInternal(array[], value, size)
 | |
|  * 
 | |
|  * Remove something from an internal linked list.
 | |
|  */
 | |
| 
 | |
| static stock _FIXES_RemoveInternal(array[], value, size)
 | |
| {
 | |
| 	if (array[value] > value)
 | |
| 	{
 | |
| 		static
 | |
| 			last;
 | |
| 		// Adjustment for easier "mod"ing.
 | |
| 		++size,
 | |
| 		last = (array[(value - 1) % size] - 1) % size,
 | |
| 		// Store the reverse value here as well as in the previous slot.
 | |
| 		array[value] =
 | |
| 			// Copy the next value to the last value.
 | |
| 			array[(array[last] = array[value]) - 1] =
 | |
| 				// Set the reverse iterator value.
 | |
| 				(last + 1) % size;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| #undef _FIXES_CEILDIV
 | |
| #undef _FIXES_INFINITY
 | |
| #undef _FIXES_N_INFINITY
 | |
| #undef _FIXES_ATTACHMENTS
 | |
| #undef _FIXES_FOREACH
 | |
| #undef _FIXES_IS_UNSET
 | |
| #undef _FIXES_IS_IN_CHARGE
 | |
| #undef _FIXES_IN_RANGE
 | |
| #undef _FIXES_NO_RANGE
 | |
| #undef _FIXES_FORWARD
 | |
| #undef _FIXES_IS_PLAYER_CONNECTED
 | |
| #undef FIXES_PRINTF
 | |
| 
 | |
| #endinput
 | |
| 
 | |
| // Fix inclusion template.
 | |
| 
 | |
| #if !defined FIX_NameOfFixHere
 | |
| 	#define FIX_NameOfFixHere            (1)
 | |
| #elseif _FIXES_IS_UNSET(FIX_NameOfFixHere)
 | |
| 	#undef FIX_NameOfFixHere
 | |
| 	#define FIX_NameOfFixHere            (2)
 | |
| #endif
 | |
| 
 | |
| // Fix function template.
 | |
| 
 | |
| /* 
 | |
|  * FIXES_NameOfFixHere
 | |
|  * 
 | |
|  * FIXES:
 | |
|  *     NameOfFixHere
 | |
|  */
 | |
| 
 | |
| #if defined _ALS_NameOfFixHere
 | |
| 	#error _ALS_NameOfFixHere defined
 | |
| #endif
 | |
| native BAD_NameOfFixHere(params) = NameOfFixHere;
 | |
| 
 | |
| #if FIX_NameOfFixHere
 | |
| 	stock FIXES_NameOfFixHere(params)
 | |
| 	{
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	#define _ALS_NameOfFixHere
 | |
| 	#define NameOfFixHere FIXES_NameOfFixHere
 | |
| #endif
 | |
| 
 |