Jump to content

Astăzi am învățat - Împărtășiți-vă cunoștințele noi!


WopsS

Recommended Posts

Dacă ai învăţat ceva nou în materie de scripting în SA-MP, atunci împărtăşeşte-l cu noi aici.

Vă rog:

  • Explicaţi ce aţi învăţat, nu spune-ţi doar că aţi învăţat ceva.
  • Încercaţi să fiţi concişi.
  • Nu postaţi altceva, cum ar fi poze sau alte chestii care nu au legătură. O să atragă sancţiuni.
  • Nu postaţi un link sau un citat despre ce aţi învăţat!

 

Încep eu...


Azi am învăţat că pot folosi SSANCF cu specificatorul pentru text (s) înainte de alt specificator, iar acesta o să ia textul până când întâlneşte un spaţiu respectând ceilalţi specificatori.


Exemplu:

new Text[129], targetid;

if (sscanf(params, "s[128]u", Text, targetid))
{
	return SendClientMessage(playerid, -1, "USAGE: /example <Text> <PlayerID>");
}

new PlayerName[MAX_PLAYER_NAME + 1];
GetPlayerName(playerid, PlayerName, sizeof(PlayerName));

format(Text, sizeof(Text), "%s %s", Text, PlayerName);
SendClientMessage(targetid, -1, Text);


Folosire: /command Salut 0
Rezultat: Salut <Numele jucatorului cu ID-ul 0>

Idea originala este a lui Slice (http://forum.sa-mp.com/showthread.php?t=359953).

  • Upvote 1
Link to comment
Share on other sites

Azi am invatat ca string-urile mari mananca din biti. Nu are rost ca intr-un string folosit la un mesaj sa fie marit la 256, 512, 1000, 2000 exemplu:

new string[256];
new string[512];
new string[1000];
new string[2000];

Nu este nevoie deoarece chat-ul de pe SA-MP se incadreaza in 144 de caractere, si nu are rost sa irosim biti aiurea.Exemplu:

new string[144];

De retinut!

String-ul este defapt un array single dimensional, dar in acelasi timp este si un vector . Este vector deoarece incepe de la 0 si se sfarseste la  lungimea lui -1. Exemplu:

new string[7] = "Claudiu"); porneste de la 0, adica litera " C " este caracterul 0, litera " l " este caracterul 1 iar litera " u " este caracterul 6.

Acest string atinge in total 7 caractere pornind de la 0 pana la 6. Daca string-ul atinge caracterul 7 din string sau 8, 9 s.a.m.d atunci el nu este citit deoarece este EOS = End of String(sfarsit de string). Mai pe scurt un mesaj nu depaseste lungimea string-ului lui, adica atunci cand faceti un mesaj mai lung si un string mai scurt decat mesajul, mesajul va fi scris incomplet in chat.

!!! caracterul SPACE(spatiu dintre cuvinte) este luat ca caracter.

 

Exemplu de mesaj incomplet cauzat de un string prea mic:

new string[8];

format(string, sizeof(string),"Salutare lume!");
SendClientMessage(playerid, -1, string);

in acest caz mesajul in chat va fi:

"Salutare"

Deci mesaj incomplet.

 

ATENTIE!

Nu confundati string-urile folosite in mesaje cu query-urile(interogarile) folosite in functiile mysql:

new query[128];
mysql_format(MySQL, query, sizeof(query), "SELECT * FROM `%s` WHERE `bar` = '%e' AND `foobar` = '%f' LIMIT %d", "foobar", "escape'me\"please", 1.2345, 1337);
mysql_tquery(MySQL, query, "OnStuffSelected", "");

SURSA WIKI.SA-MP.COM

Query-urile sunt mesaje trimise catre baza de date. Ele nu au nici o legatura cu chat-ul deci e in regula sa avem un query mai mare de 144 in cazul in care lungimea lui este mai mare. Dar nici aceasta nu trebuie sa fie imensa, ci potrivita in functie de lungime. De obicei nu trebuie mai mare de 128, dar sunt cazuri in care query are o lungime mai mare, de aceea il putem mari.

  • Upvote 3
Link to comment
Share on other sites

Azi am invatat ca daca faci un checkpoint si te folosesti de o variabila pentru a fi functional trebuie sa-i setezi valoarea 0 la final pentru a nu avea probleme cu toate checkpoint-urile de pe server . Sa zicem ca avem :

 

new Checkpoint[MAX_PLAYERS];

Prima data, trebuie sa adaugi valoarea 0 a acestei variabile la logarea unui player, ca sa fi sigur ca nu o sa ai probleme . La OnPlayerLogin vei adauga :

Checkpoint[playerid] = 0;

Acum, undeva la o comanda sa zicem , setam un checkpoint si ii dam valoarea variabiliei "Checkpoint" 1 ca sa nu mai stam sa verificam cand un player a ajuns in acel checkpoint folosind coordonatele :

SetPlayerCheckpoint(playerid, 1982.6150, -220.6680, -0.2432, 3.0);
Checkpoint[playerid] = 1;

La OnPlayerEnterCheckpoint trebuie sa verificam daca a intrat in acel checkpoint si sa dezactivam checkpointul :

if(Checkpoint[playerid] == 1)
{
    DisablePlayerCheckpoint(playerid);
}

Exact ce am spus mai sus , unde e linia cu DisablePlayerCheckpoint(playerid); nu este chiar corect . De ce ? Pentru ca eu am pus sa dezactiveze checkpoint-ul dar nu am setat variabilei "Checkpoint" valoarea 0, ceea ce inseamna ca acel checkpoint este inca activ si ne va creea probleme cu celelalte checkpoint-uri de pe server . Corect este :

if(Checkpoint[playerid] == 1)
{
    DisablePlayerCheckpoint(playerid);
    Checkpoint[playerid] = 0;
}

Acum este corect . Asa trebuie sa fie la fiecare checkpoint folosit cu o variabila . 

Edited by NoNamed
Link to comment
Share on other sites

  • 3 weeks later...

Astazi am invatat ca niste comenzi aparent simple pot afecta grav serverul. Comanda de genul cnn este daunatoare pentru playerii de samp, aceasta poate da crash la server(sa il inchida).

 

Aceasta fiind comanda:

CMD:cnn(playerid,params[])
{
    if(gLogged[playerid] != 1) return SCM(playerid,COLOR_RED,"Nu esti logat");
	if (PlayerInfo[playerid][pAdmin] < 2) return SCM(playerid, COLOR_GRAD1, "   Nu ai rangul administrativ necesar!");
	new message[128],txtid;
	if(sscanf(params,"ds[128]",txtid,message)) return SCM(playerid, COLOR_GRAD2, "{00FF00}Folosire:{FFFFFF} /cnn [0-8]   [textformat ~n~ Newline, ~r~ Red, ~g~ Green, ~b~ Blue, ~w~ White, ~y~, Yellow]");
 	format(strings, sizeof(strings), "~b~ %s: ~n~~w~%s",PlayerName(playerid),message);
	foreach(Player,i)
  	GameTextForPlayer(i, strings, 5000, txtid);//
	return 1;
}

Daca scriem "/cnn 0 ~n~~n~~r~ Salut" 

Stilul 0 acel "txtid" adica de la GameText, Poate restarta serverul.

De ce?

Pentru ca adminii vor sa afiseze un mesaj in culori sa dea bine, iar gametextele care suporta tagurile ~n~~r~ de culoare si spatiu sunt 3,4 si 5.

Probabilitatea ca adminul sa nimereasca aceste texte e mica. In concluzie serverul va pica si vom avea in server log erorile.

 

[14:45:57] [debug] Run time error 6: "Invalid instruction"
[14:45:57] [debug]  Unknown opcode 0x290000 at address 0x0000007E
[14:45:57] [debug] AMX backtrace:
[14:45:57] [debug] #0 00000000 in public cmd_cnn () from gamemode.amx
[14:45:57] [debug] #1 native LIFECMD () from LIFE-CMD.DLL
[14:45:57] [debug] #2 00000000 in public OnPlayerCommandText () from gamemode.amx
[14:45:57] [debug] Run time error 6: "Invalid instruction"
[14:45:57] [debug]  Unknown opcode 0x3000 at address 0x00000073
[14:45:57] [debug] AMX backtrace:
[14:45:57] [debug] #0 00000000 in public OnPlayerCommandText () from gamemode.amx

 

Serverul va fi restartat si de acea va trebui sa schimbam comanda si sa ii punem restrictii

 

CMD:cnn(playerid,params[])
{
    if(gLogged[playerid] != 1) return SCM(playerid,COLOR_RED,"Nu esti logat");
	if (PlayerInfo[playerid][pAdmin] < 2) return SCM(playerid, COLOR_RED, "   Nu ai rangul administrativ necesar!");
	new message[128],txtid;
	if(sscanf(params,"ds[128]",txtid,message)) return SCM(playerid, COLOR_RED, "{00FF00}Folosire:{FFFFFF} /cnn [3-5]   [textformat ~n~ Newline, ~r~ Red, ~g~ Green, ~b~ Blue, ~w~ White, ~y~, Yellow]");
    if(txtid != 3 && txtid != 4 && txtid !=5) return SCM(playerid,COLOR_RED,"Atentie Formatul trebuie sa fie 3,4 sau 5!");
 	format(strings, sizeof(strings), "~b~ %s: ~n~~w~%s",PlayerName(playerid),message);
	foreach(Player,i)
  	GameTextForPlayer(i, strings, 5000, txtid);//
	return 1;
}

 

Comanda CNN sau CNNN este pe majoritatea serverelor RPG\RP sau GF. Unii poate au reparat problema altii nu

Pluginul Life-CMD este la fel ca ZCMD sau YCMD, poate mai rapid,  deci eroare nu poate aparea din cauza lui. La fel ar fi si pe YCMD sau ZCMD. Acesta l-am luat de la WiDuAlK.SaMp  cand a facut tutorialul de Optimizare simplitate si stil.

 

Sper ca nu e ceva gresit, sau am postat gresit.

 

Edited by Mister
  • Upvote 1

 

    __  ____      __           
   /  |/  (_)____/ /____  _____
  / /|_/ / / ___/ __/ _ \/ ___/
 / /  / / (__  ) /_/  __/ /    
/_/  /_/_/____/\__/\___/_/     
SERVICII SCRIPTING DE CALITATE
Pagina     Scripting     pawn
Link to comment
Share on other sites

  • 5 months later...

Urmatoarea descriere am aflat-o acum ceva timp, dar am observat de-alungul timpului ca oamenii nu stiu sa o foloseasca, asa ca hai sa ii dam drumul.
Azi am invatat cum se manipupleaza string-ul in mai multe cazuri. Trebuie sa definim un string.

new string[100];

il fac de 100 , nu e neaparat sa il fac atat de mare.
Sa spunem ca avem nevoie de un mesaj simplu. Il scriem in felul urmator.

format(string, sizeof(string), "Mesajul meu este acesta.");
SendClientMessage(playerid, culoare, string);

Acesta este un mesaj simplu facut cu string.

Desi folosit, multi nu inteleg modul de gandire pe care il are functia.

format(string, sizeof(string), "MESAJ");


string = "MESAJ"
Bun , dar noi putem defini si asa:
 

new string[] = "mesaj";

scopul string-ului este de a marca in mesaj niste specificatii.

de exemplu, nu putem face:

new string[] = "ID-ul tau este %d", playerid;

compilatorul ne va atentiona ca este eroare.

Acum , sa spunem ca sunteti pe server, iar ID vostru este "3".
Vom specifica cu format ID vostru:

format(string, sizeof(string), "ID-ul tau este %d", playerid);
SendClientMessage(playerid, -1, string);

In acest caz:
string = "ID-ul tau este 3"

De aceea folosim string-ul, pentru ca altfel nu putem marca specificatiile.

Dese ori am vazut ca se foloseste strcat pentru a scrie mesaje unele sub altele.

Aceasta metoda, cea cu strcat, nu este la fel de sigura ca si format.

Pentru a folosi aceasta metoda trebuie sa stiti cum se concepe:

format(string, sizeof(string), " Primul mesaj \n");
format(string, sizeof(string), "%s Al 2-lea mesaj \n", string);
format(string, sizeof(string), "%s Al 3-lea mesaj \n", string);
SendClientMessage(playerid, culoare, string);

ATENTIE: Pentru a afisa cele 3 mesaje , dupa primul string puneti '%s', iar ca specificatie puneti 'string'. Daca nu puneti cele 2, nu o sa primiti decat primul mesaj.

Acelasi lucru putem face si in cazul dorim sa face un dialog de ori ce tip, eu voi prezenta MSGBOX, dar e la fel pentru orice tip de dialog.

format(string, sizeof(string), " Primul mesaj \n");
format(string, sizeof(string), "%s Al 2-lea mesaj \n", string);
format(string, sizeof(string), "%s Al 3-lea mesaj \n", string);
ShowPlayerDialog(playerid, DIALOG, DIALOG_STYLE_MSGBOX, "Titlu", string, "Buton1", "Buton2");

 

Edited by WiDuAlK
  • Upvote 1
Link to comment
Share on other sites

  • 6 months later...

Astazi am descoperit o eroare care nu apare la compilare si mi-a dat ceva timp de gandire, aparent in 

enum pInfo
{pPassword[128], pLevel, pAdmin, pHelper,   ..... ,pCrime, pCash,pMoney,pInterior,pVip,pHouse,pBiz};

am adaugat variabila pCrime,

Iar in gm am folosit format string pentru ca a fost creata pentru a retine un mesaj,

pe serverul totul merge bine, variabila se salveaza ca si string in mysql si pe server se afiseaza corect, dar apoi vine problma,

toate variabilele create dupa variabila pCrime, nu vor mai avea valoarea lor din mysql, ci vor avea numar de caractere care trece prin el.

Deci variabilele dupa aceasta variabila nu vor mai afisa rezulatul corect, de acea este important sa nu uitam lungimea stringului [20], da, trebuia sa pun pCrima[20], asta a fost greseala

A fost un moment de neatentie pentru a aduce cateva batai de cap, si de a nu intelege de ce variabilele se extrag corect din baza de date si totusi ele sunt gresite. 

Am dat un printf la toate variabilele si asta mi-a aratat

[19:49:42] 50  
[19:49:42] 55  
[19:49:42] 46  
[19:49:42] 48  
[19:49:42] 46  
[19:49:42] 48  
[19:49:42] 46  
[19:49:42] 49  
[19:49:42] 0  
[19:49:42] 1  
[19:49:42] 0  

 

Acelea sunt variabilele care urmeaza dupa variabila pCrime,

Am zis sa speific asta, desi este o greseala minora, chiar daca ziceti ca merge si asa, sa stiti ca nu merge, specificati mereu lungimea stringului

 

    __  ____      __           
   /  |/  (_)____/ /____  _____
  / /|_/ / / ___/ __/ _ \/ ___/
 / /  / / (__  ) /_/  __/ /    
/_/  /_/_/____/\__/\___/_/     
SERVICII SCRIPTING DE CALITATE
Pagina     Scripting     pawn
Link to comment
Share on other sites

  • WopsS unfeatured this topic

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. For more details you can also review our Terms of Use and Privacy Policy.