20/05/2011
En el vasto universo del scripting para San Andreas: Multiplayer (SA-MP) y su sucesor espiritual, open.mp, pocas herramientas han tenido un impacto tan profundo y duradero como las librerías creadas por Alex "Y_Less" Cole, comúnmente conocidas como YSI (Y-Less's Scripting Includes). Estas colecciones de código no solo simplifican tareas complejas, sino que también introducen paradigmas de programación más robustos y seguros en el lenguaje PAWN. Hoy, nos sumergiremos en dos de las joyas más brillantes de esta corona: Indirection, un sistema para manejar punteros de función de forma segura, y sscanf, el bisturí de precisión para analizar cadenas de texto que todo scripter debería dominar.

¿Qué es Indirection? El Arte de los Punteros de Función Seguros
Si alguna vez has querido pasar una función como si fuera una variable a otra función, ya sabes lo complicado que puede ser en PAWN. La librería Indirection llega para resolver este problema de una manera elegante y, lo más importante, segura en cuanto a tipos. Olvídate de los métodos antiguos; Indirection proporciona una interfaz común y extensible para trabajar con punteros de función.
Conceptos Básicos de Indirection
La idea central es declarar un parámetro de función con la etiqueta Func:, seguido de una especificación de los tipos de parámetros que la función "callback" espera. Por ejemplo, una función que espera un callback que a su vez recibe dos enteros se declararía así:
MiFuncionQueUsaCallback(Func:callback<ii>) { // ... código ... @.callback(10, 20); }La magia aquí reside en la especificación de tipo <ii>, que le dice al compilador que 'callback' debe ser una función que acepta dos enteros. Si intentas pasar una función que no cumple con esta firma, el compilador te advertirá, evitando errores en tiempo de ejecución. La llamada a la función se realiza con la sintaxis especial @..
Los especificadores de tipo disponibles son muy versátiles:
i- cualquier entero (integer)f- flotantes (floats)a- arrayss- cadenas de texto (strings)v- referencias (variables pasadas con &)x- argumentos variables (varargs,..., debe ser el último)tTag:- variables con una etiqueta específica.
Manejo de Punteros en el Tiempo: Claim y Release
Un desafío común ocurre cuando necesitas que un puntero de función "viva" más allá del ámbito de la función que lo recibió. Un ejemplo clásico es usarlo en un temporizador (SetTimerEx). Si simplemente pasas el puntero, podría volverse inválido cuando la función original termine. Para evitar esto, Indirection introduce dos funciones cruciales: Indirect_Claim(func) y Indirect_Release(func).

Debes "reclamar" (claim) un puntero de función antes de almacenarlo para un uso futuro (en una variable global, un temporizador, etc.). Una vez que la función ha sido llamada y ya no se necesita, debes "liberarla" (release). Esto asegura que la memoria y los recursos asociados al puntero se gestionen correctamente.
FuncionConTemporizador(playerid, Func:func<i>) { Indirect_Claim(func); // Reclamamos la función para uso futuro SetTimerEx("LlamadaFutura", 1000, false, "ii", playerid, _:func); } public LlamadaFutura(playerid, Func:func<i>) { @.func(playerid); // Ejecutamos la función Indirect_Release(func); // La liberamos porque ya no se necesita }Sscanf: El Bisturí para Tus Cadenas de Texto
Si Indirection es la herramienta del arquitecto de sistemas, sscanf es la navaja suiza del scripter de a pie. Es un plugin increíblemente rápido y flexible diseñado para una tarea fundamental: extraer datos estructurados de cadenas de texto. Su uso más común es el procesamiento de comandos, pero sus aplicaciones son casi ilimitadas, desde leer archivos de configuración .ini hasta analizar cualquier formato de texto que se te ocurra.
De lo Básico a lo Imprescindible
Imagina un comando simple: /dararma [id_jugador/nombre] [id_arma] [municion]. Con funciones de cadena básicas, analizar esto sería un engorro. Con sscanf, es trivial:
new targetid, weaponid, ammo; if (sscanf(params, "uii", targetid, weaponid, ammo)) { return SendClientMessage(playerid, 0xFF0000AA, "Uso: /dararma <jugador> <arma> <munición>"); } // El comando se procesó correctamente, las variables están llenas.El primer argumento es la cadena a analizar (params), el segundo es la cadena de formato ("uii"), y los siguientes son las variables donde se almacenarán los datos. sscanf devuelve 0 si tiene éxito, lo que lo hace perfecto para usar en una condición if para manejar errores de entrada del usuario.

Tabla de Especificadores Comunes
La verdadera potencia de sscanf reside en su amplio abanico de especificadores. Aquí tienes una tabla con los más utilizados:
| Especificador | Nombre | Descripción y Ejemplo |
|---|---|---|
i, d | Entero | Un número entero, positivo o negativo. Ej: 42, -100. |
f | Flotante | Un número con decimales. Ej: 3.14, -99.5. |
s[longitud] | Cadena (String) | Una cadena de texto. Siempre especifica la longitud para evitar desbordamientos. Ej: s[128]. |
u | Usuario | Busca un jugador por su ID o nombre. Devuelve la ID del jugador. Ej: Y_Less, 27. |
c | Carácter | Un único carácter. Ej: a. |
h, x | Hexadecimal | Un número en base 16. Ej: FF00AA. |
Llevando Sscanf al Límite: Funcionalidades Avanzadas
Sscanf no se detiene en los tipos básicos. Permite estructuras de datos mucho más complejas:
- Opcionales (Mayúsculas): Si usas un especificador en mayúscula (ej.
Ien vez dei), el parámetro se vuelve opcional. Incluso puedes definir un valor por defecto:I(100). Si el usuario no introduce un valor, la variable tomará el valor 100. - Arrays (
a): Puedes leer una serie de valores directamente en un array. Por ejemplo,a<i>[5]leerá 5 enteros y los guardará en un array. - Enums (
e): Una de las características más potentes. Te permite definir la estructura de un enum directamente en la cadena de formato y llenar una variable de tipo enum con múltiples valores de distintos tipos. Ej:e<ifs[32]>llenará un enum que contenga un entero, un flotante y una cadena de 32 celdas. - Especificadores Personalizados (
k): ¿Quieres que tu comando acepte "Infernus" o "NRG-500" en lugar de solo IDs de vehículos? Conk<vehiculo>puedes definir tu propia lógica de conversión de texto a valor, creando especificadores reutilizables para cualquier cosa que necesites. - Alternativas (
|): Permite definir múltiples patrones válidos para una misma entrada. Ideal para comandos con sub-comandos, como un sistema de tienda:sscanf(params, "'arma'ii|'chaleco'|'vida'", alt, ...). La variablealtte dirá qué alternativa coincidió.
Instalación y Uso Práctico
La instalación de estas librerías es sencilla. Indirection, al ser una librería de include, se instala fácilmente con herramientas como sampctl. Sscanf, por otro lado, es un plugin (.dll o .so) que debe colocarse en la carpeta de plugins de tu servidor SA-MP, o en la carpeta de componentes si usas open.mp. En ambos casos, necesitarás añadir #include <indirection> o #include <sscanf2> en la cabecera de tu script.
Preguntas Frecuentes (FAQ)
- ¿Son estas librerías solo para SA-MP o también funcionan en open.mp?
- Ambas son totalmente compatibles con open.mp. De hecho, sscanf puede funcionar como un componente nativo de open.mp, que es el método recomendado, ofreciendo una integración y rendimiento aún mejores.
- ¿Necesito ser un experto para usar YSI?
- No necesariamente.
sscanfes una herramienta que beneficia a scripters de todos los niveles, desde principiantes que quieren procesar comandos fácilmente hasta expertos que crean sistemas complejos de análisis de texto.Indirectiones de naturaleza más avanzada y está más orientada a desarrolladores de librerías o scripters que trabajan con arquitecturas complejas, pero su documentación la hace accesible para quien esté dispuesto a aprender. - ¿Dónde puedo encontrar el repositorio de Y-Less?
- La mayoría de las librerías de Y-Less, incluyendo sscanf e indirection, están alojadas en GitHub. Puedes encontrarlas buscando "Y-Less" o el nombre específico de la librería en la plataforma. Es el mejor lugar para obtener las últimas versiones y leer la documentación completa.
- ¿Cómo obtengo el índice de la etiqueta de una función en Indirection?
- Esta es una pregunta técnica y específica. Dentro de un manejador personalizado (handler) de Indirection, puedes acceder a una variable global mágica llamada
INDIRECTION_TAG. Esta variable contendrá el índice de la etiqueta de la función que se está manejando. Luego puedes usarIndirect_Tag(id, dest)para obtener la cadena de la etiqueta completa si la necesitas.
En conclusión, tanto Indirection como sscanf son ejemplos estelares de cómo una buena herramienta puede elevar la calidad, robustez y eficiencia del código en PAWN. Dominar sscanf te ahorrará incontables horas de trabajo y te permitirá crear comandos y sistemas de texto mucho más potentes y amigables para el usuario. Adentrarse en Indirection te abrirá las puertas a patrones de diseño más avanzados y a una forma más segura y modular de escribir código. Explorar el ecosistema YSI es, sin duda, una inversión que todo scripter serio de SA-MP y open.mp debería considerar.
Si quieres conocer otros artículos parecidos a YSI: Potencia tu Scripting con Indirection y Sscanf puedes visitar la categoría Juegos.
