Skocz do zawartości
Brum Brum

[Poradnik] Cookies

Rekomendowane odpowiedzi

W tym poradniku omówię tzw. ciasteczka, które zapisują nam np. Wybrany TAG w tabeli.
Dla przykładu napiszemy plugin w którym będziemy ustawiać swój TAG w tabeli.

Na początku musimy dodać odpowiednie include'y oraz zdefiniować nasz Handle(uchwyt) do którego będziemy się odwoływać. 

*wymagane*

#include <cstrike>
#include <clientprefs>

Handle g_hClientTag;

Teraz musimy "zarejestrować" nasze ciasteczko w OnPluginStart używając funkcji RegClientCookie, który jako argumenty przyjmuje:
- Nazwa naszego ciasteczka.
- Opis naszego ciasteczka.
- Dostęp naszego ciasteczka.
CookieAccess_Public Jest ciasteczkiem publicznym i każdy gracz może je zmienić za pomocą komeny sm_cookies <nazwa ciasteczka> < wartość>
CookieAccess_Protected Jest ciasteczkiem możliwym tylko do odczytania dla gracza. Gracz nie może go zmienić przy użyciu komendy.
CookieAccess_Private Jest ciasteczkiem ukrytym. Gracz nie może go ani odczytać ani zmienić (nasz plugin oczywiście może :D).

 g_hClientTAG = RegClientCookie("sm_selected_tag", "Zapisuje wybrany przez nas tag", CookieAccess_Protected);

 

W momencie kiedy zreloadujemy plugin, a nie mamy dodanego ponownego wczytania ciasteczek gracz, który wybrał dany TAG musi wybrać go ponownie.
Dlatego zrobimy opcję gdzie w OnPluginStart załadujemy ciasteczka ponownie graczom, którzy są w grze oraz nie są botami

for (int i = 1; i <= MaxClients; i++) {
        if (IsClientInGame(i) && !IsFakeClient(i))
        OnClientCookiesCached(i);
    }

*wymagane*

 

*nie wymagane*
Ostatnią rzeczą, którą zrobimy w OnPluginStart to SetCookieMenuItem, ustawienie tego dodaje nam pod komendę !settings .
Przyjmuje on 3 argumenty:
- Callback do naszego handlera(uchwytu)
- Info
- Tekst pokazany w menu.

 SetCookieMenuItem(TagChangeHandler, 0, "[TAG] Wybierz swój TAG w tabeli");

Po ustawieniu nazwy naszego callbacka oraz nazwy menu możemy robić callbacka
Tego typu callback przyjmuje 5 argumentów:
- Client ( slot gracza )
- CookieMenuAction czyli po prostu akcja jaka zostanie podjęta.
CookieMenuAction_SelectOption po wybraniu opcji
CookieMenuAction_DisplayOption po wyświetleniu opcji
- Info
- Buffer
- maxlength

public void TagChangeHandler(int client, CookieMenuAction action, any info, const char[] buffer, int maxlength)
{
    if (action == CookieMenuAction_SelectOption)ShowTagMenu(client);
}

Od teraz po wpisaniu !settings pojawi nam się również opcja zmienienia ciastekcza i w moim przypadku TAG'u.
*nie wymagane*

 

*wymagane*
Teraz musimy zrobić tak aby przy każdym połączeniu gracza ustawiać mu ciasteczko, które miał wybrane wcześniej
czyli musimy użyć forwarda OnClientCookiesCached, przyjmuje on tylko 1 argument czyli slot gracza ( int client ).
To teraz musimy pobrać ciasteczko, które miał ustawione gracz wcześniej. Użyjemy do tego funkcji GetClientCookie przyjmuje ona 4 argumenty:
- Client ( slot gracza )
- Nasz handle(uchwyt) do którego "zapisywana" jest o tym informacja.
- buffer do którego zapiszemy to co nam zwróci funkcja
- maxlength ( maksymalna wielkość naszego buffer'a )
Po pobraniu ciasteczka ustawiamy graczowi na tą wartość.

public void OnClientCookiesCached(int client)
{
    char value[16];
    GetClientCookie(client, g_hClientTag, value, sizeof(value));
    g_iClientTag[client] = StringToInt(value);
}

Mamy już nasze ciasteczko wiemy jak je "zarejestrować", pobrać i ustawić teraz czas na zapisywanie.
Aby zapisać nasze ciasteczko użyjemy funkcji SetClientCookie, przyjmuje ona 3 argumenty:
- Client ( slot gracza )
- Nasz handle(uchwyt)
- Wartość
Wartość ta nie jest INT'em tylko stringiem, dlatego zanim przekażemy INT'a musimy zamienić go na string używając funkcji IntToString, która przyjmuje 3 argument:
- Liczbę, którą chcemy dać do stringa
- Buffer w którym będzie się znajdować nasza liczba
- Wielkość naszego buffer'u 

char value[16];
IntToString(2,value,sizeof(value));

W moim przypadku nie będzie to nie potrzebne, ponieważ pobieram wartość z menu gdzie jest już jako string.

SetClientCookie(client, g_hClientTag, info);

*wymagane*

Plugin, który powstał przy poradniku:
 

Spoiler

#include <cstrike>
#include <clientprefs>

Handle g_hClientTag;

char g_sTags[][] = 
{
	"", 
	"[Testowy TAG]", 
	"[-VIP-]", 
	"testowy tag", 
	"Test", 
	"[JD]", 
	"[JPSM]", 
	"[#JJM]", 
};

int g_iClientTag[MAXPLAYERS + 1];

public void OnPluginStart()
{
	HookEvent("player_spawn", Event_PlayerSpawn);
	RegConsoleCmd("sm_tag", CMD_Tag);
	g_hClientTag = RegClientCookie("sm_selected_tag", "Zapisuje wybrany przez nas tag", CookieAccess_Protected);
	for (int i = 1; i <= MaxClients; i++) {
		if (IsClientInGame(i) && !IsFakeClient(i))
			OnClientCookiesCached(i);
	}
	SetCookieMenuItem(TagChangeHandler, 0, "[TAG] Wybierz swój TAG w tabeli");
}

public void OnClientCookiesCached(int client)
{
	char value[16];
	GetClientCookie(client, g_hClientTag, value, sizeof(value));
	g_iClientTag[client] = StringToInt(value);
}

public void TagChangeHandler(int client, CookieMenuAction action, any info, const char[] buffer, int maxlength)
{
	if (action == CookieMenuAction_SelectOption)ShowTagMenu(client);
}

public Action Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast)
{
	int client = GetClientOfUserId(event.GetInt("userid"));
	if (g_iClientTag[client] <= 0)return Plugin_Continue;
	
	CS_SetClientClanTag(client, g_sTags[g_iClientTag[client]]);
	return Plugin_Continue;
}

public Action CMD_Tag(int client, int args)
{
	ShowTagMenu(client);
}

void ShowTagMenu(int client)
{
	if (!IsClientInGame(client) || IsFakeClient(client))return;
	Menu menu = new Menu(Select_Tag_Handler);
	menu.SetTitle("[TAG] Wybierz swój TAG!");
	menu.AddItem("0", "Wyłącz TAG");
	for (int i = 1; i < sizeof(g_sTags); i++) {
		char buffer[32], id[16];
		Format(buffer, sizeof(buffer), "%s", g_sTags[i]);
		Format(id, sizeof(id), "%d", i);
		menu.AddItem(id, buffer);
	}
	menu.ExitButton = true;
	menu.Display(client, 60);
}

public int Select_Tag_Handler(Menu menu, MenuAction action, int client, int item)
{
	if (!IsClientInGame(client) || IsFakeClient(client))return;
	
	if (action == MenuAction_Select) {
		char info[32];
		menu.GetItem(item, info, sizeof(info));
		int id = StringToInt(info);
		g_iClientTag[client] = id;
		CS_SetClientClanTag(client, g_sTags[g_iClientTag[client]]);
		SetClientCookie(client, g_hClientTag, info);
	}
	if (action == MenuAction_End)delete menu;
}

 

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Przy wczytaniu pluginu gdzie jest pętla po graczach i wczytanie ich ciasteczek wypadałoby sprawdzić jeszcze czy AreClientCookiesCached 😄

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić obrazków. Dodaj lub załącz obrazki z adresu URL.


×
×
  • Dodaj nową pozycję...