Zapadni Balkan SA-MP
PAWN | SKRIPTANJE => SAMP Tutorijali => Topic started by: ivodev54 on November 18, 2025, 01:38:57 PM
-
Uvod
U novijim verzijama kompajlera i biblioteke amx_assembly postoje tri varijante „emit“ operatera: #emit, __emit i @emit. Svaka ima svoje specifičnosti i drugačije ponašanje u PAWN-u.
1. #emit
Ovo je izvorna verzija emit‑operatera u PAWN‑u.
Koristi se za direktno ubacivanje ASM (p‑code) instrukcija tačno na mjestu gdje je pozvan u skripti.
Primjer:
Function()
{
#emit ZERO.pri
#emit RETN
return 1;
}
Karakteristike:
- Točno ono što napišeš tu će biti ubačeno, bez prilagodbe.
- Podržava vrlo malo od standardnih mogućnosti kompajlera.
- Direktive
#if / #else se ignorišu u kontekstu #emit.
- Negativni brojevi se često moraju izražavati u heksadecimalnom formatu.
2. __emit
__emit je naprednija verzija #emit.
Radi na nivou izraza i dobro je integrirana u kompajler.
Primjer i karakteristike:
- Može koristiti potpune izraze:
__emit(CONST.pri (5 * MAX_PLAYERS));
#define#define GetCurrentAddress() __emit(LCTRL 6)
- Automatski bira pravu instrukciju za lokalne ili globalne varijable:
__emit(INC.U var);
- Može ubaciti višestruke instrukcije u jednom izrazu:
new var = __emit(LOAD.S.pri param, ADD.C 5);
3. @emit
@emit služi za run‑time injektiranje instrukcija u PAWN VM — izmjena koda za vrijeme rada servera.
Primjer:
ReturnFive()
{
return 3;
}
public OnCodeInit()
{
new context[AsmContext];
AsmInitPtr(context, _:addressof(ReturnFive<>), 4 * cellbytes);
@emit PROC
@emit CONST.pri 5
@emit RETN
return 1;
}
Kada koristiti:
- Kada želiš da kod bude izmijenjen za vrijeme izvođenja (run‑time), npr. hookiranje ili patchovanje modova.
- Kada __emit ili #emit ne omogućavaju željenu fleksibilnost.
Zaključak
- Koristi #emit za najosnovnije, direktno ubacivanje ASM instrukcija.
- Koristi __emit kada želiš fleksibilniji, compile‑time „inline asm“ stil.
- Koristi @emit kada ti treba run‑time izmjena instrukcija.
-
Zna Ivo ;D