Skocz do zawartości
-Gamer-

[ROZWIĄZANE] Dodanie do pluginu ograniczenia używania komendy

Rekomendowane odpowiedzi

Witam,

Tak jak w temacie chciałbym dodać do pluginu ograniczenie używania komendy np co 2 rundy to jest około 60sek ponieważ 1 arenka trwa 30sek

Plugin do którego chciałbym dodać ograniczenie używania komendy:

https://github.com/KewaiiGamer/Store-Roulette
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!

 

Tutaj mam już gotowy kod ale gdy dodaję go do pluginu przy kompilacji wyrzuca mi błąd

Spoiler

float OstatnieUzycie[MAXPLAYERS + 1];
ConVar delay;

public void OnPluginStart()
{
    RegConsoleCmd("sm_czesc", test123);
    
    delay = CreateConVar("delay", "30", "Cos sada");
}



public void OnClientPutInServer(int client) {

    OstatnieUzycie[client] = GetGameTime();

}

public Action test123 (int client, int args)
{
    if(OstatnieUzycie[client] + GetConVarFloat(delay) > GetGameTime())
    {
        ReplyToCommand(client, "Musisz odczekac 30 sekund, przed ponownym użyciem tej komendy!");
        /// %s czasu jaki pozostal przed uzyciem ponownie komendy RoundFloat((OstatnieUzycie[client] + RoundFloat(GetConVarFloat(delay))) - RoundFloat(GetGameTime())));
        return Plugin_Handled;
    }
    
    /// Tutaj Twoj KOD
    
    return Plugin_Continue;
}

 

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Hej! Kod wygląda w miarę dobrze, podrzuć jeszcze zmodyfikowany plugin do którego to wstawiłeś i będziemy mogli spojrzeć na te errory ? 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Spoiler

#pragma semicolon 1
#include <csgocolors>
#include <store>
#pragma newdecls required

float OstatnieUzycie[MAXPLAYERS + 1];
int ScrollTimes[MAXPLAYERS + 1];
int WinNumber[MAXPLAYERS + 1];
int betAmount[MAXPLAYERS + 1];
bool isSpinning[MAXPLAYERS + 1] = false;

ConVar delay;
ConVar g_Cvar_NormalItems;
ConVar g_Cvar_VIPItems;
ConVar g_Cvar_VIPFlag;

char g_sNormalItems[64];
char g_sVIPItems[64];
#define PLUGIN_NAME "Store Roulette by Kewaii"
#define PLUGIN_AUTHOR "Kewaii"
#define PLUGIN_DESCRIPTION "Zephyrus Store Roulette"
#define PLUGIN_VERSION "1.3.9"
#define PLUGIN_TAG "{pink}[Roulette by Kewaii]{green}"

public Plugin myinfo =
{
    name        =    PLUGIN_NAME,
    author        =    PLUGIN_AUTHOR,
    description    =    PLUGIN_DESCRIPTION,
    version        =    PLUGIN_VERSION,
    url            =    "http://steamcommunity.com/id/KewaiiGamer"
};

public void OnPluginStart()
{	
	g_Cvar_VIPFlag = CreateConVar("kewaii_roulette_vip_flag", "a", "VIP Access Flag");
	g_Cvar_NormalItems = CreateConVar("kewaii_roulette_normal_items", "50,100,250,500", "Lists all the menu items for normal player roulette. Separate each item with a comma. Only integers allowed");
	g_Cvar_VIPItems = CreateConVar("kewaii_roulette_vip_items", "1000,2500,5000,10000", "Lists all the menu items for VIP player roulette. Separate each item with a comma. Only integers allowed");
	RegConsoleCmd("sm_ruletka", CommandRoulette);
	delay = CreateConVar("delay", "30", "Ostatnie");
	LoadTranslations("kewaii_roulette.phrases");
	AutoExecConfig(true, "kewaii_roulette");
}

public void OnClientPostAdminCheck(int client)
{
	isSpinning[client] = false;
}

public void OnClientPutInServer(int client)
 {
    Ostatnie[client] = GetGameTime();
 }

public Action CommandRoulette(int client, int args)
{
	if(OstatnieUzycie[client] + GetConVarFloat(delay) > GetGameTime())
    {
        ReplyToCommand(client, "Musisz odczekac 30 sekund, przed ponownym użyciem tej komendy!");
        /// %s czasu jaki pozostal przed uzyciem ponownie komendy RoundFloat((OstatnieUzycie[client] + RoundFloat(GetConVarFloat(delay))) - RoundFloat(GetGameTime())));
        return Plugin_Handled;
    }
	if (client > 0 && args < 1)
	{		
		CreateRouletteMenu(client).Display(client, 10);	
	}
	return Plugin_Handled;
}

Menu CreateRouletteMenu(int client)
{
	Menu menu = new Menu(RouletteMenuHandler);
	char buffer[128];
	Format(buffer, sizeof(buffer), "%T", "ChooseType", client);
	menu.SetTitle(buffer);	
	menu.AddItem("player", "Player");
	menu.AddItem("vip", "VIP", !HasClientVIP(client) ? ITEMDRAW_DISABLED : ITEMDRAW_DEFAULT);		
	return menu;
}

public int RouletteMenuHandler(Menu menu, MenuAction action, int client, int selection)
{
	switch(action)
	{
		case MenuAction_Select:
		{
			if(IsClientInGame(client))
			{
				char option[32];
				menu.GetItem(selection, option, sizeof(option));
				if (StrEqual(option, "player"))
				{
					CreatePlayerRouletteMenu(client).Display(client, MENU_TIME_FOREVER);
				}
				if (StrEqual(option, "vip"))
				{
					CreateVIPRouletteMenu(client).Display(client, MENU_TIME_FOREVER);
				}
			}
		}
		case MenuAction_End:
		{
			delete menu;
		}
	}
}


Menu CreatePlayerRouletteMenu(int client)
{
	Menu menu = new Menu(CreditsChosenMenuHandler);
	char buffer[128];
	Format(buffer, sizeof(buffer), "%T", "ChooseCredits", client, Store_GetClientCredits(client));
	menu.SetTitle(buffer);	
	GetConVarString(g_Cvar_NormalItems, g_sNormalItems, sizeof(g_sNormalItems));
	char sItems[18][16];
	ExplodeString(g_sNormalItems, ",", sItems, sizeof(sItems), sizeof(sItems[]));
	for (int i = 0; i < sizeof(sItems); i++) {
		if (!StrEqual(sItems[i], "")) {
			menu.AddItem(sItems[i], sItems[i], Store_GetClientCredits(client) >= StringToInt(sItems[i]) ? ITEMDRAW_DEFAULT : ITEMDRAW_DISABLED);	
		}
	}
	menu.ExitBackButton = true;
	return menu;
}


Menu CreateVIPRouletteMenu(int client)
{
	Menu menu = new Menu(CreditsChosenMenuHandler);
	char buffer[128];		
	Format(buffer, sizeof(buffer), "%T", "ChooseCredits", client, Store_GetClientCredits(client));
	menu.SetTitle(buffer);	
	GetConVarString(g_Cvar_VIPItems, g_sVIPItems, sizeof(g_sVIPItems));
	char sItems[18][16];
	ExplodeString(g_sVIPItems, ",", sItems, sizeof(sItems), sizeof(sItems[]));
	for (int i = 0; i < sizeof(sItems); i++) {
		if (!StrEqual(sItems[i], "")) {
			menu.AddItem(sItems[i], sItems[i], Store_GetClientCredits(client) >= StringToInt(sItems[i]) ? ITEMDRAW_DEFAULT : ITEMDRAW_DISABLED);	
		}
	}
	menu.ExitBackButton = true;
	return menu;
}

public int CreditsChosenMenuHandler(Menu menu, MenuAction action, int client, int selection)
{
	switch(action)
	{
		case MenuAction_Select:
		{
			if(IsClientInGame(client))
			{
				char option[32];
				menu.GetItem(selection, option, sizeof(option));
								
				int crd = Store_GetClientCredits(client);
				int bet = StringToInt(option);
				if(crd >= bet)
				{
					if (!isSpinning[client])
					{
						Store_SetClientCredits(client, crd - bet);
						betAmount[client] = bet;
						SpinCredits(client);
						isSpinning[client] = true;
					}
					else
					{
						CPrintToChat(client, "%s %t", PLUGIN_TAG, "AlreadySpinning");
					}
				} 
				else
				{
					CPrintToChat(client, "%s %t", PLUGIN_TAG,  "NoEnoughCredits", bet - crd);
				}
			}
		}
		case MenuAction_Cancel:
		{
			if (IsClientInGame(client) && selection == MenuCancel_ExitBack)
			{
				CreateRouletteMenu(client).Display(client, 10);
			}
		}
		case MenuAction_End:
		{
			delete menu;
		}
	}
}

public void SpinCredits(int client)
{
	int	FakeNumber = GetRandomInt(0,999);
	PrintHintText(client, "<font color='#ff0000'>[Credits Roulette]</font><font color='#00ff00'> Number:</font><font color='#0000ff'> %i", FakeNumber);
	if(ScrollTimes[client] == 0)
	{
		ClientCommand(client, "playgamesound *ui/csgo_ui_crate_open.wav");
	}
	if(ScrollTimes[client] < 20)
	{
		CreateTimer(0.05, TimerNext, client);
		ScrollTimes[client] += 1;
		ClientCommand(client, "playgamesound *ui/csgo_ui_crate_item_scroll.wav");
	} 
	else if(ScrollTimes[client] < 30)
	{
		float AddSomeTime = 0.05 * ScrollTimes[client] / 3;
		CreateTimer(AddSomeTime, TimerNext, client);
		ScrollTimes[client] += 1;
		ClientCommand(client, "playgamesound *ui/csgo_ui_crate_item_scroll.wav");
	}
	else if(ScrollTimes[client] == 30)
	{
		int troll = GetRandomInt(1,2);
		if(troll == 1)
		{
			ClientCommand(client, "playgamesound *ui/csgo_ui_crate_item_scroll.wav");
			ScrollTimes[client] += 1;
			CreateTimer(1.5, TimerNext, client);
		}
		else
		{
			ClientCommand(client, "playgamesound *ui/csgo_ui_crate_item_scroll.wav");
			CreateTimer(1.5, TimerFinishing, client);
			WinNumber[client] = FakeNumber;
			ScrollTimes[client] = 0;
		}
	} 
	else
	{
		ClientCommand(client, "playgamesound *ui/csgo_ui_crate_item_scroll.wav");
		CreateTimer(1.5, TimerFinishing, client);
		WinNumber[client] = FakeNumber;
		ScrollTimes[client] = 0;
	}
}

public Action TimerFinishing(Handle timer, any client)
{
	if (IsClientInGame(client))
	{
		isSpinning[client] = false;
		WinCredits(client, WinNumber[client], betAmount[client]);
	}
}

public void WinCredits(int client, int Number, int Bet)
{
	if(IsClientInGame(client))
	{
		CPrintToChatAll("%s %t", PLUGIN_TAG, "WinNumber", client, Number);		
		int multiplier;
		if(Number == 0)
		{
			multiplier = 25;
			ClientCommand(client, "playgamesound *ui/item_drop6_ancient.wav");
		}
		else if(Number > 0 && Number < 500)
		{
			multiplier = -1;
			ClientCommand(client, "playgamesound music/skog_01/lostround.mp3");
			CPrintToChatAll("%s %t", PLUGIN_TAG, "YouLost", client, Bet);
		}
		else if(Number >= 500 && Number < 600)
		{			
			multiplier = 0;
			ClientCommand(client, "playgamesound *ui/item_drop1_common.wav");
			CPrintToChatAll("%s %t", PLUGIN_TAG, "NoLoseNoWin", client);
		} 
		else if(Number >= 600 && Number < 750)
		{
			multiplier = 1;
			ClientCommand(client, "playgamesound *ui/item_drop2_uncommon.wav");
		}
		else if(Number >= 750 && Number < 850)
		{
			multiplier = 2;
			ClientCommand(client, "playgamesound *ui/item_drop2_uncommon.wav");
		} 
		else if(Number >= 850 && Number < 925)
		{
			multiplier = 3;
			ClientCommand(client, "playgamesound *ui/item_drop3_rare.wav");
		}
		else if(Number >= 925 && Number < 965)
		{			
			multiplier = 4;
			ClientCommand(client, "playgamesound *ui/item_drop3_rare.wav");
		} 
		else if(Number >= 965 && Number < 995)
		{
			multiplier = 5;
			ClientCommand(client, "playgamesound *ui/item_drop3_rare.wav");
		}
		else if(Number >= 995 && Number < 997)
		{
			multiplier = 10;
			ClientCommand(client, "playgamesound *ui/item_drop3_rare.wav");
		} 
		else if(Number >= 997 && Number < 999)
		{
			multiplier = 15;
			ClientCommand(client, "playgamesound *ui/item_drop3_rare.wav");
		} 
		else if(Number == 999)
		{
			multiplier = 20;
			ClientCommand(client, "playgamesound *ui/item_drop6_ancient.wav");
		} 	
		if (multiplier > 0)
		{	
			CPrintToChatAll("%s %t", PLUGIN_TAG, "YouWin", client, Bet * multiplier, multiplier);
			Store_SetClientCredits(client, Store_GetClientCredits(client) + Bet * (multiplier + 1));
		}
	}
}

public Action TimerNext(Handle timer, any client)
{
	if (IsClientInGame(client))
	{
		SpinCredits(client);
	}
}

public bool HasClientVIP(int client)
{
	char ConVarValue[32];
	GetConVarString(g_Cvar_VIPFlag, ConVarValue, sizeof(ConVarValue));
	int flag = ReadFlagString(ConVarValue);
	return CheckCommandAccess(client, "", flag, true);
	
}
return Plugin_Continue;
}

 

 

A to błąd, który dostaje przy kompilacji

 

 kewaii_roulette.sp
//
// kewaii_roulette.sp(47) : error 076: syntax error in the expression, or invalid function call
// kewaii_roulette.sp(47) : error 029: invalid expression, assumed zero
// kewaii_roulette.sp(47) : error 029: invalid expression, assumed zero
// kewaii_roulette.sp(47) : fatal error 189: too many error messages on one line
//
// Compilation aborted.
// 4 Errors.

 

Pewnie gdzieś coś w złe miejsce wstawiłem i dlatego jest problem ?

Edytowane przez -Gamer-

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

W tej linii znajduje się kod:

public void OnClientPutInServer(int client)
{
    Ostatnie[client] = GetGameTime();
}

Który wygląda dobrze. Jednakże, "Ostatnie" nie jest nigdzie zdeklarowane pewnie chodziło o "OstatnieUzycie". Zmieniłem nazwę zmiennej, ale błąd nadal występował. Co dziwne, gdy przepisałem linijkę z błędem ręcznie, wszystko zaczęło śmigać. Jak widać na screenie, kompilator reaguje tylko na oryginalną linijkę, jednak na moją przepisaną nie.

image.png.d745c90e04740fe31a6c2f8d80f185b8.png

? Śmieszna sytuacja. Zapewne jakiś niewidoczny znaczek się tam wkradł.

 

Poza tym, na samym końcu kodu znajdują się 2 linijki które nie są do niczego potrzebne:

return Plugin_Continue;
}

 

Po poprawieniu tych błędów wszystko śmiga. Załączam pliczek do ściągnięcia - ruletka.sp
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

Kurcze plugin działa, ale blokada nie działa tak jak bym tego chciał ?

Plugin blokuje komendę przez pierwsze 60sek po upływie 60sek można używać komendy do woli a ja chciałbym by można jej używać raz na 60sek czyli co 2 rund.

Była by możliwość to poprawić ? @Vasto_Lorde

Edytowane przez -Gamer-

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jak widzisz w danym kodzie, za aktualizacje kiedy ostatni raz gracz używał komendy odpowiada linia

Ostatnie[client] = GetGameTime();

W Twoim kodzie, jest ona ustawiona tylko i wyłącznie przy połączeniu gracza z serwerem, czyli tu:

public void OnClientPutInServer(int client)

Więc jeśli będziesz aktualizował czas tylko wtedy kiedy gracz sukcesywnie użyje komendy, to komendę będzie można używać tylko co 60 sekund tak jak chcesz

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Niestety nie znam się na tym za bardzo nie wiem z czym to się je ?

Kod ten, który podałem napisała go dla mnie inna osoba 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

To może postaram się wytłumaczyć. Funkcja, która odpowiada za użycie ruletki w twoim kodzie jest następująca:

public Action CommandRoulette(int client, int args)
{
	if(OstatnieUzycie[client] + GetConVarFloat(delay) > GetGameTime())
    {
        ReplyToCommand(client, "Musisz odczekac 30 sekund, przed ponownym użyciem tej komendy!");
        /// %s czasu jaki pozostal przed uzyciem ponownie komendy RoundFloat((OstatnieUzycie[client] + RoundFloat(GetConVarFloat(delay))) - RoundFloat(GetGameTime())));
        return Plugin_Handled;
    }
	if (client > 0 && args < 1)
	{		
		CreateRouletteMenu(client).Display(client, 10);	
	}
	return Plugin_Handled;
}

W pierwszych liniach tej funkcji CommandRoulette jest sprawdzane czy gracz może użyć tej komendy, między innymi czy minęło twe 60 sekund od ostatniego użycia komendy. Nie jest to nam aktualnie do niczego potrzebne. Ważna jest linia:

CreateRouletteMenu(client).Display(client, 10);	

To ona bezpośrednio wywołuje ruletkę. Także jeśli kod tej funkcji dojdzie do tego kawałka to znaczy, że ruletka poprawnie odpaliła się danemu graczowi.

 

Teraz aby faktycznie komenda miała limit 60 sekund między użyciami, to tutaj musi być zaktualizowany czas kiedy gracz ostatnio użył tej komendy. Jak wspomniałem w ostatnim poście, za aktualizację kiedy ostatnio gracz użył komendy odpowiada ten kod:

Ostatnie[client] = GetGameTime ();

 

Więc wystarczy ten kod wpisać po bezpośrednim wywołaniu wywołaniu ruletki (czyli po CreateRouletteMenu(client).Display(client, 10);    )

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
public Action CommandRoulette(int client, int args)
{
	if(OstatnieUzycie[client] + GetConVarFloat(delay) > GetGameTime())
    {
        ReplyToCommand(client, "Musisz odczekac %s sekund, przed ponownym użyciem tej komendy!");
        /// %s czasu jaki pozostal przed uzyciem ponownie komendy RoundFloat((OstatnieUzycie[client] + RoundFloat(GetConVarFloat(delay))) - RoundFloat(GetGameTime())));
        return Plugin_Handled;
    }
	if (client > 0 && args < 1)
	{		
		CreateRouletteMenu(client).Display(client, 10);	
	}
  
	{
	   OstatnieUzycie[client] = GetGameTime();
    }
	return Plugin_Handled;
}

Dodałem to w taki sposób, ale teraz blokuje tylko tak jak by raz czyli

użyłem komendy następnie po następnej próbie blokuje ale jak biorę 3 raz to się odblokowuje od razu i nie wyświetla tego w ogóle:

"Musisz odczekac 60 sekund, przed ponownym użyciem tej komendy!"

 

Ogólnie ciężko mi idzie myślenie jak to działa ?

Edytowane przez -Gamer-

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Poszło Ci dobrze. Perfekcyjnie wyglądałoby to tak:

public Action CommandRoulette(int client, int args)
{
	if(OstatnieUzycie[client] + GetConVarFloat(delay) > GetGameTime())
    {
        ReplyToCommand(client, "Musisz odczekac 60 sekund, przed ponownym użyciem tej komendy!");
        /// %s czasu jaki pozostal przed uzyciem ponownie komendy RoundFloat((OstatnieUzycie[client] + RoundFloat(GetConVarFloat(delay))) - RoundFloat(GetGameTime())));
        return Plugin_Handled;
    }
	if (client > 0 && args < 1)
	{		
		CreateRouletteMenu(client).Display(client, 10);	
		OstatnieUzycie[client] = GetGameTime();
	}
	return Plugin_Handled;
}

Niepotrzebnie wstawiłeś dodatkowe {, } do kodu ? 

Wszystko powinno być dobrze, jeśli nadal dzieje się tak jak napisałeś wyżej opisz dokładnie jak problem występuje i co ile używasz komendy

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Teraz blokada działa, ale i tak po 20sek się odblokowywuje sama a powinna po 60sek

 

tutaj się zmienia ile ma trwać blokada ?

delay = CreateConVar("delay", "60", "Ostatnie");

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tak jest, ale poprawnie liczba 60 powinna być floatem, czyli zamiast 60 powinieneś tam wpisać 60.0

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dzięki wielkie można zamknąć.

Przez Vasto_Lorde,

Temat rozwiązany ^^

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.

×
×
  • Dodaj nową pozycję...