/* * =============== * 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 * * 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: Entring military aircraft with a sniper rifle messes up vies. * 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: 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: 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: 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: All file.inc fixes are included separately for 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 * * 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 * * ============== * 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, and locals lower camel * case "likeThis". * * ALS should be used to hook functions and callbacks. * * The ALS prefix for chaining is also "FIXES_" * * Enums start with "E_" or "e_" depending on type, then follow rules for * macros. * * Use "FIXES_gsCallbackHooks" and "E_FIXES_CALLBACK_HOOKS" for ALS chaining. * * 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. * * 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). * * 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. * * 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 * #define FIX_TogglePlayerControllable (!defined SetObjectMaterial) * #endif * * This only includes this fix if that native doesn't exist. * * 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 * * Documentation explanation: * * FIX: * PROBLEM: * SOLUTION: * SEE: * AUTHOR: * POST: * FIXED IN: */ #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_GetPlayerColor #if defined FIX_GetPlayerColour #define FIX_GetPlayerColor (FIX_GetPlayerColour) #else #define FIX_GetPlayerColor (1) #endif #endif #if _FIXES_IS_UNSET(FIX_GetPlayerColor) #undef FIX_GetPlayerColor #define FIX_GetPlayerColor (0) #endif #if !defined FIX_FILTERSCRIPT #define FIX_FILTERSCRIPT (1) #elseif _FIXES_IS_UNSET(FIX_FILTERSCRIPT) #undef FIX_FILTERSCRIPT #define FIX_FILTERSCRIPT (0) #endif #if !defined FIX_SpawnPlayer #define FIX_SpawnPlayer (1) #elseif _FIXES_IS_UNSET(FIX_SpawnPlayer) #undef FIX_SpawnPlayer #define FIX_SpawnPlayer (0) #endif #if !defined FIX_SetPlayerName #define FIX_SetPlayerName (1) #elseif _FIXES_IS_UNSET(FIX_SetPlayerName) #undef FIX_SetPlayerName #define FIX_SetPlayerName (0) #endif #if !defined FIX_GetPlayerSkin #define FIX_GetPlayerSkin (1) #elseif _FIXES_IS_UNSET(FIX_GetPlayerSkin) #undef FIX_GetPlayerSkin #define FIX_GetPlayerSkin (0) #endif #if !defined FIX_GetWeaponName #define FIX_GetWeaponName (1) #elseif _FIXES_IS_UNSET(FIX_GetWeaponName) #undef FIX_GetWeaponName #define FIX_GetWeaponName (0) #endif #if !defined FIX_SetPlayerWorldBounds #define FIX_SetPlayerWorldBounds (1) #elseif _FIXES_IS_UNSET(FIX_SetPlayerWorldBounds) #undef FIX_SetPlayerWorldBounds #define FIX_SetPlayerWorldBounds (0) #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 (0) #endif #if !defined FIX_HydraSniper #define FIX_HydraSniper (1) #elseif _FIXES_IS_UNSET(FIX_HydraSniper) #undef FIX_HydraSniper #define FIX_HydraSniper (0) #endif #if !defined FIX_IsPlayerInCheckpoint #define FIX_IsPlayerInCheckpoint (1) #elseif _FIXES_IS_UNSET(FIX_IsPlayerInCheckpoint) #undef FIX_IsPlayerInCheckpoint #define FIX_IsPlayerInCheckpoint (0) #endif #if !defined FIX_IsPlayerInRaceCheckpoint #define FIX_IsPlayerInRaceCheckpoint (1) #elseif _FIXES_IS_UNSET(FIX_IsPlayerInRaceCheckpoint) #undef FIX_IsPlayerInRaceCheckpoint #define FIX_IsPlayerInRaceCheckpoint (0) #endif #if !defined FIX_GetPlayerWeapon #define FIX_GetPlayerWeapon (1) #elseif _FIXES_IS_UNSET(FIX_GetPlayerWeapon) #undef FIX_GetPlayerWeapon #define FIX_GetPlayerWeapon (0) #endif #if !defined FIX_PutPlayerInVehicle #define FIX_PutPlayerInVehicle (1) #elseif _FIXES_IS_UNSET(FIX_PutPlayerInVehicle) #undef FIX_PutPlayerInVehicle #define FIX_PutPlayerInVehicle (0) #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 (0) #endif #if !defined FIX_SetPlayerCheckpoint #define FIX_SetPlayerCheckpoint (1) #elseif _FIXES_IS_UNSET(FIX_SetPlayerCheckpoint) #undef FIX_SetPlayerCheckpoint #define FIX_SetPlayerCheckpoint (0) #endif #if !defined FIX_SetPlayerRaceCheckpoint #define FIX_SetPlayerRaceCheckpoint (1) #elseif _FIXES_IS_UNSET(FIX_SetPlayerRaceCheckpoint) #undef FIX_SetPlayerRaceCheckpoint #define FIX_SetPlayerRaceCheckpoint (0) #endif #if !defined FIX_TextDrawCreate #define FIX_TextDrawCreate (1) #elseif _FIXES_IS_UNSET(FIX_TextDrawCreate) #undef FIX_TextDrawCreate #define FIX_TextDrawCreate (0) #endif #if !defined FIX_TextDrawSetString #define FIX_TextDrawSetString (1) #elseif _FIXES_IS_UNSET(FIX_TextDrawSetString) #undef FIX_TextDrawSetString #define FIX_TextDrawSetString (0) #endif #if !defined FIX_AllowInteriorWeapons #define FIX_AllowInteriorWeapons (1) #elseif _FIXES_IS_UNSET(FIX_AllowInteriorWeapons) #undef FIX_AllowInteriorWeapons #define FIX_AllowInteriorWeapons (0) #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 (0) #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 (0) #endif #if !defined FIX_SetPlayerSpecialAction #define FIX_SetPlayerSpecialAction (1) #elseif _FIXES_IS_UNSET(FIX_SetPlayerSpecialAction) #undef FIX_SetPlayerSpecialAction #define FIX_SetPlayerSpecialAction (0) #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 (0) #endif #if !defined FIX_GetPlayerDialog #define FIX_GetPlayerDialog (0) #elseif _FIXES_IS_UNSET(FIX_GetPlayerDialog) #undef FIX_GetPlayerDialog #define FIX_GetPlayerDialog (0) #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 (0) #endif #if !defined FIX_SetPlayerSkin #define FIX_SetPlayerSkin (1) #elseif _FIXES_IS_UNSET(FIX_SetPlayerSkin) #undef FIX_SetPlayerSkin #define FIX_SetPlayerSkin (0) #endif #if !defined FIX_HideMenuForPlayer #define FIX_HideMenuForPlayer (1) #elseif _FIXES_IS_UNSET(FIX_HideMenuForPlayer) #undef FIX_HideMenuForPlayer #define FIX_HideMenuForPlayer (0) #endif #if !defined FIX_valstr #define FIX_valstr (1) #elseif _FIXES_IS_UNSET(FIX_valstr) #undef FIX_valstr #define FIX_valstr (0) #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 (0) #endif #if !defined FIX_fclose #define FIX_fclose (FIX_file_inc) #elseif _FIXES_IS_UNSET(FIX_fclose) #undef FIX_fclose #define FIX_fclose (0) #endif #if !defined FIX_fwrite #define FIX_fwrite (FIX_file_inc) #elseif _FIXES_IS_UNSET(FIX_fwrite) #undef FIX_fwrite #define FIX_fwrite (0) #endif #if !defined FIX_fread #define FIX_fread (FIX_file_inc) #elseif _FIXES_IS_UNSET(FIX_fread) #undef FIX_fread #define FIX_fread (0) #endif #if !defined FIX_fputchar #define FIX_fputchar (FIX_file_inc) #elseif _FIXES_IS_UNSET(FIX_fputchar) #undef FIX_fputchar #define FIX_fputchar (0) #endif #if !defined FIX_fgetchar #define FIX_fgetchar (FIX_file_inc) #elseif _FIXES_IS_UNSET(FIX_fgetchar) #undef FIX_fgetchar #define FIX_fgetchar (0) #endif #if !defined FIX_fblockwrite #define FIX_fblockwrite (FIX_file_inc) #elseif _FIXES_IS_UNSET(FIX_fblockwrite) #undef FIX_fblockwrite #define FIX_fblockwrite (0) #endif #if !defined FIX_fblockread #define FIX_fblockread (FIX_file_inc) #elseif _FIXES_IS_UNSET(FIX_fblockread) #undef FIX_fblockread #define FIX_fblockread (0) #endif #if !defined FIX_fseek #define FIX_fseek (FIX_file_inc) #elseif _FIXES_IS_UNSET(FIX_fseek) #undef FIX_fseek #define FIX_fseek (0) #endif #if !defined FIX_flength #define FIX_flength (FIX_file_inc) #elseif _FIXES_IS_UNSET(FIX_flength) #undef FIX_flength #define FIX_flength (0) #endif #if !defined FIX_IsPlayerAttachedObjSlotUsed #define FIX_IsPlayerAttachedObjSlotUsed (1) #elseif _FIXES_IS_UNSET(FIX_IsPlayerAttachedObjSlotUsed) #undef FIX_IsPlayerAttachedObjSlotUsed #define FIX_IsPlayerAttachedObjSlotUsed (0) #endif #if !defined FIX_SetPlayerAttachedObject #define FIX_SetPlayerAttachedObject (1) #elseif _FIXES_IS_UNSET(FIX_SetPlayerAttachedObject) #undef FIX_SetPlayerAttachedObject #define FIX_SetPlayerAttachedObject (0) #endif #if !defined FIX_OnPlayerDeath #define FIX_OnPlayerDeath (1) #elseif _FIXES_IS_UNSET(FIX_OnPlayerDeath) #undef FIX_OnPlayerDeath #define FIX_OnPlayerDeath (0) #endif #if !defined FIX_strins #define FIX_strins (1) #elseif _FIXES_IS_UNSET(FIX_strins) #undef FIX_strins #define FIX_strins (0) #endif #if !defined FIX_IsPlayerConnected #define FIX_IsPlayerConnected (1) #elseif _FIXES_IS_UNSET(FIX_IsPlayerConnected) #undef FIX_IsPlayerConnected #define FIX_IsPlayerConnected (0) #endif #if !defined FIX_OnPlayerCommandText #if defined _ALS_OnPlayerCommandText #define FIX_OnPlayerCommandText (0) #else #define FIX_OnPlayerCommandText (1) #endif #elseif _FIXES_IS_UNSET(FIX_OnPlayerCommandText) #undef FIX_OnPlayerCommandText #define FIX_OnPlayerCommandText (0) #endif #if !defined FIX_TrainExit #define FIX_TrainExit (1) #elseif _FIXES_IS_UNSET(FIX_TrainExit) #undef FIX_TrainExit #define FIX_TrainExit (0) #endif #if !defined FIX_Kick #define FIX_Kick (1) #elseif _FIXES_IS_UNSET(FIX_Kick) #undef FIX_Kick #define FIX_Kick (0) #endif #if !defined FIX_OnVehicleMod #define FIX_OnVehicleMod (1) #elseif _FIXES_IS_UNSET(FIX_OnVehicleMod) #undef FIX_OnVehicleMod #define FIX_OnVehicleMod (0) #endif #if !defined FIX_random #define FIX_random (0) #elseif _FIXES_IS_UNSET(FIX_random) #undef FIX_random #define FIX_random (0) #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 0 #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 #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 (0) #elseif _FIXES_IS_UNSET(FIXES_Single) #undef FIXES_Single #define FIXES_Single (1) #endif /* * E_FIXES_CALLBACK_HOOKS_1 * E_FIXES_CALLBACK_HOOKS_2 * * Two enums to define the bits used to efficiently store wether of not the next * callback in the ALS chain exists. Breaks naming convention for elements from * "E_FIXES_ON_GAME_MODE_INIT" to "E_FIXES_OnGameModeInit" for compatibility * with existing names. Note that "Checkpoint" and "Update" have been shortened * to "CP" and "Upd" in certain symbols to stay below the 31 character limit. */ enum E_FIXES_CALLBACK_HOOKS_1 (<<= 1) { E_FIXES_OnGameModeInit = 1, E_FIXES_OnGameModeExit, E_FIXES_OnFilterScriptInit, E_FIXES_OnFilterScriptExit, E_FIXES_OnPlayerConnect, E_FIXES_OnPlayerDisconnect, E_FIXES_OnPlayerSpawn, E_FIXES_OnPlayerDeath, E_FIXES_OnVehicleSpawn, E_FIXES_OnVehicleDeath, E_FIXES_OnPlayerText, E_FIXES_OnPlayerCommandText, E_FIXES_OnPlayerRequestClass, E_FIXES_OnPlayerEnterVehicle, E_FIXES_OnPlayerExitVehicle, E_FIXES_OnPlayerStateChange, E_FIXES_OnPlayerEnterCheckpoint, E_FIXES_OnPlayerLeaveCheckpoint, E_FIXES_OnPlayerEnterRaceCP, E_FIXES_OnPlayerLeaveRaceCP, E_FIXES_OnRconCommand, E_FIXES_OnPlayerRequestSpawn, E_FIXES_OnObjectMoved, E_FIXES_OnPlayerObjectMoved, E_FIXES_OnPlayerPickUpPickup, E_FIXES_OnVehicleMod, E_FIXES_OnEnterExitModShop, E_FIXES_OnVehiclePaintjob, E_FIXES_OnVehicleRespray, E_FIXES_OnVehicleDamageStatusUp, E_FIXES_OnPlayerSelectedMenuRow, E_FIXES_OnPlayerExitedMenu } enum E_FIXES_CALLBACK_HOOKS_2 (<<= 1) { E_FIXES_OnPlayerInteriorChange = 1, E_FIXES_OnPlayerKeyStateChange, E_FIXES_OnRconLoginAttempt, E_FIXES_OnPlayerUpdate, E_FIXES_OnPlayerStreamIn, E_FIXES_OnPlayerStreamOut, E_FIXES_OnVehicleStreamIn, E_FIXES_OnVehicleStreamOut, E_FIXES_OnDialogResponse, E_FIXES_OnPlayerClickPlayer, E_FIXES_OnPlayerClickMap, E_FIXES_OnPlayerClickTextDraw, E_FIXES_OnPlayerClickPlayerTD, E_FIXES_OnPlayerEditObject, E_FIXES_OnPlayerEditAttachedObj, E_FIXES_OnPlayerSelectObject, E_FIXES_OnPlayerTakeDamage, E_FIXES_OnPlayerGiveDamage } /* * 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_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_ENDING } /* * _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) // 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; static stock /* * E_FIXES_CALLBACK_HOOKS_1:FIXES_gsCallbackHooks1 * E_FIXES_CALLBACK_HOOKS_1:FIXES_gsCallbackHooks2 * * Bit arrays of callbacks. You can only have 32 callbacks per variable, * and there are more than that many, so we need more than one variable. * Add new callback detection to "FIXES_ScriptInit" - only actually used * callbacks are currently hooked. */ E_FIXES_CALLBACK_HOOKS_1:FIXES_gsCallbackHooks1, E_FIXES_CALLBACK_HOOKS_2:FIXES_gsCallbackHooks2, /* * 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. */ FIXES_gsWorldbounds[MAX_PLAYERS][E_FIXES_WORLDBOUND_DATA], /* * 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, ...}, /* * e_FIXES_SETTINGS:FIXES_gsSettings * * A collection of 1-bit options, compressed together to save space. */ e_FIXES_SETTINGS:FIXES_gsSettings, /* * 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]; static stock const /* * FIXES_gscPlayerColours[100] * * There are only 100 colours used by default, with SA:MP looping through * them repeatedly. */ 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 }, /* * 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. */ 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 }, /* * 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". */ FIXES_gscVehicleMods[][] = { {0b00000011001111000010011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000110100010011111111010, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000111100000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010001110110010011110000101, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010101111000100011100000011, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000011101110100010011110001010, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010100011100000011110001010, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010001100010000011101000100, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010001010000000011100111010, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010101111010100011100000001, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010001110100010011110000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010001010000000011101111010, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010011110100010011111001010, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010100000100010011110001010, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000111100000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010001111100000011111000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000011011100000011011100110000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000011000111010010011101110101, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010101111100100011110001000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000111100000000000000, 0b00000000000000000000000000000000}, {0b00000010000000010000011101110001, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010100110100000111111001110, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000001100000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000011001110000010011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010001111111000011110010101, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010100111110000011110001100, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000111100000000000000, 0b00000000000000000000000000000000}, {0b00000010100101100010011111101010, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000111100000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010001101101100011110000010, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010100111100001111111001010, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b11111100000000000000010000110111, 0b00000000000000000000000000000000, 0b00000010000111000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000011111111100110000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000001101110000111, 0b00000000000000000000000000000001, 0b00000001111000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000011100111100000011111010010, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000111100000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010001111001100011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000110000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000011100011100000011111010110, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000111100000000000000, 0b00000000000000000000000000000000}, {0b00000010001111010000011100001001, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000001100000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010100111100001111110001010, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000111100000000000000, 0b00000000000000000000000000000000}, {0b00000010100111000000011101111010, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000111100000000000000, 0b00000000000000000000000000000000}, {0b00000010101111010000011101101100, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b11111111111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000111111000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111111111110, 0b00000000000000000000000000000111, 0b11000000000000000000000000000000, 0b00000000000000000010000000000111}, {0b11111110000000000000011100000000, 0b00000000000000000000000000000011, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000011110000000000, 0b00000000000000000000011000000000}, {0b11001110000000000000011100000000, 0b11111111100000000000000000000000, 0b00000000111111111111111000000001, 0b00000000000000000000000000000111, 0b00111100000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000001111111100, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000001111000000000000000000, 0b00000000000000000001100000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000011111111110000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000011110000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000001000111, 0b00000000000000000000000000111110, 0b00111100000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000001110000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000001111, 0b00000000000000000000000000000000, 0b00000000000000111100000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000001111000000, 0b11000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010100101100000011111000010, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000011000101110010011111110001, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000110000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010010101100010011111110000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000011100111100000011111000010, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000111100000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000}, {0b00000010000000000000011100000000, 0b00000000000000000000000000000000, 0b00000000111111111111111000000000, 0b00000000000000000000000000000111, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000} }, /* * FIXES_gscNULL[] * * NULL. This is stored as a global string to reduce memory usage. */ FIXES_gscNULL[] = "\1\0", /* * 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@iii[] * * Specifier "iii". */ FIXES_gscSpec@iii[] = "iii", /* * FIXES_gscSpec@ifff[] * * Specifier "ifff". */ FIXES_gscSpec@ifff[] = "ifff", /* * FIXES_gscSpec@iffff[] * * Specifier "iffff". */ FIXES_gscSpec@iffff[] = "iffff", /* * FIXES_gscSpec@is[] * * Specifier "is". */ FIXES_gscSpec@is[] = "is", /* * FIXES_gscSpec@iiiis[] * * Specifier "iiiis". */ FIXES_gscSpec@iiiis[] = "iiiis", /* * FIXES_gscSpec@iiiii[] * * Specifier "iiiii". */ FIXES_gscSpec@iiiii[] = "iiiii", /* * 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_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_gscReturnProperty[] * * The property for accurate returns. */ FIXES_gscReturnProperty[] = "FIXES_gscReturnProperty"; static stock /* * 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_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_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_DEFINE_STRING(callback) * * Define strings for every callback name. This macro creates "static stock * const" strings for every next callback name (i.e. the ones called to continue * the chain after "fixes.inc" is done. This is done this way to only need to * include every callback name ONCE in the compiled ".amx" file, the old method * had multiple copies of the same string literal in the final code. */ #define FIXES_DEFINE_STRING(%0On%1) static stock const FIXES_gsc%1[] = "FIXES_On"#%1 FIXES_DEFINE_STRING(OnGameModeInit); FIXES_DEFINE_STRING(OnGameModeExit); FIXES_DEFINE_STRING(OnFilterScriptInit); FIXES_DEFINE_STRING(OnFilterScriptExit); FIXES_DEFINE_STRING(OnPlayerConnect); FIXES_DEFINE_STRING(OnPlayerDisconnect); FIXES_DEFINE_STRING(OnPlayerSpawn); FIXES_DEFINE_STRING(OnPlayerDeath); FIXES_DEFINE_STRING(OnVehicleSpawn); FIXES_DEFINE_STRING(OnVehicleDeath); FIXES_DEFINE_STRING(OnPlayerText); FIXES_DEFINE_STRING(OnPlayerCommandText); FIXES_DEFINE_STRING(OnPlayerRequestClass); FIXES_DEFINE_STRING(OnPlayerEnterVehicle); FIXES_DEFINE_STRING(OnPlayerExitVehicle); FIXES_DEFINE_STRING(OnPlayerStateChange); FIXES_DEFINE_STRING(OnPlayerEnterCheckpoint); FIXES_DEFINE_STRING(OnPlayerLeaveCheckpoint); FIXES_DEFINE_STRING(OnPlayerEnterRaceCP); FIXES_DEFINE_STRING(OnPlayerLeaveRaceCP); FIXES_DEFINE_STRING(OnRconCommand); FIXES_DEFINE_STRING(OnPlayerRequestSpawn); FIXES_DEFINE_STRING(OnObjectMoved); FIXES_DEFINE_STRING(OnPlayerObjectMoved); FIXES_DEFINE_STRING(OnPlayerPickUpPickup); FIXES_DEFINE_STRING(OnVehicleMod); FIXES_DEFINE_STRING(OnEnterExitModShop); FIXES_DEFINE_STRING(OnVehiclePaintjob); FIXES_DEFINE_STRING(OnVehicleRespray); FIXES_DEFINE_STRING(OnVehicleDamageStatusUp); FIXES_DEFINE_STRING(OnPlayerSelectedMenuRow); FIXES_DEFINE_STRING(OnPlayerExitedMenu); FIXES_DEFINE_STRING(OnPlayerInteriorChange); FIXES_DEFINE_STRING(OnPlayerKeyStateChange); FIXES_DEFINE_STRING(OnRconLoginAttempt); FIXES_DEFINE_STRING(OnPlayerUpdate); FIXES_DEFINE_STRING(OnPlayerStreamIn); FIXES_DEFINE_STRING(OnPlayerStreamOut); FIXES_DEFINE_STRING(OnVehicleStreamIn); FIXES_DEFINE_STRING(OnVehicleStreamOut); FIXES_DEFINE_STRING(OnDialogResponse); FIXES_DEFINE_STRING(OnPlayerClickPlayer); FIXES_DEFINE_STRING(OnPlayerClickMap); FIXES_DEFINE_STRING(OnPlayerClickTextDraw); FIXES_DEFINE_STRING(OnPlayerClickPlayerTD); FIXES_DEFINE_STRING(OnPlayerEditObject); FIXES_DEFINE_STRING(OnPlayerEditAttachedObj); FIXES_DEFINE_STRING(OnPlayerSelectObject); FIXES_DEFINE_STRING(OnPlayerTakeDamage); FIXES_DEFINE_STRING(OnPlayerGiveDamage); #undef FIXES_DEFINE_STRING /* * _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 /* * 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 /* * FIXES_DETECT_CALLBACK_1(callback) * FIXES_DETECT_CALLBACK_2(callback) * * Macro to make detecting callbacks simpler. The number relates to which * variable the callback is found it. This explicity detects the "On" part of * the callback because some scripts redefine the callback names and we need to * always correctly detect them, and always have "FIXES_On"#%0 work without * using the redefined name (e.g. if a prior script uses ALS). */ #define FIXES_DETECT_CALLBACK_1(%0On%1) (FIXES_gsCallbackHooks1|=E_FIXES_On%1*E_FIXES_CALLBACK_HOOKS_1:(funcidx(FIXES_gsc%1)!=-1)) #define FIXES_DETECT_CALLBACK_2(%0On%1) (FIXES_gsCallbackHooks2|=E_FIXES_On%1*E_FIXES_CALLBACK_HOOKS_2:(funcidx(FIXES_gsc%1)!=-1)) /* * FIXES_CALL_CALLBACK_1(callback, default, format[], ...) * FIXES_CALL_CALLBACK_2(callback, default, format[], ...) * * Macro to make calling callbacks simpler. This takes the name of a callback * to chain - if it exists then it is called, if it doesn't exist the default * is returned. Note that this DOES NOT end the current function, use in * conjunction with "return", or store the value to call the next element in the * chain before some bits of processing. */ #define FIXES_CALL_CALLBACK_1(%0On%1,%2,%3) ((FIXES_gsCallbackHooks1&E_FIXES_On%1)?(CallLocalFunction(FIXES_gsc%1,%3)):(%2)) #define FIXES_CALL_CALLBACK_2(%0On%1,%2,%3) ((FIXES_gsCallbackHooks2&E_FIXES_On%1)?(CallLocalFunction(FIXES_gsc%1,%3)):(%2)) /* * 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); //if (!existproperty(5, FIXES_gscOrderProperty)) //{ CallRemoteFunction(FIXES_gscDetermineOrder, FIXES_gscSpec@); //} } #endif /* * FIXES_IsPlayerConnected(playerid) * * FIXES: * IsPlayerConnected */ #if FIX_IsPlayerConnected stock FIXES_IsPlayerConnected(playerid) { if (playerid & 0xFFFF0000) { return false; } return IsPlayerConnected(playerid); } #if defined _ALS_IsPlayerConnected #undef IsPlayerConnected #else native BAD_IsPlayerConnected(playerid) = IsPlayerConnected; #define _ALS_IsPlayerConnected #endif #define IsPlayerConnected FIXES_IsPlayerConnected #endif /* * FIXES_OnScriptInit() * * Do all initialisation code in here. Is called once when the script starts, * regardless of HOW the script is started (FilterScript or GameMode). Add * detection of new callbacks here. * * FIXES: */ static FIXES_OnScriptInit() { #if !FIXES_Single FIXES_DetermineOrder(); #endif // Called in the Game Mode first. FIXES_DETECT_CALLBACK_1(OnGameModeInit); #if !FIXES_Single FIXES_DETECT_CALLBACK_1(OnGameModeExit); #endif FIXES_DETECT_CALLBACK_1(OnFilterScriptInit); #if !FIXES_Single FIXES_DETECT_CALLBACK_1(OnFilterScriptExit); #endif #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_SetPlayerName || FIX_GetPlayerColor || FIX_GetPlayerSkin || FIX_IsPlayerInCheckpoint || FIX_IsPlayerInRaceCheckpoint || FIX_GetPlayerWeapon || FIX_PutPlayerInVehicle || FIX_OnPlayerEnterVehicle || FIX_AllowTeleport || FIX_OnDialogResponse || FIX_GetPlayerDialog || FIX_SetSpawnInfo || FIX_AllowInteriorWeapons || FIX_TrainExit || FIX_Kick // Not called after "loadfs" or "reloadfs" (useful for us). FIXES_DETECT_CALLBACK_1(OnPlayerConnect); #endif #if FIX_SetPlayerAttachedObject || FIX_IsPlayerAttachedObjSlotUsed || FIX_Kick || (FIXES_SilentKick && (FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle)) // Called in the Game Mode first when the mode changes, in Filter // Scripts when the player leaves. FIXES_DETECT_CALLBACK_1(OnPlayerDisconnect); #endif #if FIX_GetPlayerSkin || FIX_TogglePlayerControllable FIXES_DETECT_CALLBACK_1(OnPlayerSpawn); #endif #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_AllowInteriorWeapons || FIX_OnPlayerEnterVehicle || FIX_OnPlayerDeath || FIX_OnVehicleMod FIXES_DETECT_CALLBACK_2(OnPlayerUpdate); #endif #if FIX_HydraSniper || FIX_GetPlayerWeapon || FIX_PutPlayerInVehicle || FIX_OnPlayerEnterVehicle || FIX_TrainExit FIXES_DETECT_CALLBACK_1(OnPlayerStateChange); #endif #if FIX_AllowTeleport && !defined FILTERSCRIPT // Called in the Game Mode first. FIXES_DETECT_CALLBACK_2(OnPlayerClickMap); #endif #if FIX_OnDialogResponse || FIX_GetPlayerDialog FIXES_DETECT_CALLBACK_2(OnDialogResponse); #endif #if FIX_OnPlayerDeath FIXES_DETECT_CALLBACK_1(OnPlayerDeath); #endif #if FIX_AllowInteriorWeapons FIXES_DETECT_CALLBACK_2(OnPlayerInteriorChange); #endif #if FIX_OnPlayerCommandText FIXES_DETECT_CALLBACK_1(OnPlayerCommandText); #endif #if FIX_OnVehicleMod FIXES_DETECT_CALLBACK_1(OnVehicleMod); #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 */ public OnFilterScriptInit() { _FIXES_gIsFilterscript = true; FIXES_OnScriptInit(); #if !FIXES_Single FIXES_gsSettings &= ~e_FIXES_SETTINGS_DROP_ALL_DATA; #endif return FIXES_CALL_CALLBACK_1(OnFilterScriptInit, 1, FIXES_gscSpec@); } #if defined _ALS_OnFilterScriptInit #undef OnFilterScriptInit #else #define _ALS_OnFilterScriptInit #endif #define OnFilterScriptInit FIXES_OnFilterScriptInit forward OnFilterScriptInit(); /* * OnGameModeInit() * * Call "FIXES_OnScriptInit" if this is not a FilterScript. * * FIXES: * IS_FILTERSCRIPT * AllowInteriorWeapons * AllowTeleport */ public OnGameModeInit() { // ============================= // START: AllowInteriorWeapons // ============================= #if FIX_AllowInteriorWeapons FIXES_gsSettings &= ~e_FIXES_SETTINGS_INTERIOR; #endif // =========================== // END: AllowInteriorWeapons // =========================== // ====================== // START: AllowTeleport // ====================== #if FIX_AllowTeleport && !defined FILTERSCRIPT FIXES_gsSettings &= ~e_FIXES_SETTINGS_ADMIN_TELEPORT; #endif // ====================== // END: AllowTeleport // ====================== if (!_FIXES_gIsFilterscript) { FIXES_OnScriptInit(); } #if !FIXES_Single FIXES_gsSettings &= ~e_FIXES_SETTINGS_DROP_ALL_DATA; #endif return FIXES_CALL_CALLBACK_1(OnGameModeInit, 1, FIXES_gscSpec@); } #if defined _ALS_OnGameModeInit #undef OnGameModeInit #else #define _ALS_OnGameModeInit #endif #define OnGameModeInit FIXES_OnGameModeInit forward OnGameModeInit(); /* * OnGameModeExit() * * Fast way of detecting not to retain any data. */ #if !FIXES_Single public OnGameModeExit() { 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(); } return FIXES_CALL_CALLBACK_1(OnGameModeExit, 1, FIXES_gscSpec@); } #if defined _ALS_OnGameModeExit #undef OnGameModeExit #else #define _ALS_OnGameModeExit #endif #define OnGameModeExit FIXES_OnGameModeExit forward OnGameModeExit(); #endif /* * OnFilterScriptExit() * * Fast way of detecting not to retain any data. */ #if !FIXES_Single public OnFilterScriptExit() { if (_FIXES_gIsFilterscript && FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE) { FIXES_gsSettings |= e_FIXES_SETTINGS_ENDING; FIXES_DetermineOrder(); } return FIXES_CALL_CALLBACK_1(OnFilterScriptExit, 1, FIXES_gscSpec@); } #if defined _ALS_OnFilterScriptExit #undef OnFilterScriptExit #else #define _ALS_OnFilterScriptExit #endif #define OnFilterScriptExit FIXES_OnFilterScriptExit forward OnFilterScriptExit(); #endif /* * OnPlayerCommandText(playerid, cmdtext[]) * * FIXES: * OnPlayerCommandText */ #if FIX_OnPlayerCommandText public OnPlayerCommandText(playerid, cmdtext[]) { // ============================ // START: OnPlayerCommandText // ============================ #if FIX_OnPlayerCommandText if (cmdtext[0] == '\0' || (cmdtext[0] == '\1' && cmdtext[1] == '\0')) { return FIXES_CALL_CALLBACK_1(OnPlayerCommandText, 1, FIXES_gscSpec@is, playerid, FIXES_gscNULL); } else { return FIXES_CALL_CALLBACK_1(OnPlayerCommandText, 1, FIXES_gscSpec@is, playerid, cmdtext); } #endif // ============================ // START: OnPlayerCommandText // ============================ } #if defined _ALS_OnPlayerCommandText #undef OnPlayerCommandText #else #define _ALS_OnPlayerCommandText #endif #define OnPlayerCommandText FIXES_OnPlayerCommandText forward OnPlayerCommandText(playerid, cmdtext[]); #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. * * FIXES: * TogglePlayerControllable * SetPlayerWorldBounds * GetPlayerColor * SetPlayerName * GetPlayerSkin * IsPlayerInCheckpoint * IsPlayerInRaceCheckpoint * GetPlayerWeapon * PutPlayerInVehicle * OnPlayerEnterVehicle * AllowTeleport * OnDialogResponse * SetSpawnInfo * AllowInteriorWeapons * TrainExit * Kick */ #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_SetPlayerName || FIX_GetPlayerColor || FIX_GetPlayerSkin || FIX_IsPlayerInCheckpoint || FIX_IsPlayerInRaceCheckpoint || FIX_GetPlayerWeapon || FIX_PutPlayerInVehicle || FIX_OnPlayerEnterVehicle || FIX_AllowTeleport || FIX_OnDialogResponse || FIX_GetPlayerDialog || FIX_SetSpawnInfo || FIX_AllowInteriorWeapons || FIX_TrainExit || FIX_Kick public OnPlayerConnect(playerid) { FIXES_PRINTF("FIXES_OnPlayerConnect: %d", playerid); #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_PutPlayerInVehicle || FIX_OnPlayerEnterVehicle || FIX_AllowTeleport || FIX_AllowInteriorWeapons || FIX_TrainExit // This is only reset when the Game Mode changes or when a new // 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 FIXES_gsPlayerBools[playerid] = e_FIXES_BOOLS_ON_PLAYER_CONNECT; #else FIXES_gsPlayerBools[playerid] = e_FIXES_BOOLS_NONE; #endif #endif #if !FIXES_Single if (!GetPVarInt(playerid, FIXES_pvarNotNewPlayer)) #endif { FIXES_PRINTF("FIXES_OnPlayerConnect: First (%d)", FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE); // ====================== // START: 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 // ====================== // ============================= // START: 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 // ============================= // ======================= // START: SetPlayerColor // ======================= #if FIX_GetPlayerColor SetPlayerColor(playerid, FIXES_gscPlayerColours[playerid % 100]); #endif // ======================= // END: SetPlayerColor // ======================= // ====================== // START: GetPlayerSkin // ====================== #if FIX_GetPlayerSkin #if FIXES_Single FIXES_gsPlayerSkin[playerid] = 0; #else SetPVarInt(playerid, FIXES_pvarPlayerSkin, 0); #endif #endif // ====================== // END: GetPlayerSkin // ====================== // ============================= // START: IsPlayerInCheckpoint // ============================= #if FIX_IsPlayerInCheckpoint DisablePlayerCheckpoint(playerid); #endif // ============================= // END: IsPlayerInCheckpoint // ============================= // ================================= // START: IsPlayerInRaceCheckpoint // ================================= #if FIX_IsPlayerInRaceCheckpoint DisablePlayerRaceCheckpoint(playerid); #endif // ================================= // END: IsPlayerInRaceCheckpoint // ================================= // ======================== // START: GetPlayerWeapon // ======================== #if FIX_GetPlayerWeapon #if FIXES_Single FIXES_gsPlayerWeapon[playerid] = -1; #else SetPVarInt(playerid, FIXES_pvarPlayerWeapon, -1); #endif #endif // ======================== // END: GetPlayerWeapon // ======================== // ========================= // START: 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 // ========================= // ===================== // START: 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 // ===================== #if !FIXES_Single // No longer their first time. SetPVarInt(playerid, FIXES_pvarNotNewPlayer, 1); #endif } // ============= // START: Kick // ============= #if FIX_Kick new ret = FIXES_CALL_CALLBACK_1(OnPlayerConnect, 1, FIXES_gscSpec@i, playerid); FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_ON_PLAYER_CONNECT; return ret; #else return FIXES_CALL_CALLBACK_1(OnPlayerConnect, 1, FIXES_gscSpec@i, playerid); #endif // ============= // END: Kick // ============= } #if defined _ALS_OnPlayerConnect #undef OnPlayerConnect #else #define _ALS_OnPlayerConnect #endif #define OnPlayerConnect FIXES_OnPlayerConnect forward OnPlayerConnect(playerid); #endif /* * OnPlayerDisonnect(playerid, reason) * * FIXES: * SetPlayerAttachedObject * IsPlayerAttachedObjectSlotUsed * Kick */ #if FIX_SetPlayerAttachedObject || FIX_IsPlayerAttachedObjSlotUsed || FIX_Kick || (FIXES_SilentKick && (FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle)) public OnPlayerDisconnect(playerid, reason) { new ret = FIXES_CALL_CALLBACK_1(OnPlayerDisconnect, 1, FIXES_gscSpec@ii, playerid, reason); // ========================== // START: FIXES_SilentKick // ========================== #if FIXES_SilentKick && (FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle) 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 // ========================== // ================================ // START: SetPlayerAttachedObject // ================================ #if FIX_SetPlayerAttachedObject #if !(FIXES_SilentKick && (FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle)) 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 // ================================ // ======================================= // START: 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 // ======================================= // ============= // START: 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 // ============= return ret; } #if defined _ALS_OnPlayerDisconnect #undef OnPlayerDisconnect #else #define _ALS_OnPlayerDisconnect #endif #define OnPlayerDisconnect FIXES_OnPlayerDisconnect forward OnPlayerDisconnect(playerid, reason); #endif /* * OnPlayerDeath(playerid, killerid, reason) * * FIXES: * OnPlayerDeath */ #if FIX_OnPlayerDeath public OnPlayerDeath(playerid, killerid, reason) { #if !FIXES_Single if (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE) #endif { // ====================== // START: 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 // ====================== } return FIXES_CALL_CALLBACK_1(OnPlayerDeath, 1, FIXES_gscSpec@iii, playerid, killerid, reason); } #if defined _ALS_OnPlayerDeath #undef OnPlayerDeath #else #define _ALS_OnPlayerDeath #endif #define OnPlayerDeath FIXES_OnPlayerDeath forward OnPlayerDeath(playerid, killerid, reason); #endif /* * FIXES_SpawnPlayer(playerid) * * FIXES: * 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); } #if defined _ALS_SpawnPlayer #undef SpawnPlayer #else native BAD_SpawnPlayer(playerid) = SpawnPlayer; #define _ALS_SpawnPlayer #endif #define SpawnPlayer FIXES_SpawnPlayer #endif /* * FIXES_SetPlayerName(playerid, name[]) * * FIXES: * SetPlayerName */ #if FIX_SetPlayerName stock FIXES_SetPlayerName(playerid, name[]) { if (strcmp(name, FIXES_gscTempName) == 0) { return 0; } static sOldName[MAX_PLAYER_NAME]; GetPlayerName(playerid, sOldName, sizeof (sOldName)); if (strcmp(name, sOldName, true) == 0) { return 0; } SetPlayerName(playerid, FIXES_gscTempName); new retval = SetPlayerName(playerid, name); if (retval != 1) { SetPlayerName(playerid, sOldName); } return retval; } #if defined _ALS_SetPlayerName #undef SetPlayerName #else native BAD_SetPlayerName(playerid, const name[]) = SetPlayerName; #define _ALS_SetPlayerName #endif #define SetPlayerName FIXES_SetPlayerName #endif /* * OnPlayerSpawn(playerid) * * FIXES: * GetPlayerSkin * TogglePlayerControllable */ #if FIX_GetPlayerSkin || FIX_TogglePlayerControllable public OnPlayerSpawn(playerid) { // ====================== // START: GetPlayerSkin // ====================== #if FIX_GetPlayerSkin #if FIXES_Single FIXES_gsPlayerSkin[playerid] = GetPlayerSkin(playerid); #else SetPVarInt(playerid, FIXES_pvarPlayerSkin, GetPlayerSkin(playerid)); #endif #endif // ====================== // END: GetPlayerSkin // ====================== // ================================= // START: TogglePlayerControllable // ================================= #if FIX_TogglePlayerControllable FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_UNCONTROLLABLE; #endif // ================================= // END: TogglePlayerControllable // ================================= return FIXES_CALL_CALLBACK_1(OnPlayerSpawn, 1, FIXES_gscSpec@i, playerid); } #if defined _ALS_OnPlayerSpawn #undef OnPlayerSpawn #else #define _ALS_OnPlayerSpawn #endif #define OnPlayerSpawn FIXES_OnPlayerSpawn forward 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_CALL_CALLBACK_1(OnVehicleMod, 1, FIXES_gscSpec@iii, playerid, vehicleid, componentid); } #endif // ===================== // START: OnVehicleMod // ===================== new modelid = GetVehicleModel(vehicleid); if (400 <= modelid <= 611) { switch (componentid) { case 1000 .. 1191: { if (FIXES_gscVehicleMods[modelid - 400][(componentid - 1000) >>> 5] & (1 << ((componentid - 1000) & 0b00011111))) { return FIXES_CALL_CALLBACK_1(OnVehicleMod, 1, FIXES_gscSpec@iii, 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_CALL_CALLBACK_1(OnVehicleMod, 1, FIXES_gscSpec@iii, playerid, vehicleid, componentid); } } } } // Desync the player entirely. FIXES_BlockUpdate(playerid, true); return 0; // ===================== // END: OnVehicleMod // ===================== } #if defined _ALS_OnVehicleMod #undef OnVehicleMod #else #define _ALS_OnVehicleMod #endif #define OnVehicleMod FIXES_OnVehicleMod forward OnVehicleMod(playerid, vehicleid, componentid); #endif /* * FIXES_SetPlayerSkin(playerid, skinid) * * FIXES: * GetPlayerSkin * SetPlayerSkin */ #if FIX_GetPlayerSkin || FIX_SetPlayerSkin stock FIXES_SetPlayerSkin(playerid, skinid) { // ====================== // START: 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); // ====================== // START: GetPlayerSkin // ====================== #if FIX_GetPlayerSkin #if FIXES_Single FIXES_gsPlayerSkin[playerid] = skinid; #else SetPVarInt(playerid, FIXES_pvarPlayerSkin, skinid); #endif #endif // ====================== // END: GetPlayerSkin // ====================== return ret; } // ====================== // START: GetPlayerSkin // ====================== #if FIX_GetPlayerSkin else #endif // ====================== // END: GetPlayerSkin // ====================== #endif // ====================== // END: SetPlayerSkin // ====================== // ====================== // START: GetPlayerSkin // ====================== #if FIX_GetPlayerSkin #if FIXES_Single FIXES_gsPlayerSkin[playerid] = skinid; #else SetPVarInt(playerid, FIXES_pvarPlayerSkin, skinid); #endif #endif // ====================== // END: GetPlayerSkin // ====================== return SetPlayerSkin(playerid, skinid); } #if defined _ALS_SetPlayerSkin #undef SetPlayerSkin #else native BAD_SetPlayerSkin(playerid, skinid) = SetPlayerSkin; #define _ALS_SetPlayerSkin #endif #define SetPlayerSkin FIXES_SetPlayerSkin #endif /* * FIXES_GetPlayerSkin(playerid, skinid) * * FIXES: * GetPlayerSkin */ #if FIX_GetPlayerSkin stock FIXES_GetPlayerSkin(playerid) { #if FIXES_Single return FIXES_gsPlayerSkin[playerid]; #else return GetPVarInt(playerid, FIXES_pvarPlayerSkin); #endif } #if defined _ALS_GetPlayerSkin #undef GetPlayerSkin #else native BAD_GetPlayerSkin(playerid) = GetPlayerSkin; #define _ALS_GetPlayerSkin #endif #define GetPlayerSkin FIXES_GetPlayerSkin #endif /* * FIXES_GetWeaponName(weaponid, weapon[], len) * * FIXES: * GetWeaponName */ #if FIX_GetWeaponName stock FIXES_GetWeaponName(weaponid, weapon[], len) { switch (weaponid) { case 18: { weapon[0] = 0; strcat(weapon, "Molotov Cocktail", len); return 1; } case 44: { weapon[0] = 0; strcat(weapon, "Thermal Goggles", len); return 1; } case 45: { weapon[0] = 0; strcat(weapon, "Night Vision Goggles", len); return 1; } default: { return GetWeaponName(weaponid, weapon, len); } } return 0; } #if defined _ALS_GetWeaponName #undef GetWeaponName #else native BAD_GetWeaponName(weaponid, weapon[], len) = GetWeaponName; #define _ALS_GetWeaponName #endif #define GetWeaponName FIXES_GetWeaponName #endif /* * OnPlayerUpdate(playerid) * * FIXES: * SetPlayerWorldBounds * TogglePlayerControllable * AllowInteriorWeapons * OnPlayerDeath * Kick * OnVehicleMod */ #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_AllowInteriorWeapons || FIX_OnPlayerEnterVehicle || FIX_OnPlayerDeath || FIX_Kick || FIX_OnVehicleMod public OnPlayerUpdate(playerid) { // ============================= // BEGIN: OnPlayerEnterVehicle // ============================= #if FIX_OnPlayerEnterVehicle || FIX_Kick || FIX_OnVehicleMod 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_CALL_CALLBACK_2(OnPlayerUpdate, 1, FIXES_gscSpec@i, playerid); } #endif #if FIX_OnPlayerEnterVehicle || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable new e_FIXES_BOOLS:pbools = FIXES_gsPlayerBools[playerid]; #endif // ============================= // START: AllowInteriorWeapons // ============================= #if FIX_AllowInteriorWeapons //if (FIXES_gsSettings & e_FIXES_SETTINGS_INTERIOR && GetPlayerInterior(playerid) && GetPlayerWeapon(playerid)) 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 // ============================= // START: 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 // ============================= // ====================== // START: OnPlayerDeath // ====================== #if FIX_OnPlayerDeath FIXES_gsLastAnimation[playerid] = GetPlayerAnimationIndex(playerid); #endif // ====================== // END: OnPlayerDeath // ====================== // ================================= // START: 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&postcount=1 // 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_CALL_CALLBACK_2(OnPlayerUpdate, 1, FIXES_gscSpec@i, playerid); if (keys || ud || lr) { return 0; } else { return playerid; } } #endif // ================================= // END: TogglePlayerControllable // ================================= return FIXES_CALL_CALLBACK_2(OnPlayerUpdate, 1, FIXES_gscSpec@i, playerid); } #if defined _ALS_OnPlayerUpdate #undef OnPlayerUpdate #else #define _ALS_OnPlayerUpdate #endif #define OnPlayerUpdate FIXES_OnPlayerUpdate forward 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 FIX_SetPlayerWorldBounds #if FIXES_Single stock FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min) { if (0 <= playerid < MAX_PLAYERS) { FIXES_PRINTF("Call SetPlayerWorldBounds"); if (x_max == x_min || y_max == y_min) { // Impossibly small area, disable checks entirely. FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_WORLDBOUNDS; return 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. 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; return 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 (0 <= playerid < MAX_PLAYERS) { FIXES_PRINTF("Call SetPlayerWorldBounds"); CallRemoteFunction(FIXES_gscSetPlayerWorldBounds, FIXES_gscSpec@iffff, playerid, x_max, x_min, y_max, y_min); return 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); if (FIXES_gsSettings & e_FIXES_SETTINGS_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. 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)); return -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 #if defined _ALS_SetPlayerWorldBounds #undef SetPlayerWorldBounds #else native BAD_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min) = SetPlayerWorldBounds; #define _ALS_SetPlayerWorldBounds #endif #define SetPlayerWorldBounds FIXES_SetPlayerWorldBounds #endif /* * FIXES_TogglePlayerControllable(playerid, toggle) * * FIXES: * 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 (0 <= playerid < MAX_PLAYERS) { CallRemoteFunction(FIXES_gscTogglePlayerControl, FIXES_gscSpec@ii, playerid, toggle); return getproperty(5, FIXES_gscReturnProperty); } return 0; } public _FIXES_TogglePlayerControllable(playerid, toggle) { if (FIXES_gsSettings & e_FIXES_SETTINGS_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 #if defined _ALS_TogglePlayerControllable #undef TogglePlayerControllable #else native BAD_TogglePlayerControllable(playerid, toggle) = TogglePlayerControllable; #define _ALS_TogglePlayerControllable #endif #define TogglePlayerControllable FIXES_TogglePlayerControllable #endif #if FIX_AllowInteriorWeapons public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid) { // ============================= // 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; #if !FIXES_Single if (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE) #endif { 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_CALL_CALLBACK_2(OnPlayerInteriorChange, 1, FIXES_gscSpec@iii, playerid, newinteriorid, oldinteriorid); } #if defined _ALS_OnPlayerInteriorChange #undef OnPlayerInteriorChange #else #define _ALS_OnPlayerInteriorChange #endif #define OnPlayerInteriorChange FIXES_OnPlayerInteriorChange forward OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid); #endif /* * FIXES_BlockUpdate(playerid, bool:block) * * Block a player from using OnPlayerUpdate at all. */ #if FIX_OnPlayerEnterVehicle || 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 /* * 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_CALL_CALLBACK_1(OnPlayerStateChange, 1, FIXES_gscSpec@iii, playerid, newstate, oldstate); } #endif // ============================= // BEGIN: OnPlayerEnterVehicle // ============================= #if FIX_OnPlayerEnterVehicle if (newstate == PLAYER_STATE_PASSENGER) { new model = GetVehicleModel(GetPlayerVehicleID(playerid)) - 400; if (0 <= model <= 211) { 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)) { // 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 (!(0 <= model <= 211) || 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 (PLAYER_STATE_DRIVER <= oldstate <= PLAYER_STATE_PASSENGER) //if (oldstate == PLAYER_STATE_DRIVER || oldstate == PLAYER_STATE_PASSENGER) { #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 // ================== // =========================== // START: 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_CALL_CALLBACK_1(OnPlayerStateChange, 1, FIXES_gscSpec@iii, playerid, newstate, oldstate); } #if defined _ALS_OnPlayerStateChange #undef OnPlayerStateChange #else #define _ALS_OnPlayerStateChange #endif #define OnPlayerStateChange FIXES_OnPlayerStateChange forward OnPlayerStateChange(playerid, newstate, oldstate); #endif /* * FIXES_GivePlayerWeapon(playerid, weaponid, ammo) * * FIXES: * HydraSniper */ #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); } #if defined _ALS_GivePlayerWeapon #undef GivePlayerWeapon #else native BAD_GivePlayerWeapon(playerid, weaponid, ammo) = GivePlayerWeapon; #define _ALS_GivePlayerWeapon #endif #define GivePlayerWeapon FIXES_GivePlayerWeapon #endif /* * FIXES_SetPlayerArmedWeapon(playerid, weaponid) * * FIXES: * GetPlayerWeapon */ #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); } #if defined _ALS_SetPlayerArmedWeapon #undef SetPlayerArmedWeapon #else native BAD_SetPlayerArmedWeapon(playerid, weaponid) = SetPlayerArmedWeapon; #define _ALS_SetPlayerArmedWeapon #endif #define SetPlayerArmedWeapon FIXES_SetPlayerArmedWeapon #endif /* * FIXES_GetPlayerWeapon(playerid) * * FIXES: * 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; } #if defined _ALS_GetPlayerWeapon #undef GetPlayerWeapon #else native BAD_GetPlayerWeapon(playerid) = GetPlayerWeapon; #define _ALS_GetPlayerWeapon #endif #define GetPlayerWeapon FIXES_GetPlayerWeapon #endif /* * FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid) * * FIXES: * 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. 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; return 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. GetVehiclePos(vid, x, y, z); SetPlayerPos(playerid, x, y, z); CallRemoteFunction(FIXES_gscPutPlayerInVehicle, FIXES_gscSpec@iiiii, playerid, vehicleid, seatid, 1, vid); return 1; } // =========================== // 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)); if (FIXES_gsSettings & e_FIXES_SETTINGS_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 #if defined _ALS_PutPlayerInVehicle #undef PutPlayerInVehicle #else native BAD_PutPlayerInVehicle(playerid, vehicleid, seatid) = PutPlayerInVehicle; #define _ALS_PutPlayerInVehicle #endif #define PutPlayerInVehicle FIXES_PutPlayerInVehicle #endif /* * FIXES_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size) * * FIXES: * SetPlayerCheckpoint */ #if FIX_SetPlayerCheckpoint stock FIXES_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size) { DisablePlayerCheckpoint(playerid); return SetPlayerCheckpoint(playerid, x, y, z, size); } #if defined _ALS_SetPlayerCheckpoint #undef SetPlayerCheckpoint #else native BAD_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size) = SetPlayerCheckpoint; #define _ALS_SetPlayerCheckpoint #endif #define SetPlayerCheckpoint FIXES_SetPlayerCheckpoint #endif /* * FIXES_SetPlayerRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size) * * FIXES: * SetPlayerRaceCheckpoint */ #if FIX_SetPlayerRaceCheckpoint stock FIXES_SetPlayerRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size) { DisablePlayerRaceCheckpoint(playerid); return SetPlayerRaceCheckpoint(playerid, type, x, y, z, nextx, nexty, nextz, size); } #if defined _ALS_SetPlayerRaceCheckpoint #undef SetPlayerRaceCheckpoint #else native BAD_SetPlayerRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size) = SetPlayerRaceCheckpoint; #define _ALS_SetPlayerRaceCheckpoint #endif #define SetPlayerRaceCheckpoint FIXES_SetPlayerRaceCheckpoint #endif /* * Text:FIXES_TextDrawCreate(Float:x, Float:y, text[]) * * FIXES: * 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, " "); } else { return TextDrawCreate(x, y, text); } } #if defined _ALS_TextDrawCreate #undef TextDrawCreate #else native Text:BAD_TextDrawCreate(Float:x, Float:y, text[]) = TextDrawCreate; #define _ALS_TextDrawCreate #endif #define TextDrawCreate FIXES_TextDrawCreate #endif /* * FIXES_TextDrawSetString(Text:text, string[]) * * FIXES: * TextDrawSetString */ #if FIX_TextDrawSetString stock FIXES_TextDrawSetString(Text:text, string[]) { if (string[0] == '\0' || string[0] == '\1' && string[1] == '\0') { return TextDrawSetString(text, " "); } else { return TextDrawSetString(text, string); } } #if defined _ALS_TextDrawSetString #undef TextDrawSetString #else native BAD_TextDrawSetString(Text:text, string[]) = TextDrawSetString; #define _ALS_TextDrawSetString #endif #define TextDrawSetString FIXES_TextDrawSetString #endif /* * FIXES_AllowInteriorWeapons(allow) * * FIXES: * AllowInteriorWeapons */ #if FIX_AllowInteriorWeapons #if FIXES_Single stock FIXES_AllowInteriorWeapons(allow) { if (allow) { FIXES_gsSettings &= ~e_FIXES_SETTINGS_INTERIOR; for (new i = 0; i != MAX_PLAYERS; ++i) { FIXES_gsPlayerBools[i] &= ~e_FIXES_BOOLS_INTERIOR; } } else { FIXES_gsSettings |= e_FIXES_SETTINGS_INTERIOR; for (new i = 0; i != MAX_PLAYERS; ++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; for (new i = 0; i != MAX_PLAYERS; ++i) { FIXES_gsPlayerBools[i] &= ~e_FIXES_BOOLS_INTERIOR; } } else { FIXES_gsSettings |= e_FIXES_SETTINGS_INTERIOR; for (new i = 0; i != MAX_PLAYERS; ++i) { if (GetPlayerInterior(i)) { FIXES_gsPlayerBools[i] |= e_FIXES_BOOLS_INTERIOR; } } } return allow; } #endif #if defined _ALS_AllowInteriorWeapons #undef AllowInteriorWeapons #else native BAD_AllowInteriorWeapons(allow) = AllowInteriorWeapons; #define _ALS_AllowInteriorWeapons #endif #define AllowInteriorWeapons FIXES_AllowInteriorWeapons #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_CALL_CALLBACK_2(OnPlayerClickMap, 1, FIXES_gscSpec@ifff, playerid, fX, fY, fZ); } #if defined _ALS_OnPlayerClickMap #undef OnPlayerClickMap #else #define _ALS_OnPlayerClickMap #endif #define OnPlayerClickMap FIXES_OnPlayerClickMap forward OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ); #endif /* * FIXES_AllowPlayerTeleport(playerid, allow) * * FIXES: * AllowTeleport */ #if FIX_AllowTeleport #if FIXES_Single stock FIXES_AllowPlayerTeleport(playerid, allow) { if (0 <= playerid < 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 (0 <= playerid < MAX_PLAYERS) { CallRemoteFunction(FIXES_gscAllowTeleport, FIXES_gscSpec@ii, playerid, allow) } return 0; } #endif #if defined _ALS_AllowPlayerTeleport #undef AllowPlayerTeleport #else native BAD_AllowPlayerTeleport(playerid, allow) = AllowPlayerTeleport; #define _ALS_AllowPlayerTeleport #endif #define AllowPlayerTeleport FIXES_AllowPlayerTeleport #endif /* * FIXES_AllowAdminTeleport(allow) * * FIXES: * AllowTeleport */ #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) { CallRemoteFunction(FIXES_gscAllowTeleport, FIXES_gscSpec@ii, INVALID_PLAYER_ID, allow) return allow; } #endif #if defined _ALS_AllowAdminTeleport #undef AllowAdminTeleport #else native BAD_AllowAdminTeleport(allow) = AllowAdminTeleport; #define _ALS_AllowAdminTeleport #endif #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 FIX_SetPlayerSpecialAction stock FIXES_SetPlayerSpecialAction(playerid, actionid) { if (GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_USEJETPACK) { ClearAnimations(playerid); } SetPlayerSpecialAction(playerid, actionid); return 1; } #if defined _ALS_SetPlayerSpecialAction #undef SetPlayerSpecialAction #else native BAD_SetPlayerSpecialAction(playerid, actionid) = SetPlayerSpecialAction; #define _ALS_SetPlayerSpecialAction #endif #define SetPlayerSpecialAction FIXES_SetPlayerSpecialAction #endif /* * FIXES_ShowPlayerDialog(playerid, dialog, style, title[], caption[], button1[], button2[]) * * FIXES: * OnDialogResponse * GetPlayerDialog */ #if FIX_OnDialogResponse || FIX_GetPlayerDialog stock FIXES_ShowPlayerDialog(playerid, dialog, style, title[], caption[], button1[], button2[]) { if (0 <= playerid < 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; } #if defined _ALS_ShowPlayerDialog #undef ShowPlayerDialog #else native BAD_ShowPlayerDialog(playerid, dialog, style, title[], caption[], button1[], button2[]) = ShowPlayerDialog; #define _ALS_ShowPlayerDialog #endif #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 if (FIXES_gsSettings & e_FIXES_SETTINGS_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_CALL_CALLBACK_2(OnDialogResponse, 1, FIXES_gscSpec@iiiis, playerid, dialogid, response, listitem, inputtext); } else { return FIXES_CALL_CALLBACK_2(OnDialogResponse, 1, FIXES_gscSpec@iiiis, playerid, dialogid, response, listitem, FIXES_gscNULL); } #endif // ========================= // END: OnDialogResponse // ========================= } #if defined _ALS_OnDialogResponse #undef OnDialogResponse #else #define _ALS_OnDialogResponse #endif #define OnDialogResponse FIXES_OnDialogResponse forward OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]); #endif /* * FIXES_GetPlayerDialog(playerid) * * FIXES: * GetPlayerDialog */ #if FIX_GetPlayerDialog stock FIXES_GetPlayerDialog(playerid) { if (0 <= playerid < MAX_PLAYERS) { #if FIXES_Single return FIXES_gsDialogID[playerid]; #else return GetPVarInt(playerid, FIXES_pvarPlayerDialog); #endif } return -1; } #if defined _ALS_GetPlayerDialog #undef GetPlayerDialog #else #define _ALS_GetPlayerDialog #endif #define GetPlayerDialog FIXES_GetPlayerDialog #endif /* * FIXES_HideMenuForPlayer(Menu:menuid, playerid * * FIXES: * HideMenuForPlayer */ #if FIX_HideMenuForPlayer stock FIXES_HideMenuForPlayer(Menu:menuid, playerid) { if (IsValidMenu(menuid)) { return HideMenuForPlayer(menuid, playerid); } return 0; } #if defined _ALS_HideMenuForPlayer #undef HideMenuForPlayer #else native BAD_HideMenuForPlayer(Menu:menuid, playerid) = HideMenuForPlayer; #define _ALS_HideMenuForPlayer #endif #define HideMenuForPlayer FIXES_HideMenuForPlayer #endif /* * FIXES_valstr(dest[], value, bool:pack = false) * * FIXES: * 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; } #if defined _ALS_valstr #undef valstr #else native BAD_valstr(dest[], value, bool:pack = false) = valstr; #define _ALS_valstr #endif #define valstr FIXES_valstr #endif /* * FIXES_fclose(File:handle) * * FIXES: * fclose */ #if FIX_fclose stock bool:FIXES_fclose(File:handle) { if (handle) { return fclose(handle); } return false; } #if defined _ALS_fclose #undef fclose #else native BAD_fclose(File:handle) = fclose; #define _ALS_fclose #endif #define fclose FIXES_fclose #endif /* * FIXES_fwrite(File:handle, const string[]) * * FIXES: * fwrite */ #if FIX_fwrite stock FIXES_fwrite(File:handle, const string[]) { if (handle) { return fwrite(handle, string); } return 0; } #if defined _ALS_fwrite #undef fwrite #else native BAD_fwrite(File:handle, const string[]) = fwrite; #define _ALS_fwrite #endif #define fwrite FIXES_fwrite #endif /* * FIXES_fread(File:handle, string[], size = sizeof (string), bool:pack = false) * * FIXES: * fread */ #if FIX_fread stock FIXES_fread(File:handle, string[], size = sizeof (string), bool:pack = false) { if (handle) { return fread(handle, string, size, pack); } return 0; } #if defined _ALS_fread #undef fread #else native BAD_fread(File:handle, string[], size = sizeof (string), bool:pack = false) = fread; #define _ALS_fread #endif #define fread FIXES_fread #endif /* * FIXES_fputchar(File:handle, value, bool:utf8 = true) * * FIXES: * fputchar */ #if FIX_fputchar stock bool:FIXES_fputchar(File:handle, value, bool:utf8 = true) { if (handle) { return fputchar(handle, value, utf8); } return false; } #if defined _ALS_fputchar #undef fputchar #else native BAD_fputchar(File:handle, value, bool:utf8 = true) = fputchar; #define _ALS_fputchar #endif #define fputchar FIXES_fputchar #endif /* * FIXES_fgetchar(File:handle, value, bool:utf8 = true) * * FIXES: * fgetchar */ #if FIX_fgetchar stock FIXES_fgetchar(File:handle, value, bool:utf8 = true) { if (handle) { return fgetchar(handle, value, utf8); } return 0; } #if defined _ALS_fgetchar #undef fgetchar #else native BAD_fgetchar(File:handle, value, bool:utf8 = true) = fgetchar; #define _ALS_fgetchar #endif #define fgetchar FIXES_fgetchar #endif /* * FIXES_fblockwrite(File:handle, const buffer[], size = sizeof (buffer)) * * FIXES: * fblockwrite */ #if FIX_fblockwrite stock FIXES_fblockwrite(File:handle, const buffer[], size = sizeof (buffer)) { if (handle) { return fblockwrite(handle, buffer, size); } return 0; } #if defined _ALS_fblockwrite #undef fblockwrite #else native BAD_fblockwrite(File:handle, const buffer[], size = sizeof (buffer)) = fblockwrite; #define _ALS_fblockwrite #endif #define fblockwrite FIXES_fblockwrite #endif /* * FIXES_fblockread(File:handle, buffer[], size = sizeof (buffer)) * * FIXES: * fblockread */ #if FIX_fblockread stock FIXES_fblockread(File:handle, buffer[], size = sizeof (buffer)) { if (handle) { return fblockread(handle, buffer, size); } return 0; } #if defined _ALS_fblockread #undef fblockread #else native BAD_fblockread(File:handle, buffer[], size = sizeof (buffer)) = fblockread; #define _ALS_fblockread #endif #define fblockread FIXES_fblockread #endif /* * FIXES_fseek(File:handle, position = 0, seek_whence:whence = seek_start) * * FIXES: * fseek */ #if FIX_fseek stock FIXES_fseek(File:handle, position = 0, seek_whence:whence = seek_start) { if (handle) { return fseek(handle, position, whence); } return 0; } #if defined _ALS_fseek #undef fseek #else native BAD_fseek(File:handle, position = 0, seek_whence:whence = seek_start) = fseek; #define _ALS_fseek #endif #define fseek FIXES_fseek #endif /* * FIXES_flength(File:handle) * * FIXES: * flength */ #if FIX_flength stock FIXES_flength(File:handle) { if (handle) { return flength(handle); } return 0; } #if defined _ALS_flength #undef flength #else native BAD_flength(File:handle) = flength; #define _ALS_flength #endif #define flength FIXES_flength #endif /* * FIXES_Kick(playerid) * * FIXES: * 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. #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; return 1; } else { return Kick(playerid); } } #if defined _ALS_Kick #undef Kick #else native BAD_Kick(playerid) = Kick; #define _ALS_Kick #endif #define Kick FIXES_Kick #endif /* * FIXES_IsPAttachedObjectSlotUsed(playerid, index) * * FIXES: * IsPlayerAttachedObjectSlotUsed */ #if FIX_IsPlayerAttachedObjSlotUsed stock FIXES_IsPAttachedObjectSlotUsed(playerid, index) { if (IsPlayerConnected(playerid)) { return FIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] & 1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index; } return 0; } #if defined _ALS_IsPAttachedObjSlotUsed #undef IsPlayerAttachedObjectSlotUsed #else native BAD_IsPlayerAttachedObjSlotUsed(playerid, index) = IsPlayerAttachedObjectSlotUsed; #define _ALS_IsPAttachedObjSlotUsed #endif #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 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; } #if defined _ALS_SetPlayerAttachedObject #undef SetPlayerAttachedObject #else 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; #define _ALS_SetPlayerAttachedObject #endif #define SetPlayerAttachedObject FIXES_SetPlayerAttachedObject #endif /* * FIXES_RemovePlayerAttachedObj(playerid, index) * * FIXES: * IsPlayerAttachedObjectSlotUsed */ #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; } #if defined _ALS_RemovePlayerAttachedObject #undef RemovePlayerAttachedObject #else native BAD_RemovePlayerAttachedObject(playerid, index) = RemovePlayerAttachedObject; #define _ALS_RemovePlayerAttachedObject #endif #define RemovePlayerAttachedObject FIXES_RemovePlayerAttachedObj #endif /* * FIXES_%%%!!! * * FIXES: * %%% */ /*#if FIX_%%% stock FIXES_%%%!!! { return 0; } #if defined _ALS_%%% #undef %%% #else native BAD_%%%!!! = %%%; #define _ALS_%%% #endif #define %%% FIXES_%%% #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: Serveral 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)) { // Either this is a Filter Script (1) and we don't want Game // Modes (1) or this isn't a filterscript (0) and we do want // Game Modes (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. return 0; } } else {*/ if (existproperty(5, FIXES_gscNoGMProperty)) { // Either this is a Filter Script (1) and we don't want Game // Modes (1) or this isn't a filterscript (0) and we do want // Game Modes (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. return 0; } // Make sure certain data is synced with what the GM thinks it is. // ============================= // START: AllowInteriorWeapons // ============================= #if FIX_AllowInteriorWeapons CallRemoteFunction(FIXES_gscAllowInteriorWeapons, FIXES_gscSpec@i, !(FIXES_gsSettings & e_FIXES_SETTINGS_INTERIOR)); #endif // ============================= // START: AllowInteriorWeapons // ============================= // ================================ // START: 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)) { 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 for (new i = 0; i != MAX_PLAYERS; ++i) { if (IsPlayerConnected(i)) { // ============================= // START: SetPlayerWorldBounds // ============================= #if FIX_SetPlayerWorldBounds //if (FIXES_gsPlayerBools[i] & e_FIXES_BOOLS_WORLDBOUNDS) //{ // 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 // was removed and. 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 // ============================= // ================================= // START: TogglePlayerControllable // ================================= #if FIX_TogglePlayerControllable CallRemoteFunction(FIXES_gscTogglePlayerControl, FIXES_gscSpec@ii, i, !(FIXES_gsPlayerBools[i] & e_FIXES_BOOLS_UNCONTROLLABLE)); #endif // ================================= // END: TogglePlayerControllable // ================================= // =========================== // START: 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 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"); return 1; } #if FIXES_Debug else { FIXES_PRINTF("_FIXES_DetermineOrder: Ending"); } #endif return 0; } #endif /* * FIXES_strins(string[], const substr[], pos, maxlength = sizeof string) * * FIXES: * 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) { string{pos} = '\0'; // Hopefully this doesn't ignore maxlength and does packed. return 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) { string[pos] = '\0'; // Hopefully this doesn't ignore maxlength and does packed. return 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]); } } #if defined _ALS_strins #undef strins #else native BAD_strins(string[], const substr[], pos, maxlength = sizeof string) = strins; #define _ALS_strins #endif #define strins FIXES_strins #endif /* * FIXES_random(const maxint) * * FIXES: * random */ #if FIX_random stock FIXES_random(max) { if (max < 0) { return -random(-max); } else { return random(max); } } #if defined _ALS_random #undef random #else native BAD_random(max) = random; #define _ALS_random #endif #define random FIXES_random #endif #undef _FIXES_CEILDIV #undef _FIXES_INFINITY #undef _FIXES_N_INFINITY #undef _FIXES_ATTACHMENTS #undef _FIXES_IS_UNSET #undef FIXES_DETECT_CALLBACK_1 #undef FIXES_DETECT_CALLBACK_2 #undef FIXES_CALL_CALLBACK_1 #undef FIXES_CALL_CALLBACK_2 #undef FIXES_PRINTF