Skip to content

Hooks

Con defineHooks puedes definir algunos hooks, lo que hace que las llamadas posteriores a esa función pasen por tu función definida.

​​El alcance está limitado a tu código ts y no tiene efecto en otros plugins o en pawn nativo.​

Ejemplo Básico

ts
import { defineHooks, Player } from "@infernus/core";

// Desestructura para obtener todos los métodos originales y el método para establecer hooks.
export const [orig_playerMethods, setPlayerHook] = defineHooks(Player);
// Esto demuestra el hooking de la clase Player. La mayoría de las clases de entidad pueden pasarse, como Vehicle, TextDraw...

// El primer parámetro es el nombre del método hookeable, que tendrá sugerencias de tipo TS.
// El valor de retorno es el segundo parámetro que pasaste.
export const my_setPlayerArmour = setPlayerHook(
  "setArmour",
  function (armour: number) {
    // Aquí, `this` se refiere al jugador actual
    const flag = true; // Asume verdadero para este ejemplo
    if (flag) {
      console.log("my hook");
      // Llama al método setArmour original, pero restamos 1 intencionalmente y devolvemos el resultado original
      return orig_playerMethods.setArmour.call(this, armour - 1);
      // Nunca uses directamente this.setArmour(armour), ya que causará un bucle infinito
      // Dentro del cuerpo de la función hook, solo puedes llamar a las funciones originales a través de orig_playerMethods.
    } else {
      return false;
    }
  },
);

/*
setPlayerHook(
  "setArmour",
  function (armour: number) {
    // Solo puedes hookear un método una vez dentro del mismo grupo defineHooks
    // Nunca hookees el mismo método nuevamente.
    // Si necesitas hookear varias veces, usa la función defineHooks múltiples veces y divide archivos o define nombres de variables diferentes.
  },
);
*/

Inyectables

Algunas clases de entidad proporcionan métodos estáticos con prefijo __inject para inyección.

Debido a la naturaleza especial de algunas clases de entidad encapsuladas, no puedes usar defineHooks directamente.

Por ejemplo, AddStaticVehicle(ex), CreateVehicle, DestroyVehicle en la clase Vehicle.

Estas funciones nativas se activan cuando se llama a create o destroy internamente en Vehicle.

ts
import { Vehicle, type LimitsEnum } from "@infernus/core";

export const orig_CreateVehicle = Vehicle.__inject_CreateVehicle;

export function my_CreateVehicle(
  ...args: Parameters<typeof orig_CreateVehicle>
) {
  const id = orig_CreateVehicle(...args);

  if (id > 0 && id < LimitsEnum.MAX_VEHICLES) {
    console.log(`hook: vehicle ${id} created`);
  }

  return id;
}

Vehicle.__inject_CreateVehicle = my_CreateVehicle;