#7

Quote:
Originally Posted by the_chaoz
Посмотреть сообщение
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);
Muchas gracias por esta gran explicaciуn, aunque el metodo ALS que yo explique es valido, el ъnico error que cometi fue no retornar el CallLocalFunction pero este metodo hace la misma funciуn que la de usted, coo anteriormente usted mencinу "Existen varias formas de hacer ALS".

pawn Код:
public OnPlayerConnect(playerid)
{
  SendClientMessage(playerid, -1, "Prueba");
  return CallLocalFunction("F_OnPlayerConnect", "i", playerid); // Sirve para llamar la callback definidas por nosotros que en este caso es F_OnPlayerConnect.
}

#if defined _ALS_OnPlayerConnect // Esto sirve para verificar si _ALS_OnPlayerConnect esta definida.
  #undef  OnPlayerConnect // Usamos esto para poder redefinir OnPlayerConnect asi el compilador no lanzara error de redefiniciуn.
#else
#define _ALS_OnPlayerConnect // Definimos el ALS de OnPlayerConnect.
#endif

#define OnPlayerConnect F_OnPlayerConnect // Esto hace que al ejecutar OnPlayerConnect se ejecute la funciуn creada por nosotros que en este caso es OnPlayerConnect.

forward F_OnPlayerConnect(playerid);
Su metodo es tambiйn valido, yo prefiero este metodo porque ahorramos varias lineas de script.

PD: Este metodo lo aprendн de un tutorial de ******.

Un saludo.
Reply


Messages In This Thread
ALS - by Dreyfuz - 06.02.2013, 21:22
Respuesta: ALS - by oOFotherOo - 07.02.2013, 01:21
Respuesta: ALS - by OTACON - 07.02.2013, 06:14
Respuesta: ALS - by TheChaoz - 07.02.2013, 07:23
Respuesta: ALS - by OTACON - 07.02.2013, 07:40
Respuesta: ALS - by TheChaoz - 07.02.2013, 08:22
Respuesta: ALS - by oOFotherOo - 07.02.2013, 15:50
Respuesta: ALS - by TheChaoz - 08.02.2013, 12:27
Respuesta: ALS - by Dreyfuz - 08.02.2013, 21:40
Respuesta: ALS - by OTACON - 09.02.2013, 02:07

Forum Jump:


Users browsing this thread: 3 Guest(s)