El SA-MP (San Andreas Multiplayer) Software Development Kit (SDK) es una colección integral de archivos C y headers que permiten a los desarrolladores crear plugins para el servidor SA-MP. Este SDK proporciona una base para extender la funcionalidad del servidor SA-MP a través de funciones nativas, permitiendo a los desarrolladores implementar características más allá de lo disponible en el script Pawn.
- Português: README
- Deutsch: README
- English: README
- Français: README
- Italiano: README
- Polski: README
- Русский: README
- Svenska: README
- Türkçe: README
- samp-sdk
El AMX (Abstract Machine eXecutor) es la máquina virtual que ejecuta scripts Pawn en SA-MP. El SDK proporciona soporte extenso para interactuar con AMX a través de varios archivos C y headers:
-
amx.h
El archivo header principal que consolida toda la funcionalidad relacionada con AMX. Incluye:
- Funciones principales de AMX para ejecución de scripts
- Gestión de memoria
- Registro de funciones nativas
- Manejo de strings
- Soporte UTF-8
Funciones principales incluyen:
int AMXAPI amx_Init(AMX* amx, void* program); int AMXAPI amx_Exec(AMX* amx, cell* retval, int index); int AMXAPI amx_Register(AMX* amx, const AMX_NATIVE_INFO* nativelist, int number);
-
amx_cell.h
Define los tipos de datos fundamentales utilizados en el sistema AMX:
#if PAWN_CELL_SIZE==32 typedef uint32_t ucell; typedef int32_t cell; #elif PAWN_CELL_SIZE==64 typedef uint64_t ucell; typedef int64_t cell; #endif
-
amx_structures.h
Contiene estructuras esenciales para la operación de AMX:
typedef struct tagAMX { unsigned char _FAR *base; // Dirección base unsigned char _FAR *data; // Segmento de datos AMX_CALLBACK callback; // Función de callback AMX_DEBUG debug; // Callback de depuración cell cip; // Puntero de instrucción de código cell frm; // Base del marco de pila cell hea; // Base del heap cell stk; // Puntero de pila // ... campos adicionales } AMX;
El SDK incluye manejo robusto específico de plataforma a través de varios headers:
-
amx_platform.h
Proporciona detección y configuración de plataforma:
#if (defined __linux || defined __linux__) && !defined __LINUX__ #define __LINUX__ #endif #if defined FREEBSD && !defined __FreeBSD__ #define __FreeBSD__ #endif
-
osdefs.h
Maneja definiciones específicas del sistema operativo:
#if defined(__WATCOMC__) #if defined(__WINDOWS__) || defined(__NT__) #define _Windows 1 #endif #ifdef __386__ #define __32BIT__ 1 #endif #endif
Define la interfaz principal del plugin y las estructuras de soporte:
#define SAMP_PLUGIN_VERSION 0x0200
enum SUPPORTS_FLAGS {
SUPPORTS_VERSION = SAMP_PLUGIN_VERSION,
SUPPORTS_VERSION_MASK = 0xffff,
SUPPORTS_AMX_NATIVES = 0x10000
};
enum PLUGIN_DATA_TYPE {
PLUGIN_DATA_LOGPRINTF = 0x00,
PLUGIN_DATA_AMX_EXPORTS = 0x10,
PLUGIN_DATA_CALLPUBLIC_FS = 0x11,
PLUGIN_DATA_CALLPUBLIC_GM = 0x12
};
El archivo amxplugin.c
es un componente crucial del SA-MP SDK que proporciona implementaciones específicas de plataforma para funciones AMX. Implementa dos enfoques diferentes según la plataforma y el compilador:
-
Implementación Windows MSVC (32-bit)
- Usa funciones naked con ensamblador para acceso directo a la tabla de funciones
- Proporciona rendimiento optimizado a través de saltos directos a funciones AMX
- Estructura de ejemplo:
#define NUDE __declspec(naked) #define AMX_JUMP_HELPER(index) { _asm { mov eax, pAMXFunctions } _asm { jmp dword ptr[eax + index * 4] } }
-
Implementación Multiplataforma
- Usa punteros a funciones para independencia de plataforma
- Implementa un sistema basado en macros para definiciones de funciones
- Estructura de ejemplo:
#define DEFINE_AMX_FN_TYPE(name, ret_type, ...) \ typedef ret_type AMXAPI (*name##_t)(__VA_ARGS__); \ ret_type AMXAPI name(__VA_ARGS__) { \ name##_t fn = ((name##_t*)pAMXFunctions)[PLUGIN_AMX_EXPORT_##name]; \ return fn(__VA_ARGS__); \ }
Características Principales:
-
Gestión de Tabla de Funciones
- Usa un puntero estático
pAMXFunctions
para almacenar la tabla de funciones AMX - Proporciona acceso a todas las funciones principales de AMX
- Maneja la resolución de funciones en tiempo de ejecución
- Usa un puntero estático
-
Optimizaciones Específicas de Plataforma
- Windows 32-bit: Usa funciones naked para implementación directa en ensamblador
- Otras plataformas: Usa indirección de punteros a funciones
- Manejo especial para sistemas de 64 bits
-
Categorías de Funciones Implementadas
a. Funciones de Gestión de Memoria:
amx_Align16
,amx_Align32
,amx_Align64
amx_Allot
,amx_Release
b. Funciones de Ejecución:
amx_Exec
,amx_Callback
amx_Init
,amx_InitJIT
amx_Cleanup
,amx_Clone
c. Gestión de Símbolos:
amx_FindPublic
,amx_FindPubVar
amx_FindNative
,amx_FindTagId
amx_GetPublic
,amx_GetPubVar
d. Manejo de Strings:
amx_GetString
,amx_SetString
amx_StrLen
- Funciones de soporte UTF-8
e. Depuración e Información:
amx_SetDebugHook
amx_Flags
,amx_MemInfo
amx_NameLength
-
Compilación Condicional
- Maneja diferentes plataformas a través de directivas de preprocesador
- Manejo especial para sistemas de 64 bits
- Soporte JIT opcional
#if defined _I64_MAX || defined HAVE_I64 DEFINE_AMX_NAKED_FN(uint64_t* AMXAPI amx_Align64(uint64_t* v), PLUGIN_AMX_EXPORT_Align64) #endif
-
Integración de Manejo de Errores
- Implementa
amx_RaiseError
para reportar errores - Preserva códigos de error a través de llamadas a funciones
- Se integra con el sistema de depuración AMX
- Implementa
El SDK proporciona soporte integral para crear y gestionar funciones nativas:
typedef cell (AMX_NATIVE_CALL *AMX_NATIVE)(struct tagAMX *amx, const cell *params);
typedef struct tagAMX_NATIVE_INFO {
const char _FAR *name;
AMX_NATIVE func;
} AMX_NATIVE_INFO;
Operaciones principales de funciones nativas:
- Registro a través de
amx_Register
- Acceso y validación de parámetros
- Manejo de valores de retorno
- Reporte de errores
El SDK proporciona instalaciones completas de gestión de memoria:
-
amx_memory.h
Maneja la asignación de memoria y operaciones de memoria específicas de plataforma:
#if defined HAVE_ALLOCA_H #include <alloca.h> #elif defined __BORLANDC__ #include <malloc.h> #endif
-
amx_alignment.h
Gestiona requisitos de alineación de memoria:
#if (defined SN_TARGET_PS2 || defined __GNUC__) && !defined AMX_NO_ALIGN #define AMX_NO_ALIGN #endif
El SDK incluye varias funciones para manipulación de memoria:
-
Asignación de Memoria
int AMXAPI amx_Allot(AMX* amx, int cells, cell* amx_addr, cell** phys_addr);
- Asigna memoria en el heap AMX
- Devuelve direcciones AMX y físicas
- Maneja requisitos de alineación
-
Acceso a Memoria
int AMXAPI amx_GetAddr(AMX* amx, cell amx_addr, cell** phys_addr);
- Convierte direcciones AMX a direcciones físicas
- Valida acceso a memoria
- Maneja límites de memoria
-
Información de Memoria
int AMXAPI amx_MemInfo(AMX* amx, long* codesize, long* datasize, long* stackheap);
- Recupera información del diseño de memoria
- Reporta tamaños de segmentos
- Útil para depuración y optimización
El SDK incluye un sistema integral de manejo de errores definido en amx_constants.h
:
enum {
AMX_ERR_NONE,
AMX_ERR_EXIT,
AMX_ERR_ASSERT,
AMX_ERR_STACKERR,
AMX_ERR_BOUNDS,
AMX_ERR_MEMACCESS,
AMX_ERR_INVINSTR,
AMX_ERR_STACKLOW,
AMX_ERR_HEAPLOW,
AMX_ERR_CALLBACK,
AMX_ERR_NATIVE,
AMX_ERR_DIVIDE,
AMX_ERR_SLEEP,
AMX_ERR_INVSTATE,
AMX_ERR_MEMORY = 16,
AMX_ERR_FORMAT,
AMX_ERR_VERSION,
AMX_ERR_NOTFOUND,
AMX_ERR_INDEX,
AMX_ERR_DEBUG,
AMX_ERR_INIT,
AMX_ERR_USERDATA,
AMX_ERR_INIT_JIT,
AMX_ERR_PARAMS,
AMX_ERR_DOMAIN,
AMX_ERR_GENERAL,
};
El SDK proporciona capacidades robustas de manejo de strings a través de varios macros y funciones:
#define amx_StrParam(amx,param,result) \
do { \
int result##_length_; \
amx_StrLen(amx_Address(amx,param),&result##_length_); \
if (result##_length_>0 && \
((result)=(type)alloca((result##_length_+1)*sizeof(*(result))))!=NULL) \
amx_GetString((char*)(result),amx_Address(amx,param), \
sizeof(*(result))>1,result##_length_+1); \
else (result)=NULL; \
} while(0)
-
Longitud de String
int AMXAPI amx_StrLen(const cell* cstring, int* length);
- Calcula la longitud del string
- Maneja strings empaquetados y no empaquetados
- Devuelve la longitud en caracteres
-
Conversión de Strings
int AMXAPI amx_SetString(cell* dest, const char* source, int pack, int use_wchar, size_t size);
- Convierte strings C a strings AMX
- Soporta formatos empaquetados y no empaquetados
- Maneja conversión Unicode
El SDK incluye soporte integral para Unicode a través de funciones de manejo UTF-8:
int AMXAPI amx_UTF8Check(const char* string, int* length);
int AMXAPI amx_UTF8Get(const char* string, const char** endptr, cell* value);
int AMXAPI amx_UTF8Len(const cell* cstr, int* length);
int AMXAPI amx_UTF8Put(char* string, char** endptr, int maxchars, cell value);
-
Validación UTF-8
int AMXAPI amx_UTF8Check(const char* string, int* length);
- Valida strings codificados en UTF-8
- Reporta longitud del string en caracteres
- Detecta errores de codificación
-
Conversión de Caracteres
int AMXAPI amx_UTF8Get(const char* string, const char** endptr, cell* value);
- Extrae caracteres Unicode
- Maneja secuencias multi-byte
- Reporta errores de análisis
El SDK asegura compatibilidad multiplataforma a través de:
-
Manejo de Endianness
#ifndef BYTE_ORDER #if defined(UCLINUX) #define BYTE_ORDER BIG_ENDIAN #else #define BYTE_ORDER LITTLE_ENDIAN #endif #endif
-
Manejo de Rutas
#if defined(__MSDOS__) || defined(__WIN32__) || defined(_Windows) #define DIRSEP_CHAR '\\' #elif defined(macintosh) #define DIRSEP_CHAR ':' #else #define DIRSEP_CHAR '/' #endif
El SDK soporta múltiples plataformas y compiladores:
- Windows (MSVC, MinGW)
- Linux (GCC)
- FreeBSD
- OpenBSD
- macOS
-
Microsoft Visual C++
- Manejo de pragmas
- Supresión de advertencias
- Convenciones de llamada
-
GCC
- Controles de diagnóstico
- Especificaciones de atributos
- Optimizaciones específicas de plataforma
-
Clang
- Configuraciones de advertencias
- Compatibilidad multiplataforma
- Características modernas de C++
Al usar el SA-MP SDK, considere las siguientes mejores prácticas:
-
Gestión de Memoria
- Siempre limpie los recursos asignados
- Use alineación de memoria apropiada
- Maneje errores de memoria con elegancia
- Monitoree el uso del heap
- Implemente verificación apropiada de límites de memoria
- Use pools de memoria para asignaciones frecuentes
- Limpie recursos en orden inverso a la asignación
-
Manejo de Errores
- Verifique valores de retorno de funciones AMX
- Implemente manejo apropiado de errores en funciones nativas
- Use las constantes de error proporcionadas
- Registre errores apropiadamente
- Implemente mecanismos de recuperación de errores
- Proporcione mensajes de error significativos
- Maneje errores específicos del sistema
-
Desarrollo Multiplataforma
- Use tipos independientes de plataforma
- Utilice macros proporcionados para código específico de plataforma
- Pruebe en múltiples plataformas
- Maneje diferencias de endianness
- Use separadores de ruta apropiados
- Considere diferencias del sistema de archivos
- Implemente optimizaciones específicas de plataforma
-
Consideraciones de Rendimiento
- Use tamaños de cell apropiados
- Implemente manejo eficiente de strings
- Optimice llamadas a funciones nativas
- Minimice asignaciones de memoria
- Use estructuras de datos apropiadas
- Implemente caché donde sea apropiado
- Perfile rutas críticas de código
Cuando trabaje con la funcionalidad de amxplugin.c
:
-
Desarrollo Específico de Plataforma
- Considere diferencias de plataforma en implementaciones de funciones
- Pruebe en sistemas de 32 bits y 64 bits
- Maneje requisitos de alineación específicos de plataforma
- Valide el puntero de tabla de funciones antes de usar
- Implemente verificación de errores apropiada para cada plataforma
- Considere implicaciones de rendimiento de diferentes implementaciones
-
Gestión de Tabla de Funciones
- Inicialice la tabla de funciones antes de usar
- Verifique disponibilidad de funciones
- Maneje funciones faltantes con elegancia
- Implemente procedimientos apropiados de limpieza
- Cache punteros de funciones frecuentemente usados
- Valide integridad de la tabla de funciones
-
Manejo de Errores
- Implemente verificación apropiada de errores para código específico de plataforma
- Maneje errores de alineación apropiadamente
- Valide entradas de tabla de funciones
- Proporcione mensajes de error significativos
- Implemente mecanismos de recuperación
- Registre errores específicos de plataforma
typedef struct tagAMX_HEADER {
int32_t size; // Tamaño del "archivo"
uint16_t magic; // Firma
char file_version; // Versión del formato de archivo
char amx_version; // Versión AMX requerida
int16_t flags; // Banderas
int16_t defsize; // Tamaño de un registro de definición
int32_t cod; // Valor inicial de COD - bloque de código
int32_t dat; // Valor inicial de DAT - bloque de datos
int32_t hea; // Valor inicial de HEA - inicio del heap
int32_t stp; // Valor inicial de STP - tope de pila
int32_t cip; // Valor inicial de CIP - puntero de instrucción de código
int32_t publics; // Desplazamiento a funciones públicas
int32_t natives; // Desplazamiento a tabla de funciones nativas
int32_t libraries; // Desplazamiento a bibliotecas
int32_t pubvars; // Desplazamiento a variables públicas
int32_t tags; // Desplazamiento a tags
int32_t nametable; // Desplazamiento a tabla de nombres
} AMX_HEADER;
Esta estructura es crucial para entender el formato de archivo AMX y cómo la máquina virtual carga y ejecuta scripts.
El SDK incluye soporte para compilación Just-In-Time:
int AMXAPI amx_InitJIT(AMX* amx, void* reloc_table, void* native_code);
El soporte de depuración se proporciona a través de:
typedef int (AMXAPI *AMX_DEBUG)(struct tagAMX *amx);
int AMXAPI amx_SetDebugHook(AMX* amx, AMX_DEBUG debug);
El SDK proporciona soporte integral para trabajar con funciones públicas:
-
Búsqueda de Funciones Públicas
int AMXAPI amx_FindPublic(AMX* amx, const char* funcname, int* index);
- Localiza funciones públicas por nombre
- Devuelve índice de función
- Valida existencia de función
-
Ejecución de Funciones Públicas
int AMXAPI amx_Exec(AMX* amx, cell* retval, int index);
- Ejecuta funciones públicas
- Maneja valores de retorno
- Gestiona contexto de ejecución
El SDK incluye constantes de versión para verificación de compatibilidad:
#define CUR_FILE_VERSION 9
#define MIN_FILE_VERSION 6
#define MIN_AMX_VERSION 10
#define MAX_FILE_VER_JIT 8
#define MIN_AMX_VER_JIT 8
El SDK mantiene compatibilidad a través de:
- Verificación de versión de archivo
- Validación de versión AMX
- Verificación de compatibilidad JIT
- Detección de características
- Manejo de versión específico de plataforma
Copyright © SA-MP Programming Community
Este software está licenciado bajo los términos de la Licencia MIT ("Licencia"); puede utilizar este software de acuerdo con las condiciones de la Licencia. Puede obtener una copia de la Licencia en: MIT License
La presente licencia otorga, gratuitamente, a cualquier persona que obtenga una copia de este software y archivos de documentación asociados, los siguientes derechos:
- Usar, copiar, modificar, fusionar, publicar, distribuir, sublicenciar y/o vender copias del software sin restricciones
- Permitir que las personas a las que se les proporciona el software hagan lo mismo, sujeto a las siguientes condiciones
Todas las copias o partes sustanciales del software deben incluir:
- El aviso de derechos de autor anterior
- Este aviso de permiso
- El aviso de exención de responsabilidad a continuación
El software y toda la documentación asociada están protegidos por leyes de derechos de autor. La SA-MP Programming Community mantiene la titularidad de los derechos de autor originales del software.
EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, INCLUYENDO PERO NO LIMITADO A LAS GARANTÍAS DE COMERCIABILIDAD, IDONEIDAD PARA UN PROPÓSITO PARTICULAR Y NO INFRACCIÓN.
EN NINGÚN CASO LOS AUTORES O TITULARES DE LOS DERECHOS DE AUTOR SERÁN RESPONSABLES DE CUALQUIER RECLAMACIÓN, DAÑOS U OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN DE CONTRATO, AGRAVIO O DE OTRO MODO, QUE SURJA DE, FUERA DE O EN CONEXIÓN CON EL SOFTWARE O EL USO U OTROS TRATOS EN EL SOFTWARE.
Para información detallada sobre la Licencia MIT, consulte: https://opensource.org/licenses/MIT