Komande /report / askq, formatiranje poruka i objasnjenje

Započeo Dwayne_Hernandez, Avgust 04, 2019, 22:47:05 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 2 gostiju pregledaju ovu temu.

Naime posto sam dosta puta vidio ove komande kako ljubi objasnjavaju na nacin kakav nebi trebao da bude objasnjeno
Zato i pravim ovaj mali i jednostavni tutorijal, pa da krenemo :)


Prvo sto nam treba jeste funckija sa kojom cemo uzimati imena od igraca, naravno necemo koristiti stock i njemu slicno
Potrebna nam je jedna varijabla na vrhu skripte
[pawn]new ImeIgraca[MAX_PLAYERS][MAX_PLAYER_NAME];[/pawn]
Ova varijabla nam omogucuje da u svakom trenutku mozemo iskoristiti ime od igraca bez da svaki put koristimo funckiju GetPlayerName

Sledece sto moramo uraditi jeste dodati novu liniju u callback OnPlayerConnect
[pawn]GetPlayerName(playerid, ImeIgraca[playerid], MAX_PLAYER_NAME);[/pawn]
Sa ovom linijom smo obezbjedili u svakom momentu ime od igraca
to je to sto se tice prvog koraka




takodje potrebno nam je da napravimo novu funkciju koja je provjeriti da li je igrac admin, koristit ce nam za to kada budemo slali poruke adminima
[pawn]PorukaAdminima(poruka[])// Naziv funkcije sa parametrom
{
foreach(new i : Player)// petlja kroz igrace, mozete koristiti i for(new i = 0; id < MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i) && IsPlayerAdmin(i))// provjerava da li je igrac povezan na server i da li je admin
{
SendClientMessage(i, 0xFFFFFFFF, poruka);// salje poruku,
}
}
}
[/pawn]
Koristite funckiju kao i sam naziv PorukaAdminima(poruka);




U sledecem koraku pravimo komandu /report, tako da je moramo osnovati, u ovom slucaju je potreban include y_commands
[pawn]YCMD:report(playerid, params[], help)
{
return (true);
}[/pawn]
Komanda je osnovana, ali da bi mogli zavrsiti komandu potrebno nam je par varijabli, koje ce sacuvati ID reportovan igraca i razlog zbog koga je reportovan
[pawn]new ReportovanID, // varijabla koja ce da provjeri i sacuva ID reportovanog igraca
ReportovanRazlog[80], // varijabla koja ce da provjeri razlog reporta i da sacuva isti
ReportovanPoruka[144]; // varijabla koja nam sluzi da bi slozili poruku koju cemo slati (formatira)
[/pawn]
Ove 3 varijable dodajemo na sami vrh komande
Zatim moramo provjeriti da li je igrac prilikom komande unio validan ID i razlog, ili ne, ukoliko nije da mu izbaci poruku sa primjerom tacno poslate komande
[pawn]if(sscanf(params, "us[144]", ReportovanID, ReportovanRazlog)) return SendClientMessage(playerid, -1, "{808080}Koristenje: {FFFFFF}/report [ID] [Razlog]");[/pawn]
U prevodu uslov oznacava, Ako igrac nije unio podatke u redoslijedu ID Razlog, server ce mu vratiti poruku za koristenje komande
Zatim potrebno je provjeriti da li je reportovan ID validan, odnosno da li je igrac povezan na server
[pawn]if(!IsPlayerConnected(ReportovanID)) return SendClientMessage(playerid, -1, "{808080}Greska: {FFFFFF}Igrac je offline.");[/pawn]
U prevodu uslov oznacava, Ako igrac nije povezan na server, vraca mu se poruka od servera koja mu saopstava da igrac nije povezan na server
Funckija IsPlayerConnected = Ako je igrac konektovan
Parametar ! = razlicito
!IsPlayerConnected = Ako nije igrac konektovan
To bi bilo to sto se tice uslova za ispunjavanje komande




Sada slijedi glavna stvar, formatiranje i slanje poruka, a to cemo da uradimo sa funckijom format, a formatiranu poruku cemo da cuvamo sa varijablom ReportovanPoruka na sledeci nacin format(ReportovanPoruka, sizeof(ReportovanPoruka), a sta cemo da formatiramo, pa formatirat cemo varijable koje smo iskoristili u predhodnom koraku, tako da bi vam linija formatiranja trebala izgledati ovako
[pawn]format(ReportovanPoruka, sizeof(ReportovanPoruka), "{FF0000}[ Report ] {FFFFFF}Igrac %s(%d) je reportovao igraca %s(%d)", ImeIgraca[playerid], playerid, ImeIgraca[ReportovanID], ReportovanID);[/pawn]
sastavili smo odnosno formatirali poruku sa varijablama za ID igraca i sa razlogom u jednu cjelinu, sada tu poruku treba proslijediti adminima, a za to cemo iskoristiti funckiju koju smo sami napravili
[pawn]PorukaAdminima(ReportovanPoruka);[/pawn]
Poruka koja je predhodno formatirana je poslata adminima, ukoliko saljete vise poruka na istu adresu, morati ici sledecim redosledom
format
poruka
format
poruka
Sto znaci sledece: Formatirate poruku, posaljete adminima, ponovo formatirate poruku i ponovo je posaljete adminima
Zavrsili smo sa ovim dijelom, odnosno poslali smo adminima jedino informaciju ko je koga reportovao, sada to isto moramo uraditi ali sa razlogom reporta
[pawn]format(ReportovanPoruka, sizeof(ReportovanPoruka), "{FF0000}[ Razlog ] {FFFFFF}%s", ReportovanRazlog);[/pawn]
Sada spo formatirali poruku za razlogom reporta, i nju takodje saljemo adminima kao i predhodnu poruku
PorukaAdminima(ReportovanPoruka);
to bi bilo to sto se tice poruka koje se salju administraciji, ostaje nam jedino na kraju da posaljemo igracu povratnu poruku ako je uspjesno poslao report, a to cemo isto da uradimo pomocu formatiranja
[pawn]format(ReportovanPoruka, sizeof(ReportovanPoruka), "{808080}Info: {FFFFFF}Uspjesno ste reportovali igraca %s(%d)", ImeIgraca[ReportovanID], ReportovanID);[/pawn]
Igracu koji je poslao report, ovim formatiranjem saljemo poruku da je uspjesno report poslat, kao i ime igraca kojeg je reportovao, i tu poruku saljemo funkcijom SendClientMessage, jer ide autoru reporta
[pawn]SendClientMessage(playerid, -1, ReportovanPoruka);[/pawn]

To bi bilo to sto se tice komande /report






Prelazimo na komandu /askq, koja je mnogo jednostavnija, i sluzi za postavljanje pitanja administraciji, mi cemo u ovom primjeru pitanje slati ponovo na istu adresu kao i report
za ovu komandu potrebna nam je samo jedna varijabla, koju cemo iskoristiti da provjeri poslato pitanjje i da ga sacuva, a istu tu varijablu cemo iskoristiti i za cuvanje formatirane poruke
[pawn]new PitanjeText[144];// varijabla koja nam treba u 3 slucaja, provjera validnosti pitanja, cuvanje teksta pitanja, cuvanje formatirane poruke
[/pawn]
Varijablu dodajemo na sami vrh komande, i kada to uradimo tek onda prelazimo na formatiranje poruke i slanje administraciji, ali prije toga moramo provjeriti da li je komanda ukucana na ispravan nacin
[pawn]if(sscanf(params, "s[144]", PitanjeText)) return SendClientMessage(playerid, -1, "{808080}Koristenje: {FFFFFF}/askq [Pitanje] ");[/pawn]
ukoliko igrac nije kucao /askq [pitanje] server ce vratiti poruku igracu za pravilno koristenje komande
tek sada mozemo formatirati poruku sa pitanjem
[pawn]format(PitanjeText, sizeof(PitanjeText), "{FF0000}[ ASKQ ] {FFFFFF}%s(%d): %s", ImeIgraca[playerid], playerid, PitanjeText);[/pawn]
U ovoj liniji smo formatirali 3 stavke, Ime igraca, ID igraca i pitanje koje igrac postavlja, to sve saljemo adminima
[pawn]PorukaAdminima(PitanjeText);[/pawn]
U ovoj komandi smo koristili samo jednu varijablu, koja nam sluzi i za provjeru, i da nam sacuva pitanje, i da formatira poruku
Nema potrebe praviti varijable vezane posebno za pitanje i za formatiranje, samo dodajemo liniju koja apsolutno nije potrebna
i na kraju komande trebamo poslati igracu potvrdu poruku da je uspjesno poslao pitanje, a to cemo odraditi ponovo sa funkcijom SendClientMessage
[pawn]SendClientMessage(playerid, -1, "{808080}Info: {FFFFFF}Vase pitanje je uspjesno poslato Administraciji");[/pawn]

To bi bilo to sto se tice komande /askq

Na samome kraju, vase dvije komande bi trebale da izgledaju ovako:

[pawn]YCMD:report(playerid, params[], help)
{
new ReportovanID, ReportovanRazlog[80], ReportovanPoruka[144];
if(sscanf(params, "us[144]", ReportovanID, ReportovanRazlog)) return SendClientMessage(playerid, -1, "{808080}Koristenje: {FFFFFF}/report [ID] [Razlog]");
if(!IsPlayerConnected(ReportovanID)) return SendClientMessage(playerid, -1, "{808080}Greska: {FFFFFF}Igrac je offline.");
format(ReportovanPoruka, sizeof(ReportovanPoruka), "{FF0000}[ Report ] {FFFFFF}Igrac %s(%d) je reportovao igraca %s(%d)", ImeIgraca[playerid], playerid, ImeIgraca[ReportovanID], ReportovanID);
PorukaAdminima(ReportovanPoruka);
format(ReportovanPoruka, sizeof(ReportovanPoruka), "{FF0000}[ Razlog ] {FFFFFF}%s", ReportovanRazlog);
PorukaAdminima(ReportovanPoruka);
format(ReportovanPoruka, sizeof(ReportovanPoruka), "{808080}Info: {FFFFFF}Uspjesno ste reportovali igraca %s(%d)", ImeIgraca[ReportovanID], ReportovanID);
SendClientMessage(playerid, -1, ReportovanPoruka);
return (true);
}[/pawn]

[pawn]YCMD:askq(playerid, params[], help)
{
new PitanjeText[144];
if(sscanf(params, "s[144]", PitanjeText)) return SendClientMessage(playerid, -1, "{808080}Koristenje: {FFFFFF}/askq [Pitanje] ");
format(PitanjeText, sizeof(PitanjeText), "{FF0000}[ ASKQ ] {FFFFFF}%s(%d): %s", ImeIgraca[playerid], playerid, PitanjeText);
PorukaAdminima(PitanjeText);
SendClientMessage(playerid, -1, "{808080}Info: {FFFFFF}Vase pitanje je uspjesno poslato Administraciji");
return (true);
}[/pawn]

Slike koje prikazuju komande:
/report (klikni)
/askq (klikni)

Postoji jos kraca izvedba komande /report, ali nema potrebe komplikovati, ovo je najjednostavniji nacin
I zapatite, sve sto nadjete na netu vezano za pawn jezik i skriptanje, nemojte misliti da je sve tacno i najjednostavnije objasnjeno, gdje god mozete skratiti kod, to i uradite, gdje god mozete izbjeci provjeru ili pojedinu funckiju to i uradite, gdje kod mozete koristiti jednu funkciju u vise navrata to uradite. :)

Ko jos koristi ycmd i foreach jaa mislim da ima provjeru za isplayerconnwxted

Nema potrebe provjeravat IsPlayerConnected u foreachu za Player, nekako mnogo su vam stari ti načini, sa y_va može mnogo lakše i brže od
format(PitanjeText, sizeof(PitanjeText), "{FF0000}[ ASKQ ] {FFFFFF}%s(%d): %s", ImeIgraca[playerid], playerid, PitanjeText);
PorukaAdminima(PitanjeText); :)

Citat: #ek2k18 poslato Avgust 04, 2019, 22:50:13 POSLE PODNE
Ko jos koristi ycmd i foreach jaa mislim da ima provjeru za isplayerconnwxted
ycmd je dobar kad se koristi sa YSI tipa y_groups

IsPlayerConnected je provjera ukoliko se bude koristila for petlja
sto se tice procesora komandi komandi, ako mislis na izcmd ili mcmd, isti su
a ako pak mislis na pawn.cmd, slobodno ga koristi, jer jednostavno je tipa plugin, sto je dovoljno da se zaobidje u sirokom luku
stari ali efikasan nacin :)
ako ima neko vremena da pojasni y_va i pojmove  va_args, va_format i va_start neka pojasni
ja licno nisam za koristenje y_va

Evo tvoje "PorukaAdminima" u y_va

[pawn]
stock PorukaAdminima(colour, const msg[], va_args<>)
{
   new str[144];
   va_format(str, sizeof(str), msg, va_start<2>);

   foreach(new i : Player)
   {
      if(IsPlayerAdmin(i)) SendClientMessage(i, colour, str);
   }
}[/pawn]

Sad šta je va_start<2> u mom slučaju? Pa broj parametara, jednostavno ih countaš i tu upišeš, colour je 1, msg je 2, znači va_args kreće posle drugog parametra i pišemo ga u va_format>va_start

umjesto
[pawn]
format(PitanjeText, sizeof(PitanjeText), "{FF0000}[ ASKQ ] {FFFFFF}%s(%d): %s", ImeIgraca[playerid], playerid, PitanjeText);
PorukaAdminima(PitanjeText);
[/pawn]

ideš
[pawn]PorukaAdminima(0xFF0000FF, "[ ASKQ ] {FFFFFF}%s(%d): %s", ImeIgraca[playerid], playerid, PitanjeText);[/pawn]

i ne vidim zašto bi izbjegavao y_va, YSI je pun prejakih stvari da se napravi sasvim pristojan gamemode

G-J  :)
Balkan Moon v1.0 by Foxy

Owner // Scripter Balkan Moon

u Potpisu Foxy.

Ne pipaj lava Foxy, radi na BM-u :D :D :D
[4.7.2019] Respect For: Purda | Basovski | Mister Naithan | BICEL KO MI BUNTA | 7.9: Vasic[/b]

* Server [5.1.2019 Created]
* Scripter on Power Gaming
* Scripter on Night Life
* Scripter on Arena Gaming
* Scripter on duty (Balkan Moon)

[23.5.2k19] Messi u skriptanju hehe ;)
[7.8.2k19]OLD Minecraft Developer & Player (2016-2018)

#FOXYSCRIPT[/b]
MAPPER U POKUŠAJU :/[/b]


Citat: DJER1C poslato Decembar 07, 2019, 18:51:03 POSLE PODNE
Dosta stvari prekopirano iz nekog random moda, mogao si sam ovo da ispises..
@DJER1C pravilo 6: "Nije dozvoljeno osvezavati teme starije od 10 dana osim ako nemate problema sa istom." Post ti je obrisan.
• Website: www.vasic.dev
Web Development & Cyber Security

Posto sam novi moze li mi neko objasniti sta ovo zapravo znaci

sscanf(params, "us[144]",



Nabrzinu sam proletio kroz tutorial, zapazio sam samo dvije stvari(do sada):
1)
[pawn]PorukaAdminima(poruka[])// Naziv funkcije sa parametrom
{
foreach(new i : Player)// petlja kroz igrace, mozete koristiti i for(new i = 0; id < MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i) && IsPlayerAdmin(i))// provjerava da li je igrac povezan na server i da li je admin
{
SendClientMessage(i, 0xFFFFFFFF, poruka);// salje poruku,
}
}
}[/pawn]
Foreach več i sam radi provjeru ako je igrač na serveru, tako da "IsPlayerConnected(i)" nije potrebno.
2) new PitanjeText[144];

Ovako uostalom pomoći će početnicima.  ;D
Citat: CheezItFollow your heart and own style.
Citat: PottusThat is perfectly fine, I'm just pointing out where you made mistakes what does hearing "good job" get you? Absolutely nothing. You need to hear the problems otherwise you'll keep making the same mistakes :)