[Tutorial] Privatne poruke u PAWN-u

Započeo Dragi, juče u 13:38:51 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 1 gost pregledaju ovu temu.

Privatne poruke u PAWN-u


Uvod
Ovo je standardan i prost sistem privatnih poruka s njihovim logovanjem. Sve se radi u jednoj komandi. Mozete uraditi refaktorisanje koda za metodu logovanja, ja nisam jer je ovo tutorial. (Takav sistem mozete naci u Dimijevim modovima.)

Potrebne biblioteke:


Potrebne boje:
#define ADMINFS_MSG_COLOR     0xFF444499
#define PM_INCOMING_COLOR     0xFFFF22AA
#define PM_OUTGOING_COLOR     0xFFCC2299

Komanda za slanje privatne poruke drugom onlajn igracu:
CMD:pm(playerid, params[])
{
    new Message[150]; // Deklaracija niza za poruku koja ce biti poslana
    new gMessage[61]; // Deklaracija niza za poruku koju korisnik unosi
    new targetId; // Deklaracija varijable za ID primaoca
    new pName[MAX_PLAYER_NAME + 1]; // Deklaracija niza za ime posiljaoca + 1 za null terminator
    new iName[MAX_PLAYER_NAME + 1]; // Deklaracija niza za ime primaoca

    // Validacija ulaznih parametara
    if (sscanf(params, "us[61]", targetId, gMessage))
    {
	// Slanje poruke o pravilnoj upotrebi komande
	SendClientMessage(playerid, ADMINFS_MSG_COLOR, "UPOTREBA: /pm [playerid] [poruka]");
	return 1; // Izadji ovde
    }

    // Provera da li je primalac na serveru
    if (!IsPlayerConnected(targetId))
    {
	// Slanje poruke da primalac nije na serveru
	SendClientMessage(playerid, ADMINFS_MSG_COLOR, "Korisnik nije na serveru.");
	return 1; // Izadji ovde
    }

    // Sprecavanje slanja poruke samom sebi
    if (playerid == targetId)
    {
	// Slanje poruke o nemogucnosti slanja poruke samom sebi
        SendClientMessage(playerid, ADMINFS_MSG_COLOR, "Ne mozete poslati sami sebi poruku!");
	return 1; // Izadji ovde
    }

    // Dohvatanje imena igraca
    GetPlayerName(targetId, iName, sizeof(iName)); // Dohvatanje imena primaoca
    GetPlayerName(playerid, pName, sizeof(pName)); // Dohvatanje imena posiljaoca

    // Logovanje poruke sa vremenskim oznakama
    new hours, minutes, seconds, string[256]; // Deklaracija varijabli za vreme i string za log
    new Year, Month, Day; // Deklaracija varijabli za datum
    gettime(hours, minutes, seconds); // Dohvatanje trenutnog vremena
    getdate(Year, Month, Day); // Dohvatanje trenutnog datuma

    // Formatiranje stringa za log
    format(string, sizeof(string), "%d/%d/%d | %02d:%02d:%02d | %s -> %s : %s\r\n",
        Day, Month, Year, hours, minutes, seconds, pName, iName, gMessage);

    // Otvaranje fajla u "append only" modu
    new File:hFile = fopen("PMHistory.log", io_append);

    // Proveri da li je fajl otvoren
    if (hFile)
    {
        // Uspesno otvoren fajl
	fwrite(hFile, string); // Upisivanje loga u fajl
    	fclose(hFile); // Zatvaranje fajla
    }
    else 
    {
	// Greska, vracena nularica, print u konzoli i slanje errora posiljaocu
	print("Nije moguce otvoriti datoteku: \"PMHistory.log\". CMD:pm");
        SendClientMessage(playerid, PM_OUTGOING_COLOR, "Desila se greska prilikom slanja PMa. Obratite se skripteru."); // Slanje poruke
        return 1; // Izadji ovde
    }

    // Formatiranje i slanje odlazne poruke posiljaocu
    format(Message, sizeof(Message), "(( PM poslat %s (ID:%d): %s ))", iName, targetId, gMessage); // Formatiranje poruke
    SendClientMessage(playerid, PM_OUTGOING_COLOR, Message); // Slanje poruke

    // Formatiranje i slanje dolazne poruke primaocu
    format(Message, sizeof(Message), "(( PM od %s (ID:%d): %s ))", pName, playerid, gMessage); // Formatiranje poruke
    SendClientMessage(targetId, PM_INCOMING_COLOR, Message); // Slanje poruke

    // Primaocu se pusta zvuk obavestenja o novoj poruci
    PlayerPlaySound(targetId, 1085, 0.0, 0.0, 0.0);

    return 1; // Izadji ovde
}


Ovo sve moze da se skrati izbacivanjem komentara (ne preporucujem nikad, jer posle mesec dana kad se vratite, samo citate komentare i skontate kod, bez mnogo razmisljanja), upotrebom K&R stajla, posebnom LOG univerzalnom funkcijom. Validacija se moze napisati na drugaciji nacin. Ja najvise volim SCM i return 1; lepo da napisem, kako Bog zapoveda. A vi mozete i ovako, kako vecina i radi:

// Provera i slanje poruke da primalac nije na serveru
if (!IsPlayerConnected(targetId)) return SendClientMessage(playerid, ADMINFS_MSG_COLOR, "Korisnik nije na serveru.");

Fotografija iz igre:


Fotografije unutar LOG datoteke:



Zakljucak
Nadam se da ste naucili nesto novo danas. Ako niste, procitajte i razmislite dobro, ponovo. Hvala na citanju.

Mozete pogledati, takodje, tutorial na malo drugaciji fazon od @Vasic :
https://balkan-samp.com/forum/index.php?topic=124019.msg861980#msg861980
Poslednja Izmena: juče u 13:44:38 POSLE PODNE od Dragi

Jedina zamerka je pawncmd, mogao si staviti zcmd jer je ipak samo include.

Lepo.
HTML / CSS / Javascript / Inspect : Entry Masterclass.
ReactJS / Tailwind CSS / PWA / Axios / SCSS / Redux, ViteJS : Entry Masterclass.
C / C++ / C# / C-objective - kroz Pawn Lang : Entry Masterclass
Grupisano Pravljenje Objekata : Filterscript.


Sta je to web development?
To je nesto ono kao, kako bih to rekao, izgubis volju za zivotom i zelis da se ubijes, ali to je okej.
Onda jednostavno shvatis da si bio glup i resis problem, das sam sebi lajk,
skuvas NES 3u1 i pripremis se za sledeci projekat.

Citat: markosimic poslato juče u 14:00:29 POSLE PODNEJedina zamerka je pawncmd, mogao si staviti zcmd jer je ipak samo include.

Lepo.

Hvalaa. U pravu si.  :D A, mogao sam. Nisam hteo niti jednu biblioteku. Ni pawncmd ni sscanf, vec na suvo, ali da ne bih zbunio ljude s strtok, strval, strlen, strcmp...

Realno, kad bih pravio neku FS s 2-3 komande ukljucujuci i PM, ne bih garant koristio niti jednu biblioteku osim a_samp i gl_common.inc.

Imao sam pawncmd u vec integrisan na serveru, pa zbog toga.
Poslednja Izmena: juče u 14:34:50 POSLE PODNE od Dragi