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
 

p@ter - zdjęcie

p@ter

Rejestracja: 13.03.2011
Aktualnie: Nieaktywny
Poza forum Ostatnio: 04.05.2011 18:19
-----

#69839 Tworzenie menu

Napisane przez R3X w 27.06.2009 17:39

Tworzenie menu

Stary temat składa się tylko z jednej części i autor chyba nie zamierza kontynuować, więc opiszę tworzenie menu od podstaw.

Kilka słów wstępu.
Najpierw zajrzyj do komend i operacji bitowych. Pisząc tutorial zakładam, że czytelnik wie jak budować komendy i co to jest suma bitowa.
W przykładowych źródłach celowo pomijam stałe nagłówki (#include, #define) w celu zmniejszenia objętości tekstu. Kod bez nich się nie skompiluje!


Po pierwsze trzeba wiedzieć, że mamy do dyspozycji 2 metody tworzenia menu:
  • tzw. stara↵ - ręczna, wymaga więcej przygotowania, ale jest elastyczniejsza
  • tzw. nowa↵ - korzystamy z przygotowanych zasobów, za organizację menu odpowiadają natywne funkcje AMXX

Formatowanie

Niezależnie od metody, treść menu formatujemy tymi samymi znakami, a oto one:

^n - nowa linia
^t - tabulator
\w - dalszy tekst będzie miał kolor biały
\y - dalszy tekst będzie miał kolor zółty
\r - dalszy tekst będzie miał kolor czerwony
\d - dalszy tekst będzie miał kolor szary
\R - dalszy tekst będzie wyrównany do prawej

Przykładowe (stare) menu

\yWidzisz to menu?^n^n\w1. Tak^t2. Nie

na początku y, więc tekst do następnego znaku zmiany koloru będzie żółty
jako kolejne rozpoznajemy ^n, czyli po nagłówku "Widzisz to menu?" przechodzimy do nowej linii
następny ^n tworzy linijkę odstępu
teraz mamy w, czyli dalszy tekst będzie biały
ostatni jest ^t, który oddzieli opcję 'tak' od 'nie'

Efekt:

menu1.JPG






Metoda 1

Nasze menu jest pokazywane przy użyciu funkcji
show_menu ( index, keys, const menu[], time = -1, title[] = "" )
index - id gracza
keys - suma odpowiadająca używanym klawiszom, tylko te, które się w niej zawierają będą rozpoznawane przez menu
const menu[] - treść menu, czyli to co zostanie pokazane graczowi
time - czas utrzymania menu na ekranie w sekundach, -1 oznacza, aż do naciśnięcia klawisza z menu
title[] - tytuł, potrzebny do rozpoznania menu

Korzystając z wcześniejszego przykładu menu:
public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	register_clcmd("mymenu","mymenu");
}
public mymenu(id){
	show_menu(id, MENU_KEY_1| MENU_KEY_2, "yWidzisz to menu?^n^nw1. Tak^t2. Nie");
	return PLUGIN_HANDLED;
}
Z nowości mamy:

MENU_KEY_1| MENU_KEY_2

jest to suma bitowa stałych MENU_KEY_1 i MENU_KEY_2. Pierwsza odpowiada klawiszowi 1 (slot1), druga klawiszowi 2 (slot2). Razem stanowią zbiór klawiszy przechwytywanych przez menu.

Ogólnie mamy do dyspozycji 10 klawiszy:
#define MENU_KEY_1		(1<<0)
#define MENU_KEY_2		(1<<1)
#define MENU_KEY_3		(1<<2)
#define MENU_KEY_4		(1<<3)
#define MENU_KEY_5		(1<<4)
#define MENU_KEY_6		(1<<5)
#define MENU_KEY_7		(1<<6)
#define MENU_KEY_8		(1<<7)
#define MENU_KEY_9		(1<<8)
#define MENU_KEY_0		(1<<9)

Ok, pokazaliśmy graczowi menu, zdefiniowaliśmy klawisze, na które menu reaguje. Pora na przechwycenie zdarzeń menu.

Najpierw musimy przypisać naszemu menu jakąś publiczną funkcję. Służy do tego funkcja z
register_menu ( title[], keys, function[], outside=0 )
title - tytuł, potrzebny do rozpoznania menu, musi być dokładnie taki sam jak w show_menu
keys - suma klawiszy, powinna zawierać wszystkie możliwe do użycia w naszym menu klawiszy (np. gdy jedna z opcji jest dostępna tylko dla żywych graczy, jej klawisz również powinien być zsumowany)
function - nazwa publicznej funkcji, do której zostanie przekazane id i klawisz
outside - zmienimy na 1, gdy menu będzie z zewnętrznego źródła (inny plugin, silnik gry)

Kod powinien wyglądać tak:
public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	register_clcmd("mymenu","mymenu");
	
	register_menu("MyMenu",MENU_KEY_1|MENU_KEY_2,"cbMyMenu");
}
public mymenu(id){
	show_menu(id,MENU_KEY_1|MENU_KEY_2, "yWidzisz to menu?^n^nw1. Tak^t2. Nie",-1,"MyMenu");
	return PLUGIN_HANDLED;
}
public cbMyMenu(id, key){
}

Suma klawiszy powtarza się, więc użyjmy stałej. Argumenty funkcji cbMyMenu to id gracza i użyty klawisz. Przyciski numerowane są od zera, więc naciśnięcie 1 prześle key=0, naciśnięcie 2 prześle key=1 itd. Dość mylące rozwiązanie, zwłaszcza patrząc na klawisz 0, dla którego key=9 Dołączona grafika
#define MYMENU_KEYS MENU_KEY_1|MENU_KEY_2
 
public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	register_clcmd("mymenu","mymenu");
	
	register_menu("MyMenu",MYMENU_KEYS,"cbMyMenu");
}
public mymenu(id){
	show_menu(id, MYMENU_KEYS, "yWidzisz to menu?^n^nw1. Tak^t2. Nie", -1, "MyMenu");
	return PLUGIN_HANDLED;
}
public cbMyMenu(id, key){
	client_print(id, print_chat, "Wybrales opcje: %d", key+1);
}
Aby przypisać operacje danemu klawiszowi wygodnie jest zastosować switch().
#define MYMENU_KEYS MENU_KEY_1|MENU_KEY_2
 
public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	register_clcmd("mymenu","mymenu");
	
	register_menu("MyMenu",MYMENU_KEYS,"cbMyMenu");
}
public mymenu(id){
	show_menu(id,MYMENU_KEYS, "yWidzisz to menu?^n^nw1. Tak^t2. Nie",-1,"MyMenu");
	return PLUGIN_HANDLED;
}
public cbMyMenu(id, key){
	switch(key){
		case 0:{
			client_print(id, print_chat, "Wybrales opcje Tak");
		}
		case 1:{
			client_print(id, print_chat, "Wybrales opcje Nie");
		}
	}
}

Oczywiście można dodać opcję Anuluj, dodając do sumy klawisz 0 i zmienić nieco treść menu. Nie trzeba dodawać case 9:, gdyż menu automatycznie zamknie się po złapaniu klawisza i nie ma potrzeby wykonywania innych czynności. Gdy chcesz zachować menu na wierzchu nawet po naciśnięciu klawisza za strukturą switch wywołaj funkcję mymenu(id), która ponownie je wyświetli.

------------------------------------------------------------------------------------------------------------------------------------------------


Metoda 2

Nowy styl stworzenia menu pozwala na dynamiczne nim zarządzanie. Tworzeniem treści menu zajmują się przygotowane funkcję, nasza praca polega na dostarczeniu informacji.

Pierwszą operacją jest stworzenie uchwytu. Pozostałe operacje wymagają do niego odwołania. Jeśli pokazujemy wszystkim to samo menu uchwyt może mieć zasięg globalny, a menu utworzone w plugin_init(). W innym razie menu tworzymy tuż przed wyświetleniem. Główna funkcja to:
menu_create ( title[], handler[], ml=0 )
title[] - tytuł, tutaj służy również za nagłówek menu (jeśli nie podamy własnego)
handler[] - nazwa publicznej funkcji, do której przekazywane będą informacje z menu
ml=0 - przestało być używane, nie podajemy

Podawanie klawiszy, na które reaguje menu jest niepotrzebne. Funkcja wyświetlająca potrafi rozpoznać niezbędne klawisze, zależnie od dostępnych opcji.

new gMyMenu
 
public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	gMyMenu=menu_create("Jak sie przywitasz?","cbMyMenu");	
}
public cbMyMenu(id, menu, item){
 
}

Tym razem funkcja cbMyMenu ma aż 3 argumenty: id - index gracza, menu - uchwyt menu, oraz item. Ten ostatni argument zawiera numer wybranej opcji (numerowane od zera). Pozwala np. za pomocą switch() przyporządkować operacje danej opcji. Jest to szczególnie wygodne przy menu wielostronnym. Trzeba pamiętać, że wartość item może być mniejsza od zera - opcja wyjścia z menu to item=-3.

Do dodawania opcji służy funkcja:
menu_additem(menu, const name[], const info[]="", paccess=0, callback=-1);
menu - uchwyt menu
const name[] - tekst opcji
const info[] - informacja wewnętrzna, w większości menu wartość nieistotna
paccess - poziom dostępu do menu, tak samo jak w przypadku komend, np. ADMIN_BAN
callback - w tym miejscu możemy przypisać funkcję kontrolną, o której później

new gMyMenu;
 
public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	gMyMenu=menu_create("Jak sie przywitasz?","cbMyMenu");
	menu_additem(gMyMenu,"Witam");//item=0
	menu_additem(gMyMenu,"Czesc");//item=1
	menu_additem(gMyMenu,"Przyszedl Admin :D","",ADMIN_CHAT);//item=2
}
public cbMyMenu(id, menu, item){
	switch(item){
		case 0:{
			client_cmd(id, "say Witam");
		}
		case 1:{
			client_cmd(id, "say Czesc");
		}
		case 2:{
			client_cmd(id, "say Przyszedl Admin :D");
		}
	}
}

Mamy menu pokażmy je graczowi.
menu_display(id, menu, page=0);
id - index gracza
menu - uchwyt menu
page - podstrona menu

new gMyMenu;
 
public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	register_clcmd("mymenu","mymenu");
	
	gMyMenu=menu_create("Jak sie przywitasz?","cbMyMenu");
	menu_additem(gMyMenu,"Witam");//item=0
	menu_additem(gMyMenu,"Czesc");//item=1
	menu_additem(gMyMenu,"Przyszedl Admin :D","",ADMIN_CHAT);//item=2
		
}
public mymenu(id){
	menu_display(id, gMyMenu,0);
	return PLUGIN_HANDLED;
}
public cbMyMenu(id, menu, item){
	switch(item){
		case 0:{
			client_cmd(id, "say Witam");
		}
		case 1:{
			client_cmd(id, "say Czesc");
		}
		case 2:{
			client_cmd(id, "say Przyszedl Admin :D");
		}
	}
}

menu2.JPG





Żeby pokazać więcej o nowym stylu menu przeniosę uchwyt i tworzenie do mymenu(id). Podstawą różnicą jest potrzeba zniszczenia menu po zakończeniu pracy.
menu_destroy ( menu )
menu - uchwyt menu

public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	register_clcmd("mymenu","mymenu");	
}
public mymenu(id){
	new MyMenu=menu_create("Jak sie przywitasz?","cbMyMenu");
	
	menu_additem(MyMenu,"Witam");//item=0
	menu_additem(MyMenu,"Czesc");//item=1
	menu_additem(MyMenu,"Przyszedl Admin :D","",ADMIN_CHAT);//item=2
	
	menu_display(id, MyMenu,0);
	return PLUGIN_HANDLED;
}
public cbMyMenu(id, menu, item){
	switch(item){
		case 0:{
			client_cmd(id, "say Witam");
		}
		case 1:{
			client_cmd(id, "say Czesc");
		}
		case 2:{
			client_cmd(id, "say Przyszedl Admin :D");
		}
	}
	menu_destroy(menu);
	return PLUGIN_HANDLED;
}

menu_destroy() sprawia, że nasz uchwyt staje się bezużyteczny, czyści pamięć zajmowaną dotychczas przez menu. Oczywiście zamiast go niszczyć, możemy zostawić menu na ekranie. Wystraczy w cbMyMenu ponownie wywołać menu_display(). Wtedy nie powinniśmy dopuścić do wywołania menu_destroy a zwrócić nie PLUGIN_HANDLE tylko PLUGIN_CONTINUE, np. tak:

public cbMyMenu(id, menu, item){
	switch(item){
		case 0:{
			client_cmd(id, "say Witam");
			menu_display(id, menu);
			return PLUGIN_CONTINUE;
		}
		case 1:{
			client_cmd(id, "say Czesc");
		}
		case 2:{
			client_cmd(id, "say Przyszedl Admin :D");
		}
	}
	menu_destroy(menu);
	return PLUGIN_HANDLED;
}
Efekt: Gdy wybierzemy "Witam" menu pozostanie na ekranie.


Funkcja kontrolna

Do każdej z opcji możemy przypisać taką funkcję. Będzie ona decydować czy dana opcja jest aktywna (biała) czy nieaktywna (szara, bez reakcji na swój przycisk).

Najpierw utwórzmy uchwyt, tym razem dla publicznej funkcji.
menu_makecallback(const function[])
zwróconą wartość przekażemy do menu_additem:

public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	register_clcmd("mymenu","mymenu");	
}
public mymenu(id){
	new MyMenu=menu_create("Jak sie przywitasz?","cbMyMenu");
	new MyMenuFun=menu_makecallback("mcbMyMenu");
	
	menu_additem(MyMenu,"Witam","",0,MyMenuFun);//item=0
	menu_additem(MyMenu,"Czesc","",0,MyMenuFun);//item=1
	menu_additem(MyMenu,"Przyszedl Admin :D","",ADMIN_CHAT,MyMenuFun);//item=2
	
	menu_display(id, MyMenu,0);
	return PLUGIN_HANDLED;
}
public cbMyMenu(id, menu, item){
	switch(item){
		case 0:{
			client_cmd(id, "say Witam");
		}
		case 1:{
			client_cmd(id, "say Czesc");
		}
		case 2:{
			client_cmd(id, "say Przyszedl Admin :D");
		}
	}
	menu_destroy(menu);
	return PLUGIN_HANDLED;
}
public mcbMyMenu(id, menu, item){
	return ITEM_ENABLED;
}
Przypisana funkcja ma taką postać. Zwracana wartość decyduje o aktywności opcji. Ta funkcja sprawi, że wszystkie opcje będą aktywne. Zwrócenie ITEM_DISABLED spowoduje brak aktywności wszystkich/danej opcji zależnie od zastosowania.
public mcbMyMenu(id, menu, item){
	return ITEM_ENABLED;
}

Np. przez taką funkcję
public mcbMyMenu(id, menu, item){
	if(item==1)
		return ITEM_DISABLED;
	return ITEM_ENABLED;
}
Opcja "Czesc" będzie nieaktywna:

menu3.JPG






Dostosowanie

W starym stylu wygląd menu znacznie bardziej zależy od nas, jednak projektowanie menu o kilku stronach może być kłopotliwe. Nowa metoda tworzenia mimo schematycznej budowy ma kilka opcji, które pozwalają dostosować treść menu, ale oczywiście w mniejszym stopniu.

Potrzebuje nowej funkcji:
menu_setprop(menu, prop, ...);
menu - uchwyt menu
prop - wartość z listy:
#define MPROP_PERPAGE	1		/* Liczba opcji na stronę (param1 = liczba, 0=bez stronnicowania, 7=domyślnie) */
#define MPROP_BACKNAME	2		/* Nazwa opcji Back/Wstecz (param1 = tekst) */
#define MPROP_NEXTNAME	3		/* Nazwa opcji Next/Dalej (param1 = tekst) */
#define MPROP_EXITNAME	4		/* Nazwa opcji Exit/Wyjście (param1 = tekst) */
#define MPROP_TITLE	5		/* Nagł&#243;wek menu (param1 = tekst) */
#define MPROP_EXIT	6		/* Opcja wyjścia? (param1 = liczba, MEXIT_ALL - zawsze, MEXIT_NEVER- nidgy) */
#define MPROP_NOCOLORS	8		/* Czy usunąć automatyczne kolory(param1 = liczba, 0=domyślnie) */
#define MPROP_NUMBER_COLOR	10	/* Kolor opis&#243;w przycisk&#243;w (param1 = tekst, "r"=domyślny) */

Przykład użycia:
public mymenu(id){
	new MyMenu=menu_create("Jak sie przywitasz?","cbMyMenu");
	new MyMenuFun=menu_makecallback("mcbMyMenu");
	
	menu_additem(MyMenu,"Witam","",0,MyMenuFun);//item=0
	menu_additem(MyMenu,"Czesc","",0,MyMenuFun);//item=1
	menu_additem(MyMenu,"Przyszedl Admin :D","",ADMIN_CHAT,MyMenuFun);//item=2
	
	//opcja wyjścia "Wyjście" zamiast "Exit"
	menu_setprop(MyMenu,MPROP_EXITNAME,"Wyjscie");
 
	//zawsze pokaż opcję wyjścia
	menu_setprop(MyMenu,MPROP_EXIT,MEXIT_ALL);
 
	//kolor cyfry przycisku zmień na ż&#243;łty
	menu_setprop(MyMenu,MPROP_NUMBER_COLOR,"y");
	
	
	menu_display(id, MyMenu,0);
	return PLUGIN_HANDLED;
}

Rezultat:

menu4.JPG






Podsumowanie

Stare menu jest znacznie elastyczniejsze, pozwala nam wpłynąć bezpośrednio na całą treść menu, jednak wymaga więcej pracy. Nowy styl menu, zwłaszcza połączony z globalnymi tablicami standardowymi/dynamicznymi, pozwala nam znacznie zautomatyzować menu. Musimy wybrać między metodami zależnie od zapotrzebowania. Obie są składnikiem biblioteki , więc ma problemu wyboru modułów.

Początkującym programistom Pawna pod AMXX polecam nowy styl - unikniecie wielu błędów.

PS. Do zamknięcia obu menu możemy użyć funkcji:
#define hide_menu(%1) show_menu(%1,0,"^n")
/*
To samo co
public hide_menu(id)
	show_menu(id,0,"^n");
*/



Dodatek

W przykładach menu otwierało się na komendę. Aby pokazać je zaraz po wejściu na serwer należy użyć kodu:
#define TASK_SHOWMENU 12000
 
public client_putinserver(id)
	set_task(1.0, "show_menu_", id+TASK_SHOWMENU);
	
public show_menu_(tid){
	new id=tid-TASK_SHOWMENU;
	new iTeam=get_user_team(id);
 
	new menu_id, keys;
	new menuUp = player_menu_info( id, menu_id, keys );
 
	if ( iTeam && (menuUp <= 0 || menu_id < 0) )
		//Tu pokazujemy menu
		mymenu(id);
	else
		set_task(1.0, "show_menu_", tid);
}
który nie pozwoli nadpisać menu wyboru drużyny i modelu.
  • +
  • -
  • 64


#241980 klasa 1/1 z noza

Napisane przez csfraghunt COD w 26.04.2011 12:41

Nie rejestrowałeś tego RegisterHam(Ham_TakeDamage, "player", "TakeDamage") w plugin int


#203281 Przerabianie klasy na premium

Napisane przez b0niek w 06.01.2011 14:24

Jako, że wiele osób wciąż pyta jak zrobić klasę premium to oto przedstawiam banalny poradnik jak to zrobić.

W pliku .sma danej klasy:
1. Pod
#include <engine>

dodajemy
#include <ColorChat>

2. Odszukujemy
public cod_class_enabled(id)
ma_klase[id] = true;

i zamieniamy obydwie linijki na:
public cod_class_enabled(id)
{
ColorChat(id, RED, "^x04Klasa^x03 %s^x04 By^x01 amxx.pl", nazwa); //Gdy gracz nie ma flagi wyświetli mu komunikat
if(!(get_user_flags(id) & ADMIN_LEVEL_H)) //FLAGA
{
ColorChat(id, RED, "^x03[%s]^x04 Jest^x03 klasa premium", nazwa) //Znowu info ze przykładowa klasa jest PREMIUM
return COD_STOP;
}
ma_klase[id] = true;
return COD_CONTINUE;
}


3. Zmiana wymaganej flagi:
if(!(get_user_flags(id) & ADMIN_LEVEL_H)) //FLAGA

W tej linijce zmieniamy wymaganą flagę dla klasy premium np. żeby wymagało flagi B zamieniamy ADMIN_LEVEL_H na ADMIN_LEVEL_B .

Powinno działać, miłego zmieniania klasy na premium!
  • +
  • -
  • 27


#189817 Jak zrobić prostą klasę

Napisane przez QTM. Peyote w 19.11.2010 14:39

W tym tutorialu pokażę jak stworzyć prostą klasę do nowego CodModa.
*.sma Naszej klasy będzie wyglądać tak: (Niżej wytłumaczę co od czego)
#include <amxmodx>
#include <codmod>

new const nazwa[] = "Henio";
new const opis[] = "Brak";
new const bronie = 1<<CSW_M4A1 | 1<<CSW_DEAGLE;
new const zdrowie = 13;
new const kondycja = 69;
new const inteligencja = 2;
new const wytrzymalosc = 15;


public plugin_init()
cod_register_class(nazwa, opis, bronie, zdrowie, kondycja, inteligencja, wytrzymalosc);

#include <amxmodx>

  • Jeżeli nie wiesz poczytaj inne tutoriale.
#include <codmod>

  • Wymagany plik codmod.inc który musimy wrzucić do folderu include naszego kompilatora.
  • Dołącza plik nagłówkowy CodModa dzięki któremu będziemy mogli używać natywów takich jak na przykład cod_register_class.
new const nazwa[] = "Henio";

  • Nazwa naszej klasy - u nas będzie to Henio.
new const opis[] = "Brak";

  • Opis naszej klasy - u nas jest Brak.
  • Jeżeli ktoś się dziwi się dlaczego nie opisuję jakie bronie, szybkość i zdrowie ma klasa to odpowiem - To wyświetla się osobno.
new const bronie = 1<<CSW_M4A1 | 1<<CSW_DEAGLE;

  • Tutaj określamy jakie bronie ma mieć Henio.
  • Przed każdą bronią dodajemy 1<<
  • Jeżeli chcemy dodać następną to wstawiamy | - pełni rolę czegoś w rodzaju.. przecinka.
new const zdrowie = 13;

  • Punkty statystyki zdrowie jakie klasa dostanie na start.
  • Czyli w naszym przypadku jeżeli damy dodatkowe 13 zdrowia to na start będziemy mieli 113 hp
new const kondycja = 69;

  • Ilość punktów kondycji jaką Henio ma dostać na start. Henia gnębią koledzy dlatego musi szybko uciekać.
  • To zastępuje dawne procenty szybkości naszej klasy
new const inteligencja = 2;

  • Punkty inteligencji na start.
new const wytrzymalosc = 15;

  • Punkty wytrzymalosci na start.
  • Można używać zamiast kamizelek.

W plugin_init rejestrujemy Henia, żeby pojawił się w menu wybierania klas:
cod_register_class(nazwa, opis, bronie, zdrowie, kondycja, inteligencja, wytrzymalosc);

  • +
  • -
  • 74


#189816 [QTM_CodMod(Nowy)] Dodawanie itemków

Napisane przez Kusek w 19.11.2010 14:39

Siemka, pokażę wam jak dodawać itemki do cod mod (inaczej perki (głupia nazwaz))



No to zaczynamy ;P


W każdym itemku (kod sma) musi zawierać 2 const'y odpowiadające za nazwa i opis itemku np.
new const perk_name[] = "Naboje Pulkownika";
new const perk_desc[] = "Zadajesz 10(+int) obrazen wiecej";


na 2 publickach, które sprawdzają czy gracz ma item czy nie będą to

public cod_perk_enabled(id)
public cod_perk_disabled(id)


dam tutaj przykładowy schemat jak powinien wyglądać item

#include <amxmodx>
#include <codmod>

new const perk_name[] = "NAZWA PERKU";
new const perk_desc[] = "OPIS PERKU";


public plugin_init()
{ //TUTAJ ZOSTAWIAMY TAK JAK JEST,
register_plugin(perk_name, "1.0", "QTM_Peyote");

cod_register_perk(perk_name, perk_desc);
}
public cod_perk_enabled(id)
{
//TUTAJ KOD TY JEST WŁĄCZONY
}

public cod_perk_disabled(id)
{
//TUTAJ KOD GDY JEST WYŁACZONY
}


teraz przejdźmy do przykładu, mój item będzie się nazywał Wiktorios Amenos

#include <amxmodx>
#include <codmod>

new const perk_name[] = "Wiktorios Amenos";
new const perk_desc[] = "Dostajesz 500 hp !";


public plugin_init()
{
register_plugin(perk_name, "1.0", "QTM_Peyote");

cod_register_perk(perk_name, perk_desc);
}
public cod_perk_enabled(id)
{
//I TUTAJ KOD KTÓRY DODAJE HP, WSZYSTKO JEST Z INC. COD MOD
cod_set_user_bonus_health(id, cod_get_user_health(id, 0, 0)+500);
}

public cod_perk_disabled(id)
{
// A TUTAJ USTAWIAMY NA ODWRÓT CZYLI ODJĄĆ 500 NIE DODAĆ :)
cod_set_user_bonus_health(id, cod_get_user_health(id, 0, 0)-500);
}



Dobra podstawy mamy, na dodawanie/odejmowanie hp, kondycji, wytrzymałości, inteligenji itp.


A co jeśli trzeba dodać item z jakąś inną funkcją niż te które są w codmod.inc??


musimy wtedy użyć tego schematu

#include <amxmodx>
#include <codmod>

new const perk_name[] = "NAZWA PERKU";
new const perk_desc[] = "OPIS PERKU";

new bool:ma_perk[33]; // on nam będzie włączać/wyłączać item

public plugin_init()
{ //TUTAJ ZOSTAWIAMY TAK JAK JEST,
register_plugin(perk_name, "1.0", "QTM_Peyote");

cod_register_perk(perk_name, perk_desc);
}
public cod_perk_enabled(id)
{
ma_perk[id] = true
}

public cod_perk_disabled(id)
{
ma_perk[id] = false
}[

public nazwa(id)
{
if(!ma_perk[id]){
//tutaj nasz kod, co ma robić item
}
}


w publicku który daje funkcje co ma robić dany item ma być w if(!ma_perk[id])


teraz przykład, mój plugin będzie się zwał Sffitaśny ŁadaŁ

/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <codmod>

new const perk_name[] = "Sffitaśny ŁadaŁ";
new const perk_desc[] = "Widzisz na radarze swoicj wrogów";

new bool:ma_perk[33]

new const sound_radar[] = "radar.wav";
new g_msgHostageAdd, g_msgHostageDel, g_maxplayers;
new radar[33];

public plugin_init()
{
register_plugin(perk_name, "1.0", "QTM_Peyote");

cod_register_perk(perk_name, perk_desc);

//tutaj są potrzebne rzeczy aby działał radar
g_msgHostageAdd = get_user_msgid("HostagePos");
g_msgHostageDel = get_user_msgid("HostageK");
g_maxplayers = get_maxplayers();
for (new i = 1; i<=g_maxplayers;i++) radar[i] = false;
set_task (2.0,"radar_scan",_,_,_,"b");
}

public cod_perk_enabled(id)
{
ma_perk[id]=true
}
public cod_perk_disabled(id)
{
ma_perk[id]=false
}

public plugin_precache()
{
precache_sound(sound_radar);
}
//NIŻEJ WIDZIMY FUNKCJE DO RADARU, JAK WIDZIECIE NA POCZĄTKU DAŁEM if(ma_perk[id])
public radar_scan(id)
{
if(!ma_perk[id])
{
new PlayerCoords[3];
new id;
new Players[32];
new i;
new playerCount = 0;

for (id=1; id<=g_maxplayers; id++)
{
if((!is_user_alive(id))||(!radar[id])) continue;

if(get_players(Players, playerCount, "a") &&is_user_alive(id))
{
playerCount++;
}

for (i=1;i<=playerCount;i++)
{
get_user_origin(i, PlayerCoords)

message_begin(MSG_ONE_UNRELIABLE, g_msgHostageAdd, {0,0,0}, id)
write_byte(id)
write_byte(i)
write_coord(PlayerCoords[0])
write_coord(PlayerCoords[1])
write_coord(PlayerCoords[2])
message_end()

message_begin(MSG_ONE_UNRELIABLE, g_msgHostageDel, {0,0,0}, id)
write_byte(i)
message_end()
}
emit_sound(id, CHAN_ITEM, sound_radar, 1.0, ATTN_NORM, 0, PITCH_NORM);
}
}
return PLUGIN_CONTINUE;
}

teraz wystarczy wrzucić sound do pliku i jazda xD


Myślę że troszkę wam dodałem wiedzy jak robić itemki ^^, oczywiście radar nie sprawdzałem czy działa ^^



Zakaz kopiowania na inne fora, proszę zgłaszać swoje błędy, nie wiem czy owe kody wyżej działają bo pisałem je z palca bez sprawdzania(kompilowanie)


Pozdro Frajer
  • +
  • -
  • 9


#190140 [CodMOd(nowy)]Dodawanie klasy

Napisane przez MasteR99 w 20.11.2010 12:26

chyba nie :D

@edit.
new const bronie = 1<<CSW_AUG | 1<<CSW_HEGRENADE | 1<<CSW_SMOKEGRENADE | 1<<CSW_FLASHBANG;
  • +
  • -
  • 2


#218036 Zmiana modelu gracza dla klasy/perku

Napisane przez Goliath w 21.02.2011 20:19

Witam.
Dziś pokażę wam, jak w prosty sposób zmienić model postaci dla klasy/perku. Weźmy przykładową klasę np. Rushera.
Spoiler

Dodajmy teraz na początku:
#include <hamsandwich>
#include <cstrike>

A następnie tworzymy zmienną typu true/false (o nazwie ma_klase dla klasy lub ma_perk dla perku) i dodajemy są do publiców cod_class_enabled i cod_class_disabled (lub cod_perk_enabled i cod_perk_disabled dla perku) w następujący sposób:
Spoiler

Następnym krokiem jest przygotowanie modeli graczy do ściągnięcia w taki sposób:
public plugin_precache()
{
precache_model("models/player/classic2/classic2.mdl");
precache_model("models/player/swat/swat.mdl");
}

Oczywiście wy musicie wpisać ścieżki do waszych modeli. Teraz musimy dodać to do plugin_init:
RegisterHam(Ham_Spawn, "player", "Odrodzenie", 1);

I stworzyć następujący public:
public Odrodzenie(id)
{
if(ma_klase[id])
{
cs_set_user_model(id, (get_user_team(id) == 1)? "classic2": "swat");
}
}

Następnie dodajemy to do cod_class_enabled (lub cod_perk_enabled dla perku):
cs_set_user_model(id, (get_user_team(id) == 1)? "classic2": "swat");

A to do cod_class_disabled (lub cod_perk_disabled dla perku):
cs_reset_user_model(id);

W podanym wyżej przypadku terrorysta będzie otrzymywał model classic2, a CT model swat. Zmieńcie to na wasze nazwy modeli. Dla leniwych - gotowe .sma:
Spoiler

UWAGA!
Jeżeli nazwa waszego modelu to np. predator to należy go umieścić w katalogu models/player/predator/predator.mdl uwzględniając wielkość liter!

To już koniec. Mam nadzieję, że wszystko zrozumieliście :) .

PS. Jeśli chcecie, aby klasa/perk miała model niezależnie od drużyny używajcie tej funkcji:
cs_set_user_model(id, "nazwa_modelu");

  • +
  • -
  • 25


#177825 Niewidzialność dla wybranej klasy

Napisane przez Azahiel w 08.10.2010 11:22

Cześć.

Dziś postaram się wam opisać w jaki sposób dodać niewidzialność dla wybranej klasy.

Na sam początek dodajemy nową klasę według tego tematu lub edytujemy którąś z aktualnych.

No i przystępujemy do pracy:

W funkcji CurWeapon(id) szukamy:

if(weapon == CSW_C4)
podkladajacy = id;


I zaraz po tym dodajemy:
if(klasa_gracza[id] == NazwaKlasy && weapon == CSW_KNIFE) set_user_rendering(id, kRenderFxNone, 0, 0, 0, kRenderTransAlpha, 15);


W tym wypadku wybrana przez nas klasa będzie prawie niewidzialna podczas używania noża. Aby zapobiec błędom iż po zmianie broni klasa dalej pozostaje niewidzialna należy zdefiniować widzialność klasy podczas używania każdej z posiadanej przez nią broni np:

if(klasa_gracza[id] == NazwaKlasy && weapon == CSW_GLOCK18) set_user_rendering(id, kRenderFxNone, 0, 0, 0, kRenderTransAlpha, 255);
if(klasa_gracza[id] == NazwaKlasy && weapon == CSW_USP) set_user_rendering(id, kRenderFxNone, 0, 0, 0, kRenderTransAlpha, 255);


Krótkie objaśnienia:

w miejsce NazwaKlasy wpisujemy nazwę klasy która ma być niewidzialna.

weapon == CSW_KNIFE w tym miejscu definiujemy broń podczas używania której klasa jest niewidzialna (ustalane osobno dla każdej broni)

kRenderTransAlpha, X : tu określamy "widzialność" gdzie za X wprowadzamy 0 co oznacza całkowitą niewidzialność a 255 całkowitą widzialność (oczywiście możemy wstawiać każdą wartość w przedziale od 0 do 255).

Jest to mój pierwszy tutorial więc proszę o wyrozumiałość ;)
  • +
  • -
  • 15


#209264 Dodawanie frakcji - 2 sposoby

Napisane przez DarkGL w 25.01.2011 17:44

Witam
poradnik napisany w szkole także będę go jeszcze poprawiał ;)
pokaże tu dwa sposoby dodania frakcji do nowego coda
I sposób jest bardziej czasochłonny ale daje potem łatwiejszą rozbudowę (chyba)
II sposób jest chyba prostszy ale tylko chyba ;)

I sposób

Spoiler


II sposób

Spoiler



Zrobione przez DarkGL dla AMXX.PL
Zakaz używanie, kopiowania i innego wykorzystywania treści bez zgody autora. Wszelkie prawa zastrzeżone. ©

  • +
  • -
  • 126


#209383 Dodawanie frakcji - 2 sposoby

Napisane przez Cypis' w 25.01.2011 21:21

Frakcje czytane z pliku cod_frakcje.ini w configs.

Jak zainstlować:
Gotowiec:
Spoiler

Edytacja Silnika:
Spoiler


Instrukcja jak dodac frakcje:
Spoiler

  • +
  • -
  • 139


#241910 klasa 1/1 z noza

Napisane przez master. w 26.04.2011 10:54

zobacz
Spoiler

  • +
  • -
  • 1


#241921 klasa 1/1 z noza

Napisane przez master. w 26.04.2011 11:04

#include <amxmodx>
#include <codmod>
#include <engine>
#include <hamsandwich>
#include <colorchat>

#define DMG_BULLET (1<<1)


new const nazwa[] = "PRORusher(Prermium)";
new const opis[] = "Slaba widocznosc, zmniejszona grawitacja, natychmiastowe zabicie z noza";
new const bronie = 1<<CSW_DEAGLE|1<<CSW_MP5NAVY|1<<CSW_XM1014|1<<CSW_M3|1<<CSW_SMOKEGRENADE|1<<CSW_HEGRENADE;
new const zdrowie = 40;
new const kondycja = 30;
new const inteligencja = 0;
new const wytrzymalosc = 0;

new bool:ma_klase[33];

public plugin_init() {
register_plugin(nazwa, "1.0", "QTM_Peyote");

cod_register_class(nazwa, opis, bronie, zdrowie, kondycja, inteligencja, wytrzymalosc);
RegisterHam(Ham_TakeDamage, "player", "TakeDamage");
}

public cod_class_enabled(id)
{
ColorChat(id, RED, "Wybrales klase PRORusher.", nazwa);
if(!(get_user_flags(id) & ADMIN_LEVEL_G))
{
ColorChat(id, RED, "[PRORusher] klasa premium kup ja na csostrowiec.xaa.pl.", nazwa)
return COD_STOP;

}
set_rendering(id,kRenderFxGlowShell,0,0,0 ,kRenderTransAlpha, 40);
entity_set_float(id, EV_FL_gravity, 0.6);
ma_klase[id] = true;
}

public cod_class_disabled(id)
{
set_rendering(id,kRenderFxGlowShell,0,0,0 ,kRenderTransAlpha, 255);
entity_set_float(id, EV_FL_gravity, 1.0);
ma_klase[id] = false;
}

public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
{
if(!is_user_connected(idattacker))
return HAM_IGNORED;

if(!ma_klase[idattacker])
return HAM_IGNORED;

if(get_user_weapon(idattacker) == CSW_KNIFE && damagebits & DMG_BULLET && damage > 20.0)
cod_inflict_damage(idattacker, this, float(get_user_health(this))-damage+1.0, 0.0, idinflictor, damagebits);

return HAM_IGNORED;
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1045\\ f0\\ fs16 \n\\ par }
*/

  • +
  • -
  • 1


#241896 crash serwera

Napisane przez Goliath w 26.04.2011 10:36

No i? Ciężko ci podmienić zawartość pliku z klasą, na to co ci dałem? I ponownie skompilować?
  • +
  • -
  • 1


#241838 crash serwera

Napisane przez Goliath w 26.04.2011 08:31

Zobacz:
Wklejka: 130380360112545
  • +
  • -
  • 1


#38481 Admin Kick Spect

Napisane przez Klycior w 28.01.2009 21:54

Dołączona grafika

Admin może kicknąć wszystkich obserwatorów za pomocą komendy.

Dołączona grafika

Standardowo http://amxx.pl/viewtopic.php?t=20

Dołączona grafika

amx_kickspecs - kickuje wszystkich graczy spect

Załączone pliki


  • +
  • -
  • 4