SA-MP (San Andreas Multiplayer) Software Development Kit (SDK), geliştiricilerin SA-MP sunucusu için eklentiler oluşturmasına olanak tanıyan kapsamlı bir C dosyaları ve header'lar koleksiyonudur. Bu SDK, geliştiricilerin Pawn scriptinde mevcut olanın ötesinde özellikler uygulamasına olanak tanıyan native fonksiyonlar aracılığıyla SA-MP sunucusunun işlevselliğini genişletmek için bir temel sağlar.
- Português: README
- Deutsch: README
- English: README
- Español: README
- Français: README
- Italiano: README
- Polski: README
- Русский: README
- Svenska: README
- SA-MP SDK
AMX (Abstract Machine eXecutor), SA-MP'de Pawn scriptlerini çalıştıran sanal makinedir. SDK, çeşitli C ve header dosyaları aracılığıyla AMX ile etkileşim için kapsamlı destek sağlar:
-
amx.h
Tüm AMX ile ilgili işlevselliği birleştiren ana header dosyası. Şunları içerir:
- Script yürütme için temel AMX fonksiyonları
- Bellek yönetimi
- Native fonksiyon kaydı
- String işleme
- UTF-8 desteği
Temel fonksiyonlar:
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
AMX sisteminde kullanılan temel veri tiplerini tanımlar:
#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
AMX işlemi için gerekli yapıları içerir:
typedef struct tagAMX { unsigned char _FAR *base; // Temel adres unsigned char _FAR *data; // Veri segmenti AMX_CALLBACK callback; // Callback fonksiyonu AMX_DEBUG debug; // Debug callback cell cip; // Kod talimat işaretçisi cell frm; // Stack frame tabanı cell hea; // Heap tabanı cell stk; // Stack işaretçisi // ... ek alanlar } AMX;
SDK, çeşitli header'lar aracılığıyla sağlam platform-spesifik işleme içerir:
-
amx_platform.h
Platform algılama ve yapılandırma sağlar:
#if (defined __linux || defined __linux__) && !defined __LINUX__ #define __LINUX__ #endif #if defined FREEBSD && !defined __FreeBSD__ #define __FreeBSD__ #endif
-
osdefs.h
İşletim sistemine özgü tanımlamaları yönetir:
#if defined(__WATCOMC__) #if defined(__WINDOWS__) || defined(__NT__) #define _Windows 1 #endif #ifdef __386__ #define __32BIT__ 1 #endif #endif
Temel eklenti arayüzünü ve destek yapılarını tanımlar:
#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
};
amxplugin.c
dosyası, AMX fonksiyonlarının platform-spesifik uygulamalarını sağlayan SA-MP SDK'nın kritik bir bileşenidir. Platform ve derleyiciye bağlı olarak iki farklı yaklaşım uygular:
-
Windows MSVC Uygulaması (32-bit)
- Doğrudan fonksiyon tablosu erişimi için assembly ile çıplak fonksiyonlar kullanır
- AMX fonksiyonlarına doğrudan atlamalarla optimize edilmiş performans sağlar
- Örnek yapı:
#define NUDE __declspec(naked) #define AMX_JUMP_HELPER(index) { _asm { mov eax, pAMXFunctions } _asm { jmp dword ptr[eax + index * 4] } }
-
Çapraz Platform Uygulaması
- Platform bağımsızlığı için fonksiyon işaretçileri kullanır
- Fonksiyon tanımlamaları için makro tabanlı bir sistem uygular
- Örnek yapı:
#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__); \ }
Temel Özellikler:
-
Fonksiyon Tablosu Yönetimi
- AMX fonksiyon tablosunu saklamak için statik bir
pAMXFunctions
işaretçisi kullanır - Tüm temel AMX fonksiyonlarına erişim sağlar
- Çalışma zamanında fonksiyon çözümlemeyi yönetir
- AMX fonksiyon tablosunu saklamak için statik bir
-
Platform-Spesifik Optimizasyonlar
- Windows 32-bit: Doğrudan assembly uygulaması için çıplak fonksiyonlar kullanır
- Diğer platformlar: Fonksiyon işaretçisi yönlendirmesi kullanır
- 64-bit sistemler için özel işleme
-
Uygulanan Fonksiyon Kategorileri
a. Bellek Yönetimi Fonksiyonları:
amx_Align16
,amx_Align32
,amx_Align64
amx_Allot
,amx_Release
b. Yürütme Fonksiyonları:
amx_Exec
,amx_Callback
amx_Init
,amx_InitJIT
amx_Cleanup
,amx_Clone
c. Sembol Yönetimi:
amx_FindPublic
,amx_FindPubVar
amx_FindNative
,amx_FindTagId
amx_GetPublic
,amx_GetPubVar
d. String İşleme:
amx_GetString
,amx_SetString
amx_StrLen
- UTF-8 destek fonksiyonları
e. Hata Ayıklama ve Bilgi:
amx_SetDebugHook
amx_Flags
,amx_MemInfo
amx_NameLength
-
Koşullu Derleme
- Önişlemci yönergeleri aracılığıyla farklı platformları yönetir
- 64-bit sistemler için özel işleme
- İsteğe bağlı JIT desteği
#if defined _I64_MAX || defined HAVE_I64 DEFINE_AMX_NAKED_FN(uint64_t* AMXAPI amx_Align64(uint64_t* v), PLUGIN_AMX_EXPORT_Align64) #endif
-
Hata Yönetimi Entegrasyonu
- Hata raporlama için
amx_RaiseError
uygular - Fonksiyon çağrıları arasında hata kodlarını korur
- AMX hata ayıklama sistemi ile entegre olur
- Hata raporlama için
SDK, native fonksiyonlar oluşturmak ve yönetmek için kapsamlı destek sağlar:
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;
Temel native fonksiyon işlemleri:
amx_Register
üzerinden kayıt- Parametre erişimi ve doğrulama
- Dönüş değeri işleme
- Hata raporlama
SDK kapsamlı bellek yönetimi olanakları sağlar:
-
amx_memory.h
Bellek tahsisi ve platforma özgü bellek işlemlerini yönetir:
#if defined HAVE_ALLOCA_H #include <alloca.h> #elif defined __BORLANDC__ #include <malloc.h> #endif
-
amx_alignment.h
Bellek hizalama gereksinimlerini yönetir:
#if (defined SN_TARGET_PS2 || defined __GNUC__) && !defined AMX_NO_ALIGN #define AMX_NO_ALIGN #endif
SDK bellek manipülasyonu için çeşitli fonksiyonlar içerir:
-
Bellek Tahsisi
int AMXAPI amx_Allot(AMX* amx, int cells, cell* amx_addr, cell** phys_addr);
- AMX heap'inde bellek tahsis eder
- Hem AMX hem de fiziksel adresleri döndürür
- Hizalama gereksinimlerini yönetir
-
Bellek Erişimi
int AMXAPI amx_GetAddr(AMX* amx, cell amx_addr, cell** phys_addr);
- AMX adreslerini fiziksel adreslere dönüştürür
- Bellek erişimini doğrular
- Bellek sınırlarını yönetir
-
Bellek Bilgisi
int AMXAPI amx_MemInfo(AMX* amx, long* codesize, long* datasize, long* stackheap);
- Bellek düzeni bilgisini alır
- Segment boyutlarını raporlar
- Hata ayıklama ve optimizasyon için faydalıdır
SDK, amx_constants.h
içinde kapsamlı bir hata yönetim sistemi içerir:
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,
};
SDK, çeşitli makrolar ve fonksiyonlar aracılığıyla güçlü string işleme yetenekleri sağlar:
#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)
-
String Uzunluğu
int AMXAPI amx_StrLen(const cell* cstring, int* length);
- String uzunluğunu hesaplar
- Paketlenmiş ve paketlenmemiş stringleri yönetir
- Karakter cinsinden uzunluğu döndürür
-
String Dönüşümü
int AMXAPI amx_SetString(cell* dest, const char* source, int pack, int use_wchar, size_t size);
- C stringlerini AMX stringlerine dönüştürür
- Paketlenmiş ve paketlenmemiş formatları destekler
- Unicode dönüşümünü yönetir
SDK, UTF-8 işleme fonksiyonları aracılığıyla kapsamlı Unicode desteği içerir:
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);
-
UTF-8 Doğrulama
int AMXAPI amx_UTF8Check(const char* string, int* length);
- UTF-8 kodlu stringleri doğrular
- Karakter cinsinden string uzunluğunu raporlar
- Kodlama hatalarını tespit eder
-
Karakter Dönüşümü
int AMXAPI amx_UTF8Get(const char* string, const char** endptr, cell* value);
- Unicode karakterleri çıkarır
- Çok baytlı dizileri yönetir
- Ayrıştırma hatalarını raporlar
SDK, şunlar aracılığıyla çapraz platform uyumluluğunu sağlar:
-
Endianness Yönetimi
#ifndef BYTE_ORDER #if defined(UCLINUX) #define BYTE_ORDER BIG_ENDIAN #else #define BYTE_ORDER LITTLE_ENDIAN #endif #endif
-
Yol Yönetimi
#if defined(__MSDOS__) || defined(__WIN32__) || defined(_Windows) #define DIRSEP_CHAR '\\' #elif defined(macintosh) #define DIRSEP_CHAR ':' #else #define DIRSEP_CHAR '/' #endif
SDK birden çok platformu ve derleyiciyi destekler:
- Windows (MSVC, MinGW)
- Linux (GCC)
- FreeBSD
- OpenBSD
- macOS
-
Microsoft Visual C++
- Pragma yönetimi
- Uyarı bastırma
- Çağrı kuralları
-
GCC
- Tanı kontrolleri
- Özellik tanımlamaları
- Platform-spesifik optimizasyonlar
-
Clang
- Uyarı yapılandırmaları
- Çapraz platform uyumluluğu
- Modern C++ özellikleri
SA-MP SDK'yı kullanırken aşağıdaki en iyi uygulamaları göz önünde bulundurun:
-
Bellek Yönetimi
- Her zaman tahsis edilen kaynakları temizleyin
- Uygun bellek hizalaması kullanın
- Bellek hatalarını düzgün şekilde yönetin
- Heap kullanımını izleyin
- Uygun bellek sınırları kontrolü uygulayın
- Sık tahsisler için bellek havuzları kullanın
- Kaynakları tahsis sırasının tersine temizleyin
-
Hata Yönetimi
- AMX fonksiyonlarından dönüş değerlerini kontrol edin
- Native fonksiyonlarda uygun hata yönetimi uygulayın
- Sağlanan hata sabitlerini kullanın
- Hataları uygun şekilde günlüğe kaydedin
- Hata kurtarma mekanizmaları uygulayın
- Anlamlı hata mesajları sağlayın
- Sisteme özgü hataları yönetin
-
Çapraz Platform Geliştirme
- Platform-bağımsız tipler kullanın
- Platform-spesifik kod için sağlanan makroları kullanın
- Birden çok platformda test edin
- Endianness farklılıklarını yönetin
- Uygun yol ayırıcıları kullanın
- Dosya sistemi farklılıklarını dikkate alın
- Platform-spesifik optimizasyonlar uygulayın
-
Performans Düşünceleri
- Uygun hücre boyutları kullanın
- Verimli string işleme uygulayın
- Native fonksiyon çağrılarını optimize edin
- Bellek tahsislerini minimize edin
- Uygun veri yapıları kullanın
- Uygun yerlerde önbelleğe alma uygulayın
- Kritik kod yollarını profilleyin
amxplugin.c
işlevselliğiyle çalışırken:
-
Platform-Spesifik Geliştirme
- Fonksiyon uygulamalarında platform farklılıklarını dikkate alın
- Hem 32-bit hem de 64-bit sistemlerde test edin
- Platform-spesifik hizalama gereksinimlerini yönetin
- Kullanmadan önce fonksiyon tablosu işaretçisini doğrulayın
- Her platform için uygun hata kontrolü uygulayın
- Farklı uygulamaların performans etkilerini dikkate alın
-
Fonksiyon Tablosu Yönetimi
- Kullanmadan önce fonksiyon tablosunu başlatın
- Fonksiyon kullanılabilirliğini doğrulayın
- Eksik fonksiyonları düzgün şekilde yönetin
- Uygun temizleme prosedürleri uygulayın
- Sık kullanılan fonksiyon işaretçilerini önbelleğe alın
- Fonksiyon tablosu bütünlüğünü doğrulayın
-
Hata Yönetimi
- Platform-spesifik kod için uygun hata kontrolü uygulayın
- Hizalama hatalarını uygun şekilde yönetin
- Fonksiyon tablosu girişlerini doğrulayın
- Anlamlı hata mesajları sağlayın
- Kurtarma mekanizmaları uygulayın
- Platform-spesifik hataları günlüğe kaydedin
typedef struct tagAMX_HEADER {
int32_t size; // "Dosya" boyutu
uint16_t magic; // İmza
char file_version; // Dosya format versiyonu
char amx_version; // Gerekli AMX versiyonu
int16_t flags; // Bayraklar
int16_t defsize; // Tanımlama kaydı boyutu
int32_t cod; // COD'un başlangıç değeri - kod bloğu
int32_t dat; // DAT'ın başlangıç değeri - veri bloğu
int32_t hea; // HEA'nın başlangıç değeri - heap başlangıcı
int32_t stp; // STP'nin başlangıç değeri - stack üstü
int32_t cip; // CIP'in başlangıç değeri - kod talimat işaretçisi
int32_t publics; // Public fonksiyonlara offset
int32_t natives; // Native fonksiyon tablosuna offset
int32_t libraries; // Kütüphanelere offset
int32_t pubvars; // Public değişkenlere offset
int32_t tags; // Etiketlere offset
int32_t nametable; // İsim tablosuna offset
} AMX_HEADER;
Bu yapı, AMX dosya formatını ve sanal makinenin scriptleri nasıl yüklediğini ve çalıştırdığını anlamak için çok önemlidir.
SDK, Anında Derleme için destek içerir:
int AMXAPI amx_InitJIT(AMX* amx, void* reloc_table, void* native_code);
Hata ayıklama desteği şunlar aracılığıyla sağlanır:
typedef int (AMXAPI *AMX_DEBUG)(struct tagAMX *amx);
int AMXAPI amx_SetDebugHook(AMX* amx, AMX_DEBUG debug);
SDK, public fonksiyonlarla çalışmak için kapsamlı destek sağlar:
-
Public Fonksiyonları Bulma
int AMXAPI amx_FindPublic(AMX* amx, const char* funcname, int* index);
- İsme göre public fonksiyonları bulur
- Fonksiyon indeksini döndürür
- Fonksiyon varlığını doğrular
-
Public Fonksiyonları Çalıştırma
int AMXAPI amx_Exec(AMX* amx, cell* retval, int index);
- Public fonksiyonları çalıştırır
- Dönüş değerlerini yönetir
- Çalıştırma bağlamını yönetir
SDK, uyumluluk kontrolü için versiyon sabitleri içerir:
#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
SDK, uyumluluğu şunlar aracılığıyla sürdürür:
- Dosya sürümü kontrolü
- AMX sürüm doğrulaması
- JIT uyumluluk doğrulaması
- Özellik algılama
- Platforma özgü sürüm yönetimi