/*----------------------------------------------------------------------------*- ============================== y_hooks - Hook any callback! ============================== Description: Automatically hooks any callbacks with a very simple syntax. Legal: Version: MPL 1.1 The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is the SA:MP script information include. The Initial Developer of the Original Code is Alex "Y_Less" Cole. Portions created by the Initial Developer are Copyright (C) 2008 the Initial Developer. All Rights Reserved. Contributors: ZeeX, koolk Thanks: Peter, Cam - Support. ZeeX - Very productive conversations. koolk - IsPlayerinAreaEx code. TheAlpha - Danish translation. breadfish - German translation. Fireburn - Dutch translation. yom - French translation. 50p - Polish translation. Zamaroht - Spanish translation. Dracoblue, sintax, mabako, Xtreme, other coders - Producing other modes for me to strive to better. Pixels^ - Running XScripters where the idea was born. Matite - Pestering me to release it and using it. Very special thanks to: Thiadmer - PAWN. Kye/Kalcor - SA:MP. SA:MP Team past, present and future - SA:MP. Version: 1.0 Changelog: 06/08/10: First version -*----------------------------------------------------------------------------*/ #include #include #include #include #define ALS_PREFIX S@@ #include #include #include #include //#define Hook:%1_On%2(%3) forward %1_@%2(%3); public %1_@%2(%3) #define Hook:%1_On%2(%3) @yH_%2_%1(%3);@yH_%2_%1(%3) #define HOOK_FUNC_SEARCH (Scripting_FastString('@', 'y', 'H', '_')) #define HOOKS_INSERT<%0> tmp=_:gs_aHookFunctionPointers[ALS_On%0],gs_aHookFunctionPointers[ALS_On%0]=Bit:((tmp!=_:-1?tmp&0xFFFF:idx-1)|idx<<16); //#define HOOKS_CALL<%0,%1>(%2) new t=_:gs_aHookFunctionPointers[ALS_On%0];if(t!=-1){new e=t>>>16;t&=0xFFFF;do t=Scripting_GetPublic(t,gs_szFunctionBuffer,"@yH_"#%0),P@(gs_szFunctionBuffer,#%1#x,%2);while(t!=e);} #define HOOKS_C_INT<%0,%1>(%2) new t=_:gs_aHookFunctionPointers[ALS_On%0];if(t!=-1){new e=t>>>16;t&=0xFFFF;do t=Scripting_GetPublic(t,gs_szFunctionBuffer,"@yH_"#%0),P@(gs_szFunctionBuffer,#%1#x,%2);while(t!=e);} #define HUK_C_GameModeInit HOOKS_C_INT() #define HUK_C_GameModeExit HOOKS_C_INT() #define HUK_C_FilterScriptInit HOOKS_C_INT() #define HUK_C_FilterScriptExit HOOKS_C_INT() #define HUK_C_PlayerConnect HOOKS_C_INT(playerid) #define HUK_C_PlayerDisconnect HOOKS_C_INT(playerid,reason) #define HUK_C_PlayerSpawn HOOKS_C_INT(playerid) #define HUK_C_PlayerDeath HOOKS_C_INT(playerid,killerid,reason) #define HUK_C_VehicleSpawn HOOKS_C_INT(vehicleid) #define HUK_C_VehicleDeath HOOKS_C_INT(vehicleid,killerid) #define HUK_C_PlayerText HOOKS_C_INT(playerid,text) #define HUK_C_PlayerCommandText HOOKS_C_INT(playerid,cmdtext) #define HUK_C_PlayerRequestClass HOOKS_C_INT(playerid,classid) #define HUK_C_PlayerEnterVehicle HOOKS_C_INT(playerid,vehicleid,ispassenger) #define HUK_C_PlayerExitVehicle HOOKS_C_INT(playerid,vehicleid) #define HUK_C_PlayerStateChange HOOKS_C_INT(playerid,newstate,oldstate) #define HUK_C_PlayerEnterCheckpoint HOOKS_C_INT(playerid) #define HUK_C_PlayerLeaveCheckpoint HOOKS_C_INT(playerid) #define HUK_C_PlayerEnterRaceCheckpoint HOOKS_C_INT(playerid) #define HUK_C_PlayerLeaveRaceCheckpoint HOOKS_C_INT(playerid) #define HUK_C_RconCommand HOOKS_C_INT(cmd) #define HUK_C_PlayerRequestSpawn HOOKS_C_INT(playerid) #define HUK_C_ObjectMoved HOOKS_C_INT(objectid) #define HUK_C_PlayerObjectMoved HOOKS_C_INT(playerid,objectid) #define HUK_C_PlayerPickUpPickup HOOKS_C_INT(playerid,pickupid) #define HUK_C_VehicleMod HOOKS_C_INT(playerid,vehicleid,componentid) #define HUK_C_EnterExitModShop HOOKS_C_INT(playerid,enterexit,interiorid) #define HUK_C_VehiclePaintjob HOOKS_C_INT(playerid,vehicleid,paintjobid) #define HUK_C_VehicleRespray HOOKS_C_INT(playerid,vehicleid,color1,color2) #define HUK_C_VehicleDamageStatusUpdate HOOKS_C_INT(playerid,playerid) #define HUK_C_PlayerSelectedMenuRow HOOKS_C_INT(playerid,row) #define HUK_C_PlayerExitedMenu HOOKS_C_INT(playerid) #define HUK_C_PlayerInteriorChange HOOKS_C_INT(playerid,newinteriorid,oldinteriorid) #define HUK_C_PlayerKeyStateChange HOOKS_C_INT(playerid,newkeys,oldkeys) #define HUK_C_RconLoginAttempt HOOKS_C_INT(ip,password,success) #define HUK_C_PlayerUpdate HOOKS_C_INT(playerid) #define HUK_C_PlayerStreamIn HOOKS_C_INT(playerid,forplayerid) #define HUK_C_PlayerStreamOut HOOKS_C_INT(playerid,forplayerid) #define HUK_C_VehicleStreamIn HOOKS_C_INT(vehicleid,forplayerid) #define HUK_C_VehicleStreamOut HOOKS_C_INT(vehicleid,forplayerid) //#define HUK_C_DialogResponse HOOKS_C_INT(playerid,dialogid,response,listitem,inputtext) #define HUK_C_PlayerClickPlayer HOOKS_C_INT(playerid,clickedplayerid,source) //#define HUK_C_DialogResponse if(inputtext[0]){HOOKS_C_INT(playerid,dialogid,response,listitem,inputtext)}else{HOOKS_C_INT(playerid,dialogid,response,listitem,NULL)} //#define CALL_WRAPPER<%0> HUK_C_%0 ALS_CALL_%0 #define HOOKS_CALL<%0> HUK_C_%0 ALS_C_%0 #define HOOKS_MAX_UPDATES (4) static gs_aHookFunctionPointers[ALS] = {Bit:-1, ...}, gs_szFunctionBuffer[32], gs_aOnPlayerUpdateHooks[HOOKS_MAX_UPDATES] = {-1, ...}/*, gs_pCodeStart*/; ALS_DATA<> /*static Hooks_GetNext(&idx) { idx = Scripting_GetPublicFast(idx, gs_szFunctionBuffer, HOOK_FUNC_SEARCH); if (idx == 0) { return -1; } return YHash(gs_szFunctionBuffer[4], true, hash_bernstein, strfind(gs_szFunctionBuffer[4], "_")); }*/ /*----------------------------------------------------------------------------*- Function: Hooks_GenFuncList Params: - Return: - Notes: Generates a set of data describing every callback for speed later. -*----------------------------------------------------------------------------*/ static Hooks_GenFuncList() { // Check for old style hooks using the new ALS library. ALS_DETECT #if 1 ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT ALS_DETECT #endif // Check for new style hooks. This gets the bounds of functions, to make // later calls very slightly faster! new idx = 0, tmp; // For some reason compile time initialisation didn't work... for (new ALS:i; i != ALS; ++i) { gs_aHookFunctionPointers[i] = -1; } for ( ; ; ) { idx = Scripting_GetPublicFast(idx, gs_szFunctionBuffer, HOOK_FUNC_SEARCH); if (idx == 0) { break; } //return YHash(gs_szFunctionBuffer[4], true, bernstein, strfind(gs_szFunctionBuffer[4], "_")); //switch (Hooks_GetNext(idx)) switch (YHash(gs_szFunctionBuffer[4], true, hash_bernstein, strfind(gs_szFunctionBuffer[4], "_"))) { case _H(G,a,m,e,M,o,d,e,I,n,i,t): HOOKS_INSERT case _H(G,a,m,e,M,o,d,e,E,x,i,t): HOOKS_INSERT case _H(F,i,l,t,e,r,S,c,r,i,p,t,I,n,i,t): HOOKS_INSERT case _H(F,i,l,t,e,r,S,c,r,i,p,t,E,x,i,t): HOOKS_INSERT case _H(P,l,a,y,e,r,C,o,n,n,e,c,t): HOOKS_INSERT case _H(P,l,a,y,e,r,D,i,s,c,o,n,n,e,c,t): HOOKS_INSERT case _H(P,l,a,y,e,r,S,p,a,w,n): HOOKS_INSERT case _H(P,l,a,y,e,r,D,e,a,t,h): HOOKS_INSERT case _H(V,e,h,i,c,l,e,S,p,a,w,n): HOOKS_INSERT case _H(V,e,h,i,c,l,e,D,e,a,t,h): HOOKS_INSERT case _H(P,l,a,y,e,r,T,e,x,t): HOOKS_INSERT case _H(P,l,a,y,e,r,C,o,m,m,a,n,d,T,e,x,t): HOOKS_INSERT case _H(P,l,a,y,e,r,R,e,q,u,e,s,t,C,l,a,s,s): HOOKS_INSERT case _H(P,l,a,y,e,r,E,n,t,e,r,V,e,h,i,c,l,e,): HOOKS_INSERT case _H(P,l,a,y,e,r,E,x,i,t,V,e,h,i,c,l,e,): HOOKS_INSERT case _H(P,l,a,y,e,r,S,t,a,t,e,C,h,a,n,g,e): HOOKS_INSERT case _H(P,l,a,y,e,r,E,n,t,e,r,C,h,e,c,k,p,o,i,n,t), _H(P,l,a,y,e,r,E,n,t,e,r,C,P): HOOKS_INSERT case _H(P,l,a,y,e,r,L,e,a,v,e,C,h,e,c,k,p,o,i,n,t), _H(P,l,a,y,e,r,L,e,a,v,e,C,P): HOOKS_INSERT case _H(P,l,a,y,e,r,E,n,t,e,r,R,a,c,e,C,h,e,c,k,p,o,i,n,t), _H(P,l,a,y,e,r,E,n,t,e,r,R,C,P): HOOKS_INSERT case _H(P,l,a,y,e,r,L,e,a,v,e,R,a,c,e,C,h,e,c,k,p,o,i,n,t), _H(P,l,a,y,e,r,L,e,a,v,e,R,C,P): HOOKS_INSERT case _H(R,c,o,n,C,o,m,m,a,n,d): HOOKS_INSERT case _H(P,l,a,y,e,r,R,e,q,u,e,s,t,S,p,a,w,n): HOOKS_INSERT case _H(O,b,j,e,c,t,M,o,v,e,d): HOOKS_INSERT case _H(P,l,a,y,e,r,O,b,j,e,c,t,M,o,v,e,d): HOOKS_INSERT case _H(P,l,a,y,e,r,P,i,c,k,U,p,P,i,c,k,u,p): HOOKS_INSERT case _H(V,e,h,i,c,l,e,M,o,d): HOOKS_INSERT case _H(E,n,t,e,r,E,x,i,t,M,o,d,S,h,o,p): HOOKS_INSERT case _H(V,e,h,i,c,l,e,P,a,i,n,t,j,o,b): HOOKS_INSERT case _H(V,e,h,i,c,l,e,R,e,s,p,r,a,y): HOOKS_INSERT case _H(V,e,h,i,c,l,e,D,a,m,a,g,e,S,t,a,t,u,s,U,p,d,a,t,e), _H(V,e,h,i,c,l,e,D,a,m,a,g,e,U,p,d,a,t,e): HOOKS_INSERT case _H(P,l,a,y,e,r,S,e,l,e,c,t,e,d,M,e,n,u,R,o,w), _H(P,l,a,y,e,r,S,e,l,e,c,t,e,d,M,e,n,u): HOOKS_INSERT case _H(P,l,a,y,e,r,E,x,i,t,e,d,M,e,n,u): HOOKS_INSERT case _H(P,l,a,y,e,r,I,n,t,e,r,i,o,r,C,h,a,n,g,e): HOOKS_INSERT case _H(P,l,a,y,e,r,K,e,y,S,t,a,t,e,C,h,a,n,g,e): HOOKS_INSERT case _H(R,c,o,n,L,o,g,i,n,A,t,t,e,m,p,t): HOOKS_INSERT case _H(P,l,a,y,e,r,S,t,r,e,a,m,I,n): HOOKS_INSERT case _H(P,l,a,y,e,r,S,t,r,e,a,m,O,u,t): HOOKS_INSERT case _H(V,e,h,i,c,l,e,S,t,r,e,a,m,I,n): HOOKS_INSERT case _H(V,e,h,i,c,l,e,S,t,r,e,a,m,O,u,t): HOOKS_INSERT case _H(D,i,a,l,o,g,R,e,s,p,o,n,s,e): HOOKS_INSERT case _H(P,l,a,y,e,r,C,l,i,c,k,P,l,a,y,e,r): HOOKS_INSERT case -1: // Do nothing - end condition. break; case _H(P,l,a,y,e,r,U,p,d,a,t,e): { //HOOKS_INSERT // This uses different code to improve speed a little bit. tmp = _:gs_aHookFunctionPointers[ALS_OnPlayerUpdate]; if (tmp == -1) { gs_aHookFunctionPointers[ALS_OnPlayerUpdate] = Bit:0; // Save the index of the first OnPlayerUpdate function. gs_aOnPlayerUpdateHooks[0] = idx - 1; //gs_aOnPlayerUpdateHooks[0] = Scripting_GetPublicPointer(gs_szFunctionBuffer); } else { // f = First, the upper limit. // s = Second, the lower limit. // Note that this only supports 65535 public functions, but // I suspect the compiler may get a little upset before you // reach that number - and if it doesn't you're going to // end up with a HUGE AMX! // f should always be larger than s in a normal system, even // if it's only 1 larger. new s = tmp & 0xFFFF; if (tmp & 0xFFFF0000) { // Given up counting - too many for quick // resolution. gs_aHookFunctionPointers[ALS_OnPlayerUpdate] = Bit:(s | idx << 16); } else { // Counting. if (++s == HOOKS_MAX_UPDATES) { // Reached the limit of the number of quick hooks // for OnPlayerUpdate supported. gs_aHookFunctionPointers[ALS_OnPlayerUpdate] = Bit:(idx - 1 | idx << 16); } else { gs_aOnPlayerUpdateHooks[s] = idx - 1; //gs_aOnPlayerUpdateHooks[s] = Scripting_GetPublicPointer(gs_szFunctionBuffer); gs_aHookFunctionPointers[ALS_OnPlayerUpdate] = Bit:s; } } } //gs_aHookFunctionPointers[ALS_OnPlayerUpdate] = Bit:((tmp!=_:-1?tmp&0xFFFF:idx-1)|idx<<16); } } } // Now, skip functions we don't need... This is actually self modifying // code, so if you don't use any of the Hook: features, they are never even // called. The functionality of this script depends entirely on the rest of // the script. This can't be made in to a macro because #OnWhatever needs // to stringise the value in the current define if it exists, whereas doing // #On%0 would just make a string of "OnWhatever". if (gs_aHookFunctionPointers[ALS_OnGameModeInit] == Bit:-1) Scripting_RedirectPublic(#OnGameModeInit, Scripting_GetPublicPointer("S@@_OnGameModeInit")); // Now the same again. #if 1 if (gs_aHookFunctionPointers[ALS_OnGameModeExit] == Bit:-1) Scripting_RedirectPublic(#OnGameModeExit, Scripting_GetPublicPointer("S@@_OnGameModeExit")); if (gs_aHookFunctionPointers[ALS_OnFilterScriptInit] == Bit:-1) Scripting_RedirectPublic(#OnFilterScriptInit, Scripting_GetPublicPointer("S@@_OnFilterScriptInit")); if (gs_aHookFunctionPointers[ALS_OnFilterScriptExit] == Bit:-1) Scripting_RedirectPublic(#OnFilterScriptExit, Scripting_GetPublicPointer("S@@_OnFilterScriptExit")); if (gs_aHookFunctionPointers[ALS_OnPlayerConnect] == Bit:-1) Scripting_RedirectPublic(#OnPlayerConnect, Scripting_GetPublicPointer("S@@_OnPlayerConnect")); if (gs_aHookFunctionPointers[ALS_OnPlayerDisconnect] == Bit:-1) Scripting_RedirectPublic(#OnPlayerDisconnect, Scripting_GetPublicPointer("S@@_OnPlayerDisconnect")); if (gs_aHookFunctionPointers[ALS_OnPlayerSpawn] == Bit:-1) Scripting_RedirectPublic(#OnPlayerSpawn, Scripting_GetPublicPointer("S@@_OnPlayerSpawn")); if (gs_aHookFunctionPointers[ALS_OnPlayerDeath] == Bit:-1) Scripting_RedirectPublic(#OnPlayerDeath, Scripting_GetPublicPointer("S@@_OnPlayerDeath")); if (gs_aHookFunctionPointers[ALS_OnVehicleSpawn] == Bit:-1) Scripting_RedirectPublic(#OnVehicleSpawn, Scripting_GetPublicPointer("S@@_OnVehicleSpawn")); if (gs_aHookFunctionPointers[ALS_OnVehicleDeath] == Bit:-1) Scripting_RedirectPublic(#OnVehicleDeath, Scripting_GetPublicPointer("S@@_OnVehicleDeath")); if (gs_aHookFunctionPointers[ALS_OnPlayerText] == Bit:-1) Scripting_RedirectPublic(#OnPlayerText, Scripting_GetPublicPointer("S@@_OnPlayerText")); if (gs_aHookFunctionPointers[ALS_OnPlayerCommandText] == Bit:-1) Scripting_RedirectPublic(#OnPlayerCommandText, Scripting_GetPublicPointer("S@@_OnPlayerCommandText")); if (gs_aHookFunctionPointers[ALS_OnPlayerRequestClass] == Bit:-1) Scripting_RedirectPublic(#OnPlayerRequestClass, Scripting_GetPublicPointer("S@@_OnPlayerRequestClass")); if (gs_aHookFunctionPointers[ALS_OnPlayerEnterVehicle] == Bit:-1) Scripting_RedirectPublic(#OnPlayerEnterVehicle, Scripting_GetPublicPointer("S@@_OnPlayerEnterVehicle")); if (gs_aHookFunctionPointers[ALS_OnPlayerExitVehicle] == Bit:-1) Scripting_RedirectPublic(#OnPlayerExitVehicle, Scripting_GetPublicPointer("S@@_OnPlayerExitVehicle")); if (gs_aHookFunctionPointers[ALS_OnPlayerStateChange] == Bit:-1) Scripting_RedirectPublic(#OnPlayerStateChange, Scripting_GetPublicPointer("S@@_OnPlayerStateChange")); if (gs_aHookFunctionPointers[ALS_OnPlayerEnterCheckpoint] == Bit:-1) Scripting_RedirectPublic(#OnPlayerEnterCheckpoint, Scripting_GetPublicPointer("S@@_OnPlayerEnterCheckpoint")); if (gs_aHookFunctionPointers[ALS_OnPlayerLeaveCheckpoint] == Bit:-1) Scripting_RedirectPublic(#OnPlayerLeaveCheckpoint, Scripting_GetPublicPointer("S@@_OnPlayerLeaveCheckpoint")); if (gs_aHookFunctionPointers[ALS_OnPlayerEnterRaceCheckpoint] == Bit:-1) Scripting_RedirectPublic(#OnPlayerEnterRaceCheckpoint, Scripting_GetPublicPointer("S@@_OnPlayerEnterRaceCheckpoint")); if (gs_aHookFunctionPointers[ALS_OnPlayerLeaveRaceCheckpoint] == Bit:-1) Scripting_RedirectPublic(#OnPlayerLeaveRaceCheckpoint, Scripting_GetPublicPointer("S@@_OnPlayerLeaveRaceCheckpoint")); if (gs_aHookFunctionPointers[ALS_OnRconCommand] == Bit:-1) Scripting_RedirectPublic(#OnRconCommand, Scripting_GetPublicPointer("S@@_OnRconCommand")); if (gs_aHookFunctionPointers[ALS_OnPlayerRequestSpawn] == Bit:-1) Scripting_RedirectPublic(#OnPlayerRequestSpawn, Scripting_GetPublicPointer("S@@_OnPlayerRequestSpawn")); if (gs_aHookFunctionPointers[ALS_OnObjectMoved] == Bit:-1) Scripting_RedirectPublic(#OnObjectMoved, Scripting_GetPublicPointer("S@@_OnObjectMoved")); if (gs_aHookFunctionPointers[ALS_OnPlayerObjectMoved] == Bit:-1) Scripting_RedirectPublic(#OnPlayerObjectMoved, Scripting_GetPublicPointer("S@@_OnPlayerObjectMoved")); if (gs_aHookFunctionPointers[ALS_OnPlayerPickUpPickup] == Bit:-1) Scripting_RedirectPublic(#OnPlayerPickUpPickup, Scripting_GetPublicPointer("S@@_OnPlayerPickUpPickup")); if (gs_aHookFunctionPointers[ALS_OnVehicleMod] == Bit:-1) Scripting_RedirectPublic(#OnVehicleMod, Scripting_GetPublicPointer("S@@_OnVehicleMod")); if (gs_aHookFunctionPointers[ALS_OnEnterExitModShop] == Bit:-1) Scripting_RedirectPublic(#OnEnterExitModShop, Scripting_GetPublicPointer("S@@_OnEnterExitModShop")); if (gs_aHookFunctionPointers[ALS_OnVehiclePaintjob] == Bit:-1) Scripting_RedirectPublic(#OnVehiclePaintjob, Scripting_GetPublicPointer("S@@_OnVehiclePaintjob")); if (gs_aHookFunctionPointers[ALS_OnVehicleRespray] == Bit:-1) Scripting_RedirectPublic(#OnVehicleRespray, Scripting_GetPublicPointer("S@@_OnVehicleRespray")); if (gs_aHookFunctionPointers[ALS_OnVehicleDamageStatusUpdate] == Bit:-1) Scripting_RedirectPublic(#OnVehicleDamageStatusUpdate, Scripting_GetPublicPointer("S@@_OnVehicleDamageStatusUpdate")); if (gs_aHookFunctionPointers[ALS_OnPlayerSelectedMenuRow] == Bit:-1) Scripting_RedirectPublic(#OnPlayerSelectedMenuRow, Scripting_GetPublicPointer("S@@_OnPlayerSelectedMenuRow")); if (gs_aHookFunctionPointers[ALS_OnPlayerExitedMenu] == Bit:-1) Scripting_RedirectPublic(#OnPlayerExitedMenu, Scripting_GetPublicPointer("S@@_OnPlayerExitedMenu")); if (gs_aHookFunctionPointers[ALS_OnPlayerInteriorChange] == Bit:-1) Scripting_RedirectPublic(#OnPlayerInteriorChange, Scripting_GetPublicPointer("S@@_OnPlayerInteriorChange")); if (gs_aHookFunctionPointers[ALS_OnPlayerKeyStateChange] == Bit:-1) Scripting_RedirectPublic(#OnPlayerKeyStateChange, Scripting_GetPublicPointer("S@@_OnPlayerKeyStateChange")); if (gs_aHookFunctionPointers[ALS_OnRconLoginAttempt] == Bit:-1) Scripting_RedirectPublic(#OnRconLoginAttempt, Scripting_GetPublicPointer("S@@_OnRconLoginAttempt")); //if (gs_aHookFunctionPointers[ALS_OnPlayerUpdate] == Bit:-1) Scripting_RedirectPublic(#OnPlayerUpdate, Scripting_GetPublicPointer("S@@_OnPlayerUpdate")); if (gs_aHookFunctionPointers[ALS_OnPlayerStreamIn] == Bit:-1) Scripting_RedirectPublic(#OnPlayerStreamIn, Scripting_GetPublicPointer("S@@_OnPlayerStreamIn")); if (gs_aHookFunctionPointers[ALS_OnPlayerStreamOut] == Bit:-1) Scripting_RedirectPublic(#OnPlayerStreamOut, Scripting_GetPublicPointer("S@@_OnPlayerStreamOut")); if (gs_aHookFunctionPointers[ALS_OnVehicleStreamIn] == Bit:-1) Scripting_RedirectPublic(#OnVehicleStreamIn, Scripting_GetPublicPointer("S@@_OnVehicleStreamIn")); if (gs_aHookFunctionPointers[ALS_OnVehicleStreamOut] == Bit:-1) Scripting_RedirectPublic(#OnVehicleStreamOut, Scripting_GetPublicPointer("S@@_OnVehicleStreamOut")); if (gs_aHookFunctionPointers[ALS_OnDialogResponse] == Bit:-1) Scripting_RedirectPublic(#OnDialogResponse, Scripting_GetPublicPointer("S@@_OnDialogResponse")); if (gs_aHookFunctionPointers[ALS_OnPlayerClickPlayer] == Bit:-1) Scripting_RedirectPublic(#OnPlayerClickPlayer, Scripting_GetPublicPointer("S@@_OnPlayerClickPlayer")); #endif // The OnPlayerUpdate code is special. tmp = _:gs_aHookFunctionPointers[ALS_OnPlayerUpdate]; if (tmp == -1) { Scripting_RedirectPublic(#OnPlayerUpdate, Scripting_GetPublicPointer("S@@_OnPlayerUpdate")); } else { if (!(tmp & 0xFFFF)) { // Some fast find functions, but no normal ones. gs_aHookFunctionPointers[ALS_OnPlayerUpdate] = Bit:-1; } } } #pragma tabsize 0 // Hook OnGameModeInit using the old system to call the new system. public OnGameModeInit() { #if !defined FILTERSCRIPT // Generate the list of functions Hooks_GenFuncList(); #endif HOOKS_CALL //HOOKS_CALL() //ALS_CALL() } #if defined _ALS_OnGameModeInit #undef OnGameModeInit #else #define _ALS_OnGameModeInit #endif #define OnGameModeInit S@@_OnGameModeInit ALS_FORWARD public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { if (inputtext[0]) { HOOKS_C_INT(playerid,dialogid,response,listitem,inputtext) ALS_C_INT(playerid,dialogid,response,listitem,inputtext) } else { HOOKS_C_INT(playerid,dialogid,response,listitem,NULL) ALS_C_INT(playerid,dialogid,response,listitem,NULL) } //HOOKS_CALL } #if defined _ALS_OnDialogResponse #undef OnDialogResponse #else #define _ALS_OnDialogResponse #endif #define OnDialogResponse S@@_OnDialogResponse ALS_FORWARD public OnPlayerUpdate(playerid) { P:1("Hooks_OnPlayerUpdate called"); // This is the special one. for (new i = 0; i != HOOKS_MAX_UPDATES; ++i) { P:2("Hooks_OnPlayerUpdate: i = %d", i); new tmp = gs_aOnPlayerUpdateHooks[i]; if (tmp == -1) { ALS_CALL } // This function can return any public, it's not limited to getting // OnPlayerUpdate functions, but the passed index means it will reach a // matching function, which will be an update function, instantly. Scripting_GetPublicFast(tmp, gs_szFunctionBuffer, HOOK_FUNC_SEARCH); CallLocalFunction(gs_szFunctionBuffer,"i", playerid); } P:2("Hooks_OnPlayerUpdate ended"); // This uses the normal call wrapper. HOOKS_CALL } #if defined _ALS_OnPlayerUpdate #undef OnPlayerUpdate #else #define _ALS_OnPlayerUpdate #endif #define OnPlayerUpdate S@@_OnPlayerUpdate ALS_FORWARD public OnFilterScriptInit() { #if defined FILTERSCRIPT // Generate the list of functions Hooks_GenFuncList(); #endif HOOKS_CALL } #if defined _ALS_OnFilterScriptInit #undef OnFilterScriptInit #else #define _ALS_OnFilterScriptInit #endif #define OnFilterScriptInit S@@_OnFilterScriptInit ALS_FORWARD // ============================================================================= // ============================================================================= // ||| ||| // ||| NOTE: ||| // ||| ||| // ||| EVERYTHING BEYOND THIS POINT IS BORING AND CAN BE IGNORED - ||| // ||| IT'S JUST THE SAME CODE OVER AND OVER FOR EVERY CALLBACK: ||| // ||| ||| // ||| ||| // ||| public OnPlayerConnect(playerid) ||| // ||| { ||| // ||| HOOKS_CALL ||| // ||| } ||| // ||| #if defined _ALS_OnPlayerConnect ||| // ||| #undef OnPlayerConnect ||| // ||| #else ||| // ||| #define _ALS_OnPlayerConnect ||| // ||| #endif ||| // ||| #define OnPlayerConnect S@@_OnPlayerConnect ||| // ||| ALS_FORWARD ||| // ||| ||| // ||| ||| // ||| THE "#if 1" WILL ALLOW YOU TO HIDE ALL THE CODE IN AN ||| // ||| EDITOR WITH CODE FOLDING, FOR EXAMPLE NOTEPAD++ ||| // ||| ||| // ============================================================================= // ============================================================================= #if 1 public OnGameModeExit() { HOOKS_CALL } #if defined _ALS_OnGameModeExit #undef OnGameModeExit #else #define _ALS_OnGameModeExit #endif #define OnGameModeExit S@@_OnGameModeExit ALS_FORWARD public OnFilterScriptExit() { HOOKS_CALL } #if defined _ALS_OnFilterScriptExit #undef OnFilterScriptExit #else #define _ALS_OnFilterScriptExit #endif #define OnFilterScriptExit S@@_OnFilterScriptExit ALS_FORWARD public OnPlayerConnect(playerid) { HOOKS_CALL } #if defined _ALS_OnPlayerConnect #undef OnPlayerConnect #else #define _ALS_OnPlayerConnect #endif #define OnPlayerConnect S@@_OnPlayerConnect ALS_FORWARD public OnPlayerDisconnect(playerid, reason) { HOOKS_CALL } #if defined _ALS_OnPlayerDisconnect #undef OnPlayerDisconnect #else #define _ALS_OnPlayerDisconnect #endif #define OnPlayerDisconnect S@@_OnPlayerDisconnect ALS_FORWARD public OnPlayerSpawn(playerid) { HOOKS_CALL } #if defined _ALS_OnPlayerSpawn #undef OnPlayerSpawn #else #define _ALS_OnPlayerSpawn #endif #define OnPlayerSpawn S@@_OnPlayerSpawn ALS_FORWARD public OnPlayerDeath(playerid, killerid, reason) { HOOKS_CALL } #if defined _ALS_OnPlayerDeath #undef OnPlayerDeath #else #define _ALS_OnPlayerDeath #endif #define OnPlayerDeath S@@_OnPlayerDeath ALS_FORWARD public OnVehicleSpawn(vehicleid) { HOOKS_CALL } #if defined _ALS_OnVehicleSpawn #undef OnVehicleSpawn #else #define _ALS_OnVehicleSpawn #endif #define OnVehicleSpawn S@@_OnVehicleSpawn ALS_FORWARD public OnVehicleDeath(vehicleid, killerid) { HOOKS_CALL } #if defined _ALS_OnVehicleDeath #undef OnVehicleDeath #else #define _ALS_OnVehicleDeath #endif #define OnVehicleDeath S@@_OnVehicleDeath ALS_FORWARD public OnPlayerText(playerid, text[]) { HOOKS_CALL } #if defined _ALS_OnPlayerText #undef OnPlayerText #else #define _ALS_OnPlayerText #endif #define OnPlayerText S@@_OnPlayerText ALS_FORWARD public OnPlayerCommandText(playerid, cmdtext[]) { HOOKS_CALL } #if defined _ALS_OnPlayerCommandText #undef OnPlayerCommandText #else #define _ALS_OnPlayerCommandText #endif #define OnPlayerCommandText S@@_OnPlayerCommandText ALS_FORWARD public OnPlayerRequestClass(playerid, classid) { HOOKS_CALL } #if defined _ALS_OnPlayerRequestClass #undef OnPlayerRequestClass #else #define _ALS_OnPlayerRequestClass #endif #define OnPlayerRequestClass S@@_OnPlayerRequestClass ALS_FORWARD public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger) { HOOKS_CALL } #if defined _ALS_OnPlayerEnterVehicle #undef OnPlayerEnterVehicle #else #define _ALS_OnPlayerEnterVehicle #endif #define OnPlayerEnterVehicle S@@_OnPlayerEnterVehicle ALS_FORWARD public OnPlayerExitVehicle(playerid, vehicleid) { HOOKS_CALL } #if defined _ALS_OnPlayerExitVehicle #undef OnPlayerExitVehicle #else #define _ALS_OnPlayerExitVehicle #endif #define OnPlayerExitVehicle S@@_OnPlayerExitVehicle ALS_FORWARD public OnPlayerStateChange(playerid, newstate, oldstate) { HOOKS_CALL } #if defined _ALS_OnPlayerStateChange #undef OnPlayerStateChange #else #define _ALS_OnPlayerStateChange #endif #define OnPlayerStateChange S@@_OnPlayerStateChange ALS_FORWARD public OnPlayerEnterCheckpoint(playerid) { HOOKS_CALL } #if defined _ALS_OnPlayerEnterCheckpoint #undef OnPlayerEnterCheckpoint #else #define _ALS_OnPlayerEnterCheckpoint #endif #define OnPlayerEnterCheckpoint S@@_OnPlayerEnterCheckpoint ALS_FORWARD public OnPlayerLeaveCheckpoint(playerid) { HOOKS_CALL } #if defined _ALS_OnPlayerLeaveCheckpoint #undef OnPlayerLeaveCheckpoint #else #define _ALS_OnPlayerLeaveCheckpoint #endif #define OnPlayerLeaveCheckpoint S@@_OnPlayerLeaveCheckpoint ALS_FORWARD public OnPlayerEnterRaceCheckpoint(playerid) { HOOKS_CALL } #if defined _ALS_OnPlayerEnterRaceCP #undef OnPlayerEnterRaceCheckpoint #else #define _ALS_OnPlayerEnterRaceCP #endif #define OnPlayerEnterRaceCheckpoint S@@_OnPlayerEnterRaceCheckpoint ALS_FORWARD public OnPlayerLeaveRaceCheckpoint(playerid) { HOOKS_CALL } #if defined _ALS_OnPlayerLeaveRaceCP #undef OnPlayerLeaveRaceCheckpoint #else #define _ALS_OnPlayerLeaveRaceCP #endif #define OnPlayerLeaveRaceCheckpoint S@@_OnPlayerLeaveRaceCheckpoint ALS_FORWARD public OnRconCommand(cmd[]) { HOOKS_CALL } #if defined _ALS_OnRconCommand #undef OnRconCommand #else #define _ALS_OnRconCommand #endif #define OnRconCommand S@@_OnRconCommand ALS_FORWARD public OnPlayerRequestSpawn(playerid) { HOOKS_CALL } #if defined _ALS_OnPlayerRequestSpawn #undef OnPlayerRequestSpawn #else #define _ALS_OnPlayerRequestSpawn #endif #define OnPlayerRequestSpawn S@@_OnPlayerRequestSpawn ALS_FORWARD public OnObjectMoved(objectid) { HOOKS_CALL } #if defined _ALS_OnObjectMoved #undef OnObjectMoved #else #define _ALS_OnObjectMoved #endif #define OnObjectMoved S@@_OnObjectMoved ALS_FORWARD public OnPlayerObjectMoved(playerid, objectid) { HOOKS_CALL } #if defined _ALS_OnPlayerObjectMoved #undef OnPlayerObjectMoved #else #define _ALS_OnPlayerObjectMoved #endif #define OnPlayerObjectMoved S@@_OnPlayerObjectMoved ALS_FORWARD public OnPlayerPickUpPickup(playerid, pickupid) { HOOKS_CALL } #if defined _ALS_OnPlayerPickUpPickup #undef OnPlayerPickUpPickup #else #define _ALS_OnPlayerPickUpPickup #endif #define OnPlayerPickUpPickup S@@_OnPlayerPickUpPickup ALS_FORWARD public OnVehicleMod(playerid, vehicleid, componentid) { HOOKS_CALL } #if defined _ALS_OnVehicleMod #undef OnVehicleMod #else #define _ALS_OnVehicleMod #endif #define OnVehicleMod S@@_OnVehicleMod ALS_FORWARD public OnEnterExitModShop(playerid, enterexit, interiorid) { HOOKS_CALL } #if defined _ALS_OnEnterExitModShop #undef OnEnterExitModShop #else #define _ALS_OnEnterExitModShop #endif #define OnEnterExitModShop S@@_OnEnterExitModShop ALS_FORWARD public OnVehiclePaintjob(playerid, vehicleid, paintjobid) { HOOKS_CALL } #if defined _ALS_OnVehiclePaintjob #undef OnVehiclePaintjob #else #define _ALS_OnVehiclePaintjob #endif #define OnVehiclePaintjob S@@_OnVehiclePaintjob ALS_FORWARD public OnVehicleRespray(playerid, vehicleid, color1, color2) { HOOKS_CALL } #if defined _ALS_OnVehicleRespray #undef OnVehicleRespray #else #define _ALS_OnVehicleRespray #endif #define OnVehicleRespray S@@_OnVehicleRespray ALS_FORWARD public OnVehicleDamageStatusUpdate(vehicleid, playerid) { HOOKS_CALL } #if defined _ALS_OnVehicleDamageStatusUpd #undef OnVehicleDamageStatusUpdate #else #define _ALS_OnVehicleDamageStatusUpd #endif #define OnVehicleDamageStatusUpdate S@@_OnVehicleDamageStatusUpdate ALS_FORWARD public OnPlayerSelectedMenuRow(playerid, row) { HOOKS_CALL } #if defined _ALS_OnPlayerSelectedMenuRow #undef OnPlayerSelectedMenuRow #else #define _ALS_OnPlayerSelectedMenuRow #endif #define OnPlayerSelectedMenuRow S@@_OnPlayerSelectedMenuRow ALS_FORWARD public OnPlayerExitedMenu(playerid) { HOOKS_CALL } #if defined _ALS_OnPlayerExitedMenu #undef OnPlayerExitedMenu #else #define _ALS_OnPlayerExitedMenu #endif #define OnPlayerExitedMenu S@@_OnPlayerExitedMenu ALS_FORWARD public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid) { HOOKS_CALL } #if defined _ALS_OnPlayerInteriorChange #undef OnPlayerInteriorChange #else #define _ALS_OnPlayerInteriorChange #endif #define OnPlayerInteriorChange S@@_OnPlayerInteriorChange ALS_FORWARD public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) { HOOKS_CALL } #if defined _ALS_OnPlayerKeyStateChange #undef OnPlayerKeyStateChange #else #define _ALS_OnPlayerKeyStateChange #endif #define OnPlayerKeyStateChange S@@_OnPlayerKeyStateChange ALS_FORWARD public OnRconLoginAttempt(ip[], password[], success) { HOOKS_CALL } #if defined _ALS_OnRconLoginAttempt #undef OnRconLoginAttempt #else #define _ALS_OnRconLoginAttempt #endif #define OnRconLoginAttempt S@@_OnRconLoginAttempt ALS_FORWARD public OnPlayerStreamIn(playerid, forplayerid) { HOOKS_CALL } #if defined _ALS_OnPlayerStreamIn #undef OnPlayerStreamIn #else #define _ALS_OnPlayerStreamIn #endif #define OnPlayerStreamIn S@@_OnPlayerStreamIn ALS_FORWARD public OnPlayerStreamOut(playerid, forplayerid) { HOOKS_CALL } #if defined _ALS_OnPlayerStreamOut #undef OnPlayerStreamOut #else #define _ALS_OnPlayerStreamOut #endif #define OnPlayerStreamOut S@@_OnPlayerStreamOut ALS_FORWARD public OnVehicleStreamIn(vehicleid, forplayerid) { HOOKS_CALL } #if defined _ALS_OnVehicleStreamIn #undef OnVehicleStreamIn #else #define _ALS_OnVehicleStreamIn #endif #define OnVehicleStreamIn S@@_OnVehicleStreamIn ALS_FORWARD public OnVehicleStreamOut(vehicleid, forplayerid) { HOOKS_CALL } #if defined _ALS_OnVehicleStreamOut #undef OnVehicleStreamOut #else #define _ALS_OnVehicleStreamOut #endif #define OnVehicleStreamOut S@@_OnVehicleStreamOut ALS_FORWARD public OnPlayerClickPlayer(playerid, clickedplayerid, source) { HOOKS_CALL } #if defined _ALS_OnDPlayerClickPlayer #undef OnPlayerClickPlayer #else #define _ALS_OnPlayerClickPlayer #endif #define OnPlayerClickPlayer S@@_OnPlayerClickPlayer ALS_FORWARD #endif #pragma tabsize 4 #undef ALS_PREFIX