

#if defined _orpheu_included

	#endinput

#endif

#define _orpheu_included



#include <orpheu_const>



/**

 * Retrieves a function based on a function name

 * The name must be the same as the one in the file where the function is defined

 *

 * @param libFunctionName	The name of the function as it is in the file where the function is defined

 * @param className			The name of the class if the function belongs to one

 *

 * @return 					A handler to the function

 */

native OrpheuFunction:OrpheuGetFunction(const libFunctionName[],const className[]="")



/**

 * Hooks a function

 *

 * @param function			A handler to the function

 * @param hookFunctionName	The function name in the plugin that shall be called upon interception of the original function

 * @param phase				The phase of the hook. It can have two values. Pre means "right before the original function is called". Post means "right after the original function is called"

 *

 * @return 					A handler to the hook

 */

native OrpheuHook:OrpheuRegisterHook(OrpheuFunction:function,const hookFunctionName[],OrpheuHookPhase:phase = OrpheuHookPre)



/**

 * Unregisters a hook (stops it)

 *

 * @param hook			A handler to the hook

 */

native OrpheuUnregisterHook(OrpheuHook:hook)



/**

 * Calls a function without triggering its hooks

 * 

 * @param function		A handler to the function

 * @param any			The arguments of the function

 */

native OrpheuCall(OrpheuFunction:function,any:...)



/**

 * Calls a function and triggers its hooks

 * 

 * @param function		A handler to the function

 * @param any			The arguments of the function

 */

native OrpheuCallSuper(OrpheuFunction:function,any:...)



/**

 * Gets the return value of a function (To be used in hooks Post)

 *

 * @param any			In case the value is multi cell (string or vector), an holder to receive them by ref

 * @return				In case the value is uni cell, the value itself

 */

native any:OrpheuGetReturn(any:...)



/**

 * Sets the return value of a function

 *

 * @param any			Depending on the type of the return of the function, a value to be used as the return as the original hooked function

 */

native OrpheuSetReturn(any:...)



/**

 * Sets the value of an argument

 * 

 * @param num 			The number of the argument. The first argument would be the number "1"

 * @param any			Depending on the type of the argument, a value to be replace it to change the behaviour of the hooked function

 */

native OrpheuSetParam(num,any:...)



/**

 * Creates a struct

 * 

 * @param structType 	The type of the struct 

 * 

 * @return				A handler to the struct

 */

native OrpheuStruct:OrpheuCreateStruct(OrpheuStructType:structType)



/**

 * Retrieves the value of a member of a struct given the argument number the struct is and the member name

 * 

 * @param num 			The number of the argument. The first argument would be the number "1"

 * @param memberName 	The name of the member of the struct we want to deal with

 * @param any 			If the member is multi cell, 

 * 

 * @return				In case the value is uni cell, the value itself

 */

native OrpheuGetParamStructMember(num,const memberName[],any:...)



/**

 * Sets the value of member of a struct given the argument number the struct is and the member name

 * 

 * @param num 			The number of the argument. The first argument would be the number "1"

 * @param memberName 	The name of the member of the struct we want to deal with

 * @param any 			The new value

 */

native OrpheuSetParamStructMember(num,const memberName[],any:...)



/**

 * Gets a struct handler for a struct received as an argument 

 * Beware that if the original struct gets destroyed or changed these effects will reflect on your use of it.

 * 

 * @param num 			The number of the argument. The first argument would be the number "1"

 * 

 * @return				A handler to the struct

 */

native OrpheuStruct:OrpheuGetStructFromParam(num)



/**

 * Creates a struct equal to one received as an argument

 * 

 * @param num 			The number of the argument. The first argument would be the number "1"

 * 

 * @return				A handler to the struct

 */

native OrpheuStruct:OrpheuCloneStructFromParam(num)



/**

 * Sets the value of a member of a struct given a struct handler and the member name

 * 

 * @param struct 		A handler to the struct

 * @param memberName 	The name of the member of the struct we want to deal with

 * @param any 			The new value

 */

native OrpheuSetStructMember(OrpheuStruct:struct,const memberName[],any:...)



/**

 * Retrieves the value of a member of a struct given a struct handler and the member name

 * 

 * @param struct 		A handler to the struct

 * @param memberName 	The name of the member of the struct we want to deal with

 * @param any 			In case the value is multi cell (string or vector), an holder to receive them by ref

 * 

 * @return				In case the value is uni cell, the value itself

 */

native OrpheuGetStructMember(OrpheuStruct:struct,const memberName[],any:...)



/**

 * Retrieves a handler to a struct that hold the addresses of the engine functions

 * By retrieving addresses from the struct is possible to hook them.

 * A easier way to achieve the same thing is by using the stock OrpheuGetEngineFunction

 

 * @return				A handler to a struct that holds the engine functions

 */

native OrpheuStruct:OrpheuGetEngineFunctionsStruct()



/**

 * Retrieves a handler to a struct that hold the addresses of the dll functions

 * By retrieving addresses from the struct is possible to hook them.

 * A easier way to achieve the same thing is by using the stock OrpheuGetDllFunction

 

 * @return				A handler to a struct that holds the dll functions

 */

native OrpheuStruct:OrpheuGetDLLFunctionsStruct()



/**

 * Retrieves a handler to a function given a classname, the function name and the classname

 * This function is a virtual function (a function defined in abase class and implemented 

 * differently by each extender class)

 * For example: every class that extends CBaseEntity has a Spawn function. That function is defined in CBaseEntity

 * and implemented differently by each class derived from CBaseEntity

 * 

 * @param entityClassName 	A class related to the object that holds the function wanted to be hooked. Example: "player"

 * @param libFunctionName 	The library function name as it is in the file created to define the function

 * @param libClassName	 	The library function name as it is in the file created to define the function

 * @return					A handler to the function

 */

native OrpheuFunction:OrpheuGetFunctionFromClass(const entityClassName[],const libFunctionName[],const libClassName[])



/**

 * Retrieves a handler to a function given the ID of an entity, the function name and the classname

 * This function is a virtual function (a function defined in abase class and implemented 

 * differently by each extender class)

 * For example: every class that extends CBaseEntity has a Spawn function. That function is defined in CBaseEntity

 * and implemented differently by each class derived from CBaseEntity

 * 

 * @param id				The id of the entity

 * @param libFunctionName 	The library function name as it is in the file created to define the function

 * @param libClassName	 	The library function name as it is in the file created to define the function

 * @return					A handler to the function

 */

native OrpheuFunction:OrpheuGetFunctionFromEntity(id,const libFunctionName[],const libClassName[])



/**

 * Retrieves a handler to a function given an object, the function name and the classname

 * This function is a virtual function (a function defined in abase class and implemented 

 * differently by each extender class)

 * For example: every class that extends CBaseEntity has a Spawn function. That function is defined in CBaseEntity

 * and implemented differently by each class derived from CBaseEntity

 * 

 * @param object			An object. More precisely, the address of a C++ object. This should be used for classes that are not entities

 * @param libFunctionName 	The library function name as it is in the file created to define the function

 * @param libClassName	 	The library function name as it is in the file created to define the function

 * @return					A handler to the function

 */

native OrpheuFunction:OrpheuGetFunctionFromObject(object,const libFunctionName[],const libClassName[])



/**

 * Retrieves a handler to a function given the id of a monster of monstermod, the function name and the classname

 * This function is a virtual function (a function defined in abase class and implemented 

 * differently by each extender class)

 * For example: every class that extends CBaseEntity has a Spawn function. That function is defined in CBaseEntity

 * and implemented differently by each class derived from CBaseEntity

 * 

 * This function goes against the spirit of orpheu of hardcoding the less possible but without it would be much

 * more complex to use virtual functions

 * 

 * @param id				The id of a monster from monstermod

 * @param libFunctionName 	The library function name as it is in the file created to define the function

 * @param libClassName	 	The library function name as it is in the file created to define the function

 * @return					A handler to the function

 */

native OrpheuFunction:OrpheuGetFunctionFromMonster(id, const libFunctionName[], const libClassName[])

