Completando y simplificando la explicacion de
oOFotherOo, este es un metodo utilizado para crear includes y facilitar su uso, para que el include haga el trabajo del scripter por decirlo de alguna forma. Sin este metodo (u otros, ya que no es el unico), lo que deberia hacerse es colocar el callback/funcion dentro de cada codigo.
Para que se entienda mejor un ejemplo.
Supongamos el siguiente include:
pawn Код:
//INCLUDE:
public Health_OnPlayerSpawn(playerid)
{
SetPlayerHealth(playerid, 100.0);
return 1;
}
//mas codigo que no nos interesa
El scripter para hacer uso correcto del include, deberia hacer lo siguiente:
pawn Код:
#include <a_samp>
#include <health>//este es el include descripto arriba
public OnPlayerSpawn(playerid)
{
CallLocalFunction("Health_OnPlayerSpawn", "i", playerid);
//resto del codigo
return 1;
}
Ahora bien, si el include 'health' utilizara ALS o algun otro metodo para hookear callbacks, el uso seria diferente.
pawn Код:
//INCLUDE:
new HEALTH_OPS;//En esta variable almacenaremos un valor indicando si se utiliza el callback OnPlayerConnect
#if defined FILTERSCRIPT
public OnFilterScriptInit()
{
HEALTH_OPS = funcidx("TAG_OnPlayerSpawn");
return 1;
}
#else
public OnGameModeInit()
{
HEALTH_OPS = funcidx("TAG_OnPlayerSpawn");
return 1;
}
public OnPlayerSpawn(playerid)
{
SetPlayerHealth(playerid, 100.0);
if(HEALTH_OPS != -1)
return CallLocalFunction("HEALTH_OnPlayerSpawn", "i", playerid);
return 1;
}
#if defined _ALS_OnPlayerSpawn
#undef OnPlayerSpawn
#else
#define _ALS_OnPlayerSpawn
#endif
#define OnPlayerConnect HEALTH_OnPlayerSpawn
forward public HEALTH_OnPlayerSpawn(playerid);
//mas codigo que no nos interesa
Ahora si el include fuera el anterior, bastaria con incluir el archivo sin necesidad de agregar nada al callback 'OnPlayerSpawn'.
pawn Код:
#include <a_samp>
#include <health>
public OnPlayerSpawn(playerid)
{
//codigo
return 1;
}
Nota: La forma correcta para hockear un callback, no es ninguna de las anteriormente mencionadas ya que ambas tienen errores.
pawn Код:
new TAG_OPC;//En esta variable almacenaremos un valor indicando si se utiliza el callback OnPlayerConnect
//Con el siguiente codigo lo que hacemos es optimizar el script para evitar chequear si se utiliza el callback o no cada vez q se llame a OnPlayerConnect (lo chequeamos solo 1 vez al inicio y listo).
#if defined FILTERSCRIPT
public OnFilterScriptInit()
{
TAG_OPC = funcidx("TAG_OnPlayerConnect");
return 1;
}
#else
public OnGameModeInit()
{
TAG_OPC = funcidx("TAG_OnPlayerConnect");
return 1;
}
#endif
//Este es el callback utilizado por nuestro include
public OnPlayerConnect(playerid)
{
//Codigo del include.
if(TAG_OPC != -1)
return CallLocalFunction("TAG_OnPlayerConnect", "i", playerid);
return 1;
}
#if defined _ALS_OnPlayerConnect
#undef OnPlayerConnect
#else
#define _ALS_OnPlayerConnect
#endif
#define OnPlayerConnect TAG_OnPlayerConnect
forward public TAG_OnPlayerConnect(playerid);