Komande /report / askq, formatiranje poruka i objasnjenje

pre 6 godina
2,789
pregleda
12
postova
Niko_Bitan
Street Runner
pre 6 godina
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
new ImeIgraca;

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
GetPlayerName(playerid, ImeIgraca, MAX_PLAYER_NAME);

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
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,
}
}
}

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
YCMD:report(playerid, params[], help)
{
return (true);
}

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
new ReportovanID, // varijabla koja ce da provjeri i sacuva ID reportovanog igraca
ReportovanRazlog, // varijabla koja ce da provjeri razlog reporta i da sacuva isti
ReportovanPoruka; // varijabla koja nam sluzi da bi slozili poruku koju cemo slati (formatira)

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
if(sscanf(params, "us", ReportovanID, ReportovanRazlog)) return SendClientMessage(playerid, -1, "{808080}Koristenje: {FFFFFF}/report ");

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
if(!IsPlayerConnected(ReportovanID)) return SendClientMessage(playerid, -1, "{808080}Greska: {FFFFFF}Igrac je offline.");

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
format(ReportovanPoruka, sizeof(ReportovanPoruka), "{FF0000}[ Report ] {FFFFFF}Igrac %s(%d) je reportovao igraca %s(%d)", ImeIgraca, playerid, ImeIgraca, ReportovanID);

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
PorukaAdminima(ReportovanPoruka);

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
format(ReportovanPoruka, sizeof(ReportovanPoruka), "{FF0000}[ Razlog ] {FFFFFF}%s", ReportovanRazlog);

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
format(ReportovanPoruka, sizeof(ReportovanPoruka), "{808080}Info: {FFFFFF}Uspjesno ste reportovali igraca %s(%d)", ImeIgraca, ReportovanID);

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
SendClientMessage(playerid, -1, ReportovanPoruka);


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
new PitanjeText;// varijabla koja nam treba u 3 slucaja, provjera validnosti pitanja, cuvanje teksta pitanja, cuvanje formatirane poruke

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
if(sscanf(params, "s", PitanjeText)) return SendClientMessage(playerid, -1, "{808080}Koristenje: {FFFFFF}/askq ");

ukoliko igrac nije kucao /askq server ce vratiti poruku igracu za pravilno koristenje komande
tek sada mozemo formatirati poruku sa pitanjem
format(PitanjeText, sizeof(PitanjeText), "{FF0000}[ ASKQ ] {FFFFFF}%s(%d): %s", ImeIgraca, playerid, PitanjeText);

U ovoj liniji smo formatirali 3 stavke, Ime igraca, ID igraca i pitanje koje igrac postavlja, to sve saljemo adminima
PorukaAdminima(PitanjeText);

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
SendClientMessage(playerid, -1, "{808080}Info: {FFFFFF}Vase pitanje je uspjesno poslato Administraciji");


To bi bilo to sto se tice komande /askq

Na samome kraju, vase dvije komande bi trebale da izgledaju ovako:
YCMD:report(playerid, params[], help)
{
new ReportovanID, ReportovanRazlog, ReportovanPoruka;
if(sscanf(params, "us", ReportovanID, ReportovanRazlog)) return SendClientMessage(playerid, -1, "{808080}Koristenje: {FFFFFF}/report ");
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, ImeIgraca, 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);
SendClientMessage(playerid, -1, ReportovanPoruka);
return (true);
}

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


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. 🙂
Emo
Kingpin
pre 6 godina
Ko jos koristi ycmd i foreach jaa mislim da ima provjeru za isplayerconnwxted

graph designer

Muma Rascall
Forum Don
pre 6 godina
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, PitanjeText);
PorukaAdminima(PitanjeText); 🙂

#ek2k18 wrote on August 4, 2019, 8:50 pm:
Ko jos koristi ycmd i foreach jaa mislim da ima provjeru za isplayerconnwxted
ycmd je dobar kad se koristi sa YSI tipa y_groups
Niko_Bitan
Street Runner
pre 6 godina
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
Muma Rascall
Forum Don
pre 6 godina
Evo tvoje "PorukaAdminima" u y_va

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

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


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

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


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


i ne vidim zašto bi izbjegavao y_va, YSI je pun prejakih stvari da se napravi sasvim pristojan gamemode
Scripter Vladimir
Underboss
pre 6 godina
G-J  🙂
mus4
Made Man
pre 6 godina
nije loše
FunnyGamingDay - FGD
OG Legend
pre 6 godina
DJER1C wrote on December 7, 2019, 5:51 pm:
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.

Former SA:MP server developer

DonNk
Rookie
pre 5 godina
Posto sam novi moze li mi neko objasniti sta ovo zapravo znaci

sscanf(params, "us",
Skrilew
Godfather
pre 5 godina
DonNk wrote on May 3, 2020, 7:11 am:
Posto sam novi moze li mi neko objasniti sta ovo zapravo znaci

sscanf(params, "us",


https://forum.sa-mp.com/showthread.php?t=570927
DonNk
Rookie
pre 5 godina
V01D wrote on May 3, 2020, 7:24 am:
https://forum.sa-mp.com/showthread.php?t=570927


Pozz hvala na brzom odg.. da li bi mogao pogledati moju temu ako imas vremena naravno

https://gtablkn.gg/forum/razgovor-u-vezi-pawn-skriptanja/pawn-i-pawno-compiler
ShadowMortar
Shot Caller
pre 5 godina
Nabrzinu sam proletio kroz tutorial, zapazio sam samo dvije stvari(do sada):
1)
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,
}
}
}

Foreach več i sam radi provjeru ako je igrač na serveru, tako da "IsPlayerConnected(i)" nije potrebno.
2) new PitanjeText;

Ovako uostalom pomoći će početnicima.  😁

Morate biti prijavljeni da biste odgovorili na ovu temu.

Prijava