Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Nie za bardzo wiem jak mogę ograniczyć dostęp do menuNie za bardzo wiem jak mogę zablokować menu na jedną rundę


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
2 odpowiedzi w tym temacie

#1 ritriver

    Nowy

  • Użytkownik

Reputacja: 0
Nowy

  • Postów:1
  • Imię:Jakub
  • Lokalizacja:Kielce
Offline

Napisano 30.12.2023 21:04

Cześć mój problem jest następujący chciałbym zablokować menu aby było nie dostępne dla innych get_user_team == 3 czyli w tym wypadku dla Spectatorów oraz get_user_team == 0 czyli w tym przypadku dla nie przydzielonych osób do żadnego z teamów, dopiero uczę się z nauki 2 letniej C++ przeszedłem do nauki skryptowania w AMXX siedzę już nad tym problemem 3 godziny ponieważ jestem samoukiem i wolę samemu rozwiązywać problemy niż szukać otwartego rozwiązania w ten sposób się bardzo dużo uczę i rozumiem. Próbowałem już użyć funkcji set_task natomiast również nie miałem takiego rezultatu jaki bym chciał podpinałem już różne biblioteki które miały coś związane z teamem uważnie czytam dokumentację od razu mówię nie chcę gotowego rozwiązania chciałbym tylko żeby ktoś mnie pokierował że na przykład jeśli runda się zacznie do tego też nie znalazłem funkcji ;/ to mogę tylko na jedną rundę raz wpisać /klasa no nie mogę sobie dołapać jak tego timera zrobić żeby na przykład na jedną rundę dać tylko jedną możliwość wpisania tej komendy.

 

To jest mój kod, jak już wspomniałem jestem samoukiem i piszę go sam ponieważ chcę się jak najwięcej nauczyć i po prostu hobbystycznie pisać sobie paczki i pluginy. Piszę po angielsku ogólnie ponieważ przyjęło się w programowaniu żeby używać CamelCase i pisać zmienne w języku angielskim żeby się było łatwiej połapać. Próbowałem tez używać menu_makecallback jednak też nic z tym nie wskurałem.

/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <gunxpmod>
#include <hamsandwich>

#define PLUGIN "Menu klas"
#define VERSION "1.0"
#define AUTHOR "ritriver"

new Map[32];

public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	register_clcmd("say /klasa","Menu")
	set_task(3,"Hud", .flags="b")
	
	precache_sound("/ritriver/success.wav");
}

public Menu(id) {
	new menus = menu_create("Wybierz klase", "MenuHandler");
	menu_additem(menus, "Rozrabiaka", "", 0, -1); //case 0
	menu_additem(menus, "Rozbojnik", "", 0, -1); // case 1
	menu_display(id, menus);
}

public MenuHandler(id, menu, item) {
		switch(item)
		{
			case 0: 
			{
				client_cmd(id,"spk  /ritriver/success.wav")
				client_printcolor(id,"/g[KLASA] /ywybrales klase: /g[Rozrabiaka]")
			}
			case 1:
			{
				client_cmd(id,"spk  /ritriver/success.wav")
				client_printcolor(id,"/g[KLASA] /ywybrales klase: /g[Rozbojnik]")
			}
		}
		// end switch
		menu_destroy(menu)
		PLUGIN_HANDLED
}

public Hud(id)
{
	set_hudmessage(250, 237, 0, 0.01, 0.25)
	show_hudmessage(id, "[Forum]: TwojeForum.pl^n[Wlasciciel]: ritriver^n[Komendy] /klasa^n[Mapa]: %d", get_mapname(Map, 31))
}

Użytkownik ritriver edytował ten post 30.12.2023 21:07

  • +
  • -
  • 0

Ptaszek chce do gniazdka, kremik chce do rurki
Szydło chce do worka, igła chce do dziurki
Chlebuś chce do pieca, Gucio chce po miodek
Ognia szuka świeca, górnik bardzo chce na przodek

 


#2 mordoryjacz

    Profesjonalista

  • Użytkownik

Reputacja: 24
Życzliwy

  • Postów:171
Offline

Napisano 30.12.2023 21:55

#include <amxmodx>
#include <amxmisc>
#include <gunxpmod>
#include <hamsandwich>

new Map[32];

public plugin_init() {
	register_plugin("Menu klas", "1.0", "ritriver")
	register_clcmd("say /klasa", "Menu");
	set_task(3.0, "Hud", .flags="b");
}

public plugin_precache() precache_sound("ritriver/success.wav");	

public Menu(id) {
	if(get_user_team(id) == 3 || get_user_team(id) == 0) {
		return PLUGIN_HANDLED;
	}	
	new menus = menu_create("Wybierz klase", "MenuHandler");
	
	menu_additem(menus, "Rozrabiaka");
	menu_additem(menus, "Rozbojnik");
	menu_display(id, menus);
	return PLUGIN_HANDLED;
}

public MenuHandler(id, menu, item) {
	if(item == MENU_EXIT) {
		menu_destroy(menu);
		return PLUGIN_CONTINUE;
	}
	switch(item) {
		case 0: {
			client_cmd(id, "spk ritriver/success.wav")
			client_printcolor(id, "^4[KLASA] ^1wybrales klase: ^4[Rozrabiaka]");
		}
		case 1: {
			client_cmd(id, "spk ritriver/success.wav")
			client_printcolor(id, "^4[KLASA] ^1wybrales klase: ^4[Rozbojnik]");
		}
	}
	menu_destroy(menu);
	PLUGIN_HANDLED;
}

public Hud(id) {
	get_mapname(Map, 32);
	set_hudmessage(250, 237, 0, 0.01, 0.25)
	show_hudmessage(id, "[Forum]: TwojeForum.pl^n[Wlasciciel]: ritriver^n[Komendy] /klasa^n[Mapa]: %s", Map)
}

Użytkownik mordoryjacz edytował ten post 30.12.2023 21:57

  • +
  • -
  • 0

#3 Anonymuss

    Profesjonalista

  • Użytkownik

Reputacja: 55
Pomocny

  • Postów:194
  • Imię:Anonimowy
  • Lokalizacja:Polska
Offline

Napisano 30.12.2023 23:21

Musisz dorobić sobie zmienną (globalną) dla każdego gracza która będzie zmieniała wartość w nowej rundzie oraz po wpisaniu komendy /klasa (dodatkowo też warto zerować zmienną dla gracza który dopiero wszedł na serwer aby nie przejmował wartości po poprzednim graczu o tym samym indexie)

Wyglądało by mniej więcej tak (boolean przyjmujący tylko wartości true/false bo chcesz tylko włącznik zrobić) :

new bool:g_bMenuUsed[MAX_PLAYERS + 1];

 

/**

 * Defines and constants related to the maximum number of clients.
 *
 * @note  MAX_PLAYERS is not the same as MaxClients. MAX_PLAYERS is a hardcoded
 *        value as an upper limit, used mainly to declare arrays big enough for
 *        all possible server situations. MaxClients changes based on the
 *        server the plugin is deployed on..
 */
#define MAX_PLAYERS 32 /* Maximum number of players AMX Mod X supports */

 

 

 

W Twoim kodzie wyglądało by to tak:

/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <gunxpmod>
#include <hamsandwich>

#define PLUGIN "Menu klas"
#define VERSION "1.0"
#define AUTHOR "ritriver"

new Map[32];
new bool:g_bMenuUsed[MAX_PLAYERS + 1];

public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	register_clcmd("say /klasa","Menu")
	set_task(3,"Hud", .flags="b")
	register_event("HLTV", "PreRoundStart", "a", "1=0", "2=0");
	precache_sound("/ritriver/success.wav");
}

public client_putinserver(id) {
	g_bMenuUsed[id] = false;
}

public PreRoundStart() {
	for(new i = 1; i <= get_maxplayers(); i++) {
		if(!is_user_connected(i) || !g_bMenuUsed[i]) {
			continue;
		}
		g_bMenuUsed[i] = false;
	}
}

public Menu(id) {
	if(!(0 < get_user_team(id) < 3)) {
		client_print_color(id, id, "Musisz byc w TT/CT");
		return;
	}
	if(g_bMenuUsed[id]) {
		client_print_color(id, id, "Uzyles juz menu w tej rundzie");
		return;
	}
	new menus = menu_create("Wybierz klase", "MenuHandler");
	menu_additem(menus, "Rozrabiaka", "", 0, -1); //case 0
	menu_additem(menus, "Rozbojnik", "", 0, -1); // case 1
	menu_display(id, menus);
	g_bMenuUsed[id] = true;
}

public MenuHandler(id, menu, item) {
		switch(item)
		{
			case 0: 
			{
				client_cmd(id,"spk  /ritriver/success.wav")
				client_printcolor(id,"/g[KLASA] /ywybrales klase: /g[Rozrabiaka]")
			}
			case 1:
			{
				client_cmd(id,"spk  /ritriver/success.wav")
				client_printcolor(id,"/g[KLASA] /ywybrales klase: /g[Rozbojnik]")
			}
		}
		// end switch
		menu_destroy(menu)
		PLUGIN_HANDLED
}

public Hud(id)
{
	set_hudmessage(250, 237, 0, 0.01, 0.25)
	show_hudmessage(id, "[Forum]: TwojeForum.pl^n[Wlasciciel]: ritriver^n[Komendy] /klasa^n[Mapa]: %d", get_mapname(Map, 31))
}

Warunku na drużyny nie sprawdzałem ale powinien działać (jeśli drużyna gracza nie jest większa od 0 (unassigned) i mniejsza od 3 (spect) to zablokuje). W praktyce działa to teraz tak, że event "HLTV" wywołuje się na samym początku freezetime (początek nowej rundy), w nim masz pętle na liczbę slotów serwera aby wyzerować tablicę wszystkim graczom. Po wpisaniu /klasa sprawdza czy użył już wcześniej menu, jeśli nie to wtedy odpala menu i ustawia blokadę na ponowne użycie w aktualnej rundzie. Przy wejściu gracza na serwer też usuwa mu blokadę w "client_putinserver", aby zapobiec temu co opisałem wyżej.


Użytkownik Anonymuss edytował ten post 30.12.2023 23:29

  • +
  • -
  • 0




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych