Skocz do zawartości

Rekomendowane odpowiedzi

Witam!

Prosty plugin wyświetlający w pierwszej kolejności menu, a następnie panel z dowolną informacją. Wystarczy dostosować pod własny serwer.

Spoiler

#pragma semicolon 1
#pragma newdecls required

#define NAME		"Simple Menu"
#define AUTHOR		"Master"
#define VERSION		"1.0"
#define URL			"https://cswild.pl/"

#define nullstr		NULL_STRING

public Plugin myinfo =
{ 
	name	= NAME,
	author	= AUTHOR,
	version	= VERSION,
	url		= URL
};

public void OnPluginStart()
{
	RegConsoleCmd("sm_help", CMD_Help);
	RegConsoleCmd("sm_pomoc", CMD_Help);
}

public Action CMD_Help(int client, int args)
{
	Menu menu = new Menu(Menu_Handler);
	menu.SetTitle("Wprowadzenie do gry\n \n");
	menu.AddItem(nullstr, "Ogólne zasady Deathruna");
	menu.AddItem(nullstr, "System punktów i rang");
	menu.AddItem(nullstr, "System nagród dziennych");
	menu.AddItem(nullstr, "Wszystkie komendy oraz ich opis");
	menu.Display(client, 60);
	return Plugin_Handled;
}

public int Menu_Handler(Menu menu, MenuAction action, int client, int a)
{
	switch(action)
	{
		case MenuAction_Select:
		{
			switch(a)
			{
				case 0: DrawPanel(client, "Serwer Deathrun opiera się na przechodzeniu map z różnorodnymi pułapkami.\nTerrorysta ma za zadanie utrudnić oponentowi skończenie mapy.");

				case 1: DrawPanel(client, "Za każde przejście mapy dostajemy pewną ilość punktów.\nPunkty określają naszą rangę oraz pozycję w globalnym rankingu.\nModele postaci w sklepie odblokowuje się stopniowo z zdobywaniem punktów.");

				case 2:DrawPanel(client, "Na serwerze obowiązuje system nagród za grę dzienną. Za każdy kolejny dzień dostajemy więcej kredytów, aż do 7 dni.\nNastępnie zeruje się strike. Nagrodę aktywujemy komendą !dni");

				case 3: FakeClientCommandEx(client, "sm_komendy");
			}
		}
		case MenuAction_End:
			delete menu;
	}
	return 0;
}

public void DrawPanel(int client, const char[] buffer)
{
	Panel panel = new Panel();
	panel.SetTitle("Wprowadzenie do gry");
	panel.DrawText("--------------------------------------");
	panel.DrawText(buffer);
	panel.DrawText("--------------------------------------");
	panel.DrawItem("Wróć");
	panel.DrawItem("Wyjdź");
	panel.Send(client, PanelHandler, 30);
	delete panel;
}

public int PanelHandler(Menu menu, MenuAction action, int client, int item)
{
	switch(action)
	{
		case MenuAction_Select:
		{
			switch(item)
			{
				case 1: CMD_Help(client, 0);
				case 2: delete menu;
			}
		}
	}
}

 

 

Przez MAGNET,

Przeniesione do działu "Gotowe funkcje"

Przez Vasto_Lorde,

Dodano tag spoiler dla poprawy widoczności tematu ^^

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Prezentacja "zagnieżdzonego" menu na pewno okaże się pomocna

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Hej! Super wstawka kodu, na pewno można z tego wyciągnąć dużo informacji na temat jak zrobić menu. Mam tylko jedną wątpliwość co do użycia NULL_STRING. Czy użycie wprost NULL_STRING nie byłoby lepsze? Nie dość że ze względu na czytelność, to "#define nullstr" nie zbytnio zgadza się z zasadami prefediniowania zmiennych.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Dnia 1.08.2018 o 10:46, Vasto_Lorde napisał:

Hej! Super wstawka kodu, na pewno można z tego wyciągnąć dużo informacji na temat jak zrobić menu. Mam tylko jedną wątpliwość co do użycia NULL_STRING. Czy użycie wprost NULL_STRING nie byłoby lepsze? Nie dość że ze względu na czytelność, to "#define nullstr" nie zbytnio zgadza się z zasadami prefediniowania zmiennych.

To już kwestia gustu i upodobań kodera. 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Cześć mam pytanie odnośnie pluginu można jakoś zrobić, aby to menu wyskakiwało po wejściu gracza na serwer?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Możesz przykładowo wyświetlać menu w momencie, kiedy dany gracz zmieni drużynę:

public void OnPluginStart()
{
    HookEvent("player_team", EventPlayerTeam);
}

public Action EventPlayerTeam(Event event, const char[] name, bool dontBroadcast)
{
    // Tu wyświetlasz menu - ładnie byłoby zrobić timer np. 2-sekundowy i wtedy owe menu odpalić
} 

 

Udostępnij tę odpowiedź


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

#pragma semicolon 1
#pragma newdecls required

#define nullstr		NULL_STRING

public Plugin myinfo =
{ 
	name	= "Simple Menu",
	author	= "Master",
	version	= "1.0",
	url		= "https://cswild.pl/"
};

public void OnPluginStart()
{
	HookEvent("player_team", EventPlayerTeam);
}

public Action EventPlayerTeam(Event event, const char[] name, bool dontBroadcast)
{
	int clientUserId = event.GetInt("userid");
	
	CreateTimer(2.0, ShowMenu, clientUserId);
} 

public Action ShowMenu(Handle timer, int clientUserId)
{
	int client = GetClientOfUserId(clientUserId);
	
	if (client)	CMD_Help(client);
}

public void CMD_Help(int client)
{
	Menu menu = new Menu(Menu_Handler);
	menu.SetTitle("Wprowadzenie do gry\n \n");
	menu.AddItem(nullstr, "Ogólne zasady Deathruna");
	menu.AddItem(nullstr, "System punktów i rang");
	menu.AddItem(nullstr, "System nagród dziennych");
	menu.AddItem(nullstr, "Wszystkie komendy oraz ich opis");
	menu.Display(client, 60);
}

public int Menu_Handler(Menu menu, MenuAction action, int client, int a)
{
	switch(action)
	{
		case MenuAction_Select:
		{
			switch(a)
			{
				case 0: DrawPanel(client, "Serwer Deathrun opiera się na przechodzeniu map z różnorodnymi pułapkami.\nTerrorysta ma za zadanie utrudnić oponentowi skończenie mapy.");

				case 1: DrawPanel(client, "Za każde przejście mapy dostajemy pewną ilość punktów.\nPunkty określają naszą rangę oraz pozycję w globalnym rankingu.\nModele postaci w sklepie odblokowuje się stopniowo z zdobywaniem punktów.");

				case 2:DrawPanel(client, "Na serwerze obowiązuje system nagród za grę dzienną. Za każdy kolejny dzień dostajemy więcej kredytów, aż do 7 dni.\nNastępnie zeruje się strike. Nagrodę aktywujemy komendą !dni");

				case 3: FakeClientCommandEx(client, "sm_komendy");
			}
		}
		case MenuAction_End:
			delete menu;
	}
	return 0;
}

public void DrawPanel(int client, const char[] buffer)
{
	Panel panel = new Panel();
	panel.SetTitle("Wprowadzenie do gry");
	panel.DrawText("--------------------------------------");
	panel.DrawText(buffer);
	panel.DrawText("--------------------------------------");
	panel.DrawItem("Wróć");
	panel.DrawItem("Wyjdź");
	panel.Send(client, PanelHandler, 30);
	delete panel;
}

public int PanelHandler(Menu menu, MenuAction action, int client, int item)
{
	switch(action)
	{
		case MenuAction_Select:
		{
			switch(item)
			{
				case 1: CMD_Help(client);
				case 2: delete menu;
			}
		}
	}
}

 

Spróbuj

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

mam pytanie odnośnie case 3: FakeClientCommandEx(client, "sm_komendy"); bo kiedyś słyszałem że wywoływanie komendy connect + ip w ten sposób nie działa jak to z tym jest?

Udostępnij tę odpowiedź


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

mam pytanie odnośnie case 3: FakeClientCommandEx(client, "sm_komendy"); bo kiedyś słyszałem że wywoływanie komendy connect + ip w ten sposób nie działa jak to z tym jest?

Nie zadziała, nie ma sposobu na przekierowanie gracza na inny serwer.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mamy pytanie jak dodać opcje "Następna strona" żeby nie było napisane wszystko na jednej stronie

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
14 minut temu, Bioły napisał:

Możesz ustawić paginacje menu.

https://sm.alliedmods.net/new-api/menus/Menu/Pagination
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!

 

Nie wiem jak to za bardzo zrobić.

Dał byś przykład na tym kodzie co jest wyżej żeby np wyświetlało 5 na 1 stronie @Bioły?

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
  • Lubię to! 1
  • Kocham to 1
Napisano (edytowane)
Menu menu = new Menu(MenuCallback);
menu.SetTitle("test");
menu.AddItem("1", "opcja #1");
menu.AddItem("2", "opcja #2");
menu.AddItem("3", "opcja #3");
menu.AddItem("4", "opcja #4");
menu.AddItem("5", "opcja #5");
menu.AddItem("6", "opcja #6");
menu.AddItem("7", "opcja #7");
menu.AddItem("8", "opcja #8");
menu.Pagination = 5;
menu.Display(client, 0);

 

Edytowane przez Bioły

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
49 minut temu, Bioły napisał:

Menu menu = new Menu(MenuCallback);
menu.SetTitle("test");
menu.AddItem("1", "opcja #1");
menu.AddItem("2", "opcja #2");
menu.AddItem("3", "opcja #3");
menu.AddItem("4", "opcja #4");
menu.AddItem("5", "opcja #5");
menu.AddItem("6", "opcja #6");
menu.AddItem("7", "opcja #7");
menu.AddItem("8", "opcja #8");
menu.Pagination = 5;
menu.Display(client, 0);

 

 

Chodziło mi o to ,żeby wyświetlało o to np 5 na jednej stronie:

 

{
			switch(a)
			{
				case 0: DrawPanel(client, "Serwer Deathrun opiera się na przechodzeniu map z różnorodnymi pułapkami.\nTerrorysta ma za zadanie utrudnić oponentowi skończenie mapy.");

				case 1: DrawPanel(client, "Za każde przejście mapy dostajemy pewną ilość punktów.\nPunkty określają naszą rangę oraz pozycję w globalnym rankingu.\nModele postaci w sklepie odblokowuje się stopniowo z zdobywaniem punktów.");

				case 2:DrawPanel(client, "Na serwerze obowiązuje system nagród za grę dzienną. Za każdy kolejny dzień dostajemy więcej kredytów, aż do 7 dni.\nNastępnie zeruje się strike. Nagrodę aktywujemy komendą !dni");

				case 3: FakeClientCommandEx(client, "sm_komendy");
			}
		}

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