Antes de empezar les sugiero que si no tienen idea de lo que es programación orientada a objetos (abreviada OO o POO) lean algo sobre el tema por que sino dudo que entiendan parte del thread.
En juegos basados en el Half-Life, una porción del comportamiento del juego relacionado con las reglas del juego y los eventos esta agrupado en objetos derivados de un objeto llamado CGameRules. He juntado las funciones virtuales del mismo (dependientes del mod en cuestión o no) por lo que las puedes usar directamente luego de instalar este paquete.
Un paso obligatorio en la utilización de esas funciones es obtener las CGameRules derivadas del objeto mismo.
public plugin_precache()
{
OrpheuRegisterHook(OrpheuGetFunction("InstallGameRules"),"OnInstallGameRules",OrpheuHookPost)
}
public OnInstallGameRules()
{
g_pGameRules = OrpheuGetReturn()
}
Esto atrapa la función InstallGameRules que existe en todos los mods y crea el objeto que necesitamos. Después de esto, nuestra variable g_pGameRules contendrá una referencia a el objeto por lo que podemos llamar funciones del mismo. Como una nota al margen en el Team Fortress Classic (TFC) la función es un poco diferente por lo que la llamé InstallGameRules_tfc. Tenlo en cuenta si estás creando un plugin que debe funcionar en TFC.
Ahora, atrapando una función:
Ejemplo GetNextBestWeapon(CBasePlayer *, CBasePlayerItem *)
PHP Code:
public plugin_init()
{
/* GetNextBestWeapon es el nombre de la funcion. Puedes ver el nombre de la función en configs\orpheu\virtualFunctions\CGameRules
CGameRules es el objeto base y se va a utilizar en cada función del paquete.
OnGetNextBestWeapon is the name of our hook function
*/
OrpheuRegisterHookFromObject(g_pGameRules,"GetNextBestWeapon","CGameRules","OnGetNextBestWeapon")
}
public OnGetNextBestWeapon(gameRules,playerID,weaponID)
{
// El objeto de las reglas del juego (Game rules) siempre es pasado como el primer argumento pero no lo necesitamos ya que ya lo tenemos en g_pGameRules
}
new OrpheuFunction:CanHaveAmmo = OrpheuGetFunctionFromObject(g_pGameRules,"CanHaveAmmo","CGameRules")
// Cuando llamas cualquiera de esas funciones tienes que pasar g_pGameRules siempre como el primer argumento.
new result = OrpheuCall(CanHaveAmmo,g_pGameRules,id,"ammo_buckshot",30)
Luego de instalar el paquete las funciones estarán en "configs\orpheu\virtualFunctions\CGameRul es". Chequea esa carpeta y cada archivo para saber los argumentos para cada función y en que mod funcionan.
Como última nota joaquim nos dice que esto fue un trabajo extenso así que piensa que tuvo más de un error. Dice que le contemos si una función no funciona contándole el nombre, el mod y el sistema operativo en la que fue probada.