PARTNERI:
-UPOZORENJE-

Samo registrovani članovi mogu da vide/koriste forum u celini.
Prijavite se ili registrujte nalog na Balkan SA-MP forumu.


Autor Tema: [Tutorial] (Dynamic) Strings  (Pročitano 743 puta)

0 članova i 1 gost pregledaju ovu temu.

Van mreže Osamu Dazai

(Dynamic) Strings
« poslato: Avgust 20, 2019, 14:31:27 posle podne »
- PawnPlus [ Prvi Deo >> Dinamični stringovi ] -

Å ta je PawnPlus?
PawnPlus je plugin koji omogućava asihrone radnje u PAWN jeziku, ujedno ima i dosta korisnih stvari poput YSF library-a.

Prvi Deo tutoriala
Planiram da ovaj tutorial ima više delova jer je PawnPlus previše kompleksan tako da ne mogu sve u jednom napisati a da vi to razumete.

Zašto baš dinamični stringovi za prvi deo?
Zato što mi je to najviše traženo po inboxu, privatnim porukama, samo što sova iz Harry Potera ne krene da mi donosi pisma kroz prozor.

Instalacija
Za početak odete na ovaj link i preuzmete .so/.dll i .inc fajlove (kao za svaki drugi library).
Kada ste instalirali, .so/.dll fajl prebacite u plugins folder i dodate ih u server.cfg a include dodate u include folder.

Including
Potrebno je da ovaj kod dodate tamo gde su vam svi include-i:
Pawno Code: [Izaberi]
#include <PawnPlus>Mislim da red nije bitan, bitno je samo pre nego Å¡to se bilo Å¡ta iz PawnPlus-a koristi da bude included.

Prilagođavanje native-a
Pre nego što bilo gde krenemo, moram da napomenem da recimo imate inputtext u OnDialogResponse callbacku, Vi taj string ne možete da koristite u PawnPlus dinamičnim stringovima jer PawnPlus ima svoje tagove za stringove ( ConstAmxString i ConstString ) ili recimo ako želite da unutar CreateDynamic3DTextLabel-a koristite dinamične stringove, vi taj native morate da prilagodite, veoma je jednostavno:
Prvo uđemo u include fajl odakle taj native potiče, u ovom slučaju streamer.inc, pritisnite CTRL + F i kucajte CreateDynamic3DTextLabel i ENTER, kada ste našli native, jednostavno ga celog prekopirajte:
Pawno Code: [Izaberi]
native STREAMER_TAG_3D_TEXT_LABEL:CreateDynamic3DTextLabel(const text[], color, Float:x, Float:y, Float:z, Float:drawdistance, attachedplayer = INVALID_PLAYER_ID, attachedvehicle = INVALID_VEHICLE_ID, testlos = 0, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = STREAMER_3D_TEXT_LABEL_SD, STREAMER_TAG_AREA:areaid = STREAMER_TAG_AREA:-1, priority = 0);Ja imam običaj da ga stavim iznad main() funkcije tj ispod include-a.

Sada kada smo ga kopirali treba da prilagodimo taj native, kako?

Kao što možete videti u ovom native-u na prvom mestu se nalazi const text[] argument, umesto njega ćemo staviti ConstAmxString:string (bitan je tag ConstAmxString), zatim preimenujemo native, na primer ja ću da ga nazovem pp_CreateDynamic3DTextLabel, sada poslednji korak pre samog semi-colona stavimo = ime_originalnog_nativea, ovako bi trebalo da izgleda krajnji rezultat:
Pawno Code: [Izaberi]
native STREAMER_TAG_3D_TEXT_LABEL:pp_CreateDynamic3DTextLabel(ConstAmxString:string, color, Float:x, Float:y, Float:z, Float:drawdistance, attachedplayer = INVALID_PLAYER_ID, attachedvehicle = INVALID_VEHICLE_ID, testlos = 0, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = STREAMER_3D_TEXT_LABEL_SD, STREAMER_TAG_AREA:areaid = STREAMER_TAG_AREA:-1, priority = 0) = CreateDynamic3DTextLabel;
Sada konačno možemo da kreiramo dinamične labele pomoću dinamičnih stringova, kako to izgleda:

Pawno Code: [Izaberi]
new playerName[MAX_PLAYER_NAME + 1];
GetPlayerName(playerid, playerName, sizeof(playerName));

new String:string = str_format("www.balkan-samp.com\nVaš username: %s", playerName);
pp_CreateDynamic3DTextLabel(string, 0xFF0000FF, 0.0, 0.0, 3.0, 30.0, playerid, INVALID_VEHICLE_ID, 1, -1, -1, -1, 25.0, -1, 0);

Isto sve radite i za ShowPlayerDialog (kažem ShowPlayerDialog zato što su tu najveći stringovi ugl), ali vi recimo ne morate const caption[] da prebacite u ConstAmxString nego samo const info[].

Kao što vidite, nigde nema 1024 stringova nit bilo kakvih problema, na primer /adminhelp dialog, admin level 1 može imati 256 dužinu svih komandi zajedno a vi pravite 2048 za slučaj da je admin level 7 ( čast izuzetcima ).

To je to?!
Naravno da ne, ima još dosta da se radi sa dinamičnim stringovima, na primer:

Pawno Code: [Izaberi]
native String:str_new(const str[], str_create_mode:mode=str_preserve);
native String:str_new_arr(const arr[], size=sizeof(arr), str_create_mode:mode=str_preserve);
native String:str_new_static(const str[], str_create_mode:mode=str_preserve, size=sizeof(str));
native String:str_new_buf(size);
native AmxString:str_addr(StringTag:str);
native ConstAmxString:str_addr_const(ConstStringTag:str);
native AmxStringBuffer:str_buf_addr(StringTag:str);
native String:str_acquire(StringTag:str);
native String:str_release(StringTag:str);
native str_delete(StringTag:str);
native bool:str_valid(ConstStringTag:str);
native String:str_clone(ConstStringTag:str);

native str_len(ConstStringTag:str);
native str_get(ConstStringTag:str, buffer[], size=sizeof(buffer), start=0, end=cellmax);
native str_getc(ConstStringTag:str, pos);
native str_setc(StringTag:str, pos, value);
native str_cmp(ConstStringTag:str1, ConstStringTag:str2);
native bool:str_empty(ConstStringTag:str);
native bool:str_eq(ConstStringTag:str1, ConstStringTag:str2);
native str_findc(ConstStringTag:str, value, offset=0);
native str_find(ConstStringTag:str, ConstStringTag:value, offset=0);

native String:str_cat(ConstStringTag:str1, ConstStringTag:str2);
native String:str_sub(ConstStringTag:str, start=0, end=cellmax);
native String:str_val(AnyTag:value, TagTag:tag_id=tagof(value));
native String:str_val_arr(const AnyTag:value[], size=sizeof(value), TagTag:tag_id=tagof(value));
native String:str_val_var(ConstVariantTag:value);
native List:str_split(ConstStringTag:str, const delims[]);
native List:str_split_s(ConstStringTag:str, ConstStringTag:delims);
native String:str_join(List:list, const delim[]);
native String:str_join_s(List:list, ConstStringTag:delim);
native String:str_to_lower(ConstStringTag:str);
native String:str_to_upper(ConstStringTag:str);

native String:str_set(StringTag:target, StringTag:other);
native String:str_append(StringTag:target, StringTag:other);
native String:str_ins(StringTag:target, StringTag:other, pos);
native String:str_del(StringTag:target, start=0, end=cellmax);
native String:str_clear(StringTag:str);
native String:str_resize(StringTag:str, size, padding=0);
native String:str_set_to_lower(StringTag:str);
native String:str_set_to_upper(StringTag:str);

native String:str_format(const format[], AnyTag:...);
native String:str_format_s(ConstStringTag:format, AnyTag:...);
native String:str_set_format(StringTag:target, const format[], AnyTag:...);
native String:str_set_format_s(StringTag:target, ConstStringTag:format, AnyTag:...);
native String:str_append_format(StringTag:target, const format[], AnyTag:...);
native String:str_append_format_s(StringTag:target, ConstStringTag:format, AnyTag:...);
native bool:str_match(ConstStringTag:str, const pattern[], &pos=0, regex_options:options=regex_default);
native bool:str_match_s(ConstStringTag:str, ConstStringTag:pattern, &pos=0, regex_options:options=regex_default);
native List:str_extract(ConstStringTag:str, const pattern[], &pos=0, regex_options:options=regex_default);
native List:str_extract_s(ConstStringTag:str, ConstStringTag:pattern, &pos=0, regex_options:options=regex_default);
native String:str_replace(ConstStringTag:str, const pattern[], const replacement[], &pos=0, regex_options:options=regex_default);
native String:str_replace_s(ConstStringTag:str, ConstStringTag:pattern, ConstStringTag:replacement, &pos=0, regex_options:options=regex_default);
native String:str_replace_list(ConstStringTag:str, const pattern[], List:replacement, &pos=0, regex_options:options=regex_default);
native String:str_replace_list_s(ConstStringTag:str, ConstStringTag:pattern, List:replacement, &pos=0, regex_options:options=regex_default);
native String:str_replace_func(ConstStringTag:str, const pattern[], const function[], &pos=0, regex_options:options=regex_default, const additional_format[]="", AnyTag:...);
native String:str_replace_func_s(ConstStringTag:str, ConstStringTag:pattern, const function[], &pos=0, regex_options:options=regex_default, const additional_format[]="", AnyTag:...);
native String:str_replace_expr(ConstStringTag:str, const pattern[], Expression:expr, &pos=0, regex_options:options=regex_default);
native String:str_replace_expr_s(ConstStringTag:str, ConstStringTag:pattern, Expression:expr, &pos=0, regex_options:options=regex_default);
native String:str_set_replace(StringTag:target, ConstStringTag:str, const pattern[], const replacement[], &pos=0, regex_options:options=regex_default);
native String:str_set_replace_s(StringTag:target, ConstStringTag:str, ConstStringTag:pattern, ConstStringTag:replacement, &pos=0, regex_options:options=regex_default);
native String:str_set_replace_list(StringTag:target, ConstStringTag:str, const pattern[], List:replacement, &pos=0, regex_options:options=regex_default);
native String:str_set_replace_list_s(StringTag:target, ConstStringTag:str, ConstStringTag:pattern, List:replacement, &pos=0, regex_options:options=regex_default);
native String:str_set_replace_func(StringTag:target, ConstStringTag:str, const pattern[], const function[], &pos=0, regex_options:options=regex_default, const additional_format[]="", AnyTag:...);
native String:str_set_replace_func_s(StringTag:target, ConstStringTag:str, ConstStringTag:pattern, const function[], &pos=0, regex_options:options=regex_default, const additional_format[]="", AnyTag:...);
native String:str_set_replace_expr(StringTag:target, ConstStringTag:str, const pattern[], Expression:expr, &pos=0, regex_options:options=regex_default);
native String:str_set_replace_expr_s(StringTag:target, ConstStringTag:str, ConstStringTag:pattern, Expression:expr, &pos=0, regex_options:options=regex_default);

U sledećem tutorialu ide Regular Expression koji koristi C++ syntaxu tako da naoštrite Vaše znanje iz C++ regex-a na stackoverflowu i regexr.com sajtu :D

NAPOMENA: Ovaj tutorial nije toliko detaljan jer se većina funkcija koristi isto kao native samo su tu zbog različitih tagova, možda bude nastavak i tutoriala za stringove jer ima još dosta toga što nisam objasnio, ovo vam je dovoljno da vas drži zauzetim do sledećeg tutoriala, lep pozdrav! :D
My tutorials: y_inline & y_dialog, Ternary Operator, y_flooding, y_bit, samp-logger, Pawn Plus I Deo ( Dynamic Strings ), Map Zones, TextDraw Buttons, y_iterate, easyDialog, samp-plugin-timerfix
My includes: TextDraw Buttons

Respect: Bunta, Vedran, Ivan Bagarić, Itz.Yansi, Rade Ćurić (ni ja ne verujem)
Biggest respect goes to: ADRFranklin

Citat: Vodka Play
Obožavam te "skriptere" koji probleme rešavaju tako što menjaju mod svaka 2 dana, tako će sigurno naučiti.
Neko im nacrta u temi Å¡ta treba uraditi, al' ne vredi nisu svi za skriptanje.
 
Korisnici koji su se zahvalili: M U M I X Z Λ

Van mreže M U M I X Z Λ

  • Ne treba vjerovati ljudima s kojima smo se tek sprijateljili, a koji pokazuju da smo im draži od njihovih starih prijatelja – tako će se ponaÅ¡ati i s nama kada steknu nove prijatelje.
  • Godfather
  • *
  • Poruke: 10190
  • Broj zahvalnica: 900
  • offline
Odg: (Dynamic) Strings
« Odgovor #1 poslato: Avgust 20, 2019, 14:42:25 posle podne »
Jako ko Srpski ustanak!
define the problem properly and the solution will present itself
 

Van mreže Osamu Dazai

Odg: (Dynamic) Strings
« Odgovor #2 poslato: Avgust 20, 2019, 14:44:45 posle podne »
Jako ko Srpski ustanak!
Vozi :D

Loše sam ja objasnio sa obzirom na to da sam i ja relativno nov u ovome i ako znam sve iz paketa da koristim kako-tako :D

EDIT: Cilj ovog tutoriala je bio da Vas zapravo naučim da prilagodite native jer to bez dobrog objašnjenja ne može da uradi neko ko prvi put vidi PawnPlus :D
« Poslednja izmena: Avgust 20, 2019, 14:47:37 posle podne Osamu Dazai »
My tutorials: y_inline & y_dialog, Ternary Operator, y_flooding, y_bit, samp-logger, Pawn Plus I Deo ( Dynamic Strings ), Map Zones, TextDraw Buttons, y_iterate, easyDialog, samp-plugin-timerfix
My includes: TextDraw Buttons

Respect: Bunta, Vedran, Ivan Bagarić, Itz.Yansi, Rade Ćurić (ni ja ne verujem)
Biggest respect goes to: ADRFranklin

Citat: Vodka Play
Obožavam te "skriptere" koji probleme rešavaju tako što menjaju mod svaka 2 dana, tako će sigurno naučiti.
Neko im nacrta u temi Å¡ta treba uraditi, al' ne vredi nisu svi za skriptanje.
 

Van mreže //>> Vedran

Odg: (Dynamic) Strings
« Odgovor #3 poslato: Avgust 20, 2019, 15:56:21 posle podne »
Prejak include
Kao vi da budem ne bih dozvolio nikada.


One of my most productive days was throwing away 1000 lines of code...
 
Korisnici koji su se zahvalili: Osamu Dazai

Van mreže Osamu Dazai

Odg: (Dynamic) Strings
« Odgovor #4 poslato: Avgust 20, 2019, 15:56:38 posle podne »
My tutorials: y_inline & y_dialog, Ternary Operator, y_flooding, y_bit, samp-logger, Pawn Plus I Deo ( Dynamic Strings ), Map Zones, TextDraw Buttons, y_iterate, easyDialog, samp-plugin-timerfix
My includes: TextDraw Buttons

Respect: Bunta, Vedran, Ivan Bagarić, Itz.Yansi, Rade Ćurić (ni ja ne verujem)
Biggest respect goes to: ADRFranklin

Citat: Vodka Play
Obožavam te "skriptere" koji probleme rešavaju tako što menjaju mod svaka 2 dana, tako će sigurno naučiti.
Neko im nacrta u temi Å¡ta treba uraditi, al' ne vredi nisu svi za skriptanje.
 

Van mreže imnaithan

Odg: (Dynamic) Strings
« Odgovor #5 poslato: Avgust 21, 2019, 01:10:18 pre podne »
Gledam ovo i isto se osecam kao neko ko bi uzeo da radi muziku bez ikakvog znanja... Valjda zato nisam skripter niti se bavim time , ako kazu svi da je dobro , slazem se i ja  8)


Give Honor To The One Who Deserve It