Skocz do zawartości

Rekomendowane odpowiedzi

  • Lubię to! 4

O Pluginie:

  • Plugin umożliwia odebranie darmowego VIP'a na określony czas.
  • Flagi ustawia się w AddUserFlags oraz RemoveUserFlags

 

Komendy:

  • !freevip
  • !fv

 

Kod:

Spoiler
/******* [ ChangeLog ] *******

	1.0 - Pierwsze wydanie pluginu.
	1.1 - Naprawienie kilku błędów.
	1.2 - Poprawa kodu.

******** [ ChangeLog ] *******/

/* [ Includes ] */
#include <sourcemod>
#include <sdktools>
#include <clientprefs>
#include <multicolors>

/* [ Compiler Options ] */
#pragma newdecls required
#pragma semicolon 1

/* [ Defines ] */
#define PluginTag "{darkred}[ {lightred}★{darkred} FreeVip {lightred}★ {darkred}]{default}"

/* [ ConVars ] */
ConVar g_cvFreeVipTime;
ConVar g_cvFreeVipForAll;
ConVar g_cvFreeVipTimeStart;
ConVar g_cvFreeVipTimeEnd;

/* [ Handles ] */
Handle g_hCookie;
Handle g_hTimer;

/* [ Integers ] */
int g_iFreeVipTime[MAXPLAYERS + 1];

/* [ Booleans ] */
bool g_bFreeVip[MAXPLAYERS + 1];

/* [ Plugin Author and Information ] */
public Plugin myinfo =
{
	name = "[CS:GO] FreeVip",
	author = "Yamakashi",
	description = "Plugin pozwala na odebranie FreeVipa na określony czas.",
	version = "1.2",
	url = "https://steamcommunity.com/id/yamakashisteam"
};

/* [ Plugin Startup ] */
public void OnPluginStart()
{
	/* [ Commands ] */
	RegConsoleCmd("sm_freevip", FreeVip_CMD, "[FreeVip] Odebranie FreeVipa.");
	RegConsoleCmd("sm_fv", FreeVip_CMD, "[FreeVip] Odebranie FreeVipa.");

	/* [ ConVars ] */
	g_cvFreeVipTime = CreateConVar("sm_freevip_time", "60", "[FreeVip] Czas na jaki ma być odebrany FreeVip");
	g_cvFreeVipForAll = CreateConVar("sm_freevip_enable", "1", "[FreeVip] Czy w godzinach X-Y ma być FreeVip dla wszystkich?");
	g_cvFreeVipTimeStart = CreateConVar("sm_freevip_time_start", "22", "[FreeVip] Od której godziny ma zaczynać się FreeVip?");
	g_cvFreeVipTimeEnd = CreateConVar("sm_freevip_time_end", "9", "[FreeVip] Do której godziny ma być FreeVip?");
	
	/* [ Cookies ] */
	g_hCookie = RegClientCookie("yamakashi_freevip", "", CookieAccess_Private);
	
	/* [ Hooks ] */
	HookEvent("player_spawn", Event_PlayerSpawn);
	
	/* [ Timers ] */
	CreateTimer(60.0, PluginAuthor, _, TIMER_FLAG_NO_MAPCHANGE);
	
	/* [ Check Player ] */
	for(int i = 1; i <= MaxClients; i++)
		if(IsValidClient(i))
			OnClientCookiesCached(i);	
}

/* [ Standart Actions ] */
public void OnMapStart()
{
	g_hTimer = CreateTimer(60.0, RemoveTime, _, TIMER_REPEAT);
	CreateTimer(30.0, AddFreeVipFlags, _, TIMER_FLAG_NO_MAPCHANGE);
	AutoExecConfig(true, "Yamakashi_FreeVip", "yPlugins");
}

public void OnMapEnd()
{
	KillTimer(g_hTimer, false);
	g_hTimer = INVALID_HANDLE;
}

public void OnClientPostAdminCheck(int client)
{
	if(g_iFreeVipTime[client] > 0)
	{
		AddUserFlags(client, Admin_Reservation, Admin_Custom1);
		g_bFreeVip[client] = true;
	}
	else
		g_bFreeVip[client] = false;
}	

public void OnClientDisconnect(int client)
{
	if(IsClientInGame(client))
		if(AreClientCookiesCached(client))
		{
			char sTimeLeft[4];
			Format(sTimeLeft, sizeof(sTimeLeft), "%d", g_iFreeVipTime[client]);
			SetClientCookie(client, g_hCookie, sTimeLeft);
		}
	g_bFreeVip[client] = false;
	g_iFreeVipTime[client] = 0;
}

public void OnClientCookiesCached(int client)
{
	char sTimeLeft[4];
	GetClientCookie(client, g_hCookie, sTimeLeft, sizeof(sTimeLeft));
	g_iFreeVipTime[client] = StringToInt(sTimeLeft);
}

/* [ Commands ] */
public Action FreeVip_CMD(int client, int args)
{	
	if(g_iFreeVipTime[client] == -1)
	{
		CPrintToChat(client, "%s {lightred}Nie możesz użyć tej komendy, ponieważ wykorzystałeś już {darkred}FreeVipa{lightred}.", PluginTag);
		return Plugin_Handled;
	}
	
	if(0 < g_iFreeVipTime[client])
	{
		CPrintToChat(client, "%s {lightred}Już posiadasz {darkred}FreeVipa{lightred}. Pozostały czas FreeVipa to {darkred}%d{lightred} minut.", PluginTag, g_iFreeVipTime[client]);
		return Plugin_Handled;
	}
	
	g_iFreeVipTime[client] = g_cvFreeVipTime.IntValue;
	AddUserFlags(client, Admin_Reservation, Admin_Custom1);
	g_bFreeVip[client] = true;
	
	CPrintToChatAll("{orange}╔═══════════ FreeVip ═══════════╗");
	CPrintToChatAll("{orange}» {lightred}%N{lime} właśnie aktywował {lightred}FreeVipa{lime}.", client);
	CPrintToChatAll("{orange}╚═══════════ FreeVip ═══════════╝");

	CPrintToChat(client, "%s {green}Gratulacje! {lime}Właśnie aktywowałeś {lightred}FreeVipa{lime}.", PluginTag);
	return Plugin_Continue;
}

/* [ Timers ] */
public Action RemoveTime(Handle timer)
{
	if(timer == g_hTimer)
		for(int i = 1; i <= MaxClients; i++)
			if(IsValidClient(i))
				if(0 < g_iFreeVipTime[i])
				{
					g_iFreeVipTime[i]--;
					if(g_iFreeVipTime[i] == 0)
					{	
						g_iFreeVipTime[i] = -1;
						g_bFreeVip[i] = false;
						RemoveUserFlags(i, Admin_Reservation, Admin_Custom1);
						CPrintToChatAll("%s {lime}Graczowi {lightred}%N{lime} właśnie skończył się {lightred}FreeVip{lime}.", PluginTag, i);
						CPrintToChatAll("%s {lime}Aby odebrać {lightred}FreeVipa{lime} należy użyć komendy {lightred}!freevip{lime} lub {lightred}!fv{lime}.", PluginTag);
					}
				}
}

public Action PluginAuthor(Handle timer)
{
	CPrintToChatAll("%s {lightred}Plugin{lime} został napisany przez {lightred}Yamakashiego{lime}.", PluginTag);
	CreateTimer(60.0, PluginAuthor, _, TIMER_FLAG_NO_MAPCHANGE);
}

public Action AddFreeVipFlags(Handle timer)
{
	for(int i = 1; i <= MaxClients; i++)
		if(IsValidClient(i))
			if(g_bFreeVip[i])
				if(g_iFreeVipTime[i] > 0)
					AddUserFlags(i, Admin_Reservation, Admin_Custom1);

	CreateTimer(30.0, AddFreeVipFlags, _, TIMER_FLAG_NO_MAPCHANGE);
}

/* [ Events ] */
public Action Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast)
{
	int client = GetClientOfUserId(event.GetInt("userid"));
	if(!IsValidClient(client)) return Plugin_Continue;
		
	int start_hour = g_cvFreeVipTimeStart.IntValue;
	int end_hour = g_cvFreeVipTimeEnd.IntValue;
	
	if(g_cvFreeVipForAll.BoolValue)
	{
		if(start_hour || end_hour)
		{
			char sHour[8];
			FormatTime(sHour, sizeof(sHour), "%H", GetTime());
			int hour = StringToInt(sHour);
			if(start_hour > end_hour)
			{
				if(hour > start_hour || hour < end_hour)
				{
					if(!g_bFreeVip[client])
						AddUserFlags(client, Admin_Reservation, Admin_Custom1);
				}
				else if(hour < start_hour && hour > end_hour)
					if(!g_bFreeVip[client])
						RemoveUserFlags(client, Admin_Reservation, Admin_Custom1);
			}					
		}
	}
		
	return Plugin_Continue;
}

/* [ Helpers ] */
stock bool IsValidClient(int client)
{
	if(client <= 0 ) return false;
	if(client > MaxClients) return false;
	if(!IsClientConnected(client)) return false;
	if(IsFakeClient(client)) return false;
	return IsClientInGame(client);
}

 

 

Instalacja:

  • Plik .smx wrzucić do: addons/sourcemod/plugins/
  • Plik .sp wrzucić do: addons/sourcemod/scripting/
  • Plik .cfg wrzucić do: cfg/yPlugins/ 

 

Download:

 

 

Edytowane przez Yamakashi

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie powinieneś nadawaj nazwy cookisa „VIP by Yamakashi”, cookisy bazują na bazie danych a nazwa cookisa to przy okazji jego identyfikator w komunikacja serwer -> mysql/sqlite3

to pro tip do update’a

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dzięki za uwagę, wrzuciłem już update to głównego tematu. Przy okazji naprawiłem kilka błędów.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
public void OnMapStart()
{
	g_hTimer = CreateTimer(60.0, RemoveTime, _, TIMER_REPEAT);
	AutoExecConfig(true, "Yamakashi_FreeVip", "yPlugins");
}

Co mapę wywołuje timer i nigdy go nie zatrzymuje w rezultacie możesz mieć 1000 timerów odpalonych

Flaga potrzebna to: TIMER_FLAG_NO_MAPCHANGE

 

public void OnClientPutInServer(int client)
{
	if(IsPlayerVIP(client))
		g_bBoughtVip[client] = true;

Sprawdzanie tu czy ktoś ma VIP'a jest bezsensu. Funkcja wywołuje się przed wczytaniem admins.cfg

Funkcja odpowiednia do tego zagrania to:

public void OnClientPostAdminCheck(int client)

 

W ogóle w pluginie nie ma funkcji dodającej minuty przegrane coś typu aby dodawało do końca vip'a np. timer co 1min

np.

 g_iFreeVipTime[client]++;

Ale za to nie zapomniałeś o reklamie :v

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ogólnie jestem leniwy, dlatego mi się nie chciało pisać pluginu na to dlatego wykorzystałem gotowca, a że Yama miał wysokie rangi u mnie, myślałem, że plugin będzie dobry.

Napisałem FreeVIP'a w 30min, 30mion testowania z poprawkami

Ogólnie bez mojego menadżera areny nie skompilujecie i Niebędzinie wam działał plugin jak i nie ma cvrarów, dlatego dam tutaj wskazówki:

w pliku FreeVIP.sp wywalcie:

#include <xinfo>

W pliku FreeVIP/natives.sp możecie regulować czas na ile ma by7ć VIP: 

int TimeForVIP = 60;

W pliku FreeVIP/night.sp zmieniacie w jakich godzinach ma być VIP w nocy, u mnie 23-8

int godzina = StringToInt(godzina_str),
	odgodziny = 23,
	dogodziny = 8;

Wszędzie gdzie jest AddUserFlags ustawiacie flagi jakie chcecie, u mnie jest a, o, t, r, s, q, p

Oraz IPrintToChat na jakie printy chcecie, czy zwykle PrintToChat, czy dodacie biblioteke i CPrintToChat, jak wolicie.

 

Musicie zmienić funkcję

public Action AdminReload(int client)

Na jakiś timer, który będzie co 30s, bo to jest z mojego menadżera

 

Ogólnie kod nie jest jakiś profesjonalny, ale jest funkcjonalny i bez reklam swojej osoby :v

 

Dziękuje za uwagę, nie zobaczycie mnie tu pewnie nigdy więcej.

FreeVIP.zip
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
3 godziny temu, xBonio napisał:

Co mapę wywołuje timer i nigdy go nie zatrzymuje w rezultacie możesz mieć 1000 timerów odpalonych

 

public void OnMapEnd()
{
	KillTimer(g_hTimer, false);
	g_hTimer = INVALID_HANDLE;
}

 

3 godziny temu, xBonio napisał:

W ogóle w pluginie nie ma funkcji dodającej minuty przegrane coś typu aby dodawało do końca vip'a np. timer co 1min

 

Co do tego nwm dlaczego tak to ustawiłem, ale najprawdopodobniej to zwykła pomyłka w miejscu:

if(timer == g_hTimer)
		for(int i = 1; i <= MaxClients; i++)
			if(IsValidClient(i))
				if(0 < g_iFreeVipTime[i])
				{
					g_iFreeVipTime[i] -= 1;

docelowo miało być:

if(timer == g_hTimer)
		for(int i = 1; i <= MaxClients; i++)
			if(IsValidClient(i))
				if(0 < g_iFreeVipTime[i])
				{
					g_iFreeVipTime[i]--;

 

3 godziny temu, xBonio napisał:

Sprawdzanie tu czy ktoś ma VIP'a jest bezsensu. Funkcja wywołuje się przed wczytaniem admins.cfg

 

Dziękuję za uwagę, na pewno to poprawię ;) Nikt z nas nie jest perfekcyjny.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ten plugin gdzieś zapisuję kto użył Vip'a a kto nie? jakoś w bazie mysql? bo go wgrałem ale jak się zmieni mapa lub zrestartuję serwer to wtedy od nowa mogą wpisać

 

P.S. zielony w tych sprawach jestem

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

U mnie plugin działał niezawodnie, wszystko zapisuje się w ciasteczkach.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@Yamakashi + dla ciebie za plugin i mam pytanie komendy freevip można użyć tylko raz i ani razu więcej czy kilka razy ?
A i czy jeśli bym dodał także sam plik FreeVIP/night.sp od @xBonio to by działał sam vip nocny? 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
1 godzinę temu, KOMORNIK napisał:

@Yamakashi + dla ciebie za plugin i mam pytanie komendy freevip można użyć tylko raz i ani razu więcej czy kilka razy ?
A i czy jeśli bym dodał także sam plik FreeVIP/night.sp od @xBonio to by działał sam vip nocny? 

Możesz użyć tej komendy tylko raz. W tym pluginie masz nocnego VIP'a, więc możesz go użyć, jeżeli użyjesz pluginu @xBonio to w tym pluginie możesz wyłączyć tą opcję.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
4 godziny temu, kubraczekk napisał:

Chciałem ustawić na 7 dni / 10080 minut. Niestety daje na ~95 minut, nie da się na tak długo, tak?

Zapewne ustawia plugin w sekundach, ustawiłeś na 98 minut, wpisz: 604800

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
47 minut temu, Nikita Chruszczow napisał:

Zapewne ustawia plugin w sekundach, ustawiłeś na 98 minut, wpisz: 604800

W minutach jest, coś źle wpisałem wcześniej najwyraźniej ale już działa, dzięki!

 

Usunąłem wiadomość "Plugin został napisany przez Yamakashi", co 60 sekund taka informacja, umie wkurzyć, sorry

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Cześć. Używam tego pluginu dłuższy czas. Dzięki.

Teraz mam pytanie, co musiałbym zrobić, żeby zresetować wszystkie osoby, które już wykorzystały darmowego vipa tak, aby mogły skorzystać z tego jeszcze raz?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jest jakaś szybka instrukcja żeby to ogarnąć? Bo nie korzystałem z tego programu niestety.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
17 godzin temu, KoOsTeK napisał:

Jest jakaś szybka instrukcja żeby to ogarnąć? Bo nie korzystałem z tego programu niestety.

FreeVip jest wrzucony do generatora paczek. Jeśli jest wymagana jakaś akcja, dostaniesz instrukcje po pobraniu

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dzięki Magnet ale chodziło mi o instrukcję do programu, który wstawił @Paweł czyli DB Browser (SQLite)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

A gdzie ustawić zeby dodac vipa na flage "o" ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
W dniu 27.04.2020 o 22:59, Lyyu napisał:

A gdzie ustawić zeby dodac vipa na flage "o" ?

  • Flagi ustawia się w AddUserFlags oraz RemoveUserFlags

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Cześć mam małe pytanko @Paweł chyba, że ktoś inny jest w stanie pomóc mi to rozwiązać, Gdy osoba używa np !fv dostaje vipa wszystko spoko skończy się czas FV i wszystko jest git lecz posiada dalej double jumpa, dopiero restart serwera pomaga, zmiana mapy też nie pomaga :/ i nie wiem co jest nie tak 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Próbowałeś użyć innego pluginu 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
1 godzinę temu, Shadow napisał:

Cześć mam małe pytanko @Paweł chyba, że ktoś inny jest w stanie pomóc mi to rozwiązać, Gdy osoba używa np !fv dostaje vipa wszystko spoko skończy się czas FV i wszystko jest git lecz posiada dalej double jumpa, dopiero restart serwera pomaga, zmiana mapy też nie pomaga :/ i nie wiem co jest nie tak 

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Godzinę temu, y0ung napisał:

Próbowałeś użyć innego pluginu 

tzn ogólnie, korzystamy  z tego pluginu na 2 serwerach, na jednym serwerze normalnie to dział (przynajmniej nie było skargi na to)a a na drugim DJ nie zabiera po skonczeniu się vipa, widzę też, że jest wersja 1.3 tego pluginu to może zadziała jak skompiluje więc zaraz dam znać :KEKW:

 

nvm już, mam inny plugin po prostu :/

Edytowane przez Shadow

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ę...