allback-urile sunt, de fapt, parti de cod care sunt "executate" cand o anumita actiune se petrece(OnGameModeInit atunci cand gamemode-ul porneste, OnPlayerConnect cand un jucator se conecteaza, OnPlayerDeath cand un jucator moare si asa mai departe). Callback-urile, de obicei, au deja in nume evenimentul cand se petrec - deci e foarte usor sa iti dai seama ce face un callback doar uitandu-te la numele lui.
public OnPlayerDeath(playerid, killerid, reason)
{
new string[128], sendername[MAX_PLAYER_NAME];
GetPlayerName(killerid, sendername, sizeof(sendername));
format(string, sizeof(string), "Ai fost omorat de catre {DC0C0C}%s{FFFFFF}!", sendername);
SendClientMessage(playerid, 0xFFFFFFFF, string);
return 1;
}
Exemplul de mai sus prezinta un simplu cod care este executat atunci cand jucatorul moare, si ii trimite un mesaj care ii spune cine l-a omorat.
Cu putin efort, in script iti poti face propriul callback, ori pentru a "comprima" multele functii pe care le folosesti, ori pentru a face ceva atunci cand vrei tu.
Desigur, pentru a face un callback mai intai trebuie sa arati scriptului ce vrei sa faci, asa ca folosim functia forward pentru a defini callback-ul tau. Desigur, callback-ul poate avea mai multi parametri.
Functia forward se pune la inceputul scriptului.
forward Callback(playerid, toplayerid, money);
Vreau sa definesc un callback care se va executa la comanda /pay, pentru a afla suma, jucatorul care plateste si jucatorul care primeste banii, deci callback-ul va avea 2 membri care interactioneaza.
Acum, sa va explic functia de mai sus pe parti:
forward - Functia care defineste callback-ul.
playerid - Ca sa stiu pe cine sa imi execut functiile din interiorul callback-ului, folosesc playerid.
toplayerid - Pentru ca voi avea 2 jucatori care interactioneaza intre ei, folosesc toplayerid pentru a sti cine primeste banii.
money - Banii pe care ii primeste toplayerid/pe care ii plateste playerid.
Acum, ca am definit callback-ul, trebuie sa il si creez. Pentru asta, urmam structura clasica:
public Callback(playerid, toplayerid, money)
{
return 1;
}
Pentru ca callback-ul este gol, este clar ca nu se va intampla nimic, asa ca am sa creez un mesaj atunci cand toplayerid primeste banii.
public Callback(playerid, toplayerid, money)
{
new string[128], sendername[MAX_PLAYER_NAME], sendername1[MAX_PLAYER_NAME];
GetPlayerName(playerid, sendername, sizeof(sendername)); // Verific numele jucatorului care da banii
GetPlayerName(toplayerid, sendername1, sizeof(sendername1)); // Verific numele jucatorului care primeste banii
format(string, sizeof(string), "Ai primit $%d de la %s!", money, sendername);
SendClientMessage(toplayerid, 0xFFFFFFFF, string);
format(string, sizeof(string), "I-ai dat $%d lui %s!", money, sendername1);
SendClientMessage(playerid, 0xFFFFFFFF, string);
}
Acum, mai ramane sa ii arat scriptului cand va fi executat acest callback. Asa ca il execut de fiecare data cand un jucator foloseste comanda /pay.
if(strcmp(cmdtext, "/pay", true) == 0)
{
new tmp[256], idx;
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) return SendClientMessage(playerid, COLOR_WHITE, "Folosire: /pay <jucator> <suma>");
new giveplayerid = ReturnUser(tmp);
new suma = strval(tmp);
if(suma >= 1 && suma < 1000000) {} else return 1;
GivePlayerMoney(giveplayerid, suma);
GivePlayerMoney(playerid, -suma);
// PARTEA CEA MAI IMPORTANTA
Callback(playerid, giveplayerid, suma);
return 1;
}
Pentru a executa un callback, trebuie sa ii scrii corect numele si sa ii pui parametrii corecti, adica: Callback(parametrul1, parametrul2, parametrul3);
In principiu, am adaugat Callback la sfarsitul comenzii /pay, si am adaugat parametrii corecti:
playerid este cel care plateste, care in comanda /pay are acelasi nume: playerid.
toplayerid este cel care primeste banii, adica giveplayerid.
money este suma, care in comanda /pay am notat-o ca "suma", deci am sa pun "suma" in loc de money.
SURSA : http://forum.sa-mp.com/archive/index.php/f-77.htm
public OnPlayerDeath(playerid, killerid, reason)
{
new string[128], sendername[MAX_PLAYER_NAME];
GetPlayerName(killerid, sendername, sizeof(sendername));
format(string, sizeof(string), "Ai fost omorat de catre {DC0C0C}%s{FFFFFF}!", sendername);
SendClientMessage(playerid, 0xFFFFFFFF, string);
return 1;
}
Exemplul de mai sus prezinta un simplu cod care este executat atunci cand jucatorul moare, si ii trimite un mesaj care ii spune cine l-a omorat.
Cu putin efort, in script iti poti face propriul callback, ori pentru a "comprima" multele functii pe care le folosesti, ori pentru a face ceva atunci cand vrei tu.
Desigur, pentru a face un callback mai intai trebuie sa arati scriptului ce vrei sa faci, asa ca folosim functia forward pentru a defini callback-ul tau. Desigur, callback-ul poate avea mai multi parametri.
Functia forward se pune la inceputul scriptului.
forward Callback(playerid, toplayerid, money);
Vreau sa definesc un callback care se va executa la comanda /pay, pentru a afla suma, jucatorul care plateste si jucatorul care primeste banii, deci callback-ul va avea 2 membri care interactioneaza.
Acum, sa va explic functia de mai sus pe parti:
forward - Functia care defineste callback-ul.
playerid - Ca sa stiu pe cine sa imi execut functiile din interiorul callback-ului, folosesc playerid.
toplayerid - Pentru ca voi avea 2 jucatori care interactioneaza intre ei, folosesc toplayerid pentru a sti cine primeste banii.
money - Banii pe care ii primeste toplayerid/pe care ii plateste playerid.
Acum, ca am definit callback-ul, trebuie sa il si creez. Pentru asta, urmam structura clasica:
public Callback(playerid, toplayerid, money)
{
return 1;
}
Pentru ca callback-ul este gol, este clar ca nu se va intampla nimic, asa ca am sa creez un mesaj atunci cand toplayerid primeste banii.
public Callback(playerid, toplayerid, money)
{
new string[128], sendername[MAX_PLAYER_NAME], sendername1[MAX_PLAYER_NAME];
GetPlayerName(playerid, sendername, sizeof(sendername)); // Verific numele jucatorului care da banii
GetPlayerName(toplayerid, sendername1, sizeof(sendername1)); // Verific numele jucatorului care primeste banii
format(string, sizeof(string), "Ai primit $%d de la %s!", money, sendername);
SendClientMessage(toplayerid, 0xFFFFFFFF, string);
format(string, sizeof(string), "I-ai dat $%d lui %s!", money, sendername1);
SendClientMessage(playerid, 0xFFFFFFFF, string);
}
Acum, mai ramane sa ii arat scriptului cand va fi executat acest callback. Asa ca il execut de fiecare data cand un jucator foloseste comanda /pay.
if(strcmp(cmdtext, "/pay", true) == 0)
{
new tmp[256], idx;
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) return SendClientMessage(playerid, COLOR_WHITE, "Folosire: /pay <jucator> <suma>");
new giveplayerid = ReturnUser(tmp);
new suma = strval(tmp);
if(suma >= 1 && suma < 1000000) {} else return 1;
GivePlayerMoney(giveplayerid, suma);
GivePlayerMoney(playerid, -suma);
// PARTEA CEA MAI IMPORTANTA
Callback(playerid, giveplayerid, suma);
return 1;
}
Pentru a executa un callback, trebuie sa ii scrii corect numele si sa ii pui parametrii corecti, adica: Callback(parametrul1, parametrul2, parametrul3);
In principiu, am adaugat Callback la sfarsitul comenzii /pay, si am adaugat parametrii corecti:
playerid este cel care plateste, care in comanda /pay are acelasi nume: playerid.
toplayerid este cel care primeste banii, adica giveplayerid.
money este suma, care in comanda /pay am notat-o ca "suma", deci am sa pun "suma" in loc de money.
SURSA : http://forum.sa-mp.com/archive/index.php/f-77.htm