Jump to content
  • Chmurka
  • Boróweczka
  • Jabłuszko
  • Limonka
  • Czekoladka
  • Węgielek
-Gamer-

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

Recommended Posts

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

 

 

Share this post


Link to post
Share on other sites

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 ? 

Share this post


Link to post
Share on other sites
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 ?

Edited by -Gamer-

Share this post


Link to post
Share on other sites

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!

 

 

 

  • Kocham to! 1

Share this post


Link to post
Share on other sites

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

Edited by -Gamer-

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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 

Share this post


Link to post
Share on other sites

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);    )

  • Kocham to! 1

Share this post


Link to post
Share on other sites
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 ?

Edited by -Gamer-

Share this post


Link to post
Share on other sites

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

  • Kocham to! 2

Share this post


Link to post
Share on other sites

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");

 

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

Nasza historia

Na początku byliśmy małą grupą internetowych znajomych, którzy stwierdzili, że potrzebne jest solidne forum, na którym znajdą się ludzie z dużą wiedzą programistyczną ukierunkowaną na CS:GO. Pomysł powstał na początku 2018 roku, a parę miesięcy później, 19 kwietnia, powstała ta strona internetowa. Jako alternatywna odpowiedź na inne tego typu miejsca, poważnie podeszliśmy do tematu, najpierw tłumacząc angielską dokumentację SourceMod'a na język polski, a potem pisząc rozległe poradniki i wypełniając forum najpotrzebniejszymi rzeczami dla właścicieli serwerów i programistów. Cała nasza Ekipa jest dumna z pracy jaką w to włożyliśmy i cieszymy się że zbierają się wokół nas zarówno ludzie znający tematy sourcepawn'a i konfiguracji, jak i również nowe twarze w tym "biznesie", którym z chęcią niesiemy wiedzę oraz pomoc w rozwiązywaniu problemów.

Największe modyfikacje serwerowe

×
×
  • Create New...